termdock 1.4.354 → 1.4.355

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 (424) hide show
  1. package/THIRD_PARTY_NOTICES.md +56 -0
  2. package/dist/client/assets/{AndroidMirrorView-D9CMPmet.js → AndroidMirrorView-BC_6L3mG.js} +3 -3
  3. package/dist/client/assets/AndroidMirrorView-BC_6L3mG.js.br +0 -0
  4. package/dist/client/assets/AndroidMirrorView-BC_6L3mG.js.gz +0 -0
  5. package/dist/client/assets/{App-CqLXOAnv.js → App-BGECv_n_.js} +36 -36
  6. package/dist/client/assets/App-BGECv_n_.js.br +0 -0
  7. package/dist/client/assets/App-BGECv_n_.js.gz +0 -0
  8. package/dist/client/assets/{ArchitecturePanel-Dlnd9PH-.js → ArchitecturePanel-CYdolNzT.js} +3 -3
  9. package/dist/client/assets/ArchitecturePanel-CYdolNzT.js.br +0 -0
  10. package/dist/client/assets/ArchitecturePanel-CYdolNzT.js.gz +0 -0
  11. package/dist/client/assets/ChangeWalkthroughPanel-mAiaX5i8.js +2 -0
  12. package/dist/client/assets/ChangeWalkthroughPanel-mAiaX5i8.js.br +0 -0
  13. package/dist/client/assets/ChangeWalkthroughPanel-mAiaX5i8.js.gz +0 -0
  14. package/dist/client/assets/ChatRichContent-D2NtgMuL.js +277 -0
  15. package/dist/client/assets/ChatRichContent-D2NtgMuL.js.br +0 -0
  16. package/dist/client/assets/ChatRichContent-D2NtgMuL.js.gz +0 -0
  17. package/dist/client/assets/CollaborationMainWorkspace-CcHsVfXD.js +1 -0
  18. package/dist/client/assets/CollaborationMainWorkspace-CcHsVfXD.js.br +0 -0
  19. package/dist/client/assets/CollaborationMainWorkspace-CcHsVfXD.js.gz +0 -0
  20. package/dist/client/assets/{CollaborationTaskContent-GMhtQgeq.js → CollaborationTaskContent-FcrGGSr_.js} +1 -1
  21. package/dist/client/assets/{ComputerControlView-VNUyl2Gb.js → ComputerControlView-DU9krDsg.js} +4 -4
  22. package/dist/client/assets/ComputerControlView-DU9krDsg.js.br +0 -0
  23. package/dist/client/assets/ComputerControlView-DU9krDsg.js.gz +0 -0
  24. package/dist/client/assets/DagPlayground-CbEuQA68.js +1 -0
  25. package/dist/client/assets/DagPlayground-CbEuQA68.js.br +0 -0
  26. package/dist/client/assets/DagPlayground-CbEuQA68.js.gz +0 -0
  27. package/dist/client/assets/{DiffLab-CKBHu65J.js → DiffLab-PysBkJrJ.js} +1 -1
  28. package/dist/client/assets/DiffLab-PysBkJrJ.js.br +0 -0
  29. package/dist/client/assets/DiffLab-PysBkJrJ.js.gz +0 -0
  30. package/dist/client/assets/DiffReview-Ce3wKMBk.js +1 -0
  31. package/dist/client/assets/DiffReview-Ce3wKMBk.js.br +0 -0
  32. package/dist/client/assets/DiffReview-Ce3wKMBk.js.gz +0 -0
  33. package/dist/client/assets/{DiffReviewLab--PbhIP71.js → DiffReviewLab-D6PxvtBY.js} +2 -2
  34. package/dist/client/assets/DiffReviewLab-D6PxvtBY.js.br +0 -0
  35. package/dist/client/assets/DiffReviewLab-D6PxvtBY.js.gz +0 -0
  36. package/dist/client/assets/{DiffViewer-Cg3GhKcU.js → DiffViewer-Bp-BLT2f.js} +1 -1
  37. package/dist/client/assets/DiffViewer-Bp-BLT2f.js.br +0 -0
  38. package/dist/client/assets/DiffViewer-Bp-BLT2f.js.gz +0 -0
  39. package/dist/client/assets/GitLoadingSkeleton-Fa4AXG-N.js +1 -0
  40. package/dist/client/assets/GitLoadingSkeleton-Fa4AXG-N.js.br +0 -0
  41. package/dist/client/assets/GitLoadingSkeleton-Fa4AXG-N.js.gz +0 -0
  42. package/dist/client/assets/{MarkdownPreview-b_bwDNcY.js → MarkdownPreview-_Z5UzhLt.js} +2 -2
  43. package/dist/client/assets/MarkdownPreview-_Z5UzhLt.js.br +0 -0
  44. package/dist/client/assets/MarkdownPreview-_Z5UzhLt.js.gz +0 -0
  45. package/dist/client/assets/{ModelPreview-C9nka14O.js → ModelPreview-Cl0X7I-U.js} +3 -3
  46. package/dist/client/assets/ModelPreview-Cl0X7I-U.js.br +0 -0
  47. package/dist/client/assets/ModelPreview-Cl0X7I-U.js.gz +0 -0
  48. package/dist/client/assets/{RecordingSaveDialog-1YvzwTzo.js → RecordingSaveDialog-Ca2iJsOW.js} +1 -1
  49. package/dist/client/assets/RecordingSaveDialog-Ca2iJsOW.js.br +0 -0
  50. package/dist/client/assets/RecordingSaveDialog-Ca2iJsOW.js.gz +0 -0
  51. package/dist/client/assets/{RightSidebar-CCk8ovoK.js → RightSidebar-CwXIBpEw.js} +20 -20
  52. package/dist/client/assets/RightSidebar-CwXIBpEw.js.br +0 -0
  53. package/dist/client/assets/RightSidebar-CwXIBpEw.js.gz +0 -0
  54. package/dist/client/assets/SessionChatView-D3sLcYAc.js +13 -0
  55. package/dist/client/assets/SessionChatView-D3sLcYAc.js.br +0 -0
  56. package/dist/client/assets/SessionChatView-D3sLcYAc.js.gz +0 -0
  57. package/dist/client/assets/SessionResourceSidebar-BObKJeA9.js +2 -0
  58. package/dist/client/assets/SessionResourceSidebar-BObKJeA9.js.br +0 -0
  59. package/dist/client/assets/SessionResourceSidebar-BObKJeA9.js.gz +0 -0
  60. package/dist/client/assets/TodoWorkspace-BdesAuz4.js +1 -0
  61. package/dist/client/assets/TodoWorkspace-BdesAuz4.js.br +0 -0
  62. package/dist/client/assets/TodoWorkspace-BdesAuz4.js.gz +0 -0
  63. package/dist/client/assets/{abnfDiagram-VCTEODGH-CTqKSsYV.js → abnfDiagram-VCTEODGH-BajyXVpH.js} +1 -1
  64. package/dist/client/assets/abnfDiagram-VCTEODGH-BajyXVpH.js.br +0 -0
  65. package/dist/client/assets/abnfDiagram-VCTEODGH-BajyXVpH.js.gz +0 -0
  66. package/dist/client/assets/app-C3WX_u_Z.js +37 -0
  67. package/dist/client/assets/app-C3WX_u_Z.js.br +0 -0
  68. package/dist/client/assets/app-C3WX_u_Z.js.gz +0 -0
  69. package/dist/client/assets/{arc-CcvWcKBR.js → arc-CbhM5I2d.js} +1 -1
  70. package/dist/client/assets/arc-CbhM5I2d.js.br +0 -0
  71. package/dist/client/assets/arc-CbhM5I2d.js.gz +0 -0
  72. package/dist/client/assets/{architectureDiagram-5GKGNRK7-B_2ae8Tt.js → architectureDiagram-5GKGNRK7-CDKLcS6D.js} +1 -1
  73. package/dist/client/assets/architectureDiagram-5GKGNRK7-CDKLcS6D.js.br +0 -0
  74. package/dist/client/assets/architectureDiagram-5GKGNRK7-CDKLcS6D.js.gz +0 -0
  75. package/dist/client/assets/{arrow-down-DaWRHIlh.js → arrow-down-Dp27yS0N.js} +1 -1
  76. package/dist/client/assets/{arrow-up-DE9Z7GTI.js → arrow-up-BEUQcf-s.js} +1 -1
  77. package/dist/client/assets/{blockDiagram-I7D4REHJ-CGXUOwJg.js → blockDiagram-I7D4REHJ-CXiIO6_W.js} +1 -1
  78. package/dist/client/assets/blockDiagram-I7D4REHJ-CXiIO6_W.js.br +0 -0
  79. package/dist/client/assets/blockDiagram-I7D4REHJ-CXiIO6_W.js.gz +0 -0
  80. package/dist/client/assets/{c4Diagram-7LVT6UL2-BSU3omYQ.js → c4Diagram-7LVT6UL2-uZ-i2eKH.js} +1 -1
  81. package/dist/client/assets/c4Diagram-7LVT6UL2-uZ-i2eKH.js.br +0 -0
  82. package/dist/client/assets/c4Diagram-7LVT6UL2-uZ-i2eKH.js.gz +0 -0
  83. package/dist/client/assets/channel-Dg7JKsqi.js +1 -0
  84. package/dist/client/assets/{chevron-left-ZgHOf4aC.js → chevron-left-D8ntyw2S.js} +1 -1
  85. package/dist/client/assets/{chunk-2Q5K7J3B-B67WsCJN.js → chunk-2Q5K7J3B-DVe3dVJR.js} +1 -1
  86. package/dist/client/assets/{chunk-5VM5RSS4-B8k7JXrn.js → chunk-5VM5RSS4-BDBNKGuU.js} +1 -1
  87. package/dist/client/assets/{chunk-F27PBJKO-CP85XeHB.js → chunk-F27PBJKO-BP7hTwtm.js} +1 -1
  88. package/dist/client/assets/chunk-F27PBJKO-BP7hTwtm.js.br +0 -0
  89. package/dist/client/assets/chunk-F27PBJKO-BP7hTwtm.js.gz +0 -0
  90. package/dist/client/assets/{chunk-IMKFNOWR-BjTbac0d.js → chunk-IMKFNOWR-LIGuOtnb.js} +1 -1
  91. package/dist/client/assets/chunk-IMKFNOWR-LIGuOtnb.js.br +0 -0
  92. package/dist/client/assets/chunk-IMKFNOWR-LIGuOtnb.js.gz +0 -0
  93. package/dist/client/assets/{chunk-JWPE2WC7-vEdRTCxh.js → chunk-JWPE2WC7-C1_iFEvk.js} +1 -1
  94. package/dist/client/assets/{chunk-POPQ4Y6H-BI8tSW7F.js → chunk-POPQ4Y6H-CYZsO-QL.js} +1 -1
  95. package/dist/client/assets/{chunk-SVP7TREG-Dde8KTpr.js → chunk-SVP7TREG-FnWYLNCS.js} +1 -1
  96. package/dist/client/assets/chunk-SVP7TREG-FnWYLNCS.js.br +0 -0
  97. package/dist/client/assets/chunk-SVP7TREG-FnWYLNCS.js.gz +0 -0
  98. package/dist/client/assets/{chunk-TICWLB2K-DIBgH5zV.js → chunk-TICWLB2K-dcOCcmQq.js} +1 -1
  99. package/dist/client/assets/chunk-TICWLB2K-dcOCcmQq.js.br +0 -0
  100. package/dist/client/assets/chunk-TICWLB2K-dcOCcmQq.js.gz +0 -0
  101. package/dist/client/assets/{chunk-XXDRQBXY-LSjj35mz.js → chunk-XXDRQBXY-B2H2Yt9G.js} +1 -1
  102. package/dist/client/assets/circle-Pldg1yI9.js +1 -0
  103. package/dist/client/assets/classDiagram-ZZMXUADV-D6QBd_IP.js +1 -0
  104. package/dist/client/assets/classDiagram-v2-VYDZK3BY-D6QBd_IP.js +1 -0
  105. package/dist/client/assets/{clipboard-BGpbRBdi.js → clipboard-tTkMEO1S.js} +1 -1
  106. package/dist/client/assets/clipboardText-BapOM7QN.js +1 -0
  107. package/dist/client/assets/clipboardText-BapOM7QN.js.br +0 -0
  108. package/dist/client/assets/clipboardText-BapOM7QN.js.gz +0 -0
  109. package/dist/client/assets/{cose-bilkent-JH36ORCC-v4utSIkX.js → cose-bilkent-JH36ORCC-Bz38mqD8.js} +1 -1
  110. package/dist/client/assets/cose-bilkent-JH36ORCC-Bz38mqD8.js.br +0 -0
  111. package/dist/client/assets/cose-bilkent-JH36ORCC-Bz38mqD8.js.gz +0 -0
  112. package/dist/client/assets/{cynefin-OW5HDTMX-BdbtIufa.js → cynefin-OW5HDTMX-CZAa1A6y.js} +1 -1
  113. package/dist/client/assets/cynefin-OW5HDTMX-CZAa1A6y.js.br +0 -0
  114. package/dist/client/assets/cynefin-OW5HDTMX-CZAa1A6y.js.gz +0 -0
  115. package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-B9EVx2-N.js → cynefinDiagram-5FMLGOSQ-BaQnW4VG.js} +1 -1
  116. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-BaQnW4VG.js.br +0 -0
  117. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-BaQnW4VG.js.gz +0 -0
  118. package/dist/client/assets/{dagre-GXQ25YYZ-Do2YjWuC.js → dagre-GXQ25YYZ-BdnT61bc.js} +1 -1
  119. package/dist/client/assets/dagre-GXQ25YYZ-BdnT61bc.js.br +0 -0
  120. package/dist/client/assets/dagre-GXQ25YYZ-BdnT61bc.js.gz +0 -0
  121. package/dist/client/assets/{diagram-S7CK7UJ4-BnJa3bbo.js → diagram-S7CK7UJ4-BWiF8QNc.js} +1 -1
  122. package/dist/client/assets/diagram-S7CK7UJ4-BWiF8QNc.js.br +0 -0
  123. package/dist/client/assets/diagram-S7CK7UJ4-BWiF8QNc.js.gz +0 -0
  124. package/dist/client/assets/{diagram-UQ7AKVKN-C09N8-nE.js → diagram-UQ7AKVKN-DLURjCFp.js} +1 -1
  125. package/dist/client/assets/diagram-UQ7AKVKN-DLURjCFp.js.br +0 -0
  126. package/dist/client/assets/diagram-UQ7AKVKN-DLURjCFp.js.gz +0 -0
  127. package/dist/client/assets/{diagram-VSXAHHWV-mMv3O2zK.js → diagram-VSXAHHWV-DYIcLklz.js} +1 -1
  128. package/dist/client/assets/diagram-VSXAHHWV-DYIcLklz.js.br +0 -0
  129. package/dist/client/assets/diagram-VSXAHHWV-DYIcLklz.js.gz +0 -0
  130. package/dist/client/assets/{diagram-VX7I27RA-B0aepUKS.js → diagram-VX7I27RA-C9vqviXX.js} +1 -1
  131. package/dist/client/assets/diagram-VX7I27RA-C9vqviXX.js.br +0 -0
  132. package/dist/client/assets/diagram-VX7I27RA-C9vqviXX.js.gz +0 -0
  133. package/dist/client/assets/{diagram-Z3DM3KII-BstqsbCO.js → diagram-Z3DM3KII-BJuQxTkw.js} +1 -1
  134. package/dist/client/assets/diagram-Z3DM3KII-BJuQxTkw.js.br +0 -0
  135. package/dist/client/assets/diagram-Z3DM3KII-BJuQxTkw.js.gz +0 -0
  136. package/dist/client/assets/{ebnfDiagram-PWID7BFC-CPINc9LK.js → ebnfDiagram-PWID7BFC-BcbISm-z.js} +1 -1
  137. package/dist/client/assets/ebnfDiagram-PWID7BFC-BcbISm-z.js.br +0 -0
  138. package/dist/client/assets/ebnfDiagram-PWID7BFC-BcbISm-z.js.gz +0 -0
  139. package/dist/client/assets/{erDiagram-RLTQ6QDP-dUgaGLHP.js → erDiagram-RLTQ6QDP-fhNpRzUG.js} +1 -1
  140. package/dist/client/assets/{erDiagram-RLTQ6QDP-dUgaGLHP.js.br → erDiagram-RLTQ6QDP-fhNpRzUG.js.br} +0 -0
  141. package/dist/client/assets/erDiagram-RLTQ6QDP-fhNpRzUG.js.gz +0 -0
  142. package/dist/client/assets/external-link-DE8Gj-da.js +1 -0
  143. package/dist/client/assets/{flowDiagram-HODETNUW-4ottFlnS.js → flowDiagram-HODETNUW-CVDJ_1Zu.js} +1 -1
  144. package/dist/client/assets/flowDiagram-HODETNUW-CVDJ_1Zu.js.br +0 -0
  145. package/dist/client/assets/flowDiagram-HODETNUW-CVDJ_1Zu.js.gz +0 -0
  146. package/dist/client/assets/{ganttDiagram-EL5Y4UJY-CZOkoivd.js → ganttDiagram-EL5Y4UJY-Dzn-mrfe.js} +1 -1
  147. package/dist/client/assets/ganttDiagram-EL5Y4UJY-Dzn-mrfe.js.br +0 -0
  148. package/dist/client/assets/ganttDiagram-EL5Y4UJY-Dzn-mrfe.js.gz +0 -0
  149. package/dist/client/assets/{git-compare-C7n2uha2.js → git-compare-Ct2eJNs4.js} +1 -1
  150. package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-kh9xx53r.js → gitGraphDiagram-WWUBYQGX-Ci-wfvCz.js} +1 -1
  151. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-Ci-wfvCz.js.br +0 -0
  152. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-Ci-wfvCz.js.gz +0 -0
  153. package/dist/client/assets/index-ByrWASlZ.js +1 -0
  154. package/dist/client/assets/index-ByrWASlZ.js.br +0 -0
  155. package/dist/client/assets/index-ByrWASlZ.js.gz +0 -0
  156. package/dist/client/assets/{index-bfj9dYEg.css → index-DOq3vkFG.css} +1 -1
  157. package/dist/client/assets/index-DOq3vkFG.css.br +0 -0
  158. package/dist/client/assets/{index-bfj9dYEg.css.gz → index-DOq3vkFG.css.gz} +0 -0
  159. package/dist/client/assets/{infoDiagram-27XIBGKW-zRkMruS-.js → infoDiagram-27XIBGKW-npBmeTt7.js} +1 -1
  160. package/dist/client/assets/{ishikawaDiagram-5VMMS53U-DPntAz12.js → ishikawaDiagram-5VMMS53U-CCn5Ha25.js} +1 -1
  161. package/dist/client/assets/ishikawaDiagram-5VMMS53U-CCn5Ha25.js.br +0 -0
  162. package/dist/client/assets/ishikawaDiagram-5VMMS53U-CCn5Ha25.js.gz +0 -0
  163. package/dist/client/assets/{journeyDiagram-3NMN7TZE-B074bD6a.js → journeyDiagram-3NMN7TZE-CPl5oPfe.js} +1 -1
  164. package/dist/client/assets/journeyDiagram-3NMN7TZE-CPl5oPfe.js.br +0 -0
  165. package/dist/client/assets/journeyDiagram-3NMN7TZE-CPl5oPfe.js.gz +0 -0
  166. package/dist/client/assets/{kanban-definition-UXKFOSKX-wPbpE7ij.js → kanban-definition-UXKFOSKX-Dmia2kLZ.js} +1 -1
  167. package/dist/client/assets/kanban-definition-UXKFOSKX-Dmia2kLZ.js.br +0 -0
  168. package/dist/client/assets/kanban-definition-UXKFOSKX-Dmia2kLZ.js.gz +0 -0
  169. package/dist/client/assets/{layout-D-nTHjVE.js → layout-B2Kz5M73.js} +1 -1
  170. package/dist/client/assets/layout-B2Kz5M73.js.br +0 -0
  171. package/dist/client/assets/layout-B2Kz5M73.js.gz +0 -0
  172. package/dist/client/assets/{linear-BVxgfw5H.js → linear-D2CT7wE3.js} +1 -1
  173. package/dist/client/assets/linear-D2CT7wE3.js.br +0 -0
  174. package/dist/client/assets/linear-D2CT7wE3.js.gz +0 -0
  175. package/dist/client/assets/{link-D-fkBp5k.js → link-x33s12VI.js} +3 -3
  176. package/dist/client/assets/link-x33s12VI.js.br +0 -0
  177. package/dist/client/assets/link-x33s12VI.js.gz +0 -0
  178. package/dist/client/assets/{list-tree-DKTcSR9r.js → list-tree-XBmm9il2.js} +1 -1
  179. package/dist/client/assets/{loader-circle-DZn9iP0u.js → loader-circle-D_nJKmMD.js} +1 -1
  180. package/dist/client/assets/{maximize-2-dFjMEqgh.js → maximize-2-t-zzENew.js} +1 -1
  181. package/dist/client/assets/{mermaid.core-D89ctjDO.js → mermaid.core-G9XIcppl.js} +5 -5
  182. package/dist/client/assets/mermaid.core-G9XIcppl.js.br +0 -0
  183. package/dist/client/assets/mermaid.core-G9XIcppl.js.gz +0 -0
  184. package/dist/client/assets/{mindmap-definition-YA3MSWOX-1TrbOKNK.js → mindmap-definition-YA3MSWOX-D2OX9OkO.js} +1 -1
  185. package/dist/client/assets/mindmap-definition-YA3MSWOX-D2OX9OkO.js.br +0 -0
  186. package/dist/client/assets/mindmap-definition-YA3MSWOX-D2OX9OkO.js.gz +0 -0
  187. package/dist/client/assets/{passwordBootstrap-8XHlXyYk.js → passwordBootstrap-DkTynZfV.js} +2 -2
  188. package/dist/client/assets/passwordBootstrap-DkTynZfV.js.br +0 -0
  189. package/dist/client/assets/passwordBootstrap-DkTynZfV.js.gz +0 -0
  190. package/dist/client/assets/{pegDiagram-XKGWAZYB-CJYo1Bz4.js → pegDiagram-XKGWAZYB-qNjd6dbd.js} +1 -1
  191. package/dist/client/assets/pegDiagram-XKGWAZYB-qNjd6dbd.js.br +0 -0
  192. package/dist/client/assets/pegDiagram-XKGWAZYB-qNjd6dbd.js.gz +0 -0
  193. package/dist/client/assets/{pieDiagram-E7YTZNPT-DyE6_2FS.js → pieDiagram-E7YTZNPT-DcCmKDFh.js} +1 -1
  194. package/dist/client/assets/pieDiagram-E7YTZNPT-DcCmKDFh.js.br +0 -0
  195. package/dist/client/assets/pieDiagram-E7YTZNPT-DcCmKDFh.js.gz +0 -0
  196. package/dist/client/assets/{quadrantDiagram-AXDQQJYC-OgNN7-oZ.js → quadrantDiagram-AXDQQJYC-BpDzkl9h.js} +1 -1
  197. package/dist/client/assets/quadrantDiagram-AXDQQJYC-BpDzkl9h.js.br +0 -0
  198. package/dist/client/assets/quadrantDiagram-AXDQQJYC-BpDzkl9h.js.gz +0 -0
  199. package/dist/client/assets/{quote-QwQvV6RF.js → quote-DeByS04O.js} +1 -1
  200. package/dist/client/assets/{railroadDiagram-O6MQD6OU-Dmqw_B10.js → railroadDiagram-O6MQD6OU-DkwV8w7x.js} +1 -1
  201. package/dist/client/assets/railroadDiagram-O6MQD6OU-DkwV8w7x.js.br +0 -0
  202. package/dist/client/assets/railroadDiagram-O6MQD6OU-DkwV8w7x.js.gz +0 -0
  203. package/dist/client/assets/{rdpSession-tgxFIJYE.js → rdpSession-D5NrFTav.js} +1 -1
  204. package/dist/client/assets/rdpSession-D5NrFTav.js.br +0 -0
  205. package/dist/client/assets/rdpSession-D5NrFTav.js.gz +0 -0
  206. package/dist/client/assets/{requirementDiagram-BXWQKSXE-nZK7--1f.js → requirementDiagram-BXWQKSXE-BRwt5MXl.js} +1 -1
  207. package/dist/client/assets/{requirementDiagram-BXWQKSXE-nZK7--1f.js.br → requirementDiagram-BXWQKSXE-BRwt5MXl.js.br} +0 -0
  208. package/dist/client/assets/requirementDiagram-BXWQKSXE-BRwt5MXl.js.gz +0 -0
  209. package/dist/client/assets/{sankeyDiagram-P5KCCOFB-Db_TVWjx.js → sankeyDiagram-P5KCCOFB-DZ8y_gv3.js} +1 -1
  210. package/dist/client/assets/sankeyDiagram-P5KCCOFB-DZ8y_gv3.js.br +0 -0
  211. package/dist/client/assets/sankeyDiagram-P5KCCOFB-DZ8y_gv3.js.gz +0 -0
  212. package/dist/client/assets/search-CDJ4fv-q.js +1 -0
  213. package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-B7TK9j0_.js → sequenceDiagram-WJ2MYXX4-CJ9lZEsN.js} +1 -1
  214. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-CJ9lZEsN.js.br +0 -0
  215. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-CJ9lZEsN.js.gz +0 -0
  216. package/dist/client/assets/{settings-2-9tlRImVo.js → settings-2-DtFz7lgk.js} +1 -1
  217. package/dist/client/assets/{sizeCapture-INFHLROL-roX-pGgF.js → sizeCapture-INFHLROL-Dt9ZzegQ.js} +1 -1
  218. package/dist/client/assets/sizeCapture-INFHLROL-Dt9ZzegQ.js.br +0 -0
  219. package/dist/client/assets/sizeCapture-INFHLROL-Dt9ZzegQ.js.gz +0 -0
  220. package/dist/client/assets/{stateDiagram-D77RDMKH-BdBm0h1F.js → stateDiagram-D77RDMKH-DgeQtV3s.js} +1 -1
  221. package/dist/client/assets/stateDiagram-D77RDMKH-DgeQtV3s.js.br +0 -0
  222. package/dist/client/assets/stateDiagram-D77RDMKH-DgeQtV3s.js.gz +0 -0
  223. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-CKS6y2rR.js +1 -0
  224. package/dist/client/assets/sun-CvzpsfHU.js +1 -0
  225. package/dist/client/assets/{swimlanes-42K2YHIH-DUulb0LD.js → swimlanes-42K2YHIH-DHB6MQ8v.js} +1 -1
  226. package/dist/client/assets/swimlanes-42K2YHIH-DHB6MQ8v.js.br +0 -0
  227. package/dist/client/assets/swimlanes-42K2YHIH-DHB6MQ8v.js.gz +0 -0
  228. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-DvUzDKPI.js +8 -0
  229. package/dist/client/assets/{syntaxHighlight-Bgt0lmWx.js → syntaxHighlight-DF6Q5phI.js} +1 -1
  230. package/dist/client/assets/syntaxHighlight-DF6Q5phI.js.br +0 -0
  231. package/dist/client/assets/syntaxHighlight-DF6Q5phI.js.gz +0 -0
  232. package/dist/client/assets/{timeline-definition-24CTP7MA-CIQuxjVB.js → timeline-definition-24CTP7MA-EqVVyv-E.js} +1 -1
  233. package/dist/client/assets/timeline-definition-24CTP7MA-EqVVyv-E.js.br +0 -0
  234. package/dist/client/assets/timeline-definition-24CTP7MA-EqVVyv-E.js.gz +0 -0
  235. package/dist/client/assets/{triangle-alert-LpKfIn7N.js → triangle-alert--5QOrsVl.js} +1 -1
  236. package/dist/client/assets/{unplug-CLBg6VOD.js → unplug-BNUx6Lmk.js} +1 -1
  237. package/dist/client/assets/{vennDiagram-4TSXK5OY-CMRFApvJ.js → vennDiagram-4TSXK5OY-BBE17-sL.js} +1 -1
  238. package/dist/client/assets/vennDiagram-4TSXK5OY-BBE17-sL.js.br +0 -0
  239. package/dist/client/assets/vennDiagram-4TSXK5OY-BBE17-sL.js.gz +0 -0
  240. package/dist/client/assets/{videoCompression-DjyAuV3i.js → videoCompression-B09OiyP5.js} +1 -1
  241. package/dist/client/assets/videoCompression-B09OiyP5.js.br +0 -0
  242. package/dist/client/assets/videoCompression-B09OiyP5.js.gz +0 -0
  243. package/dist/client/assets/{wardleyDiagram-VM6X3IG4-BEb3x-zl.js → wardleyDiagram-VM6X3IG4-B4gZGXiA.js} +1 -1
  244. package/dist/client/assets/wardleyDiagram-VM6X3IG4-B4gZGXiA.js.br +0 -0
  245. package/dist/client/assets/wardleyDiagram-VM6X3IG4-B4gZGXiA.js.gz +0 -0
  246. package/dist/client/assets/{xychartDiagram-S5SC5T6Z-DUvoeYl2.js → xychartDiagram-S5SC5T6Z-BDO5xF5D.js} +1 -1
  247. package/dist/client/assets/xychartDiagram-S5SC5T6Z-BDO5xF5D.js.br +0 -0
  248. package/dist/client/assets/{xychartDiagram-S5SC5T6Z-DUvoeYl2.js.gz → xychartDiagram-S5SC5T6Z-BDO5xF5D.js.gz} +0 -0
  249. package/dist/client/index.html +2 -2
  250. package/dist/client/index.html.br +0 -0
  251. package/dist/client/index.html.gz +0 -0
  252. package/dist/client/sw.js +1 -1
  253. package/dist/client/sw.js.br +0 -0
  254. package/dist/client/sw.js.gz +0 -0
  255. package/dist/server/agent/chatUIPrompt.js +13 -0
  256. package/dist/server/agent/collaborationCli.js +8 -2
  257. package/dist/server/agent/collaborationPrompt.js +2 -2
  258. package/dist/server/agent/collaborationStore.js +17 -0
  259. package/dist/server/agent/sessionChatRoutes.js +23 -1
  260. package/dist/server/cli.js +5 -0
  261. package/dist/server/federation/accessPolicy.js +3 -0
  262. package/dist/server/federation/authorization.js +7 -3
  263. package/dist/server/federation/invitations.js +9 -6
  264. package/dist/server/federation/runtime.js +8 -1
  265. package/dist/server/shared/chatPresentation.js +36 -0
  266. package/dist/server/shared/chatUILibrary.js +26 -0
  267. package/dist/server/shared/sessionAppearance.js +17 -0
  268. package/package.json +4 -1
  269. package/runtime-manifest.json +4 -4
  270. package/dist/client/assets/AndroidMirrorView-D9CMPmet.js.br +0 -0
  271. package/dist/client/assets/AndroidMirrorView-D9CMPmet.js.gz +0 -0
  272. package/dist/client/assets/App-CqLXOAnv.js.br +0 -0
  273. package/dist/client/assets/App-CqLXOAnv.js.gz +0 -0
  274. package/dist/client/assets/ArchitecturePanel-Dlnd9PH-.js.br +0 -0
  275. package/dist/client/assets/ArchitecturePanel-Dlnd9PH-.js.gz +0 -0
  276. package/dist/client/assets/ChangeWalkthroughPanel-BYb27GTC.js +0 -2
  277. package/dist/client/assets/ChangeWalkthroughPanel-BYb27GTC.js.br +0 -0
  278. package/dist/client/assets/ChangeWalkthroughPanel-BYb27GTC.js.gz +0 -0
  279. package/dist/client/assets/CollaborationMainWorkspace-BJ_pbIlW.js +0 -1
  280. package/dist/client/assets/CollaborationMainWorkspace-BJ_pbIlW.js.br +0 -0
  281. package/dist/client/assets/CollaborationMainWorkspace-BJ_pbIlW.js.gz +0 -0
  282. package/dist/client/assets/ComputerControlView-VNUyl2Gb.js.br +0 -0
  283. package/dist/client/assets/ComputerControlView-VNUyl2Gb.js.gz +0 -0
  284. package/dist/client/assets/DagPlayground-Bzu6gfYW.js +0 -1
  285. package/dist/client/assets/DagPlayground-Bzu6gfYW.js.br +0 -0
  286. package/dist/client/assets/DagPlayground-Bzu6gfYW.js.gz +0 -0
  287. package/dist/client/assets/DiffLab-CKBHu65J.js.br +0 -0
  288. package/dist/client/assets/DiffLab-CKBHu65J.js.gz +0 -0
  289. package/dist/client/assets/DiffReview-DAUBgpsh.js +0 -1
  290. package/dist/client/assets/DiffReview-DAUBgpsh.js.br +0 -0
  291. package/dist/client/assets/DiffReview-DAUBgpsh.js.gz +0 -0
  292. package/dist/client/assets/DiffReviewLab--PbhIP71.js.br +0 -0
  293. package/dist/client/assets/DiffReviewLab--PbhIP71.js.gz +0 -0
  294. package/dist/client/assets/DiffViewer-Cg3GhKcU.js.br +0 -0
  295. package/dist/client/assets/DiffViewer-Cg3GhKcU.js.gz +0 -0
  296. package/dist/client/assets/GitLoadingSkeleton-ieGTuTuO.js +0 -1
  297. package/dist/client/assets/GitLoadingSkeleton-ieGTuTuO.js.br +0 -0
  298. package/dist/client/assets/GitLoadingSkeleton-ieGTuTuO.js.gz +0 -0
  299. package/dist/client/assets/MarkdownPreview-b_bwDNcY.js.br +0 -0
  300. package/dist/client/assets/MarkdownPreview-b_bwDNcY.js.gz +0 -0
  301. package/dist/client/assets/ModelPreview-C9nka14O.js.br +0 -0
  302. package/dist/client/assets/ModelPreview-C9nka14O.js.gz +0 -0
  303. package/dist/client/assets/RecordingSaveDialog-1YvzwTzo.js.br +0 -0
  304. package/dist/client/assets/RecordingSaveDialog-1YvzwTzo.js.gz +0 -0
  305. package/dist/client/assets/RightSidebar-CCk8ovoK.js.br +0 -0
  306. package/dist/client/assets/RightSidebar-CCk8ovoK.js.gz +0 -0
  307. package/dist/client/assets/SessionChatView-DORRzcNq.js +0 -13
  308. package/dist/client/assets/SessionChatView-DORRzcNq.js.br +0 -0
  309. package/dist/client/assets/SessionChatView-DORRzcNq.js.gz +0 -0
  310. package/dist/client/assets/SessionResourceSidebar-De0sHmdG.js +0 -2
  311. package/dist/client/assets/SessionResourceSidebar-De0sHmdG.js.br +0 -0
  312. package/dist/client/assets/SessionResourceSidebar-De0sHmdG.js.gz +0 -0
  313. package/dist/client/assets/TodoWorkspace-BHHT954s.js +0 -1
  314. package/dist/client/assets/TodoWorkspace-BHHT954s.js.br +0 -0
  315. package/dist/client/assets/TodoWorkspace-BHHT954s.js.gz +0 -0
  316. package/dist/client/assets/abnfDiagram-VCTEODGH-CTqKSsYV.js.br +0 -0
  317. package/dist/client/assets/abnfDiagram-VCTEODGH-CTqKSsYV.js.gz +0 -0
  318. package/dist/client/assets/app-stNRNTO-.js +0 -37
  319. package/dist/client/assets/app-stNRNTO-.js.br +0 -0
  320. package/dist/client/assets/app-stNRNTO-.js.gz +0 -0
  321. package/dist/client/assets/arc-CcvWcKBR.js.br +0 -0
  322. package/dist/client/assets/arc-CcvWcKBR.js.gz +0 -0
  323. package/dist/client/assets/architectureDiagram-5GKGNRK7-B_2ae8Tt.js.br +0 -0
  324. package/dist/client/assets/architectureDiagram-5GKGNRK7-B_2ae8Tt.js.gz +0 -0
  325. package/dist/client/assets/blockDiagram-I7D4REHJ-CGXUOwJg.js.br +0 -0
  326. package/dist/client/assets/blockDiagram-I7D4REHJ-CGXUOwJg.js.gz +0 -0
  327. package/dist/client/assets/c4Diagram-7LVT6UL2-BSU3omYQ.js.br +0 -0
  328. package/dist/client/assets/c4Diagram-7LVT6UL2-BSU3omYQ.js.gz +0 -0
  329. package/dist/client/assets/channel-CREmT4wq.js +0 -1
  330. package/dist/client/assets/chunk-F27PBJKO-CP85XeHB.js.br +0 -0
  331. package/dist/client/assets/chunk-F27PBJKO-CP85XeHB.js.gz +0 -0
  332. package/dist/client/assets/chunk-IMKFNOWR-BjTbac0d.js.br +0 -0
  333. package/dist/client/assets/chunk-IMKFNOWR-BjTbac0d.js.gz +0 -0
  334. package/dist/client/assets/chunk-SVP7TREG-Dde8KTpr.js.br +0 -0
  335. package/dist/client/assets/chunk-SVP7TREG-Dde8KTpr.js.gz +0 -0
  336. package/dist/client/assets/chunk-TICWLB2K-DIBgH5zV.js.br +0 -0
  337. package/dist/client/assets/chunk-TICWLB2K-DIBgH5zV.js.gz +0 -0
  338. package/dist/client/assets/classDiagram-ZZMXUADV-CTHA5GVu.js +0 -1
  339. package/dist/client/assets/classDiagram-v2-VYDZK3BY-CTHA5GVu.js +0 -1
  340. package/dist/client/assets/clipboardText-B0NK9NMn.js +0 -1
  341. package/dist/client/assets/clipboardText-B0NK9NMn.js.br +0 -0
  342. package/dist/client/assets/clipboardText-B0NK9NMn.js.gz +0 -0
  343. package/dist/client/assets/cose-bilkent-JH36ORCC-v4utSIkX.js.br +0 -0
  344. package/dist/client/assets/cose-bilkent-JH36ORCC-v4utSIkX.js.gz +0 -0
  345. package/dist/client/assets/cynefin-OW5HDTMX-BdbtIufa.js.br +0 -0
  346. package/dist/client/assets/cynefin-OW5HDTMX-BdbtIufa.js.gz +0 -0
  347. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-B9EVx2-N.js.br +0 -0
  348. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-B9EVx2-N.js.gz +0 -0
  349. package/dist/client/assets/dagre-GXQ25YYZ-Do2YjWuC.js.br +0 -0
  350. package/dist/client/assets/dagre-GXQ25YYZ-Do2YjWuC.js.gz +0 -0
  351. package/dist/client/assets/diagram-S7CK7UJ4-BnJa3bbo.js.br +0 -0
  352. package/dist/client/assets/diagram-S7CK7UJ4-BnJa3bbo.js.gz +0 -0
  353. package/dist/client/assets/diagram-UQ7AKVKN-C09N8-nE.js.br +0 -0
  354. package/dist/client/assets/diagram-UQ7AKVKN-C09N8-nE.js.gz +0 -0
  355. package/dist/client/assets/diagram-VSXAHHWV-mMv3O2zK.js.br +0 -0
  356. package/dist/client/assets/diagram-VSXAHHWV-mMv3O2zK.js.gz +0 -0
  357. package/dist/client/assets/diagram-VX7I27RA-B0aepUKS.js.br +0 -0
  358. package/dist/client/assets/diagram-VX7I27RA-B0aepUKS.js.gz +0 -0
  359. package/dist/client/assets/diagram-Z3DM3KII-BstqsbCO.js.br +0 -0
  360. package/dist/client/assets/diagram-Z3DM3KII-BstqsbCO.js.gz +0 -0
  361. package/dist/client/assets/ebnfDiagram-PWID7BFC-CPINc9LK.js.br +0 -0
  362. package/dist/client/assets/ebnfDiagram-PWID7BFC-CPINc9LK.js.gz +0 -0
  363. package/dist/client/assets/erDiagram-RLTQ6QDP-dUgaGLHP.js.gz +0 -0
  364. package/dist/client/assets/flowDiagram-HODETNUW-4ottFlnS.js.br +0 -0
  365. package/dist/client/assets/flowDiagram-HODETNUW-4ottFlnS.js.gz +0 -0
  366. package/dist/client/assets/ganttDiagram-EL5Y4UJY-CZOkoivd.js.br +0 -0
  367. package/dist/client/assets/ganttDiagram-EL5Y4UJY-CZOkoivd.js.gz +0 -0
  368. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-kh9xx53r.js.br +0 -0
  369. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-kh9xx53r.js.gz +0 -0
  370. package/dist/client/assets/index-bfj9dYEg.css.br +0 -0
  371. package/dist/client/assets/ishikawaDiagram-5VMMS53U-DPntAz12.js.br +0 -0
  372. package/dist/client/assets/ishikawaDiagram-5VMMS53U-DPntAz12.js.gz +0 -0
  373. package/dist/client/assets/journeyDiagram-3NMN7TZE-B074bD6a.js.br +0 -0
  374. package/dist/client/assets/journeyDiagram-3NMN7TZE-B074bD6a.js.gz +0 -0
  375. package/dist/client/assets/kanban-definition-UXKFOSKX-wPbpE7ij.js.br +0 -0
  376. package/dist/client/assets/kanban-definition-UXKFOSKX-wPbpE7ij.js.gz +0 -0
  377. package/dist/client/assets/layout-D-nTHjVE.js.br +0 -0
  378. package/dist/client/assets/layout-D-nTHjVE.js.gz +0 -0
  379. package/dist/client/assets/linear-BVxgfw5H.js.br +0 -0
  380. package/dist/client/assets/linear-BVxgfw5H.js.gz +0 -0
  381. package/dist/client/assets/link-D-fkBp5k.js.br +0 -0
  382. package/dist/client/assets/link-D-fkBp5k.js.gz +0 -0
  383. package/dist/client/assets/mermaid.core-D89ctjDO.js.br +0 -0
  384. package/dist/client/assets/mermaid.core-D89ctjDO.js.gz +0 -0
  385. package/dist/client/assets/mindmap-definition-YA3MSWOX-1TrbOKNK.js.br +0 -0
  386. package/dist/client/assets/mindmap-definition-YA3MSWOX-1TrbOKNK.js.gz +0 -0
  387. package/dist/client/assets/passwordBootstrap-8XHlXyYk.js.br +0 -0
  388. package/dist/client/assets/passwordBootstrap-8XHlXyYk.js.gz +0 -0
  389. package/dist/client/assets/pegDiagram-XKGWAZYB-CJYo1Bz4.js.br +0 -0
  390. package/dist/client/assets/pegDiagram-XKGWAZYB-CJYo1Bz4.js.gz +0 -0
  391. package/dist/client/assets/pieDiagram-E7YTZNPT-DyE6_2FS.js.br +0 -0
  392. package/dist/client/assets/pieDiagram-E7YTZNPT-DyE6_2FS.js.gz +0 -0
  393. package/dist/client/assets/quadrantDiagram-AXDQQJYC-OgNN7-oZ.js.br +0 -0
  394. package/dist/client/assets/quadrantDiagram-AXDQQJYC-OgNN7-oZ.js.gz +0 -0
  395. package/dist/client/assets/railroadDiagram-O6MQD6OU-Dmqw_B10.js.br +0 -0
  396. package/dist/client/assets/railroadDiagram-O6MQD6OU-Dmqw_B10.js.gz +0 -0
  397. package/dist/client/assets/rdpSession-tgxFIJYE.js.br +0 -0
  398. package/dist/client/assets/rdpSession-tgxFIJYE.js.gz +0 -0
  399. package/dist/client/assets/requirementDiagram-BXWQKSXE-nZK7--1f.js.gz +0 -0
  400. package/dist/client/assets/sankeyDiagram-P5KCCOFB-Db_TVWjx.js.br +0 -0
  401. package/dist/client/assets/sankeyDiagram-P5KCCOFB-Db_TVWjx.js.gz +0 -0
  402. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-B7TK9j0_.js.br +0 -0
  403. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-B7TK9j0_.js.gz +0 -0
  404. package/dist/client/assets/sizeCapture-INFHLROL-roX-pGgF.js.br +0 -0
  405. package/dist/client/assets/sizeCapture-INFHLROL-roX-pGgF.js.gz +0 -0
  406. package/dist/client/assets/sparkles-B64EiCUM.js +0 -1
  407. package/dist/client/assets/stateDiagram-D77RDMKH-BdBm0h1F.js.br +0 -0
  408. package/dist/client/assets/stateDiagram-D77RDMKH-BdBm0h1F.js.gz +0 -0
  409. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-ClZ2Tfz8.js +0 -1
  410. package/dist/client/assets/sun-BFxiDkET.js +0 -1
  411. package/dist/client/assets/swimlanes-42K2YHIH-DUulb0LD.js.br +0 -0
  412. package/dist/client/assets/swimlanes-42K2YHIH-DUulb0LD.js.gz +0 -0
  413. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-CGI6rSok.js +0 -8
  414. package/dist/client/assets/syntaxHighlight-Bgt0lmWx.js.br +0 -0
  415. package/dist/client/assets/syntaxHighlight-Bgt0lmWx.js.gz +0 -0
  416. package/dist/client/assets/timeline-definition-24CTP7MA-CIQuxjVB.js.br +0 -0
  417. package/dist/client/assets/timeline-definition-24CTP7MA-CIQuxjVB.js.gz +0 -0
  418. package/dist/client/assets/vennDiagram-4TSXK5OY-CMRFApvJ.js.br +0 -0
  419. package/dist/client/assets/vennDiagram-4TSXK5OY-CMRFApvJ.js.gz +0 -0
  420. package/dist/client/assets/videoCompression-DjyAuV3i.js.br +0 -0
  421. package/dist/client/assets/videoCompression-DjyAuV3i.js.gz +0 -0
  422. package/dist/client/assets/wardleyDiagram-VM6X3IG4-BEb3x-zl.js.br +0 -0
  423. package/dist/client/assets/wardleyDiagram-VM6X3IG4-BEb3x-zl.js.gz +0 -0
  424. package/dist/client/assets/xychartDiagram-S5SC5T6Z-DUvoeYl2.js.br +0 -0
@@ -1,6 +1,8 @@
1
1
  import { createHash } from 'node:crypto';
2
2
  import { Router } from 'express';
3
3
  import { encryptedRequestSubject } from '../federation/requestContext.js';
4
+ import { chatPresentation } from '../shared/chatPresentation.js';
5
+ import { CollaborationError } from './collaborationProtocol.js';
4
6
  /** Clients authorized to view this Session share its durable chat history.
5
7
  * Per-device delivery addresses remain stable for retries and explicit replies. */
6
8
  export function sessionChatRoutes(options) {
@@ -27,10 +29,30 @@ export function sessionChatRoutes(options) {
27
29
  return true;
28
30
  const original = message.toPrincipalId && message.replyTo ? options.store.getMessage(message.replyTo) : null;
29
31
  return original?.groupId === group.id && message.toPrincipalId === original.integrationOrigin?.integrationId && canSeeRequest(original);
30
- }).map(m => ({ id: m.id, role: m.toPrincipalId ? 'assistant' : 'user', content: m.content, createdAt: m.createdAt, status: m.status === 'read' ? 'delivered' : m.status, replyTo: m.replyTo, requestId: m.idempotencyKey, responseKind: m.responseKind })) : [];
32
+ }).map(m => ({ id: m.id, role: m.toPrincipalId ? 'assistant' : 'user', ...(m.toPrincipalId ? chatPresentation(m.content, m.metadata) : { content: m.content }), ...(m.uiState ? { uiState: m.uiState } : {}), createdAt: m.createdAt, status: m.status === 'read' ? 'delivered' : m.status, replyTo: m.replyTo, requestId: m.idempotencyKey, responseKind: m.responseKind })) : [];
31
33
  res.setHeader('Cache-Control', 'no-store');
32
34
  res.json({ messages, agentAvailable: !!ctx.session.agent, agent: ctx.session.agent ? { slug: ctx.session.agent.slug, displayName: ctx.session.agent.displayName || ctx.session.agent.slug } : null });
33
35
  });
36
+ router.put('/:sessionId/chat/:messageId/state', (req, res) => {
37
+ const ctx = context(req), body = req.body;
38
+ if (!ctx) {
39
+ res.status(404).json({ error: '会话不可用' });
40
+ return;
41
+ }
42
+ if (!body || typeof body !== 'object' || Object.keys(body).some(key => !['revision', 'values'].includes(key))) {
43
+ res.status(400).json({ error: '填写内容无效' });
44
+ return;
45
+ }
46
+ try {
47
+ res.json(options.store.saveChatUIState(String(req.params.messageId), ctx.session.sessionId, body.values, body.revision));
48
+ }
49
+ catch (error) {
50
+ if (error instanceof CollaborationError)
51
+ res.status(error.httpStatus).json({ error: error.message, ...error.details });
52
+ else
53
+ res.status(500).json({ error: '暂时无法保存,填写内容已保留' });
54
+ }
55
+ });
34
56
  router.post('/:sessionId/chat', (req, res) => {
35
57
  const ctx = context(req);
36
58
  if (!ctx) {
@@ -1461,6 +1461,11 @@ async function runAutomation(command) {
1461
1461
  });
1462
1462
  }
1463
1463
  async function runCollab(command) {
1464
+ if (command.action === 'ui') {
1465
+ const { chatUIPrompt } = await import('./agent/chatUIPrompt.js');
1466
+ console.log(command.options.text ? chatUIPrompt() : JSON.stringify({ version: 1, instructions: chatUIPrompt() }));
1467
+ return;
1468
+ }
1464
1469
  const runningState = getRunningState();
1465
1470
  if (command.options.principal) {
1466
1471
  process.exitCode = await runIntegrationCollab(command, runningState?.port ?? 9834, { write: line => console.log(line), stdin: readStdinText });
@@ -93,6 +93,9 @@ export function resolveAccessRequest(method, path) {
93
93
  const attachment = /^([^/]+)\/chat\/attachments$/.exec(route);
94
94
  if (method === 'POST' && attachment && !reservedSessionIds.has(attachment[1].toLowerCase()))
95
95
  return { action: 'session.input', sessionId: attachment[1] };
96
+ const chatState = /^([^/]+)\/chat\/[^/]+\/state$/.exec(route);
97
+ if (method === 'PUT' && chatState && !reservedSessionIds.has(chatState[1].toLowerCase()))
98
+ return { action: 'session.input', sessionId: chatState[1] };
96
99
  const session = /^([^/]+)(?:\/(health|attach|stream|input|resize|tmux|restart|agent-resume|chat|view-mode))?$/.exec(route);
97
100
  if (session && !reservedSessionIds.has(session[1].toLowerCase())) {
98
101
  const sessionId = session[1];
@@ -2,6 +2,7 @@ import { validShareResources, resourceSubset } from '../shared/shareResources.js
2
2
  import { randomUUID } from 'node:crypto';
3
3
  import { mkdirSync, readFileSync, openSync, writeFileSync, fsyncSync, closeSync, renameSync, unlinkSync } from 'node:fs';
4
4
  import { dirname } from 'node:path';
5
+ import { validSessionAppearances, restrictSessionAppearances } from '../shared/sessionAppearance.js';
5
6
  const id = (v) => typeof v === 'string' && v.length > 0 && v.length <= 512 && !/[\s\x00-\x1f]/.test(v);
6
7
  const action = (v) => typeof v === 'string' && (v === 'service:*' || /^[a-z][a-z0-9_-]*\.[a-z][a-z0-9_-]*$/.test(v));
7
8
  const object = (v) => !!v && typeof v === 'object' && !Array.isArray(v);
@@ -20,6 +21,7 @@ function validateInput(v) {
20
21
  keys(v.scope, ['kind', 'sessionIds']);
21
22
  }
22
23
  assert(v.resources === undefined || validShareResources(v.resources), 'shared resources');
24
+ assert(v.sessionAppearance === undefined || validSessionAppearances(v.sessionAppearance, v.scope), 'session appearance');
23
25
  assert(Array.isArray(v.actions) && v.actions.length > 0 && v.actions.length <= 256 && v.actions.every(action) && new Set(v.actions).size === v.actions.length, 'actions');
24
26
  if (v.scope.kind === 'sessions')
25
27
  assert(v.actions.every(a => a.startsWith('session.')), 'session scope cannot grant service or file capabilities');
@@ -88,7 +90,7 @@ export class AuthorizationStore {
88
90
  for (const value of data.grants) {
89
91
  validateInput(value);
90
92
  const g = value;
91
- keys(g, ['id', 'serviceId', 'createdAt', 'parentGrantId', 'revokedAt', 'subjectId', 'scope', 'actions', 'expiresAt', 'canDelegate', 'conditions', 'passwordCredential', 'resources']);
93
+ keys(g, ['id', 'serviceId', 'createdAt', 'parentGrantId', 'revokedAt', 'subjectId', 'scope', 'actions', 'expiresAt', 'canDelegate', 'conditions', 'passwordCredential', 'resources', 'sessionAppearance']);
92
94
  assert(id(g.id) && g.serviceId === this.options.serviceId && Number.isSafeInteger(g.createdAt) && g.createdAt >= 0, 'grant metadata');
93
95
  assert(g.parentGrantId === undefined || id(g.parentGrantId), 'parent identity');
94
96
  assert(g.revokedAt === undefined || (Number.isSafeInteger(g.revokedAt) && g.revokedAt >= 0), 'revocation');
@@ -124,7 +126,7 @@ export class AuthorizationStore {
124
126
  }
125
127
  create(input) {
126
128
  validateInput(input);
127
- keys(input, ['subjectId', 'scope', 'actions', 'expiresAt', 'canDelegate', 'conditions', 'resources']);
129
+ keys(input, ['subjectId', 'scope', 'actions', 'expiresAt', 'canDelegate', 'conditions', 'resources', 'sessionAppearance']);
128
130
  const now = this.now();
129
131
  assert(input.expiresAt === undefined || input.expiresAt > now, 'already expired');
130
132
  return { ...structuredClone(input), id: randomUUID(), serviceId: this.options.serviceId, createdAt: now };
@@ -185,8 +187,10 @@ export class AuthorizationStore {
185
187
  changed++;
186
188
  if (!remaining.length)
187
189
  grant.revokedAt = this.now();
188
- else
190
+ else {
189
191
  grant.scope = { kind: 'sessions', sessionIds: remaining };
192
+ grant.sessionAppearance = restrictSessionAppearances(grant.sessionAppearance, remaining);
193
+ }
190
194
  }
191
195
  if (changed)
192
196
  this.save(grants);
@@ -2,6 +2,7 @@ import { validShareResources } from '../shared/shareResources.js';
2
2
  import { createHash, randomBytes, randomUUID } from 'node:crypto';
3
3
  import { mkdirSync, readFileSync, openSync, writeFileSync, fsyncSync, closeSync, renameSync, unlinkSync, chmodSync } from 'node:fs';
4
4
  import { dirname } from 'node:path';
5
+ import { validSessionAppearances, restrictSessionAppearances } from '../shared/sessionAppearance.js';
5
6
  const TTL = 10 * 60 * 1000;
6
7
  const actions = new Set(['session.view', 'session.input', 'session.resize', 'session.terminate']);
7
8
  const identity = (v) => typeof v === 'string' && v.length > 0 && v.length <= 512 && !/[\s\x00-\x1f]/.test(v);
@@ -9,9 +10,10 @@ const record = (v) => !!v && typeof v === 'object' && !Array.isArray(v);
9
10
  function requireValid(ok) { if (!ok)
10
11
  throw new Error('INVALID_INVITATION'); }
11
12
  export function validateInvitation(input) {
12
- requireValid(record(input) && Object.keys(input).every(k => ['scope', 'actions', 'label', 'expiresAt', 'resources'].includes(k)));
13
+ requireValid(record(input) && Object.keys(input).every(k => ['scope', 'actions', 'label', 'expiresAt', 'resources', 'sessionAppearance'].includes(k)));
13
14
  requireValid(record(input.scope) && Array.isArray(input.actions) && input.actions.length > 0 && new Set(input.actions).size === input.actions.length);
14
15
  requireValid(input.resources === undefined || validShareResources(input.resources));
16
+ requireValid(input.sessionAppearance === undefined || validSessionAppearances(input.sessionAppearance, input.scope));
15
17
  const scope = input.scope;
16
18
  if (scope.kind === 'service') {
17
19
  requireValid(Object.keys(scope).length === 1 && ((input.actions.length === 1 && input.actions[0] === 'service:*') || input.actions.every(a => typeof a === 'string' && actions.has(a))));
@@ -52,9 +54,9 @@ export class InvitationStore {
52
54
  requireValid(record(data) && data.version === 1 && data.serviceId === this.options.serviceId && Array.isArray(data.invitations) && data.invitations.length <= 2048);
53
55
  const seen = new Set();
54
56
  for (const item of data.invitations) {
55
- requireValid(record(item) && Object.keys(item).every(k => ['scope', 'actions', 'label', 'expiresAt', 'hash', 'issuerId', 'createdAt', 'invitationExpiresAt', 'consumedAt', 'consumedBy', 'resources'].includes(k)));
56
- const { scope, actions, resources, label, expiresAt, hash, issuerId, createdAt, invitationExpiresAt, consumedAt, consumedBy } = item;
57
- validateInvitation({ scope, actions, ...(resources === undefined ? {} : { resources }), ...(label === undefined ? {} : { label }), ...(expiresAt === undefined ? {} : { expiresAt }) });
57
+ requireValid(record(item) && Object.keys(item).every(k => ['scope', 'actions', 'label', 'expiresAt', 'hash', 'issuerId', 'createdAt', 'invitationExpiresAt', 'consumedAt', 'consumedBy', 'resources', 'sessionAppearance'].includes(k)));
58
+ const { scope, actions, resources, sessionAppearance, label, expiresAt, hash, issuerId, createdAt, invitationExpiresAt, consumedAt, consumedBy } = item;
59
+ validateInvitation({ scope, actions, ...(resources === undefined ? {} : { resources }), ...(sessionAppearance === undefined ? {} : { sessionAppearance }), ...(label === undefined ? {} : { label }), ...(expiresAt === undefined ? {} : { expiresAt }) });
58
60
  requireValid(typeof hash === 'string' && /^[a-f0-9]{64}$/.test(hash) && !seen.has(hash) && identity(issuerId));
59
61
  seen.add(hash);
60
62
  requireValid(Number.isSafeInteger(createdAt) && Number.isSafeInteger(invitationExpiresAt) && Number(invitationExpiresAt) === Number(createdAt) + TTL);
@@ -89,7 +91,7 @@ export class InvitationStore {
89
91
  listPending() {
90
92
  const now = this.now();
91
93
  return this.read().filter(i => i.consumedAt === undefined && i.invitationExpiresAt > now && (i.expiresAt === undefined || i.expiresAt > now))
92
- .map(({ hash, scope, actions, resources, label, expiresAt, createdAt, invitationExpiresAt }) => ({ id: hash, scope, actions, ...(resources === undefined ? {} : { resources }), ...(label ? { label } : {}), ...(expiresAt === undefined ? {} : { expiresAt }), createdAt, invitationExpiresAt }));
94
+ .map(({ hash, scope, actions, resources, sessionAppearance, label, expiresAt, createdAt, invitationExpiresAt }) => ({ id: hash, scope, actions, ...(resources === undefined ? {} : { resources }), ...(sessionAppearance === undefined ? {} : { sessionAppearance }), ...(label ? { label } : {}), ...(expiresAt === undefined ? {} : { expiresAt }), createdAt, invitationExpiresAt }));
93
95
  }
94
96
  revoke(id) {
95
97
  const current = this.read();
@@ -113,6 +115,7 @@ export class InvitationStore {
113
115
  if (!remaining.length)
114
116
  return false;
115
117
  invitation.scope = { kind: 'sessions', sessionIds: remaining };
118
+ invitation.sessionAppearance = restrictSessionAppearances(invitation.sessionAppearance, remaining);
116
119
  return true;
117
120
  });
118
121
  if (changed)
@@ -150,7 +153,7 @@ export class InvitationStore {
150
153
  invite.consumedAt = now;
151
154
  invite.consumedBy = subjectId;
152
155
  this.save(current);
153
- return { subjectId, ...(invite.resources ? { resources: structuredClone(invite.resources) } : {}), scope: structuredClone(invite.scope), actions: [...invite.actions], ...(invite.expiresAt === undefined ? {} : { expiresAt: invite.expiresAt }), canDelegate: false };
156
+ return { subjectId, ...(invite.resources ? { resources: structuredClone(invite.resources) } : {}), ...(invite.sessionAppearance ? { sessionAppearance: structuredClone(invite.sessionAppearance) } : {}), scope: structuredClone(invite.scope), actions: [...invite.actions], ...(invite.expiresAt === undefined ? {} : { expiresAt: invite.expiresAt }), canDelegate: false };
154
157
  }
155
158
  subjectLabels() {
156
159
  return Object.fromEntries(this.read().filter(i => i.consumedBy && i.label).map(i => [i.consumedBy, i.label]));
@@ -407,14 +407,18 @@ export async function createFederationRuntime(app, directory, handlers, options
407
407
  }
408
408
  else if (packet.type === 'session-list') {
409
409
  const inventory = await sessionInventory();
410
+ const displayGrants = store.listEffective({ subjectId, serviceId }).filter(grant => grant.actions.includes('session.view')).reverse().sort((a, b) => b.createdAt - a.createdAt);
410
411
  const seen = new Set();
411
412
  const items = inventory.flatMap(session => {
412
413
  const sessionId = session.backendSessionId;
413
414
  if (typeof sessionId !== 'string' || !sessionId || seen.has(sessionId) || !allowed(subjectId, 'session.view', sessionId))
414
415
  return [];
415
416
  seen.add(sessionId);
417
+ const matches = (id) => id === session.sessionId || id === sessionId || stableSessionId(id) === session.sessionId;
418
+ const displayGrant = displayGrants.find(grant => grant.scope.kind === 'service' || grant.scope.sessionIds.some(matches));
419
+ const appearance = Object.entries(displayGrant?.sessionAppearance || {}).find(([id]) => matches(id))?.[1];
416
420
  return [{ sessionId, ...(typeof session.sessionId === 'string' ? { sourceSessionId: session.sessionId } : {}),
417
- name: collaborationSessionDisplayName({ ...session, name: typeof session.name === 'string' ? session.name : sessionId }), live: session.live === true,
421
+ name: appearance?.name || collaborationSessionDisplayName({ ...session, name: typeof session.name === 'string' ? session.name : sessionId }), ...(appearance?.icon ? { icon: appearance.icon } : {}), live: session.live === true,
418
422
  canWrite: allowed(subjectId, 'session.input', sessionId), canResize: allowed(subjectId, 'session.resize', sessionId) }];
419
423
  });
420
424
  send({ type: 'result', id: packet.id, items });
@@ -491,6 +495,7 @@ export async function createFederationRuntime(app, directory, handlers, options
491
495
  else if (packet.type === 'invite-create') {
492
496
  check('authorization.manage');
493
497
  const invitation = { scope: packet.scope, actions: packet.actions, ...(packet.resources === undefined ? {} : { resources: packet.resources }),
498
+ ...(packet.sessionAppearance === undefined ? {} : { sessionAppearance: packet.sessionAppearance }),
494
499
  ...(packet.label === undefined ? {} : { label: packet.label }),
495
500
  ...(packet.expiresAt === undefined ? {} : { expiresAt: packet.expiresAt }) };
496
501
  validateInvitation(invitation);
@@ -514,6 +519,8 @@ export async function createFederationRuntime(app, directory, handlers, options
514
519
  const sessionIds = invitation.scope.sessionIds.map(id => stable.get(id)).filter((id) => typeof id === 'string');
515
520
  if (sessionIds.length !== invitation.scope.sessionIds.length || new Set(sessionIds).size !== sessionIds.length)
516
521
  throw new Error('UNKNOWN_SESSION');
522
+ if (invitation.sessionAppearance)
523
+ invitation.sessionAppearance = Object.fromEntries(Object.entries(invitation.sessionAppearance).map(([id, appearance]) => [stable.get(id), appearance]));
517
524
  invitation.scope = { kind: 'sessions', sessionIds };
518
525
  }
519
526
  check('authorization.manage');
@@ -0,0 +1,36 @@
1
+ /** TD reply body stays readable to old clients; rich content is an explicit,
2
+ * versioned opt-in, never guessed from terminal output or ordinary code fences. */
3
+ export const CHAT_UI_VERSION = 1;
4
+ const record = (value) => !!value && typeof value === 'object' && !Array.isArray(value);
5
+ export function chatPresentation(content, metadata) {
6
+ if (!record(metadata?.openui))
7
+ return { content };
8
+ try {
9
+ const body = JSON.parse(content);
10
+ if (!record(body) || typeof body.text !== 'string' || !body.text.trim() || body.text.length > 32000)
11
+ return { content: '这条回复暂时无法显示,请让对方重新发送文字说明。' };
12
+ if (metadata.openui.version !== CHAT_UI_VERSION || typeof body.ui !== 'string' || !body.ui.trim() || body.ui.length > 64000)
13
+ return { content: body.text };
14
+ return { content: body.text, ui: { version: CHAT_UI_VERSION, code: body.ui } };
15
+ }
16
+ catch {
17
+ return { content: '这条回复暂时无法显示,请让对方重新发送文字说明。' };
18
+ }
19
+ }
20
+ export function validChatUIValues(value) {
21
+ let nodes = 0;
22
+ const valid = (item, depth) => {
23
+ if (++nodes > 2000 || depth > 8)
24
+ return false;
25
+ if (item === null || typeof item === 'boolean')
26
+ return true;
27
+ if (typeof item === 'number')
28
+ return Number.isFinite(item);
29
+ if (typeof item === 'string')
30
+ return item.length <= 8000;
31
+ if (Array.isArray(item))
32
+ return item.length <= 300 && item.every(child => valid(child, depth + 1));
33
+ return record(item) && Object.keys(item).length <= 100 && Object.entries(item).every(([key, child]) => key.length <= 128 && !['__proto__', 'prototype', 'constructor'].includes(key) && valid(child, depth + 1));
34
+ };
35
+ return record(value) && valid(value, 0) && new TextEncoder().encode(JSON.stringify(value)).length <= 32000;
36
+ }
@@ -0,0 +1,26 @@
1
+ import { action, createLibrary, defineComponent } from '@openuidev/lang-core';
2
+ import { z } from 'zod/v4';
3
+ const text = z.string().max(16000), short = z.string().max(160), name = z.string().regex(/^[a-zA-Z][a-zA-Z0-9_-]{0,63}$/);
4
+ const cell = z.union([z.string().max(4000), z.number().finite(), z.boolean(), z.null()]);
5
+ export const chatUISchemas = {
6
+ Text: z.object({ content: text }),
7
+ Metric: z.object({ label: short, value: short, detail: short.optional() }),
8
+ Callout: z.object({ title: short, content: text, tone: z.enum(['info', 'success', 'warning']).optional() }),
9
+ Table: z.object({ columns: z.array(short).min(1).max(12), rows: z.array(z.array(cell).max(12)).max(300), caption: short.optional() }),
10
+ Chart: z.object({ title: short, labels: z.array(short).min(1).max(30), series: z.array(z.object({ name: short, values: z.array(z.number().finite()).max(30) })).min(1).max(6), kind: z.enum(['bar', 'line']).optional() }),
11
+ Checklist: z.object({ title: short, items: z.array(z.object({ label: short, detail: short.optional(), done: z.boolean() })).max(30) }),
12
+ Input: z.object({ name, label: short, placeholder: short.optional(), required: z.boolean().optional() }),
13
+ Select: z.object({ name, label: short, options: z.array(short).min(1).max(50), required: z.boolean().optional() }),
14
+ Checkbox: z.object({ name, label: short }),
15
+ Button: z.object({ label: short, action: action().optional() }),
16
+ Resource: z.object({ label: short, kind: z.enum(['file', 'link']), target: z.string().max(4096), description: short.optional() }),
17
+ };
18
+ const components = Object.entries(chatUISchemas).map(([key, props]) => defineComponent({ name: key, props, component: null, description: {
19
+ Text: 'Markdown prose using the shared preview renderer.', Metric: 'A known metric with label, value and optional context.', Callout: 'An important explanation; tone info/success/warning.', Table: 'A comparison table with horizontally scrollable, filterable and sortable rows.', Chart: 'A chart of supplied factual values. Do not invent values.', Checklist: 'Explicitly reported checklist items, never inferred Agent activity.',
20
+ Input: 'Text field inside Form; name must be unique in that form.', Select: 'Selection field inside Form.', Checkbox: 'Checkbox inside Form.', Button: 'Clickable action. @ToAssistant(message) continues this same conversation; inside Form also sends the form values.', Resource: 'User-opened file preview or external web link. Use an authorized absolute path for files.',
21
+ }[key] }));
22
+ const refs = z.union(components.map(component => component.ref));
23
+ const Form = defineComponent({ name: 'Form', description: 'User question form. Include Input/Select/Checkbox and a Button with @ToAssistant. Never nest forms.', props: z.object({ name, title: short, fields: z.array(refs).max(30) }), component: null });
24
+ const Card = defineComponent({ name: 'Card', description: 'A titled result card, with text, metrics, charts, tables or a form.', props: z.object({ title: short, content: z.array(z.union([refs, Form.ref])).max(30) }), component: null });
25
+ const Stack = defineComponent({ name: 'Stack', description: 'Root vertical layout of answer components.', props: z.object({ content: z.array(z.union([refs, Form.ref, Card.ref])).max(40) }), component: null });
26
+ export const chatUILibrary = createLibrary({ id: 'termdock-chat@1', root: 'Stack', components: [...components, Form, Card, Stack] });
@@ -0,0 +1,17 @@
1
+ export const SESSION_ICONS = ['message', 'sparkles', 'bot', 'code', 'file', 'briefcase', 'lightbulb', 'rocket'];
2
+ const record = (value) => !!value && typeof value === 'object' && !Array.isArray(value);
3
+ export function validSessionIcon(value) {
4
+ return typeof value === 'string' && value.length <= 32 && (SESSION_ICONS.includes(value)
5
+ || /^(?:\p{Regional_Indicator}{2}|[#*0-9]\uFE0F?\u20E3|\p{Extended_Pictographic}[\uFE0F\p{Emoji_Modifier}]*(?:\u200D\p{Extended_Pictographic}[\uFE0F\p{Emoji_Modifier}]*)*)$/u.test(value));
6
+ }
7
+ export function validSessionAppearances(value, scope) {
8
+ if (!record(scope) || scope.kind !== 'sessions' || !Array.isArray(scope.sessionIds))
9
+ return false;
10
+ const ids = scope.sessionIds;
11
+ return record(value) && Object.keys(value).length <= 256 && Object.entries(value).every(([id, appearance]) => ids.includes(id) && record(appearance) && Object.keys(appearance).length > 0 && Object.keys(appearance).every(key => ['name', 'icon'].includes(key))
12
+ && (appearance.name === undefined || typeof appearance.name === 'string' && appearance.name.trim().length > 0 && appearance.name.length <= 80 && !/[\x00-\x1f\x7f\u202a-\u202e\u2066-\u2069]/.test(appearance.name))
13
+ && (appearance.icon === undefined || validSessionIcon(appearance.icon)));
14
+ }
15
+ export function restrictSessionAppearances(value, ids) {
16
+ return value && Object.fromEntries(Object.entries(value).filter(([id]) => ids.includes(id)));
17
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "termdock",
3
- "version": "1.4.354",
3
+ "version": "1.4.355",
4
4
  "description": "A complete web-based terminal application with modern UI",
5
5
  "type": "module",
6
6
  "main": ".desktop-dist/main.js",
@@ -66,6 +66,8 @@
66
66
  "@libp2p/utils": "7.0.7",
67
67
  "@noble/hashes": "2.4.0",
68
68
  "@novnc/novnc": "^1.7.0",
69
+ "@openuidev/lang-core": "1.0.1",
70
+ "@openuidev/react-lang": "1.0.1",
69
71
  "@peculiar/x509": "2.2.0",
70
72
  "@serenity-kit/opaque": "1.1.0",
71
73
  "@types/cookie-parser": "^1.4.10",
@@ -111,6 +113,7 @@
111
113
  "web-push": "^3.6.7",
112
114
  "ws": "^8.21.0",
113
115
  "yaml": "^2.9.1",
116
+ "zod": "4.6.7",
114
117
  "zustand": "^4.5.0"
115
118
  },
116
119
  "devDependencies": {
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "packageName": "termdock",
4
- "version": "1.4.354",
4
+ "version": "1.4.355",
5
5
  "runtimeProtocolVersion": 1,
6
6
  "minimumDesktopVersion": "1.4.46",
7
7
  "nodeMajor": 22,
8
- "dependencyHash": "sha256-ObG1OGq7e7fMFQmYoPxPp3jRodEusYHulVNa5mT1aW8=",
9
- "serverBundleHash": "sha256-BytBn+wZV+5Djv9XYLw86ORzRirpOjdtlg/oM+wPdWs=",
10
- "clientBundleHash": "sha256-WZsLgBHIwqpKOiCPDz+7avZBlO8N11O2Nz0xqptny1U=",
8
+ "dependencyHash": "sha256-uodaeckvlR6JDQ73ORIEefAICJ13wyApaFoGn2b0/GA=",
9
+ "serverBundleHash": "sha256-guzvabFPHH9BA9bBZxhoGeLJZf9hPz83DLdlOmR4Psw=",
10
+ "clientBundleHash": "sha256-Qq2hFE8tXDI4bnxNuwTNW3kZi0/1dycv4SNTFHT/jfk=",
11
11
  "entrypoint": "dist/server/cli.js",
12
12
  "clientEntrypoint": "dist/client/index.html"
13
13
  }
@@ -1,2 +0,0 @@
1
- import{aR as ie,e6 as ce,cc as s,g as le,L as de}from"./app-stNRNTO-.js";import{b as D}from"./dnd-BCFAPC0L.js";import{S as me}from"./sparkles-B64EiCUM.js";import{C as he}from"./chevron-left-ZgHOf4aC.js";import{M as ue}from"./maximize-2-dFjMEqgh.js";import{G as xe,T as fe,C as pe}from"./triangle-alert-LpKfIn7N.js";const ye=[["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"}]],ge=ie("minimize-2",ye);function be(t,d){return(d?t.filter(o=>o.repoRoot===d):t).slice().sort((o,r)=>r.injectedAt-o.injectedAt)[0]??null}function ke(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 ve(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:ve(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,Ne=28,C=16,J=18,T=54,ee=24,re=18,we=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 je(t,d){return`${t.from}->${t.to}:${d}`}function Me(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)*re)}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)*re);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 Ee(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+we))});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(Me(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+Ne})}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:je(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)})}Ee(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 _e(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 De(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 Ce({walkthroughs:t,repoRoot:d,onNavigate:i,fullscreen:o=!1,onToggleFullscreen:r}){const{t:g}=ce(),l=D.useId(),a=be(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(me,{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(he,{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(ge,{size:15}):s.jsx(ue,{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(xe,{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=_e(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:_}=De(e),k=te(e.index),Z=I===e.key||!!U?.has(e.key),ae=!!((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:ae?.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
- ${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 ${ke(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(de,{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(fe,{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(pe,{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{Ce as C,ge as M};
@@ -1 +0,0 @@
1
- import{e5 as B,cj as K,bd as U,bG as Y,dN as q,cc as e,x as F,b$ as k,R as C,S as H}from"./app-stNRNTO-.js";import{b as s}from"./dnd-BCFAPC0L.js";import{m as a,c as J,k as Q,P as X,W as Z,C as ee,o as te,e as se}from"./App-CqLXOAnv.js";import"./react-XDCjal2T.js";import"./terminal-Dea8wJF3.js";import"./link-D-fkBp5k.js";import"./AndroidMirrorView-D9CMPmet.js";import"./v4-EwEgHOG0.js";import"./RecordingSaveDialog-1YvzwTzo.js";import"./use-gesture-react.esm-DYpdiE_k.js";import"./gestureArbiter-DszagC-d.js";import"./arrow-up-DE9Z7GTI.js";import"./unplug-CLBg6VOD.js";import"./swiper-DJjq1TYT.js";import"./loader-circle-DZn9iP0u.js";import"./clipboardText-B0NK9NMn.js";import"./GitLoadingSkeleton-ieGTuTuO.js";import"./clipboard-BGpbRBdi.js";import"./triangle-alert-LpKfIn7N.js";import"./sun-BFxiDkET.js";import"./maximize-2-dFjMEqgh.js";import"./git-compare-C7n2uha2.js";import"./arrow-down-DaWRHIlh.js";function Se({groupId:n,activeSessionId:u,onOpenSidebar:w,leftSidebarVisible:S=!1,onToggleRightSidebar:x,rightSidebarOpen:p=!1,defaultSessionMode:E}){const b=s.useRef(null);s.useEffect(()=>{b.current?.focus()},[]);const[i,h]=s.useState(null),[R,P]=s.useState([]),[l,d]=s.useState(null),[g,D]=s.useState(null),[f,G]=s.useState(null),[z,T]=s.useState(null),r=B(),[L,j]=s.useState(!1);s.useEffect(()=>{if(r==="ready"){j(!1);return}const t=setTimeout(()=>j(!0),1e3);return()=>clearTimeout(t)},[r]);const V=a(t=>t.view),W=a(t=>t.drafts),y=a(t=>t.setDraft),[A,M]=s.useState(n),c=s.useCallback(async()=>{try{const t=await K();h(t),d(null)}catch(t){d(t instanceof Error?t.message:"协作组加载失败")}},[]);s.useEffect(()=>{let t=!1;U().then(o=>{t||P(o)}).catch(()=>{}),Y().then(o=>{if(t)return;const O=o.collaborationPanels?.[J()]?.drafts;for(const[v,_]of Object.entries(O??{}))a.getState().drafts[v]||y(v,_)}).catch(()=>{});const $=q(o=>{t||(h(o),d(null))}),I=Q(()=>{navigator.onLine!==!1&&c()},1e4,[H,"pageshow"]);return()=>{t=!0,$(),I()}},[c]);const m=i?.groups.find(t=>t.id===n),N=async t=>{await se(t),a.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:w,children:e.jsx(X,{size:17})}),e.jsx(Z,{size:18,className:"hidden shrink-0 text-primary sm:block"}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("h2",{ref:b,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} 位成员`:"正在连接工作组"})]}),x&&e.jsx("button",{type:"button","aria-label":"文件侧栏",title:"文件侧栏","aria-pressed":p,className:`inline-flex min-h-11 min-w-11 items-center justify-center rounded-lg ${p?"bg-surface-2 text-primary":"text-muted-foreground hover:bg-surface-2"}`,onClick:x,children:e.jsx(F,{size:17})})]}),e.jsxs("div",{className:"flex min-h-0 flex-1 flex-col px-4 py-2 sm:px-6",children:[(L||k(l))&&e.jsxs("div",{role:"status",className:"mb-2 flex shrink-0 items-center gap-2 text-xs text-muted-foreground",children:[e.jsx(C,{size:13,className:r==="offline"?"":"animate-spin"}),e.jsx("span",{children:r==="offline"?"网络已断开,联网后自动恢复":"正在恢复连接,当前结果和草稿已保留"})]}),(g||l&&r==="ready"&&!k(l))&&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:g||l}),e.jsx("button",{type:"button","aria-label":"重新加载协作组",className:"min-h-11 px-3",onClick:()=>{c()},children:e.jsx(C,{size:14})})]}),f&&e.jsx("p",{role:"status",className:"mb-3 shrink-0 text-xs text-primary",children:f}),i?m?e.jsx(ee,{fullWorkspace:!0,initialView:V,active:!0,notice:f,groups:i.groups,sessions:i.sessions,agents:R,sessionsState:"loaded",selectedGroupId:A,setSelectedGroupId:M,initialGroupId:n,activeSessionId:u,initialDrafts:W,onDraftChange:y,docked:!1,inputKeySuffix:"main",floatingVisible:!0,floating:!1,onOpenSession:N,onOpenTaskSession:N,onDockMessages:u?async()=>{await te(n,u)}:void 0,defaultSessionMode:E,busy:z,setBusy:T,setError:D,setNotice:G,refresh:c}):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{Se as default};
@@ -1 +0,0 @@
1
- import{cc as t}from"./app-stNRNTO-.js";import{C as s}from"./ChangeWalkthroughPanel-BYb27GTC.js";import"./react-XDCjal2T.js";import"./dnd-BCFAPC0L.js";import"./terminal-Dea8wJF3.js";import"./sparkles-B64EiCUM.js";import"./chevron-left-ZgHOf4aC.js";import"./maximize-2-dFjMEqgh.js";import"./triangle-alert-LpKfIn7N.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 m(){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{m as DagPlayground};
@@ -1 +0,0 @@
1
- import{aR as ut,cc as r,p as dt,g as ft,f as ht,e6 as mt,en as pt,b7 as xt,c as gt,em as vt,cC as bt,a0 as yt}from"./app-stNRNTO-.js";import{b as o,r as Ye}from"./dnd-BCFAPC0L.js";import{h as Je}from"./gestureArbiter-DszagC-d.js";import{S as wt,a as Ke}from"./swiper-DJjq1TYT.js";import{S as Ze}from"./sparkles-B64EiCUM.js";import{L as kt}from"./list-tree-DKTcSR9r.js";import{D as Rt,i as jt}from"./DiffViewer-Cg3GhKcU.js";const Nt=[["path",{d:"M3 5h.01",key:"18ugdj"}],["path",{d:"M3 12h.01",key:"nlz23k"}],["path",{d:"M3 19h.01",key:"noohij"}],["path",{d:"M8 5h13",key:"1pao27"}],["path",{d:"M8 12h13",key:"1za7za"}],["path",{d:"M8 19h13",key:"m83p4d"}]],Tt=ut("list",Nt);function et({selected:t,depth:n=0,title:c,leading:m,children:h,trailing:i,role:y,tabIndex:x,ariaExpanded:g,onClick:f,onKeyDown:b,onPointerDown:z,onPointerUp:M,onPointerCancel:F,dataAttributes:B}){return r.jsxs("div",{role:y,tabIndex:x,"aria-expanded":g,title:c,onClick:f,onKeyDown:b,onPointerDown:z,onPointerUp:M,onPointerCancel:F,...B,className:`group flex w-full cursor-pointer items-center gap-1 rounded px-2 py-1.5 text-left text-[13px] transition active:scale-[0.99] ${t?"bg-surface-elevated text-foreground":"text-muted-foreground hover:bg-surface-2 hover:text-foreground"}`,style:{paddingLeft:`${n*14+8}px`},children:[r.jsx("span",{className:"flex min-w-[14px] shrink-0 items-center justify-center text-muted-foreground/80",children:m}),r.jsx("span",{className:"min-w-0 flex-1",children:h}),i]})}function tt(t){return t.path.replace(/^\/+/,"")}function Mt(t){if(t.displayName!==void 0||t.displayDir!==void 0)return{name:t.displayName||t.path,dir:t.displayDir||""};const n=t.path.split("/").filter(Boolean);return{name:n.pop()||t.path,dir:n.join("/")}}function rt(t,n){const c=new Map,m=(i,y,x,g)=>{const f=i.get(y);if(f)return f;const b={path:x,name:y,childCount:0,directories:[],files:[]};return i.set(y,b),g?.directories.push(b),b};for(const i of t){const y=n(i).split("/").filter(Boolean);if(y.length<=1)continue;let x=c,g=null,f="";for(const b of y.slice(0,-1)){f=f?`${f}/${b}`:b;const z=m(x,b,f,g);g=z,x=new Map(z.directories.map(M=>[M.name,M]))}g?.files.push(i)}const h=i=>{const y=i.directories.map(h).sort((g,f)=>g.name.localeCompare(f.name)),x=i.files.sort((g,f)=>g.path.localeCompare(f.path));return{...i,directories:y,files:x,childCount:y.reduce((g,f)=>g+f.childCount,0)+x.length}};return Array.from(c.values()).map(h).sort((i,y)=>i.name.localeCompare(y.name))}function Pe(t,n,c=0){const m=n.selectedKey===t.key||n.selectedKey===t.path||n.selectedKey===t.absolutePath,h=Mt(t);return r.jsx(et,{selected:m,role:"button",tabIndex:0,title:t.title??t.absolutePath??t.path,onClick:()=>{Je()||n.onSelectFile(t)},onKeyDown:i=>{i.key!=="Enter"&&i.key!==" "||(i.preventDefault(),n.onSelectFile(t))},leading:n.renderLeading(t),depth:c,trailing:n.renderTrailing?.(t),dataAttributes:{"data-diff-selection-path":t.key,"data-diff-file-path":t.path,"data-diff-absolute-path":t.absolutePath??"","data-diff-status":t.status},children:r.jsxs("span",{className:"select-text","data-sidebar-selectable":!0,children:[r.jsx("span",{className:`block truncate leading-snug ${m?"font-medium":""}`,children:h.name}),n.mode!=="tree"&&h.dir&&r.jsx("span",{className:"block truncate text-[10px] text-muted-foreground/75",children:h.dir}),n.renderSubtitle?.(t)]})},t.key)}function nt(t,n,c,m,h){let i=t;const y=[t.name];for(;i.files.length===0&&i.directories.length===1;)i=i.directories[0],y.push(i.name);const x=y.join("/"),g=`${n}:${i.path}`,f=c.collapsedDirectoryKeys.has(g);return r.jsxs("div",{className:"space-y-px",children:[r.jsx(et,{role:"button",tabIndex:0,onClick:()=>{Je()||c.onToggleDirectory(g)},onKeyDown:b=>{b.key!=="Enter"&&b.key!==" "||(b.preventDefault(),c.onToggleDirectory(g))},ariaExpanded:!f,depth:m,title:i.path,leading:f?r.jsx(ft,{size:13}):r.jsx(ht,{size:13}),trailing:r.jsxs("span",{className:"flex shrink-0 items-center gap-1",children:[r.jsx("span",{className:"shrink-0 rounded bg-surface-2 px-1.5 py-0.5 text-[10px] text-muted-foreground/60 transition group-hover:text-muted-foreground",children:i.childCount}),c.renderDirectoryTrailing?.(i.path,h)]}),children:r.jsxs("span",{className:"flex min-w-0 items-center gap-1",children:[r.jsx(dt,{size:14,className:"shrink-0 text-[color:var(--folder)]"}),r.jsx("span",{className:"min-w-0 flex-1 truncate leading-snug select-text","data-sidebar-selectable":!0,children:x})]})}),!f&&r.jsxs("div",{className:"space-y-px",children:[i.directories.map(b=>nt(b,n,c,m+1,h)),i.files.length>0&&r.jsx("div",{className:"space-y-px",children:i.files.map(b=>Pe(b,c,m+1))})]})]},g)}function St(t,n){const c=n.getFileTreePath??tt,m=t.files.filter(i=>c(i).split("/").filter(Boolean).length<=1),h=rt(t.files,c);return r.jsxs("div",{className:"space-y-px",children:[h.map(i=>nt(i,t.key,n,0,t)),m.length>0&&r.jsx("div",{className:"space-y-px",children:m.map(i=>Pe(i,n))})]})}function Dt(t,n=tt){const c=[],m=i=>{for(const y of i.directories)m(y);c.push(...i.files)};for(const i of rt(t,n))m(i);const h=new Set(c.map(i=>i.key));return c.push(...t.filter(i=>!h.has(i.key))),c}function It(t){return r.jsx("div",{className:t.mode==="tree"?"space-y-px pt-1":"space-y-2",children:t.groups.map(n=>{const c=!!n.header,m=!!n.collapsed;return r.jsxs("section",{className:c?"overflow-hidden rounded-lg border border-border/15 bg-surface/60":"",children:[n.header,!m&&r.jsx("div",{className:t.mode==="tree"?c?"space-y-px bg-surface/60 p-1":"space-y-px":c?"space-y-px bg-surface/60 p-1.5":"space-y-px",children:t.mode==="tree"?St(n,t):n.files.map(h=>Pe(h,t))})]},n.key)})})}const Ce="termdock:diff-review:list-width:v1",Et=120,He=320,qe=220,Ct=560;function Ft(t){return typeof t=="number"&&Number.isFinite(t)}function Ue(t,n){const c=Math.max(qe,n-360),m=Math.min(Ct,c);return Math.min(m,Math.max(qe,t))}function _t(){return bt(Ce,Ft)??He}function At({list:t,detail:n,mobile:c,mobileListHeader:m,mobileDetailHeader:h,desktopListHeader:i,backLabel:y,onMobileSlideChange:x,externalSwiperRef:g,desktopLayout:f="split",onDetailScroll:b,desktopSidePanel:z,desktopListClassName:M,detailOwnsScroll:F=!1}){const{t:B}=mt(),P=o.useRef(null),q=o.useRef(null),I=o.useRef(null),[U,$]=o.useState(_t);o.useEffect(()=>{if(c||f!=="split")return;const p=q.current;p&&$(j=>Ue(j,p.clientWidth))},[f,c]);const ae=o.useCallback(p=>{c||f!=="split"||(p.preventDefault(),I.current={startX:p.clientX,startWidth:U,pointerId:p.pointerId},p.currentTarget.setPointerCapture(p.pointerId))},[f,U,c]),ue=o.useCallback(p=>{const j=I.current;if(!j||j.pointerId!==p.pointerId)return;const S=q.current?.clientWidth??window.innerWidth,_=Ue(j.startWidth+p.clientX-j.startX,S);$(_),pt(Ce,_,Et)},[]),ie=o.useCallback(p=>{const j=I.current;if(!(!j||j.pointerId!==p.pointerId)){I.current=null,xt(Ce);try{p.currentTarget.releasePointerCapture(p.pointerId)}catch{}}},[]);if(c){const p=()=>{const v=P.current;v&&v.slideTo(1)},j=()=>{const v=P.current;v&&v.slideTo(0)},S=typeof t=="function"?t({slideToDetail:p}):t,_=typeof h=="function"?h({slideToList:j,slideToDetail:p}):h;return r.jsxs(wt,{className:"h-full min-h-0 w-full",slidesPerView:1,resistanceRatio:.45,noSwiping:!0,noSwipingClass:"swiper-no-swiping",noSwipingSelector:".swiper-no-swiping",allowTouchMove:!1,touchAngle:75,touchStartPreventDefault:!1,onSwiper:v=>{P.current=v,g&&(g.current=v)},onSlideChange:v=>{x?.(v.activeIndex)},children:[r.jsx(Ke,{className:"h-full min-h-0",children:r.jsxs("div",{className:"flex h-full min-h-0 flex-col overflow-hidden",children:[m&&r.jsx("div",{className:"shrink-0 border-b border-border/15 px-3 py-2",children:m}),r.jsx("div",{className:"min-h-0 flex-1 overflow-y-auto overscroll-contain",children:S})]})}),r.jsx(Ke,{className:"h-full min-h-0",children:r.jsxs("div",{className:"flex h-full min-h-0 flex-col overflow-hidden bg-surface",children:[r.jsx("div",{className:"shrink-0 border-b border-border/15 px-3 py-2",children:_??r.jsxs("button",{type:"button",onClick:j,className:"inline-flex h-9 shrink-0 items-center gap-1.5 rounded-full bg-surface-2 px-3 text-xs font-semibold text-muted-foreground transition hover:bg-surface-elevated hover:text-foreground active:scale-95",children:[r.jsx(gt,{size:14}),y]})}),r.jsx("div",{className:F?"min-h-0 flex-1 overflow-hidden":"termdock-diff-stream-scroller min-h-0 flex-1 overflow-y-auto overscroll-contain",onScroll:F?void 0:v=>b?.(v.currentTarget),children:n})]})})]})}const W=typeof t=="function"?t({slideToDetail:()=>{}}):t;return f==="stacked"?F?r.jsxs("div",{className:"termdock-native-select min-h-0 flex-1 overflow-hidden px-2 pb-[calc(env(safe-area-inset-bottom)+4.5rem)]",children:[i&&r.jsx("div",{className:"sticky top-0 z-10 border-b border-border/15 bg-surface px-2 py-2",children:i}),W,r.jsx("div",{className:"mt-3 h-[calc(100%-3rem)] min-h-0 overflow-hidden rounded-xl border border-border/15 bg-surface",children:n})]}):r.jsxs("div",{className:"termdock-native-select termdock-diff-stream-scroller min-h-0 flex-1 overflow-y-auto overscroll-contain px-2 pb-[calc(env(safe-area-inset-bottom)+4.5rem)]",onScroll:p=>b?.(p.currentTarget),children:[i&&r.jsx("div",{className:"sticky top-0 z-10 border-b border-border/15 bg-surface px-2 py-2",children:i}),W,r.jsx("div",{className:"mt-3 overflow-hidden rounded-xl border border-border/15 bg-surface",children:n})]}):r.jsxs("div",{ref:q,className:"flex h-full min-h-0 overflow-hidden",children:[z,r.jsxs("div",{className:M??"shrink-0 overflow-y-auto overscroll-contain border-r border-border/15 bg-surface",style:{width:U},children:[i&&r.jsx("div",{className:"sticky top-0 z-10 border-b border-border/15 bg-surface px-2 py-2",children:i}),W]}),r.jsx("div",{role:"separator","aria-orientation":"vertical","aria-label":B("diffViewer.resizeNavigation"),title:B("diffViewer.resizeNavigation"),className:"group relative z-10 w-2 shrink-0 cursor-col-resize touch-none border-r border-border/15 bg-surface",onPointerDown:ae,onPointerMove:ue,onPointerUp:ie,onPointerCancel:ie,onDoubleClick:()=>{$(He),vt(Ce,He)},children:r.jsx("span",{className:"pointer-events-none absolute inset-y-0 left-1/2 w-px -translate-x-1/2 bg-border/30 transition group-hover:bg-primary/60"})}),r.jsx("div",{className:F?"min-w-0 flex-1 overflow-hidden":"termdock-diff-stream-scroller min-w-0 flex-1 overflow-y-auto overscroll-contain",onScroll:F?void 0:p=>b?.(p.currentTarget),children:n})]})}function zt({mode:t,onModeChange:n,showAi:c=!1}){return r.jsxs("div",{className:"inline-flex h-7 shrink-0 overflow-hidden rounded-md bg-surface-2 p-0.5",children:[r.jsx("button",{type:"button",onClick:()=>n("list"),"aria-pressed":t==="list",className:`inline-flex h-6 w-7 items-center justify-center rounded-md transition active:scale-95 ${t==="list"?"bg-surface-elevated text-foreground shadow-sm":"text-muted-foreground hover:text-foreground"}`,children:r.jsx(Tt,{size:13})}),r.jsx("button",{type:"button",onClick:()=>n("tree"),"aria-pressed":t==="tree",className:`inline-flex h-6 w-7 items-center justify-center rounded-md transition active:scale-95 ${t==="tree"?"bg-surface-elevated text-foreground shadow-sm":"text-muted-foreground hover:text-foreground"}`,children:r.jsx(kt,{size:13})}),c&&r.jsx("button",{type:"button",onClick:()=>n("ai"),"aria-pressed":t==="ai",className:`inline-flex h-6 w-7 items-center justify-center rounded-md transition active:scale-95 ${t==="ai"?"bg-surface-elevated text-foreground shadow-sm":"text-muted-foreground hover:text-foreground"}`,children:r.jsx(Ze,{size:13})})]})}function Lt({groups:t,mode:n,onModeChange:c,selectedKey:m,collapsedDirectoryKeys:h,onToggleDirectory:i,onSelectFile:y,renderLeading:x,renderTrailing:g,renderDirectoryTrailing:f,renderSubtitle:b,detail:z,mobile:M,backLabel:F,compact:B=!1,emptyContent:P,listPrefix:q,aiContent:I,listContainerClassName:U="px-2 py-2",detailContainerClassName:$="termdock-native-select termdock-diff-stream-scroller min-h-0",renderListHeader:ae,renderMobileDetailHeader:ue,externalSwiperRef:ie,onMobileSlideChange:W,slideToDetailOnMobile:p=!0,desktopLayout:j="split",onDetailScroll:S,desktopSidePanel:_,desktopListClassName:v,detailOwnsScroll:ee}){const[V,O]=o.useState(!1);o.useEffect(()=>{if(!V)return;const A=L=>{L.key==="Escape"&&O(!1)};return document.addEventListener("keydown",A),()=>document.removeEventListener("keydown",A)},[V]);const de=r.jsx(zt,{mode:n,onModeChange:c,showAi:!!I}),pe=n==="tree"?"tree":"list",xe=ae?ae(de):r.jsx("div",{className:"flex justify-end",children:de}),ge=t.some(A=>A.files.length>0),te=r.jsx(At,{mobile:V?!1:M,backLabel:F,externalSwiperRef:ie,onMobileSlideChange:W,desktopLayout:V?"split":j,onDetailScroll:S,desktopSidePanel:_,desktopListClassName:v,detailOwnsScroll:ee,mobileListHeader:M?xe:void 0,desktopListHeader:M?void 0:xe,mobileDetailHeader:ue,list:({slideToDetail:A})=>r.jsx("div",{className:U,children:n==="ai"?typeof I=="function"?I({slideToDetail:A,fullscreen:V,toggleFullscreen:()=>O(L=>!L)}):I??P:r.jsxs(r.Fragment,{children:[q,ge?r.jsx(It,{groups:t,selectedKey:m,mode:pe,mobile:M,compact:B,collapsedDirectoryKeys:h,onToggleDirectory:i,onSelectFile:L=>{y(L),M&&p&&window.requestAnimationFrame(A)},renderLeading:x,renderTrailing:g,renderDirectoryTrailing:f,renderSubtitle:b}):P]})}),detail:r.jsx("div",{className:ee?"h-full min-h-0":$,children:z})});return!V||typeof document>"u"?te:Ye.createPortal(r.jsxs("div",{className:"fixed inset-0 z-modal-panel flex min-h-0 flex-col bg-surface text-foreground",children:[r.jsxs("div",{className:"flex h-12 shrink-0 items-center justify-between border-b border-border/15 bg-[var(--chrome-bg)] px-3",children:[r.jsxs("div",{className:"flex min-w-0 items-center gap-2",children:[r.jsx(Ze,{size:15,className:"shrink-0 text-primary"}),r.jsx("span",{className:"truncate text-[12px] font-semibold",children:"DAG Review"}),r.jsx("span",{className:"hidden text-[10px] text-muted-foreground sm:inline",children:"Select a step to inspect its exact change"})]}),r.jsx("button",{type:"button",onClick:()=>O(!1),className:"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-muted-foreground transition hover:bg-surface-2 hover:text-foreground active:scale-95",title:"Exit full-screen DAG review (Esc)","aria-label":"Exit full-screen DAG review",children:r.jsx(yt,{size:16})})]}),r.jsx("div",{className:"min-h-0 flex-1",children:te})]}),document.body)}const Ht=96,ze=44;function Pt({file:t,repoRoot:n,selectionPath:c,displayName:m,displayDir:h,selected:i,activePane:y,visible:x,reusableContent:g=!1,estimatedHeight:f,lightweight:b=!1,wrap:z,viewType:M,inlineMode:F,diffOptions:B,reloadKey:P=0,auditRecords:q,diffOverride:I,oldSourceRef:U,preparedDiff:$,renderBadge:ae,onInsertDiffReference:ue,onHunkGitAction:ie,previewReverts:W,onReferenceCopied:p,insertedReferenceKey:j,copiedReferenceKey:S,onClearAuditRecord:_,onContentReady:v,onHeightChange:ee}){const V=o.useRef(null),O=o.useRef(null),de=o.useRef(null),[pe,xe]=o.useState(null),ge=o.useRef(64),te=o.useRef(f??104),A=o.useRef(null),L=o.useRef(null),Q=o.useRef(!1),le=o.useRef(!1),E=o.useRef(null),[re,je]=o.useState(!1),[Ne,De]=o.useState(!1),ve=t.absolutePath||(n?`${n}/${t.path}`:t.path),N=o.useCallback(()=>{le.current||(le.current=!0,De(!0),v?.(c))},[v,c]);o.useLayoutEffect(()=>{if(!(I!==void 0&&x&&le.current))return Q.current=!1,le.current=!1,A.current=null,L.current=null,E.current!==null&&(window.clearTimeout(E.current),E.current=null),je(!1),De(!1),()=>{E.current!==null&&(window.clearTimeout(E.current),E.current=null)}},[I,$,P,g,x]),o.useLayoutEffect(()=>{const X=A.current;!re||X===null||Math.abs((f??104)-X)>=1||(A.current=null,N())},[N,f,re]),o.useLayoutEffect(()=>{if(!x||!re)return;const X=de.current;if(!X)return;const be=()=>{if(!Q.current)return;const Y=X.firstElementChild;if(!Y)return;const K=Math.ceil(Math.max(Y.getBoundingClientRect().height,Y.scrollHeight,64)),he=ge.current;if(K>0&&he!==K&&(ge.current=K,xe(K)),!V.current)return;const C=O.current?.getBoundingClientRect().height??ze,se=Math.ceil(C+K+1);se<=0||L.current===se||(L.current=se,E.current!==null&&window.clearTimeout(E.current),E.current=window.setTimeout(()=>{if(E.current=null,!Q.current)return;const H=L.current;if(H===null)return;const D=te.current;if(le.current){te.current=H,Math.abs(D-H)>=1&&ee?.(c,D,H),v?.(c);return}if(A.current=H,Math.abs(D-H)<1||!ee){te.current=H,A.current=null,N();return}te.current=H,ee(c,D,H)},Ht))};if(be(),typeof ResizeObserver>"u")return;const fe=new ResizeObserver(be);return fe.observe(X),X.firstElementChild&&fe.observe(X.firstElementChild),O.current&&fe.observe(O.current),()=>fe.disconnect()},[N,v,ee,c,re,x,z,M,F]);const G=x&&!Ne;return r.jsxs("div",{ref:V,"data-diff-stream-item":c,"data-diff-selection-path":c,"data-diff-file-path":t.path,"data-diff-absolute-path":ve,className:`scroll-mt-3 border-b border-border/15 last:border-b-0 ${G||!x?"overflow-hidden":""} ${i?"bg-surface-elevated/35":""}`,style:x?G?{height:f??104}:void 0:{height:f??104},children:[r.jsxs("div",{ref:O,"data-diff-stream-header":!0,className:`sticky top-0 z-10 flex min-w-0 items-center gap-2 border-b border-border/15 px-3 py-2 ${i?"bg-surface-elevated":"bg-surface"}`,children:[ae(t.status),r.jsxs("div",{className:"min-w-0 flex-1",title:ve,children:[r.jsx("div",{className:"truncate text-xs font-semibold text-foreground",children:m}),h&&r.jsx("div",{className:"truncate text-[10px] text-muted-foreground",children:h})]})]}),r.jsxs("div",{ref:de,className:"relative","data-diff-stream-body":!0,style:x?{minHeight:Ne?64:Math.max(pe??64,(f??104)-ze)}:{height:Math.max(pe??64,(f??104)-ze)},children:[x?r.jsx(Rt,{active:y,repoRoot:n,filePath:t.path,referenceFilePath:ve,changedFile:t,wrap:z,viewType:M,inlineMode:F,diffOptions:B,reloadKey:P,embedded:!0,lightweight:b,auditRecords:q,diffOverride:I,oldSourceRef:U,preparedDiff:$,onClearAuditRecord:_,onContentReady:()=>{if(g){Q.current=!0,je(!0),N();return}Q.current||(Q.current=!0,je(!0))},onInsertDiffReference:ue,onHunkGitAction:ie,previewReverts:W,onReferenceCopied:p,insertedReferenceKey:j,copiedReferenceKey:S}):r.jsx("div",{className:"flex h-full min-h-16 items-center justify-center bg-surface px-3 py-4 text-center text-xs text-muted-foreground",children:t.path}),x&&re&&!Ne&&r.jsx("div",{"data-diff-measuring-overlay":!0,className:"absolute inset-0 z-20 bg-surface"})]})]})}const Oe=8,Le=1600,Qe=104,Wt=1e3,Re=new Map;function Bt(t,n){for(Re.delete(t),Re.set(t,n);Re.size>Wt;){const c=Re.keys().next().value;if(c===void 0)break;Re.delete(c)}}function $t(t,n){return!!(t&&t.diffOverride===n.diffOverride&&t.oldSourceRef===n.oldSourceRef&&t.reloadKey===n.reloadKey&&t.wrap===n.wrap&&t.viewType===n.viewType&&t.inlineMode===n.inlineMode&&t.algorithm===n.algorithm&&t.whitespace===n.whitespace&&t.context===n.context)}const Vt={added:{label:"A",className:"text-[color:var(--diff-insert-strong)]",title:"Added"},modified:{label:"M",className:"text-[color:var(--diff-hunk-accent)]",title:"Modified"},deleted:{label:"D",className:"text-[color:var(--diff-delete-strong)]",title:"Deleted"},renamed:{label:"R",className:"text-muted-foreground",title:"Renamed"},copied:{label:"C",className:"text-[color:var(--diff-insert-strong)]",title:"Copied"},untracked:{label:"U",className:"text-[color:var(--diff-insert-strong)]",title:"Untracked (new file)"},conflicted:{label:"!",className:"text-destructive",title:"Conflicted"},unknown:{label:"?",className:"text-muted-foreground",title:"Unknown"}};function er({status:t}){const n=Vt[t]??{label:"?",className:"text-muted-foreground",title:t};return r.jsx("span",{className:`w-4 shrink-0 text-center text-[10px] font-mono font-bold ${n.className}`,title:n.title,children:n.label})}function tr(t,n){return n?{key:n,nonce:t.nonce+1}:t}function rr({files:t,groups:n,selectedKey:c,onSelectFile:m,mode:h,onModeChange:i,collapsedDirectoryKeys:y,onToggleDirectory:x,renderLeading:g,renderTrailing:f,renderDirectoryTrailing:b,renderSubtitle:z,renderStreamBadge:M,onInsertDiffReference:F,onHunkGitAction:B,onReferenceCopied:P,insertedReferenceKey:q,copiedReferenceKey:I,onClearAuditRecord:U,mobile:$,backLabel:ae,compact:ue,desktopLayout:ie,wrap:W,diffViewType:p,inlineMode:j,diffOptions:S,activePane:_,reloadKey:v=0,renderListHeader:ee,renderMobileDetailHeader:V,emptyContent:O,listPrefix:de,aiContent:pe,listContainerClassName:xe,detailContainerClassName:ge,desktopSidePanel:te,desktopListClassName:A,onDetailScroll:L,initialDetailScrollTop:Q,preserveScrollOnUpdate:le=!1,scrollToKey:E,scrollToKeyNonce:re=0,externalSwiperRef:je,onMobileSlideChange:Ne,slideToDetailOnMobile:De}){const ve=o.useMemo(()=>e=>c===e.key||c===e.path||c===e.absolutePath,[c]),N=o.useMemo(()=>{const e=new Map;for(const a of t)e.set(a.key,a),a.path&&e.set(a.path,a),a.absolutePath&&e.set(a.absolutePath,a);const s=[],l=new Set;for(const a of n){const d=h==="tree"?Dt(a.files):a.files;for(const w of d){const u=e.get(w.key);!u||l.has(u.key)||(s.push(u),l.add(u.key))}}for(const a of t)l.has(a.key)||s.push(a);return s},[t,n,h]),G=o.useRef(null),X=o.useRef(null),be=o.useRef(null),fe=o.useRef(v),Y=o.useRef(0),K=o.useRef(null),he=o.useRef(new Map(Re)),ne=o.useRef({key:null,top:0}),C=o.useRef(new Set),se=o.useRef(new Map),H=o.useRef(new Map),D=o.useRef(null),We=o.useRef(()=>{}),Te=o.useRef([]),me=o.useRef(new Map),Be=o.useRef({tops:[],heights:[],bottom:0}),[Ie,st]=o.useState(()=>new Set),[ot,ct]=o.useState(0),[J,ye]=o.useState({top:0,height:0}),Me=o.useMemo(()=>N.map(e=>e.key),[N]),Ee=Me.join("");H.current=o.useMemo(()=>new Map(N.map(e=>[e.key,{diffOverride:e.diffOverride,oldSourceRef:e.oldSourceRef,reloadKey:v,wrap:W,viewType:p,inlineMode:j,algorithm:S?.algorithm,whitespace:S?.whitespace,context:S?.context}])),[N,v,W,p,j,S?.algorithm,S?.whitespace,S?.context]),Te.current=Me,me.current=o.useMemo(()=>new Map(Me.map((e,s)=>[e,s])),[Me]);const k=o.useMemo(()=>{const e=Me.map(a=>he.current.get(a)??Qe),s=new Array(e.length);for(let a=0;a<e.length;a+=1)s[a]=a===0?0:s[a-1]+e[a-1];const l=e.length>0?s[e.length-1]+e[e.length-1]:0;return{tops:s,heights:e,bottom:l}},[ot,Ee]);Be.current=k;const oe=o.useMemo(()=>E?N.find(e=>E===e.key||E===e.path||E===e.absolutePath)?.key??null:null,[N,E]),Fe=o.useMemo(()=>c?N.find(e=>c===e.key||c===e.path||c===e.absolutePath)?.key??null:null,[N,c]),Se=o.useMemo(()=>{const e=k.tops.length;if(e===0)return-1;let s=0,l=e;for(;s<l;){const a=Math.floor((s+l)/2);k.tops[a]<=J.top+1?s=a+1:l=a}return Math.min(e-1,Math.max(0,s-1))},[k.tops,J.top]),ce=o.useCallback(e=>{C.current=e,st(e)},[]),$e=o.useMemo(()=>{const e=J.top-Le,s=J.top+J.height+Le,l=new Set;let a=0,d=k.tops.length;for(;a<d;){const u=Math.floor((a+d)/2);k.tops[u]<=e?a=u+1:d=u}const w=Math.max(0,a-1);for(let u=w;u<k.tops.length;u+=1){const R=k.tops[u];if(R>s)break;R+k.heights[u]>=e&&R<=s&&l.add(u)}for(let u=Se-1;u<=Se+1;u+=1)u>=0&&u<k.tops.length&&l.add(u);for(const u of Ie){const R=me.current.get(u);R!==void 0&&l.add(R)}return Array.from(l).sort((u,R)=>u-R)},[k,J,Ie,Se]),_e=o.useCallback(()=>{if(!_||D.current)return;const e=Te.current;if(e.length===0)return;const s=ne.current.key,l=Math.min(e.length-1,(s!==null?me.current.get(s):void 0)??Math.max(0,Se)),a=u=>Math.abs((me.current.get(u)??0)-l),d=[];C.current.has(e[l])||d.push(e[l]);for(let u=1;u<=Oe;u+=1){const R=l+u,T=l-u;R<e.length&&!C.current.has(e[R])&&d.push(e[R]),T>=0&&!C.current.has(e[T])&&d.push(e[T])}const w=d[0];if(w){if(C.current.size>=Oe){const u=a(w),R=Array.from(C.current).filter(Z=>Z!==D.current).sort((Z,ke)=>a(ke)-a(Z))[0];if(!R||a(R)<=u)return;const T=new Set(C.current);T.delete(R),ce(T)}D.current=w,ce(new Set(C.current).add(w))}},[_,ce,Se]);We.current=_e;const we=o.useCallback(e=>{if(C.current.has(e))return;const s=D.current;if(s&&s!==e){const l=new Set(C.current);l.delete(s),ce(l),D.current=null}D.current=e,ce(new Set(C.current).add(e))},[ce]),Ve=o.useCallback(e=>{if(!C.current.has(e))return;const s=H.current.get(e);s&&se.current.set(e,s),D.current===e&&(D.current=null),window.requestAnimationFrame(()=>We.current())},[]),Ge=o.useCallback((e,s,l)=>{if(Math.abs(l-s)<1)return;const a=he.current.get(e);a!==void 0&&Math.abs(a-l)<1||(he.current.set(e,l),Bt(e,l),ct(d=>d+1))},[]);o.useLayoutEffect(()=>{if(fe.current!==v){fe.current=v;for(const e of N){if(e.diffOverride!==void 0)continue;const s=Kt(e.path,e.repoRoot);jt(s,e.repoRoot??void 0,S)}}},[N,S,v]),o.useLayoutEffect(()=>{const e=G.current;if(!e)return;const s=()=>{const a=Math.max(0,Math.ceil(e.clientHeight));if(a===0)return;const d=e.scrollTop;ye(w=>w.height===a&&w.top===d?w:{top:d,height:a})};if(s(),typeof ResizeObserver>"u")return;const l=new ResizeObserver(s);return l.observe(e),()=>l.disconnect()},[$]),o.useEffect(()=>{_&&Fe&&we(Fe)},[_,we,Fe]),o.useEffect(()=>{const e=new Set(Te.current);for(const s of Array.from(he.current.keys()))e.has(s)||he.current.delete(s);for(const s of Array.from(C.current))if(!e.has(s)){const l=new Set(C.current);l.delete(s),ce(l)}for(const s of Array.from(se.current.keys()))e.has(s)||se.current.delete(s);if(D.current&&!e.has(D.current)&&(D.current=null),N.length===0){D.current=null,se.current.clear(),ce(new Set);return}_e()},[N.length,Ee,_e,$e,ce]);const Xe=o.useCallback(e=>{G.current=e;const s=Y.current,l=e.scrollTop;Y.current=l;const a=d=>{const w=Be.current,u=Te.current;let R=0,T=w.tops.length;for(;R<T;){const Ae=Math.floor((R+T)/2);w.tops[Ae]<=d+1?R=Ae+1:T=Ae}const Z=Math.min(u.length-1,Math.max(0,R-1)),ke=u[Z]??null;ne.current={key:ke,top:w.tops[Z]??0},ke&&we(ke)};Math.abs(l-s)>=Le?(Ye.flushSync(()=>{ye({top:l,height:e.clientHeight})}),a(l)):K.current===null&&(K.current=window.requestAnimationFrame(()=>{K.current=null;const d=G.current;if(d){const w=d.scrollTop;ye({top:w,height:d.clientHeight}),a(w)}})),L?.(e)},[L,we]);o.useEffect(()=>()=>{K.current!==null&&window.cancelAnimationFrame(K.current)},[]),o.useLayoutEffect(()=>{const e=G.current;if(!e)return;const s=ne.current;if(s.key===null)return;const l=me.current.get(s.key);if(l===void 0)return;const a=(k.tops[l]??s.top)-s.top;if(Math.abs(a)<1)return;const d=e.scrollTop+a;Y.current=d,ye(w=>({top:d,height:w.height})),typeof e.scrollTo=="function"?e.scrollTo({top:d,behavior:"instant"}):e.scrollTop=d},[k]),o.useLayoutEffect(()=>{const e=Te.current,s=k.tops;if(e.length===0){ne.current={key:null,top:0};return}const l=Y.current,a=l+(G.current?.clientHeight??J.height),d=ne.current;if(d.key!==null){const T=me.current.get(d.key);if(T!==void 0){const Z=s[T]??0;if(Z+(k.heights[T]??Qe)>l&&Z<a){ne.current={key:d.key,top:Z};return}}}let w=0,u=s.length;for(;w<u;){const T=Math.floor((w+u)/2);s[T]<=l+1?w=T+1:u=T}const R=Math.min(s.length-1,Math.max(0,w-1));ne.current={key:e[R]??null,top:s[R]??0}}),o.useLayoutEffect(()=>{if(!oe)return;const e=X.current;if(e?.key===oe&&e.nonce===re)return;const s=me.current.get(oe);if(s===void 0)return;we(oe),ne.current={key:oe,top:k.tops[s]??0};const l=G.current;if(!l||l.clientHeight===0||J.height!==l.clientHeight)return;X.current={key:oe,nonce:re};const a=k.tops[s]??0;typeof l.scrollTo=="function"?l.scrollTo({top:a,behavior:"instant"}):l.scrollTop=a;const d=l.scrollTop;Y.current=d,ye({top:d,height:l.clientHeight})},[k,J.height,we,oe,re]),o.useLayoutEffect(()=>{if(Q===void 0||oe)return;const e=Ee;if(be.current===e||le&&be.current!==null)return;const s=G.current;if(!s)return;be.current=e;const l=Math.max(0,k.bottom-s.clientHeight),a=Math.min(Math.max(0,Q),l);typeof s.scrollTo=="function"?s.scrollTo({top:a,behavior:"instant"}):s.scrollTop=a;const d=s.scrollTop;Y.current=d,ye({top:d,height:s.clientHeight})},[k.bottom,Q,Ee,le,oe]);const at=o.useCallback((e,s)=>{const l=ve(e),a=H.current.get(e.key),d=a!==void 0&&$t(se.current.get(e.key),a);return r.jsx(Gt,{item:e,repoRoot:e.repoRoot,selectionPath:e.key,displayName:e.displayName,displayDir:e.displayDir,selected:l,activePane:_,visible:Ie.has(e.key),reusableContent:d,estimatedHeight:s,lightweight:!1,wrap:W,viewType:p,inlineMode:j,diffOptions:S,reloadKey:v,auditRecords:e.auditRecords,diffOverride:e.diffOverride,oldSourceRef:e.oldSourceRef,renderStreamBadge:M,onInsertDiffReference:e.onInsertDiffReference??F,onHunkGitAction:e.onHunkGitAction??B,previewReverts:e.previewReverts,onReferenceCopied:P,insertedReferenceKey:q,copiedReferenceKey:I,onClearAuditRecord:U,onContentReady:Ve,onHeightChange:Ge})},[_,I,S,p,Ve,Ge,j,q,ve,Ie,U,B,F,P,v,M,W]),it=r.jsx("div",{"data-diff-stream-content":!0,"data-diff-stream-canvas":!0,className:"termdock-diff-stream relative overflow-clip bg-surface will-change-transform",style:{height:Math.max(k.bottom,(k.tops.at(-1)??0)+J.height)},children:$e.map(e=>{const s=N[e];return s?r.jsx("div",{"data-diff-canvas-slot":s.key,className:"absolute inset-x-0",style:{top:k.tops[e]},children:at(s,k.heights[e])},s.key):null})}),lt=r.jsx("div",{ref:G,className:"termdock-diff-stream termdock-diff-stream-scroller h-full max-h-full min-h-0 overflow-y-auto overscroll-contain bg-surface [overflow-anchor:none]",onScroll:e=>Xe(e.currentTarget),children:it});return r.jsx(Lt,{groups:n,mode:h,onModeChange:i,selectedKey:c,collapsedDirectoryKeys:y,onToggleDirectory:x,onSelectFile:m,renderLeading:g,renderTrailing:f,renderDirectoryTrailing:b,renderSubtitle:z,detail:lt,mobile:$,backLabel:ae,compact:ue,emptyContent:O,listPrefix:de,aiContent:pe,listContainerClassName:xe,detailContainerClassName:ge,renderListHeader:ee,renderMobileDetailHeader:V,externalSwiperRef:je,onMobileSlideChange:Ne,slideToDetailOnMobile:De,desktopLayout:ie,onDetailScroll:Xe,desktopSidePanel:te,desktopListClassName:A,detailOwnsScroll:!0})}const Gt=o.memo(function({item:n,renderStreamBadge:c,...m}){return r.jsx(Pt,{...m,file:Xt(n),renderBadge:h=>c(h,n)})});function Xt(t){return{path:t.path,oldPath:t.oldPath,absolutePath:t.absolutePath,status:t.status}}function Kt(t,n){if(t)return n&&t.startsWith(`${n}/`)?t.slice(n.length+1):t}export{er as C,rr as D,Dt as f,tr as n};
@@ -1 +0,0 @@
1
- import{aR as s,e6 as c,cc as e}from"./app-stNRNTO-.js";const i=[["rect",{width:"20",height:"5",x:"2",y:"3",rx:"1",key:"1wp1u1"}],["path",{d:"M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8",key:"1s80jp"}],["path",{d:"M10 12h4",key:"a56b0p"}]],p=s("archive",i);const n=[["path",{d:"M20 4v7a4 4 0 0 1-4 4H4",key:"6o5b7l"}],["path",{d:"m9 10-5 5 5 5",key:"1kshq7"}]],b=s("corner-down-left",n);const l=[["rect",{x:"16",y:"16",width:"6",height:"6",rx:"1",key:"4q2zg0"}],["rect",{x:"2",y:"16",width:"6",height:"6",rx:"1",key:"8cvhb9"}],["rect",{x:"9",y:"2",width:"6",height:"6",rx:"1",key:"1egb70"}],["path",{d:"M5 16v-3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v3",key:"1jsf9p"}],["path",{d:"M12 12V8",key:"2874zd"}]],f=s("network",l);const t=[["rect",{x:"14",y:"3",width:"5",height:"18",rx:"1",key:"kaeet6"}],["rect",{x:"5",y:"3",width:"5",height:"18",rx:"1",key:"1wsw3u"}]],j=s("pause",t);const h=[["path",{d:"M13 21h8",key:"1jsn5i"}],["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",key:"1a8usu"}]],v=s("pen-line",h);const o=[["path",{d:"M13 21h8",key:"1jsn5i"}],["path",{d:"m15 5 4 4",key:"1mk7zo"}],["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",key:"1a8usu"}]],N=s("pencil-line",o);const u=[["path",{d:"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z",key:"10ikf1"}]],y=s("play",u);const x=[["path",{d:"m21 21-4.34-4.34",key:"14j7rj"}],["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}]],w=s("search",x);const m=[["path",{d:"M10 5H3",key:"1qgfaw"}],["path",{d:"M12 19H3",key:"yhmn1j"}],["path",{d:"M14 3v4",key:"1sua03"}],["path",{d:"M16 17v4",key:"1q0r14"}],["path",{d:"M21 12h-9",key:"1o4lsq"}],["path",{d:"M21 19h-5",key:"1rlt1p"}],["path",{d:"M21 5h-7",key:"1oszz2"}],["path",{d:"M8 10v4",key:"tgpxqk"}],["path",{d:"M8 12H3",key:"a7s4jb"}]],k=s("sliders-horizontal",m);function M(){const{t:d}=c();return e.jsxs("div",{role:"status","aria-label":d("rightSidebar.loadingGitChanges"),className:"td-loading-skeleton flex h-full min-h-0 flex-col overflow-hidden bg-surface",children:[e.jsx("span",{className:"sr-only",children:d("rightSidebar.loadingGitChanges")}),e.jsxs("div",{"aria-hidden":"true",className:"shrink-0 border-b border-border/15 px-3 py-2",children:[e.jsxs("div",{className:"mb-2 flex h-5 items-center gap-1",children:[e.jsx("div",{className:"h-4 w-16 rounded bg-surface-2"}),e.jsx("div",{className:"h-4 w-7 rounded bg-surface-2"}),e.jsx("div",{className:"h-4 w-12 rounded bg-surface-2"})]}),e.jsxs("div",{className:"flex h-[15px] items-center justify-between",children:[e.jsx("div",{className:"h-2 w-14 rounded bg-surface-2"}),e.jsx("div",{className:"h-2 w-6 rounded bg-surface-2"})]}),e.jsxs("div",{className:"mt-2 flex h-7 items-center gap-1.5",children:[e.jsx("div",{className:"h-7 w-12 rounded-full bg-surface-2"}),e.jsx("div",{className:"h-7 w-16 rounded-full bg-surface-2"}),e.jsx("div",{className:"h-3 w-24 max-w-[30%] rounded bg-surface-2"}),e.jsx("div",{className:"ml-auto h-4 w-4 rounded-full bg-surface-2"})]})]}),e.jsxs("div",{"aria-hidden":"true",className:"overflow-hidden px-3 py-2",children:[e.jsxs("div",{className:"flex h-8 items-center gap-2",children:[e.jsx("div",{className:"h-3 w-3 rounded-sm bg-surface-2"}),e.jsx("div",{className:"h-2 w-32 max-w-[55%] rounded bg-surface-2"})]}),["w-3/5","w-2/5","w-1/2","w-1/3"].map((a,r)=>e.jsxs("div",{className:"flex h-9 items-center gap-2 pl-5",style:{opacity:1-r*.15},children:[e.jsx("div",{className:"h-3 w-3 shrink-0 rounded-sm bg-surface-2"}),e.jsx("div",{className:`h-2 rounded bg-surface-2 ${a}`})]},a))]})]})}function _({slow:d=!1}){const{t:a}=c();return e.jsxs("div",{role:"status","aria-label":a("rightSidebar.loadingGitChanges"),className:"td-loading-skeleton relative h-full min-h-0 overflow-hidden bg-surface px-3",children:[e.jsx("span",{className:"sr-only",children:a("rightSidebar.loadingGitChanges")}),e.jsxs("div",{"aria-hidden":"true",children:[e.jsxs("div",{className:"flex h-[76px] items-center gap-2 border-b border-border/40 px-2",children:[e.jsx("div",{className:"h-6 w-6 rounded-md bg-surface-2"}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("div",{className:"h-3 w-16 rounded bg-surface-2"}),e.jsx("div",{className:"h-2 w-12 rounded bg-surface-2"})]})]}),e.jsxs("div",{className:"flex h-11 items-center gap-2 px-1 pt-3",children:[e.jsx("div",{className:"h-6 w-6 rounded-md bg-surface-2"}),e.jsx("div",{className:"h-3 w-16 rounded bg-surface-2"}),e.jsx("div",{className:"ml-auto h-4 w-12 rounded-full bg-surface-2"})]}),[!1,!0].map(r=>e.jsxs("div",{className:"border-b border-border/40 px-1 py-4",children:[e.jsxs("div",{className:"mb-2 flex h-8 items-center justify-between",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx("div",{className:"h-3 w-14 rounded bg-surface-2"}),r&&e.jsx("div",{className:"h-2 w-28 rounded bg-surface-2"})]}),e.jsx("div",{className:"h-8 w-12 rounded-md bg-surface-2"})]}),e.jsx("div",{className:"h-10 rounded-md bg-surface-2"})]},String(r))),e.jsx("div",{className:"flex h-[69px] items-center border-b border-border/40 px-2",children:e.jsx("div",{className:"h-3 w-16 rounded bg-surface-2"})}),e.jsxs("div",{className:"space-y-2 px-1 py-4",children:[e.jsxs("div",{className:"flex h-8 items-center justify-between",children:[e.jsx("div",{className:"h-3 w-14 rounded bg-surface-2"}),e.jsx("div",{className:"h-8 w-28 rounded-md bg-surface-2"})]}),e.jsx("div",{className:"h-7 rounded-md bg-surface-2"}),e.jsx("div",{className:"h-10 rounded-md bg-surface-2"})]})]}),d&&e.jsx("div",{className:"absolute inset-x-3 bottom-3 rounded-md bg-surface-elevated px-3 py-2 text-xs text-muted-foreground",children:a("rightSidebar.loadingGitChangesSlow")})]})}export{p as A,M as C,_ as G,f as N,j as P,w as S,b as a,v as b,N as c,y as d,k as e};