termdock 1.4.325 → 1.4.327

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 (350) hide show
  1. package/dist/client/assets/App-C0c83Pxp.js +186 -0
  2. package/dist/client/assets/App-C0c83Pxp.js.br +0 -0
  3. package/dist/client/assets/App-C0c83Pxp.js.gz +0 -0
  4. package/dist/client/assets/ArchitecturePanel-znWmrZsF.js +9 -0
  5. package/dist/client/assets/ArchitecturePanel-znWmrZsF.js.br +0 -0
  6. package/dist/client/assets/ArchitecturePanel-znWmrZsF.js.gz +0 -0
  7. package/dist/client/assets/{ChangeWalkthroughPanel-ChPZVfRz.js → ChangeWalkthroughPanel-Bt4fjEoD.js} +1 -1
  8. package/dist/client/assets/ChangeWalkthroughPanel-Bt4fjEoD.js.br +0 -0
  9. package/dist/client/assets/ChangeWalkthroughPanel-Bt4fjEoD.js.gz +0 -0
  10. package/dist/client/assets/{CollaborationMainWorkspace-DkNhqCj4.js → CollaborationMainWorkspace-0s90d39f.js} +1 -1
  11. package/dist/client/assets/CollaborationMainWorkspace-0s90d39f.js.br +0 -0
  12. package/dist/client/assets/CollaborationMainWorkspace-0s90d39f.js.gz +0 -0
  13. package/dist/client/assets/CollaborationTaskContent-CHVGId4O.js +2 -0
  14. package/dist/client/assets/ComputerControlView-BxLiNZeK.js +5 -0
  15. package/dist/client/assets/ComputerControlView-BxLiNZeK.js.br +0 -0
  16. package/dist/client/assets/ComputerControlView-BxLiNZeK.js.gz +0 -0
  17. package/dist/client/assets/{DagPlayground-BIL5vjer.js → DagPlayground-311LPbK_.js} +1 -1
  18. package/dist/client/assets/DagPlayground-311LPbK_.js.br +0 -0
  19. package/dist/client/assets/DagPlayground-311LPbK_.js.gz +0 -0
  20. package/dist/client/assets/{DiffLab-CX1AwU2v.js → DiffLab-CHZ0EL2E.js} +1 -1
  21. package/dist/client/assets/DiffLab-CHZ0EL2E.js.br +0 -0
  22. package/dist/client/assets/DiffLab-CHZ0EL2E.js.gz +0 -0
  23. package/dist/client/assets/{DiffReview-CLc1hwO7.js → DiffReview-BA7zArOA.js} +1 -1
  24. package/dist/client/assets/DiffReview-BA7zArOA.js.br +0 -0
  25. package/dist/client/assets/DiffReview-BA7zArOA.js.gz +0 -0
  26. package/dist/client/assets/{DiffReviewLab-DE6m1o4p.js → DiffReviewLab-C_6SxWtH.js} +1 -1
  27. package/dist/client/assets/DiffReviewLab-C_6SxWtH.js.br +0 -0
  28. package/dist/client/assets/DiffReviewLab-C_6SxWtH.js.gz +0 -0
  29. package/dist/client/assets/{DiffViewer-BDwtwbQM.js → DiffViewer-B0YoRCEi.js} +1 -1
  30. package/dist/client/assets/DiffViewer-B0YoRCEi.js.br +0 -0
  31. package/dist/client/assets/DiffViewer-B0YoRCEi.js.gz +0 -0
  32. package/dist/client/assets/{ModelPreview-DEwATnxi.js → ModelPreview-BboTxu4_.js} +1 -1
  33. package/dist/client/assets/ModelPreview-BboTxu4_.js.br +0 -0
  34. package/dist/client/assets/ModelPreview-BboTxu4_.js.gz +0 -0
  35. package/dist/client/assets/{RightSidebar-jOQJePDV.js → RightSidebar-TFRZlsFX.js} +27 -27
  36. package/dist/client/assets/RightSidebar-TFRZlsFX.js.br +0 -0
  37. package/dist/client/assets/RightSidebar-TFRZlsFX.js.gz +0 -0
  38. package/dist/client/assets/{abnfDiagram-VCTEODGH-GBSf8AEr.js → abnfDiagram-VCTEODGH-BK2-PKkq.js} +1 -1
  39. package/dist/client/assets/abnfDiagram-VCTEODGH-BK2-PKkq.js.br +0 -0
  40. package/dist/client/assets/abnfDiagram-VCTEODGH-BK2-PKkq.js.gz +0 -0
  41. package/dist/client/assets/{app-VCmiASzh.js → app-D2yRvfNE.js} +13 -13
  42. package/dist/client/assets/app-D2yRvfNE.js.br +0 -0
  43. package/dist/client/assets/app-D2yRvfNE.js.gz +0 -0
  44. package/dist/client/assets/{arc-BecvFgjf.js → arc-DqI6rAeJ.js} +1 -1
  45. package/dist/client/assets/arc-DqI6rAeJ.js.br +0 -0
  46. package/dist/client/assets/arc-DqI6rAeJ.js.gz +0 -0
  47. package/dist/client/assets/{architectureDiagram-5GKGNRK7-Cfk47zEF.js → architectureDiagram-5GKGNRK7-CZBYAIxt.js} +1 -1
  48. package/dist/client/assets/{architectureDiagram-5GKGNRK7-Cfk47zEF.js.br → architectureDiagram-5GKGNRK7-CZBYAIxt.js.br} +0 -0
  49. package/dist/client/assets/architectureDiagram-5GKGNRK7-CZBYAIxt.js.gz +0 -0
  50. package/dist/client/assets/{blockDiagram-I7D4REHJ-BHYgsLvx.js → blockDiagram-I7D4REHJ-BAZ4LopQ.js} +1 -1
  51. package/dist/client/assets/blockDiagram-I7D4REHJ-BAZ4LopQ.js.br +0 -0
  52. package/dist/client/assets/blockDiagram-I7D4REHJ-BAZ4LopQ.js.gz +0 -0
  53. package/dist/client/assets/{c4Diagram-7LVT6UL2-ClWWjTyz.js → c4Diagram-7LVT6UL2-Boh80g9D.js} +1 -1
  54. package/dist/client/assets/c4Diagram-7LVT6UL2-Boh80g9D.js.br +0 -0
  55. package/dist/client/assets/c4Diagram-7LVT6UL2-Boh80g9D.js.gz +0 -0
  56. package/dist/client/assets/channel-B3pP90yO.js +1 -0
  57. package/dist/client/assets/{chunk-2Q5K7J3B-Cat1Dsqx.js → chunk-2Q5K7J3B-CQtYmkXv.js} +1 -1
  58. package/dist/client/assets/{chunk-5VM5RSS4-CT0S2-E8.js → chunk-5VM5RSS4-lfjEsOLd.js} +1 -1
  59. package/dist/client/assets/{chunk-F27PBJKO-7o5_yA1b.js → chunk-F27PBJKO-B3iWUfsu.js} +1 -1
  60. package/dist/client/assets/chunk-F27PBJKO-B3iWUfsu.js.br +0 -0
  61. package/dist/client/assets/chunk-F27PBJKO-B3iWUfsu.js.gz +0 -0
  62. package/dist/client/assets/{chunk-IMKFNOWR-iAZxGMup.js → chunk-IMKFNOWR-BV8W69Xy.js} +1 -1
  63. package/dist/client/assets/chunk-IMKFNOWR-BV8W69Xy.js.br +0 -0
  64. package/dist/client/assets/chunk-IMKFNOWR-BV8W69Xy.js.gz +0 -0
  65. package/dist/client/assets/{chunk-JWPE2WC7-DLvwOWZm.js → chunk-JWPE2WC7-BHn7J2ij.js} +1 -1
  66. package/dist/client/assets/{chunk-POPQ4Y6H-BpiRuG56.js → chunk-POPQ4Y6H-1UAKkjro.js} +1 -1
  67. package/dist/client/assets/{chunk-SVP7TREG-DpB7xpqI.js → chunk-SVP7TREG-DMDJrwWD.js} +1 -1
  68. package/dist/client/assets/chunk-SVP7TREG-DMDJrwWD.js.br +0 -0
  69. package/dist/client/assets/chunk-SVP7TREG-DMDJrwWD.js.gz +0 -0
  70. package/dist/client/assets/{chunk-TICWLB2K-Z_Sti6yX.js → chunk-TICWLB2K-DViVpzs1.js} +1 -1
  71. package/dist/client/assets/chunk-TICWLB2K-DViVpzs1.js.br +0 -0
  72. package/dist/client/assets/chunk-TICWLB2K-DViVpzs1.js.gz +0 -0
  73. package/dist/client/assets/{chunk-XXDRQBXY-DKngx1rf.js → chunk-XXDRQBXY-Cyg6qo-b.js} +1 -1
  74. package/dist/client/assets/classDiagram-ZZMXUADV-CcfJXXoP.js +1 -0
  75. package/dist/client/assets/classDiagram-v2-VYDZK3BY-CcfJXXoP.js +1 -0
  76. package/dist/client/assets/{cose-bilkent-JH36ORCC-CDo8eUXo.js → cose-bilkent-JH36ORCC-Dq6PJ-un.js} +1 -1
  77. package/dist/client/assets/cose-bilkent-JH36ORCC-Dq6PJ-un.js.br +0 -0
  78. package/dist/client/assets/cose-bilkent-JH36ORCC-Dq6PJ-un.js.gz +0 -0
  79. package/dist/client/assets/{cynefin-OW5HDTMX-R6vltrl4.js → cynefin-OW5HDTMX--pc9zClZ.js} +1 -1
  80. package/dist/client/assets/{cynefin-OW5HDTMX-R6vltrl4.js.br → cynefin-OW5HDTMX--pc9zClZ.js.br} +0 -0
  81. package/dist/client/assets/{cynefin-OW5HDTMX-R6vltrl4.js.gz → cynefin-OW5HDTMX--pc9zClZ.js.gz} +0 -0
  82. package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-BTGMG-zO.js → cynefinDiagram-5FMLGOSQ-1whKia5t.js} +1 -1
  83. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-1whKia5t.js.br +0 -0
  84. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-1whKia5t.js.gz +0 -0
  85. package/dist/client/assets/{dagre-GXQ25YYZ-D67dNSHU.js → dagre-GXQ25YYZ-8TjGkCEP.js} +1 -1
  86. package/dist/client/assets/dagre-GXQ25YYZ-8TjGkCEP.js.br +0 -0
  87. package/dist/client/assets/dagre-GXQ25YYZ-8TjGkCEP.js.gz +0 -0
  88. package/dist/client/assets/{diagram-S7CK7UJ4-CxZmcHs4.js → diagram-S7CK7UJ4-BTgsveUu.js} +1 -1
  89. package/dist/client/assets/diagram-S7CK7UJ4-BTgsveUu.js.br +0 -0
  90. package/dist/client/assets/diagram-S7CK7UJ4-BTgsveUu.js.gz +0 -0
  91. package/dist/client/assets/{diagram-UQ7AKVKN-BErivsDz.js → diagram-UQ7AKVKN-CPxoDqq7.js} +1 -1
  92. package/dist/client/assets/diagram-UQ7AKVKN-CPxoDqq7.js.br +0 -0
  93. package/dist/client/assets/diagram-UQ7AKVKN-CPxoDqq7.js.gz +0 -0
  94. package/dist/client/assets/{diagram-VSXAHHWV-BQWEvK9d.js → diagram-VSXAHHWV-BtNBFyC3.js} +1 -1
  95. package/dist/client/assets/diagram-VSXAHHWV-BtNBFyC3.js.br +0 -0
  96. package/dist/client/assets/diagram-VSXAHHWV-BtNBFyC3.js.gz +0 -0
  97. package/dist/client/assets/{diagram-VX7I27RA-COR5k4JL.js → diagram-VX7I27RA-DLfdx0dh.js} +1 -1
  98. package/dist/client/assets/diagram-VX7I27RA-DLfdx0dh.js.br +0 -0
  99. package/dist/client/assets/diagram-VX7I27RA-DLfdx0dh.js.gz +0 -0
  100. package/dist/client/assets/{diagram-Z3DM3KII-Cx6oTlVi.js → diagram-Z3DM3KII-C9FdZJ41.js} +1 -1
  101. package/dist/client/assets/diagram-Z3DM3KII-C9FdZJ41.js.br +0 -0
  102. package/dist/client/assets/diagram-Z3DM3KII-C9FdZJ41.js.gz +0 -0
  103. package/dist/client/assets/{ebnfDiagram-PWID7BFC-dKNZki9k.js → ebnfDiagram-PWID7BFC-CAxaqCAJ.js} +1 -1
  104. package/dist/client/assets/ebnfDiagram-PWID7BFC-CAxaqCAJ.js.br +0 -0
  105. package/dist/client/assets/ebnfDiagram-PWID7BFC-CAxaqCAJ.js.gz +0 -0
  106. package/dist/client/assets/{erDiagram-RLTQ6QDP-DD06d9Gl.js → erDiagram-RLTQ6QDP-BBO2Iz-B.js} +1 -1
  107. package/dist/client/assets/erDiagram-RLTQ6QDP-BBO2Iz-B.js.br +0 -0
  108. package/dist/client/assets/erDiagram-RLTQ6QDP-BBO2Iz-B.js.gz +0 -0
  109. package/dist/client/assets/{flowDiagram-HODETNUW-DXNAvw1d.js → flowDiagram-HODETNUW-DQ-nPGNL.js} +1 -1
  110. package/dist/client/assets/flowDiagram-HODETNUW-DQ-nPGNL.js.br +0 -0
  111. package/dist/client/assets/flowDiagram-HODETNUW-DQ-nPGNL.js.gz +0 -0
  112. package/dist/client/assets/{ganttDiagram-EL5Y4UJY-BSMu3Rsd.js → ganttDiagram-EL5Y4UJY-C4bKdSCF.js} +1 -1
  113. package/dist/client/assets/ganttDiagram-EL5Y4UJY-C4bKdSCF.js.br +0 -0
  114. package/dist/client/assets/ganttDiagram-EL5Y4UJY-C4bKdSCF.js.gz +0 -0
  115. package/dist/client/assets/{gestureArbiter-D1TteC76.js → gestureArbiter-miROLzXb.js} +1 -1
  116. package/dist/client/assets/gestureArbiter-miROLzXb.js.br +0 -0
  117. package/dist/client/assets/gestureArbiter-miROLzXb.js.gz +0 -0
  118. package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-DNDKI803.js → gitGraphDiagram-WWUBYQGX-cAbsg4ei.js} +1 -1
  119. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-cAbsg4ei.js.br +0 -0
  120. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-cAbsg4ei.js.gz +0 -0
  121. package/dist/client/assets/index-Dd_3ISCb.css +1 -0
  122. package/dist/client/assets/index-Dd_3ISCb.css.br +0 -0
  123. package/dist/client/assets/{index-Ctz-IDjR.css.gz → index-Dd_3ISCb.css.gz} +0 -0
  124. package/dist/client/assets/{infoDiagram-27XIBGKW-BRmB1D5B.js → infoDiagram-27XIBGKW-EV88OFTf.js} +1 -1
  125. package/dist/client/assets/{ishikawaDiagram-5VMMS53U-DXU4nnZ6.js → ishikawaDiagram-5VMMS53U-Bi-60w6U.js} +1 -1
  126. package/dist/client/assets/ishikawaDiagram-5VMMS53U-Bi-60w6U.js.br +0 -0
  127. package/dist/client/assets/ishikawaDiagram-5VMMS53U-Bi-60w6U.js.gz +0 -0
  128. package/dist/client/assets/{journeyDiagram-3NMN7TZE-DFx7AfiP.js → journeyDiagram-3NMN7TZE-Bgbk61sp.js} +1 -1
  129. package/dist/client/assets/journeyDiagram-3NMN7TZE-Bgbk61sp.js.br +0 -0
  130. package/dist/client/assets/journeyDiagram-3NMN7TZE-Bgbk61sp.js.gz +0 -0
  131. package/dist/client/assets/{kanban-definition-UXKFOSKX-B1ikfXJe.js → kanban-definition-UXKFOSKX-Ly6IeL8s.js} +1 -1
  132. package/dist/client/assets/kanban-definition-UXKFOSKX-Ly6IeL8s.js.br +0 -0
  133. package/dist/client/assets/kanban-definition-UXKFOSKX-Ly6IeL8s.js.gz +0 -0
  134. package/dist/client/assets/{layout-DkyvZr1Y.js → layout-CEjMszLD.js} +1 -1
  135. package/dist/client/assets/layout-CEjMszLD.js.br +0 -0
  136. package/dist/client/assets/layout-CEjMszLD.js.gz +0 -0
  137. package/dist/client/assets/{linear-CECAbRuX.js → linear-BCB67kKS.js} +1 -1
  138. package/dist/client/assets/linear-BCB67kKS.js.br +0 -0
  139. package/dist/client/assets/linear-BCB67kKS.js.gz +0 -0
  140. package/dist/client/assets/{mermaid.core-CYY7Wb75.js → mermaid.core-BmSOfxMH.js} +5 -5
  141. package/dist/client/assets/mermaid.core-BmSOfxMH.js.br +0 -0
  142. package/dist/client/assets/mermaid.core-BmSOfxMH.js.gz +0 -0
  143. package/dist/client/assets/{mindmap-definition-YA3MSWOX-CTs-Y3Lq.js → mindmap-definition-YA3MSWOX-VEZ7qGHM.js} +1 -1
  144. package/dist/client/assets/mindmap-definition-YA3MSWOX-VEZ7qGHM.js.br +0 -0
  145. package/dist/client/assets/mindmap-definition-YA3MSWOX-VEZ7qGHM.js.gz +0 -0
  146. package/dist/client/assets/{passwordBootstrap-CPNGDwv6.js → passwordBootstrap-BUV0AT5k.js} +1 -1
  147. package/dist/client/assets/passwordBootstrap-BUV0AT5k.js.br +0 -0
  148. package/dist/client/assets/passwordBootstrap-BUV0AT5k.js.gz +0 -0
  149. package/dist/client/assets/{pegDiagram-XKGWAZYB-Y1oZrwtK.js → pegDiagram-XKGWAZYB-DtFnROHy.js} +1 -1
  150. package/dist/client/assets/pegDiagram-XKGWAZYB-DtFnROHy.js.br +0 -0
  151. package/dist/client/assets/pegDiagram-XKGWAZYB-DtFnROHy.js.gz +0 -0
  152. package/dist/client/assets/{pieDiagram-E7YTZNPT-DYSm5OxQ.js → pieDiagram-E7YTZNPT-CrRFKgsg.js} +1 -1
  153. package/dist/client/assets/pieDiagram-E7YTZNPT-CrRFKgsg.js.br +0 -0
  154. package/dist/client/assets/pieDiagram-E7YTZNPT-CrRFKgsg.js.gz +0 -0
  155. package/dist/client/assets/{quadrantDiagram-AXDQQJYC-DpibIBz0.js → quadrantDiagram-AXDQQJYC-DrxOcCWy.js} +1 -1
  156. package/dist/client/assets/quadrantDiagram-AXDQQJYC-DrxOcCWy.js.br +0 -0
  157. package/dist/client/assets/quadrantDiagram-AXDQQJYC-DrxOcCWy.js.gz +0 -0
  158. package/dist/client/assets/{railroadDiagram-O6MQD6OU-b7jp7C1K.js → railroadDiagram-O6MQD6OU-BaXzskST.js} +1 -1
  159. package/dist/client/assets/railroadDiagram-O6MQD6OU-BaXzskST.js.br +0 -0
  160. package/dist/client/assets/railroadDiagram-O6MQD6OU-BaXzskST.js.gz +0 -0
  161. package/dist/client/assets/rdpSession-DtIeoTyy.js +1 -0
  162. package/dist/client/assets/rdpSession-DtIeoTyy.js.br +0 -0
  163. package/dist/client/assets/rdpSession-DtIeoTyy.js.gz +0 -0
  164. package/dist/client/assets/{referenceLongPress-BPQ_i68g.js → referenceLongPress-DqibFmuj.js} +1 -1
  165. package/dist/client/assets/referenceLongPress-DqibFmuj.js.br +0 -0
  166. package/dist/client/assets/referenceLongPress-DqibFmuj.js.gz +0 -0
  167. package/dist/client/assets/{requirementDiagram-BXWQKSXE-BMinO1mf.js → requirementDiagram-BXWQKSXE-BdwuNHm0.js} +1 -1
  168. package/dist/client/assets/requirementDiagram-BXWQKSXE-BdwuNHm0.js.br +0 -0
  169. package/dist/client/assets/requirementDiagram-BXWQKSXE-BdwuNHm0.js.gz +0 -0
  170. package/dist/client/assets/{sankeyDiagram-P5KCCOFB-CmC977VA.js → sankeyDiagram-P5KCCOFB-L8-WTgQS.js} +1 -1
  171. package/dist/client/assets/sankeyDiagram-P5KCCOFB-L8-WTgQS.js.br +0 -0
  172. package/dist/client/assets/sankeyDiagram-P5KCCOFB-L8-WTgQS.js.gz +0 -0
  173. package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-D6eGbgK8.js → sequenceDiagram-WJ2MYXX4-Hloa_AO5.js} +1 -1
  174. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-Hloa_AO5.js.br +0 -0
  175. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-Hloa_AO5.js.gz +0 -0
  176. package/dist/client/assets/{sizeCapture-INFHLROL-CnRvyBd8.js → sizeCapture-INFHLROL-0sRpfplV.js} +1 -1
  177. package/dist/client/assets/sizeCapture-INFHLROL-0sRpfplV.js.br +0 -0
  178. package/dist/client/assets/sizeCapture-INFHLROL-0sRpfplV.js.gz +0 -0
  179. package/dist/client/assets/{sparkles-DzadqrlX.js → sparkles-CgDDXr95.js} +1 -1
  180. package/dist/client/assets/{stateDiagram-D77RDMKH-DRSalH10.js → stateDiagram-D77RDMKH-DqT3kcLM.js} +1 -1
  181. package/dist/client/assets/stateDiagram-D77RDMKH-DqT3kcLM.js.br +0 -0
  182. package/dist/client/assets/stateDiagram-D77RDMKH-DqT3kcLM.js.gz +0 -0
  183. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-DjkkxZUN.js +1 -0
  184. package/dist/client/assets/{swimlanes-42K2YHIH-u-NnDSzq.js → swimlanes-42K2YHIH-BH5xHrJq.js} +1 -1
  185. package/dist/client/assets/swimlanes-42K2YHIH-BH5xHrJq.js.br +0 -0
  186. package/dist/client/assets/swimlanes-42K2YHIH-BH5xHrJq.js.gz +0 -0
  187. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-DpLhj_Dx.js +8 -0
  188. package/dist/client/assets/{timeline-definition-24CTP7MA-DkLijg_J.js → timeline-definition-24CTP7MA-D3Ez5FZh.js} +1 -1
  189. package/dist/client/assets/timeline-definition-24CTP7MA-D3Ez5FZh.js.br +0 -0
  190. package/dist/client/assets/timeline-definition-24CTP7MA-D3Ez5FZh.js.gz +0 -0
  191. package/dist/client/assets/{triangle-alert-D_6xTTiX.js → triangle-alert-DqUvQ_x8.js} +1 -1
  192. package/dist/client/assets/{vennDiagram-4TSXK5OY-AWGJtiv3.js → vennDiagram-4TSXK5OY-DEGLdtyy.js} +1 -1
  193. package/dist/client/assets/vennDiagram-4TSXK5OY-DEGLdtyy.js.br +0 -0
  194. package/dist/client/assets/vennDiagram-4TSXK5OY-DEGLdtyy.js.gz +0 -0
  195. package/dist/client/assets/{videoCompression-D3y7Bq8J.js → videoCompression-DIBRptEJ.js} +1 -1
  196. package/dist/client/assets/videoCompression-DIBRptEJ.js.br +0 -0
  197. package/dist/client/assets/videoCompression-DIBRptEJ.js.gz +0 -0
  198. package/dist/client/assets/{wardleyDiagram-VM6X3IG4-DI0aZr_y.js → wardleyDiagram-VM6X3IG4-BWXojK8h.js} +1 -1
  199. package/dist/client/assets/wardleyDiagram-VM6X3IG4-BWXojK8h.js.br +0 -0
  200. package/dist/client/assets/wardleyDiagram-VM6X3IG4-BWXojK8h.js.gz +0 -0
  201. package/dist/client/assets/{xychartDiagram-S5SC5T6Z-CCoIN3uU.js → xychartDiagram-S5SC5T6Z-CI95cYmG.js} +1 -1
  202. package/dist/client/assets/xychartDiagram-S5SC5T6Z-CI95cYmG.js.br +0 -0
  203. package/dist/client/assets/xychartDiagram-S5SC5T6Z-CI95cYmG.js.gz +0 -0
  204. package/dist/client/index.html +2 -2
  205. package/dist/client/index.html.br +0 -0
  206. package/dist/client/index.html.gz +0 -0
  207. package/dist/client/sw.js +1 -1
  208. package/dist/client/sw.js.br +0 -0
  209. package/dist/client/sw.js.gz +0 -0
  210. package/dist/server/agent/integrationServer.js +6 -1
  211. package/dist/server/routes/terminal.js +21 -13
  212. package/dist/server/utils/hostResources.js +35 -0
  213. package/dist/server/utils/tmuxRecoveryOperations.js +72 -18
  214. package/docs/systemd.md +35 -0
  215. package/package.json +3 -1
  216. package/packaging/systemd/termdock.service.d/10-preserve-tmux.conf +5 -0
  217. package/runtime-manifest.json +3 -3
  218. package/dist/client/assets/App-D8MWr9xp.js +0 -186
  219. package/dist/client/assets/App-D8MWr9xp.js.br +0 -0
  220. package/dist/client/assets/App-D8MWr9xp.js.gz +0 -0
  221. package/dist/client/assets/ArchitecturePanel-CJXvqmtu.js +0 -9
  222. package/dist/client/assets/ArchitecturePanel-CJXvqmtu.js.br +0 -0
  223. package/dist/client/assets/ArchitecturePanel-CJXvqmtu.js.gz +0 -0
  224. package/dist/client/assets/ChangeWalkthroughPanel-ChPZVfRz.js.br +0 -0
  225. package/dist/client/assets/ChangeWalkthroughPanel-ChPZVfRz.js.gz +0 -0
  226. package/dist/client/assets/CollaborationMainWorkspace-DkNhqCj4.js.br +0 -0
  227. package/dist/client/assets/CollaborationMainWorkspace-DkNhqCj4.js.gz +0 -0
  228. package/dist/client/assets/CollaborationTaskContent-BA3bVNJo.js +0 -2
  229. package/dist/client/assets/ComputerControlView-BTntDI6C.js +0 -5
  230. package/dist/client/assets/ComputerControlView-BTntDI6C.js.br +0 -0
  231. package/dist/client/assets/ComputerControlView-BTntDI6C.js.gz +0 -0
  232. package/dist/client/assets/DagPlayground-BIL5vjer.js.br +0 -0
  233. package/dist/client/assets/DagPlayground-BIL5vjer.js.gz +0 -0
  234. package/dist/client/assets/DiffLab-CX1AwU2v.js.br +0 -0
  235. package/dist/client/assets/DiffLab-CX1AwU2v.js.gz +0 -0
  236. package/dist/client/assets/DiffReview-CLc1hwO7.js.br +0 -0
  237. package/dist/client/assets/DiffReview-CLc1hwO7.js.gz +0 -0
  238. package/dist/client/assets/DiffReviewLab-DE6m1o4p.js.br +0 -0
  239. package/dist/client/assets/DiffReviewLab-DE6m1o4p.js.gz +0 -0
  240. package/dist/client/assets/DiffViewer-BDwtwbQM.js.br +0 -0
  241. package/dist/client/assets/DiffViewer-BDwtwbQM.js.gz +0 -0
  242. package/dist/client/assets/ModelPreview-DEwATnxi.js.br +0 -0
  243. package/dist/client/assets/ModelPreview-DEwATnxi.js.gz +0 -0
  244. package/dist/client/assets/RightSidebar-jOQJePDV.js.br +0 -0
  245. package/dist/client/assets/RightSidebar-jOQJePDV.js.gz +0 -0
  246. package/dist/client/assets/abnfDiagram-VCTEODGH-GBSf8AEr.js.br +0 -0
  247. package/dist/client/assets/abnfDiagram-VCTEODGH-GBSf8AEr.js.gz +0 -0
  248. package/dist/client/assets/app-VCmiASzh.js.br +0 -0
  249. package/dist/client/assets/app-VCmiASzh.js.gz +0 -0
  250. package/dist/client/assets/arc-BecvFgjf.js.br +0 -0
  251. package/dist/client/assets/arc-BecvFgjf.js.gz +0 -0
  252. package/dist/client/assets/architectureDiagram-5GKGNRK7-Cfk47zEF.js.gz +0 -0
  253. package/dist/client/assets/blockDiagram-I7D4REHJ-BHYgsLvx.js.br +0 -0
  254. package/dist/client/assets/blockDiagram-I7D4REHJ-BHYgsLvx.js.gz +0 -0
  255. package/dist/client/assets/c4Diagram-7LVT6UL2-ClWWjTyz.js.br +0 -0
  256. package/dist/client/assets/c4Diagram-7LVT6UL2-ClWWjTyz.js.gz +0 -0
  257. package/dist/client/assets/channel-8F8qxLSK.js +0 -1
  258. package/dist/client/assets/chunk-F27PBJKO-7o5_yA1b.js.br +0 -0
  259. package/dist/client/assets/chunk-F27PBJKO-7o5_yA1b.js.gz +0 -0
  260. package/dist/client/assets/chunk-IMKFNOWR-iAZxGMup.js.br +0 -0
  261. package/dist/client/assets/chunk-IMKFNOWR-iAZxGMup.js.gz +0 -0
  262. package/dist/client/assets/chunk-SVP7TREG-DpB7xpqI.js.br +0 -0
  263. package/dist/client/assets/chunk-SVP7TREG-DpB7xpqI.js.gz +0 -0
  264. package/dist/client/assets/chunk-TICWLB2K-Z_Sti6yX.js.br +0 -0
  265. package/dist/client/assets/chunk-TICWLB2K-Z_Sti6yX.js.gz +0 -0
  266. package/dist/client/assets/classDiagram-ZZMXUADV-C0AmKz7U.js +0 -1
  267. package/dist/client/assets/classDiagram-v2-VYDZK3BY-C0AmKz7U.js +0 -1
  268. package/dist/client/assets/cose-bilkent-JH36ORCC-CDo8eUXo.js.br +0 -0
  269. package/dist/client/assets/cose-bilkent-JH36ORCC-CDo8eUXo.js.gz +0 -0
  270. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-BTGMG-zO.js.br +0 -0
  271. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-BTGMG-zO.js.gz +0 -0
  272. package/dist/client/assets/dagre-GXQ25YYZ-D67dNSHU.js.br +0 -0
  273. package/dist/client/assets/dagre-GXQ25YYZ-D67dNSHU.js.gz +0 -0
  274. package/dist/client/assets/diagram-S7CK7UJ4-CxZmcHs4.js.br +0 -0
  275. package/dist/client/assets/diagram-S7CK7UJ4-CxZmcHs4.js.gz +0 -0
  276. package/dist/client/assets/diagram-UQ7AKVKN-BErivsDz.js.br +0 -0
  277. package/dist/client/assets/diagram-UQ7AKVKN-BErivsDz.js.gz +0 -0
  278. package/dist/client/assets/diagram-VSXAHHWV-BQWEvK9d.js.br +0 -0
  279. package/dist/client/assets/diagram-VSXAHHWV-BQWEvK9d.js.gz +0 -0
  280. package/dist/client/assets/diagram-VX7I27RA-COR5k4JL.js.br +0 -0
  281. package/dist/client/assets/diagram-VX7I27RA-COR5k4JL.js.gz +0 -0
  282. package/dist/client/assets/diagram-Z3DM3KII-Cx6oTlVi.js.br +0 -0
  283. package/dist/client/assets/diagram-Z3DM3KII-Cx6oTlVi.js.gz +0 -0
  284. package/dist/client/assets/ebnfDiagram-PWID7BFC-dKNZki9k.js.br +0 -0
  285. package/dist/client/assets/ebnfDiagram-PWID7BFC-dKNZki9k.js.gz +0 -0
  286. package/dist/client/assets/erDiagram-RLTQ6QDP-DD06d9Gl.js.br +0 -0
  287. package/dist/client/assets/erDiagram-RLTQ6QDP-DD06d9Gl.js.gz +0 -0
  288. package/dist/client/assets/flowDiagram-HODETNUW-DXNAvw1d.js.br +0 -0
  289. package/dist/client/assets/flowDiagram-HODETNUW-DXNAvw1d.js.gz +0 -0
  290. package/dist/client/assets/ganttDiagram-EL5Y4UJY-BSMu3Rsd.js.br +0 -0
  291. package/dist/client/assets/ganttDiagram-EL5Y4UJY-BSMu3Rsd.js.gz +0 -0
  292. package/dist/client/assets/gestureArbiter-D1TteC76.js.br +0 -0
  293. package/dist/client/assets/gestureArbiter-D1TteC76.js.gz +0 -0
  294. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DNDKI803.js.br +0 -0
  295. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DNDKI803.js.gz +0 -0
  296. package/dist/client/assets/index-Ctz-IDjR.css +0 -1
  297. package/dist/client/assets/index-Ctz-IDjR.css.br +0 -0
  298. package/dist/client/assets/ishikawaDiagram-5VMMS53U-DXU4nnZ6.js.br +0 -0
  299. package/dist/client/assets/ishikawaDiagram-5VMMS53U-DXU4nnZ6.js.gz +0 -0
  300. package/dist/client/assets/journeyDiagram-3NMN7TZE-DFx7AfiP.js.br +0 -0
  301. package/dist/client/assets/journeyDiagram-3NMN7TZE-DFx7AfiP.js.gz +0 -0
  302. package/dist/client/assets/kanban-definition-UXKFOSKX-B1ikfXJe.js.br +0 -0
  303. package/dist/client/assets/kanban-definition-UXKFOSKX-B1ikfXJe.js.gz +0 -0
  304. package/dist/client/assets/layout-DkyvZr1Y.js.br +0 -0
  305. package/dist/client/assets/layout-DkyvZr1Y.js.gz +0 -0
  306. package/dist/client/assets/linear-CECAbRuX.js.br +0 -0
  307. package/dist/client/assets/linear-CECAbRuX.js.gz +0 -0
  308. package/dist/client/assets/mermaid.core-CYY7Wb75.js.br +0 -0
  309. package/dist/client/assets/mermaid.core-CYY7Wb75.js.gz +0 -0
  310. package/dist/client/assets/mindmap-definition-YA3MSWOX-CTs-Y3Lq.js.br +0 -0
  311. package/dist/client/assets/mindmap-definition-YA3MSWOX-CTs-Y3Lq.js.gz +0 -0
  312. package/dist/client/assets/passwordBootstrap-CPNGDwv6.js.br +0 -0
  313. package/dist/client/assets/passwordBootstrap-CPNGDwv6.js.gz +0 -0
  314. package/dist/client/assets/pegDiagram-XKGWAZYB-Y1oZrwtK.js.br +0 -0
  315. package/dist/client/assets/pegDiagram-XKGWAZYB-Y1oZrwtK.js.gz +0 -0
  316. package/dist/client/assets/pieDiagram-E7YTZNPT-DYSm5OxQ.js.br +0 -0
  317. package/dist/client/assets/pieDiagram-E7YTZNPT-DYSm5OxQ.js.gz +0 -0
  318. package/dist/client/assets/quadrantDiagram-AXDQQJYC-DpibIBz0.js.br +0 -0
  319. package/dist/client/assets/quadrantDiagram-AXDQQJYC-DpibIBz0.js.gz +0 -0
  320. package/dist/client/assets/railroadDiagram-O6MQD6OU-b7jp7C1K.js.br +0 -0
  321. package/dist/client/assets/railroadDiagram-O6MQD6OU-b7jp7C1K.js.gz +0 -0
  322. package/dist/client/assets/rdpSession-DU_OJfX5.js +0 -1
  323. package/dist/client/assets/rdpSession-DU_OJfX5.js.br +0 -0
  324. package/dist/client/assets/rdpSession-DU_OJfX5.js.gz +0 -0
  325. package/dist/client/assets/referenceLongPress-BPQ_i68g.js.br +0 -0
  326. package/dist/client/assets/referenceLongPress-BPQ_i68g.js.gz +0 -0
  327. package/dist/client/assets/requirementDiagram-BXWQKSXE-BMinO1mf.js.br +0 -0
  328. package/dist/client/assets/requirementDiagram-BXWQKSXE-BMinO1mf.js.gz +0 -0
  329. package/dist/client/assets/sankeyDiagram-P5KCCOFB-CmC977VA.js.br +0 -0
  330. package/dist/client/assets/sankeyDiagram-P5KCCOFB-CmC977VA.js.gz +0 -0
  331. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-D6eGbgK8.js.br +0 -0
  332. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-D6eGbgK8.js.gz +0 -0
  333. package/dist/client/assets/sizeCapture-INFHLROL-CnRvyBd8.js.br +0 -0
  334. package/dist/client/assets/sizeCapture-INFHLROL-CnRvyBd8.js.gz +0 -0
  335. package/dist/client/assets/stateDiagram-D77RDMKH-DRSalH10.js.br +0 -0
  336. package/dist/client/assets/stateDiagram-D77RDMKH-DRSalH10.js.gz +0 -0
  337. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-DKe8v_ic.js +0 -1
  338. package/dist/client/assets/swimlanes-42K2YHIH-u-NnDSzq.js.br +0 -0
  339. package/dist/client/assets/swimlanes-42K2YHIH-u-NnDSzq.js.gz +0 -0
  340. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-ei5b8ZYx.js +0 -8
  341. package/dist/client/assets/timeline-definition-24CTP7MA-DkLijg_J.js.br +0 -0
  342. package/dist/client/assets/timeline-definition-24CTP7MA-DkLijg_J.js.gz +0 -0
  343. package/dist/client/assets/vennDiagram-4TSXK5OY-AWGJtiv3.js.br +0 -0
  344. package/dist/client/assets/vennDiagram-4TSXK5OY-AWGJtiv3.js.gz +0 -0
  345. package/dist/client/assets/videoCompression-D3y7Bq8J.js.br +0 -0
  346. package/dist/client/assets/videoCompression-D3y7Bq8J.js.gz +0 -0
  347. package/dist/client/assets/wardleyDiagram-VM6X3IG4-DI0aZr_y.js.br +0 -0
  348. package/dist/client/assets/wardleyDiagram-VM6X3IG4-DI0aZr_y.js.gz +0 -0
  349. package/dist/client/assets/xychartDiagram-S5SC5T6Z-CCoIN3uU.js.br +0 -0
  350. package/dist/client/assets/xychartDiagram-S5SC5T6Z-CCoIN3uU.js.gz +0 -0
@@ -4,10 +4,27 @@ import { randomUUID } from 'node:crypto';
4
4
  export function summarizeRecoveryOperation(operation) {
5
5
  const counts = operation.items.reduce((total, item) => {
6
6
  total.total += 1;
7
- total[item.state] += 1;
7
+ if (item.state === 'resource_wait') {
8
+ total.resource_wait += 1;
9
+ total.paused_count += 1;
10
+ }
11
+ else if (item.state === 'paused') {
12
+ total.paused_count += 1;
13
+ if (item.pauseReason === 'resources')
14
+ total.resource_wait += 1;
15
+ }
16
+ else if (item.state === 'queued' && operation.paused) {
17
+ total.paused_count += 1;
18
+ }
19
+ else {
20
+ total[item.state] += 1;
21
+ }
8
22
  return total;
9
- }, { total: 0, queued: 0, resource_wait: 0, running: 0, succeeded: 0, failed: 0 });
10
- return { ...structuredClone(operation), ...counts };
23
+ }, { total: 0, queued: 0, resource_wait: 0, running: 0, succeeded: 0, failed: 0, paused_count: 0 });
24
+ return { ...structuredClone(operation), ...counts, counts: {
25
+ total: counts.total, queued: counts.queued, running: counts.running,
26
+ succeeded: counts.succeeded, failed: counts.failed, paused: counts.paused_count,
27
+ } };
11
28
  }
12
29
  export class TmuxRecoveryOperationError extends Error {
13
30
  code;
@@ -78,7 +95,8 @@ export class TmuxRecoveryOperationStore {
78
95
  if (item.state === 'running') {
79
96
  // A killed worker may have submitted the native resume before it died.
80
97
  // The runner always performs an exact-owner reconciliation before it launches.
81
- item.state = 'queued';
98
+ item.state = operation.paused ? 'paused' : 'queued';
99
+ item.pauseReason = operation.paused ? 'manual' : undefined;
82
100
  item.phase = 'restart_reconciliation';
83
101
  item.errorCode = 'RECOVERY_WORKER_RESTARTED';
84
102
  item.error = 'Service restarted during recovery; exact runtime ownership will be reconciled before retry.';
@@ -86,7 +104,7 @@ export class TmuxRecoveryOperationStore {
86
104
  }
87
105
  }
88
106
  if (!terminalState(operation.state) && !operation.paused)
89
- operation.state = 'queued';
107
+ operation.state = operation.items.some(item => item.state === 'paused' && item.pauseReason === 'resources') ? 'paused' : 'queued';
90
108
  operation.updatedAt = recovered ? now : operation.updatedAt;
91
109
  }
92
110
  if (recovered)
@@ -109,7 +127,7 @@ export class TmuxRecoveryOperationStore {
109
127
  ? { ...input.scope, sessionIds: [...new Set(input.scope.sessionIds ?? [])].sort() }
110
128
  : structuredClone(input.scope);
111
129
  const fingerprint = requestHash({ incidentId: input.incidentId, sessionIds, scope, concurrency });
112
- const existingKey = this.state.operations.find(operation => operation.idempotencyKey === input.idempotencyKey);
130
+ const existingKey = this.state.operations.find(operation => operation.idempotencyKey === input.idempotencyKey || operation.idempotencyKeyAliases?.includes(input.idempotencyKey));
113
131
  if (existingKey) {
114
132
  if (existingKey.requestHash !== fingerprint)
115
133
  throw new TmuxRecoveryOperationError('IDEMPOTENCY_CONFLICT', 'The idempotency key was already used for a different recovery request.');
@@ -118,9 +136,19 @@ export class TmuxRecoveryOperationStore {
118
136
  if (this.state.operations.length >= 2000)
119
137
  throw new TmuxRecoveryOperationError('RECOVERY_OPERATION_LIMIT', 'Recovery operation history is full; archive diagnostics before creating another operation.');
120
138
  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);
139
+ && operation.requestHash === fingerprint
140
+ && operation.items.some(item => sessionIds.includes(item.sessionId) && (item.state === 'queued' || item.state === 'resource_wait' || item.state === 'paused' || item.state === 'running')));
141
+ if (inProgress) {
142
+ inProgress.idempotencyKeyAliases = [...new Set([...(inProgress.idempotencyKeyAliases ?? []), input.idempotencyKey])];
143
+ inProgress.updatedAt = Date.now();
144
+ await this.persist();
145
+ this.emit();
146
+ return structuredClone(inProgress);
147
+ }
148
+ const overlapping = this.state.operations.find(operation => !terminalState(operation.state)
149
+ && operation.items.some(item => sessionIds.includes(item.sessionId) && (item.state === 'queued' || item.state === 'resource_wait' || item.state === 'paused' || item.state === 'running')));
150
+ if (overlapping)
151
+ throw new TmuxRecoveryOperationError('RECOVERY_SESSION_IN_PROGRESS', 'At least one selected session is already in a recovery operation.', overlapping.id);
124
152
  const now = Date.now();
125
153
  const operation = {
126
154
  id: randomUUID(), incidentId: input.incidentId, idempotencyKey: input.idempotencyKey,
@@ -157,6 +185,13 @@ export class TmuxRecoveryOperationStore {
157
185
  return null;
158
186
  if (!terminalState(operation.state)) {
159
187
  operation.paused = true;
188
+ operation.pauseReason = 'manual';
189
+ for (const item of operation.items) {
190
+ if (item.state === 'queued' || item.state === 'resource_wait' || (item.state === 'paused' && item.pauseReason === 'resources')) {
191
+ item.state = 'paused';
192
+ item.pauseReason = 'manual';
193
+ }
194
+ }
160
195
  operation.state = 'paused';
161
196
  operation.updatedAt = Date.now();
162
197
  await this.persist();
@@ -170,7 +205,16 @@ export class TmuxRecoveryOperationStore {
170
205
  return null;
171
206
  if (!terminalState(operation.state)) {
172
207
  operation.paused = false;
173
- operation.state = 'queued';
208
+ operation.pauseReason = undefined;
209
+ for (const item of operation.items) {
210
+ if (item.state === 'paused' && item.pauseReason === 'manual') {
211
+ item.state = item.resourceWaitReason ? 'paused' : 'queued';
212
+ item.pauseReason = item.resourceWaitReason ? 'resources' : undefined;
213
+ }
214
+ }
215
+ const waitingForResources = operation.items.some(item => item.state === 'paused' && item.pauseReason === 'resources');
216
+ operation.state = waitingForResources ? 'paused' : 'queued';
217
+ operation.pauseReason = waitingForResources ? 'resources' : undefined;
174
218
  operation.updatedAt = Date.now();
175
219
  await this.persist();
176
220
  this.emit();
@@ -184,7 +228,8 @@ export class TmuxRecoveryOperationStore {
184
228
  const lastCompleted = [...items].filter(item => item.completedAt !== null).sort((a, b) => (b.completedAt ?? 0) - (a.completedAt ?? 0))[0];
185
229
  return {
186
230
  queued: items.filter(item => item.state === 'queued').length,
187
- resource_wait: items.filter(item => item.state === 'resource_wait').length,
231
+ paused: items.filter(item => item.state === 'paused' || item.state === 'resource_wait').length,
232
+ resource_wait: items.filter(item => item.state === 'resource_wait' || (item.state === 'paused' && item.pauseReason === 'resources')).length,
188
233
  running: items.filter(item => item.state === 'running').length,
189
234
  activeLaunches: this.active,
190
235
  lastCompletedAt: lastCompleted?.completedAt ?? null,
@@ -213,8 +258,8 @@ export class TmuxRecoveryOperationStore {
213
258
  while (this.active < this.concurrencyLimit) {
214
259
  const candidate = this.state.operations.find(operation => !operation.paused && !terminalState(operation.state)
215
260
  && 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}`));
261
+ && operation.items.some(item => (item.state === 'queued' || item.state === 'resource_wait' || (item.state === 'paused' && item.pauseReason === 'resources')) && !deferred.has(`${operation.id}:${item.sessionId}`)));
262
+ const item = candidate?.items.find(entry => (entry.state === 'queued' || entry.state === 'resource_wait' || (entry.state === 'paused' && entry.pauseReason === 'resources')) && !deferred.has(`${candidate.id}:${entry.sessionId}`));
218
263
  if (!candidate || !item)
219
264
  break;
220
265
  if (this.admission) {
@@ -228,10 +273,12 @@ export class TmuxRecoveryOperationStore {
228
273
  item.memAvailableBytes = admission.memAvailableBytes;
229
274
  item.estimatedRssBytes = admission.estimatedRssBytes ?? item.estimatedRssBytes;
230
275
  if (!admission.admitted) {
231
- item.state = 'resource_wait';
276
+ item.state = 'paused';
277
+ item.pauseReason = 'resources';
232
278
  item.phase = 'resource_wait';
233
279
  item.resourceWaitReason = admission.reason ?? 'Resource budget is not currently available.';
234
- candidate.state = 'resource_wait';
280
+ candidate.pauseReason = 'resources';
281
+ candidate.state = candidate.items.some(candidateItem => candidateItem.state === 'running') ? 'running' : 'paused';
235
282
  candidate.updatedAt = Date.now();
236
283
  deferred.add(`${candidate.id}:${item.sessionId}`);
237
284
  await this.persist();
@@ -239,6 +286,8 @@ export class TmuxRecoveryOperationStore {
239
286
  continue;
240
287
  }
241
288
  item.resourceWaitReason = undefined;
289
+ item.pauseReason = undefined;
290
+ candidate.pauseReason = candidate.items.some(candidateItem => candidateItem.state === 'paused' && candidateItem.pauseReason === 'resources' && candidateItem !== item) ? 'resources' : undefined;
242
291
  }
243
292
  if (candidate.paused)
244
293
  break;
@@ -255,7 +304,7 @@ export class TmuxRecoveryOperationStore {
255
304
  void this.execute(candidate, item);
256
305
  }
257
306
  if (this.state.operations.some(operation => !operation.paused && !terminalState(operation.state)
258
- && operation.items.some(item => item.state === 'resource_wait'))) {
307
+ && operation.items.some(item => item.state === 'resource_wait' || (item.state === 'paused' && item.pauseReason === 'resources')))) {
259
308
  const retry = setTimeout(() => void this.pump(), 5_000);
260
309
  retry.unref?.();
261
310
  }
@@ -299,15 +348,20 @@ export class TmuxRecoveryOperationStore {
299
348
  finally {
300
349
  item.completedAt = Date.now();
301
350
  operation.updatedAt = item.completedAt;
302
- const hasPending = operation.items.some(candidate => candidate.state === 'queued' || candidate.state === 'resource_wait' || candidate.state === 'running');
351
+ const hasPending = operation.items.some(candidate => candidate.state === 'queued' || candidate.state === 'resource_wait' || candidate.state === 'paused' || candidate.state === 'running');
303
352
  if (!hasPending) {
304
353
  operation.paused = false;
354
+ operation.pauseReason = undefined;
305
355
  operation.state = operation.items.some(candidate => candidate.state === 'failed') ? 'partial_failure' : 'succeeded';
306
356
  }
307
357
  else {
308
358
  operation.state = operation.paused ? 'paused'
309
359
  : operation.items.some(candidate => candidate.state === 'running') ? 'running'
310
- : operation.items.some(candidate => candidate.state === 'queued') ? 'queued' : 'resource_wait';
360
+ : operation.items.some(candidate => candidate.state === 'queued') ? 'queued' : 'paused';
361
+ if (operation.paused)
362
+ operation.pauseReason = 'manual';
363
+ else if (!operation.items.some(candidate => candidate.state === 'running' || candidate.state === 'queued'))
364
+ operation.pauseReason = 'resources';
311
365
  }
312
366
  this.active = Math.max(0, this.active - 1);
313
367
  try {
@@ -0,0 +1,35 @@
1
+ # Running Termdock under systemd
2
+
3
+ When a systemd unit starts `td --supervise`, set `KillMode=process` if its
4
+ Termdock-managed tmux sessions and Agents must survive a Termdock service or
5
+ supervisor restart. systemd's default `KillMode=control-group` sends the stop
6
+ signal to the entire unit cgroup; that includes tmux servers and Agent
7
+ processes started by Termdock. It can therefore turn a service restart into a
8
+ simultaneous shutdown of every managed Agent.
9
+
10
+ The repository ships
11
+ [`10-preserve-tmux.conf`](../packaging/systemd/termdock.service.d/10-preserve-tmux.conf)
12
+ as a drop-in fragment. Install it under the drop-in directory for the unit
13
+ that runs Termdock (the example path assumes `termdock.service`):
14
+
15
+ ```sh
16
+ sudo install -D -m 0644 packaging/systemd/termdock.service.d/10-preserve-tmux.conf \
17
+ /etc/systemd/system/termdock.service.d/10-preserve-tmux.conf
18
+ sudo systemctl daemon-reload
19
+ systemctl show termdock.service -p KillMode
20
+ ```
21
+
22
+ The final command should report `KillMode=process`. If the unit has a different
23
+ name, use its matching `/etc/systemd/system/<unit>.service.d/` directory and
24
+ verify that unit.
25
+
26
+ This setting intentionally leaves tmux workloads alive when systemd stops the
27
+ Termdock main process. Before permanently removing the service or host, close
28
+ or release managed sessions through Termdock's session lifecycle and verify
29
+ that the runtime inventory is empty. Do not use `systemctl kill` or restore
30
+ `KillMode=control-group` as a way to clean up Agent sessions; those actions can
31
+ terminate unrelated work in the unit.
32
+
33
+ This is a process-manager boundary, separate from recovery queue admission.
34
+ Termdock will not terminate non-Termdock processes to satisfy its memory or
35
+ resident-Agent budget.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "termdock",
3
- "version": "1.4.325",
3
+ "version": "1.4.327",
4
4
  "description": "A complete web-based terminal application with modern UI",
5
5
  "type": "module",
6
6
  "main": ".desktop-dist/main.js",
@@ -16,6 +16,8 @@
16
16
  "dist",
17
17
  "runtime-manifest.json",
18
18
  "README.md",
19
+ "docs/systemd.md",
20
+ "packaging/systemd/termdock.service.d/10-preserve-tmux.conf",
19
21
  "LICENSE",
20
22
  "scripts",
21
23
  "docs/integrations.md"
@@ -0,0 +1,5 @@
1
+ # Install as a drop-in for the unit that runs `td --supervise`.
2
+ # Termdock-managed tmux sessions are independent runtime workloads and must
3
+ # survive a supervisor/service process restart.
4
+ [Service]
5
+ KillMode=process
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "packageName": "termdock",
4
- "version": "1.4.325",
4
+ "version": "1.4.327",
5
5
  "runtimeProtocolVersion": 1,
6
6
  "minimumDesktopVersion": "1.4.46",
7
7
  "nodeMajor": 22,
8
8
  "dependencyHash": "sha256-oaGYi/P5ob8sd6VnNBOwshKozjhdV+hYiCmLAsn5x00=",
9
- "serverBundleHash": "sha256-lFOekSTHpHZrRuNcWm20UDGwKSjiviUQKjaT/zSYBvc=",
10
- "clientBundleHash": "sha256-RVhKCGWk1bExA0aa9FHB8dutqDr/aCkALgScfT+IS80=",
9
+ "serverBundleHash": "sha256-8rbCJEWANeXtZp/cvJ7UT9tGunnkMMxL7mcvARckvLQ=",
10
+ "clientBundleHash": "sha256-c+kY8sLmG3zeMRdXsCgqDWaIqC7vboMYVHsXMgZcbHU=",
11
11
  "entrypoint": "dist/server/cli.js",
12
12
  "clientEntrypoint": "dist/client/index.html"
13
13
  }