termdock 1.4.322 → 1.4.325

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 (366) hide show
  1. package/dist/client/assets/App-D8MWr9xp.js +186 -0
  2. package/dist/client/assets/App-D8MWr9xp.js.br +0 -0
  3. package/dist/client/assets/App-D8MWr9xp.js.gz +0 -0
  4. package/dist/client/assets/{ArchitecturePanel-VDM6hrwp.js → ArchitecturePanel-CJXvqmtu.js} +2 -2
  5. package/dist/client/assets/ArchitecturePanel-CJXvqmtu.js.br +0 -0
  6. package/dist/client/assets/ArchitecturePanel-CJXvqmtu.js.gz +0 -0
  7. package/dist/client/assets/{ChangeWalkthroughPanel-B64j3i8o.js → ChangeWalkthroughPanel-ChPZVfRz.js} +1 -1
  8. package/dist/client/assets/ChangeWalkthroughPanel-ChPZVfRz.js.br +0 -0
  9. package/dist/client/assets/ChangeWalkthroughPanel-ChPZVfRz.js.gz +0 -0
  10. package/dist/client/assets/CollaborationMainWorkspace-DkNhqCj4.js +1 -0
  11. package/dist/client/assets/CollaborationMainWorkspace-DkNhqCj4.js.br +0 -0
  12. package/dist/client/assets/CollaborationMainWorkspace-DkNhqCj4.js.gz +0 -0
  13. package/dist/client/assets/CollaborationTaskContent-BA3bVNJo.js +2 -0
  14. package/dist/client/assets/{ComputerControlView-Co-TTYas.js → ComputerControlView-BTntDI6C.js} +2 -2
  15. package/dist/client/assets/ComputerControlView-BTntDI6C.js.br +0 -0
  16. package/dist/client/assets/ComputerControlView-BTntDI6C.js.gz +0 -0
  17. package/dist/client/assets/{DagPlayground-kJczdJ6J.js → DagPlayground-BIL5vjer.js} +1 -1
  18. package/dist/client/assets/DagPlayground-BIL5vjer.js.br +0 -0
  19. package/dist/client/assets/DagPlayground-BIL5vjer.js.gz +0 -0
  20. package/dist/client/assets/{DiffLab-BaaioC-q.js → DiffLab-CX1AwU2v.js} +1 -1
  21. package/dist/client/assets/DiffLab-CX1AwU2v.js.br +0 -0
  22. package/dist/client/assets/DiffLab-CX1AwU2v.js.gz +0 -0
  23. package/dist/client/assets/{DiffReview-Wfck3RIS.js → DiffReview-CLc1hwO7.js} +1 -1
  24. package/dist/client/assets/DiffReview-CLc1hwO7.js.br +0 -0
  25. package/dist/client/assets/DiffReview-CLc1hwO7.js.gz +0 -0
  26. package/dist/client/assets/{DiffReviewLab-Dblr3wgw.js → DiffReviewLab-DE6m1o4p.js} +1 -1
  27. package/dist/client/assets/DiffReviewLab-DE6m1o4p.js.br +0 -0
  28. package/dist/client/assets/DiffReviewLab-DE6m1o4p.js.gz +0 -0
  29. package/dist/client/assets/{DiffViewer-C-utC5Ga.js → DiffViewer-BDwtwbQM.js} +1 -1
  30. package/dist/client/assets/DiffViewer-BDwtwbQM.js.br +0 -0
  31. package/dist/client/assets/DiffViewer-BDwtwbQM.js.gz +0 -0
  32. package/dist/client/assets/{ModelPreview-BBLnHWVQ.js → ModelPreview-DEwATnxi.js} +1 -1
  33. package/dist/client/assets/ModelPreview-DEwATnxi.js.br +0 -0
  34. package/dist/client/assets/ModelPreview-DEwATnxi.js.gz +0 -0
  35. package/dist/client/assets/{RightSidebar-CUHSFkmZ.js → RightSidebar-jOQJePDV.js} +36 -36
  36. package/dist/client/assets/RightSidebar-jOQJePDV.js.br +0 -0
  37. package/dist/client/assets/RightSidebar-jOQJePDV.js.gz +0 -0
  38. package/dist/client/assets/{abnfDiagram-VCTEODGH-DDd99QpA.js → abnfDiagram-VCTEODGH-GBSf8AEr.js} +1 -1
  39. package/dist/client/assets/abnfDiagram-VCTEODGH-GBSf8AEr.js.br +0 -0
  40. package/dist/client/assets/abnfDiagram-VCTEODGH-GBSf8AEr.js.gz +0 -0
  41. package/dist/client/assets/app-VCmiASzh.js +35 -0
  42. package/dist/client/assets/app-VCmiASzh.js.br +0 -0
  43. package/dist/client/assets/app-VCmiASzh.js.gz +0 -0
  44. package/dist/client/assets/{arc-C3dck_E0.js → arc-BecvFgjf.js} +1 -1
  45. package/dist/client/assets/arc-BecvFgjf.js.br +0 -0
  46. package/dist/client/assets/arc-BecvFgjf.js.gz +0 -0
  47. package/dist/client/assets/{architectureDiagram-5GKGNRK7-C3bCQc2w.js → architectureDiagram-5GKGNRK7-Cfk47zEF.js} +1 -1
  48. package/dist/client/assets/architectureDiagram-5GKGNRK7-Cfk47zEF.js.br +0 -0
  49. package/dist/client/assets/architectureDiagram-5GKGNRK7-Cfk47zEF.js.gz +0 -0
  50. package/dist/client/assets/{blockDiagram-I7D4REHJ-znMn6iCQ.js → blockDiagram-I7D4REHJ-BHYgsLvx.js} +1 -1
  51. package/dist/client/assets/blockDiagram-I7D4REHJ-BHYgsLvx.js.br +0 -0
  52. package/dist/client/assets/blockDiagram-I7D4REHJ-BHYgsLvx.js.gz +0 -0
  53. package/dist/client/assets/{c4Diagram-7LVT6UL2-C0sopIsj.js → c4Diagram-7LVT6UL2-ClWWjTyz.js} +1 -1
  54. package/dist/client/assets/c4Diagram-7LVT6UL2-ClWWjTyz.js.br +0 -0
  55. package/dist/client/assets/c4Diagram-7LVT6UL2-ClWWjTyz.js.gz +0 -0
  56. package/dist/client/assets/channel-8F8qxLSK.js +1 -0
  57. package/dist/client/assets/{chunk-2Q5K7J3B-f7USyccJ.js → chunk-2Q5K7J3B-Cat1Dsqx.js} +1 -1
  58. package/dist/client/assets/{chunk-5VM5RSS4-Ck2xirDs.js → chunk-5VM5RSS4-CT0S2-E8.js} +1 -1
  59. package/dist/client/assets/{chunk-F27PBJKO-DaDCIj30.js → chunk-F27PBJKO-7o5_yA1b.js} +1 -1
  60. package/dist/client/assets/chunk-F27PBJKO-7o5_yA1b.js.br +0 -0
  61. package/dist/client/assets/chunk-F27PBJKO-7o5_yA1b.js.gz +0 -0
  62. package/dist/client/assets/{chunk-IMKFNOWR-DEC_On5x.js → chunk-IMKFNOWR-iAZxGMup.js} +1 -1
  63. package/dist/client/assets/chunk-IMKFNOWR-iAZxGMup.js.br +0 -0
  64. package/dist/client/assets/chunk-IMKFNOWR-iAZxGMup.js.gz +0 -0
  65. package/dist/client/assets/{chunk-JWPE2WC7-BrswC3n2.js → chunk-JWPE2WC7-DLvwOWZm.js} +1 -1
  66. package/dist/client/assets/{chunk-POPQ4Y6H-ClMbDV47.js → chunk-POPQ4Y6H-BpiRuG56.js} +1 -1
  67. package/dist/client/assets/{chunk-SVP7TREG-D7_1VwC5.js → chunk-SVP7TREG-DpB7xpqI.js} +1 -1
  68. package/dist/client/assets/chunk-SVP7TREG-DpB7xpqI.js.br +0 -0
  69. package/dist/client/assets/chunk-SVP7TREG-DpB7xpqI.js.gz +0 -0
  70. package/dist/client/assets/{chunk-TICWLB2K-D5jzVTZ8.js → chunk-TICWLB2K-Z_Sti6yX.js} +1 -1
  71. package/dist/client/assets/chunk-TICWLB2K-Z_Sti6yX.js.br +0 -0
  72. package/dist/client/assets/chunk-TICWLB2K-Z_Sti6yX.js.gz +0 -0
  73. package/dist/client/assets/{chunk-XXDRQBXY-DOhaoLcX.js → chunk-XXDRQBXY-DKngx1rf.js} +1 -1
  74. package/dist/client/assets/classDiagram-ZZMXUADV-C0AmKz7U.js +1 -0
  75. package/dist/client/assets/classDiagram-v2-VYDZK3BY-C0AmKz7U.js +1 -0
  76. package/dist/client/assets/{cose-bilkent-JH36ORCC-DOsaKgiX.js → cose-bilkent-JH36ORCC-CDo8eUXo.js} +1 -1
  77. package/dist/client/assets/cose-bilkent-JH36ORCC-CDo8eUXo.js.br +0 -0
  78. package/dist/client/assets/cose-bilkent-JH36ORCC-CDo8eUXo.js.gz +0 -0
  79. package/dist/client/assets/{cynefin-OW5HDTMX-CMcLh_wh.js → cynefin-OW5HDTMX-R6vltrl4.js} +1 -1
  80. package/dist/client/assets/cynefin-OW5HDTMX-R6vltrl4.js.br +0 -0
  81. package/dist/client/assets/{cynefin-OW5HDTMX-CMcLh_wh.js.gz → cynefin-OW5HDTMX-R6vltrl4.js.gz} +0 -0
  82. package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-Dd8bfq9V.js → cynefinDiagram-5FMLGOSQ-BTGMG-zO.js} +1 -1
  83. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-BTGMG-zO.js.br +0 -0
  84. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-BTGMG-zO.js.gz +0 -0
  85. package/dist/client/assets/{dagre-GXQ25YYZ-BlW7fAi0.js → dagre-GXQ25YYZ-D67dNSHU.js} +1 -1
  86. package/dist/client/assets/dagre-GXQ25YYZ-D67dNSHU.js.br +0 -0
  87. package/dist/client/assets/dagre-GXQ25YYZ-D67dNSHU.js.gz +0 -0
  88. package/dist/client/assets/{diagram-S7CK7UJ4-B0-tKahG.js → diagram-S7CK7UJ4-CxZmcHs4.js} +1 -1
  89. package/dist/client/assets/diagram-S7CK7UJ4-CxZmcHs4.js.br +0 -0
  90. package/dist/client/assets/diagram-S7CK7UJ4-CxZmcHs4.js.gz +0 -0
  91. package/dist/client/assets/{diagram-UQ7AKVKN-BQumj4Dw.js → diagram-UQ7AKVKN-BErivsDz.js} +1 -1
  92. package/dist/client/assets/diagram-UQ7AKVKN-BErivsDz.js.br +0 -0
  93. package/dist/client/assets/diagram-UQ7AKVKN-BErivsDz.js.gz +0 -0
  94. package/dist/client/assets/{diagram-VSXAHHWV-Zx_FLmPP.js → diagram-VSXAHHWV-BQWEvK9d.js} +1 -1
  95. package/dist/client/assets/diagram-VSXAHHWV-BQWEvK9d.js.br +0 -0
  96. package/dist/client/assets/diagram-VSXAHHWV-BQWEvK9d.js.gz +0 -0
  97. package/dist/client/assets/{diagram-VX7I27RA-CEZvatNH.js → diagram-VX7I27RA-COR5k4JL.js} +1 -1
  98. package/dist/client/assets/diagram-VX7I27RA-COR5k4JL.js.br +0 -0
  99. package/dist/client/assets/diagram-VX7I27RA-COR5k4JL.js.gz +0 -0
  100. package/dist/client/assets/{diagram-Z3DM3KII-CJ9IEQ8j.js → diagram-Z3DM3KII-Cx6oTlVi.js} +1 -1
  101. package/dist/client/assets/diagram-Z3DM3KII-Cx6oTlVi.js.br +0 -0
  102. package/dist/client/assets/diagram-Z3DM3KII-Cx6oTlVi.js.gz +0 -0
  103. package/dist/client/assets/{ebnfDiagram-PWID7BFC-sQQMv3ea.js → ebnfDiagram-PWID7BFC-dKNZki9k.js} +1 -1
  104. package/dist/client/assets/ebnfDiagram-PWID7BFC-dKNZki9k.js.br +0 -0
  105. package/dist/client/assets/ebnfDiagram-PWID7BFC-dKNZki9k.js.gz +0 -0
  106. package/dist/client/assets/{erDiagram-RLTQ6QDP-D3rMpj7M.js → erDiagram-RLTQ6QDP-DD06d9Gl.js} +1 -1
  107. package/dist/client/assets/erDiagram-RLTQ6QDP-DD06d9Gl.js.br +0 -0
  108. package/dist/client/assets/erDiagram-RLTQ6QDP-DD06d9Gl.js.gz +0 -0
  109. package/dist/client/assets/{flowDiagram-HODETNUW-B6QZiE0-.js → flowDiagram-HODETNUW-DXNAvw1d.js} +1 -1
  110. package/dist/client/assets/flowDiagram-HODETNUW-DXNAvw1d.js.br +0 -0
  111. package/dist/client/assets/flowDiagram-HODETNUW-DXNAvw1d.js.gz +0 -0
  112. package/dist/client/assets/{ganttDiagram-EL5Y4UJY-Bw9bltcu.js → ganttDiagram-EL5Y4UJY-BSMu3Rsd.js} +1 -1
  113. package/dist/client/assets/ganttDiagram-EL5Y4UJY-BSMu3Rsd.js.br +0 -0
  114. package/dist/client/assets/ganttDiagram-EL5Y4UJY-BSMu3Rsd.js.gz +0 -0
  115. package/dist/client/assets/{gestureArbiter-Cczz34oI.js → gestureArbiter-D1TteC76.js} +1 -1
  116. package/dist/client/assets/gestureArbiter-D1TteC76.js.br +0 -0
  117. package/dist/client/assets/gestureArbiter-D1TteC76.js.gz +0 -0
  118. package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-mdnkxjeD.js → gitGraphDiagram-WWUBYQGX-DNDKI803.js} +1 -1
  119. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DNDKI803.js.br +0 -0
  120. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DNDKI803.js.gz +0 -0
  121. package/dist/client/assets/index-Ctz-IDjR.css +1 -0
  122. package/dist/client/assets/index-Ctz-IDjR.css.br +0 -0
  123. package/dist/client/assets/{index-B4bEMUyn.css.gz → index-Ctz-IDjR.css.gz} +0 -0
  124. package/dist/client/assets/{infoDiagram-27XIBGKW-DyrPP3Yf.js → infoDiagram-27XIBGKW-BRmB1D5B.js} +1 -1
  125. package/dist/client/assets/{ishikawaDiagram-5VMMS53U-CEPH_ePM.js → ishikawaDiagram-5VMMS53U-DXU4nnZ6.js} +1 -1
  126. package/dist/client/assets/ishikawaDiagram-5VMMS53U-DXU4nnZ6.js.br +0 -0
  127. package/dist/client/assets/ishikawaDiagram-5VMMS53U-DXU4nnZ6.js.gz +0 -0
  128. package/dist/client/assets/{journeyDiagram-3NMN7TZE-CQ0PjBy7.js → journeyDiagram-3NMN7TZE-DFx7AfiP.js} +1 -1
  129. package/dist/client/assets/journeyDiagram-3NMN7TZE-DFx7AfiP.js.br +0 -0
  130. package/dist/client/assets/journeyDiagram-3NMN7TZE-DFx7AfiP.js.gz +0 -0
  131. package/dist/client/assets/{kanban-definition-UXKFOSKX-BpQUXA60.js → kanban-definition-UXKFOSKX-B1ikfXJe.js} +1 -1
  132. package/dist/client/assets/kanban-definition-UXKFOSKX-B1ikfXJe.js.br +0 -0
  133. package/dist/client/assets/kanban-definition-UXKFOSKX-B1ikfXJe.js.gz +0 -0
  134. package/dist/client/assets/{layout-BdptC7rq.js → layout-DkyvZr1Y.js} +1 -1
  135. package/dist/client/assets/layout-DkyvZr1Y.js.br +0 -0
  136. package/dist/client/assets/layout-DkyvZr1Y.js.gz +0 -0
  137. package/dist/client/assets/{linear-C2cSRCxu.js → linear-CECAbRuX.js} +1 -1
  138. package/dist/client/assets/linear-CECAbRuX.js.br +0 -0
  139. package/dist/client/assets/linear-CECAbRuX.js.gz +0 -0
  140. package/dist/client/assets/{mermaid.core-ClVMFyAU.js → mermaid.core-CYY7Wb75.js} +5 -5
  141. package/dist/client/assets/mermaid.core-CYY7Wb75.js.br +0 -0
  142. package/dist/client/assets/mermaid.core-CYY7Wb75.js.gz +0 -0
  143. package/dist/client/assets/{mindmap-definition-YA3MSWOX-D0AFCmsY.js → mindmap-definition-YA3MSWOX-CTs-Y3Lq.js} +1 -1
  144. package/dist/client/assets/mindmap-definition-YA3MSWOX-CTs-Y3Lq.js.br +0 -0
  145. package/dist/client/assets/mindmap-definition-YA3MSWOX-CTs-Y3Lq.js.gz +0 -0
  146. package/dist/client/assets/{passwordBootstrap-R2qlU2Pq.js → passwordBootstrap-CPNGDwv6.js} +1 -1
  147. package/dist/client/assets/passwordBootstrap-CPNGDwv6.js.br +0 -0
  148. package/dist/client/assets/passwordBootstrap-CPNGDwv6.js.gz +0 -0
  149. package/dist/client/assets/{pegDiagram-XKGWAZYB-BGAh0bwg.js → pegDiagram-XKGWAZYB-Y1oZrwtK.js} +1 -1
  150. package/dist/client/assets/pegDiagram-XKGWAZYB-Y1oZrwtK.js.br +0 -0
  151. package/dist/client/assets/pegDiagram-XKGWAZYB-Y1oZrwtK.js.gz +0 -0
  152. package/dist/client/assets/{pieDiagram-E7YTZNPT-CDOZUF44.js → pieDiagram-E7YTZNPT-DYSm5OxQ.js} +1 -1
  153. package/dist/client/assets/pieDiagram-E7YTZNPT-DYSm5OxQ.js.br +0 -0
  154. package/dist/client/assets/pieDiagram-E7YTZNPT-DYSm5OxQ.js.gz +0 -0
  155. package/dist/client/assets/{quadrantDiagram-AXDQQJYC-D_Qn6NTU.js → quadrantDiagram-AXDQQJYC-DpibIBz0.js} +1 -1
  156. package/dist/client/assets/quadrantDiagram-AXDQQJYC-DpibIBz0.js.br +0 -0
  157. package/dist/client/assets/quadrantDiagram-AXDQQJYC-DpibIBz0.js.gz +0 -0
  158. package/dist/client/assets/{railroadDiagram-O6MQD6OU-qUVGWhJN.js → railroadDiagram-O6MQD6OU-b7jp7C1K.js} +1 -1
  159. package/dist/client/assets/railroadDiagram-O6MQD6OU-b7jp7C1K.js.br +0 -0
  160. package/dist/client/assets/railroadDiagram-O6MQD6OU-b7jp7C1K.js.gz +0 -0
  161. package/dist/client/assets/{rdpSession-hgCM4i-j.js → rdpSession-DU_OJfX5.js} +1 -1
  162. package/dist/client/assets/rdpSession-DU_OJfX5.js.br +0 -0
  163. package/dist/client/assets/rdpSession-DU_OJfX5.js.gz +0 -0
  164. package/dist/client/assets/{referenceLongPress-BEMsP11a.js → referenceLongPress-BPQ_i68g.js} +1 -1
  165. package/dist/client/assets/referenceLongPress-BPQ_i68g.js.br +0 -0
  166. package/dist/client/assets/referenceLongPress-BPQ_i68g.js.gz +0 -0
  167. package/dist/client/assets/{requirementDiagram-BXWQKSXE-BBQMQuVZ.js → requirementDiagram-BXWQKSXE-BMinO1mf.js} +1 -1
  168. package/dist/client/assets/requirementDiagram-BXWQKSXE-BMinO1mf.js.br +0 -0
  169. package/dist/client/assets/requirementDiagram-BXWQKSXE-BMinO1mf.js.gz +0 -0
  170. package/dist/client/assets/{sankeyDiagram-P5KCCOFB-CeEExsqW.js → sankeyDiagram-P5KCCOFB-CmC977VA.js} +1 -1
  171. package/dist/client/assets/sankeyDiagram-P5KCCOFB-CmC977VA.js.br +0 -0
  172. package/dist/client/assets/sankeyDiagram-P5KCCOFB-CmC977VA.js.gz +0 -0
  173. package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-7ZPO-X0a.js → sequenceDiagram-WJ2MYXX4-D6eGbgK8.js} +1 -1
  174. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-D6eGbgK8.js.br +0 -0
  175. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-D6eGbgK8.js.gz +0 -0
  176. package/dist/client/assets/{sizeCapture-INFHLROL-MBjz7Snm.js → sizeCapture-INFHLROL-CnRvyBd8.js} +1 -1
  177. package/dist/client/assets/sizeCapture-INFHLROL-CnRvyBd8.js.br +0 -0
  178. package/dist/client/assets/sizeCapture-INFHLROL-CnRvyBd8.js.gz +0 -0
  179. package/dist/client/assets/{sparkles-C9ShmGPf.js → sparkles-DzadqrlX.js} +1 -1
  180. package/dist/client/assets/{stateDiagram-D77RDMKH-DtLp89uP.js → stateDiagram-D77RDMKH-DRSalH10.js} +1 -1
  181. package/dist/client/assets/stateDiagram-D77RDMKH-DRSalH10.js.br +0 -0
  182. package/dist/client/assets/stateDiagram-D77RDMKH-DRSalH10.js.gz +0 -0
  183. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-DKe8v_ic.js +1 -0
  184. package/dist/client/assets/{swimlanes-42K2YHIH-Bc02S1q-.js → swimlanes-42K2YHIH-u-NnDSzq.js} +1 -1
  185. package/dist/client/assets/swimlanes-42K2YHIH-u-NnDSzq.js.br +0 -0
  186. package/dist/client/assets/swimlanes-42K2YHIH-u-NnDSzq.js.gz +0 -0
  187. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-ei5b8ZYx.js +8 -0
  188. package/dist/client/assets/{timeline-definition-24CTP7MA-BLLwbOm5.js → timeline-definition-24CTP7MA-DkLijg_J.js} +1 -1
  189. package/dist/client/assets/timeline-definition-24CTP7MA-DkLijg_J.js.br +0 -0
  190. package/dist/client/assets/timeline-definition-24CTP7MA-DkLijg_J.js.gz +0 -0
  191. package/dist/client/assets/{triangle-alert-i_L8ws6U.js → triangle-alert-D_6xTTiX.js} +1 -1
  192. package/dist/client/assets/{vennDiagram-4TSXK5OY-8FcrAdbk.js → vennDiagram-4TSXK5OY-AWGJtiv3.js} +1 -1
  193. package/dist/client/assets/{vennDiagram-4TSXK5OY-8FcrAdbk.js.br → vennDiagram-4TSXK5OY-AWGJtiv3.js.br} +0 -0
  194. package/dist/client/assets/vennDiagram-4TSXK5OY-AWGJtiv3.js.gz +0 -0
  195. package/dist/client/assets/{videoCompression-RIaDabW4.js → videoCompression-D3y7Bq8J.js} +1 -1
  196. package/dist/client/assets/videoCompression-D3y7Bq8J.js.br +0 -0
  197. package/dist/client/assets/videoCompression-D3y7Bq8J.js.gz +0 -0
  198. package/dist/client/assets/{wardleyDiagram-VM6X3IG4-paL2wRrJ.js → wardleyDiagram-VM6X3IG4-DI0aZr_y.js} +1 -1
  199. package/dist/client/assets/wardleyDiagram-VM6X3IG4-DI0aZr_y.js.br +0 -0
  200. package/dist/client/assets/wardleyDiagram-VM6X3IG4-DI0aZr_y.js.gz +0 -0
  201. package/dist/client/assets/{xychartDiagram-S5SC5T6Z-BM5qJ4E7.js → xychartDiagram-S5SC5T6Z-CCoIN3uU.js} +1 -1
  202. package/dist/client/assets/xychartDiagram-S5SC5T6Z-CCoIN3uU.js.br +0 -0
  203. package/dist/client/assets/xychartDiagram-S5SC5T6Z-CCoIN3uU.js.gz +0 -0
  204. package/dist/client/index.html +2 -2
  205. package/dist/client/index.html.br +0 -0
  206. package/dist/client/index.html.gz +0 -0
  207. package/dist/client/sw-encrypted-background.js +1 -1
  208. package/dist/client/sw-encrypted-background.js.br +0 -0
  209. package/dist/client/sw-encrypted-background.js.gz +0 -0
  210. package/dist/client/sw.js +1 -1
  211. package/dist/client/sw.js.br +0 -0
  212. package/dist/client/sw.js.gz +0 -0
  213. package/dist/server/agent/collaborationGroupRoutes.js +15 -0
  214. package/dist/server/agent/collaborationStore.js +63 -2
  215. package/dist/server/agent/collaborationTaskRoutes.js +5 -1
  216. package/dist/server/agent/integrationCli.js +38 -20
  217. package/dist/server/agent/integrationServer.js +145 -3
  218. package/dist/server/federation/packets.js +179 -28
  219. package/dist/server/federation/requestContext.js +6 -1
  220. package/dist/server/federation/runtime.js +19 -8
  221. package/dist/server/routes/terminal.js +285 -85
  222. package/dist/server/utils/autoUpdate.js +55 -8
  223. package/dist/server/utils/hostResources.js +128 -0
  224. package/dist/server/utils/npmUpdate.js +84 -8
  225. package/dist/server/utils/terminalPasteBuffer.js +66 -0
  226. package/dist/server/utils/tmuxClientCapabilities.js +4 -0
  227. package/dist/server/utils/tmuxCopySelection.js +94 -0
  228. package/dist/server/utils/tmuxEmptyServerProbe.js +15 -0
  229. package/dist/server/utils/tmuxRecoveryOperations.js +348 -0
  230. package/docs/integrations.md +36 -0
  231. package/package.json +5 -2
  232. package/runtime-manifest.json +3 -3
  233. package/.desktop-dist/main.js +0 -1989
  234. package/dist/client/assets/App-DEKo4SNL.js +0 -186
  235. package/dist/client/assets/App-DEKo4SNL.js.br +0 -0
  236. package/dist/client/assets/App-DEKo4SNL.js.gz +0 -0
  237. package/dist/client/assets/ArchitecturePanel-VDM6hrwp.js.br +0 -0
  238. package/dist/client/assets/ArchitecturePanel-VDM6hrwp.js.gz +0 -0
  239. package/dist/client/assets/ChangeWalkthroughPanel-B64j3i8o.js.br +0 -0
  240. package/dist/client/assets/ChangeWalkthroughPanel-B64j3i8o.js.gz +0 -0
  241. package/dist/client/assets/CollaborationMainWorkspace-DG8TQNqo.js +0 -1
  242. package/dist/client/assets/CollaborationMainWorkspace-DG8TQNqo.js.br +0 -0
  243. package/dist/client/assets/CollaborationMainWorkspace-DG8TQNqo.js.gz +0 -0
  244. package/dist/client/assets/CollaborationTaskContent-msQsgVaI.js +0 -2
  245. package/dist/client/assets/ComputerControlView-Co-TTYas.js.br +0 -0
  246. package/dist/client/assets/ComputerControlView-Co-TTYas.js.gz +0 -0
  247. package/dist/client/assets/DagPlayground-kJczdJ6J.js.br +0 -0
  248. package/dist/client/assets/DagPlayground-kJczdJ6J.js.gz +0 -0
  249. package/dist/client/assets/DiffLab-BaaioC-q.js.br +0 -0
  250. package/dist/client/assets/DiffLab-BaaioC-q.js.gz +0 -0
  251. package/dist/client/assets/DiffReview-Wfck3RIS.js.br +0 -0
  252. package/dist/client/assets/DiffReview-Wfck3RIS.js.gz +0 -0
  253. package/dist/client/assets/DiffReviewLab-Dblr3wgw.js.br +0 -0
  254. package/dist/client/assets/DiffReviewLab-Dblr3wgw.js.gz +0 -0
  255. package/dist/client/assets/DiffViewer-C-utC5Ga.js.br +0 -0
  256. package/dist/client/assets/DiffViewer-C-utC5Ga.js.gz +0 -0
  257. package/dist/client/assets/ModelPreview-BBLnHWVQ.js.br +0 -0
  258. package/dist/client/assets/ModelPreview-BBLnHWVQ.js.gz +0 -0
  259. package/dist/client/assets/RightSidebar-CUHSFkmZ.js.br +0 -0
  260. package/dist/client/assets/RightSidebar-CUHSFkmZ.js.gz +0 -0
  261. package/dist/client/assets/abnfDiagram-VCTEODGH-DDd99QpA.js.br +0 -0
  262. package/dist/client/assets/abnfDiagram-VCTEODGH-DDd99QpA.js.gz +0 -0
  263. package/dist/client/assets/app-CfqF7_nh.js +0 -35
  264. package/dist/client/assets/app-CfqF7_nh.js.br +0 -0
  265. package/dist/client/assets/app-CfqF7_nh.js.gz +0 -0
  266. package/dist/client/assets/arc-C3dck_E0.js.br +0 -0
  267. package/dist/client/assets/arc-C3dck_E0.js.gz +0 -0
  268. package/dist/client/assets/architectureDiagram-5GKGNRK7-C3bCQc2w.js.br +0 -0
  269. package/dist/client/assets/architectureDiagram-5GKGNRK7-C3bCQc2w.js.gz +0 -0
  270. package/dist/client/assets/blockDiagram-I7D4REHJ-znMn6iCQ.js.br +0 -0
  271. package/dist/client/assets/blockDiagram-I7D4REHJ-znMn6iCQ.js.gz +0 -0
  272. package/dist/client/assets/c4Diagram-7LVT6UL2-C0sopIsj.js.br +0 -0
  273. package/dist/client/assets/c4Diagram-7LVT6UL2-C0sopIsj.js.gz +0 -0
  274. package/dist/client/assets/channel-CMC8t83j.js +0 -1
  275. package/dist/client/assets/chunk-F27PBJKO-DaDCIj30.js.br +0 -0
  276. package/dist/client/assets/chunk-F27PBJKO-DaDCIj30.js.gz +0 -0
  277. package/dist/client/assets/chunk-IMKFNOWR-DEC_On5x.js.br +0 -0
  278. package/dist/client/assets/chunk-IMKFNOWR-DEC_On5x.js.gz +0 -0
  279. package/dist/client/assets/chunk-SVP7TREG-D7_1VwC5.js.br +0 -0
  280. package/dist/client/assets/chunk-SVP7TREG-D7_1VwC5.js.gz +0 -0
  281. package/dist/client/assets/chunk-TICWLB2K-D5jzVTZ8.js.br +0 -0
  282. package/dist/client/assets/chunk-TICWLB2K-D5jzVTZ8.js.gz +0 -0
  283. package/dist/client/assets/classDiagram-ZZMXUADV-ElMHzA-E.js +0 -1
  284. package/dist/client/assets/classDiagram-v2-VYDZK3BY-ElMHzA-E.js +0 -1
  285. package/dist/client/assets/cose-bilkent-JH36ORCC-DOsaKgiX.js.br +0 -0
  286. package/dist/client/assets/cose-bilkent-JH36ORCC-DOsaKgiX.js.gz +0 -0
  287. package/dist/client/assets/cynefin-OW5HDTMX-CMcLh_wh.js.br +0 -0
  288. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-Dd8bfq9V.js.br +0 -0
  289. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-Dd8bfq9V.js.gz +0 -0
  290. package/dist/client/assets/dagre-GXQ25YYZ-BlW7fAi0.js.br +0 -0
  291. package/dist/client/assets/dagre-GXQ25YYZ-BlW7fAi0.js.gz +0 -0
  292. package/dist/client/assets/diagram-S7CK7UJ4-B0-tKahG.js.br +0 -0
  293. package/dist/client/assets/diagram-S7CK7UJ4-B0-tKahG.js.gz +0 -0
  294. package/dist/client/assets/diagram-UQ7AKVKN-BQumj4Dw.js.br +0 -0
  295. package/dist/client/assets/diagram-UQ7AKVKN-BQumj4Dw.js.gz +0 -0
  296. package/dist/client/assets/diagram-VSXAHHWV-Zx_FLmPP.js.br +0 -0
  297. package/dist/client/assets/diagram-VSXAHHWV-Zx_FLmPP.js.gz +0 -0
  298. package/dist/client/assets/diagram-VX7I27RA-CEZvatNH.js.br +0 -0
  299. package/dist/client/assets/diagram-VX7I27RA-CEZvatNH.js.gz +0 -0
  300. package/dist/client/assets/diagram-Z3DM3KII-CJ9IEQ8j.js.br +0 -0
  301. package/dist/client/assets/diagram-Z3DM3KII-CJ9IEQ8j.js.gz +0 -0
  302. package/dist/client/assets/ebnfDiagram-PWID7BFC-sQQMv3ea.js.br +0 -0
  303. package/dist/client/assets/ebnfDiagram-PWID7BFC-sQQMv3ea.js.gz +0 -0
  304. package/dist/client/assets/erDiagram-RLTQ6QDP-D3rMpj7M.js.br +0 -0
  305. package/dist/client/assets/erDiagram-RLTQ6QDP-D3rMpj7M.js.gz +0 -0
  306. package/dist/client/assets/flowDiagram-HODETNUW-B6QZiE0-.js.br +0 -0
  307. package/dist/client/assets/flowDiagram-HODETNUW-B6QZiE0-.js.gz +0 -0
  308. package/dist/client/assets/ganttDiagram-EL5Y4UJY-Bw9bltcu.js.br +0 -0
  309. package/dist/client/assets/ganttDiagram-EL5Y4UJY-Bw9bltcu.js.gz +0 -0
  310. package/dist/client/assets/gestureArbiter-Cczz34oI.js.br +0 -0
  311. package/dist/client/assets/gestureArbiter-Cczz34oI.js.gz +0 -0
  312. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-mdnkxjeD.js.br +0 -0
  313. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-mdnkxjeD.js.gz +0 -0
  314. package/dist/client/assets/index-B4bEMUyn.css +0 -1
  315. package/dist/client/assets/index-B4bEMUyn.css.br +0 -0
  316. package/dist/client/assets/ishikawaDiagram-5VMMS53U-CEPH_ePM.js.br +0 -0
  317. package/dist/client/assets/ishikawaDiagram-5VMMS53U-CEPH_ePM.js.gz +0 -0
  318. package/dist/client/assets/journeyDiagram-3NMN7TZE-CQ0PjBy7.js.br +0 -0
  319. package/dist/client/assets/journeyDiagram-3NMN7TZE-CQ0PjBy7.js.gz +0 -0
  320. package/dist/client/assets/kanban-definition-UXKFOSKX-BpQUXA60.js.br +0 -0
  321. package/dist/client/assets/kanban-definition-UXKFOSKX-BpQUXA60.js.gz +0 -0
  322. package/dist/client/assets/layout-BdptC7rq.js.br +0 -0
  323. package/dist/client/assets/layout-BdptC7rq.js.gz +0 -0
  324. package/dist/client/assets/linear-C2cSRCxu.js.br +0 -0
  325. package/dist/client/assets/linear-C2cSRCxu.js.gz +0 -0
  326. package/dist/client/assets/mermaid.core-ClVMFyAU.js.br +0 -0
  327. package/dist/client/assets/mermaid.core-ClVMFyAU.js.gz +0 -0
  328. package/dist/client/assets/mindmap-definition-YA3MSWOX-D0AFCmsY.js.br +0 -0
  329. package/dist/client/assets/mindmap-definition-YA3MSWOX-D0AFCmsY.js.gz +0 -0
  330. package/dist/client/assets/passwordBootstrap-R2qlU2Pq.js.br +0 -0
  331. package/dist/client/assets/passwordBootstrap-R2qlU2Pq.js.gz +0 -0
  332. package/dist/client/assets/pegDiagram-XKGWAZYB-BGAh0bwg.js.br +0 -0
  333. package/dist/client/assets/pegDiagram-XKGWAZYB-BGAh0bwg.js.gz +0 -0
  334. package/dist/client/assets/pieDiagram-E7YTZNPT-CDOZUF44.js.br +0 -0
  335. package/dist/client/assets/pieDiagram-E7YTZNPT-CDOZUF44.js.gz +0 -0
  336. package/dist/client/assets/quadrantDiagram-AXDQQJYC-D_Qn6NTU.js.br +0 -0
  337. package/dist/client/assets/quadrantDiagram-AXDQQJYC-D_Qn6NTU.js.gz +0 -0
  338. package/dist/client/assets/railroadDiagram-O6MQD6OU-qUVGWhJN.js.br +0 -0
  339. package/dist/client/assets/railroadDiagram-O6MQD6OU-qUVGWhJN.js.gz +0 -0
  340. package/dist/client/assets/rdpSession-hgCM4i-j.js.br +0 -0
  341. package/dist/client/assets/rdpSession-hgCM4i-j.js.gz +0 -0
  342. package/dist/client/assets/referenceLongPress-BEMsP11a.js.br +0 -0
  343. package/dist/client/assets/referenceLongPress-BEMsP11a.js.gz +0 -0
  344. package/dist/client/assets/requirementDiagram-BXWQKSXE-BBQMQuVZ.js.br +0 -0
  345. package/dist/client/assets/requirementDiagram-BXWQKSXE-BBQMQuVZ.js.gz +0 -0
  346. package/dist/client/assets/sankeyDiagram-P5KCCOFB-CeEExsqW.js.br +0 -0
  347. package/dist/client/assets/sankeyDiagram-P5KCCOFB-CeEExsqW.js.gz +0 -0
  348. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-7ZPO-X0a.js.br +0 -0
  349. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-7ZPO-X0a.js.gz +0 -0
  350. package/dist/client/assets/sizeCapture-INFHLROL-MBjz7Snm.js.br +0 -0
  351. package/dist/client/assets/sizeCapture-INFHLROL-MBjz7Snm.js.gz +0 -0
  352. package/dist/client/assets/stateDiagram-D77RDMKH-DtLp89uP.js.br +0 -0
  353. package/dist/client/assets/stateDiagram-D77RDMKH-DtLp89uP.js.gz +0 -0
  354. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-CIQb4Dp7.js +0 -1
  355. package/dist/client/assets/swimlanes-42K2YHIH-Bc02S1q-.js.br +0 -0
  356. package/dist/client/assets/swimlanes-42K2YHIH-Bc02S1q-.js.gz +0 -0
  357. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-RiKL7eXI.js +0 -8
  358. package/dist/client/assets/timeline-definition-24CTP7MA-BLLwbOm5.js.br +0 -0
  359. package/dist/client/assets/timeline-definition-24CTP7MA-BLLwbOm5.js.gz +0 -0
  360. package/dist/client/assets/vennDiagram-4TSXK5OY-8FcrAdbk.js.gz +0 -0
  361. package/dist/client/assets/videoCompression-RIaDabW4.js.br +0 -0
  362. package/dist/client/assets/videoCompression-RIaDabW4.js.gz +0 -0
  363. package/dist/client/assets/wardleyDiagram-VM6X3IG4-paL2wRrJ.js.br +0 -0
  364. package/dist/client/assets/wardleyDiagram-VM6X3IG4-paL2wRrJ.js.gz +0 -0
  365. package/dist/client/assets/xychartDiagram-S5SC5T6Z-BM5qJ4E7.js.br +0 -0
  366. package/dist/client/assets/xychartDiagram-S5SC5T6Z-BM5qJ4E7.js.gz +0 -0
@@ -0,0 +1,348 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { randomUUID } from 'node:crypto';
4
+ export function summarizeRecoveryOperation(operation) {
5
+ const counts = operation.items.reduce((total, item) => {
6
+ total.total += 1;
7
+ total[item.state] += 1;
8
+ return total;
9
+ }, { total: 0, queued: 0, resource_wait: 0, running: 0, succeeded: 0, failed: 0 });
10
+ return { ...structuredClone(operation), ...counts };
11
+ }
12
+ export class TmuxRecoveryOperationError extends Error {
13
+ code;
14
+ operationId;
15
+ constructor(code, message, operationId) {
16
+ super(message);
17
+ this.code = code;
18
+ this.operationId = operationId;
19
+ this.name = 'TmuxRecoveryOperationError';
20
+ }
21
+ }
22
+ function requestHash(input) {
23
+ return JSON.stringify(input);
24
+ }
25
+ function terminalState(state) {
26
+ return state === 'succeeded' || state === 'partial_failure';
27
+ }
28
+ /** Durable, bounded-concurrency queue for explicit tmux recovery operations. */
29
+ export class TmuxRecoveryOperationStore {
30
+ filePath;
31
+ concurrencyLimit;
32
+ onError;
33
+ state = { version: 1, operations: [] };
34
+ writeChain = Promise.resolve();
35
+ active = 0;
36
+ pumping = false;
37
+ pumpRequested = false;
38
+ runner;
39
+ admission;
40
+ listeners = new Set();
41
+ loaded = false;
42
+ constructor(filePath, concurrencyLimit, onError = () => { }) {
43
+ this.filePath = filePath;
44
+ this.concurrencyLimit = concurrencyLimit;
45
+ this.onError = onError;
46
+ if (!Number.isInteger(concurrencyLimit) || concurrencyLimit < 1 || concurrencyLimit > 16) {
47
+ throw new Error('tmux recovery concurrency must be between 1 and 16');
48
+ }
49
+ }
50
+ subscribe(listener) {
51
+ this.listeners.add(listener);
52
+ return () => this.listeners.delete(listener);
53
+ }
54
+ setRunner(runner) {
55
+ this.runner = runner;
56
+ }
57
+ setAdmission(admission) {
58
+ this.admission = admission;
59
+ }
60
+ async load() {
61
+ if (this.loaded)
62
+ return;
63
+ this.loaded = true;
64
+ try {
65
+ const parsed = JSON.parse(await fs.readFile(this.filePath, 'utf8'));
66
+ if (parsed.version !== 1 || !Array.isArray(parsed.operations))
67
+ throw new Error('Invalid tmux recovery operation state');
68
+ this.state = parsed;
69
+ }
70
+ catch (error) {
71
+ if (error.code !== 'ENOENT')
72
+ throw error;
73
+ }
74
+ const now = Date.now();
75
+ let recovered = false;
76
+ for (const operation of this.state.operations) {
77
+ for (const item of operation.items) {
78
+ if (item.state === 'running') {
79
+ // A killed worker may have submitted the native resume before it died.
80
+ // The runner always performs an exact-owner reconciliation before it launches.
81
+ item.state = 'queued';
82
+ item.phase = 'restart_reconciliation';
83
+ item.errorCode = 'RECOVERY_WORKER_RESTARTED';
84
+ item.error = 'Service restarted during recovery; exact runtime ownership will be reconciled before retry.';
85
+ recovered = true;
86
+ }
87
+ }
88
+ if (!terminalState(operation.state) && !operation.paused)
89
+ operation.state = 'queued';
90
+ operation.updatedAt = recovered ? now : operation.updatedAt;
91
+ }
92
+ if (recovered)
93
+ await this.persist();
94
+ }
95
+ async create(input) {
96
+ if (!this.loaded)
97
+ await this.load();
98
+ if (!input.idempotencyKey || input.idempotencyKey.length > 200) {
99
+ throw new TmuxRecoveryOperationError('INVALID_IDEMPOTENCY_KEY', 'A non-empty idempotency key of at most 200 characters is required.');
100
+ }
101
+ const sessionIds = [...new Set(input.sessionIds)].sort();
102
+ if (sessionIds.length === 0)
103
+ throw new TmuxRecoveryOperationError('RECOVERY_SCOPE_EMPTY', 'The selected recovery scope contains no recoverable sessions.');
104
+ const concurrency = input.concurrency ?? this.concurrencyLimit;
105
+ if (!Number.isInteger(concurrency) || concurrency < 1 || concurrency > this.concurrencyLimit) {
106
+ throw new TmuxRecoveryOperationError('INVALID_RECOVERY_CONCURRENCY', `Concurrency must be between 1 and ${this.concurrencyLimit}.`);
107
+ }
108
+ const scope = input.scope.kind === 'sessions'
109
+ ? { ...input.scope, sessionIds: [...new Set(input.scope.sessionIds ?? [])].sort() }
110
+ : structuredClone(input.scope);
111
+ const fingerprint = requestHash({ incidentId: input.incidentId, sessionIds, scope, concurrency });
112
+ const existingKey = this.state.operations.find(operation => operation.idempotencyKey === input.idempotencyKey);
113
+ if (existingKey) {
114
+ if (existingKey.requestHash !== fingerprint)
115
+ throw new TmuxRecoveryOperationError('IDEMPOTENCY_CONFLICT', 'The idempotency key was already used for a different recovery request.');
116
+ return structuredClone(existingKey);
117
+ }
118
+ if (this.state.operations.length >= 2000)
119
+ throw new TmuxRecoveryOperationError('RECOVERY_OPERATION_LIMIT', 'Recovery operation history is full; archive diagnostics before creating another operation.');
120
+ const inProgress = this.state.operations.find(operation => !terminalState(operation.state)
121
+ && operation.items.some(item => sessionIds.includes(item.sessionId) && (item.state === 'queued' || item.state === 'resource_wait' || item.state === 'running')));
122
+ if (inProgress)
123
+ throw new TmuxRecoveryOperationError('RECOVERY_SESSION_IN_PROGRESS', 'At least one selected session is already in a recovery operation.', inProgress.id);
124
+ const now = Date.now();
125
+ const operation = {
126
+ id: randomUUID(), incidentId: input.incidentId, idempotencyKey: input.idempotencyKey,
127
+ requestHash: fingerprint, scope, state: 'queued', paused: false,
128
+ concurrency, createdAt: now, updatedAt: now,
129
+ items: sessionIds.map(sessionId => ({ sessionId, state: 'queued', attempt: 0, phase: 'queued', startedAt: null, completedAt: null, estimatedRssBytes: 512 * 1024 ** 2 })),
130
+ };
131
+ this.state.operations.push(operation);
132
+ try {
133
+ await this.persist();
134
+ }
135
+ catch (error) {
136
+ this.state.operations = this.state.operations.filter(candidate => candidate.id !== operation.id);
137
+ throw error;
138
+ }
139
+ this.emit();
140
+ void this.pump();
141
+ return structuredClone(operation);
142
+ }
143
+ get(id) {
144
+ const operation = this.state.operations.find(candidate => candidate.id === id);
145
+ return operation ? summarizeRecoveryOperation(operation) : null;
146
+ }
147
+ latest() {
148
+ const operation = this.state.operations.at(-1);
149
+ return operation ? summarizeRecoveryOperation(operation) : null;
150
+ }
151
+ all() {
152
+ return this.state.operations.map(summarizeRecoveryOperation);
153
+ }
154
+ async pause(id) {
155
+ const operation = this.state.operations.find(candidate => candidate.id === id);
156
+ if (!operation)
157
+ return null;
158
+ if (!terminalState(operation.state)) {
159
+ operation.paused = true;
160
+ operation.state = 'paused';
161
+ operation.updatedAt = Date.now();
162
+ await this.persist();
163
+ this.emit();
164
+ }
165
+ return this.get(id);
166
+ }
167
+ async resume(id) {
168
+ const operation = this.state.operations.find(candidate => candidate.id === id);
169
+ if (!operation)
170
+ return null;
171
+ if (!terminalState(operation.state)) {
172
+ operation.paused = false;
173
+ operation.state = 'queued';
174
+ operation.updatedAt = Date.now();
175
+ await this.persist();
176
+ this.emit();
177
+ void this.pump();
178
+ }
179
+ return this.get(id);
180
+ }
181
+ stats() {
182
+ const operations = this.state.operations;
183
+ const items = operations.flatMap(operation => operation.items);
184
+ const lastCompleted = [...items].filter(item => item.completedAt !== null).sort((a, b) => (b.completedAt ?? 0) - (a.completedAt ?? 0))[0];
185
+ return {
186
+ queued: items.filter(item => item.state === 'queued').length,
187
+ resource_wait: items.filter(item => item.state === 'resource_wait').length,
188
+ running: items.filter(item => item.state === 'running').length,
189
+ activeLaunches: this.active,
190
+ lastCompletedAt: lastCompleted?.completedAt ?? null,
191
+ lastCompletedSessionId: lastCompleted?.sessionId ?? null,
192
+ };
193
+ }
194
+ async resumePending() {
195
+ if (!this.loaded)
196
+ await this.load();
197
+ void this.pump();
198
+ }
199
+ notifyResourcesChanged() {
200
+ if (this.pumping) {
201
+ this.pumpRequested = true;
202
+ return;
203
+ }
204
+ void this.pump();
205
+ }
206
+ async flush() { await this.writeChain; }
207
+ async pump() {
208
+ if (this.pumping || !this.runner || !this.loaded)
209
+ return;
210
+ this.pumping = true;
211
+ try {
212
+ const deferred = new Set();
213
+ while (this.active < this.concurrencyLimit) {
214
+ const candidate = this.state.operations.find(operation => !operation.paused && !terminalState(operation.state)
215
+ && operation.items.filter(item => item.state === 'running').length < operation.concurrency
216
+ && operation.items.some(item => (item.state === 'queued' || item.state === 'resource_wait') && !deferred.has(`${operation.id}:${item.sessionId}`)));
217
+ const item = candidate?.items.find(entry => (entry.state === 'queued' || entry.state === 'resource_wait') && !deferred.has(`${candidate.id}:${entry.sessionId}`));
218
+ if (!candidate || !item)
219
+ break;
220
+ if (this.admission) {
221
+ let admission;
222
+ try {
223
+ admission = await this.admission(candidate.id, item.sessionId);
224
+ }
225
+ catch (error) {
226
+ admission = { admitted: false, reason: error instanceof Error ? error.message : 'RESOURCE_SNAPSHOT_UNAVAILABLE' };
227
+ }
228
+ item.memAvailableBytes = admission.memAvailableBytes;
229
+ item.estimatedRssBytes = admission.estimatedRssBytes ?? item.estimatedRssBytes;
230
+ if (!admission.admitted) {
231
+ item.state = 'resource_wait';
232
+ item.phase = 'resource_wait';
233
+ item.resourceWaitReason = admission.reason ?? 'Resource budget is not currently available.';
234
+ candidate.state = 'resource_wait';
235
+ candidate.updatedAt = Date.now();
236
+ deferred.add(`${candidate.id}:${item.sessionId}`);
237
+ await this.persist();
238
+ this.emit();
239
+ continue;
240
+ }
241
+ item.resourceWaitReason = undefined;
242
+ }
243
+ if (candidate.paused)
244
+ break;
245
+ candidate.state = 'running';
246
+ item.state = 'running';
247
+ item.phase = item.phase === 'restart_reconciliation' ? item.phase : 'restoring';
248
+ item.attempt += 1;
249
+ item.startedAt = Date.now();
250
+ item.completedAt = null;
251
+ candidate.updatedAt = Date.now();
252
+ this.active += 1;
253
+ await this.persist();
254
+ this.emit();
255
+ void this.execute(candidate, item);
256
+ }
257
+ if (this.state.operations.some(operation => !operation.paused && !terminalState(operation.state)
258
+ && operation.items.some(item => item.state === 'resource_wait'))) {
259
+ const retry = setTimeout(() => void this.pump(), 5_000);
260
+ retry.unref?.();
261
+ }
262
+ }
263
+ catch (error) {
264
+ this.onError(error);
265
+ }
266
+ finally {
267
+ this.pumping = false;
268
+ if (this.pumpRequested) {
269
+ this.pumpRequested = false;
270
+ queueMicrotask(() => void this.pump());
271
+ }
272
+ }
273
+ }
274
+ async execute(operation, item) {
275
+ try {
276
+ const result = await this.runner(operation.id, item.sessionId, phase => {
277
+ item.phase = phase.slice(0, 80);
278
+ operation.updatedAt = Date.now();
279
+ void this.persist().then(() => this.emit()).catch(error => this.onError(error));
280
+ });
281
+ if (result?.actualRssBytes !== undefined)
282
+ item.actualRssBytes = result.actualRssBytes;
283
+ item.state = 'succeeded';
284
+ item.phase = 'completed';
285
+ item.error = undefined;
286
+ item.errorCode = undefined;
287
+ }
288
+ catch (error) {
289
+ const value = error && typeof error === 'object' ? error : {};
290
+ const message = error instanceof Error ? error.message : String(error);
291
+ const code = typeof value.code === 'string' ? value.code
292
+ : message.includes('TERMINAL_INPUT_TARGET_CHANGED') ? 'TERMINAL_INPUT_TARGET_CHANGED' : 'TMUX_RECOVERY_FAILED';
293
+ item.state = 'failed';
294
+ item.phase = code === 'TERMINAL_INPUT_TARGET_CHANGED' ? 'target_changed' : 'failed';
295
+ item.errorCode = code;
296
+ item.error = message.slice(0, 1000);
297
+ this.onError({ operationId: operation.id, sessionId: item.sessionId, code, message });
298
+ }
299
+ finally {
300
+ item.completedAt = Date.now();
301
+ operation.updatedAt = item.completedAt;
302
+ const hasPending = operation.items.some(candidate => candidate.state === 'queued' || candidate.state === 'resource_wait' || candidate.state === 'running');
303
+ if (!hasPending) {
304
+ operation.paused = false;
305
+ operation.state = operation.items.some(candidate => candidate.state === 'failed') ? 'partial_failure' : 'succeeded';
306
+ }
307
+ else {
308
+ operation.state = operation.paused ? 'paused'
309
+ : operation.items.some(candidate => candidate.state === 'running') ? 'running'
310
+ : operation.items.some(candidate => candidate.state === 'queued') ? 'queued' : 'resource_wait';
311
+ }
312
+ this.active = Math.max(0, this.active - 1);
313
+ try {
314
+ await this.persist();
315
+ }
316
+ catch (error) {
317
+ this.onError(error);
318
+ }
319
+ this.emit();
320
+ void this.pump();
321
+ }
322
+ }
323
+ emit() { for (const listener of this.listeners) {
324
+ try {
325
+ listener();
326
+ }
327
+ catch { /* observer failure is isolated */ }
328
+ } }
329
+ persist() {
330
+ const snapshot = JSON.stringify(this.state, null, 2);
331
+ const write = this.writeChain.then(async () => {
332
+ await fs.mkdir(path.dirname(this.filePath), { recursive: true });
333
+ const tempPath = `${this.filePath}.${process.pid}.${randomUUID()}.tmp`;
334
+ await fs.writeFile(tempPath, snapshot, { mode: 0o600 });
335
+ await fs.rename(tempPath, this.filePath);
336
+ });
337
+ this.writeChain = write.catch(error => { this.onError(error); });
338
+ return write;
339
+ }
340
+ }
341
+ export function configuredTmuxRecoveryConcurrency(value = process.env.TD_TMUX_RECOVERY_CONCURRENCY) {
342
+ if (value === undefined || value.trim() === '')
343
+ return 3;
344
+ const parsed = Number(value);
345
+ if (!Number.isInteger(parsed) || parsed < 1 || parsed > 16)
346
+ throw new Error('Recovery concurrency must be an integer from 1 to 16');
347
+ return parsed;
348
+ }
@@ -1291,3 +1291,39 @@ runtime_resolved / queue_acquired / before_paste / before_submit`。时间是 TD
1291
1291
  确定性交错回归覆盖延迟改名/元数据回写、清除检查、持久化等待、输入队列等待、
1292
1292
  真实第二次启动、backend 替换及重新绑定;发生真实换代时,旧输入及旧的延迟回车
1293
1293
  仍被拒绝。测试证明 TD 一致性与终端写入边界,不代替私有 Agent 的实机消费验收。
1294
+
1295
+ ## 1.4.323:归档与恢复本机协作组显示
1296
+
1297
+ 最低 **CLI / 实际服务均为 1.4.323**,回读
1298
+ `admin_local_group_archive=true`、`admin_local_group_archive_min_version=1.4.323`。
1299
+ 本机管理员可归档/恢复精确本机组;CLI 与服务均检查能力,旧服务返回
1300
+ `ADMIN_LOCAL_GROUP_ARCHIVE_UNSUPPORTED`。
1301
+
1302
+ ```sh
1303
+ td integration group get <精确group-id>
1304
+ td integration group archive <精确group-id> \
1305
+ --expected-updated-at <当前updatedAt> --idempotency-key case-archive:v1
1306
+ td integration groups # 默认不列出归档组
1307
+ td integration groups --include-archived # 显式查看
1308
+ td integration group unarchive <精确group-id> \
1309
+ --expected-updated-at <当前updatedAt> --idempotency-key case-restore:v1
1310
+ ```
1311
+
1312
+ `group get` 对归档组仍可用,并在归档时返回 `archivedAt`。归档/恢复仅修改
1313
+ `archivedAt` 与组的 `updatedAt`,不改 `id`、名称、成员/角色、principal 固定组、
1314
+ TD/native session、运行承载、消息/reply、consumer 游标或历史;不关闭、释放、恢复
1315
+ 会话,不停止业务调度,也不重放消息。Web 侧栏默认隐藏归档组,在“已归档协作组”
1316
+ 中可查看并恢复显示;恢复组显示不会重启已关闭的 session。
1317
+
1318
+ 管理路由为 `POST /admin/groups/:id/archive` 与 `POST /admin/groups/:id/unarchive`,
1319
+ 请求仅接受 `{expected_updated_at,idempotency_key}`。`GET /admin/groups` 默认隐藏归档
1320
+ 组,传 `?include_archived=true` 显示归档组。归档/恢复 key 在同一操作范围内唯一,
1321
+ 参数改变返回 `IDEMPOTENCY_CONFLICT`。成功回执分开返回当前 `group`、本次提交的
1322
+ `applied` 和 `replayed`;旧回执重放不会覆盖后来版本。并发版本过期返回
1323
+ `GROUP_CHANGED` 与 `currentUpdatedAt`,应先重新 get,再由调用者决定是否用新 key
1324
+ 重试。同状态操作保留原 `archivedAt` 并记录幂等回执,不推进组版本。
1325
+
1326
+ 归档 journal 与组状态原子持久化,保留上限为 2000 条。状态/journal 不完整时返回
1327
+ `GROUP_ARCHIVE_STATE_UNCONFIRMED`,不会猜测或重建。只允许本机非 federated、未删除
1328
+ 组;删除组、跨服务组和不确定的目标分别返回 `GROUP_NOT_FOUND`、`GROUP_NOT_LOCAL`、
1329
+ `GROUP_ARCHIVE_TARGET_UNAVAILABLE`。归档不延长消息历史保留期。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "termdock",
3
- "version": "1.4.322",
3
+ "version": "1.4.325",
4
4
  "description": "A complete web-based terminal application with modern UI",
5
5
  "type": "module",
6
6
  "main": ".desktop-dist/main.js",
@@ -43,7 +43,10 @@
43
43
  "test": "vitest --passWithNoTests",
44
44
  "test:ui": "vitest --ui",
45
45
  "prepublishOnly": "npm run build",
46
- "postinstall": "node scripts/postinstall.mjs"
46
+ "postinstall": "node scripts/postinstall.mjs",
47
+ "preview:desktop:dev": "npm --prefix desktop-rust run dev",
48
+ "preview:desktop:build": "npm --prefix desktop-rust run build",
49
+ "preview:desktop:test": "npm --prefix desktop-rust run verify"
47
50
  },
48
51
  "dependencies": {
49
52
  "@chainsafe/libp2p-noise": "17.0.0",
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "packageName": "termdock",
4
- "version": "1.4.322",
4
+ "version": "1.4.325",
5
5
  "runtimeProtocolVersion": 1,
6
6
  "minimumDesktopVersion": "1.4.46",
7
7
  "nodeMajor": 22,
8
8
  "dependencyHash": "sha256-oaGYi/P5ob8sd6VnNBOwshKozjhdV+hYiCmLAsn5x00=",
9
- "serverBundleHash": "sha256-T9JZp3X9tfMUYciSrnZbiUIXuc+IHqHJuGp6Wf5bHs8=",
10
- "clientBundleHash": "sha256-4wVT4/UzD+TMRQjVw307g0c0x0cJm6NknoDeybiIQfA=",
9
+ "serverBundleHash": "sha256-lFOekSTHpHZrRuNcWm20UDGwKSjiviUQKjaT/zSYBvc=",
10
+ "clientBundleHash": "sha256-RVhKCGWk1bExA0aa9FHB8dutqDr/aCkALgScfT+IS80=",
11
11
  "entrypoint": "dist/server/cli.js",
12
12
  "clientEntrypoint": "dist/client/index.html"
13
13
  }