termdock 1.4.351 → 1.4.353

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 (444) hide show
  1. package/dist/client/assets/AndroidMirrorView-C39BgFa_.js +3 -0
  2. package/dist/client/assets/AndroidMirrorView-C39BgFa_.js.br +0 -0
  3. package/dist/client/assets/AndroidMirrorView-C39BgFa_.js.gz +0 -0
  4. package/dist/client/assets/App-AjjtXg93.js +178 -0
  5. package/dist/client/assets/App-AjjtXg93.js.br +0 -0
  6. package/dist/client/assets/App-AjjtXg93.js.gz +0 -0
  7. package/dist/client/assets/ArchitecturePanel-Xi_R4Tso.js +9 -0
  8. package/dist/client/assets/ArchitecturePanel-Xi_R4Tso.js.br +0 -0
  9. package/dist/client/assets/ArchitecturePanel-Xi_R4Tso.js.gz +0 -0
  10. package/dist/client/assets/ChangeWalkthroughPanel-BH1Una8m.js +2 -0
  11. package/dist/client/assets/ChangeWalkthroughPanel-BH1Una8m.js.br +0 -0
  12. package/dist/client/assets/ChangeWalkthroughPanel-BH1Una8m.js.gz +0 -0
  13. package/dist/client/assets/CollaborationMainWorkspace-CA9ZGT5N.js +1 -0
  14. package/dist/client/assets/CollaborationMainWorkspace-CA9ZGT5N.js.br +0 -0
  15. package/dist/client/assets/CollaborationMainWorkspace-CA9ZGT5N.js.gz +0 -0
  16. package/dist/client/assets/CollaborationTaskContent-D_NDzA-t.js +2 -0
  17. package/dist/client/assets/ComputerControlView-BGvF5NeQ.js +6 -0
  18. package/dist/client/assets/ComputerControlView-BGvF5NeQ.js.br +0 -0
  19. package/dist/client/assets/ComputerControlView-BGvF5NeQ.js.gz +0 -0
  20. package/dist/client/assets/DagPlayground-CKqB6zap.js +1 -0
  21. package/dist/client/assets/DagPlayground-CKqB6zap.js.br +0 -0
  22. package/dist/client/assets/DagPlayground-CKqB6zap.js.gz +0 -0
  23. package/dist/client/assets/{DiffLab-DFut8ZHi.js → DiffLab-CDt8EP6I.js} +2 -2
  24. package/dist/client/assets/DiffLab-CDt8EP6I.js.br +0 -0
  25. package/dist/client/assets/DiffLab-CDt8EP6I.js.gz +0 -0
  26. package/dist/client/assets/DiffReview-YADkwVd6.js +1 -0
  27. package/dist/client/assets/DiffReview-YADkwVd6.js.br +0 -0
  28. package/dist/client/assets/DiffReview-YADkwVd6.js.gz +0 -0
  29. package/dist/client/assets/{DiffReviewLab-Y9JlI5DQ.js → DiffReviewLab-YqgsRn_K.js} +2 -2
  30. package/dist/client/assets/DiffReviewLab-YqgsRn_K.js.br +0 -0
  31. package/dist/client/assets/DiffReviewLab-YqgsRn_K.js.gz +0 -0
  32. package/dist/client/assets/DiffViewer-CT5_YwM2.js +34 -0
  33. package/dist/client/assets/DiffViewer-CT5_YwM2.js.br +0 -0
  34. package/dist/client/assets/DiffViewer-CT5_YwM2.js.gz +0 -0
  35. package/dist/client/assets/GitLoadingSkeleton-DfWzAnA2.js +1 -0
  36. package/dist/client/assets/GitLoadingSkeleton-DfWzAnA2.js.br +0 -0
  37. package/dist/client/assets/GitLoadingSkeleton-DfWzAnA2.js.gz +0 -0
  38. package/dist/client/assets/MarkdownPreview-DHLp5cqt.js +19 -0
  39. package/dist/client/assets/MarkdownPreview-DHLp5cqt.js.br +0 -0
  40. package/dist/client/assets/MarkdownPreview-DHLp5cqt.js.gz +0 -0
  41. package/dist/client/assets/{ModelPreview-Cv6JgunE.js → ModelPreview-DymFzc55.js} +166 -166
  42. package/dist/client/assets/ModelPreview-DymFzc55.js.br +0 -0
  43. package/dist/client/assets/ModelPreview-DymFzc55.js.gz +0 -0
  44. package/dist/client/assets/RecordingSaveDialog-CxSN76bp.js +1 -0
  45. package/dist/client/assets/RecordingSaveDialog-CxSN76bp.js.br +0 -0
  46. package/dist/client/assets/RecordingSaveDialog-CxSN76bp.js.gz +0 -0
  47. package/dist/client/assets/RightSidebar-eIuDnhJn.js +1662 -0
  48. package/dist/client/assets/RightSidebar-eIuDnhJn.js.br +0 -0
  49. package/dist/client/assets/RightSidebar-eIuDnhJn.js.gz +0 -0
  50. package/dist/client/assets/SessionChatView-C5wXAt7h.js +13 -0
  51. package/dist/client/assets/SessionChatView-C5wXAt7h.js.br +0 -0
  52. package/dist/client/assets/SessionChatView-C5wXAt7h.js.gz +0 -0
  53. package/dist/client/assets/SessionChatView-D8GoESjb.css +1 -0
  54. package/dist/client/assets/SessionChatView-D8GoESjb.css.br +0 -0
  55. package/dist/client/assets/SessionChatView-D8GoESjb.css.gz +0 -0
  56. package/dist/client/assets/SessionResourceSidebar-Czai5Bt3.js +2 -0
  57. package/dist/client/assets/SessionResourceSidebar-Czai5Bt3.js.br +0 -0
  58. package/dist/client/assets/SessionResourceSidebar-Czai5Bt3.js.gz +0 -0
  59. package/dist/client/assets/TodoWorkspace-BftnnEU0.js +1 -0
  60. package/dist/client/assets/TodoWorkspace-BftnnEU0.js.br +0 -0
  61. package/dist/client/assets/TodoWorkspace-BftnnEU0.js.gz +0 -0
  62. package/dist/client/assets/{abnfDiagram-VCTEODGH-CcCffdpj.js → abnfDiagram-VCTEODGH-DI1Y-QAP.js} +1 -1
  63. package/dist/client/assets/abnfDiagram-VCTEODGH-DI1Y-QAP.js.br +0 -0
  64. package/dist/client/assets/abnfDiagram-VCTEODGH-DI1Y-QAP.js.gz +0 -0
  65. package/dist/client/assets/app-DvMXSNN7.js +36 -0
  66. package/dist/client/assets/app-DvMXSNN7.js.br +0 -0
  67. package/dist/client/assets/app-DvMXSNN7.js.gz +0 -0
  68. package/dist/client/assets/{arc-CXcCuzb3.js → arc-QdJAJx_D.js} +1 -1
  69. package/dist/client/assets/arc-QdJAJx_D.js.br +0 -0
  70. package/dist/client/assets/arc-QdJAJx_D.js.gz +0 -0
  71. package/dist/client/assets/{architectureDiagram-5GKGNRK7-CmR7whZz.js → architectureDiagram-5GKGNRK7-Bw2CvoGg.js} +1 -1
  72. package/dist/client/assets/architectureDiagram-5GKGNRK7-Bw2CvoGg.js.br +0 -0
  73. package/dist/client/assets/architectureDiagram-5GKGNRK7-Bw2CvoGg.js.gz +0 -0
  74. package/dist/client/assets/arrow-down-CZKuaGwN.js +1 -0
  75. package/dist/client/assets/arrow-up-CYLC6_to.js +1 -0
  76. package/dist/client/assets/{blockDiagram-I7D4REHJ-DODhUpHm.js → blockDiagram-I7D4REHJ-CM2GI6sC.js} +1 -1
  77. package/dist/client/assets/blockDiagram-I7D4REHJ-CM2GI6sC.js.br +0 -0
  78. package/dist/client/assets/blockDiagram-I7D4REHJ-CM2GI6sC.js.gz +0 -0
  79. package/dist/client/assets/{c4Diagram-7LVT6UL2-BF9eEb2Y.js → c4Diagram-7LVT6UL2-BAB2TKr4.js} +1 -1
  80. package/dist/client/assets/c4Diagram-7LVT6UL2-BAB2TKr4.js.br +0 -0
  81. package/dist/client/assets/c4Diagram-7LVT6UL2-BAB2TKr4.js.gz +0 -0
  82. package/dist/client/assets/channel-CcDRt0AM.js +1 -0
  83. package/dist/client/assets/chevron-left-BNby2AjR.js +1 -0
  84. package/dist/client/assets/{chunk-2Q5K7J3B-CB7-8Zex.js → chunk-2Q5K7J3B-DI2pKKMQ.js} +1 -1
  85. package/dist/client/assets/{chunk-5VM5RSS4-8Uxe2lki.js → chunk-5VM5RSS4-D5l5zyYl.js} +1 -1
  86. package/dist/client/assets/{chunk-F27PBJKO-Bv45U-az.js → chunk-F27PBJKO-Japl432v.js} +1 -1
  87. package/dist/client/assets/{chunk-F27PBJKO-Bv45U-az.js.br → chunk-F27PBJKO-Japl432v.js.br} +0 -0
  88. package/dist/client/assets/chunk-F27PBJKO-Japl432v.js.gz +0 -0
  89. package/dist/client/assets/{chunk-IMKFNOWR-CfEErbEd.js → chunk-IMKFNOWR-CDJoLgpw.js} +1 -1
  90. package/dist/client/assets/chunk-IMKFNOWR-CDJoLgpw.js.br +0 -0
  91. package/dist/client/assets/chunk-IMKFNOWR-CDJoLgpw.js.gz +0 -0
  92. package/dist/client/assets/{chunk-JWPE2WC7-CjUqcCSL.js → chunk-JWPE2WC7-BQ2cpPDE.js} +1 -1
  93. package/dist/client/assets/{chunk-POPQ4Y6H-BHbP3O75.js → chunk-POPQ4Y6H-CWjI0yRx.js} +1 -1
  94. package/dist/client/assets/{chunk-SVP7TREG-CbyJW-OT.js → chunk-SVP7TREG-BzEphMpl.js} +1 -1
  95. package/dist/client/assets/chunk-SVP7TREG-BzEphMpl.js.br +0 -0
  96. package/dist/client/assets/chunk-SVP7TREG-BzEphMpl.js.gz +0 -0
  97. package/dist/client/assets/{chunk-TICWLB2K-t93EivmS.js → chunk-TICWLB2K-B2hsw7jN.js} +1 -1
  98. package/dist/client/assets/chunk-TICWLB2K-B2hsw7jN.js.br +0 -0
  99. package/dist/client/assets/chunk-TICWLB2K-B2hsw7jN.js.gz +0 -0
  100. package/dist/client/assets/{chunk-XXDRQBXY-C_Pe8Osb.js → chunk-XXDRQBXY-BEWjHo7s.js} +1 -1
  101. package/dist/client/assets/classDiagram-ZZMXUADV-Dz0qH9Hg.js +1 -0
  102. package/dist/client/assets/classDiagram-v2-VYDZK3BY-Dz0qH9Hg.js +1 -0
  103. package/dist/client/assets/clipboard-6kE6vzDi.js +1 -0
  104. package/dist/client/assets/clipboardText-B7202UNa.js +1 -0
  105. package/dist/client/assets/clipboardText-B7202UNa.js.br +0 -0
  106. package/dist/client/assets/clipboardText-B7202UNa.js.gz +0 -0
  107. package/dist/client/assets/{cose-bilkent-JH36ORCC-CksG0bvP.js → cose-bilkent-JH36ORCC-DpS77pec.js} +1 -1
  108. package/dist/client/assets/cose-bilkent-JH36ORCC-DpS77pec.js.br +0 -0
  109. package/dist/client/assets/cose-bilkent-JH36ORCC-DpS77pec.js.gz +0 -0
  110. package/dist/client/assets/{cynefin-OW5HDTMX-CV3T078G.js → cynefin-OW5HDTMX-D1y5kNwR.js} +1 -1
  111. package/dist/client/assets/cynefin-OW5HDTMX-D1y5kNwR.js.br +0 -0
  112. package/dist/client/assets/cynefin-OW5HDTMX-D1y5kNwR.js.gz +0 -0
  113. package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-BQnJabEs.js → cynefinDiagram-5FMLGOSQ-CqTCLyMC.js} +1 -1
  114. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CqTCLyMC.js.br +0 -0
  115. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CqTCLyMC.js.gz +0 -0
  116. package/dist/client/assets/{dagre-GXQ25YYZ-BeIQp5Pv.js → dagre-GXQ25YYZ-DkJ-kRn6.js} +1 -1
  117. package/dist/client/assets/dagre-GXQ25YYZ-DkJ-kRn6.js.br +0 -0
  118. package/dist/client/assets/dagre-GXQ25YYZ-DkJ-kRn6.js.gz +0 -0
  119. package/dist/client/assets/{diagram-S7CK7UJ4-D-Mibxiq.js → diagram-S7CK7UJ4-DenrrE_C.js} +1 -1
  120. package/dist/client/assets/diagram-S7CK7UJ4-DenrrE_C.js.br +0 -0
  121. package/dist/client/assets/diagram-S7CK7UJ4-DenrrE_C.js.gz +0 -0
  122. package/dist/client/assets/{diagram-UQ7AKVKN-eiIMWp9t.js → diagram-UQ7AKVKN-B2ikSD8K.js} +1 -1
  123. package/dist/client/assets/diagram-UQ7AKVKN-B2ikSD8K.js.br +0 -0
  124. package/dist/client/assets/diagram-UQ7AKVKN-B2ikSD8K.js.gz +0 -0
  125. package/dist/client/assets/{diagram-VSXAHHWV-CTVOWtNL.js → diagram-VSXAHHWV-CQcNoZDC.js} +1 -1
  126. package/dist/client/assets/diagram-VSXAHHWV-CQcNoZDC.js.br +0 -0
  127. package/dist/client/assets/diagram-VSXAHHWV-CQcNoZDC.js.gz +0 -0
  128. package/dist/client/assets/{diagram-VX7I27RA-NKKk6uh7.js → diagram-VX7I27RA-Cq3FaI-1.js} +1 -1
  129. package/dist/client/assets/diagram-VX7I27RA-Cq3FaI-1.js.br +0 -0
  130. package/dist/client/assets/diagram-VX7I27RA-Cq3FaI-1.js.gz +0 -0
  131. package/dist/client/assets/{diagram-Z3DM3KII-DKYdBuNs.js → diagram-Z3DM3KII-BcWReLM8.js} +1 -1
  132. package/dist/client/assets/diagram-Z3DM3KII-BcWReLM8.js.br +0 -0
  133. package/dist/client/assets/diagram-Z3DM3KII-BcWReLM8.js.gz +0 -0
  134. package/dist/client/assets/{ebnfDiagram-PWID7BFC-DaM3D5Ed.js → ebnfDiagram-PWID7BFC-DwwFkjaL.js} +1 -1
  135. package/dist/client/assets/ebnfDiagram-PWID7BFC-DwwFkjaL.js.br +0 -0
  136. package/dist/client/assets/ebnfDiagram-PWID7BFC-DwwFkjaL.js.gz +0 -0
  137. package/dist/client/assets/{erDiagram-RLTQ6QDP-Df9kQwWg.js → erDiagram-RLTQ6QDP-B1MNvouo.js} +1 -1
  138. package/dist/client/assets/erDiagram-RLTQ6QDP-B1MNvouo.js.br +0 -0
  139. package/dist/client/assets/erDiagram-RLTQ6QDP-B1MNvouo.js.gz +0 -0
  140. package/dist/client/assets/{flowDiagram-HODETNUW-CWjDvpsN.js → flowDiagram-HODETNUW-B_tIl0Vb.js} +1 -1
  141. package/dist/client/assets/flowDiagram-HODETNUW-B_tIl0Vb.js.br +0 -0
  142. package/dist/client/assets/flowDiagram-HODETNUW-B_tIl0Vb.js.gz +0 -0
  143. package/dist/client/assets/{ganttDiagram-EL5Y4UJY-mKt-CgrH.js → ganttDiagram-EL5Y4UJY-CV0YyZHk.js} +1 -1
  144. package/dist/client/assets/ganttDiagram-EL5Y4UJY-CV0YyZHk.js.br +0 -0
  145. package/dist/client/assets/ganttDiagram-EL5Y4UJY-CV0YyZHk.js.gz +0 -0
  146. package/dist/client/assets/gestureArbiter-DszagC-d.js +1 -0
  147. package/dist/client/assets/gestureArbiter-DszagC-d.js.br +0 -0
  148. package/dist/client/assets/gestureArbiter-DszagC-d.js.gz +0 -0
  149. package/dist/client/assets/git-compare-CGiJqTYP.js +1 -0
  150. package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-BqnaVVZ0.js → gitGraphDiagram-WWUBYQGX-DZvnSoyE.js} +1 -1
  151. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DZvnSoyE.js.br +0 -0
  152. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DZvnSoyE.js.gz +0 -0
  153. package/dist/client/assets/index-CA1fR_jI.css +1 -0
  154. package/dist/client/assets/index-CA1fR_jI.css.br +0 -0
  155. package/dist/client/assets/index-CA1fR_jI.css.gz +0 -0
  156. package/dist/client/assets/{infoDiagram-27XIBGKW-CkniyUX9.js → infoDiagram-27XIBGKW-G1OS50nR.js} +1 -1
  157. package/dist/client/assets/{ishikawaDiagram-5VMMS53U-CKo9urjS.js → ishikawaDiagram-5VMMS53U-C0-s6pfy.js} +1 -1
  158. package/dist/client/assets/ishikawaDiagram-5VMMS53U-C0-s6pfy.js.br +0 -0
  159. package/dist/client/assets/ishikawaDiagram-5VMMS53U-C0-s6pfy.js.gz +0 -0
  160. package/dist/client/assets/{journeyDiagram-3NMN7TZE-Cd4jK-oI.js → journeyDiagram-3NMN7TZE-B-9Omdit.js} +1 -1
  161. package/dist/client/assets/journeyDiagram-3NMN7TZE-B-9Omdit.js.br +0 -0
  162. package/dist/client/assets/journeyDiagram-3NMN7TZE-B-9Omdit.js.gz +0 -0
  163. package/dist/client/assets/{kanban-definition-UXKFOSKX-BuulZGO-.js → kanban-definition-UXKFOSKX-BS_qXegp.js} +1 -1
  164. package/dist/client/assets/kanban-definition-UXKFOSKX-BS_qXegp.js.br +0 -0
  165. package/dist/client/assets/kanban-definition-UXKFOSKX-BS_qXegp.js.gz +0 -0
  166. package/dist/client/assets/{layout-BpJ2ofrz.js → layout-0NYin1Qz.js} +1 -1
  167. package/dist/client/assets/{layout-BpJ2ofrz.js.br → layout-0NYin1Qz.js.br} +0 -0
  168. package/dist/client/assets/layout-0NYin1Qz.js.gz +0 -0
  169. package/dist/client/assets/{linear-CaSbGLIA.js → linear-CTVKrsxK.js} +1 -1
  170. package/dist/client/assets/linear-CTVKrsxK.js.br +0 -0
  171. package/dist/client/assets/linear-CTVKrsxK.js.gz +0 -0
  172. package/dist/client/assets/link-C5oPMHMJ.js +8 -0
  173. package/dist/client/assets/link-C5oPMHMJ.js.br +0 -0
  174. package/dist/client/assets/link-C5oPMHMJ.js.gz +0 -0
  175. package/dist/client/assets/list-tree-BPg9QdiM.js +1 -0
  176. package/dist/client/assets/loader-circle-CTtHKNWd.js +1 -0
  177. package/dist/client/assets/maximize-2-32OfQ0kG.js +1 -0
  178. package/dist/client/assets/{mermaid.core-BlkorXd6.js → mermaid.core-BgCZP9ke.js} +5 -5
  179. package/dist/client/assets/mermaid.core-BgCZP9ke.js.br +0 -0
  180. package/dist/client/assets/mermaid.core-BgCZP9ke.js.gz +0 -0
  181. package/dist/client/assets/{mindmap-definition-YA3MSWOX-BqKhK1NJ.js → mindmap-definition-YA3MSWOX-BjSZRjkg.js} +2 -2
  182. package/dist/client/assets/mindmap-definition-YA3MSWOX-BjSZRjkg.js.br +0 -0
  183. package/dist/client/assets/mindmap-definition-YA3MSWOX-BjSZRjkg.js.gz +0 -0
  184. package/dist/client/assets/passwordBootstrap-CXQgj5nw.js +2 -0
  185. package/dist/client/assets/passwordBootstrap-CXQgj5nw.js.br +0 -0
  186. package/dist/client/assets/passwordBootstrap-CXQgj5nw.js.gz +0 -0
  187. package/dist/client/assets/{pegDiagram-XKGWAZYB-BlWgUklx.js → pegDiagram-XKGWAZYB-qDU0sU6m.js} +1 -1
  188. package/dist/client/assets/pegDiagram-XKGWAZYB-qDU0sU6m.js.br +0 -0
  189. package/dist/client/assets/pegDiagram-XKGWAZYB-qDU0sU6m.js.gz +0 -0
  190. package/dist/client/assets/{pieDiagram-E7YTZNPT-Bp32kHHQ.js → pieDiagram-E7YTZNPT-CZF3MEOJ.js} +1 -1
  191. package/dist/client/assets/pieDiagram-E7YTZNPT-CZF3MEOJ.js.br +0 -0
  192. package/dist/client/assets/pieDiagram-E7YTZNPT-CZF3MEOJ.js.gz +0 -0
  193. package/dist/client/assets/{quadrantDiagram-AXDQQJYC-0qeSh9-W.js → quadrantDiagram-AXDQQJYC-DcZW4RMG.js} +1 -1
  194. package/dist/client/assets/quadrantDiagram-AXDQQJYC-DcZW4RMG.js.br +0 -0
  195. package/dist/client/assets/quadrantDiagram-AXDQQJYC-DcZW4RMG.js.gz +0 -0
  196. package/dist/client/assets/quote-CuTMveNr.js +1 -0
  197. package/dist/client/assets/{railroadDiagram-O6MQD6OU-COmWghVD.js → railroadDiagram-O6MQD6OU-DtQROK31.js} +1 -1
  198. package/dist/client/assets/railroadDiagram-O6MQD6OU-DtQROK31.js.br +0 -0
  199. package/dist/client/assets/railroadDiagram-O6MQD6OU-DtQROK31.js.gz +0 -0
  200. package/dist/client/assets/rdpSession-a1ZvAyiW.js +1 -0
  201. package/dist/client/assets/rdpSession-a1ZvAyiW.js.br +0 -0
  202. package/dist/client/assets/rdpSession-a1ZvAyiW.js.gz +0 -0
  203. package/dist/client/assets/{requirementDiagram-BXWQKSXE-CeohDJAC.js → requirementDiagram-BXWQKSXE-B8yR39lm.js} +1 -1
  204. package/dist/client/assets/requirementDiagram-BXWQKSXE-B8yR39lm.js.br +0 -0
  205. package/dist/client/assets/requirementDiagram-BXWQKSXE-B8yR39lm.js.gz +0 -0
  206. package/dist/client/assets/{sankeyDiagram-P5KCCOFB-rA5x9iOw.js → sankeyDiagram-P5KCCOFB-D27zuIFg.js} +1 -1
  207. package/dist/client/assets/sankeyDiagram-P5KCCOFB-D27zuIFg.js.br +0 -0
  208. package/dist/client/assets/sankeyDiagram-P5KCCOFB-D27zuIFg.js.gz +0 -0
  209. package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-Cw2BZ0po.js → sequenceDiagram-WJ2MYXX4-BI3gSsUa.js} +1 -1
  210. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-BI3gSsUa.js.br +0 -0
  211. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-BI3gSsUa.js.gz +0 -0
  212. package/dist/client/assets/settings-2-GFFo5UwO.js +1 -0
  213. package/dist/client/assets/{sizeCapture-INFHLROL-Dz1ykd8a.js → sizeCapture-INFHLROL-NBzIIRER.js} +1 -1
  214. package/dist/client/assets/sizeCapture-INFHLROL-NBzIIRER.js.br +0 -0
  215. package/dist/client/assets/sizeCapture-INFHLROL-NBzIIRER.js.gz +0 -0
  216. package/dist/client/assets/{sparkles-0HeBLLwx.js → sparkles-ZXBp-KvJ.js} +1 -1
  217. package/dist/client/assets/{stateDiagram-D77RDMKH-DHfjTfLj.js → stateDiagram-D77RDMKH-D-D0FB4D.js} +1 -1
  218. package/dist/client/assets/stateDiagram-D77RDMKH-D-D0FB4D.js.br +0 -0
  219. package/dist/client/assets/stateDiagram-D77RDMKH-D-D0FB4D.js.gz +0 -0
  220. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-Dk-QpCnJ.js +1 -0
  221. package/dist/client/assets/sun-CO5F9zS4.js +1 -0
  222. package/dist/client/assets/{swimlanes-42K2YHIH-CAJkSUVz.js → swimlanes-42K2YHIH-CH_jxbV3.js} +1 -1
  223. package/dist/client/assets/swimlanes-42K2YHIH-CH_jxbV3.js.br +0 -0
  224. package/dist/client/assets/swimlanes-42K2YHIH-CH_jxbV3.js.gz +0 -0
  225. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-C4E5FOdv.js +8 -0
  226. package/dist/client/assets/swiper-DJjq1TYT.js +1 -0
  227. package/dist/client/assets/swiper-DJjq1TYT.js.br +0 -0
  228. package/dist/client/assets/swiper-DJjq1TYT.js.gz +0 -0
  229. package/dist/client/assets/syntaxHighlight-C9PKWUqs.js +4 -0
  230. package/dist/client/assets/syntaxHighlight-C9PKWUqs.js.br +0 -0
  231. package/dist/client/assets/syntaxHighlight-C9PKWUqs.js.gz +0 -0
  232. package/dist/client/assets/{timeline-definition-24CTP7MA-plr9yv12.js → timeline-definition-24CTP7MA-DuiaCBON.js} +1 -1
  233. package/dist/client/assets/timeline-definition-24CTP7MA-DuiaCBON.js.br +0 -0
  234. package/dist/client/assets/timeline-definition-24CTP7MA-DuiaCBON.js.gz +0 -0
  235. package/dist/client/assets/triangle-alert-CuGUScPU.js +1 -0
  236. package/dist/client/assets/unplug-C0pb-BKU.js +1 -0
  237. package/dist/client/assets/use-gesture-react.esm-DYpdiE_k.js +1 -0
  238. package/dist/client/assets/use-gesture-react.esm-DYpdiE_k.js.br +0 -0
  239. package/dist/client/assets/use-gesture-react.esm-DYpdiE_k.js.gz +0 -0
  240. package/dist/client/assets/v4-EwEgHOG0.js +1 -0
  241. package/dist/client/assets/{vennDiagram-4TSXK5OY-Cz04de3S.js → vennDiagram-4TSXK5OY-DUEZFEzo.js} +1 -1
  242. package/dist/client/assets/vennDiagram-4TSXK5OY-DUEZFEzo.js.br +0 -0
  243. package/dist/client/assets/vennDiagram-4TSXK5OY-DUEZFEzo.js.gz +0 -0
  244. package/dist/client/assets/videoCompression-JAcp0atl.js +3 -0
  245. package/dist/client/assets/videoCompression-JAcp0atl.js.br +0 -0
  246. package/dist/client/assets/videoCompression-JAcp0atl.js.gz +0 -0
  247. package/dist/client/assets/{wardleyDiagram-VM6X3IG4-DnT-q6At.js → wardleyDiagram-VM6X3IG4-CnHmIbot.js} +1 -1
  248. package/dist/client/assets/wardleyDiagram-VM6X3IG4-CnHmIbot.js.br +0 -0
  249. package/dist/client/assets/wardleyDiagram-VM6X3IG4-CnHmIbot.js.gz +0 -0
  250. package/dist/client/assets/{xychartDiagram-S5SC5T6Z-C0y08MEX.js → xychartDiagram-S5SC5T6Z-CDAoHQTr.js} +1 -1
  251. package/dist/client/assets/xychartDiagram-S5SC5T6Z-CDAoHQTr.js.br +0 -0
  252. package/dist/client/assets/xychartDiagram-S5SC5T6Z-CDAoHQTr.js.gz +0 -0
  253. package/dist/client/index.html +2 -2
  254. package/dist/client/index.html.br +0 -0
  255. package/dist/client/index.html.gz +0 -0
  256. package/dist/client/sw.js +1 -1
  257. package/dist/client/sw.js.br +0 -0
  258. package/dist/client/sw.js.gz +0 -0
  259. package/dist/server/agent/collaborationDeliveryWorker.js +11 -0
  260. package/dist/server/agent/collaborationPrompt.js +4 -2
  261. package/dist/server/agent/collaborationStore.js +7 -1
  262. package/dist/server/agent/sessionAttachmentRoutes.js +39 -0
  263. package/dist/server/agent/sessionChatRoutes.js +64 -0
  264. package/dist/server/agent/sessionViewModeRoutes.js +72 -0
  265. package/dist/server/android/recording.js +19 -17
  266. package/dist/server/cli.js +34 -0
  267. package/dist/server/entry.js +25 -17
  268. package/dist/server/federation/accessPolicy.js +8 -3
  269. package/dist/server/federation/authorization.js +26 -3
  270. package/dist/server/federation/invitations.js +27 -6
  271. package/dist/server/federation/requestContext.js +5 -1
  272. package/dist/server/federation/resourceAccess.js +63 -0
  273. package/dist/server/federation/runtime.js +60 -17
  274. package/dist/server/federation/sessionSharing.js +39 -0
  275. package/dist/server/routes/android.js +36 -7
  276. package/dist/server/routes/computer.js +14 -4
  277. package/dist/server/routes/filesystem.js +6 -3
  278. package/dist/server/routes/rdp.js +4 -3
  279. package/dist/server/routes/sharedFiles.js +51 -0
  280. package/dist/server/routes/terminal.js +83 -14
  281. package/dist/server/routes/vncReadOnly.js +134 -0
  282. package/dist/server/shared/shareResources.js +37 -0
  283. package/dist/server/todos/cli.js +91 -0
  284. package/dist/server/todos/routes.js +73 -0
  285. package/dist/server/todos/store.js +240 -0
  286. package/dist/server/todos/types.js +1 -0
  287. package/dist/server/utils/autoUpdate.js +7 -2
  288. package/dist/server/utils/clientSnapshotMaintenance.js +200 -0
  289. package/dist/server/utils/runtimeClient.js +79 -0
  290. package/dist/server/utils/serverCleanup.js +24 -0
  291. package/dist/server/utils/storageMaintenance.js +60 -0
  292. package/dist/server/utils/workspaceCacheMaintenance.js +158 -0
  293. package/package.json +1 -1
  294. package/runtime-manifest.json +3 -3
  295. package/dist/client/assets/App-BiDKeTpx.js +0 -187
  296. package/dist/client/assets/App-BiDKeTpx.js.br +0 -0
  297. package/dist/client/assets/App-BiDKeTpx.js.gz +0 -0
  298. package/dist/client/assets/ArchitecturePanel-DfRsqSBx.js +0 -9
  299. package/dist/client/assets/ArchitecturePanel-DfRsqSBx.js.br +0 -0
  300. package/dist/client/assets/ArchitecturePanel-DfRsqSBx.js.gz +0 -0
  301. package/dist/client/assets/ChangeWalkthroughPanel-DksecDp5.js +0 -2
  302. package/dist/client/assets/ChangeWalkthroughPanel-DksecDp5.js.br +0 -0
  303. package/dist/client/assets/ChangeWalkthroughPanel-DksecDp5.js.gz +0 -0
  304. package/dist/client/assets/CollaborationMainWorkspace-D-TgDrxX.js +0 -1
  305. package/dist/client/assets/CollaborationMainWorkspace-D-TgDrxX.js.br +0 -0
  306. package/dist/client/assets/CollaborationMainWorkspace-D-TgDrxX.js.gz +0 -0
  307. package/dist/client/assets/CollaborationTaskContent-Ce6gFw26.js +0 -2
  308. package/dist/client/assets/ComputerControlView-BKwuceeG.js +0 -6
  309. package/dist/client/assets/ComputerControlView-BKwuceeG.js.br +0 -0
  310. package/dist/client/assets/ComputerControlView-BKwuceeG.js.gz +0 -0
  311. package/dist/client/assets/DagPlayground-Cshoqo5l.js +0 -1
  312. package/dist/client/assets/DagPlayground-Cshoqo5l.js.br +0 -0
  313. package/dist/client/assets/DagPlayground-Cshoqo5l.js.gz +0 -0
  314. package/dist/client/assets/DiffLab-DFut8ZHi.js.br +0 -0
  315. package/dist/client/assets/DiffLab-DFut8ZHi.js.gz +0 -0
  316. package/dist/client/assets/DiffReview-DkEi5c3c.js +0 -1
  317. package/dist/client/assets/DiffReview-DkEi5c3c.js.br +0 -0
  318. package/dist/client/assets/DiffReview-DkEi5c3c.js.gz +0 -0
  319. package/dist/client/assets/DiffReviewLab-Y9JlI5DQ.js.br +0 -0
  320. package/dist/client/assets/DiffReviewLab-Y9JlI5DQ.js.gz +0 -0
  321. package/dist/client/assets/DiffViewer-3JGF6U0m.js +0 -37
  322. package/dist/client/assets/DiffViewer-3JGF6U0m.js.br +0 -0
  323. package/dist/client/assets/DiffViewer-3JGF6U0m.js.gz +0 -0
  324. package/dist/client/assets/ModelPreview-Cv6JgunE.js.br +0 -0
  325. package/dist/client/assets/ModelPreview-Cv6JgunE.js.gz +0 -0
  326. package/dist/client/assets/RightSidebar-akYx_nRq.js +0 -1679
  327. package/dist/client/assets/RightSidebar-akYx_nRq.js.br +0 -0
  328. package/dist/client/assets/RightSidebar-akYx_nRq.js.gz +0 -0
  329. package/dist/client/assets/abnfDiagram-VCTEODGH-CcCffdpj.js.br +0 -0
  330. package/dist/client/assets/abnfDiagram-VCTEODGH-CcCffdpj.js.gz +0 -0
  331. package/dist/client/assets/app-BB0CAQ8D.js +0 -35
  332. package/dist/client/assets/app-BB0CAQ8D.js.br +0 -0
  333. package/dist/client/assets/app-BB0CAQ8D.js.gz +0 -0
  334. package/dist/client/assets/arc-CXcCuzb3.js.br +0 -0
  335. package/dist/client/assets/arc-CXcCuzb3.js.gz +0 -0
  336. package/dist/client/assets/architectureDiagram-5GKGNRK7-CmR7whZz.js.br +0 -0
  337. package/dist/client/assets/architectureDiagram-5GKGNRK7-CmR7whZz.js.gz +0 -0
  338. package/dist/client/assets/blockDiagram-I7D4REHJ-DODhUpHm.js.br +0 -0
  339. package/dist/client/assets/blockDiagram-I7D4REHJ-DODhUpHm.js.gz +0 -0
  340. package/dist/client/assets/c4Diagram-7LVT6UL2-BF9eEb2Y.js.br +0 -0
  341. package/dist/client/assets/c4Diagram-7LVT6UL2-BF9eEb2Y.js.gz +0 -0
  342. package/dist/client/assets/channel-BKkTA-X_.js +0 -1
  343. package/dist/client/assets/chunk-F27PBJKO-Bv45U-az.js.gz +0 -0
  344. package/dist/client/assets/chunk-IMKFNOWR-CfEErbEd.js.br +0 -0
  345. package/dist/client/assets/chunk-IMKFNOWR-CfEErbEd.js.gz +0 -0
  346. package/dist/client/assets/chunk-SVP7TREG-CbyJW-OT.js.br +0 -0
  347. package/dist/client/assets/chunk-SVP7TREG-CbyJW-OT.js.gz +0 -0
  348. package/dist/client/assets/chunk-TICWLB2K-t93EivmS.js.br +0 -0
  349. package/dist/client/assets/chunk-TICWLB2K-t93EivmS.js.gz +0 -0
  350. package/dist/client/assets/classDiagram-ZZMXUADV-D9nwA51-.js +0 -1
  351. package/dist/client/assets/classDiagram-v2-VYDZK3BY-D9nwA51-.js +0 -1
  352. package/dist/client/assets/cose-bilkent-JH36ORCC-CksG0bvP.js.br +0 -0
  353. package/dist/client/assets/cose-bilkent-JH36ORCC-CksG0bvP.js.gz +0 -0
  354. package/dist/client/assets/cynefin-OW5HDTMX-CV3T078G.js.br +0 -0
  355. package/dist/client/assets/cynefin-OW5HDTMX-CV3T078G.js.gz +0 -0
  356. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-BQnJabEs.js.br +0 -0
  357. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-BQnJabEs.js.gz +0 -0
  358. package/dist/client/assets/dagre-GXQ25YYZ-BeIQp5Pv.js.br +0 -0
  359. package/dist/client/assets/dagre-GXQ25YYZ-BeIQp5Pv.js.gz +0 -0
  360. package/dist/client/assets/diagram-S7CK7UJ4-D-Mibxiq.js.br +0 -0
  361. package/dist/client/assets/diagram-S7CK7UJ4-D-Mibxiq.js.gz +0 -0
  362. package/dist/client/assets/diagram-UQ7AKVKN-eiIMWp9t.js.br +0 -0
  363. package/dist/client/assets/diagram-UQ7AKVKN-eiIMWp9t.js.gz +0 -0
  364. package/dist/client/assets/diagram-VSXAHHWV-CTVOWtNL.js.br +0 -0
  365. package/dist/client/assets/diagram-VSXAHHWV-CTVOWtNL.js.gz +0 -0
  366. package/dist/client/assets/diagram-VX7I27RA-NKKk6uh7.js.br +0 -0
  367. package/dist/client/assets/diagram-VX7I27RA-NKKk6uh7.js.gz +0 -0
  368. package/dist/client/assets/diagram-Z3DM3KII-DKYdBuNs.js.br +0 -0
  369. package/dist/client/assets/diagram-Z3DM3KII-DKYdBuNs.js.gz +0 -0
  370. package/dist/client/assets/ebnfDiagram-PWID7BFC-DaM3D5Ed.js.br +0 -0
  371. package/dist/client/assets/ebnfDiagram-PWID7BFC-DaM3D5Ed.js.gz +0 -0
  372. package/dist/client/assets/erDiagram-RLTQ6QDP-Df9kQwWg.js.br +0 -0
  373. package/dist/client/assets/erDiagram-RLTQ6QDP-Df9kQwWg.js.gz +0 -0
  374. package/dist/client/assets/flowDiagram-HODETNUW-CWjDvpsN.js.br +0 -0
  375. package/dist/client/assets/flowDiagram-HODETNUW-CWjDvpsN.js.gz +0 -0
  376. package/dist/client/assets/ganttDiagram-EL5Y4UJY-mKt-CgrH.js.br +0 -0
  377. package/dist/client/assets/ganttDiagram-EL5Y4UJY-mKt-CgrH.js.gz +0 -0
  378. package/dist/client/assets/gestureArbiter-C8TBuoU3.js +0 -1
  379. package/dist/client/assets/gestureArbiter-C8TBuoU3.js.br +0 -0
  380. package/dist/client/assets/gestureArbiter-C8TBuoU3.js.gz +0 -0
  381. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BqnaVVZ0.js.br +0 -0
  382. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BqnaVVZ0.js.gz +0 -0
  383. package/dist/client/assets/index-3lPto_1X.css +0 -1
  384. package/dist/client/assets/index-3lPto_1X.css.br +0 -0
  385. package/dist/client/assets/index-3lPto_1X.css.gz +0 -0
  386. package/dist/client/assets/ishikawaDiagram-5VMMS53U-CKo9urjS.js.br +0 -0
  387. package/dist/client/assets/ishikawaDiagram-5VMMS53U-CKo9urjS.js.gz +0 -0
  388. package/dist/client/assets/journeyDiagram-3NMN7TZE-Cd4jK-oI.js.br +0 -0
  389. package/dist/client/assets/journeyDiagram-3NMN7TZE-Cd4jK-oI.js.gz +0 -0
  390. package/dist/client/assets/kanban-definition-UXKFOSKX-BuulZGO-.js.br +0 -0
  391. package/dist/client/assets/kanban-definition-UXKFOSKX-BuulZGO-.js.gz +0 -0
  392. package/dist/client/assets/layout-BpJ2ofrz.js.gz +0 -0
  393. package/dist/client/assets/linear-CaSbGLIA.js.br +0 -0
  394. package/dist/client/assets/linear-CaSbGLIA.js.gz +0 -0
  395. package/dist/client/assets/mermaid.core-BlkorXd6.js.br +0 -0
  396. package/dist/client/assets/mermaid.core-BlkorXd6.js.gz +0 -0
  397. package/dist/client/assets/mindmap-definition-YA3MSWOX-BqKhK1NJ.js.br +0 -0
  398. package/dist/client/assets/mindmap-definition-YA3MSWOX-BqKhK1NJ.js.gz +0 -0
  399. package/dist/client/assets/passwordBootstrap-DLUamTjd.js +0 -2
  400. package/dist/client/assets/passwordBootstrap-DLUamTjd.js.br +0 -0
  401. package/dist/client/assets/passwordBootstrap-DLUamTjd.js.gz +0 -0
  402. package/dist/client/assets/pegDiagram-XKGWAZYB-BlWgUklx.js.br +0 -0
  403. package/dist/client/assets/pegDiagram-XKGWAZYB-BlWgUklx.js.gz +0 -0
  404. package/dist/client/assets/pieDiagram-E7YTZNPT-Bp32kHHQ.js.br +0 -0
  405. package/dist/client/assets/pieDiagram-E7YTZNPT-Bp32kHHQ.js.gz +0 -0
  406. package/dist/client/assets/quadrantDiagram-AXDQQJYC-0qeSh9-W.js.br +0 -0
  407. package/dist/client/assets/quadrantDiagram-AXDQQJYC-0qeSh9-W.js.gz +0 -0
  408. package/dist/client/assets/railroadDiagram-O6MQD6OU-COmWghVD.js.br +0 -0
  409. package/dist/client/assets/railroadDiagram-O6MQD6OU-COmWghVD.js.gz +0 -0
  410. package/dist/client/assets/rdpSession-Bbycnmly.js +0 -1
  411. package/dist/client/assets/rdpSession-Bbycnmly.js.br +0 -0
  412. package/dist/client/assets/rdpSession-Bbycnmly.js.gz +0 -0
  413. package/dist/client/assets/referenceLongPress-CQ9ote5C.js +0 -1
  414. package/dist/client/assets/referenceLongPress-CQ9ote5C.js.br +0 -0
  415. package/dist/client/assets/referenceLongPress-CQ9ote5C.js.gz +0 -0
  416. package/dist/client/assets/requirementDiagram-BXWQKSXE-CeohDJAC.js.br +0 -0
  417. package/dist/client/assets/requirementDiagram-BXWQKSXE-CeohDJAC.js.gz +0 -0
  418. package/dist/client/assets/sankeyDiagram-P5KCCOFB-rA5x9iOw.js.br +0 -0
  419. package/dist/client/assets/sankeyDiagram-P5KCCOFB-rA5x9iOw.js.gz +0 -0
  420. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-Cw2BZ0po.js.br +0 -0
  421. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-Cw2BZ0po.js.gz +0 -0
  422. package/dist/client/assets/sizeCapture-INFHLROL-Dz1ykd8a.js.br +0 -0
  423. package/dist/client/assets/sizeCapture-INFHLROL-Dz1ykd8a.js.gz +0 -0
  424. package/dist/client/assets/stateDiagram-D77RDMKH-DHfjTfLj.js.br +0 -0
  425. package/dist/client/assets/stateDiagram-D77RDMKH-DHfjTfLj.js.gz +0 -0
  426. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-B9AqPaxQ.js +0 -1
  427. package/dist/client/assets/swimlanes-42K2YHIH-CAJkSUVz.js.br +0 -0
  428. package/dist/client/assets/swimlanes-42K2YHIH-CAJkSUVz.js.gz +0 -0
  429. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-DPbqRuWV.js +0 -8
  430. package/dist/client/assets/timeline-definition-24CTP7MA-plr9yv12.js.br +0 -0
  431. package/dist/client/assets/timeline-definition-24CTP7MA-plr9yv12.js.gz +0 -0
  432. package/dist/client/assets/triangle-alert-ibl6FV9I.js +0 -1
  433. package/dist/client/assets/vennDiagram-4TSXK5OY-Cz04de3S.js.br +0 -0
  434. package/dist/client/assets/vennDiagram-4TSXK5OY-Cz04de3S.js.gz +0 -0
  435. package/dist/client/assets/videoCompression-DCsUD6X6.js +0 -3
  436. package/dist/client/assets/videoCompression-DCsUD6X6.js.br +0 -0
  437. package/dist/client/assets/videoCompression-DCsUD6X6.js.gz +0 -0
  438. package/dist/client/assets/wardleyDiagram-VM6X3IG4-DnT-q6At.js.br +0 -0
  439. package/dist/client/assets/wardleyDiagram-VM6X3IG4-DnT-q6At.js.gz +0 -0
  440. package/dist/client/assets/xychartDiagram-S5SC5T6Z-C0y08MEX.js.br +0 -0
  441. package/dist/client/assets/xychartDiagram-S5SC5T6Z-C0y08MEX.js.gz +0 -0
  442. /package/dist/client/assets/{gestureArbiter-C2J0D0kV.css → swiper-C2J0D0kV.css} +0 -0
  443. /package/dist/client/assets/{gestureArbiter-C2J0D0kV.css.br → swiper-C2J0D0kV.css.br} +0 -0
  444. /package/dist/client/assets/{gestureArbiter-C2J0D0kV.css.gz → swiper-C2J0D0kV.css.gz} +0 -0
@@ -18,6 +18,32 @@ function isCompleteSnapshot(clientDist, serverBundleHash, clientBundleHash) {
18
18
  && marker.clientEntrypoint === 'dist/client/index.html'
19
19
  && fs.existsSync(path.join(clientDist, 'index.html'));
20
20
  }
21
+ function hasExactClientContents(directory, expected) {
22
+ try {
23
+ const hash = crypto.createHash('sha256');
24
+ let entries = 0;
25
+ const visit = (current, relative = '') => {
26
+ if (!fs.lstatSync(current).isDirectory())
27
+ throw new Error('Linked snapshot');
28
+ for (const entry of fs.readdirSync(current, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name))) {
29
+ if (++entries > 10_000)
30
+ throw new Error('Snapshot entry limit');
31
+ const file = path.join(current, entry.name), name = path.join(relative, entry.name);
32
+ if (entry.isDirectory())
33
+ visit(file, name);
34
+ else if (entry.isFile())
35
+ hash.update(name.split(path.sep).join('/')).update('\0').update(fs.readFileSync(file)).update('\0');
36
+ else
37
+ throw new Error('Linked snapshot');
38
+ }
39
+ };
40
+ visit(directory);
41
+ return `sha256-${hash.digest('base64')}` === expected;
42
+ }
43
+ catch {
44
+ return false;
45
+ }
46
+ }
21
47
  /**
22
48
  * Keep the browser bundle served by this process immutable for its lifetime.
23
49
  *
@@ -47,8 +73,31 @@ export function pinBundledRuntimeClientDist(defaultClientDist, homeDir = os.home
47
73
  const snapshotRoot = path.join(snapshotsRoot, snapshotKey);
48
74
  const snapshotClientDist = path.join(snapshotRoot, 'dist', 'client');
49
75
  if (isCompleteSnapshot(snapshotClientDist, manifest.serverBundleHash, manifest.clientBundleHash)) {
76
+ try {
77
+ fs.utimesSync(snapshotRoot, new Date(), new Date());
78
+ }
79
+ catch { /* Read-only caches remain usable. */ }
50
80
  return snapshotClientDist;
51
81
  }
82
+ // Server-only upgrades do not need another full copy of the same client.
83
+ try {
84
+ for (const entry of fs.readdirSync(snapshotsRoot, { withFileTypes: true })) {
85
+ if (!entry.isDirectory() || !/^[a-f0-9]{24}$/.test(entry.name))
86
+ continue;
87
+ const candidate = path.join(snapshotsRoot, entry.name, 'dist', 'client');
88
+ const marker = readManifest(path.join(snapshotsRoot, entry.name, 'snapshot-manifest.json'));
89
+ if (typeof marker?.serverBundleHash === 'string' && marker.clientBundleHash === manifest.clientBundleHash
90
+ && isCompleteSnapshot(candidate, marker.serverBundleHash, manifest.clientBundleHash)
91
+ && hasExactClientContents(candidate, manifest.clientBundleHash)) {
92
+ try {
93
+ fs.utimesSync(path.join(snapshotsRoot, entry.name), new Date(), new Date());
94
+ }
95
+ catch { /* Read-only caches remain usable. */ }
96
+ return candidate;
97
+ }
98
+ }
99
+ }
100
+ catch { /* First run or an unavailable cache; copy the installed bundle. */ }
52
101
  fs.mkdirSync(snapshotsRoot, { recursive: true, mode: 0o700 });
53
102
  const temporaryRoot = fs.mkdtempSync(path.join(snapshotsRoot, `.${snapshotKey}-`));
54
103
  const temporaryClientDist = path.join(temporaryRoot, 'dist', 'client');
@@ -119,3 +168,33 @@ export function indexRetainedClientModules(homeDir = os.homedir()) {
119
168
  catch { /* No retained snapshots on first install. */ }
120
169
  return modules;
121
170
  }
171
+ const touchedSnapshots = new Map();
172
+ /** Refresh expired index entries without losing a module kept by another build. */
173
+ export function resolveRetainedClientModule(modules, url, homeDir = os.homedir()) {
174
+ let retainedPath = modules.get(url);
175
+ if (retainedPath && !fs.existsSync(retainedPath)) {
176
+ modules.clear();
177
+ for (const [key, file] of indexRetainedClientModules(homeDir))
178
+ modules.set(key, file);
179
+ retainedPath = modules.get(url);
180
+ }
181
+ if (retainedPath)
182
+ touchRetainedClientModule(retainedPath);
183
+ return retainedPath;
184
+ }
185
+ /** A page that still loads an older module renews that snapshot's grace period. */
186
+ export function touchRetainedClientModule(modulePath) {
187
+ const directory = path.resolve(modulePath, '..', '..', '..', '..');
188
+ if (path.basename(path.dirname(directory)) !== 'client-snapshots' || !/^[a-f0-9]{24}$/.test(path.basename(directory)))
189
+ return;
190
+ const now = Date.now();
191
+ if (now - (touchedSnapshots.get(directory) ?? 0) < 60_000)
192
+ return;
193
+ touchedSnapshots.set(directory, now);
194
+ if (touchedSnapshots.size > 1024)
195
+ touchedSnapshots.delete(touchedSnapshots.keys().next().value);
196
+ try {
197
+ fs.utimesSync(directory, new Date(now), new Date(now));
198
+ }
199
+ catch { /* Already expired or read-only. */ }
200
+ }
@@ -0,0 +1,24 @@
1
+ /** Share one close listener across server resources, including async startup. */
2
+ export function serverCleanup(server, onError = error => console.error('[server-cleanup]', error)) {
3
+ const callbacks = [];
4
+ let closed = false;
5
+ const run = (callback) => {
6
+ try {
7
+ callback();
8
+ }
9
+ catch (error) {
10
+ onError(error);
11
+ }
12
+ };
13
+ server.once('close', () => {
14
+ closed = true;
15
+ for (const callback of callbacks.splice(0))
16
+ run(callback);
17
+ });
18
+ return (callback) => {
19
+ if (closed)
20
+ run(callback);
21
+ else
22
+ callbacks.push(callback);
23
+ };
24
+ }
@@ -0,0 +1,60 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { leaseClientSnapshot, pruneClientSnapshots } from './clientSnapshotMaintenance.js';
4
+ import { pruneWorkspaceCaches } from './workspaceCacheMaintenance.js';
5
+ /** The same conservative migration handles existing data and future upgrades. */
6
+ export async function maintainGeneratedStorage(options) {
7
+ const startedAt = Date.now();
8
+ const entries = [
9
+ ...await pruneClientSnapshots(options),
10
+ ...await pruneWorkspaceCaches(options),
11
+ ];
12
+ const report = { kind: 'termdock-generated-storage-maintenance', version: 1, startedAt, finishedAt: Date.now(), dryRun: options.dryRun === true,
13
+ reclaimedBytes: entries.filter(item => item.action === 'removed').reduce((sum, item) => sum + item.bytes, 0), entries };
14
+ if (!options.dryRun) {
15
+ const file = path.join(options.stateDirectory, 'storage-maintenance.json');
16
+ try {
17
+ // Preserve a pre-existing foreign file instead of claiming its path.
18
+ try {
19
+ if (JSON.parse(await fs.readFile(file, 'utf8')).kind !== report.kind)
20
+ return report;
21
+ }
22
+ catch (error) {
23
+ if (error.code !== 'ENOENT')
24
+ return report;
25
+ }
26
+ const temporary = `${file}.${process.pid}.tmp`;
27
+ await fs.writeFile(temporary, `${JSON.stringify(report, null, 2)}\n`, { mode: 0o600 });
28
+ await fs.rename(temporary, file);
29
+ }
30
+ catch { /* Cleanup must not turn diagnostic storage failure into downtime. */ }
31
+ }
32
+ return report;
33
+ }
34
+ export function startGeneratedStorageMaintenance(options) {
35
+ if (process.env.NODE_ENV === 'test')
36
+ return () => { };
37
+ const release = leaseClientSnapshot(options.clientDirectory, options.stateDirectory);
38
+ let stopped = false, running = false;
39
+ const run = async () => {
40
+ if (running || stopped)
41
+ return;
42
+ running = true;
43
+ try {
44
+ const report = await maintainGeneratedStorage(options);
45
+ console.log(`[storage-maintenance] reclaimed ${report.reclaimedBytes} bytes; ${report.entries.filter(item => item.action === 'retained').length} paths retained`);
46
+ }
47
+ catch (error) {
48
+ console.warn('[storage-maintenance] retained unverified data:', error instanceof Error ? error.message : 'check failed');
49
+ }
50
+ finally {
51
+ running = false;
52
+ }
53
+ };
54
+ // Let the listener become healthy before migrating large legacy caches.
55
+ const startup = setTimeout(() => { void run(); }, 5_000);
56
+ startup.unref();
57
+ const timer = setInterval(() => { void run(); }, 6 * 60 * 60_000);
58
+ timer.unref();
59
+ return () => { stopped = true; clearTimeout(startup); clearInterval(timer); release(); };
60
+ }
@@ -0,0 +1,158 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { execFile } from 'node:child_process';
4
+ import { promisify } from 'node:util';
5
+ const exec = promisify(execFile);
6
+ const DAY = 24 * 60 * 60_000;
7
+ const git = async (cwd, args) => (await exec('git', ['-C', cwd, ...args], {
8
+ timeout: 15_000, maxBuffer: 1024 * 1024, env: { ...process.env, GIT_OPTIONAL_LOCKS: '0', GIT_TERMINAL_PROMPT: '0' },
9
+ })).stdout.trim();
10
+ // A separate Node process runs INSIDE Cargo's Linux flock. No shell evaluates
11
+ // paths. Source, node_modules, final binaries, bundles and unknown files stay.
12
+ const CARGO_CACHE_WORKER = String.raw `
13
+ const fs = await import('node:fs/promises');
14
+ const path = await import('node:path');
15
+ const { execFileSync } = await import('node:child_process');
16
+ const o = JSON.parse(process.argv[1]);
17
+ const result = [];
18
+ const real = async p => (await fs.lstat(p)).isDirectory() && await fs.realpath(p) === path.resolve(p);
19
+ const git = args => execFileSync('git', ['-C', o.workspace, ...args], { encoding: 'utf8', timeout: 15000, env: { ...process.env, GIT_OPTIONAL_LOCKS: '0' } }).trim();
20
+ const busy = async () => {
21
+ for (const e of await fs.readdir('/proc')) {
22
+ if (!/^\d+$/.test(e) || [process.pid, process.ppid].includes(Number(e))) continue;
23
+ const p = '/proc/' + e;
24
+ try {
25
+ if ((await fs.stat(p)).uid !== process.getuid()) continue;
26
+ for (const link of ['cwd', 'exe']) {
27
+ let value; try { value = await fs.readlink(p + '/' + link); } catch { continue; }
28
+ if (value === o.workspace || value.startsWith(o.workspace + path.sep)) return true;
29
+ }
30
+ const args = (await fs.readFile(p + '/cmdline', 'utf8')).split('\0');
31
+ if (args.some(a => a.includes(o.workspace))) return true;
32
+ // Protect libraries and executables mapped from an otherwise idle checkout.
33
+ try { if ((await fs.readFile(p + '/maps', 'utf8')).includes(o.workspace + path.sep)) return true; } catch {}
34
+ } catch (error) { if (!['ENOENT', 'ESRCH'].includes(error.code)) return true; }
35
+ }
36
+ return false;
37
+ };
38
+ try {
39
+ if (!await real(o.workspace) || !await real(o.target) || !await real(o.profile)) throw new Error('linked-or-missing-directory');
40
+ if (git(['branch', '--show-current']) !== o.branch || git(['rev-parse', '--show-toplevel']) !== o.workspace) throw new Error('workspace-identity-changed');
41
+ const lock = await fs.lstat(path.join(o.profile, '.cargo-lock'));
42
+ if (!lock.isFile() || lock.ino !== o.lockIno || lock.dev !== o.lockDev) throw new Error('cargo-lock-changed');
43
+ const tag = path.join(o.target, 'CACHEDIR.TAG');
44
+ if (!(await fs.lstat(tag)).isFile() || !(await fs.readFile(tag, 'utf8')).startsWith('Signature: 8a477f597d28d172789f06886806bc55')) throw new Error('missing-cargo-cache-tag');
45
+ const manifest = path.join(o.target, '..', 'Cargo.toml');
46
+ if (!(await fs.lstat(manifest)).isFile()) throw new Error('missing-cargo-manifest');
47
+ if (await busy()) throw new Error('workspace-in-use');
48
+ for (const name of ['deps', 'incremental', 'build', '.fingerprint']) {
49
+ const directory = path.join(o.profile, name);
50
+ try {
51
+ if (!await real(directory)) continue;
52
+ const relative = path.relative(o.workspace, directory).split(path.sep).join('/');
53
+ if (git(['ls-files', '--', relative])) throw new Error('tracked-files-in-cache');
54
+ execFileSync('git', ['-C', o.workspace, 'check-ignore', '--quiet', '--', relative + '/'], { timeout: 15000 });
55
+ const entries = await fs.readdir(directory, { withFileTypes: true });
56
+ if (!entries.length) continue;
57
+ if (entries.some(e => name === 'deps'
58
+ ? !e.isFile() || !/^[A-Za-z0-9_.-]+-[a-f0-9]{8,32}(?:\.[A-Za-z0-9_.-]+)?$/.test(e.name)
59
+ : !e.isDirectory() || !(name === 'incremental' ? /^[A-Za-z0-9_]+-[a-z0-9]+$/ : /^[A-Za-z0-9_.-]+-[a-f0-9]{8,32}$/).test(e.name))) throw new Error('unknown-cache-content');
60
+ let bytes = 0, newest = 0, count = 0, observed = [];
61
+ const identity = s => [s.dev,s.ino,s.size,s.mtimeMs,s.ctimeMs,s.isFile() ? s.atimeMs : 0].join(':');
62
+ const walk = async p => {
63
+ if (++count > 500000) throw new Error('cache-scan-limit');
64
+ const s = await fs.lstat(p);
65
+ if (!s.isFile() && !s.isDirectory()) throw new Error('linked-or-special-cache-content');
66
+ if (name === 'build') {
67
+ const parts = path.relative(directory, p).split(path.sep);
68
+ if (parts.length === 2 && (s.isDirectory() ? parts[1] !== 'out'
69
+ : !/^(?:invoked\.timestamp|output|stderr|root-output|build-script-build|build_script_build-[a-f0-9]+(?:\.d)?)$/.test(parts[1]))) throw new Error('unknown-cache-content');
70
+ }
71
+ observed.push([p,identity(s)]); newest = Math.max(newest,s.mtimeMs,s.isFile() ? s.atimeMs : 0);
72
+ if (s.isFile()) {
73
+ const file = path.basename(p);
74
+ if (name === 'incremental' && !/\.(?:o|bin|rmeta|bc|lock)$/.test(file)) throw new Error('unknown-cache-content');
75
+ if (name === '.fingerprint' && !/^(?:invoked\.timestamp|(?:lib|bin|test|bench|example|dep|run|build|output)[-_][A-Za-z0-9_.-]+)$/.test(file)) throw new Error('unknown-cache-content');
76
+ bytes += s.size; return;
77
+ }
78
+ for (const e of await fs.readdir(p)) await walk(path.join(p,e));
79
+ };
80
+ const cold = [];
81
+ for (const entry of entries) {
82
+ bytes = 0; newest = 0; observed = [];
83
+ const file = path.join(directory, entry.name); await walk(file);
84
+ if (o.now - newest >= o.idleMs) cold.push({ file, bytes, observed });
85
+ }
86
+ if (!cold.length) throw new Error('recently-used-cache');
87
+ if (await busy()) throw new Error('workspace-in-use');
88
+ for (const item of cold) for (const [p,id] of item.observed) if (identity(await fs.lstat(p)) !== id) throw new Error('cache-changed-during-check');
89
+ // Holding .cargo-lock keeps a new Cargo build from racing the deletion.
90
+ // Reclaim cold units inside a mixed cache, leaving recently read units.
91
+ if (!o.dryRun) {
92
+ for (const item of cold) await fs.rm(item.file, { recursive: true });
93
+ try { await fs.rmdir(directory); } catch (error) { if (!['ENOTEMPTY','EEXIST'].includes(error.code)) throw error; }
94
+ }
95
+ result.push({ path: directory, action: o.dryRun ? 'would-remove' : 'removed', reason: 'verified-idle-cargo-intermediates',
96
+ bytes: cold.reduce((sum,item) => sum + item.bytes, 0), entriesRemoved: cold.length, entriesRetained: entries.length - cold.length });
97
+ } catch (error) { result.push({ path: directory, action: 'retained', reason: error.message || 'cache-validation-failed', bytes: 0 }); }
98
+ }
99
+ } catch (error) { result.push({ path: o.profile, action: 'retained', reason: error.message, bytes: 0 }); }
100
+ process.stdout.write(JSON.stringify(result));
101
+ `;
102
+ /** Only registered Termdock task worktrees and Cargo's disposable internals. */
103
+ export async function pruneWorkspaceCaches(options) {
104
+ const root = path.join(options.stateDirectory, 'task-workspaces'), result = [];
105
+ try {
106
+ if (await fs.realpath(root) !== path.resolve(root) || !(await fs.lstat(root)).isDirectory())
107
+ return [];
108
+ for (const goal of await fs.readdir(root, { withFileTypes: true })) {
109
+ if (!goal.isDirectory() || !/^[a-f0-9]{32}$/.test(goal.name))
110
+ continue;
111
+ for (const task of await fs.readdir(path.join(root, goal.name), { withFileTypes: true })) {
112
+ if (!task.isDirectory())
113
+ continue;
114
+ if (!/^[a-f0-9]{32}-[a-f0-9]{8}$/.test(task.name)) {
115
+ result.push({ path: path.join(root, goal.name, task.name), action: 'retained', reason: 'unrecognized-workspace-name', bytes: 0 });
116
+ continue;
117
+ }
118
+ const workspace = path.join(root, goal.name, task.name), branch = `termdock/task/${task.name}`;
119
+ try {
120
+ if (await fs.realpath(workspace) !== workspace || !(await fs.lstat(path.join(workspace, '.git'))).isFile()
121
+ || await git(workspace, ['rev-parse', '--show-toplevel']) !== workspace || await git(workspace, ['branch', '--show-current']) !== branch)
122
+ continue;
123
+ // Target paths come from tracked manifests, never user-configured output paths.
124
+ const manifests = (await git(workspace, ['ls-files', '-z', '--', 'Cargo.toml', '**/Cargo.toml'])).split('\0').filter(Boolean);
125
+ for (const manifest of manifests) {
126
+ const target = path.join(workspace, path.dirname(manifest), 'target');
127
+ for (const profile of ['debug', 'release']) {
128
+ const directory = path.join(target, profile);
129
+ try {
130
+ const lock = await fs.lstat(path.join(directory, '.cargo-lock'));
131
+ if (process.platform !== 'linux') {
132
+ result.push({ path: directory, action: 'retained', reason: 'cargo-lock-check-unavailable', bytes: 0 });
133
+ continue;
134
+ }
135
+ if (!lock.isFile())
136
+ continue;
137
+ const args = { workspace, branch, target, profile: directory, lockIno: lock.ino, lockDev: lock.dev,
138
+ now: options.now ?? Date.now(), idleMs: options.idleMs ?? 7 * DAY, dryRun: options.dryRun === true };
139
+ const { stdout } = await exec('flock', ['-n', '-E', '75', '--', path.join(directory, '.cargo-lock'), process.execPath,
140
+ '--input-type=module', '-e', CARGO_CACHE_WORKER, JSON.stringify(args)], { timeout: 120_000, maxBuffer: 256 * 1024 });
141
+ result.push(...JSON.parse(stdout));
142
+ }
143
+ catch (error) {
144
+ if (error.code !== 'ENOENT')
145
+ result.push({ path: directory, action: 'retained', reason: 'cargo-locked-or-check-unavailable', bytes: 0 });
146
+ }
147
+ }
148
+ }
149
+ }
150
+ catch {
151
+ result.push({ path: workspace, action: 'retained', reason: 'workspace-identity-unverified', bytes: 0 });
152
+ }
153
+ }
154
+ }
155
+ }
156
+ catch { /* An absent or unreadable state root is never a reason to delete. */ }
157
+ return result;
158
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "termdock",
3
- "version": "1.4.351",
3
+ "version": "1.4.353",
4
4
  "description": "A complete web-based terminal application with modern UI",
5
5
  "type": "module",
6
6
  "main": ".desktop-dist/main.js",
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "packageName": "termdock",
4
- "version": "1.4.351",
4
+ "version": "1.4.353",
5
5
  "runtimeProtocolVersion": 1,
6
6
  "minimumDesktopVersion": "1.4.46",
7
7
  "nodeMajor": 22,
8
8
  "dependencyHash": "sha256-ObG1OGq7e7fMFQmYoPxPp3jRodEusYHulVNa5mT1aW8=",
9
- "serverBundleHash": "sha256-9lfdVPuWoovGTXbZZCfstC1hVwb5x1Zf4yVu6qbbd9U=",
10
- "clientBundleHash": "sha256-8em3ElG96RS1z3DO1XVTJ6daULNrNLIupJyA6j8G6Is=",
9
+ "serverBundleHash": "sha256-BytBn+wZV+5Djv9XYLw86ORzRirpOjdtlg/oM+wPdWs=",
10
+ "clientBundleHash": "sha256-6TybQLjjHJHW8NiF67Zk6drUXSae+vgx81phwPVL67U=",
11
11
  "entrypoint": "dist/server/cli.js",
12
12
  "clientEntrypoint": "dist/client/index.html"
13
13
  }