termdock 1.4.328 → 1.4.330

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 (345) hide show
  1. package/dist/client/assets/{App-xr2R4dST.js → App-JL8Fd8uO.js} +54 -54
  2. package/dist/client/assets/App-JL8Fd8uO.js.br +0 -0
  3. package/dist/client/assets/App-JL8Fd8uO.js.gz +0 -0
  4. package/dist/client/assets/{ArchitecturePanel-XprzcGMT.js → ArchitecturePanel-CwvZXpvS.js} +2 -2
  5. package/dist/client/assets/ArchitecturePanel-CwvZXpvS.js.br +0 -0
  6. package/dist/client/assets/ArchitecturePanel-CwvZXpvS.js.gz +0 -0
  7. package/dist/client/assets/{ChangeWalkthroughPanel-g83lCwJi.js → ChangeWalkthroughPanel-BF3p_M6Y.js} +1 -1
  8. package/dist/client/assets/ChangeWalkthroughPanel-BF3p_M6Y.js.br +0 -0
  9. package/dist/client/assets/ChangeWalkthroughPanel-BF3p_M6Y.js.gz +0 -0
  10. package/dist/client/assets/{CollaborationMainWorkspace-BbkFTnw1.js → CollaborationMainWorkspace-CYpn4j_x.js} +1 -1
  11. package/dist/client/assets/CollaborationMainWorkspace-CYpn4j_x.js.br +0 -0
  12. package/dist/client/assets/CollaborationMainWorkspace-CYpn4j_x.js.gz +0 -0
  13. package/dist/client/assets/CollaborationTaskContent-BjjX05Cv.js +2 -0
  14. package/dist/client/assets/ComputerControlView-DWlZmlCH.js +6 -0
  15. package/dist/client/assets/ComputerControlView-DWlZmlCH.js.br +0 -0
  16. package/dist/client/assets/ComputerControlView-DWlZmlCH.js.gz +0 -0
  17. package/dist/client/assets/{DagPlayground--KDWJkVL.js → DagPlayground-IbzlcDVX.js} +1 -1
  18. package/dist/client/assets/DagPlayground-IbzlcDVX.js.br +0 -0
  19. package/dist/client/assets/DagPlayground-IbzlcDVX.js.gz +0 -0
  20. package/dist/client/assets/{DiffLab-BAyGlKKp.js → DiffLab-DEAYEwfY.js} +1 -1
  21. package/dist/client/assets/DiffLab-DEAYEwfY.js.br +0 -0
  22. package/dist/client/assets/DiffLab-DEAYEwfY.js.gz +0 -0
  23. package/dist/client/assets/{DiffReview-CLKpyDPZ.js → DiffReview-BPHfC8nZ.js} +1 -1
  24. package/dist/client/assets/DiffReview-BPHfC8nZ.js.br +0 -0
  25. package/dist/client/assets/DiffReview-BPHfC8nZ.js.gz +0 -0
  26. package/dist/client/assets/{DiffReviewLab-BoFElesI.js → DiffReviewLab-2iKu20Ik.js} +1 -1
  27. package/dist/client/assets/DiffReviewLab-2iKu20Ik.js.br +0 -0
  28. package/dist/client/assets/DiffReviewLab-2iKu20Ik.js.gz +0 -0
  29. package/dist/client/assets/{DiffViewer-DDiASWHf.js → DiffViewer-C4S3oEQV.js} +1 -1
  30. package/dist/client/assets/DiffViewer-C4S3oEQV.js.br +0 -0
  31. package/dist/client/assets/{DiffViewer-DDiASWHf.js.gz → DiffViewer-C4S3oEQV.js.gz} +0 -0
  32. package/dist/client/assets/{ModelPreview-PJWJT35T.js → ModelPreview-D_KABt7i.js} +1 -1
  33. package/dist/client/assets/ModelPreview-D_KABt7i.js.br +0 -0
  34. package/dist/client/assets/ModelPreview-D_KABt7i.js.gz +0 -0
  35. package/dist/client/assets/{RightSidebar-CfOJHcXO.js → RightSidebar-scaBEaFJ.js} +35 -35
  36. package/dist/client/assets/RightSidebar-scaBEaFJ.js.br +0 -0
  37. package/dist/client/assets/RightSidebar-scaBEaFJ.js.gz +0 -0
  38. package/dist/client/assets/{abnfDiagram-VCTEODGH-CwEvSK80.js → abnfDiagram-VCTEODGH-OAQJcJ5a.js} +1 -1
  39. package/dist/client/assets/abnfDiagram-VCTEODGH-OAQJcJ5a.js.br +0 -0
  40. package/dist/client/assets/abnfDiagram-VCTEODGH-OAQJcJ5a.js.gz +0 -0
  41. package/dist/client/assets/{app-DNnVU3VK.js → app-aNkllBsm.js} +3 -3
  42. package/dist/client/assets/app-aNkllBsm.js.br +0 -0
  43. package/dist/client/assets/app-aNkllBsm.js.gz +0 -0
  44. package/dist/client/assets/{arc-Ctz1KMpY.js → arc-B29HLhod.js} +1 -1
  45. package/dist/client/assets/arc-B29HLhod.js.br +0 -0
  46. package/dist/client/assets/arc-B29HLhod.js.gz +0 -0
  47. package/dist/client/assets/{architectureDiagram-5GKGNRK7-DJSgVQQQ.js → architectureDiagram-5GKGNRK7-CQeKeLzl.js} +1 -1
  48. package/dist/client/assets/architectureDiagram-5GKGNRK7-CQeKeLzl.js.br +0 -0
  49. package/dist/client/assets/architectureDiagram-5GKGNRK7-CQeKeLzl.js.gz +0 -0
  50. package/dist/client/assets/{blockDiagram-I7D4REHJ-N_yr-Q8w.js → blockDiagram-I7D4REHJ-CgQQGQN_.js} +1 -1
  51. package/dist/client/assets/blockDiagram-I7D4REHJ-CgQQGQN_.js.br +0 -0
  52. package/dist/client/assets/blockDiagram-I7D4REHJ-CgQQGQN_.js.gz +0 -0
  53. package/dist/client/assets/{c4Diagram-7LVT6UL2-DVQnawpY.js → c4Diagram-7LVT6UL2-BTeUIAS9.js} +1 -1
  54. package/dist/client/assets/c4Diagram-7LVT6UL2-BTeUIAS9.js.br +0 -0
  55. package/dist/client/assets/c4Diagram-7LVT6UL2-BTeUIAS9.js.gz +0 -0
  56. package/dist/client/assets/channel-DPAqeRss.js +1 -0
  57. package/dist/client/assets/{chunk-2Q5K7J3B-BXZwjzSA.js → chunk-2Q5K7J3B-Bao8D59Y.js} +1 -1
  58. package/dist/client/assets/{chunk-5VM5RSS4-mKa-FMDa.js → chunk-5VM5RSS4-RIpn4ucJ.js} +1 -1
  59. package/dist/client/assets/{chunk-F27PBJKO-BW5JuQIW.js → chunk-F27PBJKO-Cu3ypVNN.js} +1 -1
  60. package/dist/client/assets/chunk-F27PBJKO-Cu3ypVNN.js.br +0 -0
  61. package/dist/client/assets/chunk-F27PBJKO-Cu3ypVNN.js.gz +0 -0
  62. package/dist/client/assets/{chunk-IMKFNOWR-CDGBumC-.js → chunk-IMKFNOWR-BioTa0jG.js} +1 -1
  63. package/dist/client/assets/chunk-IMKFNOWR-BioTa0jG.js.br +0 -0
  64. package/dist/client/assets/chunk-IMKFNOWR-BioTa0jG.js.gz +0 -0
  65. package/dist/client/assets/{chunk-JWPE2WC7-CGx9O6IX.js → chunk-JWPE2WC7-BPE5l-1s.js} +1 -1
  66. package/dist/client/assets/{chunk-POPQ4Y6H-BkWYxDSy.js → chunk-POPQ4Y6H-DUF-0HB1.js} +1 -1
  67. package/dist/client/assets/{chunk-SVP7TREG-BGwkXakv.js → chunk-SVP7TREG-BHaV6_ki.js} +1 -1
  68. package/dist/client/assets/chunk-SVP7TREG-BHaV6_ki.js.br +0 -0
  69. package/dist/client/assets/chunk-SVP7TREG-BHaV6_ki.js.gz +0 -0
  70. package/dist/client/assets/{chunk-TICWLB2K-CMxjLRcv.js → chunk-TICWLB2K-SU15adqY.js} +1 -1
  71. package/dist/client/assets/chunk-TICWLB2K-SU15adqY.js.br +0 -0
  72. package/dist/client/assets/chunk-TICWLB2K-SU15adqY.js.gz +0 -0
  73. package/dist/client/assets/{chunk-XXDRQBXY-DCIQ1i4z.js → chunk-XXDRQBXY-oLy1dZJs.js} +1 -1
  74. package/dist/client/assets/classDiagram-ZZMXUADV-kQeU2Z7d.js +1 -0
  75. package/dist/client/assets/classDiagram-v2-VYDZK3BY-kQeU2Z7d.js +1 -0
  76. package/dist/client/assets/{cose-bilkent-JH36ORCC-Des2am0k.js → cose-bilkent-JH36ORCC-EE27IbbX.js} +1 -1
  77. package/dist/client/assets/cose-bilkent-JH36ORCC-EE27IbbX.js.br +0 -0
  78. package/dist/client/assets/cose-bilkent-JH36ORCC-EE27IbbX.js.gz +0 -0
  79. package/dist/client/assets/{cynefin-OW5HDTMX-BOJs6wCD.js → cynefin-OW5HDTMX-CpY9J9iu.js} +1 -1
  80. package/dist/client/assets/cynefin-OW5HDTMX-CpY9J9iu.js.br +0 -0
  81. package/dist/client/assets/cynefin-OW5HDTMX-CpY9J9iu.js.gz +0 -0
  82. package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-DVLqWiJ6.js → cynefinDiagram-5FMLGOSQ-mJxcQnkp.js} +1 -1
  83. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-mJxcQnkp.js.br +0 -0
  84. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-mJxcQnkp.js.gz +0 -0
  85. package/dist/client/assets/{dagre-GXQ25YYZ-e7mtFW8V.js → dagre-GXQ25YYZ-DAUZrxwq.js} +1 -1
  86. package/dist/client/assets/dagre-GXQ25YYZ-DAUZrxwq.js.br +0 -0
  87. package/dist/client/assets/dagre-GXQ25YYZ-DAUZrxwq.js.gz +0 -0
  88. package/dist/client/assets/{diagram-S7CK7UJ4-B9P-CEm4.js → diagram-S7CK7UJ4-3rquuCu6.js} +1 -1
  89. package/dist/client/assets/diagram-S7CK7UJ4-3rquuCu6.js.br +0 -0
  90. package/dist/client/assets/diagram-S7CK7UJ4-3rquuCu6.js.gz +0 -0
  91. package/dist/client/assets/{diagram-UQ7AKVKN-DvTmtjeC.js → diagram-UQ7AKVKN-CZWjaDbi.js} +1 -1
  92. package/dist/client/assets/diagram-UQ7AKVKN-CZWjaDbi.js.br +0 -0
  93. package/dist/client/assets/diagram-UQ7AKVKN-CZWjaDbi.js.gz +0 -0
  94. package/dist/client/assets/{diagram-VSXAHHWV-BmwhsB8_.js → diagram-VSXAHHWV-CNQEg3jR.js} +1 -1
  95. package/dist/client/assets/diagram-VSXAHHWV-CNQEg3jR.js.br +0 -0
  96. package/dist/client/assets/diagram-VSXAHHWV-CNQEg3jR.js.gz +0 -0
  97. package/dist/client/assets/{diagram-VX7I27RA-CvV9NUzM.js → diagram-VX7I27RA-DYorDR1n.js} +1 -1
  98. package/dist/client/assets/diagram-VX7I27RA-DYorDR1n.js.br +0 -0
  99. package/dist/client/assets/diagram-VX7I27RA-DYorDR1n.js.gz +0 -0
  100. package/dist/client/assets/{diagram-Z3DM3KII-DT1POaEF.js → diagram-Z3DM3KII-BPgvVftJ.js} +1 -1
  101. package/dist/client/assets/diagram-Z3DM3KII-BPgvVftJ.js.br +0 -0
  102. package/dist/client/assets/diagram-Z3DM3KII-BPgvVftJ.js.gz +0 -0
  103. package/dist/client/assets/{ebnfDiagram-PWID7BFC-QZNS7lcr.js → ebnfDiagram-PWID7BFC-KqpJv-fX.js} +1 -1
  104. package/dist/client/assets/ebnfDiagram-PWID7BFC-KqpJv-fX.js.br +0 -0
  105. package/dist/client/assets/ebnfDiagram-PWID7BFC-KqpJv-fX.js.gz +0 -0
  106. package/dist/client/assets/{erDiagram-RLTQ6QDP-C9KhKBAJ.js → erDiagram-RLTQ6QDP-Bwj_TPoi.js} +1 -1
  107. package/dist/client/assets/{erDiagram-RLTQ6QDP-C9KhKBAJ.js.br → erDiagram-RLTQ6QDP-Bwj_TPoi.js.br} +0 -0
  108. package/dist/client/assets/erDiagram-RLTQ6QDP-Bwj_TPoi.js.gz +0 -0
  109. package/dist/client/assets/{flowDiagram-HODETNUW-Du-YKajw.js → flowDiagram-HODETNUW-BYALZ5I6.js} +1 -1
  110. package/dist/client/assets/flowDiagram-HODETNUW-BYALZ5I6.js.br +0 -0
  111. package/dist/client/assets/flowDiagram-HODETNUW-BYALZ5I6.js.gz +0 -0
  112. package/dist/client/assets/{ganttDiagram-EL5Y4UJY-I9ibR23C.js → ganttDiagram-EL5Y4UJY-DwrR8yW_.js} +1 -1
  113. package/dist/client/assets/ganttDiagram-EL5Y4UJY-DwrR8yW_.js.br +0 -0
  114. package/dist/client/assets/ganttDiagram-EL5Y4UJY-DwrR8yW_.js.gz +0 -0
  115. package/dist/client/assets/{gestureArbiter-BE8k_FL7.js → gestureArbiter-4NWfZprH.js} +1 -1
  116. package/dist/client/assets/gestureArbiter-4NWfZprH.js.br +0 -0
  117. package/dist/client/assets/gestureArbiter-4NWfZprH.js.gz +0 -0
  118. package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-BK6myYCK.js → gitGraphDiagram-WWUBYQGX-C3pH5ZGR.js} +1 -1
  119. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-C3pH5ZGR.js.br +0 -0
  120. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-C3pH5ZGR.js.gz +0 -0
  121. package/dist/client/assets/index-e1PkqIqN.css +1 -0
  122. package/dist/client/assets/index-e1PkqIqN.css.br +0 -0
  123. package/dist/client/assets/{index-C6xPtOPw.css.gz → index-e1PkqIqN.css.gz} +0 -0
  124. package/dist/client/assets/{infoDiagram-27XIBGKW-D1tExNKF.js → infoDiagram-27XIBGKW-DpnbClE9.js} +1 -1
  125. package/dist/client/assets/{ishikawaDiagram-5VMMS53U-CwY6cf7s.js → ishikawaDiagram-5VMMS53U-BFhiY6uy.js} +1 -1
  126. package/dist/client/assets/ishikawaDiagram-5VMMS53U-BFhiY6uy.js.br +0 -0
  127. package/dist/client/assets/ishikawaDiagram-5VMMS53U-BFhiY6uy.js.gz +0 -0
  128. package/dist/client/assets/{journeyDiagram-3NMN7TZE-Cqy1TbUI.js → journeyDiagram-3NMN7TZE-Beg2Cmg4.js} +1 -1
  129. package/dist/client/assets/journeyDiagram-3NMN7TZE-Beg2Cmg4.js.br +0 -0
  130. package/dist/client/assets/journeyDiagram-3NMN7TZE-Beg2Cmg4.js.gz +0 -0
  131. package/dist/client/assets/{kanban-definition-UXKFOSKX-SXzevtXv.js → kanban-definition-UXKFOSKX-CNb51-_F.js} +1 -1
  132. package/dist/client/assets/kanban-definition-UXKFOSKX-CNb51-_F.js.br +0 -0
  133. package/dist/client/assets/kanban-definition-UXKFOSKX-CNb51-_F.js.gz +0 -0
  134. package/dist/client/assets/{layout-CFH4KsMu.js → layout-B07GM-uc.js} +1 -1
  135. package/dist/client/assets/layout-B07GM-uc.js.br +0 -0
  136. package/dist/client/assets/layout-B07GM-uc.js.gz +0 -0
  137. package/dist/client/assets/{linear-DSGS6T8F.js → linear-DRJlaLbJ.js} +1 -1
  138. package/dist/client/assets/linear-DRJlaLbJ.js.br +0 -0
  139. package/dist/client/assets/linear-DRJlaLbJ.js.gz +0 -0
  140. package/dist/client/assets/{mermaid.core-BpDQIw7m.js → mermaid.core-BySznxI_.js} +5 -5
  141. package/dist/client/assets/mermaid.core-BySznxI_.js.br +0 -0
  142. package/dist/client/assets/mermaid.core-BySznxI_.js.gz +0 -0
  143. package/dist/client/assets/{mindmap-definition-YA3MSWOX-D7H6k38f.js → mindmap-definition-YA3MSWOX-BtStMFHK.js} +1 -1
  144. package/dist/client/assets/mindmap-definition-YA3MSWOX-BtStMFHK.js.br +0 -0
  145. package/dist/client/assets/mindmap-definition-YA3MSWOX-BtStMFHK.js.gz +0 -0
  146. package/dist/client/assets/{passwordBootstrap-B4SLDWeK.js → passwordBootstrap-B-T8YSfQ.js} +1 -1
  147. package/dist/client/assets/passwordBootstrap-B-T8YSfQ.js.br +0 -0
  148. package/dist/client/assets/passwordBootstrap-B-T8YSfQ.js.gz +0 -0
  149. package/dist/client/assets/{pegDiagram-XKGWAZYB-DT21hoef.js → pegDiagram-XKGWAZYB-BNJzxFGK.js} +1 -1
  150. package/dist/client/assets/pegDiagram-XKGWAZYB-BNJzxFGK.js.br +0 -0
  151. package/dist/client/assets/pegDiagram-XKGWAZYB-BNJzxFGK.js.gz +0 -0
  152. package/dist/client/assets/{pieDiagram-E7YTZNPT-CP_7qBRV.js → pieDiagram-E7YTZNPT-Df1Y6zou.js} +1 -1
  153. package/dist/client/assets/pieDiagram-E7YTZNPT-Df1Y6zou.js.br +0 -0
  154. package/dist/client/assets/pieDiagram-E7YTZNPT-Df1Y6zou.js.gz +0 -0
  155. package/dist/client/assets/{quadrantDiagram-AXDQQJYC-CLBVrI3n.js → quadrantDiagram-AXDQQJYC-Q3jN6--F.js} +1 -1
  156. package/dist/client/assets/quadrantDiagram-AXDQQJYC-Q3jN6--F.js.br +0 -0
  157. package/dist/client/assets/quadrantDiagram-AXDQQJYC-Q3jN6--F.js.gz +0 -0
  158. package/dist/client/assets/{railroadDiagram-O6MQD6OU-DJoM5WtF.js → railroadDiagram-O6MQD6OU-c-1SN7pC.js} +1 -1
  159. package/dist/client/assets/railroadDiagram-O6MQD6OU-c-1SN7pC.js.br +0 -0
  160. package/dist/client/assets/railroadDiagram-O6MQD6OU-c-1SN7pC.js.gz +0 -0
  161. package/dist/client/assets/{rdpSession-C0jVZfFV.js → rdpSession-B6j6_C4D.js} +1 -1
  162. package/dist/client/assets/rdpSession-B6j6_C4D.js.br +0 -0
  163. package/dist/client/assets/rdpSession-B6j6_C4D.js.gz +0 -0
  164. package/dist/client/assets/{referenceLongPress-LCYPFdN8.js → referenceLongPress-Bln9X6SW.js} +1 -1
  165. package/dist/client/assets/referenceLongPress-Bln9X6SW.js.br +0 -0
  166. package/dist/client/assets/referenceLongPress-Bln9X6SW.js.gz +0 -0
  167. package/dist/client/assets/{requirementDiagram-BXWQKSXE-BHLyxBdU.js → requirementDiagram-BXWQKSXE-wcsUZu82.js} +1 -1
  168. package/dist/client/assets/requirementDiagram-BXWQKSXE-wcsUZu82.js.br +0 -0
  169. package/dist/client/assets/requirementDiagram-BXWQKSXE-wcsUZu82.js.gz +0 -0
  170. package/dist/client/assets/{sankeyDiagram-P5KCCOFB-CUgEsLUw.js → sankeyDiagram-P5KCCOFB-CfXyROPC.js} +1 -1
  171. package/dist/client/assets/sankeyDiagram-P5KCCOFB-CfXyROPC.js.br +0 -0
  172. package/dist/client/assets/sankeyDiagram-P5KCCOFB-CfXyROPC.js.gz +0 -0
  173. package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-qEb89gHp.js → sequenceDiagram-WJ2MYXX4-D-IasKbj.js} +1 -1
  174. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-D-IasKbj.js.br +0 -0
  175. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-D-IasKbj.js.gz +0 -0
  176. package/dist/client/assets/{sizeCapture-INFHLROL-BUOHBGK2.js → sizeCapture-INFHLROL-Cyoh7jyx.js} +1 -1
  177. package/dist/client/assets/sizeCapture-INFHLROL-Cyoh7jyx.js.br +0 -0
  178. package/dist/client/assets/sizeCapture-INFHLROL-Cyoh7jyx.js.gz +0 -0
  179. package/dist/client/assets/{sparkles-Cm9xs8pz.js → sparkles-kooHQYLJ.js} +1 -1
  180. package/dist/client/assets/{stateDiagram-D77RDMKH-Dx0afnU6.js → stateDiagram-D77RDMKH-BFeLYGOW.js} +1 -1
  181. package/dist/client/assets/stateDiagram-D77RDMKH-BFeLYGOW.js.br +0 -0
  182. package/dist/client/assets/stateDiagram-D77RDMKH-BFeLYGOW.js.gz +0 -0
  183. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-Cn5inEsZ.js +1 -0
  184. package/dist/client/assets/{swimlanes-42K2YHIH-DeG8X6CN.js → swimlanes-42K2YHIH-BtMhgPB2.js} +1 -1
  185. package/dist/client/assets/{swimlanes-42K2YHIH-DeG8X6CN.js.br → swimlanes-42K2YHIH-BtMhgPB2.js.br} +0 -0
  186. package/dist/client/assets/swimlanes-42K2YHIH-BtMhgPB2.js.gz +0 -0
  187. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-Di2Vfydj.js +8 -0
  188. package/dist/client/assets/{timeline-definition-24CTP7MA-Bkts868I.js → timeline-definition-24CTP7MA-BccUO5W0.js} +1 -1
  189. package/dist/client/assets/timeline-definition-24CTP7MA-BccUO5W0.js.br +0 -0
  190. package/dist/client/assets/timeline-definition-24CTP7MA-BccUO5W0.js.gz +0 -0
  191. package/dist/client/assets/{triangle-alert-D1VnXjVL.js → triangle-alert-rgLWcpfP.js} +1 -1
  192. package/dist/client/assets/{vennDiagram-4TSXK5OY-BOoHxntl.js → vennDiagram-4TSXK5OY-hNN_O594.js} +1 -1
  193. package/dist/client/assets/vennDiagram-4TSXK5OY-hNN_O594.js.br +0 -0
  194. package/dist/client/assets/vennDiagram-4TSXK5OY-hNN_O594.js.gz +0 -0
  195. package/dist/client/assets/{videoCompression-BONtNnBl.js → videoCompression-DS0r00L6.js} +1 -1
  196. package/dist/client/assets/videoCompression-DS0r00L6.js.br +0 -0
  197. package/dist/client/assets/videoCompression-DS0r00L6.js.gz +0 -0
  198. package/dist/client/assets/{wardleyDiagram-VM6X3IG4-BAuuRkvt.js → wardleyDiagram-VM6X3IG4-C6h02bPv.js} +1 -1
  199. package/dist/client/assets/wardleyDiagram-VM6X3IG4-C6h02bPv.js.br +0 -0
  200. package/dist/client/assets/wardleyDiagram-VM6X3IG4-C6h02bPv.js.gz +0 -0
  201. package/dist/client/assets/{xychartDiagram-S5SC5T6Z-DvJOw2Ss.js → xychartDiagram-S5SC5T6Z-DvNnLmXs.js} +1 -1
  202. package/dist/client/assets/xychartDiagram-S5SC5T6Z-DvNnLmXs.js.br +0 -0
  203. package/dist/client/assets/xychartDiagram-S5SC5T6Z-DvNnLmXs.js.gz +0 -0
  204. package/dist/client/index.html +2 -2
  205. package/dist/client/index.html.br +0 -0
  206. package/dist/client/index.html.gz +0 -0
  207. package/dist/client/sw.js +1 -1
  208. package/dist/client/sw.js.br +0 -0
  209. package/dist/client/sw.js.gz +0 -0
  210. package/dist/server/routes/rdp.js +1 -1
  211. package/dist/server/routes/terminal.js +44 -24
  212. package/dist/server/utils/tmuxClientCapabilities.js +1 -1
  213. package/dist/server/utils/tmuxSizeOwnership.js +18 -0
  214. package/package.json +1 -1
  215. package/runtime-manifest.json +3 -3
  216. package/dist/client/assets/App-xr2R4dST.js.br +0 -0
  217. package/dist/client/assets/App-xr2R4dST.js.gz +0 -0
  218. package/dist/client/assets/ArchitecturePanel-XprzcGMT.js.br +0 -0
  219. package/dist/client/assets/ArchitecturePanel-XprzcGMT.js.gz +0 -0
  220. package/dist/client/assets/ChangeWalkthroughPanel-g83lCwJi.js.br +0 -0
  221. package/dist/client/assets/ChangeWalkthroughPanel-g83lCwJi.js.gz +0 -0
  222. package/dist/client/assets/CollaborationMainWorkspace-BbkFTnw1.js.br +0 -0
  223. package/dist/client/assets/CollaborationMainWorkspace-BbkFTnw1.js.gz +0 -0
  224. package/dist/client/assets/CollaborationTaskContent-C8Nrrlcz.js +0 -2
  225. package/dist/client/assets/ComputerControlView-yBUQcmwF.js +0 -6
  226. package/dist/client/assets/ComputerControlView-yBUQcmwF.js.br +0 -0
  227. package/dist/client/assets/ComputerControlView-yBUQcmwF.js.gz +0 -0
  228. package/dist/client/assets/DagPlayground--KDWJkVL.js.br +0 -0
  229. package/dist/client/assets/DagPlayground--KDWJkVL.js.gz +0 -0
  230. package/dist/client/assets/DiffLab-BAyGlKKp.js.br +0 -0
  231. package/dist/client/assets/DiffLab-BAyGlKKp.js.gz +0 -0
  232. package/dist/client/assets/DiffReview-CLKpyDPZ.js.br +0 -0
  233. package/dist/client/assets/DiffReview-CLKpyDPZ.js.gz +0 -0
  234. package/dist/client/assets/DiffReviewLab-BoFElesI.js.br +0 -0
  235. package/dist/client/assets/DiffReviewLab-BoFElesI.js.gz +0 -0
  236. package/dist/client/assets/DiffViewer-DDiASWHf.js.br +0 -0
  237. package/dist/client/assets/ModelPreview-PJWJT35T.js.br +0 -0
  238. package/dist/client/assets/ModelPreview-PJWJT35T.js.gz +0 -0
  239. package/dist/client/assets/RightSidebar-CfOJHcXO.js.br +0 -0
  240. package/dist/client/assets/RightSidebar-CfOJHcXO.js.gz +0 -0
  241. package/dist/client/assets/abnfDiagram-VCTEODGH-CwEvSK80.js.br +0 -0
  242. package/dist/client/assets/abnfDiagram-VCTEODGH-CwEvSK80.js.gz +0 -0
  243. package/dist/client/assets/app-DNnVU3VK.js.br +0 -0
  244. package/dist/client/assets/app-DNnVU3VK.js.gz +0 -0
  245. package/dist/client/assets/arc-Ctz1KMpY.js.br +0 -0
  246. package/dist/client/assets/arc-Ctz1KMpY.js.gz +0 -0
  247. package/dist/client/assets/architectureDiagram-5GKGNRK7-DJSgVQQQ.js.br +0 -0
  248. package/dist/client/assets/architectureDiagram-5GKGNRK7-DJSgVQQQ.js.gz +0 -0
  249. package/dist/client/assets/blockDiagram-I7D4REHJ-N_yr-Q8w.js.br +0 -0
  250. package/dist/client/assets/blockDiagram-I7D4REHJ-N_yr-Q8w.js.gz +0 -0
  251. package/dist/client/assets/c4Diagram-7LVT6UL2-DVQnawpY.js.br +0 -0
  252. package/dist/client/assets/c4Diagram-7LVT6UL2-DVQnawpY.js.gz +0 -0
  253. package/dist/client/assets/channel-b8iCTsm_.js +0 -1
  254. package/dist/client/assets/chunk-F27PBJKO-BW5JuQIW.js.br +0 -0
  255. package/dist/client/assets/chunk-F27PBJKO-BW5JuQIW.js.gz +0 -0
  256. package/dist/client/assets/chunk-IMKFNOWR-CDGBumC-.js.br +0 -0
  257. package/dist/client/assets/chunk-IMKFNOWR-CDGBumC-.js.gz +0 -0
  258. package/dist/client/assets/chunk-SVP7TREG-BGwkXakv.js.br +0 -0
  259. package/dist/client/assets/chunk-SVP7TREG-BGwkXakv.js.gz +0 -0
  260. package/dist/client/assets/chunk-TICWLB2K-CMxjLRcv.js.br +0 -0
  261. package/dist/client/assets/chunk-TICWLB2K-CMxjLRcv.js.gz +0 -0
  262. package/dist/client/assets/classDiagram-ZZMXUADV-DrGmXJ_R.js +0 -1
  263. package/dist/client/assets/classDiagram-v2-VYDZK3BY-DrGmXJ_R.js +0 -1
  264. package/dist/client/assets/cose-bilkent-JH36ORCC-Des2am0k.js.br +0 -0
  265. package/dist/client/assets/cose-bilkent-JH36ORCC-Des2am0k.js.gz +0 -0
  266. package/dist/client/assets/cynefin-OW5HDTMX-BOJs6wCD.js.br +0 -0
  267. package/dist/client/assets/cynefin-OW5HDTMX-BOJs6wCD.js.gz +0 -0
  268. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-DVLqWiJ6.js.br +0 -0
  269. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-DVLqWiJ6.js.gz +0 -0
  270. package/dist/client/assets/dagre-GXQ25YYZ-e7mtFW8V.js.br +0 -0
  271. package/dist/client/assets/dagre-GXQ25YYZ-e7mtFW8V.js.gz +0 -0
  272. package/dist/client/assets/diagram-S7CK7UJ4-B9P-CEm4.js.br +0 -0
  273. package/dist/client/assets/diagram-S7CK7UJ4-B9P-CEm4.js.gz +0 -0
  274. package/dist/client/assets/diagram-UQ7AKVKN-DvTmtjeC.js.br +0 -0
  275. package/dist/client/assets/diagram-UQ7AKVKN-DvTmtjeC.js.gz +0 -0
  276. package/dist/client/assets/diagram-VSXAHHWV-BmwhsB8_.js.br +0 -0
  277. package/dist/client/assets/diagram-VSXAHHWV-BmwhsB8_.js.gz +0 -0
  278. package/dist/client/assets/diagram-VX7I27RA-CvV9NUzM.js.br +0 -0
  279. package/dist/client/assets/diagram-VX7I27RA-CvV9NUzM.js.gz +0 -0
  280. package/dist/client/assets/diagram-Z3DM3KII-DT1POaEF.js.br +0 -0
  281. package/dist/client/assets/diagram-Z3DM3KII-DT1POaEF.js.gz +0 -0
  282. package/dist/client/assets/ebnfDiagram-PWID7BFC-QZNS7lcr.js.br +0 -0
  283. package/dist/client/assets/ebnfDiagram-PWID7BFC-QZNS7lcr.js.gz +0 -0
  284. package/dist/client/assets/erDiagram-RLTQ6QDP-C9KhKBAJ.js.gz +0 -0
  285. package/dist/client/assets/flowDiagram-HODETNUW-Du-YKajw.js.br +0 -0
  286. package/dist/client/assets/flowDiagram-HODETNUW-Du-YKajw.js.gz +0 -0
  287. package/dist/client/assets/ganttDiagram-EL5Y4UJY-I9ibR23C.js.br +0 -0
  288. package/dist/client/assets/ganttDiagram-EL5Y4UJY-I9ibR23C.js.gz +0 -0
  289. package/dist/client/assets/gestureArbiter-BE8k_FL7.js.br +0 -0
  290. package/dist/client/assets/gestureArbiter-BE8k_FL7.js.gz +0 -0
  291. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BK6myYCK.js.br +0 -0
  292. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BK6myYCK.js.gz +0 -0
  293. package/dist/client/assets/index-C6xPtOPw.css +0 -1
  294. package/dist/client/assets/index-C6xPtOPw.css.br +0 -0
  295. package/dist/client/assets/ishikawaDiagram-5VMMS53U-CwY6cf7s.js.br +0 -0
  296. package/dist/client/assets/ishikawaDiagram-5VMMS53U-CwY6cf7s.js.gz +0 -0
  297. package/dist/client/assets/journeyDiagram-3NMN7TZE-Cqy1TbUI.js.br +0 -0
  298. package/dist/client/assets/journeyDiagram-3NMN7TZE-Cqy1TbUI.js.gz +0 -0
  299. package/dist/client/assets/kanban-definition-UXKFOSKX-SXzevtXv.js.br +0 -0
  300. package/dist/client/assets/kanban-definition-UXKFOSKX-SXzevtXv.js.gz +0 -0
  301. package/dist/client/assets/layout-CFH4KsMu.js.br +0 -0
  302. package/dist/client/assets/layout-CFH4KsMu.js.gz +0 -0
  303. package/dist/client/assets/linear-DSGS6T8F.js.br +0 -0
  304. package/dist/client/assets/linear-DSGS6T8F.js.gz +0 -0
  305. package/dist/client/assets/mermaid.core-BpDQIw7m.js.br +0 -0
  306. package/dist/client/assets/mermaid.core-BpDQIw7m.js.gz +0 -0
  307. package/dist/client/assets/mindmap-definition-YA3MSWOX-D7H6k38f.js.br +0 -0
  308. package/dist/client/assets/mindmap-definition-YA3MSWOX-D7H6k38f.js.gz +0 -0
  309. package/dist/client/assets/passwordBootstrap-B4SLDWeK.js.br +0 -0
  310. package/dist/client/assets/passwordBootstrap-B4SLDWeK.js.gz +0 -0
  311. package/dist/client/assets/pegDiagram-XKGWAZYB-DT21hoef.js.br +0 -0
  312. package/dist/client/assets/pegDiagram-XKGWAZYB-DT21hoef.js.gz +0 -0
  313. package/dist/client/assets/pieDiagram-E7YTZNPT-CP_7qBRV.js.br +0 -0
  314. package/dist/client/assets/pieDiagram-E7YTZNPT-CP_7qBRV.js.gz +0 -0
  315. package/dist/client/assets/quadrantDiagram-AXDQQJYC-CLBVrI3n.js.br +0 -0
  316. package/dist/client/assets/quadrantDiagram-AXDQQJYC-CLBVrI3n.js.gz +0 -0
  317. package/dist/client/assets/railroadDiagram-O6MQD6OU-DJoM5WtF.js.br +0 -0
  318. package/dist/client/assets/railroadDiagram-O6MQD6OU-DJoM5WtF.js.gz +0 -0
  319. package/dist/client/assets/rdpSession-C0jVZfFV.js.br +0 -0
  320. package/dist/client/assets/rdpSession-C0jVZfFV.js.gz +0 -0
  321. package/dist/client/assets/referenceLongPress-LCYPFdN8.js.br +0 -0
  322. package/dist/client/assets/referenceLongPress-LCYPFdN8.js.gz +0 -0
  323. package/dist/client/assets/requirementDiagram-BXWQKSXE-BHLyxBdU.js.br +0 -0
  324. package/dist/client/assets/requirementDiagram-BXWQKSXE-BHLyxBdU.js.gz +0 -0
  325. package/dist/client/assets/sankeyDiagram-P5KCCOFB-CUgEsLUw.js.br +0 -0
  326. package/dist/client/assets/sankeyDiagram-P5KCCOFB-CUgEsLUw.js.gz +0 -0
  327. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-qEb89gHp.js.br +0 -0
  328. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-qEb89gHp.js.gz +0 -0
  329. package/dist/client/assets/sizeCapture-INFHLROL-BUOHBGK2.js.br +0 -0
  330. package/dist/client/assets/sizeCapture-INFHLROL-BUOHBGK2.js.gz +0 -0
  331. package/dist/client/assets/stateDiagram-D77RDMKH-Dx0afnU6.js.br +0 -0
  332. package/dist/client/assets/stateDiagram-D77RDMKH-Dx0afnU6.js.gz +0 -0
  333. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-CzHE6VoX.js +0 -1
  334. package/dist/client/assets/swimlanes-42K2YHIH-DeG8X6CN.js.gz +0 -0
  335. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-B4wu-iuA.js +0 -8
  336. package/dist/client/assets/timeline-definition-24CTP7MA-Bkts868I.js.br +0 -0
  337. package/dist/client/assets/timeline-definition-24CTP7MA-Bkts868I.js.gz +0 -0
  338. package/dist/client/assets/vennDiagram-4TSXK5OY-BOoHxntl.js.br +0 -0
  339. package/dist/client/assets/vennDiagram-4TSXK5OY-BOoHxntl.js.gz +0 -0
  340. package/dist/client/assets/videoCompression-BONtNnBl.js.br +0 -0
  341. package/dist/client/assets/videoCompression-BONtNnBl.js.gz +0 -0
  342. package/dist/client/assets/wardleyDiagram-VM6X3IG4-BAuuRkvt.js.br +0 -0
  343. package/dist/client/assets/wardleyDiagram-VM6X3IG4-BAuuRkvt.js.gz +0 -0
  344. package/dist/client/assets/xychartDiagram-S5SC5T6Z-DvJOw2Ss.js.br +0 -0
  345. package/dist/client/assets/xychartDiagram-S5SC5T6Z-DvJOw2Ss.js.gz +0 -0
@@ -1,5 +1,5 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/RightSidebar-CfOJHcXO.js","assets/app-DNnVU3VK.js","assets/react-XDCjal2T.js","assets/dnd-BCFAPC0L.js","assets/terminal-C7X98Amf.js","assets/index-C6xPtOPw.css","assets/App-xr2R4dST.js","assets/gestureArbiter-BE8k_FL7.js","assets/gestureArbiter-C2J0D0kV.css","assets/triangle-alert-D1VnXjVL.js","assets/referenceLongPress-LCYPFdN8.js","assets/DiffReview-CLKpyDPZ.js","assets/sparkles-Cm9xs8pz.js","assets/DiffViewer-DDiASWHf.js","assets/DiffViewer-T3uj2-aP.css","assets/ChangeWalkthroughPanel-g83lCwJi.js","assets/RightSidebar-DW-JEgm2.css"])))=>i.map(i=>d[i]);
2
- import{ah as gt,aO as At,df as he,bA as e,_ as Dt,cv as Ge,cw as Mt,dg as We,n as yt,X as Se,dl as et,C as Tt,g as Ft,e as Fe,c as Lt,a as Pt,d as jt,dr as It}from"./app-DNnVU3VK.js";import{b as s,r as vt}from"./dnd-BCFAPC0L.js";import{ad as Je,ai as Le,a as wt,a4 as Ot,H as Ht,n as tt,Z as Bt,a5 as _t,a0 as qe,b as pe,e as Nt,a1 as qt,a3 as nt,u as Ut,ae as Wt,i as Jt,r as Vt,R as kt,o as Kt,af as Xt,a6 as Zt,p as Yt,D as Ee,N as mt,a2 as Qt}from"./App-xr2R4dST.js";import{L as Gt}from"./DiffViewer-DDiASWHf.js";import er from"./purify.es-4eNOHKSq.js";import{l as tr,i as rr,S as sr}from"./RightSidebar-CfOJHcXO.js";import{L as nr}from"./triangle-alert-D1VnXjVL.js";import{S as St}from"./sparkles-Cm9xs8pz.js";import"./react-XDCjal2T.js";import"./terminal-C7X98Amf.js";import"./gestureArbiter-BE8k_FL7.js";import"./referenceLongPress-LCYPFdN8.js";import"./DiffReview-CLKpyDPZ.js";import"./ChangeWalkthroughPanel-g83lCwJi.js";const ir=[["path",{d:"M17 7 7 17",key:"15tmo1"}],["path",{d:"M17 17H7V7",key:"1org7z"}]],ar=gt("arrow-down-left",ir);const lr=[["path",{d:"m15 15 6 6",key:"1s409w"}],["path",{d:"m15 9 6-6",key:"ko1vev"}],["path",{d:"M21 16v5h-5",key:"1ck2sf"}],["path",{d:"M21 8V3h-5",key:"1qoq8a"}],["path",{d:"M3 16v5h5",key:"1t08am"}],["path",{d:"m3 21 6-6",key:"wwnumi"}],["path",{d:"M3 8V3h5",key:"1ln10m"}],["path",{d:"M9 9 3 3",key:"v551iv"}]],cr=gt("expand",lr);function or(r,o){const a=new Map,d={id:"all-perspectives",title:o,summary:r.summary,nodes:[],edges:[]};return r.perspectives.forEach((p,n)=>{const x=`perspective${n}`,g=new Map(p.nodes.map((u,c)=>[u.id,`${x}_node${c}`]));a.set(x,{perspective:p.id}),d.nodes.push({id:x,title:p.title,summary:p.summary,files:[],description:p.description});for(const u of p.nodes){const c=g.get(u.id);a.set(c,{perspective:p.id,node:u.id}),d.nodes.push({...u,id:c,parentId:u.parentId?g.get(u.parentId):x})}d.edges.push(...p.edges.map(u=>({...u,from:g.get(u.from),to:g.get(u.to)})))}),{view:d,references:a}}async function $e(r,o,a,d){const p=new URLSearchParams({root:r}),n=await fetch(`/api/terminal/architecture/${o}${d?"":`${o.includes("?")?"&":"?"}${p}`}`,{signal:a,cache:"no-store",...d?{method:"PUT",headers:{"Content-Type":"application/json","X-XSRF-TOKEN":await At()},body:JSON.stringify({root:r,...d})}:{}}),x=await n.json();if(!n.ok)throw new Error(x.error||`HTTP ${n.status}`);return x}async function ur(r,o){const a=await $e(r,"documents",o);if(!Array.isArray(a.files))throw new Error("Invalid architecture library");return[...new Set(a.files.filter(d=>typeof d=="string"&&Je(d)))].sort()}async function Ue(r,o,a){if(!Je(o))throw new Error("Invalid architecture file");const d=await $e(r,`document?${new URLSearchParams({file:o})}`,a);if(!("document"in d)||d.revision!==null&&typeof d.revision!="string")throw new Error("Invalid architecture response");return{document:d.document?Le(JSON.stringify(d.document)):null,revision:typeof d.revision=="string"?d.revision:null}}async function dr(r,o,a,d,p,n,x){const g=await $e(r,"field",void 0,{file:o,perspective:a,node:d,field:p,value:n,revision:x});return Le(JSON.stringify(g.document))}async function mr(r,o,a){const d=await $e(r,`history?${new URLSearchParams({file:o})}`,a);if(!Array.isArray(d.versions))throw new Error("Invalid architecture history");return d.versions}async function hr(r,o){return $e(r,`bundle?${new URLSearchParams({file:o})}`)}async function xr(r,o,a){const d=await $e(r,"bundle",void 0,{bundle:o,revision:a});return Le(JSON.stringify(d.document))}async function pr(r,o,a,d){const p=await $e(r,"document",void 0,{file:o,document:a,...d!==void 0?{revision:d}:{}});return Le(JSON.stringify(p.document))}const fr=s.lazy(()=>Dt(()=>import("./RightSidebar-CfOJHcXO.js").then(r=>r.R),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16])).then(r=>({default:r.MarkdownPreview})));function rt(r,o){return o?{description:"说明",diagram:"关系图源码",context:"上下文",constraint:"约束",concern:"问题与风险",todo:"待办",note:"备注"}[r]:{description:"Description",diagram:"Diagram source",context:"Context",constraint:"Constraints",concern:"Concerns",todo:"To do",note:"Notes"}[r]}function st({value:r,rootPath:o,onEdit:a,onOpenFile:d}){const{locale:p}=he(),n=p==="zh",x=r.description?.replace(/^#\s+([^\n]+)\n\s*/,(u,c)=>c.trim()===r.title?"":u),g=u=>e.jsx(s.Suspense,{fallback:e.jsx("p",{className:"whitespace-pre-wrap text-sm",children:u}),children:e.jsx(fr,{referenceLines:!1,content:u,filePath:null,rootPath:o??null,lineRange:null,onLineRangeClick:()=>{},scrollTop:0,outlineOpen:!1,lightboxOpen:!1,onLocalLinkOpen:c=>d?.({path:o&&c.path.startsWith(`${o}/`)?c.path.slice(o.length+1):c.path})})});return e.jsxs("div",{className:"space-y-2",children:[x&&e.jsx("div",{className:"min-w-0 overflow-x-auto",children:g(x)}),wt.filter(u=>u!=="description"&&r[u]).map(u=>e.jsxs("details",{className:"rounded-lg border border-border/15 px-2",children:[e.jsx("summary",{className:"min-h-11 cursor-pointer py-3 text-xs font-medium",children:rt(u,n)}),e.jsxs("div",{className:"min-w-0 overflow-x-auto pb-2",children:[u==="diagram"?e.jsx("pre",{className:"whitespace-pre-wrap break-all text-xs",children:r[u]}):g(r[u]),a&&e.jsx("button",{type:"button",className:"min-h-11 rounded px-2 text-xs text-primary hover:bg-surface-elevated",onClick:()=>a(u),children:n?"编辑此字段":"Edit field"})]})]},u)),a&&e.jsx("button",{type:"button",className:"min-h-11 rounded-lg px-3 text-xs text-primary hover:bg-surface-elevated",onClick:()=>a("description"),children:n?"编辑文档":"Edit document"}),r.meta&&e.jsxs("details",{children:[e.jsx("summary",{className:"min-h-11 cursor-pointer py-3 text-xs text-muted-foreground",children:n?"版本信息":"Version information"}),e.jsx("dl",{className:"grid grid-cols-[auto_1fr] gap-x-3 gap-y-1 break-all pb-3 text-xs text-muted-foreground",children:Object.entries(r.meta).filter(([u])=>u!=="previousDiagram").map(([u,c])=>e.jsxs("div",{className:"contents",children:[e.jsx("dt",{children:{created:n?"创建":"Created",updated:n?"更新":"Updated",updateCount:n?"更新次数":"Updates",gitCommit:"Commit",gitBranch:n?"分支":"Branch"}[u]??u}),e.jsx("dd",{children:String(c)})]},u))})]})]})}function Qe({root:r,file:o,perspective:a,node:d,initialField:p,onSaved:n,onCancel:x}){const{locale:g}=he(),u=g==="zh",[c,F]=s.useState(null),[M,k]=s.useState(p),[C,R]=s.useState(""),[N,E]=s.useState(""),[z,$]=s.useState(""),[l,b]=s.useState(!1),h=s.useRef(!0),j=s.useRef(0);s.useEffect(()=>{h.current=!0;const f=++j.current;F(null),$("");const H=new AbortController;return Ue(r,o,H.signal).then(P=>{!H.signal.aborted&&f===j.current&&F(P)}).catch(P=>{!H.signal.aborted&&f===j.current&&$(String(P.message))}),()=>{h.current=!1,++j.current,H.abort()}},[r,o]),s.useEffect(()=>{const f=c?.document?.perspectives.find(U=>U.id===a),H=d?f?.nodes.find(U=>U.id===d):f;if(!H||!f)return;const P=H[M]??(M==="description"?H.summary:M==="diagram"?Ot(f,d):"");R(P),E(P)},[c,a,d,M]);const B=C!==N;return e.jsxs("form",{className:"flex min-h-0 flex-1 flex-col gap-3",onSubmit:f=>{if(f.preventDefault(),!c||l||!B)return;const H=j.current;b(!0),$(""),dr(r,o,a,d,M,C,c.revision).then(P=>{h.current&&H===j.current&&n(P)}).catch(P=>{h.current&&H===j.current&&$(P.message)}).finally(()=>{h.current&&H===j.current&&b(!1)})},children:[e.jsxs("label",{className:"flex items-center gap-2 text-xs",children:[u?"字段":"Field",e.jsx("select",{"aria-label":u?"文档字段":"Document field",className:"min-h-11 min-w-0 flex-1 rounded bg-surface-2 px-2",value:M,disabled:l||B,onChange:f=>k(f.target.value),children:wt.map(f=>e.jsx("option",{value:f,children:rt(f,u)},f))})]}),B&&e.jsx("p",{className:"text-xs text-muted-foreground",children:u?"保存当前字段后可切换字段。":"Save this field before switching fields."}),!c&&!z&&e.jsx("p",{role:"status",className:"text-xs",children:u?"读取最新文档…":"Loading the latest document…"}),e.jsx("textarea",{"aria-label":rt(M,u),spellCheck:!1,className:"min-h-56 w-full flex-1 resize-y rounded-lg border border-border/30 bg-surface-2 p-3 font-mono text-sm focus-visible:ring-2 focus-visible:ring-ring",disabled:!c||l,maxLength:1e5,value:C,onChange:f=>R(f.target.value)}),z&&e.jsx("p",{role:"alert",className:"break-words text-xs text-destructive",children:z}),e.jsxs("div",{className:"sticky bottom-0 flex gap-2 bg-surface py-2",children:[e.jsx("button",{type:"submit",className:"min-h-11 rounded-lg bg-primary/15 px-4 text-sm text-primary disabled:opacity-40",disabled:!c||l||!B,children:l?u?"保存中…":"Saving…":u?"保存":"Save"}),e.jsx("button",{type:"button",className:"min-h-11 rounded-lg px-4 text-sm hover:bg-surface-elevated",disabled:l,onClick:x,children:u?"取消":"Cancel"})]})]})}function br({root:r,file:o,document:a,onLoaded:d}){const{locale:p}=he(),n=p==="zh",[x,g]=s.useState(""),[u,c]=s.useState(""),[F,M]=s.useState(!1),[k,C]=s.useState(null),[R,N]=s.useState(null),E=s.useRef(null),z=s.useRef(0);s.useEffect(()=>(z.current++,N(null),C(null),g(""),c(""),M(!1),()=>{z.current++}),[r,o]);async function $(b){const h=++z.current;M(!0),g(""),c("");try{await b(()=>h===z.current)}catch(j){h===z.current&&g(j instanceof Error?j.message:String(j))}finally{h===z.current&&M(!1)}}const l="inline-flex min-h-11 items-center gap-1.5 rounded-lg px-3 text-xs hover:bg-surface-elevated disabled:opacity-40";return e.jsxs("details",{className:"rounded-lg border border-border/15 px-3",children:[e.jsx("summary",{className:"min-h-11 cursor-pointer py-3 text-xs text-muted-foreground",children:n?"历史、导入与分享":"History, import and sharing"}),e.jsxs("div",{className:"flex flex-wrap gap-1",children:[e.jsxs("button",{className:l,type:"button",disabled:F||!a,onClick:()=>{$(async b=>{const h=await mr(r,o);b()&&C(h)})},children:[e.jsx(Ht,{size:14}),n?"更新差异":"Changes"]}),e.jsxs("button",{className:l,type:"button",disabled:F||!a,onClick:()=>{$(async()=>{await Ge(new Blob([JSON.stringify(a,null,2)],{type:"application/json"}),"termdock-architecture.json")})},children:[e.jsx(tt,{size:14}),"JSON"]}),e.jsxs("button",{className:l,type:"button",disabled:F||!a,onClick:()=>{$(async()=>{const b=await hr(r,o);await Ge(new Blob([JSON.stringify(b,null,2)],{type:"application/json"}),"architecture.omm.json")})},children:[e.jsx(tt,{size:14}),".omm"]}),e.jsxs("button",{className:l,type:"button",disabled:F,onClick:()=>E.current?.click(),children:[e.jsx(Bt,{size:14}),n?"导入":"Import"]}),e.jsxs("button",{className:l,type:"button",disabled:F||!a,onClick:()=>{$(async()=>{const b=Mt(),h=_t(window.location.origin,{root:r,file:o,...b?{peerId:b.targetPeerId,serviceName:b.serviceName}:{}});await navigator.clipboard.writeText(h),c(n?"链接已复制,打开时需要登录此 Termdock 服务。":"Link copied. Sign in to this Termdock service to view it.")})},children:[e.jsx(Gt,{size:14}),n?"复制查看链接":"Copy viewer link"]})]}),e.jsx("input",{ref:E,hidden:!0,type:"file",accept:".json,application/json",onChange:b=>{const h=b.target.files?.[0];b.target.value="",h&&$(async j=>{if(h.size>5e6)throw new Error(n?"文档超过 5 MB。":"Document exceeds 5 MB.");const B=await h.text();if(!j())return;const f=JSON.parse(B);if(f?.format==="termdock-omm-bundle"){const Q=await Ue(r,".omm");if(!j())return;N({name:h.name,value:f,file:".omm",revision:Q.revision});return}const H=Le(B),P=H.analysis?qe(H.analysis):pe,U=await Ue(r,P);j()&&N({name:h.name,value:H,file:P,revision:U.revision})})}}),R&&e.jsxs("div",{className:"my-2 rounded-lg bg-surface-2 p-3 text-xs",children:[e.jsxs("p",{className:"break-all",children:[R.name," → ",R.file]}),e.jsx("p",{className:"mt-1 text-muted-foreground",children:R.file===".omm"?n?"合并文档中的目录和字段;同名字段将更新。":"Merge bundled directories and fields; matching fields are updated.":n?"保存为此范围的架构,并保留此前的版本。":"Save this scope and retain its previous version."}),e.jsxs("div",{className:"mt-2 flex gap-2",children:[e.jsx("button",{className:`${l} text-primary`,disabled:F,type:"button",onClick:()=>{$(async b=>{const h=R.file===".omm"?await xr(r,R.value,R.revision):await pr(r,R.file,R.value,R.revision);b()&&(N(null),d(R.file,h))})},children:n?"确认导入":"Import document"}),e.jsx("button",{className:l,disabled:F,type:"button",onClick:()=>N(null),children:n?"取消":"Cancel"})]})]}),F&&e.jsx("p",{role:"status",className:"py-2 text-xs",children:n?"处理中…":"Working…"}),x&&e.jsx("p",{role:"alert",className:"break-words py-2 text-xs text-destructive",children:x}),u&&e.jsx("p",{role:"status",className:"py-2 text-xs text-muted-foreground",children:u}),k&&e.jsxs("div",{className:"space-y-2 pb-3",children:[k.length===0&&e.jsx("p",{className:"text-xs text-muted-foreground",children:n?"还没有历史版本。使用原生命令或文档编辑保存后会保留版本。":"No previous versions. Native saves and document edits retain history."}),k.map(b=>e.jsxs("details",{children:[e.jsxs("summary",{className:"min-h-11 cursor-pointer py-3 text-xs",children:[new Date(b.savedAt).toLocaleString()," · ",b.changes.length," ",n?"处差异":"changes"]}),e.jsx("ul",{className:"space-y-1 text-xs text-muted-foreground",children:b.changes.map((h,j)=>e.jsxs("li",{className:"break-words",children:[h.kind==="added"?"+":h.kind==="removed"?"−":"~"," ",h.perspective?h.title:n?"项目总览":h.title," · ",h.fields.join(", ")]},j))})]},b.id))]})]})}async function gr(r,o,a=pe){const{document:d}=await Ue(r,a,o);if(d?.analysis&&qe(d.analysis)!==a)throw new Nt("Architecture scope does not match its file");return d}async function yr(r,o){return ur(r,o)}function jr({view:r,parentId:o,selectedId:a,onSelect:d,active:p=!0,referenceWidth:n,inspector:x,inspectorStage:g="details",onDismissInspector:u,onExpandedChange:c,navigation:F,heading:M}){const{t:k,locale:C}=he(),[R,N]=s.useState(1),E=s.useId().replace(/[^a-zA-Z0-9]/g,""),z=s.useRef(null),$=s.useRef(null),l=s.useRef(null),b=s.useRef(null),h=s.useRef(null),[j,B]=s.useState(""),[f,H]=s.useState(!1),[P,U]=s.useState(1),Q=s.useRef(1),[T,ne]=s.useState(!1),fe=s.useRef(!0),V=s.useRef({inspector:x,onDismissInspector:u});V.current={inspector:x,onDismissInspector:u};const _=s.useRef(c);_.current=c;const ee=s.useRef({left:0,top:0}),[ie,oe]=s.useState(!1),[ae,xe]=s.useState({width:320,height:320,clipHeight:0}),v=s.useRef(new Map),O=s.useRef(!1),K=s.useRef(0),le=s.useMemo(()=>qt(r,o,R),[r,o,R]),Y=s.useMemo(()=>nt(r,o).edges,[r,o]),W=s.useMemo(()=>{const i=j.match(/viewBox="([^"]+)"/)?.[1].split(/\s+/).map(Number),S=i?.[2]||320,m=i?.[3]||240,A=T?window.innerWidth:n||ae.width,w=Math.max(1,Math.min(1.4,Math.max(160,A-24)/S));return{width:S,height:m,scale:w}},[j,ae.width,T,n]),ce={width:W.width*W.scale*P,height:W.height*W.scale*P},ue=(i,S,m)=>{const A=Math.max(.01,Math.min(4,i)),w=$.current;if(w){const J=w.getBoundingClientRect(),be=S===void 0?w.clientWidth/2:S-J.left,me=m===void 0?w.clientHeight/2:m-J.top,Z=A/Q.current,ve=(w.scrollLeft+be)*Z-be,ge=(w.scrollTop+me)*Z-me,Ie=()=>{$.current===w&&(w.scrollLeft=ve,w.scrollTop=ge)};window.requestAnimationFrame?window.requestAnimationFrame(Ie):window.setTimeout(Ie,0)}Q.current=A,U(A)},se=()=>{Q.current=1,U(1),$.current&&($.current.scrollLeft=0,$.current.scrollTop=0)};s.useEffect(()=>{let i=!1;return B(""),H(!1),se(),oe(!1),v.current.clear(),le.nodes.length>300?(H(!0),()=>{i=!0}):(tr().then(async S=>{rr(S);const m=await S.render(`td-architecture-${E}`,le.code);i||B(er.sanitize(m.svg,{USE_PROFILES:{svg:!0,svgFilters:!0}}))}).catch(()=>{i||H(!0)}),()=>{i=!0})},[le.code,E]),s.useEffect(()=>{p||ne(!1)},[p]),s.useEffect(()=>{_.current?.(T)},[T]),s.useEffect(()=>()=>_.current?.(!1),[]),s.useLayoutEffect(()=>{const i=$.current;if(i)return i.scrollLeft=ee.current.left,i.scrollTop=ee.current.top,()=>{ee.current={left:i.scrollLeft,top:i.scrollTop}}},[T,!!j]),s.useEffect(()=>{const i=$.current;if(!i)return;const S=i.closest("[data-architecture-content]"),m=()=>{xe({width:i.clientWidth||320,height:i.clientHeight||320,clipHeight:S?.clientHeight||0})};m();const A=new ResizeObserver(m);return A.observe(i),S&&A.observe(S),()=>A.disconnect()},[j,T]),We(l,T&&p,()=>{V.current.inspector?V.current.onDismissInspector?.():ne(!1)},()=>fe.current?h.current:null),s.useEffect(()=>{if(!T)return;const i=document.body.style.overflow;return document.body.style.overflow="hidden",()=>{document.body.style.overflow=i,v.current.clear()}},[T]),s.useLayoutEffect(()=>{const i=z.current?.querySelector("svg"),S=i?.querySelector("g");if(!(!i||!S||typeof S.getBBox!="function"))try{const m=S.getBBox();if(![m.x,m.y,m.width,m.height].every(Number.isFinite)||m.width<=0||m.height<=0)return;const A=`${m.x-16} ${m.y-16} ${m.width+32} ${m.height+32}`;if(i.getAttribute("viewBox")===A)return;i.setAttribute("viewBox",A),B(i.outerHTML)}catch{}},[j,T]),s.useLayoutEffect(()=>{z.current?.querySelectorAll("g.node, g.cluster").forEach(i=>{const S=Number(i.id.match(/(?:^|-)n(\d+)(?:-|$)/)?.[1]),m=le.nodes[S];if(!m)return;i.dataset.architectureRole=m.role,i.dataset.architectureNode=m.id,i.dataset.architectureRelated=String(!!a&&Y.some(w=>w.from===a&&w.to===m.id||w.to===a&&w.from===m.id));const A=i.matches("g.cluster")?i.querySelector("g.cluster-label")??i:i;A!==i&&(i.removeAttribute("role"),i.removeAttribute("tabindex")),A.dataset.architectureNode=m.id,A.setAttribute("role","button"),A.setAttribute("tabindex","0"),A.setAttribute("aria-label",m.title),A.setAttribute("aria-pressed",String(a===m.id)),i.setAttribute("aria-pressed",String(a===m.id))})}),s.useLayoutEffect(()=>{if(!a||g==="source"||g==="analysis")return;const i=$.current,S=[...z.current?.querySelectorAll("[data-architecture-node]")??[]].find(Z=>Z.dataset.architectureNode===a);if(!i||!S)return;let m=i.getBoundingClientRect();const A=i.closest("[data-architecture-content]");if(!T&&A&&m.width>24&&m.height>24){const Z=A.getBoundingClientRect();Z.height>160&&m.height<=Z.height&&(m.top<Z.top?A.scrollTop+=m.top-Z.top:m.bottom>Z.bottom&&(A.scrollTop+=m.bottom-Z.bottom),m=i.getBoundingClientRect());const ve=Math.max(m.top,Z.top),ge=Math.min(m.bottom,Z.bottom);m=new DOMRect(m.left,ve,m.width,Math.max(0,ge-ve))}const w=S.getBoundingClientRect();if(m.width<=24||m.height<=24||w.width<=0||w.height<=0)return;const J=12,be=w.width>m.width-2*J?(w.left+w.right-m.left-m.right)/2:w.left<m.left+J?w.left-m.left-J:w.right>m.right-J?w.right-m.right+J:0,me=w.height>m.height-2*J?(w.top+w.bottom-m.top-m.bottom)/2:w.top<m.top+J?w.top-m.top-J:w.bottom>m.bottom-J?w.bottom-m.bottom+J:0;i.scrollLeft+=be,i.scrollTop+=me},[a,ae.width,ae.height,ae.clipHeight,T,g,j]);const D=i=>{[...z.current?.querySelectorAll("[data-architecture-node]")??[]].find(S=>S.dataset.architectureNode===i)?.focus?.({preventScroll:!0}),d(i)},X="flex h-11 min-w-11 items-center justify-center rounded-lg px-2 hover:bg-surface-elevated focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-40",q=e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",className:X,"aria-label":k("architecture.zoomOut"),disabled:P<=.01,onClick:()=>ue(Q.current/1.25),children:e.jsx(Ut,{size:17})}),e.jsxs("button",{type:"button",className:`${X} text-xs tabular-nums`,"aria-label":k("architecture.resetZoom"),title:k("architecture.resetZoom"),onClick:se,children:[Math.round(W.scale*P*100),"%"]}),e.jsx("button",{type:"button",className:X,"aria-label":k("architecture.zoomIn"),disabled:P>=4,onClick:()=>ue(Q.current*1.25),children:e.jsx(yt,{size:17})}),e.jsx("button",{type:"button",className:X,"aria-label":k("architecture.fitGraph"),onClick:()=>ue(Math.min((ae.width-24)/W.width,(ae.height-24)/W.height)/W.scale),children:e.jsx(sr,{size:17})}),!T&&e.jsx("button",{ref:h,type:"button",className:X,"aria-label":k("architecture.fullscreen"),onClick:()=>{fe.current=!0,ne(!0)},children:e.jsx(cr,{size:17})}),e.jsx("button",{type:"button",className:X,"aria-label":k("architecture.download"),disabled:!j,onClick:()=>{oe(!1),Ge(new Blob([j],{type:"image/svg+xml"}),`architecture-${r.id}.svg`).catch(()=>oe(!0))},children:e.jsx(tt,{size:17})})]}),Ce=r.nodes.find(i=>i.id===o)?.title??r.title,Pe=e.jsxs(e.Fragment,{children:[T?e.jsxs("header",{className:"shrink-0 border-b border-border/15 px-2 py-1",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"min-w-0 flex-1 px-1",children:M??e.jsx("h2",{className:"truncate text-xs font-semibold",title:Ce,children:Ce})}),e.jsxs("label",{className:"flex shrink-0 items-center gap-1 text-xs text-muted-foreground",children:[C==="zh"?"展开":"Levels",e.jsx("select",{"aria-label":C==="zh"?"展开层级":"Expand levels",className:"h-11 max-w-20 rounded bg-surface px-1 text-foreground",value:R,onChange:i=>N(Number(i.target.value)),children:[0,1,2,6].map(i=>e.jsx("option",{value:i,children:i===0?C==="zh"?"当前层":"Current":i===6?C==="zh"?"全部":"All":`${i}`},i))})]}),e.jsx("button",{ref:b,type:"button",className:X,"aria-label":k("architecture.closeFullscreen"),onClick:()=>ne(!1),children:e.jsx(Se,{size:18})})]}),e.jsx("div",{className:"flex items-center justify-between gap-1",title:k("architecture.panHint"),children:q})]}):e.jsxs("div",{className:"shrink-0 border-b border-border/15 bg-surface-2 px-2 py-1",children:[e.jsx("div",{className:"flex items-center justify-between gap-1",children:q}),e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-1 px-1 text-xs text-muted-foreground",children:[e.jsx("span",{children:k("architecture.panHint")}),e.jsxs("label",{className:"flex items-center gap-2 text-xs text-muted-foreground",children:[C==="zh"?"展开层级":"Expand levels",e.jsx("select",{"aria-label":C==="zh"?"展开层级":"Expand levels",className:"min-h-8 rounded bg-surface-2 px-2 text-foreground",value:R,onChange:i=>N(Number(i.target.value)),children:[0,1,2,6].map(i=>e.jsx("option",{value:i,children:i===0?C==="zh"?"当前层":"Current level":i===6?C==="zh"?"全部":"All":`${i}`},i))})]})]})]}),T&&F&&e.jsx("div",{className:"shrink-0 px-2",children:F}),ie&&e.jsx("p",{role:"alert",className:"px-3 py-2 text-xs text-destructive",children:k("architecture.downloadFailed")}),e.jsxs("div",{className:T?"relative flex min-h-0 flex-1 flex-col overflow-hidden min-[768px]:flex-row":"relative",children:[f?e.jsx("p",{role:"alert",className:"p-4 text-sm text-muted-foreground",children:le.nodes.length>300?C==="zh"?"图中模块较多,请减少展开层级或选择单个视角。":"This graph has many modules. Expand fewer levels or select one perspective.":k("architecture.diagramFailed")}):j?e.jsx("div",{ref:$,"data-sidebar-gesture-ignore":!0,className:`termdock-architecture-viewport overflow-auto overscroll-contain p-3 ${T?"min-h-0 min-w-0 flex-1":"h-[min(50dvh,26rem)]"}`,style:{touchAction:"none",maxHeight:!T&&ae.clipHeight?Math.max(160,ae.clipHeight-150):void 0},onPointerDown:i=>{if(i.button!==0)return;v.current.size||(O.current=!1,K.current=0);const S=i.target.closest("[data-architecture-node]")?.getAttribute("data-architecture-node")??void 0;v.current.set(i.pointerId,{x:i.clientX,y:i.clientY,nodeId:S}),v.current.size>1&&(O.current=!0);try{i.currentTarget.setPointerCapture?.(i.pointerId)}catch{}},onPointerMove:i=>{const S=v.current.get(i.pointerId);if(!S)return;const m=[...v.current.values()];v.current.set(i.pointerId,{...S,x:i.clientX,y:i.clientY});const A=[...v.current.values()];if(A.length>=2){const w=me=>Math.hypot(me[0].x-me[1].x,me[0].y-me[1].y),J=w(m),be=w(A);J>0&&ue(Q.current*be/J,(A[0].x+A[1].x)/2,(A[0].y+A[1].y)/2),O.current=!0}else{const w=S.x-i.clientX,J=S.y-i.clientY;K.current+=Math.hypot(w,J),K.current>5&&(O.current=!0),i.currentTarget.scrollLeft+=w,i.currentTarget.scrollTop+=J}},onPointerUp:i=>{const S=v.current.get(i.pointerId),m=v.current.size===1&&!O.current&&S?.nodeId;v.current.delete(i.pointerId),m&&(O.current=!0,D(m))},onPointerCancel:i=>{v.current.delete(i.pointerId),O.current=!0},onLostPointerCapture:i=>{v.current.delete(i.pointerId)},children:e.jsx("div",{ref:z,role:"group","aria-label":k("architecture.modules"),className:"termdock-architecture-diagram mx-auto",style:ce,onClick:i=>{if(O.current)return;const m=i.target.closest("[data-architecture-node]")?.getAttribute("data-architecture-node");m&&D(m)},onKeyDown:i=>{if(i.key!=="Enter"&&i.key!==" ")return;const S=i.target.closest("[data-architecture-node]")?.getAttribute("data-architecture-node");S&&(i.preventDefault(),D(S))},dangerouslySetInnerHTML:{__html:j}})}):e.jsx("p",{role:"status",className:"p-4 text-sm text-muted-foreground",children:k("architecture.rendering")}),T&&x]})]});return T?vt.createPortal(e.jsx("section",{ref:l,tabIndex:-1,role:"dialog","aria-modal":"true","aria-label":k("architecture.diagram"),"data-sidebar-gesture-ignore":!0,className:"fixed inset-0 z-modal-panel flex flex-col overflow-hidden bg-surface text-foreground pt-[env(safe-area-inset-top)] pb-[env(safe-area-inset-bottom)]",children:Pe}),document.body):e.jsx("section",{className:"overflow-clip rounded-xl border border-border/20 bg-surface-2","aria-label":k("architecture.diagram"),children:Pe})}function je(r,o){let a=r.trim().replace(/^@/,"");/^([`"']).*\1$/.test(a)&&(a=a.slice(1,-1)),a=a.replace(/\\ /g," ").replace(/:\d+(?:-\d+)?$/,"").replace(/\/+$/,""),/^([`"']).*\1$/.test(a)&&(a=a.slice(1,-1));const d=o.replace(/\/+$/,"");if(a.startsWith("/")){if(!a.startsWith(`${d}/`))return null;a=a.slice(d.length+1)}return a=a.replace(/^\.\//,""),a.length<=1024&&Wt(a)?a:null}function ht(r,o){const a=[...r.matchAll(/^# (.+?): hunk \d+,/gm)].map(x=>x[1]),p=(a.length?a:r.split(/\r?\n/).map(x=>x.trim()).filter(Boolean)).map(x=>je(x,o));if(p.some(x=>x===null))return null;const n=[...new Set(p)];return n.length<=20?n:null}function $t({rootPath:r,initialDirectory:o,selected:a,onChange:d,selectionDisabled:p=!1,compact:n=!1}){const{t:x}=he(),g=r.replace(/\/+$/,"")||"/",[u,c]=s.useState(()=>o&&je(o,g)?o.replace(/\/+$/,""):g),[F,M]=s.useState(""),[k,C]=s.useState(null),[R,N]=s.useState(0),[E,z]=s.useState(null);s.useEffect(()=>{if(!E)return;const f=window.setTimeout(()=>z(null),1800);return()=>window.clearTimeout(f)},[E]);const $=et(f=>f.invalidateDirectoryCache),l=new Set(a.map(f=>`${g==="/"?"":g}/${f}`)),b=f=>{const H=je(f,g);p||!H||a.includes(H)||a.length>=20||d([...a,H])},h=f=>{f!==g&&!je(f,g)||(c(f),M(""),C(null))},j=`inline-flex shrink-0 items-center justify-center rounded-lg text-xs hover:bg-surface-elevated focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-40 ${n?"h-8 w-8 [@media(pointer:coarse)]:h-11 [@media(pointer:coarse)]:w-11":"h-11 w-11"}`,B=je(u,g);return e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"shrink-0 px-2 py-1",children:e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("button",{type:"button",className:j,disabled:u===g,"aria-label":x("rightSidebar.parentFolder"),onClick:()=>h(u.slice(0,u.lastIndexOf("/"))||g),children:e.jsx(Jt,{size:17})}),e.jsx("button",{type:"button",className:j,disabled:u===g,"aria-label":x("rightSidebar.backToProjectRoot"),onClick:()=>h(g),children:e.jsx(Vt,{size:16})}),e.jsx("span",{className:"min-w-0 flex-1 truncate text-xs font-medium",title:u,children:B??(u.split("/").pop()||"/")}),B&&e.jsx("button",{type:"button",className:`${j} text-primary`,disabled:p||!a.includes(B)&&a.length>=20,"aria-label":`${x("architecture.addScopeReference")}: ${u.split("/").pop()}`,title:B,"aria-pressed":a.includes(B),onClick:()=>b(u),children:a.includes(B)?e.jsx(Tt,{size:15}):e.jsx(nr,{size:15})}),e.jsx("button",{type:"button",className:j,"aria-label":x("rightSidebar.refreshFiles"),onClick:()=>{$(u,!0),N(f=>f+1)},children:e.jsx(kt,{size:15})})]})}),p&&e.jsx("p",{role:"alert",className:"shrink-0 px-3 pb-2 text-xs text-muted-foreground",children:x("architecture.correctPathsFirst")}),e.jsx("div",{className:"shrink-0 border-b border-border/15 px-3 pb-2",children:e.jsx("input",{"aria-label":x("architecture.searchScopePaths"),placeholder:x("architecture.searchScopePaths"),value:F,onChange:f=>M(f.target.value),className:`${n?"h-9 [@media(pointer:coarse)]:h-11":"h-11"} w-full rounded-lg border border-border/20 bg-surface-2 px-3 text-sm focus-visible:ring-2 focus-visible:ring-ring`})}),e.jsx("div",{className:"min-h-0 flex-1 overflow-auto overscroll-contain bg-surface",children:e.jsx(Kt,{rootPath:u,selectedFilePath:k,onFileSelect:f=>{C(f),b(f)},onDirectoryRoot:h,onPathReference:b,getReferenceText:f=>je(f,g)??f,query:F,onReferenceCopied:z,copiedReferenceKey:E,onSearchFromDirectory:h,referenceSelection:{paths:l,label:x("architecture.addScopeReference"),disabled:p||a.length>=20}},`${u}:${R}`)})]})}function vr({rootPath:r,initialDirectory:o,initial:a,onConfirm:d,onCancel:p}){const{t:n}=he(),x=s.useRef(null);We(x,!0,p);const g=s.useId(),[u,c]=s.useState(a);s.useEffect(()=>{const M=document.body.style.overflow;return document.body.style.overflow="hidden",()=>{document.body.style.overflow=M}},[]);const F="inline-flex min-h-11 items-center justify-center gap-1.5 rounded-lg px-3 text-xs hover:bg-surface-elevated focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-40";return vt.createPortal(e.jsxs("div",{className:"fixed inset-0 z-popover flex items-center justify-center p-[max(0.75rem,env(safe-area-inset-top))]",children:[e.jsx("button",{type:"button",className:"absolute inset-0 z-10 cursor-default bg-[var(--app-backdrop)]","aria-label":n("common.cancel"),onClick:p}),e.jsxs("section",{ref:x,id:`${g}-dialog`,tabIndex:-1,role:"dialog","aria-modal":"true","aria-labelledby":g,"aria-describedby":`${g}-hint`,className:"relative z-20 flex h-full max-h-[42rem] w-full max-w-xl flex-col overflow-hidden rounded-xl border border-border/20 bg-surface text-foreground shadow-xl",children:[e.jsxs("header",{className:"shrink-0 px-3 py-1",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("h2",{id:g,className:"min-w-0 flex-1 text-sm font-semibold",title:n("architecture.browsePathsHint"),children:n("architecture.choosePaths")}),e.jsx("button",{type:"button",className:F,"aria-label":n("common.close"),onClick:p,children:e.jsx(Se,{size:17})})]}),e.jsx("p",{id:`${g}-hint`,className:"sr-only",children:n("architecture.browsePathsHint")})]}),e.jsx($t,{rootPath:r,initialDirectory:o,selected:u,onChange:c}),e.jsxs("footer",{className:"shrink-0 space-y-2 border-t border-border/15 p-3",children:[e.jsxs("p",{className:"text-xs text-muted-foreground",children:[n("architecture.selectedPaths")," ",u.length," / 20"]}),u.length>0&&e.jsx("div",{className:"flex max-h-24 flex-wrap gap-1 overflow-y-auto",children:u.map(M=>e.jsxs("button",{type:"button",className:`${F} min-w-0 max-w-full bg-surface-2`,"aria-label":`${n("architecture.removePath")}: ${M}`,onClick:()=>c(k=>k.filter(C=>C!==M)),children:[e.jsx("span",{className:"truncate font-mono",children:M}),e.jsx(Se,{size:13,className:"shrink-0"})]},M))}),e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsx("button",{type:"button",className:F,onClick:p,children:n("common.cancel")}),e.jsx("button",{type:"button",className:`${F} bg-primary/15 text-primary`,onClick:()=>d(u),children:n("architecture.usePaths")})]})]})]})]}),document.body)}function xt({rootPath:r,initial:o,outputFile:a,currentFile:d,currentDirectory:p,active:n=!0,onInsertPrompt:x,onPrepared:g,onClose:u}){const{t:c,locale:F}=he(),M=s.useRef(null),k=s.useRef(null);We(k,n,u),s.useLayoutEffect(()=>{n&&k.current?.scrollIntoView?.({block:"start"})},[n]);const[C,R]=s.useState(!1);s.useLayoutEffect(()=>{const D=k.current;if(!n||!D)return;const X=()=>R(D.clientWidth>=900);if(X(),typeof ResizeObserver>"u")return;const q=new ResizeObserver(X);return q.observe(D),()=>q.disconnect()},[n]);const N=s.useId(),[E,z]=s.useState(o.kind),[$,l]=s.useState(o.target),[b,h]=s.useState(o.paths.join(`
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/RightSidebar-scaBEaFJ.js","assets/app-aNkllBsm.js","assets/react-XDCjal2T.js","assets/dnd-BCFAPC0L.js","assets/terminal-C7X98Amf.js","assets/index-e1PkqIqN.css","assets/App-JL8Fd8uO.js","assets/gestureArbiter-4NWfZprH.js","assets/gestureArbiter-C2J0D0kV.css","assets/triangle-alert-rgLWcpfP.js","assets/referenceLongPress-Bln9X6SW.js","assets/DiffReview-BPHfC8nZ.js","assets/sparkles-kooHQYLJ.js","assets/DiffViewer-C4S3oEQV.js","assets/DiffViewer-T3uj2-aP.css","assets/ChangeWalkthroughPanel-BF3p_M6Y.js","assets/RightSidebar-DW-JEgm2.css"])))=>i.map(i=>d[i]);
2
+ import{ah as gt,aO as At,df as he,bA as e,_ as Dt,cv as Ge,cw as Mt,dg as We,n as yt,X as Se,dl as et,C as Tt,g as Ft,e as Fe,c as Lt,a as Pt,d as jt,dr as It}from"./app-aNkllBsm.js";import{b as s,r as vt}from"./dnd-BCFAPC0L.js";import{ad as Je,ai as Le,a as wt,a4 as Ot,H as Ht,n as tt,Z as Bt,a5 as _t,a0 as qe,b as pe,e as Nt,a1 as qt,a3 as nt,u as Ut,ae as Wt,i as Jt,r as Vt,R as kt,o as Kt,af as Xt,a6 as Zt,p as Yt,D as Ee,N as mt,a2 as Qt}from"./App-JL8Fd8uO.js";import{L as Gt}from"./DiffViewer-C4S3oEQV.js";import er from"./purify.es-4eNOHKSq.js";import{l as tr,i as rr,S as sr}from"./RightSidebar-scaBEaFJ.js";import{L as nr}from"./triangle-alert-rgLWcpfP.js";import{S as St}from"./sparkles-kooHQYLJ.js";import"./react-XDCjal2T.js";import"./terminal-C7X98Amf.js";import"./gestureArbiter-4NWfZprH.js";import"./referenceLongPress-Bln9X6SW.js";import"./DiffReview-BPHfC8nZ.js";import"./ChangeWalkthroughPanel-BF3p_M6Y.js";const ir=[["path",{d:"M17 7 7 17",key:"15tmo1"}],["path",{d:"M17 17H7V7",key:"1org7z"}]],ar=gt("arrow-down-left",ir);const lr=[["path",{d:"m15 15 6 6",key:"1s409w"}],["path",{d:"m15 9 6-6",key:"ko1vev"}],["path",{d:"M21 16v5h-5",key:"1ck2sf"}],["path",{d:"M21 8V3h-5",key:"1qoq8a"}],["path",{d:"M3 16v5h5",key:"1t08am"}],["path",{d:"m3 21 6-6",key:"wwnumi"}],["path",{d:"M3 8V3h5",key:"1ln10m"}],["path",{d:"M9 9 3 3",key:"v551iv"}]],cr=gt("expand",lr);function or(r,o){const a=new Map,d={id:"all-perspectives",title:o,summary:r.summary,nodes:[],edges:[]};return r.perspectives.forEach((p,n)=>{const x=`perspective${n}`,g=new Map(p.nodes.map((u,c)=>[u.id,`${x}_node${c}`]));a.set(x,{perspective:p.id}),d.nodes.push({id:x,title:p.title,summary:p.summary,files:[],description:p.description});for(const u of p.nodes){const c=g.get(u.id);a.set(c,{perspective:p.id,node:u.id}),d.nodes.push({...u,id:c,parentId:u.parentId?g.get(u.parentId):x})}d.edges.push(...p.edges.map(u=>({...u,from:g.get(u.from),to:g.get(u.to)})))}),{view:d,references:a}}async function $e(r,o,a,d){const p=new URLSearchParams({root:r}),n=await fetch(`/api/terminal/architecture/${o}${d?"":`${o.includes("?")?"&":"?"}${p}`}`,{signal:a,cache:"no-store",...d?{method:"PUT",headers:{"Content-Type":"application/json","X-XSRF-TOKEN":await At()},body:JSON.stringify({root:r,...d})}:{}}),x=await n.json();if(!n.ok)throw new Error(x.error||`HTTP ${n.status}`);return x}async function ur(r,o){const a=await $e(r,"documents",o);if(!Array.isArray(a.files))throw new Error("Invalid architecture library");return[...new Set(a.files.filter(d=>typeof d=="string"&&Je(d)))].sort()}async function Ue(r,o,a){if(!Je(o))throw new Error("Invalid architecture file");const d=await $e(r,`document?${new URLSearchParams({file:o})}`,a);if(!("document"in d)||d.revision!==null&&typeof d.revision!="string")throw new Error("Invalid architecture response");return{document:d.document?Le(JSON.stringify(d.document)):null,revision:typeof d.revision=="string"?d.revision:null}}async function dr(r,o,a,d,p,n,x){const g=await $e(r,"field",void 0,{file:o,perspective:a,node:d,field:p,value:n,revision:x});return Le(JSON.stringify(g.document))}async function mr(r,o,a){const d=await $e(r,`history?${new URLSearchParams({file:o})}`,a);if(!Array.isArray(d.versions))throw new Error("Invalid architecture history");return d.versions}async function hr(r,o){return $e(r,`bundle?${new URLSearchParams({file:o})}`)}async function xr(r,o,a){const d=await $e(r,"bundle",void 0,{bundle:o,revision:a});return Le(JSON.stringify(d.document))}async function pr(r,o,a,d){const p=await $e(r,"document",void 0,{file:o,document:a,...d!==void 0?{revision:d}:{}});return Le(JSON.stringify(p.document))}const fr=s.lazy(()=>Dt(()=>import("./RightSidebar-scaBEaFJ.js").then(r=>r.R),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16])).then(r=>({default:r.MarkdownPreview})));function rt(r,o){return o?{description:"说明",diagram:"关系图源码",context:"上下文",constraint:"约束",concern:"问题与风险",todo:"待办",note:"备注"}[r]:{description:"Description",diagram:"Diagram source",context:"Context",constraint:"Constraints",concern:"Concerns",todo:"To do",note:"Notes"}[r]}function st({value:r,rootPath:o,onEdit:a,onOpenFile:d}){const{locale:p}=he(),n=p==="zh",x=r.description?.replace(/^#\s+([^\n]+)\n\s*/,(u,c)=>c.trim()===r.title?"":u),g=u=>e.jsx(s.Suspense,{fallback:e.jsx("p",{className:"whitespace-pre-wrap text-sm",children:u}),children:e.jsx(fr,{referenceLines:!1,content:u,filePath:null,rootPath:o??null,lineRange:null,onLineRangeClick:()=>{},scrollTop:0,outlineOpen:!1,lightboxOpen:!1,onLocalLinkOpen:c=>d?.({path:o&&c.path.startsWith(`${o}/`)?c.path.slice(o.length+1):c.path})})});return e.jsxs("div",{className:"space-y-2",children:[x&&e.jsx("div",{className:"min-w-0 overflow-x-auto",children:g(x)}),wt.filter(u=>u!=="description"&&r[u]).map(u=>e.jsxs("details",{className:"rounded-lg border border-border/15 px-2",children:[e.jsx("summary",{className:"min-h-11 cursor-pointer py-3 text-xs font-medium",children:rt(u,n)}),e.jsxs("div",{className:"min-w-0 overflow-x-auto pb-2",children:[u==="diagram"?e.jsx("pre",{className:"whitespace-pre-wrap break-all text-xs",children:r[u]}):g(r[u]),a&&e.jsx("button",{type:"button",className:"min-h-11 rounded px-2 text-xs text-primary hover:bg-surface-elevated",onClick:()=>a(u),children:n?"编辑此字段":"Edit field"})]})]},u)),a&&e.jsx("button",{type:"button",className:"min-h-11 rounded-lg px-3 text-xs text-primary hover:bg-surface-elevated",onClick:()=>a("description"),children:n?"编辑文档":"Edit document"}),r.meta&&e.jsxs("details",{children:[e.jsx("summary",{className:"min-h-11 cursor-pointer py-3 text-xs text-muted-foreground",children:n?"版本信息":"Version information"}),e.jsx("dl",{className:"grid grid-cols-[auto_1fr] gap-x-3 gap-y-1 break-all pb-3 text-xs text-muted-foreground",children:Object.entries(r.meta).filter(([u])=>u!=="previousDiagram").map(([u,c])=>e.jsxs("div",{className:"contents",children:[e.jsx("dt",{children:{created:n?"创建":"Created",updated:n?"更新":"Updated",updateCount:n?"更新次数":"Updates",gitCommit:"Commit",gitBranch:n?"分支":"Branch"}[u]??u}),e.jsx("dd",{children:String(c)})]},u))})]})]})}function Qe({root:r,file:o,perspective:a,node:d,initialField:p,onSaved:n,onCancel:x}){const{locale:g}=he(),u=g==="zh",[c,F]=s.useState(null),[M,k]=s.useState(p),[C,R]=s.useState(""),[N,E]=s.useState(""),[z,$]=s.useState(""),[l,b]=s.useState(!1),h=s.useRef(!0),j=s.useRef(0);s.useEffect(()=>{h.current=!0;const f=++j.current;F(null),$("");const H=new AbortController;return Ue(r,o,H.signal).then(P=>{!H.signal.aborted&&f===j.current&&F(P)}).catch(P=>{!H.signal.aborted&&f===j.current&&$(String(P.message))}),()=>{h.current=!1,++j.current,H.abort()}},[r,o]),s.useEffect(()=>{const f=c?.document?.perspectives.find(U=>U.id===a),H=d?f?.nodes.find(U=>U.id===d):f;if(!H||!f)return;const P=H[M]??(M==="description"?H.summary:M==="diagram"?Ot(f,d):"");R(P),E(P)},[c,a,d,M]);const B=C!==N;return e.jsxs("form",{className:"flex min-h-0 flex-1 flex-col gap-3",onSubmit:f=>{if(f.preventDefault(),!c||l||!B)return;const H=j.current;b(!0),$(""),dr(r,o,a,d,M,C,c.revision).then(P=>{h.current&&H===j.current&&n(P)}).catch(P=>{h.current&&H===j.current&&$(P.message)}).finally(()=>{h.current&&H===j.current&&b(!1)})},children:[e.jsxs("label",{className:"flex items-center gap-2 text-xs",children:[u?"字段":"Field",e.jsx("select",{"aria-label":u?"文档字段":"Document field",className:"min-h-11 min-w-0 flex-1 rounded bg-surface-2 px-2",value:M,disabled:l||B,onChange:f=>k(f.target.value),children:wt.map(f=>e.jsx("option",{value:f,children:rt(f,u)},f))})]}),B&&e.jsx("p",{className:"text-xs text-muted-foreground",children:u?"保存当前字段后可切换字段。":"Save this field before switching fields."}),!c&&!z&&e.jsx("p",{role:"status",className:"text-xs",children:u?"读取最新文档…":"Loading the latest document…"}),e.jsx("textarea",{"aria-label":rt(M,u),spellCheck:!1,className:"min-h-56 w-full flex-1 resize-y rounded-lg border border-border/30 bg-surface-2 p-3 font-mono text-sm focus-visible:ring-2 focus-visible:ring-ring",disabled:!c||l,maxLength:1e5,value:C,onChange:f=>R(f.target.value)}),z&&e.jsx("p",{role:"alert",className:"break-words text-xs text-destructive",children:z}),e.jsxs("div",{className:"sticky bottom-0 flex gap-2 bg-surface py-2",children:[e.jsx("button",{type:"submit",className:"min-h-11 rounded-lg bg-primary/15 px-4 text-sm text-primary disabled:opacity-40",disabled:!c||l||!B,children:l?u?"保存中…":"Saving…":u?"保存":"Save"}),e.jsx("button",{type:"button",className:"min-h-11 rounded-lg px-4 text-sm hover:bg-surface-elevated",disabled:l,onClick:x,children:u?"取消":"Cancel"})]})]})}function br({root:r,file:o,document:a,onLoaded:d}){const{locale:p}=he(),n=p==="zh",[x,g]=s.useState(""),[u,c]=s.useState(""),[F,M]=s.useState(!1),[k,C]=s.useState(null),[R,N]=s.useState(null),E=s.useRef(null),z=s.useRef(0);s.useEffect(()=>(z.current++,N(null),C(null),g(""),c(""),M(!1),()=>{z.current++}),[r,o]);async function $(b){const h=++z.current;M(!0),g(""),c("");try{await b(()=>h===z.current)}catch(j){h===z.current&&g(j instanceof Error?j.message:String(j))}finally{h===z.current&&M(!1)}}const l="inline-flex min-h-11 items-center gap-1.5 rounded-lg px-3 text-xs hover:bg-surface-elevated disabled:opacity-40";return e.jsxs("details",{className:"rounded-lg border border-border/15 px-3",children:[e.jsx("summary",{className:"min-h-11 cursor-pointer py-3 text-xs text-muted-foreground",children:n?"历史、导入与分享":"History, import and sharing"}),e.jsxs("div",{className:"flex flex-wrap gap-1",children:[e.jsxs("button",{className:l,type:"button",disabled:F||!a,onClick:()=>{$(async b=>{const h=await mr(r,o);b()&&C(h)})},children:[e.jsx(Ht,{size:14}),n?"更新差异":"Changes"]}),e.jsxs("button",{className:l,type:"button",disabled:F||!a,onClick:()=>{$(async()=>{await Ge(new Blob([JSON.stringify(a,null,2)],{type:"application/json"}),"termdock-architecture.json")})},children:[e.jsx(tt,{size:14}),"JSON"]}),e.jsxs("button",{className:l,type:"button",disabled:F||!a,onClick:()=>{$(async()=>{const b=await hr(r,o);await Ge(new Blob([JSON.stringify(b,null,2)],{type:"application/json"}),"architecture.omm.json")})},children:[e.jsx(tt,{size:14}),".omm"]}),e.jsxs("button",{className:l,type:"button",disabled:F,onClick:()=>E.current?.click(),children:[e.jsx(Bt,{size:14}),n?"导入":"Import"]}),e.jsxs("button",{className:l,type:"button",disabled:F||!a,onClick:()=>{$(async()=>{const b=Mt(),h=_t(window.location.origin,{root:r,file:o,...b?{peerId:b.targetPeerId,serviceName:b.serviceName}:{}});await navigator.clipboard.writeText(h),c(n?"链接已复制,打开时需要登录此 Termdock 服务。":"Link copied. Sign in to this Termdock service to view it.")})},children:[e.jsx(Gt,{size:14}),n?"复制查看链接":"Copy viewer link"]})]}),e.jsx("input",{ref:E,hidden:!0,type:"file",accept:".json,application/json",onChange:b=>{const h=b.target.files?.[0];b.target.value="",h&&$(async j=>{if(h.size>5e6)throw new Error(n?"文档超过 5 MB。":"Document exceeds 5 MB.");const B=await h.text();if(!j())return;const f=JSON.parse(B);if(f?.format==="termdock-omm-bundle"){const Q=await Ue(r,".omm");if(!j())return;N({name:h.name,value:f,file:".omm",revision:Q.revision});return}const H=Le(B),P=H.analysis?qe(H.analysis):pe,U=await Ue(r,P);j()&&N({name:h.name,value:H,file:P,revision:U.revision})})}}),R&&e.jsxs("div",{className:"my-2 rounded-lg bg-surface-2 p-3 text-xs",children:[e.jsxs("p",{className:"break-all",children:[R.name," → ",R.file]}),e.jsx("p",{className:"mt-1 text-muted-foreground",children:R.file===".omm"?n?"合并文档中的目录和字段;同名字段将更新。":"Merge bundled directories and fields; matching fields are updated.":n?"保存为此范围的架构,并保留此前的版本。":"Save this scope and retain its previous version."}),e.jsxs("div",{className:"mt-2 flex gap-2",children:[e.jsx("button",{className:`${l} text-primary`,disabled:F,type:"button",onClick:()=>{$(async b=>{const h=R.file===".omm"?await xr(r,R.value,R.revision):await pr(r,R.file,R.value,R.revision);b()&&(N(null),d(R.file,h))})},children:n?"确认导入":"Import document"}),e.jsx("button",{className:l,disabled:F,type:"button",onClick:()=>N(null),children:n?"取消":"Cancel"})]})]}),F&&e.jsx("p",{role:"status",className:"py-2 text-xs",children:n?"处理中…":"Working…"}),x&&e.jsx("p",{role:"alert",className:"break-words py-2 text-xs text-destructive",children:x}),u&&e.jsx("p",{role:"status",className:"py-2 text-xs text-muted-foreground",children:u}),k&&e.jsxs("div",{className:"space-y-2 pb-3",children:[k.length===0&&e.jsx("p",{className:"text-xs text-muted-foreground",children:n?"还没有历史版本。使用原生命令或文档编辑保存后会保留版本。":"No previous versions. Native saves and document edits retain history."}),k.map(b=>e.jsxs("details",{children:[e.jsxs("summary",{className:"min-h-11 cursor-pointer py-3 text-xs",children:[new Date(b.savedAt).toLocaleString()," · ",b.changes.length," ",n?"处差异":"changes"]}),e.jsx("ul",{className:"space-y-1 text-xs text-muted-foreground",children:b.changes.map((h,j)=>e.jsxs("li",{className:"break-words",children:[h.kind==="added"?"+":h.kind==="removed"?"−":"~"," ",h.perspective?h.title:n?"项目总览":h.title," · ",h.fields.join(", ")]},j))})]},b.id))]})]})}async function gr(r,o,a=pe){const{document:d}=await Ue(r,a,o);if(d?.analysis&&qe(d.analysis)!==a)throw new Nt("Architecture scope does not match its file");return d}async function yr(r,o){return ur(r,o)}function jr({view:r,parentId:o,selectedId:a,onSelect:d,active:p=!0,referenceWidth:n,inspector:x,inspectorStage:g="details",onDismissInspector:u,onExpandedChange:c,navigation:F,heading:M}){const{t:k,locale:C}=he(),[R,N]=s.useState(1),E=s.useId().replace(/[^a-zA-Z0-9]/g,""),z=s.useRef(null),$=s.useRef(null),l=s.useRef(null),b=s.useRef(null),h=s.useRef(null),[j,B]=s.useState(""),[f,H]=s.useState(!1),[P,U]=s.useState(1),Q=s.useRef(1),[T,ne]=s.useState(!1),fe=s.useRef(!0),V=s.useRef({inspector:x,onDismissInspector:u});V.current={inspector:x,onDismissInspector:u};const _=s.useRef(c);_.current=c;const ee=s.useRef({left:0,top:0}),[ie,oe]=s.useState(!1),[ae,xe]=s.useState({width:320,height:320,clipHeight:0}),v=s.useRef(new Map),O=s.useRef(!1),K=s.useRef(0),le=s.useMemo(()=>qt(r,o,R),[r,o,R]),Y=s.useMemo(()=>nt(r,o).edges,[r,o]),W=s.useMemo(()=>{const i=j.match(/viewBox="([^"]+)"/)?.[1].split(/\s+/).map(Number),S=i?.[2]||320,m=i?.[3]||240,A=T?window.innerWidth:n||ae.width,w=Math.max(1,Math.min(1.4,Math.max(160,A-24)/S));return{width:S,height:m,scale:w}},[j,ae.width,T,n]),ce={width:W.width*W.scale*P,height:W.height*W.scale*P},ue=(i,S,m)=>{const A=Math.max(.01,Math.min(4,i)),w=$.current;if(w){const J=w.getBoundingClientRect(),be=S===void 0?w.clientWidth/2:S-J.left,me=m===void 0?w.clientHeight/2:m-J.top,Z=A/Q.current,ve=(w.scrollLeft+be)*Z-be,ge=(w.scrollTop+me)*Z-me,Ie=()=>{$.current===w&&(w.scrollLeft=ve,w.scrollTop=ge)};window.requestAnimationFrame?window.requestAnimationFrame(Ie):window.setTimeout(Ie,0)}Q.current=A,U(A)},se=()=>{Q.current=1,U(1),$.current&&($.current.scrollLeft=0,$.current.scrollTop=0)};s.useEffect(()=>{let i=!1;return B(""),H(!1),se(),oe(!1),v.current.clear(),le.nodes.length>300?(H(!0),()=>{i=!0}):(tr().then(async S=>{rr(S);const m=await S.render(`td-architecture-${E}`,le.code);i||B(er.sanitize(m.svg,{USE_PROFILES:{svg:!0,svgFilters:!0}}))}).catch(()=>{i||H(!0)}),()=>{i=!0})},[le.code,E]),s.useEffect(()=>{p||ne(!1)},[p]),s.useEffect(()=>{_.current?.(T)},[T]),s.useEffect(()=>()=>_.current?.(!1),[]),s.useLayoutEffect(()=>{const i=$.current;if(i)return i.scrollLeft=ee.current.left,i.scrollTop=ee.current.top,()=>{ee.current={left:i.scrollLeft,top:i.scrollTop}}},[T,!!j]),s.useEffect(()=>{const i=$.current;if(!i)return;const S=i.closest("[data-architecture-content]"),m=()=>{xe({width:i.clientWidth||320,height:i.clientHeight||320,clipHeight:S?.clientHeight||0})};m();const A=new ResizeObserver(m);return A.observe(i),S&&A.observe(S),()=>A.disconnect()},[j,T]),We(l,T&&p,()=>{V.current.inspector?V.current.onDismissInspector?.():ne(!1)},()=>fe.current?h.current:null),s.useEffect(()=>{if(!T)return;const i=document.body.style.overflow;return document.body.style.overflow="hidden",()=>{document.body.style.overflow=i,v.current.clear()}},[T]),s.useLayoutEffect(()=>{const i=z.current?.querySelector("svg"),S=i?.querySelector("g");if(!(!i||!S||typeof S.getBBox!="function"))try{const m=S.getBBox();if(![m.x,m.y,m.width,m.height].every(Number.isFinite)||m.width<=0||m.height<=0)return;const A=`${m.x-16} ${m.y-16} ${m.width+32} ${m.height+32}`;if(i.getAttribute("viewBox")===A)return;i.setAttribute("viewBox",A),B(i.outerHTML)}catch{}},[j,T]),s.useLayoutEffect(()=>{z.current?.querySelectorAll("g.node, g.cluster").forEach(i=>{const S=Number(i.id.match(/(?:^|-)n(\d+)(?:-|$)/)?.[1]),m=le.nodes[S];if(!m)return;i.dataset.architectureRole=m.role,i.dataset.architectureNode=m.id,i.dataset.architectureRelated=String(!!a&&Y.some(w=>w.from===a&&w.to===m.id||w.to===a&&w.from===m.id));const A=i.matches("g.cluster")?i.querySelector("g.cluster-label")??i:i;A!==i&&(i.removeAttribute("role"),i.removeAttribute("tabindex")),A.dataset.architectureNode=m.id,A.setAttribute("role","button"),A.setAttribute("tabindex","0"),A.setAttribute("aria-label",m.title),A.setAttribute("aria-pressed",String(a===m.id)),i.setAttribute("aria-pressed",String(a===m.id))})}),s.useLayoutEffect(()=>{if(!a||g==="source"||g==="analysis")return;const i=$.current,S=[...z.current?.querySelectorAll("[data-architecture-node]")??[]].find(Z=>Z.dataset.architectureNode===a);if(!i||!S)return;let m=i.getBoundingClientRect();const A=i.closest("[data-architecture-content]");if(!T&&A&&m.width>24&&m.height>24){const Z=A.getBoundingClientRect();Z.height>160&&m.height<=Z.height&&(m.top<Z.top?A.scrollTop+=m.top-Z.top:m.bottom>Z.bottom&&(A.scrollTop+=m.bottom-Z.bottom),m=i.getBoundingClientRect());const ve=Math.max(m.top,Z.top),ge=Math.min(m.bottom,Z.bottom);m=new DOMRect(m.left,ve,m.width,Math.max(0,ge-ve))}const w=S.getBoundingClientRect();if(m.width<=24||m.height<=24||w.width<=0||w.height<=0)return;const J=12,be=w.width>m.width-2*J?(w.left+w.right-m.left-m.right)/2:w.left<m.left+J?w.left-m.left-J:w.right>m.right-J?w.right-m.right+J:0,me=w.height>m.height-2*J?(w.top+w.bottom-m.top-m.bottom)/2:w.top<m.top+J?w.top-m.top-J:w.bottom>m.bottom-J?w.bottom-m.bottom+J:0;i.scrollLeft+=be,i.scrollTop+=me},[a,ae.width,ae.height,ae.clipHeight,T,g,j]);const D=i=>{[...z.current?.querySelectorAll("[data-architecture-node]")??[]].find(S=>S.dataset.architectureNode===i)?.focus?.({preventScroll:!0}),d(i)},X="flex h-11 min-w-11 items-center justify-center rounded-lg px-2 hover:bg-surface-elevated focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-40",q=e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",className:X,"aria-label":k("architecture.zoomOut"),disabled:P<=.01,onClick:()=>ue(Q.current/1.25),children:e.jsx(Ut,{size:17})}),e.jsxs("button",{type:"button",className:`${X} text-xs tabular-nums`,"aria-label":k("architecture.resetZoom"),title:k("architecture.resetZoom"),onClick:se,children:[Math.round(W.scale*P*100),"%"]}),e.jsx("button",{type:"button",className:X,"aria-label":k("architecture.zoomIn"),disabled:P>=4,onClick:()=>ue(Q.current*1.25),children:e.jsx(yt,{size:17})}),e.jsx("button",{type:"button",className:X,"aria-label":k("architecture.fitGraph"),onClick:()=>ue(Math.min((ae.width-24)/W.width,(ae.height-24)/W.height)/W.scale),children:e.jsx(sr,{size:17})}),!T&&e.jsx("button",{ref:h,type:"button",className:X,"aria-label":k("architecture.fullscreen"),onClick:()=>{fe.current=!0,ne(!0)},children:e.jsx(cr,{size:17})}),e.jsx("button",{type:"button",className:X,"aria-label":k("architecture.download"),disabled:!j,onClick:()=>{oe(!1),Ge(new Blob([j],{type:"image/svg+xml"}),`architecture-${r.id}.svg`).catch(()=>oe(!0))},children:e.jsx(tt,{size:17})})]}),Ce=r.nodes.find(i=>i.id===o)?.title??r.title,Pe=e.jsxs(e.Fragment,{children:[T?e.jsxs("header",{className:"shrink-0 border-b border-border/15 px-2 py-1",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"min-w-0 flex-1 px-1",children:M??e.jsx("h2",{className:"truncate text-xs font-semibold",title:Ce,children:Ce})}),e.jsxs("label",{className:"flex shrink-0 items-center gap-1 text-xs text-muted-foreground",children:[C==="zh"?"展开":"Levels",e.jsx("select",{"aria-label":C==="zh"?"展开层级":"Expand levels",className:"h-11 max-w-20 rounded bg-surface px-1 text-foreground",value:R,onChange:i=>N(Number(i.target.value)),children:[0,1,2,6].map(i=>e.jsx("option",{value:i,children:i===0?C==="zh"?"当前层":"Current":i===6?C==="zh"?"全部":"All":`${i}`},i))})]}),e.jsx("button",{ref:b,type:"button",className:X,"aria-label":k("architecture.closeFullscreen"),onClick:()=>ne(!1),children:e.jsx(Se,{size:18})})]}),e.jsx("div",{className:"flex items-center justify-between gap-1",title:k("architecture.panHint"),children:q})]}):e.jsxs("div",{className:"shrink-0 border-b border-border/15 bg-surface-2 px-2 py-1",children:[e.jsx("div",{className:"flex items-center justify-between gap-1",children:q}),e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-1 px-1 text-xs text-muted-foreground",children:[e.jsx("span",{children:k("architecture.panHint")}),e.jsxs("label",{className:"flex items-center gap-2 text-xs text-muted-foreground",children:[C==="zh"?"展开层级":"Expand levels",e.jsx("select",{"aria-label":C==="zh"?"展开层级":"Expand levels",className:"min-h-8 rounded bg-surface-2 px-2 text-foreground",value:R,onChange:i=>N(Number(i.target.value)),children:[0,1,2,6].map(i=>e.jsx("option",{value:i,children:i===0?C==="zh"?"当前层":"Current level":i===6?C==="zh"?"全部":"All":`${i}`},i))})]})]})]}),T&&F&&e.jsx("div",{className:"shrink-0 px-2",children:F}),ie&&e.jsx("p",{role:"alert",className:"px-3 py-2 text-xs text-destructive",children:k("architecture.downloadFailed")}),e.jsxs("div",{className:T?"relative flex min-h-0 flex-1 flex-col overflow-hidden min-[768px]:flex-row":"relative",children:[f?e.jsx("p",{role:"alert",className:"p-4 text-sm text-muted-foreground",children:le.nodes.length>300?C==="zh"?"图中模块较多,请减少展开层级或选择单个视角。":"This graph has many modules. Expand fewer levels or select one perspective.":k("architecture.diagramFailed")}):j?e.jsx("div",{ref:$,"data-sidebar-gesture-ignore":!0,className:`termdock-architecture-viewport overflow-auto overscroll-contain p-3 ${T?"min-h-0 min-w-0 flex-1":"h-[min(50dvh,26rem)]"}`,style:{touchAction:"none",maxHeight:!T&&ae.clipHeight?Math.max(160,ae.clipHeight-150):void 0},onPointerDown:i=>{if(i.button!==0)return;v.current.size||(O.current=!1,K.current=0);const S=i.target.closest("[data-architecture-node]")?.getAttribute("data-architecture-node")??void 0;v.current.set(i.pointerId,{x:i.clientX,y:i.clientY,nodeId:S}),v.current.size>1&&(O.current=!0);try{i.currentTarget.setPointerCapture?.(i.pointerId)}catch{}},onPointerMove:i=>{const S=v.current.get(i.pointerId);if(!S)return;const m=[...v.current.values()];v.current.set(i.pointerId,{...S,x:i.clientX,y:i.clientY});const A=[...v.current.values()];if(A.length>=2){const w=me=>Math.hypot(me[0].x-me[1].x,me[0].y-me[1].y),J=w(m),be=w(A);J>0&&ue(Q.current*be/J,(A[0].x+A[1].x)/2,(A[0].y+A[1].y)/2),O.current=!0}else{const w=S.x-i.clientX,J=S.y-i.clientY;K.current+=Math.hypot(w,J),K.current>5&&(O.current=!0),i.currentTarget.scrollLeft+=w,i.currentTarget.scrollTop+=J}},onPointerUp:i=>{const S=v.current.get(i.pointerId),m=v.current.size===1&&!O.current&&S?.nodeId;v.current.delete(i.pointerId),m&&(O.current=!0,D(m))},onPointerCancel:i=>{v.current.delete(i.pointerId),O.current=!0},onLostPointerCapture:i=>{v.current.delete(i.pointerId)},children:e.jsx("div",{ref:z,role:"group","aria-label":k("architecture.modules"),className:"termdock-architecture-diagram mx-auto",style:ce,onClick:i=>{if(O.current)return;const m=i.target.closest("[data-architecture-node]")?.getAttribute("data-architecture-node");m&&D(m)},onKeyDown:i=>{if(i.key!=="Enter"&&i.key!==" ")return;const S=i.target.closest("[data-architecture-node]")?.getAttribute("data-architecture-node");S&&(i.preventDefault(),D(S))},dangerouslySetInnerHTML:{__html:j}})}):e.jsx("p",{role:"status",className:"p-4 text-sm text-muted-foreground",children:k("architecture.rendering")}),T&&x]})]});return T?vt.createPortal(e.jsx("section",{ref:l,tabIndex:-1,role:"dialog","aria-modal":"true","aria-label":k("architecture.diagram"),"data-sidebar-gesture-ignore":!0,className:"fixed inset-0 z-modal-panel flex flex-col overflow-hidden bg-surface text-foreground pt-[env(safe-area-inset-top)] pb-[env(safe-area-inset-bottom)]",children:Pe}),document.body):e.jsx("section",{className:"overflow-clip rounded-xl border border-border/20 bg-surface-2","aria-label":k("architecture.diagram"),children:Pe})}function je(r,o){let a=r.trim().replace(/^@/,"");/^([`"']).*\1$/.test(a)&&(a=a.slice(1,-1)),a=a.replace(/\\ /g," ").replace(/:\d+(?:-\d+)?$/,"").replace(/\/+$/,""),/^([`"']).*\1$/.test(a)&&(a=a.slice(1,-1));const d=o.replace(/\/+$/,"");if(a.startsWith("/")){if(!a.startsWith(`${d}/`))return null;a=a.slice(d.length+1)}return a=a.replace(/^\.\//,""),a.length<=1024&&Wt(a)?a:null}function ht(r,o){const a=[...r.matchAll(/^# (.+?): hunk \d+,/gm)].map(x=>x[1]),p=(a.length?a:r.split(/\r?\n/).map(x=>x.trim()).filter(Boolean)).map(x=>je(x,o));if(p.some(x=>x===null))return null;const n=[...new Set(p)];return n.length<=20?n:null}function $t({rootPath:r,initialDirectory:o,selected:a,onChange:d,selectionDisabled:p=!1,compact:n=!1}){const{t:x}=he(),g=r.replace(/\/+$/,"")||"/",[u,c]=s.useState(()=>o&&je(o,g)?o.replace(/\/+$/,""):g),[F,M]=s.useState(""),[k,C]=s.useState(null),[R,N]=s.useState(0),[E,z]=s.useState(null);s.useEffect(()=>{if(!E)return;const f=window.setTimeout(()=>z(null),1800);return()=>window.clearTimeout(f)},[E]);const $=et(f=>f.invalidateDirectoryCache),l=new Set(a.map(f=>`${g==="/"?"":g}/${f}`)),b=f=>{const H=je(f,g);p||!H||a.includes(H)||a.length>=20||d([...a,H])},h=f=>{f!==g&&!je(f,g)||(c(f),M(""),C(null))},j=`inline-flex shrink-0 items-center justify-center rounded-lg text-xs hover:bg-surface-elevated focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-40 ${n?"h-8 w-8 [@media(pointer:coarse)]:h-11 [@media(pointer:coarse)]:w-11":"h-11 w-11"}`,B=je(u,g);return e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"shrink-0 px-2 py-1",children:e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("button",{type:"button",className:j,disabled:u===g,"aria-label":x("rightSidebar.parentFolder"),onClick:()=>h(u.slice(0,u.lastIndexOf("/"))||g),children:e.jsx(Jt,{size:17})}),e.jsx("button",{type:"button",className:j,disabled:u===g,"aria-label":x("rightSidebar.backToProjectRoot"),onClick:()=>h(g),children:e.jsx(Vt,{size:16})}),e.jsx("span",{className:"min-w-0 flex-1 truncate text-xs font-medium",title:u,children:B??(u.split("/").pop()||"/")}),B&&e.jsx("button",{type:"button",className:`${j} text-primary`,disabled:p||!a.includes(B)&&a.length>=20,"aria-label":`${x("architecture.addScopeReference")}: ${u.split("/").pop()}`,title:B,"aria-pressed":a.includes(B),onClick:()=>b(u),children:a.includes(B)?e.jsx(Tt,{size:15}):e.jsx(nr,{size:15})}),e.jsx("button",{type:"button",className:j,"aria-label":x("rightSidebar.refreshFiles"),onClick:()=>{$(u,!0),N(f=>f+1)},children:e.jsx(kt,{size:15})})]})}),p&&e.jsx("p",{role:"alert",className:"shrink-0 px-3 pb-2 text-xs text-muted-foreground",children:x("architecture.correctPathsFirst")}),e.jsx("div",{className:"shrink-0 border-b border-border/15 px-3 pb-2",children:e.jsx("input",{"aria-label":x("architecture.searchScopePaths"),placeholder:x("architecture.searchScopePaths"),value:F,onChange:f=>M(f.target.value),className:`${n?"h-9 [@media(pointer:coarse)]:h-11":"h-11"} w-full rounded-lg border border-border/20 bg-surface-2 px-3 text-sm focus-visible:ring-2 focus-visible:ring-ring`})}),e.jsx("div",{className:"min-h-0 flex-1 overflow-auto overscroll-contain bg-surface",children:e.jsx(Kt,{rootPath:u,selectedFilePath:k,onFileSelect:f=>{C(f),b(f)},onDirectoryRoot:h,onPathReference:b,getReferenceText:f=>je(f,g)??f,query:F,onReferenceCopied:z,copiedReferenceKey:E,onSearchFromDirectory:h,referenceSelection:{paths:l,label:x("architecture.addScopeReference"),disabled:p||a.length>=20}},`${u}:${R}`)})]})}function vr({rootPath:r,initialDirectory:o,initial:a,onConfirm:d,onCancel:p}){const{t:n}=he(),x=s.useRef(null);We(x,!0,p);const g=s.useId(),[u,c]=s.useState(a);s.useEffect(()=>{const M=document.body.style.overflow;return document.body.style.overflow="hidden",()=>{document.body.style.overflow=M}},[]);const F="inline-flex min-h-11 items-center justify-center gap-1.5 rounded-lg px-3 text-xs hover:bg-surface-elevated focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-40";return vt.createPortal(e.jsxs("div",{className:"fixed inset-0 z-popover flex items-center justify-center p-[max(0.75rem,env(safe-area-inset-top))]",children:[e.jsx("button",{type:"button",className:"absolute inset-0 z-10 cursor-default bg-[var(--app-backdrop)]","aria-label":n("common.cancel"),onClick:p}),e.jsxs("section",{ref:x,id:`${g}-dialog`,tabIndex:-1,role:"dialog","aria-modal":"true","aria-labelledby":g,"aria-describedby":`${g}-hint`,className:"relative z-20 flex h-full max-h-[42rem] w-full max-w-xl flex-col overflow-hidden rounded-xl border border-border/20 bg-surface text-foreground shadow-xl",children:[e.jsxs("header",{className:"shrink-0 px-3 py-1",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("h2",{id:g,className:"min-w-0 flex-1 text-sm font-semibold",title:n("architecture.browsePathsHint"),children:n("architecture.choosePaths")}),e.jsx("button",{type:"button",className:F,"aria-label":n("common.close"),onClick:p,children:e.jsx(Se,{size:17})})]}),e.jsx("p",{id:`${g}-hint`,className:"sr-only",children:n("architecture.browsePathsHint")})]}),e.jsx($t,{rootPath:r,initialDirectory:o,selected:u,onChange:c}),e.jsxs("footer",{className:"shrink-0 space-y-2 border-t border-border/15 p-3",children:[e.jsxs("p",{className:"text-xs text-muted-foreground",children:[n("architecture.selectedPaths")," ",u.length," / 20"]}),u.length>0&&e.jsx("div",{className:"flex max-h-24 flex-wrap gap-1 overflow-y-auto",children:u.map(M=>e.jsxs("button",{type:"button",className:`${F} min-w-0 max-w-full bg-surface-2`,"aria-label":`${n("architecture.removePath")}: ${M}`,onClick:()=>c(k=>k.filter(C=>C!==M)),children:[e.jsx("span",{className:"truncate font-mono",children:M}),e.jsx(Se,{size:13,className:"shrink-0"})]},M))}),e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsx("button",{type:"button",className:F,onClick:p,children:n("common.cancel")}),e.jsx("button",{type:"button",className:`${F} bg-primary/15 text-primary`,onClick:()=>d(u),children:n("architecture.usePaths")})]})]})]})]}),document.body)}function xt({rootPath:r,initial:o,outputFile:a,currentFile:d,currentDirectory:p,active:n=!0,onInsertPrompt:x,onPrepared:g,onClose:u}){const{t:c,locale:F}=he(),M=s.useRef(null),k=s.useRef(null);We(k,n,u),s.useLayoutEffect(()=>{n&&k.current?.scrollIntoView?.({block:"start"})},[n]);const[C,R]=s.useState(!1);s.useLayoutEffect(()=>{const D=k.current;if(!n||!D)return;const X=()=>R(D.clientWidth>=900);if(X(),typeof ResizeObserver>"u")return;const q=new ResizeObserver(X);return q.observe(D),()=>q.disconnect()},[n]);const N=s.useId(),[E,z]=s.useState(o.kind),[$,l]=s.useState(o.target),[b,h]=s.useState(o.paths.join(`
3
3
  `)),[j,B]=s.useState(o.depth),[f,H]=s.useState(o.focus),[P,U]=s.useState(null),[Q,T]=s.useState(!1),[ne,fe]=s.useState(!1),V=s.useRef(0);s.useEffect(()=>()=>{V.current++},[]),s.useEffect(()=>{n||(V.current++,T(!1),fe(!1))},[n]);const _=ht(b,r),ee=d?je(d,r):null,ie=p?je(p,r):null,oe=ie?p:ee?d.slice(0,d.lastIndexOf("/")):r,xe=n&&C&&E!=="project"&&!a&&!ne;let v=null;try{(E==="project"||_)&&(v=Xt({kind:E,target:$,paths:_??[],depth:j,focus:f}))}catch{}const O=v?Zt(r,F,v,a):"",K="inline-flex min-h-11 items-center justify-center gap-1.5 rounded-lg text-xs font-medium transition hover:bg-surface-elevated focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-40",le=`${K} px-3`,Y=`${K} px-1`,W="min-h-10 w-full min-w-0 rounded-lg border border-border/20 bg-surface px-2 py-2 text-sm text-foreground focus-visible:ring-2 focus-visible:ring-ring",ce=()=>{V.current++,T(!1),U(null)},ue=D=>{h(_?[...new Set([..._,D])].join(`
4
4
  `):`${b.trim()}
5
5
  ${D}`),ce()},se=v;return e.jsxs("div",{ref:k,id:`${N}-workspace`,tabIndex:-1,className:xe?"grid min-h-0 min-w-0 flex-1 grid-cols-[20rem_minmax(0,1fr)] grid-rows-[minmax(0,1fr)] items-start gap-3":"min-w-0 shrink-0",children:[xe&&e.jsxs("section",{"aria-label":c("architecture.choosePaths"),"aria-describedby":`${N}-browser-hint`,className:"flex h-full min-h-0 min-w-0 flex-col overflow-hidden rounded-xl border border-border/20 bg-surface-2",children:[e.jsxs("header",{className:"flex min-h-9 shrink-0 items-center gap-2 px-3",children:[e.jsx("h3",{className:"min-w-0 flex-1 truncate text-xs font-medium",title:c("architecture.browsePathsHint"),children:c("architecture.choosePaths")}),e.jsxs("p",{role:"status","aria-label":`${c("architecture.selectedPaths")} ${_?.length??0} / 20`,className:"shrink-0 text-xs tabular-nums text-muted-foreground",children:[_?.length??0," / 20"]}),e.jsx("p",{id:`${N}-browser-hint`,className:"sr-only",children:c("architecture.browsePathsHint")})]}),e.jsx($t,{compact:!0,rootPath:r,initialDirectory:oe,selected:_??[],selectionDisabled:!_,onChange:D=>{h(D.join(`
@@ -1,2 +1,2 @@
1
- import{ah as re,df as ce,bA as s,e as le}from"./app-DNnVU3VK.js";import{b as D}from"./dnd-BCFAPC0L.js";import{S as de}from"./sparkles-Cm9xs8pz.js";import{M as me,G as he,L as ue,T as xe,C as fe}from"./triangle-alert-D1VnXjVL.js";const pe=[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]],ye=re("chevron-left",pe);const ge=[["path",{d:"m14 10 7-7",key:"oa77jy"}],["path",{d:"M20 10h-6V4",key:"mjg0md"}],["path",{d:"m3 21 7-7",key:"tjx5ai"}],["path",{d:"M4 14h6v6",key:"rmj7iw"}]],be=re("minimize-2",ge);function ke(t,d){return(d?t.filter(o=>o.repoRoot===d):t).slice().sort((o,r)=>r.injectedAt-o.injectedAt)[0]??null}function ve(t){switch(t){case"entry":case"source":return"bg-sky-400";case"ui":return"bg-fuchsia-400";case"risk":return"bg-destructive";case"test":return"bg-emerald-400";default:return"bg-primary"}}function Ne(t){if(!t)return;const d=typeof t.sectionIndex=="number"?` section ${t.sectionIndex+1}`:"",i=typeof t.hunkIndex=="number"?` hunk ${t.hunkIndex+1}`:"";return`${t.filePath}${i}${d}`}function Q({anchor:t,children:d,onNavigate:i,className:o,style:r,elementRef:g,onActivate:l}){return!t&&!l?s.jsx("span",{ref:g,className:o,style:r,children:d}):s.jsx("button",{ref:g,type:"button",onClick:()=>{l?.(),t&&i(t)},title:Ne(t),className:`${o} text-left transition hover:border-primary/35 hover:bg-primary/15 active:scale-[0.99]`,style:r,children:d})}const H=190,X=92,q=132,we=28,C=16,J=18,T=54,ee=24,ae=18,je=8,B=24,z=["rgb(var(--primary-rgb))","rgb(var(--accent-rgb))","rgb(var(--warning-rgb))","rgb(var(--success-rgb))","rgb(192 132 252)"];function te(t){return z[t%z.length]}function Me(t,d){return`${t.from}->${t.to}:${d}`}function Ee(t,d,i){const o=Math.max(d.get(t)?.length??0,i.get(t)?.length??0);return Math.max(X,36+Math.max(0,o-1)*ae)}function ne(t,d,i){if(i<=1)return t.y+t.height/2;const o=Math.max(0,t.height-36),r=Math.min(o,(i-1)*ae);return t.y+t.height/2-r/2+r/(i-1)*d}function se(t,d,i){return t.slice().sort((o,r)=>{const g=d[o],l=d[r],a=i==="from"?g.toNode:g.fromNode,h=i==="from"?l.toNode:l.fromNode;return a.y-h.y||a.index-h.index||g.index-l.index})}function $e(t,d){const i=new Map;for(const o of t){if(Math.abs(o.toNode.layer-o.fromNode.layer)!==1)continue;const r=`${o.fromNode.layer}:${o.toNode.layer}`,g=i.get(r)??[];g.push(o),i.set(r,g)}for(const o of i.values()){o.sort((h,x)=>(h.fromY+h.toY)/2-(x.fromY+x.toY)/2||h.index-x.index);const r=[];o.forEach((h,x)=>{const N=(h.fromY+h.toY)/2,M=Math.max(B,d[h.key]??0)/2;if(x===0){r.push(N);return}const w=o[x-1],E=Math.max(B,d[w.key]??0)/2;r.push(Math.max(N,r[x-1]+E+M+je))});const g=r.reduce((h,x,N)=>h+x-(o[N].fromY+o[N].toY)/2,0)/Math.max(1,r.length),l=Math.min(...r.map((h,x)=>h-g-Math.max(B,d[o[x].key]??0)/2)),a=Math.max(0,C-l);o.forEach((h,x)=>{h.laneY=r[x]-g+a})}}function _e(t,d,i={},o={}){const r=new Map(t.map((n,m)=>[n.id,{node:n,index:m}])),g=d.filter(n=>r.has(n.from)&&r.has(n.to)),l=new Map,a=new Map;for(const n of t)l.set(n.id,[]),a.set(n.id,[]);for(const n of g)l.get(n.to)?.push(n.from),a.get(n.from)?.push(n.to);const h=new Map,x=new Set,N=n=>{const m=h.get(n);if(m!==void 0)return m;if(x.has(n))return 0;x.add(n);const c=l.get(n)??[],u=c.length===0?0:Math.max(...c.map(N))+1;return x.delete(n),h.set(n,u),u};for(const n of t)N(n.id);const M=new Map;for(const n of t){const m=h.get(n.id)??0,c=M.get(m)??[],u=r.get(n.id);u&&c.push(u),M.set(m,c)}const w=[];for(const[n,m]of M.entries()){m.sort((u,f)=>u.index-f.index);let c=C+T;m.forEach(({node:u,index:f},j)=>{const I=Math.max(Ee(u.id,l,a),Math.ceil(i[u.id]??X));w.push({node:u,index:f,layer:n,row:j,x:C+n*(H+q),y:c,height:I}),c+=I+we})}const E=new Map(w.map(n=>[n.node.id,n])),v=g.flatMap((n,m)=>{const c=E.get(n.from),u=E.get(n.to);return!c||!u?[]:[{...n,key:Me(n,m),index:m,fromNode:c,toNode:u,routeIndex:m,fromPortIndex:0,toPortIndex:0,fromY:c.y+c.height/2,toY:u.y+u.height/2,laneY:(c.y+c.height/2+u.y+u.height/2)/2}]}),$=new Map,G=new Map;v.forEach((n,m)=>{$.set(n.from,[...$.get(n.from)??[],m]),G.set(n.to,[...G.get(n.to)??[],m])});for(const[n,m]of $){const c=se(m,v,"from");c.forEach((u,f)=>{const j=v[u];j.fromPortIndex=f,j.fromY=ne(E.get(n),f,c.length)})}for(const[n,m]of G){const c=se(m,v,"to");c.forEach((u,f)=>{const j=v[u];j.toPortIndex=f,j.toY=ne(E.get(n),f,c.length)})}$e(v,o);let Y=0;v.forEach(n=>{const m=Math.min(n.fromNode.layer,n.toNode.layer),c=Math.max(n.fromNode.layer,n.toNode.layer);if(c-m<=1)return;const f=Y;Y+=1,n.routeIndex=f;const j=w.filter(A=>A.layer>=m&&A.layer<=c),I=Math.min(...j.map(A=>A.y))-ee-(Math.floor(f/2)+1)*J,S=Math.max(...j.map(A=>A.y+A.height))+ee+(Math.floor(f/2)+1)*J;n.laneY=f%2===0?Math.max(C,I):S});const O=Math.max(0,...w.map(n=>n.layer)),W=Math.max(C+T+X,...w.map(n=>n.y+n.height),...v.map(n=>n.laneY+Math.max(B,o[n.key]??0)/2));return{nodes:w,edges:v,width:C*2+(O+1)*H+O*q,height:W+C+T}}function oe(t,d=12){const i=t[0];if(!i)return"";const o=[`M ${i.x} ${i.y}`];for(let r=1;r<t.length;r+=1){const g=t[r-1],l=t[r],a=t[r+1];if(!a){o.push(`L ${l.x} ${l.y}`);continue}const h=l.x-g.x,x=l.y-g.y,N=a.x-l.x,M=a.y-l.y,w=Math.abs(h)+Math.abs(x),E=Math.abs(N)+Math.abs(M);if(w===0||E===0||h&&N||x&&M){o.push(`L ${l.x} ${l.y}`);continue}const v=Math.min(d,w/2,E/2),$={x:l.x-Math.sign(h)*v,y:l.y-Math.sign(x)*v},G={x:l.x+Math.sign(N)*v,y:l.y+Math.sign(M)*v};o.push(`L ${$.x} ${$.y}`),o.push(`Q ${l.x} ${l.y} ${G.x} ${G.y}`)}return o.join(" ")}function De(t){const d=t.fromNode.x+H+8,i=t.fromY,o=t.toNode.x-8,r=t.toY,g=Math.abs(t.toNode.layer-t.fromNode.layer),l=d+22+t.fromPortIndex*5,a=o-22-t.toPortIndex*5;return g<=1?oe([{x:d,y:i},{x:l,y:i},{x:l,y:t.laneY},{x:a,y:t.laneY},{x:a,y:r},{x:o,y:r}]):oe([{x:d,y:i},{x:l,y:i},{x:l,y:t.laneY},{x:a,y:t.laneY},{x:a,y:r},{x:o,y:r}])}function Ie(t){const d=t.fromNode.x+H+8,i=t.toNode.x-8,o=Math.abs(t.toNode.layer-t.fromNode.layer),r=Math.max(34,Math.abs(i-d));return o<=1?{x:(d+i)/2,y:t.laneY,maxWidth:Math.max(72,Math.min(108,r-34))}:{x:(d+i)/2,y:t.laneY,maxWidth:Math.max(84,Math.min(120,r*.3))}}function Pe({walkthroughs:t,repoRoot:d,onNavigate:i,fullscreen:o=!1,onToggleFullscreen:r}){const{t:g}=ce(),l=D.useId(),a=ke(t,d),h=D.useRef(new Map),x=D.useRef(new Map),[N,M]=D.useState({}),[w,E]=D.useState({}),[v,$]=D.useState(null),[G,Y]=D.useState(null),[O,W]=D.useState(null),[n,m]=D.useState(null),c=D.useMemo(()=>a?_e(a.nodes,a.edges,N,w):null,[N,w,a]);if(D.useLayoutEffect(()=>{if(!a)return;const e={};for(const p of a.nodes){const b=h.current.get(p.id);b&&(e[p.id]=b.offsetHeight)}M(p=>{const b=Object.keys(p),_=Object.keys(e);return b.length===_.length&&_.every(k=>p[k]===e[k])?p:e});const y={};for(const[p,b]of x.current)y[p]=b.offsetHeight;E(p=>{const b=Object.keys(p),_=Object.keys(y);return b.length===_.length&&_.every(k=>p[k]===y[k])?p:y})},[a]),!a||!c)return null;const u=`walkthrough-arrow-${l.replace(/[^a-zA-Z0-9_-]/g,"")||"default"}`,f=O??n,j=f?null:v??G,I=c.edges.some(e=>e.key===j)?j:null,S=c.edges.find(e=>e.key===I),A=f?c.edges.filter(e=>e.from===f||e.to===f):[],U=f?new Set(A.map(e=>e.key)):null,F=f?new Set([f,...A.flatMap(e=>[e.from,e.to])]):S?new Set([S.from,S.to]):null,K=new Map(a.sections.filter(e=>e.nodeId&&e.anchor).map(e=>[e.nodeId,e.anchor])),L=a.nodes.filter(e=>e.anchor??K.get(e.id)),R=L.findIndex(e=>e.id===n),V=e=>{if(L.length===0)return;const y=R<0?e<0?L.length-1:0:Math.min(L.length-1,Math.max(0,R+e)),p=L[y],b=p.anchor??K.get(p.id);b&&(m(p.id),Y(null),i(b))};return s.jsxs("section",{className:"mb-2 px-0 py-0",children:[s.jsxs("div",{className:"flex min-w-0 items-center gap-2",children:[s.jsx("span",{className:"flex h-7 w-7 shrink-0 items-center justify-center rounded-md bg-primary/12 text-primary",children:s.jsx(de,{size:14})}),s.jsxs("div",{className:"min-w-0 flex-1",children:[s.jsx("div",{className:"whitespace-normal break-words text-[12px] font-semibold leading-snug text-foreground",children:a.title}),a.summary&&s.jsx("div",{className:"mt-0.5 text-[10px] leading-snug text-muted-foreground",children:a.summary})]}),s.jsxs("div",{className:"flex shrink-0 items-center gap-1",children:[o&&L.length>0&&s.jsxs(s.Fragment,{children:[s.jsx("button",{type:"button",onClick:()=>V(-1),disabled:R===0,className:"inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition hover:bg-surface-2 hover:text-foreground active:scale-95 disabled:pointer-events-none disabled:opacity-30",title:"Previous change","aria-label":"Previous change",children:s.jsx(ye,{size:15})}),s.jsxs("span",{className:"min-w-8 text-center text-[10px] tabular-nums text-muted-foreground",children:[R<0?"—":R+1,"/",L.length]}),s.jsx("button",{type:"button",onClick:()=>V(1),disabled:R===L.length-1,className:"inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition hover:bg-surface-2 hover:text-foreground active:scale-95 disabled:pointer-events-none disabled:opacity-30",title:"Next change","aria-label":"Next change",children:s.jsx(le,{size:15})})]}),r&&s.jsx("button",{type:"button",onClick:r,className:"inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition hover:bg-surface-2 hover:text-foreground active:scale-95",title:o?"Exit full-screen DAG review":"Review from DAG in full screen","aria-label":o?"Exit full-screen DAG review":"Review from DAG in full screen",children:o?s.jsx(be,{size:15}):s.jsx(me,{size:15})})]})]}),a.highlights.length>0&&s.jsx("div",{className:"mt-2 grid gap-1.5",children:a.highlights.slice(0,4).map((e,y)=>s.jsxs("div",{className:"rounded-md bg-surface-2 px-2 py-1.5",children:[s.jsxs("div",{className:"flex min-w-0 items-center gap-1.5",children:[e.tag&&s.jsx("span",{className:"shrink-0 rounded bg-surface-elevated px-1.5 py-0.5 text-[9px] font-semibold text-primary",children:e.tag}),s.jsx("span",{className:"min-w-0 flex-1 whitespace-normal break-words text-[11px] font-semibold leading-snug text-foreground",children:e.what})]}),s.jsx("div",{className:"mt-0.5 text-[10px] leading-snug text-muted-foreground",children:e.effect})]},`${e.what}-${y}`))}),a.nodes.length>0&&s.jsxs("div",{className:"mt-2",children:[s.jsxs("div",{className:"mb-1 flex items-center justify-between gap-2 text-[10px] text-muted-foreground",children:[s.jsxs("div",{className:"flex items-center gap-1.5 font-semibold uppercase tracking-[0.12em]",children:[s.jsx(he,{size:11}),"DAG"]}),a.edges.some(e=>e.label?.trim())&&s.jsx("span",{className:"normal-case tracking-normal",children:g("diffViewer.focusPathHint")})]}),s.jsx("div",{className:"overflow-x-auto rounded-md border border-border/15 bg-surface-2 p-1.5",onWheel:e=>e.stopPropagation(),children:s.jsxs("div",{className:"relative",style:{width:c.width,height:c.height},children:[s.jsxs("svg",{className:"absolute inset-0",width:c.width,height:c.height,"aria-hidden":"true",children:[s.jsx("defs",{children:z.map((e,y)=>s.jsx("marker",{id:`${u}-${y}`,viewBox:"0 0 10 10",refX:"8.5",refY:"5",markerWidth:"5",markerHeight:"5",orient:"auto",markerUnits:"strokeWidth",children:s.jsx("path",{d:"M0,0 L10,5 L0,10 Z",fill:e})},e))}),c.edges.map(e=>{const y=De(e),p=te(e.index),b=I===e.key||!!U?.has(e.key),_=!!((I||f)&&!b);return s.jsxs("g",{className:"transition-opacity duration-150",style:{opacity:_?.3:1},children:[s.jsx("path",{className:"pointer-events-none",d:y,fill:"none",stroke:"var(--surface-2)",strokeWidth:b?7:5,strokeLinecap:"round"}),s.jsx("path",{className:"pointer-events-none transition-[stroke-width,opacity] duration-150",d:y,fill:"none",stroke:p,strokeWidth:b?3:1.8,strokeLinecap:"round",markerEnd:`url(#${u}-${e.index%z.length})`}),s.jsx("path",{"data-dag-edge":e.key,d:y,fill:"none",stroke:"transparent",strokeWidth:"14",className:"cursor-pointer",onPointerEnter:()=>$(e.key),onPointerLeave:()=>$(k=>k===e.key?null:k),onClick:()=>{m(null),Y(k=>k===e.key?null:e.key)}}),s.jsx("circle",{className:"pointer-events-none",cx:e.fromNode.x+H+8,cy:e.fromY,r:b?4:3,fill:p,stroke:"var(--surface-2)",strokeWidth:"2"}),s.jsx("circle",{className:"pointer-events-none",cx:e.toNode.x-8,cy:e.toY,r:b?4:3,fill:p,stroke:"var(--surface-2)",strokeWidth:"2"})]},e.key)})]}),c.edges.map(e=>{const y=e.label?.trim();if(!y)return null;const{x:p,y:b,maxWidth:_}=Ie(e),k=te(e.index),Z=I===e.key||!!U?.has(e.key),ie=!!((I||f)&&!Z);return s.jsxs("button",{ref:P=>{P?x.current.set(e.key,P):x.current.delete(e.key)},type:"button","data-dag-edge-label":e.key,className:"absolute -translate-x-1/2 -translate-y-1/2 whitespace-normal break-words rounded-md border bg-surface-elevated px-1.5 py-1 text-center text-[9px] leading-[11px] shadow-sm transition-[opacity,box-shadow,transform] duration-150 [overflow-wrap:anywhere] hover:shadow-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/60",style:{left:p,top:b,maxWidth:_,width:"max-content",borderColor:k,color:k,opacity:ie?.38:1,boxShadow:Z?`0 0 0 2px ${k}, 0 6px 18px rgb(0 0 0 / 0.24)`:void 0},title:`${e.fromNode.index+1} ${e.fromNode.node.title} → ${e.toNode.index+1} ${e.toNode.node.title}${e.desc?`
1
+ import{ah as re,df as ce,bA as s,e as le}from"./app-aNkllBsm.js";import{b as D}from"./dnd-BCFAPC0L.js";import{S as de}from"./sparkles-kooHQYLJ.js";import{M as me,G as he,L as ue,T as xe,C as fe}from"./triangle-alert-rgLWcpfP.js";const pe=[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]],ye=re("chevron-left",pe);const ge=[["path",{d:"m14 10 7-7",key:"oa77jy"}],["path",{d:"M20 10h-6V4",key:"mjg0md"}],["path",{d:"m3 21 7-7",key:"tjx5ai"}],["path",{d:"M4 14h6v6",key:"rmj7iw"}]],be=re("minimize-2",ge);function ke(t,d){return(d?t.filter(o=>o.repoRoot===d):t).slice().sort((o,r)=>r.injectedAt-o.injectedAt)[0]??null}function ve(t){switch(t){case"entry":case"source":return"bg-sky-400";case"ui":return"bg-fuchsia-400";case"risk":return"bg-destructive";case"test":return"bg-emerald-400";default:return"bg-primary"}}function Ne(t){if(!t)return;const d=typeof t.sectionIndex=="number"?` section ${t.sectionIndex+1}`:"",i=typeof t.hunkIndex=="number"?` hunk ${t.hunkIndex+1}`:"";return`${t.filePath}${i}${d}`}function Q({anchor:t,children:d,onNavigate:i,className:o,style:r,elementRef:g,onActivate:l}){return!t&&!l?s.jsx("span",{ref:g,className:o,style:r,children:d}):s.jsx("button",{ref:g,type:"button",onClick:()=>{l?.(),t&&i(t)},title:Ne(t),className:`${o} text-left transition hover:border-primary/35 hover:bg-primary/15 active:scale-[0.99]`,style:r,children:d})}const H=190,X=92,q=132,we=28,C=16,J=18,T=54,ee=24,ae=18,je=8,B=24,z=["rgb(var(--primary-rgb))","rgb(var(--accent-rgb))","rgb(var(--warning-rgb))","rgb(var(--success-rgb))","rgb(192 132 252)"];function te(t){return z[t%z.length]}function Me(t,d){return`${t.from}->${t.to}:${d}`}function Ee(t,d,i){const o=Math.max(d.get(t)?.length??0,i.get(t)?.length??0);return Math.max(X,36+Math.max(0,o-1)*ae)}function ne(t,d,i){if(i<=1)return t.y+t.height/2;const o=Math.max(0,t.height-36),r=Math.min(o,(i-1)*ae);return t.y+t.height/2-r/2+r/(i-1)*d}function se(t,d,i){return t.slice().sort((o,r)=>{const g=d[o],l=d[r],a=i==="from"?g.toNode:g.fromNode,h=i==="from"?l.toNode:l.fromNode;return a.y-h.y||a.index-h.index||g.index-l.index})}function $e(t,d){const i=new Map;for(const o of t){if(Math.abs(o.toNode.layer-o.fromNode.layer)!==1)continue;const r=`${o.fromNode.layer}:${o.toNode.layer}`,g=i.get(r)??[];g.push(o),i.set(r,g)}for(const o of i.values()){o.sort((h,x)=>(h.fromY+h.toY)/2-(x.fromY+x.toY)/2||h.index-x.index);const r=[];o.forEach((h,x)=>{const N=(h.fromY+h.toY)/2,M=Math.max(B,d[h.key]??0)/2;if(x===0){r.push(N);return}const w=o[x-1],E=Math.max(B,d[w.key]??0)/2;r.push(Math.max(N,r[x-1]+E+M+je))});const g=r.reduce((h,x,N)=>h+x-(o[N].fromY+o[N].toY)/2,0)/Math.max(1,r.length),l=Math.min(...r.map((h,x)=>h-g-Math.max(B,d[o[x].key]??0)/2)),a=Math.max(0,C-l);o.forEach((h,x)=>{h.laneY=r[x]-g+a})}}function _e(t,d,i={},o={}){const r=new Map(t.map((n,m)=>[n.id,{node:n,index:m}])),g=d.filter(n=>r.has(n.from)&&r.has(n.to)),l=new Map,a=new Map;for(const n of t)l.set(n.id,[]),a.set(n.id,[]);for(const n of g)l.get(n.to)?.push(n.from),a.get(n.from)?.push(n.to);const h=new Map,x=new Set,N=n=>{const m=h.get(n);if(m!==void 0)return m;if(x.has(n))return 0;x.add(n);const c=l.get(n)??[],u=c.length===0?0:Math.max(...c.map(N))+1;return x.delete(n),h.set(n,u),u};for(const n of t)N(n.id);const M=new Map;for(const n of t){const m=h.get(n.id)??0,c=M.get(m)??[],u=r.get(n.id);u&&c.push(u),M.set(m,c)}const w=[];for(const[n,m]of M.entries()){m.sort((u,f)=>u.index-f.index);let c=C+T;m.forEach(({node:u,index:f},j)=>{const I=Math.max(Ee(u.id,l,a),Math.ceil(i[u.id]??X));w.push({node:u,index:f,layer:n,row:j,x:C+n*(H+q),y:c,height:I}),c+=I+we})}const E=new Map(w.map(n=>[n.node.id,n])),v=g.flatMap((n,m)=>{const c=E.get(n.from),u=E.get(n.to);return!c||!u?[]:[{...n,key:Me(n,m),index:m,fromNode:c,toNode:u,routeIndex:m,fromPortIndex:0,toPortIndex:0,fromY:c.y+c.height/2,toY:u.y+u.height/2,laneY:(c.y+c.height/2+u.y+u.height/2)/2}]}),$=new Map,G=new Map;v.forEach((n,m)=>{$.set(n.from,[...$.get(n.from)??[],m]),G.set(n.to,[...G.get(n.to)??[],m])});for(const[n,m]of $){const c=se(m,v,"from");c.forEach((u,f)=>{const j=v[u];j.fromPortIndex=f,j.fromY=ne(E.get(n),f,c.length)})}for(const[n,m]of G){const c=se(m,v,"to");c.forEach((u,f)=>{const j=v[u];j.toPortIndex=f,j.toY=ne(E.get(n),f,c.length)})}$e(v,o);let Y=0;v.forEach(n=>{const m=Math.min(n.fromNode.layer,n.toNode.layer),c=Math.max(n.fromNode.layer,n.toNode.layer);if(c-m<=1)return;const f=Y;Y+=1,n.routeIndex=f;const j=w.filter(A=>A.layer>=m&&A.layer<=c),I=Math.min(...j.map(A=>A.y))-ee-(Math.floor(f/2)+1)*J,S=Math.max(...j.map(A=>A.y+A.height))+ee+(Math.floor(f/2)+1)*J;n.laneY=f%2===0?Math.max(C,I):S});const O=Math.max(0,...w.map(n=>n.layer)),W=Math.max(C+T+X,...w.map(n=>n.y+n.height),...v.map(n=>n.laneY+Math.max(B,o[n.key]??0)/2));return{nodes:w,edges:v,width:C*2+(O+1)*H+O*q,height:W+C+T}}function oe(t,d=12){const i=t[0];if(!i)return"";const o=[`M ${i.x} ${i.y}`];for(let r=1;r<t.length;r+=1){const g=t[r-1],l=t[r],a=t[r+1];if(!a){o.push(`L ${l.x} ${l.y}`);continue}const h=l.x-g.x,x=l.y-g.y,N=a.x-l.x,M=a.y-l.y,w=Math.abs(h)+Math.abs(x),E=Math.abs(N)+Math.abs(M);if(w===0||E===0||h&&N||x&&M){o.push(`L ${l.x} ${l.y}`);continue}const v=Math.min(d,w/2,E/2),$={x:l.x-Math.sign(h)*v,y:l.y-Math.sign(x)*v},G={x:l.x+Math.sign(N)*v,y:l.y+Math.sign(M)*v};o.push(`L ${$.x} ${$.y}`),o.push(`Q ${l.x} ${l.y} ${G.x} ${G.y}`)}return o.join(" ")}function De(t){const d=t.fromNode.x+H+8,i=t.fromY,o=t.toNode.x-8,r=t.toY,g=Math.abs(t.toNode.layer-t.fromNode.layer),l=d+22+t.fromPortIndex*5,a=o-22-t.toPortIndex*5;return g<=1?oe([{x:d,y:i},{x:l,y:i},{x:l,y:t.laneY},{x:a,y:t.laneY},{x:a,y:r},{x:o,y:r}]):oe([{x:d,y:i},{x:l,y:i},{x:l,y:t.laneY},{x:a,y:t.laneY},{x:a,y:r},{x:o,y:r}])}function Ie(t){const d=t.fromNode.x+H+8,i=t.toNode.x-8,o=Math.abs(t.toNode.layer-t.fromNode.layer),r=Math.max(34,Math.abs(i-d));return o<=1?{x:(d+i)/2,y:t.laneY,maxWidth:Math.max(72,Math.min(108,r-34))}:{x:(d+i)/2,y:t.laneY,maxWidth:Math.max(84,Math.min(120,r*.3))}}function Pe({walkthroughs:t,repoRoot:d,onNavigate:i,fullscreen:o=!1,onToggleFullscreen:r}){const{t:g}=ce(),l=D.useId(),a=ke(t,d),h=D.useRef(new Map),x=D.useRef(new Map),[N,M]=D.useState({}),[w,E]=D.useState({}),[v,$]=D.useState(null),[G,Y]=D.useState(null),[O,W]=D.useState(null),[n,m]=D.useState(null),c=D.useMemo(()=>a?_e(a.nodes,a.edges,N,w):null,[N,w,a]);if(D.useLayoutEffect(()=>{if(!a)return;const e={};for(const p of a.nodes){const b=h.current.get(p.id);b&&(e[p.id]=b.offsetHeight)}M(p=>{const b=Object.keys(p),_=Object.keys(e);return b.length===_.length&&_.every(k=>p[k]===e[k])?p:e});const y={};for(const[p,b]of x.current)y[p]=b.offsetHeight;E(p=>{const b=Object.keys(p),_=Object.keys(y);return b.length===_.length&&_.every(k=>p[k]===y[k])?p:y})},[a]),!a||!c)return null;const u=`walkthrough-arrow-${l.replace(/[^a-zA-Z0-9_-]/g,"")||"default"}`,f=O??n,j=f?null:v??G,I=c.edges.some(e=>e.key===j)?j:null,S=c.edges.find(e=>e.key===I),A=f?c.edges.filter(e=>e.from===f||e.to===f):[],U=f?new Set(A.map(e=>e.key)):null,F=f?new Set([f,...A.flatMap(e=>[e.from,e.to])]):S?new Set([S.from,S.to]):null,K=new Map(a.sections.filter(e=>e.nodeId&&e.anchor).map(e=>[e.nodeId,e.anchor])),L=a.nodes.filter(e=>e.anchor??K.get(e.id)),R=L.findIndex(e=>e.id===n),V=e=>{if(L.length===0)return;const y=R<0?e<0?L.length-1:0:Math.min(L.length-1,Math.max(0,R+e)),p=L[y],b=p.anchor??K.get(p.id);b&&(m(p.id),Y(null),i(b))};return s.jsxs("section",{className:"mb-2 px-0 py-0",children:[s.jsxs("div",{className:"flex min-w-0 items-center gap-2",children:[s.jsx("span",{className:"flex h-7 w-7 shrink-0 items-center justify-center rounded-md bg-primary/12 text-primary",children:s.jsx(de,{size:14})}),s.jsxs("div",{className:"min-w-0 flex-1",children:[s.jsx("div",{className:"whitespace-normal break-words text-[12px] font-semibold leading-snug text-foreground",children:a.title}),a.summary&&s.jsx("div",{className:"mt-0.5 text-[10px] leading-snug text-muted-foreground",children:a.summary})]}),s.jsxs("div",{className:"flex shrink-0 items-center gap-1",children:[o&&L.length>0&&s.jsxs(s.Fragment,{children:[s.jsx("button",{type:"button",onClick:()=>V(-1),disabled:R===0,className:"inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition hover:bg-surface-2 hover:text-foreground active:scale-95 disabled:pointer-events-none disabled:opacity-30",title:"Previous change","aria-label":"Previous change",children:s.jsx(ye,{size:15})}),s.jsxs("span",{className:"min-w-8 text-center text-[10px] tabular-nums text-muted-foreground",children:[R<0?"—":R+1,"/",L.length]}),s.jsx("button",{type:"button",onClick:()=>V(1),disabled:R===L.length-1,className:"inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition hover:bg-surface-2 hover:text-foreground active:scale-95 disabled:pointer-events-none disabled:opacity-30",title:"Next change","aria-label":"Next change",children:s.jsx(le,{size:15})})]}),r&&s.jsx("button",{type:"button",onClick:r,className:"inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition hover:bg-surface-2 hover:text-foreground active:scale-95",title:o?"Exit full-screen DAG review":"Review from DAG in full screen","aria-label":o?"Exit full-screen DAG review":"Review from DAG in full screen",children:o?s.jsx(be,{size:15}):s.jsx(me,{size:15})})]})]}),a.highlights.length>0&&s.jsx("div",{className:"mt-2 grid gap-1.5",children:a.highlights.slice(0,4).map((e,y)=>s.jsxs("div",{className:"rounded-md bg-surface-2 px-2 py-1.5",children:[s.jsxs("div",{className:"flex min-w-0 items-center gap-1.5",children:[e.tag&&s.jsx("span",{className:"shrink-0 rounded bg-surface-elevated px-1.5 py-0.5 text-[9px] font-semibold text-primary",children:e.tag}),s.jsx("span",{className:"min-w-0 flex-1 whitespace-normal break-words text-[11px] font-semibold leading-snug text-foreground",children:e.what})]}),s.jsx("div",{className:"mt-0.5 text-[10px] leading-snug text-muted-foreground",children:e.effect})]},`${e.what}-${y}`))}),a.nodes.length>0&&s.jsxs("div",{className:"mt-2",children:[s.jsxs("div",{className:"mb-1 flex items-center justify-between gap-2 text-[10px] text-muted-foreground",children:[s.jsxs("div",{className:"flex items-center gap-1.5 font-semibold uppercase tracking-[0.12em]",children:[s.jsx(he,{size:11}),"DAG"]}),a.edges.some(e=>e.label?.trim())&&s.jsx("span",{className:"normal-case tracking-normal",children:g("diffViewer.focusPathHint")})]}),s.jsx("div",{className:"overflow-x-auto rounded-md border border-border/15 bg-surface-2 p-1.5",onWheel:e=>e.stopPropagation(),children:s.jsxs("div",{className:"relative",style:{width:c.width,height:c.height},children:[s.jsxs("svg",{className:"absolute inset-0",width:c.width,height:c.height,"aria-hidden":"true",children:[s.jsx("defs",{children:z.map((e,y)=>s.jsx("marker",{id:`${u}-${y}`,viewBox:"0 0 10 10",refX:"8.5",refY:"5",markerWidth:"5",markerHeight:"5",orient:"auto",markerUnits:"strokeWidth",children:s.jsx("path",{d:"M0,0 L10,5 L0,10 Z",fill:e})},e))}),c.edges.map(e=>{const y=De(e),p=te(e.index),b=I===e.key||!!U?.has(e.key),_=!!((I||f)&&!b);return s.jsxs("g",{className:"transition-opacity duration-150",style:{opacity:_?.3:1},children:[s.jsx("path",{className:"pointer-events-none",d:y,fill:"none",stroke:"var(--surface-2)",strokeWidth:b?7:5,strokeLinecap:"round"}),s.jsx("path",{className:"pointer-events-none transition-[stroke-width,opacity] duration-150",d:y,fill:"none",stroke:p,strokeWidth:b?3:1.8,strokeLinecap:"round",markerEnd:`url(#${u}-${e.index%z.length})`}),s.jsx("path",{"data-dag-edge":e.key,d:y,fill:"none",stroke:"transparent",strokeWidth:"14",className:"cursor-pointer",onPointerEnter:()=>$(e.key),onPointerLeave:()=>$(k=>k===e.key?null:k),onClick:()=>{m(null),Y(k=>k===e.key?null:e.key)}}),s.jsx("circle",{className:"pointer-events-none",cx:e.fromNode.x+H+8,cy:e.fromY,r:b?4:3,fill:p,stroke:"var(--surface-2)",strokeWidth:"2"}),s.jsx("circle",{className:"pointer-events-none",cx:e.toNode.x-8,cy:e.toY,r:b?4:3,fill:p,stroke:"var(--surface-2)",strokeWidth:"2"})]},e.key)})]}),c.edges.map(e=>{const y=e.label?.trim();if(!y)return null;const{x:p,y:b,maxWidth:_}=Ie(e),k=te(e.index),Z=I===e.key||!!U?.has(e.key),ie=!!((I||f)&&!Z);return s.jsxs("button",{ref:P=>{P?x.current.set(e.key,P):x.current.delete(e.key)},type:"button","data-dag-edge-label":e.key,className:"absolute -translate-x-1/2 -translate-y-1/2 whitespace-normal break-words rounded-md border bg-surface-elevated px-1.5 py-1 text-center text-[9px] leading-[11px] shadow-sm transition-[opacity,box-shadow,transform] duration-150 [overflow-wrap:anywhere] hover:shadow-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/60",style:{left:p,top:b,maxWidth:_,width:"max-content",borderColor:k,color:k,opacity:ie?.38:1,boxShadow:Z?`0 0 0 2px ${k}, 0 6px 18px rgb(0 0 0 / 0.24)`:void 0},title:`${e.fromNode.index+1} ${e.fromNode.node.title} → ${e.toNode.index+1} ${e.toNode.node.title}${e.desc?`
2
2
  ${e.desc}`:""}`,"aria-pressed":G===e.key,onPointerEnter:()=>$(e.key),onPointerLeave:()=>$(P=>P===e.key?null:P),onClick:()=>{m(null),Y(P=>P===e.key?null:e.key)},children:[s.jsxs("span",{className:"block font-bold tabular-nums",children:[e.fromNode.index+1," → ",e.toNode.index+1]}),s.jsx("span",{className:"block text-muted-foreground",children:y})]},`${e.key}-label`)}),c.nodes.map(({node:e,index:y,x:p,y:b,height:_})=>s.jsxs(Q,{elementRef:k=>{k?h.current.set(e.id,k):h.current.delete(e.id)},anchor:e.anchor??K.get(e.id),onActivate:()=>{m(e.id),Y(null)},onNavigate:i,className:`absolute overflow-hidden rounded-lg border bg-surface/95 px-2.5 py-2 text-foreground shadow-[0_10px_24px_rgba(0,0,0,0.18)] transition-[opacity,border-color,box-shadow] duration-150 ${F?.has(e.id)?"border-primary/60 shadow-[0_0_0_1px_rgb(var(--primary-rgb)/0.28),0_10px_24px_rgba(0,0,0,0.22)]":F?"border-border/15 opacity-40":"border-border/25"}`,style:{left:p,top:b,width:H,minHeight:_},children:[s.jsx("span",{className:"absolute inset-0",onPointerEnter:()=>W(e.id),onPointerLeave:()=>W(k=>k===e.id?null:k)}),s.jsx("span",{className:`pointer-events-none absolute bottom-2 left-0 top-2 w-[3px] rounded-r-full ${ve(e.kind)}`}),s.jsxs("div",{className:"pointer-events-none relative flex min-w-0 items-center gap-1.5",children:[s.jsx("span",{className:"flex h-4 w-4 shrink-0 items-center justify-center rounded-full bg-primary/15 text-[9px] font-bold text-primary",children:y+1}),s.jsx("span",{className:"min-w-0 flex-1 whitespace-normal break-words text-[11px] font-semibold leading-snug text-foreground",children:e.title}),e.anchor&&s.jsx(ue,{size:11,className:"shrink-0 opacity-70"})]}),e.kind&&s.jsx("div",{className:"pointer-events-none relative mt-0.5 truncate text-[9px] font-semibold uppercase tracking-[0.08em] text-muted-foreground/80",children:e.kind}),s.jsx("div",{className:"pointer-events-none relative mt-0.5 whitespace-normal break-words text-[10px] leading-snug text-muted-foreground",children:e.business})]},e.id))]})})]}),(a.risks.length>0||a.checks.length>0)&&s.jsxs("div",{className:"mt-2 grid gap-1.5",children:[a.risks.slice(0,3).map((e,y)=>s.jsxs(Q,{anchor:e.anchor,onNavigate:i,className:"flex w-full items-start gap-1.5 rounded-md border border-[rgb(var(--warning-rgb)_/_0.25)] bg-[rgb(var(--warning-rgb)_/_0.10)] px-2 py-1.5 text-[10px] text-muted-foreground",children:[s.jsx(xe,{size:12,className:"mt-0.5 shrink-0 text-[color:var(--warning)]"}),s.jsx("span",{className:"min-w-0 whitespace-normal break-words leading-snug",children:e.title})]},`${e.title}-${y}`)),a.checks.slice(0,3).map((e,y)=>s.jsxs("div",{className:"flex items-start gap-1.5 rounded-md bg-surface-2 px-2 py-1.5 text-[10px] text-muted-foreground",children:[s.jsx(fe,{size:12,className:"mt-0.5 shrink-0 text-primary"}),s.jsx("span",{className:"min-w-0 whitespace-normal break-words leading-snug",children:e})]},`${e}-${y}`))]})]})}export{Pe as C,be as M,ye as a};
@@ -1 +1 @@
1
- import{de as O,bF as U,aD as q,b3 as H,cY as J,bA as e,T as Q,bo as v,S as X}from"./app-DNnVU3VK.js";import{b as t}from"./dnd-BCFAPC0L.js";import{ao as n,ab as Z,al as I,P as ee,$ as se,w as te,R as E,l as ae,ag as ne,ah as re}from"./App-xr2R4dST.js";import"./react-XDCjal2T.js";import"./terminal-C7X98Amf.js";import"./gestureArbiter-BE8k_FL7.js";import"./triangle-alert-D1VnXjVL.js";import"./referenceLongPress-LCYPFdN8.js";function xe({groupId:l,activeSessionId:a,onOpenSidebar:p,leftSidebarVisible:S=!1,onToggleRightSidebar:h,rightSidebarOpen:b=!1,defaultSessionMode:R}){const g=t.useRef(null);t.useEffect(()=>{g.current?.focus()},[]);const[r,j]=t.useState(null),[D,P]=t.useState([]),[c,f]=t.useState(null),[y,T]=t.useState(null),[x,z]=t.useState(null),[$,G]=t.useState(null),o=O(),[L,N]=t.useState(!1);t.useEffect(()=>{if(o==="ready"){N(!1);return}const s=setTimeout(()=>N(!0),1e3);return()=>clearTimeout(s)},[o]);const A=n(s=>s.view),V=n(s=>s.drafts),w=n(s=>s.setDraft),[M,W]=t.useState(l),u=t.useCallback(async()=>{try{const s=await U();j(s),f(null)}catch(s){f(s instanceof Error?s.message:"协作组加载失败")}},[]);t.useEffect(()=>{let s=!1;q().then(i=>{s||P(i)}).catch(()=>{}),H().then(i=>{if(s)return;const F=i.collaborationPanels?.[Z()]?.drafts;for(const[C,K]of Object.entries(F??{}))n.getState().drafts[C]||w(C,K)}).catch(()=>{});const _=J(i=>{s||(j(i),f(null))}),B=I(()=>{navigator.onLine!==!1&&u()},1e4,[X,"pageshow"]);return()=>{s=!0,_(),B()}},[u]);const m=r?.groups.find(s=>s.id===l),d=r?.sessions.find(s=>s.sessionId===a),Y=a?d?.name?`终端 · ${d.name}`:"继续终端会话":"选择终端",k=async s=>{await re(s),n.getState().terminal()};return e.jsxs("section",{"aria-label":"协作主工作区",className:"absolute inset-0 flex min-h-0 min-w-0 flex-col bg-[var(--chrome-bg)] text-foreground",children:[e.jsxs("header",{"data-termdock-window-header":"true",className:"flex min-h-14 shrink-0 items-center gap-1 border-b border-border/15 px-2 sm:min-h-16 sm:gap-3 sm:px-6",children:[!S&&e.jsx("button",{type:"button","aria-label":"打开会话侧栏",className:"inline-flex min-h-11 min-w-11 items-center justify-center rounded-lg text-muted-foreground hover:bg-surface-2",onClick:p,children:e.jsx(ee,{size:17})}),e.jsx(se,{size:18,className:"hidden shrink-0 text-primary sm:block"}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("h2",{ref:g,tabIndex:-1,className:"truncate text-base font-semibold outline-none",children:m?.name??"协作工作区"}),e.jsx("p",{className:"text-[11px] text-muted-foreground",children:m?`${m.sessionIds.length} 位成员`:"正在连接工作组"})]}),h&&e.jsx("button",{type:"button","aria-label":"文件侧栏",title:"文件侧栏","aria-pressed":b,className:`inline-flex min-h-11 min-w-11 items-center justify-center rounded-lg ${b?"bg-surface-2 text-primary":"text-muted-foreground hover:bg-surface-2"}`,onClick:h,children:e.jsx(te,{size:17})}),e.jsxs("button",{type:"button","aria-label":a?`打开终端:${d?.name??"当前会话"}`:"选择终端",title:a?`切换到${d?.name??"当前终端会话"},保留看板位置与消息草稿`:"从会话列表选择要打开的终端",className:"inline-flex min-h-11 min-w-11 max-w-[40%] items-center justify-center gap-2 rounded-lg px-2 text-xs text-muted-foreground hover:bg-surface-2",onClick:()=>{a?n.getState().terminal():p()},children:[e.jsx(Q,{size:17,className:"shrink-0"}),e.jsx("span",{className:"hidden min-w-0 truncate sm:inline",children:Y}),e.jsx("span",{className:"sm:hidden",children:a?"终端":"选择终端"})]})]}),e.jsxs("div",{className:"flex min-h-0 flex-1 flex-col px-4 py-2 sm:px-6",children:[(L||v(c))&&e.jsxs("div",{role:"status",className:"mb-2 flex shrink-0 items-center gap-2 text-xs text-muted-foreground",children:[e.jsx(E,{size:13,className:o==="offline"?"":"animate-spin"}),e.jsx("span",{children:o==="offline"?"网络已断开,联网后自动恢复":"正在恢复连接,当前结果和草稿已保留"})]}),(y||c&&o==="ready"&&!v(c))&&e.jsxs("div",{role:"alert",className:"mb-3 flex shrink-0 items-center gap-2 rounded-lg bg-destructive/10 p-3 text-xs text-destructive",children:[e.jsx("span",{className:"flex-1",children:y||c}),e.jsx("button",{type:"button","aria-label":"重新加载协作组",className:"min-h-11 px-3",onClick:()=>{u()},children:e.jsx(E,{size:14})})]}),x&&e.jsx("p",{role:"status",className:"mb-3 shrink-0 text-xs text-primary",children:x}),r?m?e.jsx(ae,{fullWorkspace:!0,initialView:A,active:!0,notice:x,groups:r.groups,sessions:r.sessions,agents:D,sessionsState:"loaded",selectedGroupId:M,setSelectedGroupId:W,initialGroupId:l,activeSessionId:a,initialDrafts:V,onDraftChange:w,docked:!1,inputKeySuffix:"main",floatingVisible:!0,floating:!1,onOpenSession:k,onOpenTaskSession:k,onDockMessages:a?async()=>{await ne(l,a)}:void 0,defaultSessionMode:R,busy:$,setBusy:G,setError:T,setNotice:z,refresh:u}):e.jsx("p",{className:"py-10 text-center text-sm text-muted-foreground",children:"协作组已移除或暂不可用。任务记录仍保留在原服务中。"}):e.jsx("p",{role:"status",className:"py-10 text-center text-sm text-muted-foreground",children:"正在加载协作工作区…"})]})]})}export{xe as default};
1
+ import{de as O,bF as U,aD as q,b3 as H,cY as J,bA as e,T as Q,bo as v,S as X}from"./app-aNkllBsm.js";import{b as t}from"./dnd-BCFAPC0L.js";import{ao as n,ab as Z,al as I,P as ee,$ as se,w as te,R as E,l as ae,ag as ne,ah as re}from"./App-JL8Fd8uO.js";import"./react-XDCjal2T.js";import"./terminal-C7X98Amf.js";import"./gestureArbiter-4NWfZprH.js";import"./triangle-alert-rgLWcpfP.js";import"./referenceLongPress-Bln9X6SW.js";function xe({groupId:l,activeSessionId:a,onOpenSidebar:p,leftSidebarVisible:S=!1,onToggleRightSidebar:h,rightSidebarOpen:b=!1,defaultSessionMode:R}){const g=t.useRef(null);t.useEffect(()=>{g.current?.focus()},[]);const[r,j]=t.useState(null),[D,P]=t.useState([]),[c,f]=t.useState(null),[y,T]=t.useState(null),[x,z]=t.useState(null),[$,G]=t.useState(null),o=O(),[L,N]=t.useState(!1);t.useEffect(()=>{if(o==="ready"){N(!1);return}const s=setTimeout(()=>N(!0),1e3);return()=>clearTimeout(s)},[o]);const A=n(s=>s.view),V=n(s=>s.drafts),w=n(s=>s.setDraft),[M,W]=t.useState(l),u=t.useCallback(async()=>{try{const s=await U();j(s),f(null)}catch(s){f(s instanceof Error?s.message:"协作组加载失败")}},[]);t.useEffect(()=>{let s=!1;q().then(i=>{s||P(i)}).catch(()=>{}),H().then(i=>{if(s)return;const F=i.collaborationPanels?.[Z()]?.drafts;for(const[C,K]of Object.entries(F??{}))n.getState().drafts[C]||w(C,K)}).catch(()=>{});const _=J(i=>{s||(j(i),f(null))}),B=I(()=>{navigator.onLine!==!1&&u()},1e4,[X,"pageshow"]);return()=>{s=!0,_(),B()}},[u]);const m=r?.groups.find(s=>s.id===l),d=r?.sessions.find(s=>s.sessionId===a),Y=a?d?.name?`终端 · ${d.name}`:"继续终端会话":"选择终端",k=async s=>{await re(s),n.getState().terminal()};return e.jsxs("section",{"aria-label":"协作主工作区",className:"absolute inset-0 flex min-h-0 min-w-0 flex-col bg-[var(--chrome-bg)] text-foreground",children:[e.jsxs("header",{"data-termdock-window-header":"true",className:"flex min-h-14 shrink-0 items-center gap-1 border-b border-border/15 px-2 sm:min-h-16 sm:gap-3 sm:px-6",children:[!S&&e.jsx("button",{type:"button","aria-label":"打开会话侧栏",className:"inline-flex min-h-11 min-w-11 items-center justify-center rounded-lg text-muted-foreground hover:bg-surface-2",onClick:p,children:e.jsx(ee,{size:17})}),e.jsx(se,{size:18,className:"hidden shrink-0 text-primary sm:block"}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("h2",{ref:g,tabIndex:-1,className:"truncate text-base font-semibold outline-none",children:m?.name??"协作工作区"}),e.jsx("p",{className:"text-[11px] text-muted-foreground",children:m?`${m.sessionIds.length} 位成员`:"正在连接工作组"})]}),h&&e.jsx("button",{type:"button","aria-label":"文件侧栏",title:"文件侧栏","aria-pressed":b,className:`inline-flex min-h-11 min-w-11 items-center justify-center rounded-lg ${b?"bg-surface-2 text-primary":"text-muted-foreground hover:bg-surface-2"}`,onClick:h,children:e.jsx(te,{size:17})}),e.jsxs("button",{type:"button","aria-label":a?`打开终端:${d?.name??"当前会话"}`:"选择终端",title:a?`切换到${d?.name??"当前终端会话"},保留看板位置与消息草稿`:"从会话列表选择要打开的终端",className:"inline-flex min-h-11 min-w-11 max-w-[40%] items-center justify-center gap-2 rounded-lg px-2 text-xs text-muted-foreground hover:bg-surface-2",onClick:()=>{a?n.getState().terminal():p()},children:[e.jsx(Q,{size:17,className:"shrink-0"}),e.jsx("span",{className:"hidden min-w-0 truncate sm:inline",children:Y}),e.jsx("span",{className:"sm:hidden",children:a?"终端":"选择终端"})]})]}),e.jsxs("div",{className:"flex min-h-0 flex-1 flex-col px-4 py-2 sm:px-6",children:[(L||v(c))&&e.jsxs("div",{role:"status",className:"mb-2 flex shrink-0 items-center gap-2 text-xs text-muted-foreground",children:[e.jsx(E,{size:13,className:o==="offline"?"":"animate-spin"}),e.jsx("span",{children:o==="offline"?"网络已断开,联网后自动恢复":"正在恢复连接,当前结果和草稿已保留"})]}),(y||c&&o==="ready"&&!v(c))&&e.jsxs("div",{role:"alert",className:"mb-3 flex shrink-0 items-center gap-2 rounded-lg bg-destructive/10 p-3 text-xs text-destructive",children:[e.jsx("span",{className:"flex-1",children:y||c}),e.jsx("button",{type:"button","aria-label":"重新加载协作组",className:"min-h-11 px-3",onClick:()=>{u()},children:e.jsx(E,{size:14})})]}),x&&e.jsx("p",{role:"status",className:"mb-3 shrink-0 text-xs text-primary",children:x}),r?m?e.jsx(ae,{fullWorkspace:!0,initialView:A,active:!0,notice:x,groups:r.groups,sessions:r.sessions,agents:D,sessionsState:"loaded",selectedGroupId:M,setSelectedGroupId:W,initialGroupId:l,activeSessionId:a,initialDrafts:V,onDraftChange:w,docked:!1,inputKeySuffix:"main",floatingVisible:!0,floating:!1,onOpenSession:k,onOpenTaskSession:k,onDockMessages:a?async()=>{await ne(l,a)}:void 0,defaultSessionMode:R,busy:$,setBusy:G,setError:T,setNotice:z,refresh:u}):e.jsx("p",{className:"py-10 text-center text-sm text-muted-foreground",children:"协作组已移除或暂不可用。任务记录仍保留在原服务中。"}):e.jsx("p",{role:"status",className:"py-10 text-center text-sm text-muted-foreground",children:"正在加载协作工作区…"})]})]})}export{xe as default};
@@ -0,0 +1,2 @@
1
+ import{bA as r}from"./app-aNkllBsm.js";import{b as m}from"./dnd-BCFAPC0L.js";import{b as n}from"./RightSidebar-scaBEaFJ.js";import"./react-XDCjal2T.js";import"./terminal-C7X98Amf.js";import"./App-JL8Fd8uO.js";import"./gestureArbiter-4NWfZprH.js";import"./triangle-alert-rgLWcpfP.js";import"./referenceLongPress-Bln9X6SW.js";import"./DiffReview-BPHfC8nZ.js";import"./sparkles-kooHQYLJ.js";import"./DiffViewer-C4S3oEQV.js";import"./ChangeWalkthroughPanel-BF3p_M6Y.js";function g({content:o}){const e=m.useMemo(()=>n(o.split(`
2
+ `),null,null),[o]);return r.jsx("div",{className:"min-w-0 space-y-3 break-words text-sm leading-6 text-foreground [&_h1]:text-lg [&_h2]:text-base [&_h3]:text-sm [&_pre]:max-w-full [&_table]:text-xs",children:e.map((t,i)=>r.jsx("div",{className:"min-w-0",children:typeof t.content=="function"?t.content(null):t.content},i))})}export{g as default};
@@ -0,0 +1,6 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/rdpSession-B6j6_C4D.js","assets/app-aNkllBsm.js","assets/react-XDCjal2T.js","assets/dnd-BCFAPC0L.js","assets/terminal-C7X98Amf.js","assets/index-e1PkqIqN.css","assets/ChangeWalkthroughPanel-BF3p_M6Y.js","assets/sparkles-kooHQYLJ.js","assets/triangle-alert-rgLWcpfP.js","assets/App-JL8Fd8uO.js","assets/gestureArbiter-4NWfZprH.js","assets/gestureArbiter-C2J0D0kV.css","assets/referenceLongPress-Bln9X6SW.js"])))=>i.map(i=>d[i]);
2
+ import{ah as Ge,cz as Yt,df as At,bA as r,a4 as Xt,cw as He,bz as nt,W as Et,o as kt,l as Wt,X as qt,_ as jt}from"./app-aNkllBsm.js";import{b as i,r as ot}from"./dnd-BCFAPC0L.js";import{a as Gt}from"./ChangeWalkthroughPanel-BF3p_M6Y.js";import{s as Nt,Y as St,K as Ye,j as st}from"./App-JL8Fd8uO.js";import{M as Zt}from"./triangle-alert-rgLWcpfP.js";const Jt=[["path",{d:"M4.037 4.688a.495.495 0 0 1 .651-.651l16 6.5a.5.5 0 0 1-.063.947l-6.124 1.58a2 2 0 0 0-1.438 1.435l-1.579 6.126a.5.5 0 0 1-.947.063z",key:"edeuup"}]],Qt=Ge("mouse-pointer-2",Jt);const er=[["path",{d:"M14 17H5",key:"gfn3mx"}],["path",{d:"M19 7h-9",key:"6i9tg"}],["circle",{cx:"17",cy:"17",r:"3",key:"18b49y"}],["circle",{cx:"7",cy:"7",r:"3",key:"dfmy0x"}]],tr=Ge("settings-2",er);const rr=[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["line",{x1:"21",x2:"16.65",y1:"21",y2:"16.65",key:"13gj7c"}],["line",{x1:"11",x2:"11",y1:"8",y2:"14",key:"1vmskp"}],["line",{x1:"8",x2:"14",y1:"11",y2:"11",key:"durymu"}]],nr=Ge("zoom-in",rr);const or=[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["line",{x1:"21",x2:"16.65",y1:"21",y2:"16.65",key:"13gj7c"}],["line",{x1:"8",x2:"14",y1:"11",y2:"11",key:"durymu"}]],sr=Ge("zoom-out",or);function it(n){const t=n==="darwin"?"mac":n==="win32"?"windows":"linux",a={host:"127.0.0.1",platform:t,protocol:t==="mac"?"vnc":"rdp",port:"3389",username:"",domain:"",ignoreCert:!1,rememberLogin:!0};return{target:"local",local:a,remote:{...a,host:""},viewOnly:!1,fit:!0,autoConnect:!0}}function Tt(n,t){const a=it(t);if(!n||typeof n!="object")return a;const o=n,f=(x,c)=>{const m=x&&typeof x=="object"?x:{},E=(p,y)=>typeof m[p]=="string"&&m[p].length<=y&&!/[\x00-\x1f]/.test(m[p])?m[p]:c[p];return{host:E("host",253),username:E("username",255),domain:E("domain",255),platform:["mac","linux","windows"].includes(String(m.platform))?m.platform:c.platform,protocol:m.protocol==="rdp"||m.protocol==="vnc"?m.protocol:c.protocol,port:typeof m.port=="string"&&/^\d{0,5}$/.test(m.port)&&Number(m.port)<=65535?m.port:c.port,ignoreCert:m.ignoreCert===!0,rememberLogin:m.rememberLogin!==!1}};return{target:o.target==="remote"?"remote":"local",local:{...f(o.local,a.local),host:"127.0.0.1"},remote:f(o.remote,a.remote),viewOnly:o.viewOnly===!0,fit:o.fit!==!1,autoConnect:o.autoConnect!==!1}}function _t(n){return JSON.stringify([n.host.trim().toLowerCase(),n.protocol,n.protocol==="vnc"?5900:Number(n.port),n.username.trim(),n.domain.trim()])}function ar(n){const[t,a]=i.useState(it),[o,f]=i.useState(!1),[x,c]=i.useState("loading"),[m,E]=i.useState(0),[p,y]=i.useState([]),[w,h]=i.useState("idle"),b=i.useRef(t),z=i.useRef(0),T=i.useRef(0),g=i.useRef(""),N=i.useRef(null),F=i.useRef(new Set),j=i.useCallback(A=>{b.current=A(b.current),z.current++,a(b.current),c("saving")},[]);i.useEffect(()=>{const A=++T.current;z.current=0,g.current="",N.current=null,b.current=it(),a(b.current),f(!1),c("loading"),y([]),h("idle");const d=new AbortController;return fetch("/api/computer/preferences",{signal:d.signal}).then(async k=>{if(!k.ok)throw new Error("PREFERENCES_LOAD_FAILED");return await k.json()}).then(k=>{if(A!==T.current||d.signal.aborted)return;let _=Tt(k.preferences);const v=z.current>0;if(!k.configured&&!v)try{const P=localStorage.getItem(`termdock:computer-host:${n}`);if(P){const D=/^(127\.0\.0\.1|localhost|::1|\[::1\])$/i.test(P)?"local":"remote";_=Tt({..._,target:D,[D]:{..._[D],host:P,platform:localStorage.getItem(`termdock:computer-platform:${n}`)||_[D].platform,protocol:localStorage.getItem(`termdock:computer-protocol:${n}`)||"vnc",port:localStorage.getItem(`termdock:computer-rdp-port:${n}`)||"3389"}}),z.current++}}catch{}v||(b.current=_),g.current=k.configured?JSON.stringify(_):"",a(b.current),f(!0),c(k.configured?"saved":"saving"),y(Array.isArray(k.credentialKeys)?k.credentialKeys.filter(P=>typeof P=="string"):[]),h(k.credentialError?"error":"idle")}).catch(()=>{!d.signal.aborted&&A===T.current&&c("error")}),()=>{++T.current,d.abort();for(const k of F.current)k.abort();F.current.clear()}},[n,m]);const L=i.useCallback(()=>{if(N.current)return N.current;if(!o)return Promise.resolve(!1);const A=T.current,d=(async()=>{for(;g.current!==JSON.stringify(b.current);){const k=JSON.stringify(b.current),_=new AbortController;F.current.add(_),c("saving");try{if(!(await fetch("/api/computer/preferences",{method:"PUT",headers:{"Content-Type":"application/json"},body:k,signal:_.signal})).ok)throw new Error("PREFERENCES_SAVE_FAILED");if(A!==T.current)return!1;g.current=k}catch{return A===T.current&&c("error"),!1}finally{F.current.delete(_)}}return A===T.current&&c("saved"),!0})();return N.current=d,d.finally(()=>{N.current===d&&(N.current=null)}),d},[o]);i.useEffect(()=>{if(!o||g.current===JSON.stringify(t))return;const A=setTimeout(()=>{L()},300);return()=>clearTimeout(A)},[o,t,L]);const H=i.useCallback(async(A,d,k)=>{const _=T.current,v=new AbortController;A!=="use"&&h("saving");try{if(!await L()||_!==T.current)throw new Error("COMPUTER_CREDENTIALS_FAILED");F.current.add(v);const P=await fetch(`/api/computer/credentials/${A}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({profile:d,...A==="save"?{password:k}:{}}),signal:v.signal});if(_!==T.current)throw new Error("COMPUTER_CREDENTIALS_FAILED");if(!P.ok)throw new Error(A==="use"&&P.status===404?"COMPUTER_CREDENTIALS_MISSING":"COMPUTER_CREDENTIALS_FAILED");const V=await P.json();if(_!==T.current)throw new Error("COMPUTER_CREDENTIALS_FAILED");const D=_t(d);if(A==="save"&&y(ce=>[...new Set([...ce,D])]),A==="forget"&&y(ce=>ce.filter(J=>J!==D)),A==="use"&&(typeof V.password!="string"||!V.password))throw new Error("COMPUTER_CREDENTIALS_MISSING");return h("idle"),V.password}catch(P){throw _===T.current&&!v.signal.aborted&&h("error"),P}finally{F.current.delete(v)}},[L]);return{preferences:t,change:j,loaded:o,saveState:x,flush:L,credentialKeys:p,loginState:w,credentialRequest:H,retry:()=>o?void L():E(A=>A+1)}}const cr=1464686180;function ir(n){if(n.length<4||n[0]!==2)return n;const t=new DataView(n.buffer,n.byteOffset,n.byteLength),a=t.getUint16(2);if(n.length!==4+a*4)return n;const o=[];for(let c=4;c<n.length;c+=4){const m=t.getInt32(c);m!==cr&&o.push(m)}if(o.length===a)return n;const f=new Uint8Array(4+o.length*4),x=new DataView(f.buffer);return f.set(n.subarray(0,2)),x.setUint16(2,o.length),o.forEach((c,m)=>x.setInt32(4+m*4,c)),f}function lr(n,t){const a=n,o=a._sendEncodings;a._sendEncodings=()=>t.withMacCursorEncodings(()=>o.call(n))}class ur{binaryType="arraybuffer";protocol="";CONNECTING=0;OPEN=1;CLOSING=2;CLOSED=3;onopen=null;onmessage=null;onerror=null;onclose=null;socket;sendingMacEncodings=!1;withMacCursorEncodings(t){const a=this.sendingMacEncodings;this.sendingMacEncodings=!0;try{t()}finally{this.sendingMacEncodings=a}}get readyState(){return this.socket.readyState}constructor(t,a){this.socket=Yt(`/api/computer/ws?host=${encodeURIComponent(t)}`),this.socket.onopen=o=>this.onopen?.(o),this.socket.onerror=o=>this.onerror?.(o),this.socket.onclose=o=>{(o.code!==1e3||o.reason)&&a(o.reason||"COMPUTER_DISCONNECTED"),this.onclose?.(o)},this.socket.onmessage=o=>{try{const f=JSON.parse(o.data);if(f.type!=="data"||typeof f.data!="string"||!Number.isSafeInteger(f.seq))throw new Error("Invalid VNC record");const x=Uint8Array.from(atob(f.data),c=>c.charCodeAt(0));this.onmessage?.(new MessageEvent("message",{data:x.buffer})),this.socket.readyState===1&&this.socket.send(JSON.stringify({type:"ack",seq:f.seq}))}catch{a("COMPUTER_INVALID_MESSAGE"),this.close(),this.onclose?.(new CloseEvent("close",{code:4400}))}}}send(t){let a=ArrayBuffer.isView(t)?new Uint8Array(t.buffer,t.byteOffset,t.byteLength):new Uint8Array(t);this.sendingMacEncodings&&(a=ir(a));for(let o=0;o<a.length;o+=32*1024){const f=a.subarray(o,o+32768);let x="";for(const c of f)x+=String.fromCharCode(c);this.socket.send(JSON.stringify({type:"data",data:btoa(x)}))}}close(){this.socket.close()}}function dr(n){return n==="mac"||n==="linux"||n==="windows"}function pr(n){const t=n==="mac"?[65513,"MetaLeft"]:[65507,"ControlLeft"],a=n==="mac"?t:[65515,"MetaLeft"];return{escape:[[65307,"Escape"]],enter:[[65293,"Enter"]],backspace:[[65288,"Backspace"]],tab:[n==="mac"?t:[65513,"AltLeft"],[65289,"Tab"]],search:n==="mac"?[a,[32,"Space"]]:[a],copy:[t,[99,"KeyC"]],paste:[t,[118,"KeyV"]],up:[[65362,"ArrowUp"]],down:[[65364,"ArrowDown"]],left:[[65361,"ArrowLeft"]],right:[[65363,"ArrowRight"]]}}function mr(n){n._cursor?._hideCursor?.()}function fr(n){const t=n;return{position:()=>({x:Number.isFinite(t._mousePos.x)?t._display.absX(t._mousePos.x):t._fbWidth/2,y:Number.isFinite(t._mousePos.y)?t._display.absY(t._mousePos.y):t._fbHeight/2}),size:()=>({width:t._fbWidth,height:t._fbHeight}),surface:()=>t._canvas,send:(a,o,f)=>{const x=t._display.scale,c=(a-t._display.absX(0))*x,m=(o-t._display.absY(0))*x;t._mousePos={x:c,y:m},t._mouseMoveTimer!==null&&clearTimeout(t._mouseMoveTimer),t._mouseMoveTimer=null,t._mouseButtonMask=f,t._mouseLastMoveTime=Date.now(),t._sendMouse(c,m,f);const E=t._canvas.getBoundingClientRect();t._cursor?.move(E.left+c,E.top+m)}}}function hr(n,t,a){const o=new AbortController,f=new Set,x=new Set;let c,m,E=!1,p=performance.now();const y=()=>f.size>0||x.size>0,w=g=>{c=void 0,!(E||!y())&&(performance.now()-p>1e3||(a.record("browser-frame",{time:g,interval:m===void 0?null:g-m,logical:t.position?.(),renderer:t.observeCursor?.()}),m=g,c=requestAnimationFrame(w)))},h=()=>{y()?c===void 0&&(m=void 0,c=requestAnimationFrame(w)):(c!==void 0&&cancelAnimationFrame(c),c=void 0,m=void 0)},b=g=>{if(g.pointerType!=="touch"&&g.pointerType!=="pen")return;p=performance.now(),g.type==="pointerdown"?f.add(g.pointerId):(g.type==="pointerup"||g.type==="pointercancel"||g.type==="lostpointercapture")&&f.delete(g.pointerId);const N=g.getCoalescedEvents?.()??[];a.record("raw-pointer",{type:g.type,time:g.timeStamp,id:g.pointerId,pointerType:g.pointerType,client:[g.clientX,g.clientY],trusted:g.isTrusted,coalesced:N.slice(-16).map(F=>[F.timeStamp,F.clientX,F.clientY])}),h()},z=g=>{p=performance.now(),x.clear();for(const N of Array.from(g.touches))x.add(N.identifier);a.record("raw-touch",{type:g.type,time:g.timeStamp,trusted:g.isTrusted,touches:Array.from(g.touches,N=>[N.identifier,N.clientX,N.clientY]),changed:Array.from(g.changedTouches,N=>[N.identifier,N.clientX,N.clientY])}),h()},T={capture:!0,passive:!0,signal:o.signal};for(const g of["pointerdown","pointermove","pointerup","pointercancel","lostpointercapture"])n.addEventListener(g,b,T);for(const g of["touchstart","touchmove","touchend","touchcancel"])n.addEventListener(g,z,T);return a.record("observation-start",{version:2,pointerEvents:typeof PointerEvent<"u",touchEvents:"ontouchstart"in window}),()=>{E=!0,o.abort(),c!==void 0&&cancelAnimationFrame(c),a.record("observation-stop"),a.flush("observation-stop")}}const Mt="termdock:computer-touch-mode:v1";function gr(){try{const n=localStorage.getItem(Mt);if(n==="trackpad"||n==="direct")return n}catch{}return navigator.maxTouchPoints>0&&window.matchMedia("(any-pointer: coarse)").matches?"trackpad":"direct"}function xr(n){try{localStorage.setItem(Mt,n)}catch{}}const Ke=8,br=300,yr=450,at=18,wr=50,Xe=(n,t)=>Math.max(0,Math.min(n,Math.max(0,t-1)));function vr(n,t,a,o={}){const f=new AbortController,x=o.trace?hr(n,t,o.trace):void 0,c=new Map;let m=0,E=0,p=!1,y=!1,w=!1,h=!1,b=0,z=1,T="pending",g=[],N={x:0,y:0},F={x:0,y:0},j,L=0,H=0,A,d=!0,k,_=!1;const v=()=>{const s=t.size(),l=a.current??={x:s.width/2,y:s.height/2};return l.x=Xe(l.x,s.width),l.y=Xe(l.y,s.height),l};let P;const V=()=>{const s=t.size();if((!P||P.width!==s.width||P.height!==s.height)&&(d=!0),!d&&P)return P;const l=t.surface(),C=n.getBoundingClientRect(),K=l.getBoundingClientRect(),O=[];for(let I=l.parentElement;I&&I!==n;I=I.parentElement){const se=getComputedStyle(I),Y=/auto|scroll/.test(se.overflowX)?Math.max(0,I.scrollWidth-I.clientWidth):0,ye=/auto|scroll/.test(se.overflowY)?Math.max(0,I.scrollHeight-I.clientHeight):0;if(!Y&&!ye)continue;const Ne=I.getBoundingClientRect();O.push({element:I,left:Ne.left-C.left,top:Ne.top-C.top,right:Ne.right-C.left,bottom:Ne.bottom-C.top,maxX:Y,maxY:ye})}return P={...s,left:K.left-C.left,top:K.top-C.top,scaleX:s.width&&K.width?K.width/s.width:1,scaleY:s.height&&K.height?K.height/s.height:1,viewportWidth:C.width,viewportHeight:C.height,clientLeft:C.left,clientTop:C.top,scrollers:O},d=!1,P},D=(s,l)=>{if(!o.trace)return;const C=P;o.trace.record(s,{mode:o.mode,pointerType:l?.pointerType,pointerId:l?.pointerId,client:l?[l.clientX,l.clientY]:void 0,inputTime:l?.timeStamp,target:a.current?[a.current.x,a.current.y]:null,actual:t.position?.(),buttons:H,fingers:c.size,moved:p,pinching:h,scrolling:w,zoom:o.zoom?.get(),scale:C?[C.scaleX,C.scaleY]:void 0,surface:C?[C.left,C.top,C.width,C.height]:void 0,viewport:C?[C.clientLeft,C.clientTop,C.viewportWidth,C.viewportHeight]:void 0})};o.trace?.record("touchpad-attached",{mode:o.mode,viewOnly:o.viewOnly});const ce=()=>{const s=V(),l=v();if(!s.width||!s.height||h||o.viewOnly)return;let C=s.left+l.x*s.scaleX,K=s.top+l.y*s.scaleY;for(const O of s.scrollers){if(O.maxX){const I=O.element.scrollLeft,se=C<O.left+20?C-O.left-20:C>O.right-20?C-O.right+20:0,Y=Math.max(0,Math.min(O.maxX,I+se));I!==Y&&(O.element.scrollLeft=Y,C-=Y-I,s.left-=Y-I)}if(O.maxY){const I=O.element.scrollTop,se=K<O.top+20?K-O.top-20:K>O.bottom-20?K-O.bottom+20:0,Y=Math.max(0,Math.min(O.maxY,I+se));I!==Y&&(O.element.scrollTop=Y,K-=Y-I,s.top-=Y-I)}}},J=(s=H)=>{if(o.viewOnly)return;const l=v(),C=o.trace?t.position?.():void 0;t.send(Math.round(l.x),Math.round(l.y),s),o.trace?.record("send",{target:[Math.round(l.x),Math.round(l.y)],buttons:s,before:C,after:t.position?.()})},Ie=()=>{A=void 0,ce();let s=0;for(;Math.abs(L)>=at&&s++<8;){const l=L>0?16:8;J(l),J(0),L-=Math.sign(L)*at}},Ae=(s=!1)=>{_||!s&&Math.abs(L)<at&&!P?.scrollers.length||(A??=requestAnimationFrame(Ie))},Ue=()=>{A!==void 0&&(cancelAnimationFrame(A),Ie())},Oe=()=>{A!==void 0&&cancelAnimationFrame(A),A=void 0,L=0},je=()=>{clearTimeout(k),Ue(),H&&(H=0,J())},B=s=>{s.cancelable&&s.preventDefault(),s.stopImmediatePropagation()},_e=()=>{const[s,l]=[...c.values()];return{distance:Math.hypot(s.x-l.x,s.y-l.y),x:(s.x+l.x)/2,y:(s.y+l.y)/2}},pe=(s=!1)=>{if(_||y||c.size!==2||E!==2)return;const l=_e();if(T==="pending"){const C=[...c.values()].map((Y,ye)=>({x:Y.x-g[ye].x,y:Y.y-g[ye].y})),K=C.map(Y=>Math.hypot(Y.x,Y.y));if(Math.max(...K)<Ke)return;if(!s&&Math.min(...K)<Ke){j??=setTimeout(()=>{j=void 0,pe(!0)},wr);return}clearTimeout(j),j=void 0;const O=Math.abs(l.distance-b),I=C[0].x*C[1].x+C[0].y*C[1].y<0,se=Math.min(...K)>=Ke?I:O>Math.max(Math.abs(l.x-N.x),Math.abs(l.y-N.y));T=o.zoom&&O>=Ke&&se?"pinch":o.mode==="direct"&&o.zoom&&o.zoom.get()>1?"pan":"scroll",h=T==="pinch",p=!0,D("two-finger-classified")}T==="pinch"&&b>0?(o.zoom?.set(z*l.distance/b,l),o.zoom?.pan(l.x-F.x,l.y-F.y),d=!0):T==="pan"?(o.zoom?.pan(l.x-F.x,l.y-F.y),d=!0):L+=F.y-l.y,F=l,Ae()},Z=s=>{const l=V();a.current={x:Xe((s.clientX-l.clientLeft-l.left)/l.scaleX,l.width),y:Xe((s.clientY-l.clientTop-l.top)/l.scaleY,l.height)}},$=s=>{if(!(s.pointerType!=="touch"&&s.pointerType!=="pen")){B(s),c.size||(d=!0,clearTimeout(j),j=void 0,m=performance.now(),E=0,p=!1,y=!1,w=!1,h=!1,L=0,o.mode==="direct"?Z(s):t.position&&(a.current={...t.position()},v())),c.set(s.pointerId,{x:s.clientX,y:s.clientY,startX:s.clientX,startY:s.clientY}),E=Math.max(E,c.size),D("down",s);try{n.setPointerCapture(s.pointerId)}catch{}if(clearTimeout(k),c.size===1&&E===1)k=setTimeout(()=>{!_&&c.size===1&&!p&&!y&&(H=1,J())},yr);else if(je(),w=!0,c.size===2&&E===2){const l=_e();b=l.distance,z=o.zoom?.get()??1,N=F=l,T="pending",g=[...c.values()].map(({x:C,y:K})=>({x:C,y:K}))}else y=!0,clearTimeout(j),j=void 0}},re=s=>{if(s.pointerType==="mouse")return;const l=c.get(s.pointerId);if(!l)return;B(s);const C=s.clientX-l.x,K=s.clientY-l.y;if(l.x=s.clientX,l.y=s.clientY,D("move-input",s),Math.hypot(l.x-l.startX,l.y-l.startY)>Ke&&(p=!0,clearTimeout(k)),c.size===2&&!y)pe();else if(c.size===1&&!w&&!y){if(o.mode==="direct"){Z(s),p&&(H=1),J(),Ae();return}const O=v(),I=V();O.x+=C/I.scaleX,O.y+=K/I.scaleY,v(),J(),Ae()}},ne=s=>{if(!c.has(s.pointerId))return;B(s),D(s.type,s),clearTimeout(j),j=void 0;const l=H!==0;s.type!=="pointerup"&&(y=!0,Oe()),je(),c.delete(s.pointerId);try{n.hasPointerCapture(s.pointerId)&&n.releasePointerCapture(s.pointerId)}catch{}c.size||(L=0,!y&&!l&&!p&&E<=2&&performance.now()-m<=br&&(o.mode!=="direct"||E===1)&&(J(E===2?4:1),J(0)),D("gesture-end",s),o.trace?.flush("gesture-end"))},oe=()=>{y=!0,Oe(),clearTimeout(j),j=void 0,je();const s=[...c.keys()];c.clear(),L=0;for(const l of s)try{n.hasPointerCapture(l)&&n.releasePointerCapture(l)}catch{}},be={capture:!0,passive:!1,signal:f.signal};n.addEventListener("pointerdown",$,be),n.addEventListener("pointermove",re,be),n.addEventListener("pointerup",ne,be),n.addEventListener("pointercancel",ne,be),n.addEventListener("lostpointercapture",ne,be);for(const s of["touchstart","touchmove","touchend","touchcancel","contextmenu"])n.addEventListener(s,B,be);const Me=()=>{d=!0,Ae(!0)};n.addEventListener("scroll",Me,{capture:!0,signal:f.signal}),window.addEventListener("blur",oe,{signal:f.signal});const Q=()=>{document.hidden&&oe()};document.addEventListener("visibilitychange",Q,{signal:f.signal});const ie=new ResizeObserver(Me);return ie.observe(n),ie.observe(t.surface()),!a.current&&t.position&&(a.current={...t.position()}),ce(),()=>{_||(_=!0,D("touchpad-detached"),f.abort(),oe(),ie.disconnect(),x?.(),o.trace?.flush("touchpad-detached"))}}function Cr(n,t){n=Math.max(1,n||1280),t=Math.max(1,t||800);const a=Math.max(1,640/n,480/t);return{width:Math.max(640,Math.min(2560,Math.round(n*a))),height:Math.max(480,Math.min(1600,Math.round(t*a)))}}function Er(n,t){const a=Array.from(n),o=Array.from(t);let f=0;for(;f<a.length&&f<o.length&&a[f]===o[f];)f++;return{backspaces:a.length-f,text:o.slice(f).join("")}}const ct="​",kr={Enter:"enter",Backspace:"backspace",Delete:"delete",Tab:"tab",ArrowUp:"up",ArrowDown:"down",ArrowLeft:"left",ArrowRight:"right"};function jr({sendText:n,sendKey:t,sendChord:a,pasteText:o,commandKey:f=[65515,"MetaLeft"],inputRef:x,onFocusChange:c}){const{t:m}=At(),E=i.useRef(null),p=i.useRef(!1),y=x??E,w=i.useRef({sendText:n,sendKey:t});w.current={sendText:n,sendKey:t};const h=i.useRef(""),b=i.useRef(!1),z=i.useRef(),[T,g]=i.useState(!1),N=()=>(y.current?.value||"").replace(/^\u200b/,""),F=d=>{if(h.current=Array.from(d).slice(-256).join(""),y.current){y.current.value=ct+h.current;const k=y.current.value.length;y.current.setSelectionRange(k,k)}g(!!h.current)},j=()=>F(""),L=()=>{if(p.current)return;const d=N(),k=Er(h.current,d);F(d);for(let _=0;_<k.backspaces;_++)w.current.sendKey("backspace");k.text&&w.current.sendText(k.text)},H=()=>{p.current||L()},A=d=>{H(),d==="backspace"?F(Array.from(h.current).slice(0,-1).join("")):j(),w.current.sendKey(d)};return i.useLayoutEffect(()=>{const d=y.current;d.value=ct,d.setSelectionRange(1,1),d.focus({preventScroll:!0});const k=v=>{if(p.current||v.isComposing)return;const P=v.inputType==="deleteContentBackward"?"backspace":v.inputType==="deleteContentForward"?"delete":null;if(P){if(P==="backspace"&&h.current)return;v.preventDefault(),A(P);return}["insertLineBreak","insertParagraph"].includes(v.inputType)&&(v.preventDefault(),b.current||A("enter"),b.current=!1)},_=()=>{p.current||j()};return d.addEventListener("beforeinput",k),d.addEventListener("termdock:computer-input-reset",_),()=>{d.removeEventListener("beforeinput",k),d.removeEventListener("termdock:computer-input-reset",_),clearTimeout(z.current)}},[]),r.jsxs("div",{className:"relative shrink-0 border-t border-border bg-surface px-2 py-1",children:[!T&&r.jsx("span",{"aria-hidden":"true",className:"pointer-events-none absolute inset-y-1 left-5 flex items-center truncate pr-5 text-sm text-muted-foreground",children:m("computer.keyboardPlaceholder")}),r.jsx("input",{ref:y,className:"min-h-11 w-full rounded-md border border-border bg-background px-3 text-base outline-none focus:border-primary","aria-label":m("computer.keyboardInput"),autoCapitalize:"none",autoCorrect:"off",autoComplete:"off",spellCheck:!1,inputMode:"text",enterKeyHint:"enter",maxLength:1025,defaultValue:ct,onPaste:d=>{if(p.current||!d.clipboardData.types.includes("text/plain"))return;d.preventDefault(),H(),j();const k=d.clipboardData.getData("text/plain");o?o(k):w.current.sendText(k)},onChange:d=>{g(!!d.target.value.replace(/^\u200b/,"")),!(p.current||d.nativeEvent.isComposing)&&(d.nativeEvent.inputType==="deleteContentBackward"&&!h.current&&!d.target.value?A("backspace"):L())},onCompositionStart:()=>{p.current=!0,b.current=!1},onCompositionEnd:()=>{p.current=!1,L(),b.current=!0,clearTimeout(z.current),z.current=setTimeout(()=>{b.current=!1},0)},onFocus:()=>c?.(!0),onBlur:()=>{p.current||(H(),j()),c?.(!1)},onKeyDown:d=>{if(p.current||d.nativeEvent.isComposing||d.keyCode===229)return;const k=d.ctrlKey||d.altKey||d.metaKey,_=(d.ctrlKey||d.metaKey)&&!d.altKey&&d.key.toLowerCase()==="v";if(a&&!_&&!d.getModifierState("AltGraph")&&(k||d.shiftKey)){const V={Enter:65293,Backspace:65288,Delete:65535,Tab:65289,ArrowUp:65362,ArrowDown:65364,ArrowLeft:65361,ArrowRight:65363,Home:65360,End:65367,PageUp:65365,PageDown:65366}[d.key]??(k&&d.key.length===1?d.key.toLowerCase().codePointAt(0):void 0);if(V!==void 0){d.preventDefault(),H();const D=[];d.ctrlKey&&D.push([65507,"ControlLeft"]),d.altKey&&D.push([65513,"AltLeft"]),d.metaKey&&!D.some(([ce])=>ce===f[0])&&D.push(f),d.shiftKey&&D.push([65505,"ShiftLeft"]),D.push([V,d.code||d.key]),j(),a(D);return}}const v=kr[d.key];v&&(d.preventDefault(),A(v))}})]})}function Nr(n){let t=[],a=null;const o=new Map,f=()=>{a=null,t.splice(0,32).forEach(x=>{n(x),x[2]?o.set(x[0],x):o.delete(x[0])}),t.length&&(a=requestAnimationFrame(f))};return{send(x){t.push(...x),a===null&&f()},clear(){a!==null&&cancelAnimationFrame(a),a=null,t=[];const x=[...o.values()].reverse();o.clear();for(const[c,m]of x)try{n([c,m,!1])}catch{}}}}const Sr=n=>Math.max(1,Math.min(8,Number.isFinite(n)?n:1));function Tr(n,t){let a=1;const o="viewportZoom"in n,f=n,x=()=>o?n.pointerTarget.surface():f._canvas,c=()=>o?n.viewportScroller:f._screen,m=o?void 0:f._updateScale;return m&&(f._updateScale=function(){m.call(f),f._display.scale*=a}),{get:()=>a,set(E,p){const y=Sr(E),w=x(),h=c(),b=w.getBoundingClientRect(),z=h.getBoundingClientRect(),T=p??{x:z.left+z.width/2,y:z.top+z.height/2},g={x:(T.x-b.left)/(b.width||1),y:(T.y-b.top)/(b.height||1)};a=y,o?n.viewportZoom=a:f._updateScale();const N=w.getBoundingClientRect();h.scrollLeft+=N.left+g.x*N.width-T.x,h.scrollTop+=N.top+g.y*N.height-T.y,a===1&&(h.scrollLeft=0,h.scrollTop=0),t(a)},pan(E,p){const y=c();y.scrollLeft-=E,y.scrollTop-=p},dispose(){m&&(f._updateScale=m)}}}function Lr(n,t){const a=n,o=a._keyboard,f=o._target,x=n.focus,c=document.createElement("textarea");c.tabIndex=-1,c.setAttribute("aria-label","Remote desktop keyboard"),c.autocapitalize="off",c.autocomplete="off",c.spellcheck=!1,Object.assign(c.style,{position:"absolute",left:"0",top:"0",width:"1px",height:"1px",fontSize:"16px",opacity:"0",pointerEvents:"none"}),a._screen.append(c);const m=new AbortController;let E=!1,p=null,y=!1;const w=()=>{a._mouseMoveTimer!==null&&clearTimeout(a._mouseMoveTimer),a._mouseMoveTimer=null,a._mouseButtonMask&&(a._mouseButtonMask=0,a._sendMouse(a._mousePos.x,a._mousePos.y,0))};window.addEventListener("blur",w,{signal:m.signal}),document.addEventListener("visibilitychange",()=>{document.hidden&&(o._allKeysUp(),w())},{signal:m.signal});const h=()=>{p!==null&&cancelAnimationFrame(p),p=null;const b=c.value;c.value="",b&&!n.viewOnly&&t(b)};return c.addEventListener("keydown",b=>{(E||b.isComposing||b.keyCode===229)&&b.stopImmediatePropagation()},{capture:!0,signal:m.signal}),c.addEventListener("compositionstart",()=>{p!==null&&h(),E=!0,o._allKeysUp()},{signal:m.signal}),c.addEventListener("compositionend",()=>{E=!1,p!==null&&cancelAnimationFrame(p),p=requestAnimationFrame(h)},{signal:m.signal}),c.addEventListener("input",b=>{!E&&!b.isComposing&&p===null&&h()},{signal:m.signal}),c.addEventListener("blur",()=>{!E&&p!==null&&h(),o._allKeysUp()},{signal:m.signal}),o.ungrab(),o._target=c,n.viewOnly||o.grab(),n.focus=b=>{!y&&!n.viewOnly&&c.focus(b)},document.activeElement===f&&n.focus({preventScroll:!0}),()=>{y||(y=!0,p!==null&&(E?cancelAnimationFrame(p):h()),w(),m.abort(),o.ungrab(),o._target=f,n.viewOnly||o.grab(),n.focus=x,c.remove())}}function*Lt(n){for(const t of n.replace(/\r\n?/g,`
3
+ `)){const a=t.codePointAt(0);yield t===`
4
+ `?65293:t===" "?65289:a<256?a:16777216|a}}const qe=1048576,Rt="termdock:computer-copy";function Ar(n,t,a){const o=new AbortController;let f=!1,x=-1/0,c=!0;const m=new Set,E=h=>{if(!(h.ctrlKey||h.metaKey)||h.altKey||h.isComposing)return;const b=h.key.toLowerCase();b==="v"?(f=h.shiftKey,m.add(h.code||h.key),h.stopImmediatePropagation()):(b==="c"||b==="x")&&(x=performance.now())},p=h=>{h.preventDefault(),h.stopImmediatePropagation();const b=h.clipboardData;if(!b||!Array.from(b.types).includes("text/plain")){a.failed();return}const z=b.getData("text/plain");if(z.length>qe){a.failed();return}try{a.paste(z,f)}catch{a.failed()}f=!1},y=h=>{const b=h.detail?.text;if(typeof b!="string"||b.length>qe){a.failed();return}a.receive(b),performance.now()-x<2e3&&(x=-1/0,navigator.clipboard?.writeText?navigator.clipboard.writeText(b).catch(()=>{c&&a.failed()}):a.failed())},w={capture:!0,signal:o.signal};return n.addEventListener(Rt,()=>{x=performance.now()},w),n.addEventListener("keydown",E,w),n.addEventListener("keyup",h=>{m.delete(h.code||h.key)&&h.stopImmediatePropagation()},w),n.addEventListener("paste",p,w),t.addEventListener("clipboard",y,{signal:o.signal}),t.addEventListener("clipboarderror",a.failed,{signal:o.signal}),window.addEventListener("blur",()=>{m.clear(),f=!1,x=-1/0},{signal:o.signal}),()=>{c=!1,o.abort()}}function _r(){try{if(sessionStorage.getItem("termdock:computer-motion-trace")==="1")return Mr()}catch{}}function Mr(){const n=performance.now(),t=n+15*6e4,a=`motion-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;let o=[],f=0,x=0,c=!1,m;const E=p=>{if(clearTimeout(m),m=void 0,!o.length)return;const y=o;o=[];for(let w=0;w<y.length;w+=64)Xt("info","COMPUTER_MOTION_TRACE",{version:2,id:a,sequence:++x,startedAt:performance.timeOrigin+n,reason:p,dropped:w?0:f,samples:y.slice(w,w+64)});f=0};return{record(p,y={}){if(c)return;const w=performance.now()-n;if(performance.now()>=t){E("expired"),c=!0;return}o.length>=8192&&(o.splice(2048,1),f++),o.push([Math.round(w*10)/10,p,y]),clearTimeout(m),m=setTimeout(()=>E("idle"),750)},flush:E,dispose(){c||(c=!0,E("dispose"))}}}const ge="inline-flex min-h-9 items-center justify-center gap-1.5 rounded-md border border-border px-2.5 text-xs hover:bg-surface-2 disabled:opacity-40",xe="min-h-11 w-full rounded-md border border-border bg-background px-2 text-sm outline-none focus:border-primary";function We(n){return/API_NOT_ALLOWED|AUTHORIZATION|revoked|PAIRING/.test(n)?"computer.permission":n.includes("RDP_BACKEND_UNAVAILABLE")?"computer.rdpBackendUnavailable":n.includes("RDP_CERTIFICATE")?"computer.rdpCertificate":n.includes("CREDENTIALS_MISSING")?"computer.loginExpired":n.includes("CREDENTIALS_FAILED")?"computer.loginSaveFailed":n.includes("AUTH_FAILED")?"computer.authFailed":n.includes("RDP_FAILED")?"computer.rdpFailed":n.includes("SCREEN_SHARING_OFF")?"computer.sharingOff":n.includes("PRIVATE_HOST_ONLY")?"computer.privateOnly":n.includes("INVALID_HOST")?"computer.invalidHost":n.includes("TIMEOUT")?"computer.timeout":n.includes("UNREACHABLE")?"computer.unreachable":n.includes("DISCONNECTED")?"computer.disconnected":"computer.failed"}const Pt=30*6e4;function Rr({active:n=!0}){const{t}=At(),a=i.useMemo(()=>_r(),[]);i.useEffect(()=>(a?.record("panel-open",{viewport:[window.innerWidth,window.innerHeight],dpr:window.devicePixelRatio}),a?.flush("panel-open"),()=>a?.dispose()),[a]);const[o,f]=i.useState(()=>He()?.targetPeerId??""),[x,c]=i.useState(null),{preferences:m,change:E,loaded:p,saveState:y,flush:w,retry:h,credentialKeys:b,loginState:z,credentialRequest:T}=ar(o),g=m.target==="local",N=m[m.target],{host:F,platform:j,protocol:L,port:H,domain:A,ignoreCert:d,username:k}=N,_=L==="rdp"&&x?.rdpAvailable===!1,{viewOnly:v,fit:P}=m,V=N.rememberLogin&&b.includes(_t(N)),D=e=>E(u=>({...u,[u.target]:{...u[u.target],...e}})),ce=e=>D({username:e}),J=e=>D({domain:e}),Ie=e=>{D({ignoreCert:e}),w()},Ae=e=>D({port:e}),Ue=e=>{e&&(fe.current(),Te.clear(),l(null)),E(u=>({...u,viewOnly:e})),w()},[Oe,je]=i.useState(!1),B=pr(j),_e=j==="mac"?"⌘V":"Ctrl+V",[pe,Z]=i.useState(""),[$,re]=i.useState("idle"),[ne,oe]=i.useState(null),[be,Me]=i.useState(""),[Q,ie]=i.useState(!1),[s,l]=i.useState(null),C=i.useRef(null),[K,O]=i.useState([]);i.useEffect(()=>{O([])},[s,v,o]);const[I,se]=i.useState(!1),[Y,ye]=i.useState(!1),Ne=i.useRef(0),[q,Dt]=i.useState(()=>navigator.maxTouchPoints>0||window.innerWidth<=640);i.useEffect(()=>{const e=()=>Dt(navigator.maxTouchPoints>0||window.innerWidth<=640);return window.addEventListener("resize",e),()=>window.removeEventListener("resize",e)},[]);const $e=s==="keyboard"&&I&&(!q||!window.visualViewport||Y),[ze,lt]=i.useState(1),le=i.useRef(null),ut=i.useRef(null),[Se,dt]=i.useState(""),[It,we]=i.useState(!1),[Ze,pt]=i.useState(null),[Ot,ee]=i.useState(!1),[zt,Je]=i.useState(!1),[Ft,Kt]=i.useState(!1),[me,Ut]=i.useState(gr),mt=i.useRef(null),fe=i.useRef(()=>{}),Re=i.useRef(()=>{}),[W,$t]=i.useState(nt),Pe=i.useRef(!1),ve=i.useRef(""),ft=i.useRef(()=>{}),ht=i.useRef(null),Ve=i.useRef(null),ue=i.useMemo(()=>{const e=document.createElement("div");return e.className="h-full w-full min-h-0 overflow-hidden",e},[]),U=i.useRef(null),Qe=i.useRef(!1);Qe.current=n&&W&&$==="connected"&&!v;const Te=i.useMemo(()=>Nr(([e,u,S])=>U.current?.sendKey(e,u,S)),[]),et=i.useRef(null),he=i.useRef(0),tt=i.useRef(void 0),de=i.useCallback(()=>{fe.current(),Re.current(),le.current?.dispose(),le.current=null,Te.clear(),mt.current=null,he.current++,clearTimeout(tt.current);const e=U.current;U.current=null,e?.disconnect(),et.current?.close(),et.current=null,ue.replaceChildren()},[ue,Te]);i.useLayoutEffect(()=>(Ve.current?.appendChild(ue),()=>{ue.remove()}),[ue,Q]),i.useEffect(()=>()=>de(),[de]),i.useEffect(()=>{const e=()=>{const u=nt();$t(u),!u&&(ie(!1),l(null))};return window.addEventListener(Et,e),()=>window.removeEventListener(Et,e)},[]),i.useEffect(()=>{if(n&&W||(fe.current(),Re.current(),Te.clear(),ie(!1),l(null),$==="idle"||$==="error"))return;const e=setTimeout(()=>{Pe.current=!1,ve.current="",de(),re("idle"),Z("")},Pt);return()=>clearTimeout(e)},[n,W,$,de,Te]),i.useEffect(()=>{const e=()=>f(He()?.targetPeerId??"");return window.addEventListener(kt,e),()=>window.removeEventListener(kt,e)},[]),i.useEffect(()=>{de(),Pe.current=!1,ve.current="",re("idle"),oe(null),Z(""),c(null),ie(!1),l(null),je(!1),Me(""),dt(""),we(!1);const e=new AbortController;return fetch("/api/computer/status",{signal:e.signal}).then(async u=>{if(!u.ok)throw new Error(u.status===403?"API_NOT_ALLOWED":"COMPUTER_FAILED");return await u.json()}).then(u=>{e.signal.aborted||c(u)}).catch(u=>{e.signal.aborted||oe(We(String(u)))}),()=>{e.abort(),de()}},[o,de]),i.useEffect(()=>{const e=U.current;(v||!n||!W)&&Re.current(),e&&((!n||!W)&&!("pointerTarget"in e)&&mr(e),e.viewOnly=v||!n||!W)},[v,n,W,$]),i.useEffect(()=>{U.current&&(U.current.scaleViewport=P)},[P]),i.useEffect(()=>{U.current&&"pauseResize"in U.current&&(U.current.pauseResize=!!s||!n||!W)},[s,n,W,$]),i.useEffect(()=>{const e=U.current;e&&("keyboardActive"in e?e.keyboardActive=s==="keyboard":e.focusOnClick=s!=="keyboard")},[s]);const gt=e=>{e===g||G||!p||(Z(""),oe(null),E(u=>({...u,target:e?"local":"remote"})),w())},xt=()=>{Pe.current=!0,ve.current="",de(),re("idle"),Z(""),ie(!1),l(null),we(!1)},bt=async e=>{if(e?.preventDefault(),_)return;if(Pe.current=!0,$==="credentials"&&U.current&&"sendCredentials"in U.current){ve.current=pe,U.current.sendCredentials({username:k,password:pe}),re("connecting");return}if(!n||!nt()||!p||!pe&&!V)return;w(),pt(null),ee(!1),Je(!1),de(),oe(null),Me(""),re("connecting"),we(!1);const u=he.current,S=M=>{u===he.current&&(de(),re("error"),oe(M),l(null),ve.current="",(M==="computer.authFailed"||M==="computer.permission"||M==="computer.loginExpired")&&Z(""),V&&(M==="computer.authFailed"||M==="computer.loginExpired")&&T("forget",N).catch(()=>{}))};tt.current=setTimeout(()=>S("computer.timeout"),6e4);try{let M=pe||await T("use",N);if(u!==he.current)return;ve.current=M||"";let X;if(L==="rdp"){const{RdpSession:te}=await jt(async()=>{const{RdpSession:Le}=await import("./rdpSession-B6j6_C4D.js");return{RdpSession:Le}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12]));if(u!==he.current)return;document.activeElement?.blur?.(),ot.flushSync(()=>{re("connecting")});const Ee=Ve.current?.getBoundingClientRect(),ke=Cr(Ee?.width||1280,Ee?.height||800);X=new te(ue,{host:F.trim(),port:Number(H),username:k.trim(),password:M||"",domain:A.trim(),ignoreCert:d,...ke},Le=>S(We(Le)),a)}else{const{default:te}=await jt(async()=>{const{default:Le}=await import("./rfb-CxsXsMUX.js");return{default:Le}},[]);if(u!==he.current)return;const Ee=new ur(F.trim(),Le=>S(We(Le)));et.current=Ee;const ke=new te(ue,Ee,{shared:!0,credentials:{username:k.trim()||void 0,password:M}});j==="mac"&&lr(ke,Ee),ke.background="var(--chrome-bg)",ke.resizeSession=!1,ke.qualityLevel=6,ke.compressionLevel=2,X=ke}M=void 0,U.current=X,X.scaleViewport=P,X.viewOnly=v,X.addEventListener("connect",()=>{if(u!==he.current)return;clearTimeout(tt.current),re("connected"),Z(""),window.innerWidth<=640&&document.activeElement?.blur?.();const te=ve.current;ve.current="",N.rememberLogin&&te&&T("save",N,te).catch(()=>{})}),X.addEventListener("credentialsrequired",te=>{if(u!==he.current)return;const Ee=te.detail.types;Kt(Ee.includes("username")),re("credentials")}),X.addEventListener("securityfailure",()=>S("computer.authFailed")),X.addEventListener("disconnect",()=>S("computer.disconnected")),X.addEventListener("desktopname",te=>{u===he.current&&Me(te.detail.name)})}catch(M){S(We(String(M)))}},Fe=e=>{const u=U.current;!n||!W||!u||$!=="connected"||v||(s==="keyboard"?C.current?.focus({preventScroll:!0}):s!=="clipboard"&&!q&&u.focus?.({preventScroll:!0}),Te.send([...e.map(([S,M])=>[S,M,!0]),...[...e].reverse().map(([S,M])=>[S,M,!1])]))},R=$==="connected",G=$==="connecting"||$==="credentials",Be=R||$==="connecting";i.useEffect(()=>{const e=U.current;if(!R||!e||!("viewportZoom"in e)&&!("_display"in e))return;const u=Tr(e,lt);return le.current=u,lt(1),()=>{u.dispose(),le.current===u&&(le.current=null)}},[R]),i.useEffect(()=>{const e=U.current,u=Ve.current;if(!n||!W||!R||s&&s!=="keyboard"||me!=="trackpad"&&!(navigator.maxTouchPoints>0)||!e||!u)return;const S="pointerTarget"in e?e.pointerTarget:fr(e),M=vr(u,S,mt,{mode:me,zoom:le.current??void 0,viewOnly:v,trace:a});return fe.current=M,()=>{M(),fe.current===M&&(fe.current=()=>{})}},[n,W,R,v,me,Q,s,a]),i.useEffect(()=>{const e=U.current;if(!(!n||!W||!R||v||!e))return Ar(ue,e,{paste:(u,S)=>{e.clipboardPasteFrom(u),Fe(S?[...B.paste.slice(0,1),[65505,"ShiftLeft"],...B.paste.slice(1)]:B.paste),we(!0),ee(!1)},receive:u=>{pt(u),Je(!1)},failed:()=>{ee(!0),l("clipboard")}})},[n,W,R,v,j,ue]),i.useEffect(()=>{const e=U.current;if(!n||!W||!R||v||!e||"pointerTarget"in e||!("_keyboard"in e))return;const u=Lr(e,rt);return Re.current=u,()=>{u(),Re.current===u&&(Re.current=()=>{})}},[n,W,R,v]);const yt=e=>{e!==me&&(fe.current(),Ut(e),xr(e))};ft.current=()=>{bt()},i.useEffect(()=>{n&&W&&p&&x&&!_&&m.autoConnect&&V&&$==="idle"&&!Pe.current&&ft.current()},[n,W,p,x,_,m.autoConnect,V,$]);const wt=()=>{Pe.current=!0,T("forget",N).catch(()=>{})},Ce=e=>{if(e==="keyboard"){if(s==="keyboard"&&!$e){C.current?.blur(),C.current?.focus({preventScroll:!0});return}fe.current(),Ne.current=window.visualViewport?.height??window.innerHeight,ot.flushSync(()=>{se(!1),ye(!1),l(u=>u===e?null:e)})}else fe.current(),l(u=>u===e?null:e)},ae=e=>{C.current?.dispatchEvent(new Event("termdock:computer-input-reset"));const u=[...K,...e].filter(([S],M,X)=>X.findIndex(([te])=>te===S)===M);u.some(([S])=>S===B.copy[0][0])&&u.some(([S])=>S===99||S===120)&&ue.dispatchEvent(new Event(Rt)),O([]),Fe(u)},Vt=()=>{le.current?.set(1),E(e=>({...e,fit:!0})),w()},rt=e=>{if(!U.current||!Qe.current)return;const u=[];for(const S of Lt(e))u.push([S,null,!0],[S,null,!1]);Te.send(u)},Bt=e=>{if(!(!U.current||!Qe.current))try{if(e.length>qe)throw new Error("Clipboard limit");U.current.clipboardPasteFrom(e),ae(B.paste),ee(!1),we(!0)}catch{ee(!0),l("clipboard")}},Ht=e=>{if(!K.length){rt(e);return}const[u,...S]=Array.from(e);u&&ae([[Array.from(Lt(u))[0],""]]),S.length&&rt(S.join(""))};i.useEffect(()=>{if(!R||s!=="keyboard"&&s!=="clipboard"||!window.visualViewport)return;const e=window.visualViewport,u=ut.current,S=()=>{if(s==="keyboard"&&ye(I&&Ne.current-e.height>100),u&&e.height>=160)if(Q)u.style.height=`${e.height}px`,u.style.top=`${e.offsetTop}px`;else{const M=e.offsetTop+e.height,X=Math.max(0,M-u.getBoundingClientRect().top);u.style.height=`${Math.min(u.parentElement?.clientHeight||X,X)}px`}};return S(),e.addEventListener("resize",S),e.addEventListener("scroll",S),()=>{e.removeEventListener("resize",S),e.removeEventListener("scroll",S),u&&(u.style.height="",u.style.top="")}},[R,s,Q,I]);const vt=r.jsxs("div",{className:"flex shrink-0 items-center text-xs",role:"group","aria-label":t("computer.desktopZoom"),title:q?t("computer.pinchHint"):void 0,children:[r.jsx("button",{type:"button",className:"flex min-h-11 min-w-11 items-center justify-center","aria-label":t("computer.zoomOut"),disabled:!R||ze<=1,onPointerDown:e=>e.preventDefault(),onClick:()=>le.current?.set(ze/1.25),children:r.jsx(sr,{size:16})}),r.jsxs("button",{type:"button",className:"min-h-11 min-w-11","aria-label":t("computer.resetZoom"),disabled:!R,onPointerDown:e=>e.preventDefault(),onClick:Vt,children:[Math.round(ze*100),"%"]}),r.jsx("button",{type:"button",className:"flex min-h-11 min-w-11 items-center justify-center","aria-label":t("computer.zoomIn"),disabled:!R||ze>=8,onPointerDown:e=>e.preventDefault(),onClick:()=>le.current?.set(ze*1.25),children:r.jsx(nr,{size:16})}),q&&r.jsx("span",{className:"hidden pr-2 text-[10px] text-muted-foreground sm:inline",children:t("computer.pinchHint")})]}),De=`flex shrink-0 items-center justify-center rounded-md hover:bg-surface-2 focus-visible:outline focus-visible:outline-2 focus-visible:outline-primary ${q?"min-h-11 min-w-11":"h-8 min-w-8"}`,Ct=r.jsxs("div",{ref:ut,className:`flex min-h-0 flex-col bg-surface text-foreground ${Q?"fixed inset-0 z-modal-panel h-dvh pb-[env(safe-area-inset-bottom)] pt-[env(safe-area-inset-top)]":"relative h-full"}`,role:Q?"dialog":void 0,"aria-modal":Q||void 0,"aria-label":t("computer.title"),onKeyDown:e=>{e.stopPropagation(),e.key==="Escape"&&!e.nativeEvent.isComposing&&s&&(e.preventDefault(),l(null))},onKeyUp:e=>e.stopPropagation(),children:[r.jsxs("div",{className:`relative z-30 flex shrink-0 items-center gap-2 border-b border-border bg-surface px-2 ${q?"min-h-12":"min-h-8"}`,children:[Q&&r.jsx("button",{type:"button",className:De,onClick:()=>{ie(!1),l(null)},"aria-label":t("computer.exitFullscreen"),children:r.jsx(Gt,{size:20})}),r.jsx(Wt,{size:16,className:"shrink-0 text-muted-foreground"}),r.jsx("span",{className:"min-w-0 flex-1 truncate text-xs font-medium",children:R&&(be||(g?x?.hostname||He()?.serviceName:F))||t("computer.title")}),R&&r.jsx("span",{className:"text-[11px] text-primary",children:t("computer.connected")}),R&&z==="error"&&r.jsx("span",{role:"alert",className:"text-[11px] text-destructive",children:t("computer.loginSaveFailed")}),R&&y==="saving"&&r.jsx("span",{role:"status","aria-label":t("computer.settingsSaving"),title:t("computer.settingsSaving"),children:r.jsx(Nt,{size:12,className:"animate-spin text-muted-foreground"})}),R&&y==="error"&&r.jsxs("button",{type:"button",className:ge,title:t("computer.settingsSaveFailed"),"aria-label":t("computer.settingsSaveFailed"),onClick:h,children:["! ",t("computer.retry")]}),G&&r.jsxs("button",{type:"button",className:`${De} gap-1 px-1 text-xs`,onClick:xt,children:[r.jsx(St,{size:14}),t("computer.cancel")]}),R&&!q&&s==="keyboard"&&r.jsx("button",{type:"button",className:De,onPointerDown:e=>e.preventDefault(),onClick:()=>Ce("keyboard"),"aria-label":t("computer.keyboard"),"aria-pressed":$e,children:r.jsx(Ye,{size:18})}),R&&!q&&r.jsx("button",{type:"button",className:`${De} ${s==="clipboard"?"bg-surface-2 text-primary":""}`,disabled:v,onClick:()=>Ce("clipboard"),"aria-label":t("computer.clipboardTool"),title:t("computer.clipboardTool"),"aria-pressed":s==="clipboard",children:r.jsx(st,{size:18})}),R&&!Q&&r.jsxs("button",{type:"button",className:`${De} gap-1 px-1 text-xs`,onClick:()=>ie(!0),"aria-label":t("computer.fullscreen"),children:[r.jsx(Zt,{size:16}),t("computer.expand")]}),R&&r.jsx("button",{type:"button",className:De,onClick:()=>Ce("tools"),"aria-label":t("computer.tools"),"aria-expanded":s==="tools",children:r.jsx(tr,{size:18})})]}),!Be&&r.jsx("div",{className:"min-h-0 flex-1 overflow-y-auto p-4 sm:p-6",children:r.jsxs("div",{className:"mx-auto w-full max-w-md",children:[r.jsxs("form",{className:"space-y-3",onSubmit:e=>{bt(e)},children:[r.jsxs("div",{className:"grid grid-cols-2 gap-1 rounded-lg bg-background p-1",role:"group","aria-label":t("computer.target"),children:[r.jsx("button",{type:"button",className:`min-h-11 rounded-md px-3 text-sm font-medium ${g?"bg-surface-2 text-foreground":"text-muted-foreground hover:bg-surface"}`,"aria-pressed":g,disabled:G||!x||!p,onClick:()=>gt(!0),children:t("computer.thisComputer")}),r.jsx("button",{type:"button",className:`min-h-11 rounded-md px-3 text-sm font-medium ${g?"text-muted-foreground hover:bg-surface":"bg-surface-2 text-foreground"}`,"aria-pressed":!g,disabled:G||!p,onClick:()=>gt(!1),children:t("computer.otherComputer")})]}),g?r.jsx("p",{className:"text-xs leading-relaxed text-muted-foreground",role:"status",children:x?t("computer.localService",{name:He()?.serviceName||x.hostname}):t("computer.loading")}):r.jsxs("label",{className:"block space-y-1 text-xs",children:[r.jsx("span",{children:t("computer.host")}),r.jsx("input",{className:xe,value:F,disabled:G||!p,onChange:e=>{D({host:e.target.value,domain:"",ignoreCert:!1}),Z(""),oe(null)},placeholder:t("computer.hostPlaceholder"),onBlur:()=>{w()},autoCapitalize:"none",autoCorrect:"off",spellCheck:!1,required:!0,maxLength:253})]}),r.jsxs("p",{className:"text-xs text-muted-foreground",children:[j==="mac"?"macOS":j==="linux"?"Ubuntu / Linux":"Windows"," · ",L.toUpperCase()," · ",L==="rdp"?H||"3389":"5900",v?` · ${t("computer.viewOnly")}`:""]}),r.jsxs("label",{className:"block space-y-1 text-xs",children:[r.jsx("span",{children:t(L==="rdp"?"computer.rdpUsername":"computer.username")}),r.jsx("input",{className:xe,value:k,disabled:!p,onChange:e=>ce(e.target.value),onBlur:()=>{w()},autoCapitalize:"none",autoCorrect:"off",autoComplete:"off",required:L==="rdp"||$==="credentials"&&Ft,maxLength:255})]}),r.jsxs("label",{className:"block space-y-1 text-xs",children:[r.jsx("span",{children:t("computer.password")}),r.jsx("input",{className:xe,type:"password",value:pe,disabled:!p,onChange:e=>Z(e.target.value),placeholder:V&&$!=="credentials"?t("computer.savedPassword"):void 0,autoComplete:"new-password",required:!V||$==="credentials",maxLength:1024})]}),r.jsx("p",{className:"text-[11px] leading-relaxed text-muted-foreground",children:t(L==="rdp"?"computer.rdpLoginHint":"computer.vncLoginHint")}),r.jsxs("div",{className:"flex min-h-11 items-center justify-between gap-2 text-xs",children:[r.jsxs("label",{className:"flex min-h-11 items-center gap-2",children:[r.jsx("input",{type:"checkbox",checked:N.rememberLogin,disabled:G||!p||z==="saving",onChange:e=>{const u=e.target.checked;D({rememberLogin:u}),!u&&V?T("forget",{...N,rememberLogin:u}).catch(()=>{}):w()}}),t("computer.rememberLogin")]}),V&&r.jsx("button",{type:"button",className:"min-h-11 text-muted-foreground underline",disabled:G||z==="saving",onClick:wt,children:t("computer.forgetLogin")})]}),z==="error"&&!ne&&r.jsx("p",{role:"alert",className:"text-xs text-destructive",children:t("computer.loginSaveFailed")}),_&&r.jsxs("div",{role:"status",className:"space-y-1 text-xs leading-relaxed text-muted-foreground",children:[r.jsx("p",{children:t("computer.rdpBackendUnavailable")}),r.jsx("p",{children:t("computer.rdpBackendRecovery")})]}),$==="credentials"&&r.jsx("p",{className:"text-xs text-primary",children:t("computer.credentials")}),ne&&r.jsxs("div",{role:"alert",className:"rounded-md bg-surface-2 p-3 text-xs leading-relaxed text-destructive",children:[t(ne),ne==="computer.rdpCertificate"&&r.jsxs("label",{className:"mt-1 flex min-h-11 items-center gap-2 text-foreground",children:[r.jsx("input",{type:"checkbox",checked:d,onChange:e=>Ie(e.target.checked)}),t("computer.trustCertificateHere")]}),$==="error"&&ne!=="computer.rdpCertificate"&&r.jsx("button",{type:"button",className:"mt-1 block min-h-9 text-foreground underline",onClick:()=>{je(!0),requestAnimationFrame(()=>ht.current?.scrollIntoView?.({block:"nearest",behavior:"smooth"}))},children:t("computer.checkSettings")})]}),r.jsx("button",{type:"submit",className:"inline-flex min-h-11 w-full items-center justify-center gap-2 rounded-md bg-primary px-3 text-sm font-medium text-primary-foreground disabled:opacity-40",disabled:!p||_||z==="saving"||g&&!x||!F.trim()||!pe&&(!V||$==="credentials")||L==="rdp"&&(!k.trim()||!Number.isInteger(Number(H))||Number(H)<1||Number(H)>65535),children:t($==="credentials"?"computer.authenticate":$==="error"?"computer.retryConnect":"computer.connect")}),r.jsxs("details",{ref:ht,className:"border-b border-border text-xs",open:Oe,onToggle:e=>je(e.currentTarget.open),children:[r.jsxs("summary",{className:"flex min-h-11 cursor-pointer list-none items-center justify-between text-muted-foreground",children:[r.jsx("span",{children:t("computer.advanced")}),r.jsx("span",{"aria-hidden":"true",children:Oe?"−":"+"})]}),r.jsxs("div",{className:"space-y-3 pb-4",children:[r.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[r.jsxs("label",{className:"block space-y-1",children:[r.jsx("span",{children:t("computer.platform")}),r.jsxs("select",{className:xe,value:j,disabled:G||!p,onChange:e=>{dr(e.target.value)&&D({platform:e.target.value,protocol:e.target.value==="mac"?"vnc":"rdp",ignoreCert:!1}),Z(""),w()},children:[r.jsx("option",{value:"mac",children:"macOS"}),r.jsx("option",{value:"linux",children:"Ubuntu / Linux"}),r.jsx("option",{value:"windows",children:"Windows"})]})]}),r.jsxs("label",{className:"block space-y-1",children:[r.jsx("span",{children:t("computer.protocol")}),r.jsxs("select",{className:xe,value:L,disabled:G||!p,onChange:e=>{D({protocol:e.target.value==="rdp"?"rdp":"vnc"}),Z(""),oe(null),w()},children:[r.jsx("option",{value:"rdp",children:"RDP"}),r.jsx("option",{value:"vnc",children:"VNC"})]})]})]}),L==="rdp"&&r.jsxs(r.Fragment,{children:[r.jsxs("label",{className:"block space-y-1",children:[r.jsx("span",{children:t("computer.port")}),r.jsx("input",{className:xe,type:"number",min:1,max:65535,step:1,value:H,disabled:G||!p,onBlur:()=>{w()},onChange:e=>Ae(e.target.value)})]}),r.jsxs("label",{className:"block space-y-1",children:[r.jsx("span",{children:t("computer.domain")}),r.jsx("input",{className:xe,value:A,disabled:G||!p,onBlur:()=>{w()},onChange:e=>J(e.target.value),autoComplete:"off",maxLength:255})]}),r.jsxs("label",{className:"flex min-h-11 items-center gap-2",children:[r.jsx("input",{type:"checkbox",checked:d,disabled:G||!p,onChange:e=>Ie(e.target.checked)}),t("computer.trustCertificate")]})]}),r.jsxs("label",{className:"flex min-h-11 items-center gap-2",children:[r.jsx("input",{type:"checkbox",checked:v,disabled:G||!p,onChange:e=>Ue(e.target.checked)}),t("computer.viewOnly")]}),r.jsxs("label",{className:"flex min-h-11 items-center gap-2",children:[r.jsx("input",{type:"checkbox",checked:m.autoConnect,disabled:G||!p,onChange:e=>{E(u=>({...u,autoConnect:e.target.checked})),w()}}),t("computer.autoConnect")]})]})]})]}),r.jsxs("p",{role:"status",className:"mt-2 text-[11px] leading-relaxed text-muted-foreground",children:[t(y==="saved"?"computer.settingsSaved":y==="error"?p?"computer.settingsSaveFailed":"computer.settingsLoadFailed":y==="loading"?"computer.settingsLoading":"computer.settingsSaving"),y==="error"&&r.jsx("button",{type:"button",className:"ml-2 min-h-9 text-primary underline",onClick:h,children:t("computer.retry")})]}),r.jsxs("details",{className:"text-xs",children:[r.jsx("summary",{className:"flex min-h-11 cursor-pointer items-center text-muted-foreground",children:t("computer.setup")}),r.jsxs("ol",{className:"ml-4 list-decimal space-y-2 pt-2 leading-relaxed text-muted-foreground",children:[r.jsx("li",{children:t(L==="rdp"?j==="linux"?"computer.rdpLinuxStep1":"computer.rdpStep1":j==="mac"?"computer.step1":j==="linux"?"computer.linuxStep1":"computer.windowsStep1")}),r.jsx("li",{children:t(L==="rdp"?"computer.rdpStep2":j==="mac"?"computer.step2":j==="linux"?"computer.linuxStep2":"computer.windowsStep2")}),r.jsx("li",{children:t("computer.step3")})]}),L==="vnc"&&j==="linux"&&r.jsxs(r.Fragment,{children:[r.jsx("p",{className:"mt-3 leading-relaxed text-muted-foreground",children:t("computer.linuxCommandHint")}),r.jsx("pre",{className:"mt-2 overflow-x-auto rounded-md bg-background p-2 text-[11px]",children:r.jsx("code",{children:`sudo apt install x11vnc
5
+ x11vnc -storepasswd
6
+ x11vnc -display "$DISPLAY" -auth guess -localhost -usepw -forever -shared -rfbport 5900`})}),r.jsx("p",{className:"mt-2 leading-relaxed text-muted-foreground",children:t("computer.linuxProtocolHint")})]}),r.jsx("p",{className:"mt-3 leading-relaxed text-muted-foreground",children:t(L==="rdp"?"computer.rdpNetworkHint":"computer.networkHint")})]})]})}),R&&s==="tools"&&r.jsx("button",{type:"button",className:`absolute inset-x-0 ${q?"bottom-14 top-12":"bottom-0 top-8"} z-20 bg-background/40`,"aria-label":t("computer.returnToDesktop"),onClick:()=>l(null)}),R&&r.jsxs("div",{hidden:s!=="tools",className:`${s==="tools"?"flex":"hidden"} absolute inset-x-3 ${q?"top-14":"top-10"} z-30 max-h-[calc(100%-7rem)] flex-wrap items-center gap-3 overflow-y-auto rounded-lg border border-border bg-surface px-4 py-3 text-xs shadow-lg [&_button]:min-h-11 [&_select]:min-h-11 [&_label]:min-h-11`,role:"region","aria-label":t("computer.tools"),children:[r.jsxs("div",{className:"flex w-full items-center justify-between",children:[r.jsx("span",{className:"font-medium",children:t("computer.tools")}),r.jsx("button",{type:"button",className:"flex min-w-11 items-center justify-center","aria-label":t("computer.closeTools"),onClick:()=>l(null),children:r.jsx(qt,{size:18})})]}),q&&r.jsx("div",{className:"flex w-full items-center gap-2",children:r.jsx("div",{className:"inline-flex rounded-md bg-background p-0.5",role:"group","aria-label":t("computer.touchMode"),children:["trackpad","direct"].map(e=>r.jsx("button",{type:"button",className:`min-h-9 rounded px-3 text-xs ${me===e?"bg-surface-2 text-foreground":"text-muted-foreground hover:bg-surface"}`,"aria-pressed":me===e,onClick:()=>yt(e),children:t(e==="trackpad"?"computer.trackpadMode":"computer.directTouchMode")},e))})}),!q&&r.jsxs(r.Fragment,{children:[vt,r.jsxs("button",{type:"button",className:ge,disabled:v,onClick:()=>Ce("keyboard"),children:[r.jsx(Ye,{size:14}),t("computer.keyboard")]})]}),r.jsxs("label",{className:"flex min-h-9 items-center gap-1.5",children:[r.jsx("input",{type:"checkbox",checked:v,onChange:e=>Ue(e.target.checked)}),t("computer.viewOnly")]}),r.jsx("button",{type:"button",className:ge,onClick:()=>{le.current?.set(1),E(e=>({...e,fit:!e.fit})),w()},children:t(P?"computer.actualSize":"computer.fit")}),r.jsxs("select",{className:`${ge} min-w-0 bg-surface`,"aria-label":t("computer.shortcuts"),value:"",disabled:v,onChange:e=>{Fe(B[e.target.value]??[])},children:[r.jsx("option",{value:"",disabled:!0,children:t("computer.shortcuts")}),r.jsxs("option",{value:"tab",children:[j==="mac"?"⌘ Tab":"Alt+Tab"," · ",t("computer.switchApps")]}),r.jsxs("option",{value:"search",children:[j==="mac"?"⌘ Space":"Super / Win"," · ",t(j==="mac"?"computer.spotlight":"computer.systemSearch")]}),r.jsx("option",{value:"copy",children:j==="mac"?"⌘C":"Ctrl+C"}),r.jsx("option",{value:"paste",children:_e}),r.jsx("option",{value:"escape",children:"Esc"}),r.jsx("option",{value:"enter",children:"Enter"}),r.jsx("option",{value:"backspace",children:"⌫"}),r.jsx("option",{value:"up",children:"↑"}),r.jsx("option",{value:"down",children:"↓"}),r.jsx("option",{value:"left",children:"←"}),r.jsx("option",{value:"right",children:"→"})]}),r.jsxs("div",{className:"flex w-full items-center justify-between border-t border-border pt-2",children:[V&&r.jsx("button",{type:"button",className:ge,disabled:z==="saving",onClick:wt,children:t("computer.forgetLogin")}),r.jsxs("button",{type:"button",className:`${ge} ml-auto text-destructive`,onClick:xt,children:[r.jsx(St,{size:14}),t("computer.disconnect")]})]})]}),r.jsx("div",{ref:Ve,"data-sidebar-gesture-ignore":"",className:`relative z-10 min-h-0 flex-1 overflow-hidden bg-[var(--chrome-bg)] ${Be?"":"hidden"}`,onPointerDownCapture:()=>C.current?.dispatchEvent(new Event("termdock:computer-input-reset")),onMouseDownCapture:e=>{s==="keyboard"&&e.preventDefault()},style:{touchAction:R?"none":void 0},"aria-label":t("computer.remoteTitle"),children:!R&&Be&&r.jsxs("div",{role:"status",className:"absolute inset-0 z-20 flex items-center justify-center gap-2 bg-surface text-xs text-muted-foreground",children:[r.jsx(Nt,{size:16,className:"animate-spin"}),t("computer.connecting")]})}),r.jsx("div",{hidden:s!=="tools",children:R&&q&&!v&&r.jsx("p",{className:"shrink-0 border-t border-border px-2 py-1 text-[10px] leading-relaxed text-muted-foreground",children:t(me==="trackpad"?"computer.trackpadHint":"computer.directTouchHint")})}),R&&s==="keyboard"&&!v&&r.jsxs(r.Fragment,{children:[r.jsx(jr,{sendChord:ae,pasteText:Bt,commandKey:B.copy[0],inputRef:C,onFocusChange:se,sendText:Ht,sendKey:e=>(K.length?ae:Fe)(e==="tab"?[[65289,"Tab"]]:e==="delete"?[[65535,"Delete"]]:B[e])}),!q&&r.jsx("div",{className:"grid shrink-0 grid-cols-6 gap-1 bg-surface px-1",role:"group","aria-label":t("computer.keyboardNavigation"),children:["escape","left","down","up","right","selectAll"].map(e=>r.jsx("button",{type:"button",className:"min-h-11 rounded-md text-sm hover:bg-surface-2","aria-label":t(`computer.key${e[0].toUpperCase()}${e.slice(1)}`),onPointerDown:u=>u.preventDefault(),onClick:()=>ae(e==="selectAll"?[...B.copy.slice(0,1),[97,"KeyA"]]:B[e]),children:{escape:"Esc",left:"←",down:"↓",up:"↑",right:"→",selectAll:j==="mac"?"⌘A":"Ctrl+A"}[e]},e))})]}),R&&s==="clipboard"&&!v&&r.jsxs("form",{className:"shrink-0 space-y-2 border-t border-border p-3",onSubmit:e=>{if(e.preventDefault(),!(!Se||!U.current))try{U.current.clipboardPasteFrom(Se),we(!0),ee(!1)}catch{ee(!0)}},children:[r.jsx("textarea",{className:`${xe} min-w-0 resize-none py-2 text-base`,rows:2,"aria-label":t("computer.clipboard"),placeholder:t("computer.clipboardPlaceholder"),value:Se,onChange:e=>{dt(e.target.value),we(!1)},maxLength:qe}),r.jsxs("div",{className:"flex gap-2",children:[r.jsx("button",{type:"submit",className:`${ge} min-h-11 flex-1`,disabled:!Se,children:t("computer.clipboard")}),r.jsx("button",{type:"button",className:`${ge} min-h-11`,onClick:()=>{try{Se&&U.current?.clipboardPasteFrom(Se),Fe(B.paste),ee(!1),we(!!Se)}catch{ee(!0)}},children:_e})]}),r.jsx("p",{role:"status",className:"text-[10px] leading-relaxed text-muted-foreground",children:It?t("computer.clipboardSent"):t("computer.clipboardHint",{shortcut:_e})}),Ze!==null&&r.jsxs("div",{className:"space-y-1",children:[r.jsx("textarea",{className:`${xe} resize-none py-2 text-base`,rows:2,readOnly:!0,value:Ze,"aria-label":t("computer.remoteClipboard"),onFocus:e=>e.currentTarget.select()}),r.jsx("button",{type:"button",className:ge,onClick:()=>{if(!navigator.clipboard?.writeText){ee(!0);return}navigator.clipboard.writeText(Ze).then(()=>{Je(!0),ee(!1)},()=>ee(!0))},children:t(zt?"computer.clipboardCopied":"computer.copyToDevice")})]}),Ot&&r.jsx("p",{role:"alert",className:"text-xs text-destructive",children:t("computer.clipboardAccessFailed")}),ne&&r.jsx("p",{role:"alert",className:"text-xs text-destructive",children:t(ne)})]}),Be&&q&&r.jsx("div",{className:"relative z-30 flex shrink-0 items-center gap-1 border-t border-border bg-surface px-1 py-1 text-[11px]",children:s==="keyboard"?r.jsxs(r.Fragment,{children:[r.jsx("button",{type:"button",className:"flex min-h-11 min-w-11 items-center justify-center rounded-md bg-surface-2 text-primary",onPointerDown:e=>e.preventDefault(),onClick:()=>Ce("keyboard"),"aria-label":t("computer.keyboard"),title:t("computer.hideKeyboard"),"aria-pressed":$e,children:r.jsx(Ye,{size:18})}),r.jsx("button",{type:"button",className:"min-h-11 min-w-11 shrink-0 rounded-md",onClick:()=>Ce("clipboard"),"aria-label":t("computer.clipboardTool"),children:r.jsx(st,{size:18,className:"mx-auto"})}),r.jsxs("div",{className:"flex min-w-0 flex-1 items-center overflow-x-auto",role:"group","aria-label":t("computer.keyboardNavigation"),children:[r.jsx("button",{type:"button",className:"min-h-11 min-w-11 shrink-0 rounded-md px-2 text-sm",onPointerDown:e=>e.preventDefault(),onClick:()=>ae([[65289,"Tab"]]),children:"Tab"}),r.jsx("button",{type:"button",className:"min-h-11 min-w-11 shrink-0 rounded-md px-2 text-sm","aria-label":t("computer.keyEscape"),onPointerDown:e=>e.preventDefault(),onClick:()=>ae(B.escape),children:"Esc"}),[[65507,"ControlLeft","Ctrl"],[65513,"AltLeft","Alt"],[65505,"ShiftLeft","Shift"]].map(([e,u,S])=>r.jsx("button",{type:"button",className:`min-h-11 min-w-11 shrink-0 rounded-md px-2 text-sm ${K.some(([M])=>M===e)?"bg-surface-2 text-primary":""}`,"aria-pressed":K.some(([M])=>M===e),onPointerDown:M=>M.preventDefault(),onClick:()=>O(M=>M.some(([X])=>X===e)?M.filter(([X])=>X!==e):[...M,[e,u]]),children:S},u)),["selectAll","left","down","up","right"].map(e=>r.jsx("button",{type:"button",className:"min-h-11 min-w-11 shrink-0 rounded-md px-2 text-sm hover:bg-surface-2","aria-label":t(`computer.key${e[0].toUpperCase()}${e.slice(1)}`),onPointerDown:u=>u.preventDefault(),onClick:()=>ae(e==="selectAll"?[...B.copy.slice(0,1),[97,"KeyA"]]:B[e]),children:{left:"←",down:"↓",up:"↑",right:"→",selectAll:j==="mac"?"⌘A":"Ctrl+A"}[e]},e)),r.jsx("button",{type:"button",className:"min-h-11 min-w-11 shrink-0 rounded-md px-2",onPointerDown:e=>e.preventDefault(),onClick:()=>ae(B.copy),children:j==="mac"?"⌘C":"Ctrl+C"})]}),r.jsx("button",{type:"button",className:"min-h-11 min-w-11 shrink-0 rounded-md text-lg",onPointerDown:e=>e.preventDefault(),onClick:()=>ae(B.backspace),children:"⌫"}),r.jsx("button",{type:"button",className:"min-h-11 min-w-11 shrink-0 rounded-md text-lg",onPointerDown:e=>e.preventDefault(),onClick:()=>ae(B.enter),children:"↵"})]}):r.jsxs(r.Fragment,{children:[r.jsxs("div",{className:"grid min-w-0 flex-1 grid-cols-3",children:[r.jsxs("button",{type:"button",className:"flex min-h-11 flex-col items-center justify-center gap-0.5 rounded-md",disabled:!R||v,onClick:()=>Ce("keyboard"),"aria-pressed":$e,children:[r.jsx(Ye,{size:18}),t("computer.keyboard")]}),r.jsxs("button",{type:"button",className:`flex min-h-11 flex-col items-center justify-center gap-0.5 rounded-md ${s==="clipboard"?"bg-surface-2 text-primary":""}`,disabled:!R||v,onClick:()=>Ce("clipboard"),"aria-pressed":s==="clipboard",children:[r.jsx(st,{size:18}),t("computer.clipboardTool")]}),r.jsxs("button",{type:"button",className:"flex min-h-11 flex-col items-center justify-center gap-0.5 rounded-md",disabled:!R||v,onClick:()=>yt(me==="trackpad"?"direct":"trackpad"),"aria-label":t("computer.switchTouchMode"),children:[r.jsx(Qt,{size:18}),t(me==="trackpad"?"computer.trackpadMode":"computer.directTouchMode")]})]}),vt]})})]});return Q?ot.createPortal(Ct,document.body):Ct}const Fr=Object.freeze(Object.defineProperty({__proto__:null,COMPUTER_BACKGROUND_RETENTION_MS:Pt,default:Rr},Symbol.toStringTag,{value:"Module"}));export{qe as C,Fr as a,Lt as b,Cr as c};
@@ -1 +1 @@
1
- import{bA as t}from"./app-DNnVU3VK.js";import{C as s}from"./ChangeWalkthroughPanel-g83lCwJi.js";import"./react-XDCjal2T.js";import"./dnd-BCFAPC0L.js";import"./terminal-C7X98Amf.js";import"./sparkles-Cm9xs8pz.js";import"./triangle-alert-D1VnXjVL.js";const e="/tmp/termdock-dag-playground",i={version:1,id:"dag-playground",repoRoot:e,workspaceRoot:e,title:"改动解释升级为可点击导览",summary:"这是一页免登录 playground,用真实 ChangeWalkthroughPanel 调 DAG 的节点、边、label 和密度。",generatedBy:"dag-playground",injectedAt:Date.now(),highlights:[{what:"先看总览,再看链路",effect:"读者不用先进入 diff,也能理解整批改动目的。",tag:"理解"},{what:"多条链路直接画出来",effect:"分支、汇合、验证路径不再靠 next 文本猜。",tag:"链路"},{what:"点击节点跳回证据",effect:"导览和真实 diff 之间形成闭环。",tag:"导航"}],nodes:[{id:"export",title:"导出 section 级 diff",kind:"source",business:"CLI 把 hunk 拆成多个连续改动 section,并为每个 section 生成稳定 fingerprint。这里故意写长一点,用来验证 DAG 节点是否会按照真实文本高度撑开,而不是被固定高度裁掉。",anchor:{repoRoot:e,filePath:"src/server/cli.ts",hunkIndex:0,sectionIndex:0}},{id:"prompt",title:"约束 AI 输出",kind:"process",business:"提示词要求先写总览,再逐 section 生成解释。",anchor:{repoRoot:e,filePath:"src/lib/components/sidebar/RightSidebar.tsx",hunkIndex:0}},{id:"schema",title:"校验导览结构",kind:"process",business:"检查节点、边和锚点字段是否完整。",anchor:{repoRoot:e,filePath:"src/server/utils/changeAuditStore.ts",hunkIndex:0}},{id:"fallback",title:"补齐兼容字段",kind:"process",business:"旧版结果缺字段时生成稳定回退值。",anchor:{repoRoot:e,filePath:"src/server/utils/changeAuditStore.ts",hunkIndex:1}},{id:"store",title:"保存整批导览结构",kind:"process",business:"服务端把 walkthrough 作为一等数据持久化。",anchor:{repoRoot:e,filePath:"src/server/utils/changeAuditStore.ts",hunkIndex:0}},{id:"api",title:"前端读取总览",kind:"api",business:"一次请求拿到 records 和 walkthroughs。",anchor:{repoRoot:e,filePath:"src/lib/terminal/api.ts",hunkIndex:0}},{id:"panel",title:"渲染 DAG 导览",kind:"ui",business:"用节点和边表达实现链路,节点可点击。节点内容可能是一两句话,也可能包含较长的业务解释;布局需要先测量 DOM 高度,再重新计算每一行节点的 y 坐标和连线端点。",anchor:{repoRoot:e,filePath:"src/lib/components/sidebar/ChangeWalkthroughPanel.tsx",hunkIndex:0}},{id:"jump",title:"跳回真实 diff",kind:"ui",business:"点击节点后定位到文件、hunk 或 section。",anchor:{repoRoot:e,filePath:"src/lib/components/sidebar/RightSidebar.tsx",hunkIndex:1}},{id:"section",title:"贴近改动展示解释",kind:"ui",business:"section 解释跟在对应 diff 块后面,而不是堆在 hunk 顶部。这个节点也故意写得更长,用来观察右侧分支和下方验证节点的连线是否会避让变高后的卡片。",anchor:{repoRoot:e,filePath:"src/lib/components/sidebar/DiffViewer.tsx",hunkIndex:0,sectionIndex:1}},{id:"verify",title:"验证导出和注入",kind:"test",business:"跑 lint、install、health、资源检查和注入自测。"}],edges:[{from:"export",to:"prompt",label:"提供输入",desc:"sectionFingerprint 让 AI 可以稳定引用。"},{from:"export",to:"schema",label:"结构校验",desc:"先确认输入可以稳定落库。"},{from:"export",to:"fallback",label:"兼容旧数据",desc:"为历史记录补齐必要字段。"},{from:"prompt",to:"store",label:"注入",desc:"AI payload 写回本地服务。"},{from:"schema",to:"store",label:"通过后保存",desc:"合法结构进入存储层。"},{from:"fallback",to:"store",label:"归一化后保存",desc:"兼容数据与新数据走同一链路。"},{from:"store",to:"api",label:"读取",desc:"浏览器从服务端拿到导览。"},{from:"api",to:"panel",label:"渲染",desc:"结构化数据变成导览图。"},{from:"panel",to:"jump",label:"点击",desc:"节点驱动 diff 定位。"},{from:"jump",to:"section",label:"定位",desc:"落到对应 section 解释。"},{from:"export",to:"verify",label:"验证",desc:"导出结构要覆盖 tracked/untracked。"},{from:"section",to:"verify",label:"回归",desc:"确认展示位置和交互。"}],sections:[],risks:[{title:"边和 label 不能遮住节点主体。"},{title:"窄侧栏下横向滚动要可控。"}],checks:["在 360px、560px、900px 宽度下截图检查。","确认边的箭头、label 背板和节点层级清楚。","确认节点点击区域和 hover 状态可感知。"]};function p(){return t.jsx("div",{className:"min-h-screen bg-background p-5 text-foreground","data-dag-playground":!0,children:t.jsxs("div",{className:"mx-auto max-w-[72rem]",children:[t.jsxs("div",{className:"mb-3",children:[t.jsx("h1",{className:"text-sm font-semibold",children:"DAG Playground"}),t.jsx("p",{className:"mt-1 text-xs text-muted-foreground",children:"Auth-free playground for tuning the real ChangeWalkthroughPanel."})]}),t.jsxs("div",{className:"grid gap-4 lg:grid-cols-[360px_minmax(0,1fr)]",children:[t.jsx("div",{className:"min-w-0",children:t.jsx(s,{walkthroughs:[i],repoRoot:e,onNavigate:o=>{console.info("[DagPlayground] navigate",o)}})}),t.jsx("div",{className:"min-w-0",children:t.jsx(s,{walkthroughs:[i],repoRoot:e,onNavigate:o=>{console.info("[DagPlayground] navigate",o)}})})]})]})})}export{p as DagPlayground};
1
+ import{bA as t}from"./app-aNkllBsm.js";import{C as s}from"./ChangeWalkthroughPanel-BF3p_M6Y.js";import"./react-XDCjal2T.js";import"./dnd-BCFAPC0L.js";import"./terminal-C7X98Amf.js";import"./sparkles-kooHQYLJ.js";import"./triangle-alert-rgLWcpfP.js";const e="/tmp/termdock-dag-playground",i={version:1,id:"dag-playground",repoRoot:e,workspaceRoot:e,title:"改动解释升级为可点击导览",summary:"这是一页免登录 playground,用真实 ChangeWalkthroughPanel 调 DAG 的节点、边、label 和密度。",generatedBy:"dag-playground",injectedAt:Date.now(),highlights:[{what:"先看总览,再看链路",effect:"读者不用先进入 diff,也能理解整批改动目的。",tag:"理解"},{what:"多条链路直接画出来",effect:"分支、汇合、验证路径不再靠 next 文本猜。",tag:"链路"},{what:"点击节点跳回证据",effect:"导览和真实 diff 之间形成闭环。",tag:"导航"}],nodes:[{id:"export",title:"导出 section 级 diff",kind:"source",business:"CLI 把 hunk 拆成多个连续改动 section,并为每个 section 生成稳定 fingerprint。这里故意写长一点,用来验证 DAG 节点是否会按照真实文本高度撑开,而不是被固定高度裁掉。",anchor:{repoRoot:e,filePath:"src/server/cli.ts",hunkIndex:0,sectionIndex:0}},{id:"prompt",title:"约束 AI 输出",kind:"process",business:"提示词要求先写总览,再逐 section 生成解释。",anchor:{repoRoot:e,filePath:"src/lib/components/sidebar/RightSidebar.tsx",hunkIndex:0}},{id:"schema",title:"校验导览结构",kind:"process",business:"检查节点、边和锚点字段是否完整。",anchor:{repoRoot:e,filePath:"src/server/utils/changeAuditStore.ts",hunkIndex:0}},{id:"fallback",title:"补齐兼容字段",kind:"process",business:"旧版结果缺字段时生成稳定回退值。",anchor:{repoRoot:e,filePath:"src/server/utils/changeAuditStore.ts",hunkIndex:1}},{id:"store",title:"保存整批导览结构",kind:"process",business:"服务端把 walkthrough 作为一等数据持久化。",anchor:{repoRoot:e,filePath:"src/server/utils/changeAuditStore.ts",hunkIndex:0}},{id:"api",title:"前端读取总览",kind:"api",business:"一次请求拿到 records 和 walkthroughs。",anchor:{repoRoot:e,filePath:"src/lib/terminal/api.ts",hunkIndex:0}},{id:"panel",title:"渲染 DAG 导览",kind:"ui",business:"用节点和边表达实现链路,节点可点击。节点内容可能是一两句话,也可能包含较长的业务解释;布局需要先测量 DOM 高度,再重新计算每一行节点的 y 坐标和连线端点。",anchor:{repoRoot:e,filePath:"src/lib/components/sidebar/ChangeWalkthroughPanel.tsx",hunkIndex:0}},{id:"jump",title:"跳回真实 diff",kind:"ui",business:"点击节点后定位到文件、hunk 或 section。",anchor:{repoRoot:e,filePath:"src/lib/components/sidebar/RightSidebar.tsx",hunkIndex:1}},{id:"section",title:"贴近改动展示解释",kind:"ui",business:"section 解释跟在对应 diff 块后面,而不是堆在 hunk 顶部。这个节点也故意写得更长,用来观察右侧分支和下方验证节点的连线是否会避让变高后的卡片。",anchor:{repoRoot:e,filePath:"src/lib/components/sidebar/DiffViewer.tsx",hunkIndex:0,sectionIndex:1}},{id:"verify",title:"验证导出和注入",kind:"test",business:"跑 lint、install、health、资源检查和注入自测。"}],edges:[{from:"export",to:"prompt",label:"提供输入",desc:"sectionFingerprint 让 AI 可以稳定引用。"},{from:"export",to:"schema",label:"结构校验",desc:"先确认输入可以稳定落库。"},{from:"export",to:"fallback",label:"兼容旧数据",desc:"为历史记录补齐必要字段。"},{from:"prompt",to:"store",label:"注入",desc:"AI payload 写回本地服务。"},{from:"schema",to:"store",label:"通过后保存",desc:"合法结构进入存储层。"},{from:"fallback",to:"store",label:"归一化后保存",desc:"兼容数据与新数据走同一链路。"},{from:"store",to:"api",label:"读取",desc:"浏览器从服务端拿到导览。"},{from:"api",to:"panel",label:"渲染",desc:"结构化数据变成导览图。"},{from:"panel",to:"jump",label:"点击",desc:"节点驱动 diff 定位。"},{from:"jump",to:"section",label:"定位",desc:"落到对应 section 解释。"},{from:"export",to:"verify",label:"验证",desc:"导出结构要覆盖 tracked/untracked。"},{from:"section",to:"verify",label:"回归",desc:"确认展示位置和交互。"}],sections:[],risks:[{title:"边和 label 不能遮住节点主体。"},{title:"窄侧栏下横向滚动要可控。"}],checks:["在 360px、560px、900px 宽度下截图检查。","确认边的箭头、label 背板和节点层级清楚。","确认节点点击区域和 hover 状态可感知。"]};function p(){return t.jsx("div",{className:"min-h-screen bg-background p-5 text-foreground","data-dag-playground":!0,children:t.jsxs("div",{className:"mx-auto max-w-[72rem]",children:[t.jsxs("div",{className:"mb-3",children:[t.jsx("h1",{className:"text-sm font-semibold",children:"DAG Playground"}),t.jsx("p",{className:"mt-1 text-xs text-muted-foreground",children:"Auth-free playground for tuning the real ChangeWalkthroughPanel."})]}),t.jsxs("div",{className:"grid gap-4 lg:grid-cols-[360px_minmax(0,1fr)]",children:[t.jsx("div",{className:"min-w-0",children:t.jsx(s,{walkthroughs:[i],repoRoot:e,onNavigate:o=>{console.info("[DagPlayground] navigate",o)}})}),t.jsx("div",{className:"min-w-0",children:t.jsx(s,{walkthroughs:[i],repoRoot:e,onNavigate:o=>{console.info("[DagPlayground] navigate",o)}})})]})]})})}export{p as DagPlayground};
@@ -1,4 +1,4 @@
1
- import{bA as e}from"./app-DNnVU3VK.js";import{b as a}from"./dnd-BCFAPC0L.js";import{c as M,S as _,D as T}from"./DiffViewer-DDiASWHf.js";import"./react-XDCjal2T.js";import"./terminal-C7X98Amf.js";import"./referenceLongPress-LCYPFdN8.js";const w=`diff --git a/CommentGap.kt b/CommentGap.kt
1
+ import{bA as e}from"./app-aNkllBsm.js";import{b as a}from"./dnd-BCFAPC0L.js";import{c as M,S as _,D as T}from"./DiffViewer-C4S3oEQV.js";import"./react-XDCjal2T.js";import"./terminal-C7X98Amf.js";import"./referenceLongPress-Bln9X6SW.js";const w=`diff --git a/CommentGap.kt b/CommentGap.kt
2
2
  --- a/CommentGap.kt
3
3
  +++ b/CommentGap.kt
4
4
  @@ -1,4 +1,4 @@