termdock 1.4.324 → 1.4.326

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 (349) hide show
  1. package/dist/client/assets/App-DrnLToMO.js +186 -0
  2. package/dist/client/assets/App-DrnLToMO.js.br +0 -0
  3. package/dist/client/assets/App-DrnLToMO.js.gz +0 -0
  4. package/dist/client/assets/ArchitecturePanel-CGjioSu0.js +9 -0
  5. package/dist/client/assets/ArchitecturePanel-CGjioSu0.js.br +0 -0
  6. package/dist/client/assets/ArchitecturePanel-CGjioSu0.js.gz +0 -0
  7. package/dist/client/assets/{ChangeWalkthroughPanel-CKIG8diY.js → ChangeWalkthroughPanel-BsG5tR4F.js} +2 -2
  8. package/dist/client/assets/ChangeWalkthroughPanel-BsG5tR4F.js.br +0 -0
  9. package/dist/client/assets/ChangeWalkthroughPanel-BsG5tR4F.js.gz +0 -0
  10. package/dist/client/assets/{CollaborationMainWorkspace-CIq-JAbF.js → CollaborationMainWorkspace-KMTTUtsp.js} +1 -1
  11. package/dist/client/assets/CollaborationMainWorkspace-KMTTUtsp.js.br +0 -0
  12. package/dist/client/assets/CollaborationMainWorkspace-KMTTUtsp.js.gz +0 -0
  13. package/dist/client/assets/CollaborationTaskContent-D-qPRh4f.js +2 -0
  14. package/dist/client/assets/ComputerControlView-Bh3aWVA-.js +5 -0
  15. package/dist/client/assets/ComputerControlView-Bh3aWVA-.js.br +0 -0
  16. package/dist/client/assets/ComputerControlView-Bh3aWVA-.js.gz +0 -0
  17. package/dist/client/assets/{DagPlayground-BxocNRPm.js → DagPlayground-761ejCr8.js} +1 -1
  18. package/dist/client/assets/DagPlayground-761ejCr8.js.br +0 -0
  19. package/dist/client/assets/DagPlayground-761ejCr8.js.gz +0 -0
  20. package/dist/client/assets/{DiffLab-COGOFO0s.js → DiffLab-yWG9ju3P.js} +2 -2
  21. package/dist/client/assets/DiffLab-yWG9ju3P.js.br +0 -0
  22. package/dist/client/assets/DiffLab-yWG9ju3P.js.gz +0 -0
  23. package/dist/client/assets/{DiffReview-5ERdwz1C.js → DiffReview-02640ofg.js} +1 -1
  24. package/dist/client/assets/DiffReview-02640ofg.js.br +0 -0
  25. package/dist/client/assets/DiffReview-02640ofg.js.gz +0 -0
  26. package/dist/client/assets/{DiffReviewLab-BSz9IND6.js → DiffReviewLab-D0W0SEIG.js} +1 -1
  27. package/dist/client/assets/DiffReviewLab-D0W0SEIG.js.br +0 -0
  28. package/dist/client/assets/DiffReviewLab-D0W0SEIG.js.gz +0 -0
  29. package/dist/client/assets/{DiffViewer-RT-p-ZBo.js → DiffViewer-CLjrE1oE.js} +8 -8
  30. package/dist/client/assets/DiffViewer-CLjrE1oE.js.br +0 -0
  31. package/dist/client/assets/DiffViewer-CLjrE1oE.js.gz +0 -0
  32. package/dist/client/assets/{ModelPreview-DI9anVWA.js → ModelPreview-BnIvn0Fn.js} +1 -1
  33. package/dist/client/assets/ModelPreview-BnIvn0Fn.js.br +0 -0
  34. package/dist/client/assets/ModelPreview-BnIvn0Fn.js.gz +0 -0
  35. package/dist/client/assets/{RightSidebar-DOLn8R7c.js → RightSidebar-Dx4Jf94o.js} +27 -27
  36. package/dist/client/assets/RightSidebar-Dx4Jf94o.js.br +0 -0
  37. package/dist/client/assets/RightSidebar-Dx4Jf94o.js.gz +0 -0
  38. package/dist/client/assets/{abnfDiagram-VCTEODGH-CXd0unH5.js → abnfDiagram-VCTEODGH-C-k_lOuF.js} +1 -1
  39. package/dist/client/assets/abnfDiagram-VCTEODGH-C-k_lOuF.js.br +0 -0
  40. package/dist/client/assets/abnfDiagram-VCTEODGH-C-k_lOuF.js.gz +0 -0
  41. package/dist/client/assets/app-DNdmWYEJ.js +35 -0
  42. package/dist/client/assets/app-DNdmWYEJ.js.br +0 -0
  43. package/dist/client/assets/app-DNdmWYEJ.js.gz +0 -0
  44. package/dist/client/assets/{arc-DCqJmX8M.js → arc-DvBgO2ML.js} +1 -1
  45. package/dist/client/assets/arc-DvBgO2ML.js.br +0 -0
  46. package/dist/client/assets/arc-DvBgO2ML.js.gz +0 -0
  47. package/dist/client/assets/{architectureDiagram-5GKGNRK7-DGu_m54H.js → architectureDiagram-5GKGNRK7-BrZRHTn8.js} +1 -1
  48. package/dist/client/assets/architectureDiagram-5GKGNRK7-BrZRHTn8.js.br +0 -0
  49. package/dist/client/assets/architectureDiagram-5GKGNRK7-BrZRHTn8.js.gz +0 -0
  50. package/dist/client/assets/{blockDiagram-I7D4REHJ-BI0gsxDN.js → blockDiagram-I7D4REHJ-DuvUrrD4.js} +1 -1
  51. package/dist/client/assets/blockDiagram-I7D4REHJ-DuvUrrD4.js.br +0 -0
  52. package/dist/client/assets/blockDiagram-I7D4REHJ-DuvUrrD4.js.gz +0 -0
  53. package/dist/client/assets/{c4Diagram-7LVT6UL2-Ct3xzGtD.js → c4Diagram-7LVT6UL2-BHM4QTZx.js} +1 -1
  54. package/dist/client/assets/c4Diagram-7LVT6UL2-BHM4QTZx.js.br +0 -0
  55. package/dist/client/assets/c4Diagram-7LVT6UL2-BHM4QTZx.js.gz +0 -0
  56. package/dist/client/assets/channel-BqA2i16W.js +1 -0
  57. package/dist/client/assets/{chunk-2Q5K7J3B-BPd2UShA.js → chunk-2Q5K7J3B-TnQro6-_.js} +1 -1
  58. package/dist/client/assets/{chunk-5VM5RSS4-CoFZ5Fo3.js → chunk-5VM5RSS4-Vl8qqZf_.js} +1 -1
  59. package/dist/client/assets/{chunk-F27PBJKO-C5gZrGp4.js → chunk-F27PBJKO-DH6GfEdY.js} +1 -1
  60. package/dist/client/assets/chunk-F27PBJKO-DH6GfEdY.js.br +0 -0
  61. package/dist/client/assets/chunk-F27PBJKO-DH6GfEdY.js.gz +0 -0
  62. package/dist/client/assets/{chunk-IMKFNOWR-GW8b9ya-.js → chunk-IMKFNOWR-DpKvDckf.js} +1 -1
  63. package/dist/client/assets/chunk-IMKFNOWR-DpKvDckf.js.br +0 -0
  64. package/dist/client/assets/chunk-IMKFNOWR-DpKvDckf.js.gz +0 -0
  65. package/dist/client/assets/{chunk-JWPE2WC7-GpMoViQf.js → chunk-JWPE2WC7-DP773yal.js} +1 -1
  66. package/dist/client/assets/{chunk-POPQ4Y6H-C_vgVPaw.js → chunk-POPQ4Y6H-BoR9GKji.js} +1 -1
  67. package/dist/client/assets/{chunk-SVP7TREG-bA7RXwWn.js → chunk-SVP7TREG-DFbN0Uvp.js} +1 -1
  68. package/dist/client/assets/chunk-SVP7TREG-DFbN0Uvp.js.br +0 -0
  69. package/dist/client/assets/chunk-SVP7TREG-DFbN0Uvp.js.gz +0 -0
  70. package/dist/client/assets/{chunk-TICWLB2K-BG8DAtll.js → chunk-TICWLB2K-BCoshST2.js} +1 -1
  71. package/dist/client/assets/chunk-TICWLB2K-BCoshST2.js.br +0 -0
  72. package/dist/client/assets/chunk-TICWLB2K-BCoshST2.js.gz +0 -0
  73. package/dist/client/assets/{chunk-XXDRQBXY-Ces56sud.js → chunk-XXDRQBXY-DMAOtV4y.js} +1 -1
  74. package/dist/client/assets/classDiagram-ZZMXUADV-ChnKE-K2.js +1 -0
  75. package/dist/client/assets/classDiagram-v2-VYDZK3BY-ChnKE-K2.js +1 -0
  76. package/dist/client/assets/{cose-bilkent-JH36ORCC-Bwch0qL5.js → cose-bilkent-JH36ORCC-BlsyBXEx.js} +1 -1
  77. package/dist/client/assets/cose-bilkent-JH36ORCC-BlsyBXEx.js.br +0 -0
  78. package/dist/client/assets/{cose-bilkent-JH36ORCC-Bwch0qL5.js.gz → cose-bilkent-JH36ORCC-BlsyBXEx.js.gz} +0 -0
  79. package/dist/client/assets/{cynefin-OW5HDTMX-CrAXyA2Z.js → cynefin-OW5HDTMX-Btg93pC8.js} +1 -1
  80. package/dist/client/assets/cynefin-OW5HDTMX-Btg93pC8.js.br +0 -0
  81. package/dist/client/assets/cynefin-OW5HDTMX-Btg93pC8.js.gz +0 -0
  82. package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-YlP0Q93l.js → cynefinDiagram-5FMLGOSQ-TenkE0c6.js} +1 -1
  83. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-TenkE0c6.js.br +0 -0
  84. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-TenkE0c6.js.gz +0 -0
  85. package/dist/client/assets/{dagre-GXQ25YYZ-CZ4XcPK9.js → dagre-GXQ25YYZ-BPYSZagf.js} +1 -1
  86. package/dist/client/assets/dagre-GXQ25YYZ-BPYSZagf.js.br +0 -0
  87. package/dist/client/assets/dagre-GXQ25YYZ-BPYSZagf.js.gz +0 -0
  88. package/dist/client/assets/{diagram-S7CK7UJ4-c_8HfHGA.js → diagram-S7CK7UJ4-BrJ04LYZ.js} +1 -1
  89. package/dist/client/assets/{diagram-S7CK7UJ4-c_8HfHGA.js.br → diagram-S7CK7UJ4-BrJ04LYZ.js.br} +0 -0
  90. package/dist/client/assets/diagram-S7CK7UJ4-BrJ04LYZ.js.gz +0 -0
  91. package/dist/client/assets/{diagram-UQ7AKVKN-BGtRfxMR.js → diagram-UQ7AKVKN-DFHufHof.js} +1 -1
  92. package/dist/client/assets/diagram-UQ7AKVKN-DFHufHof.js.br +0 -0
  93. package/dist/client/assets/diagram-UQ7AKVKN-DFHufHof.js.gz +0 -0
  94. package/dist/client/assets/{diagram-VSXAHHWV-_9yZnhuv.js → diagram-VSXAHHWV-CFidKRGl.js} +1 -1
  95. package/dist/client/assets/diagram-VSXAHHWV-CFidKRGl.js.br +0 -0
  96. package/dist/client/assets/diagram-VSXAHHWV-CFidKRGl.js.gz +0 -0
  97. package/dist/client/assets/{diagram-VX7I27RA-C_mnc4_u.js → diagram-VX7I27RA-C8arbI7W.js} +1 -1
  98. package/dist/client/assets/diagram-VX7I27RA-C8arbI7W.js.br +0 -0
  99. package/dist/client/assets/diagram-VX7I27RA-C8arbI7W.js.gz +0 -0
  100. package/dist/client/assets/{diagram-Z3DM3KII-sZ_AiSpj.js → diagram-Z3DM3KII-fMLMbGcS.js} +1 -1
  101. package/dist/client/assets/diagram-Z3DM3KII-fMLMbGcS.js.br +0 -0
  102. package/dist/client/assets/diagram-Z3DM3KII-fMLMbGcS.js.gz +0 -0
  103. package/dist/client/assets/{ebnfDiagram-PWID7BFC-Dm-BXeqS.js → ebnfDiagram-PWID7BFC-BjBUR2zi.js} +1 -1
  104. package/dist/client/assets/ebnfDiagram-PWID7BFC-BjBUR2zi.js.br +0 -0
  105. package/dist/client/assets/ebnfDiagram-PWID7BFC-BjBUR2zi.js.gz +0 -0
  106. package/dist/client/assets/{erDiagram-RLTQ6QDP-Dz4cBepd.js → erDiagram-RLTQ6QDP-BVDyIbY-.js} +1 -1
  107. package/dist/client/assets/erDiagram-RLTQ6QDP-BVDyIbY-.js.br +0 -0
  108. package/dist/client/assets/erDiagram-RLTQ6QDP-BVDyIbY-.js.gz +0 -0
  109. package/dist/client/assets/{flowDiagram-HODETNUW-CbRG8-WW.js → flowDiagram-HODETNUW-Dej14Ugo.js} +1 -1
  110. package/dist/client/assets/flowDiagram-HODETNUW-Dej14Ugo.js.br +0 -0
  111. package/dist/client/assets/flowDiagram-HODETNUW-Dej14Ugo.js.gz +0 -0
  112. package/dist/client/assets/{ganttDiagram-EL5Y4UJY-CmBXWlr0.js → ganttDiagram-EL5Y4UJY-4q8Cv5Jl.js} +1 -1
  113. package/dist/client/assets/ganttDiagram-EL5Y4UJY-4q8Cv5Jl.js.br +0 -0
  114. package/dist/client/assets/ganttDiagram-EL5Y4UJY-4q8Cv5Jl.js.gz +0 -0
  115. package/dist/client/assets/{gestureArbiter-B26W6rS7.js → gestureArbiter-q3jASYgN.js} +1 -1
  116. package/dist/client/assets/gestureArbiter-q3jASYgN.js.br +0 -0
  117. package/dist/client/assets/gestureArbiter-q3jASYgN.js.gz +0 -0
  118. package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-JW5QMYEk.js → gitGraphDiagram-WWUBYQGX-DnE330VW.js} +1 -1
  119. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DnE330VW.js.br +0 -0
  120. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DnE330VW.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-CsA6WdPn.js → infoDiagram-27XIBGKW-BJyKPHsP.js} +1 -1
  125. package/dist/client/assets/{ishikawaDiagram-5VMMS53U-CsKPUwTw.js → ishikawaDiagram-5VMMS53U-CJV8ONjw.js} +1 -1
  126. package/dist/client/assets/ishikawaDiagram-5VMMS53U-CJV8ONjw.js.br +0 -0
  127. package/dist/client/assets/ishikawaDiagram-5VMMS53U-CJV8ONjw.js.gz +0 -0
  128. package/dist/client/assets/{journeyDiagram-3NMN7TZE-DpN98gN0.js → journeyDiagram-3NMN7TZE-C_dzPksa.js} +1 -1
  129. package/dist/client/assets/journeyDiagram-3NMN7TZE-C_dzPksa.js.br +0 -0
  130. package/dist/client/assets/journeyDiagram-3NMN7TZE-C_dzPksa.js.gz +0 -0
  131. package/dist/client/assets/{kanban-definition-UXKFOSKX-RHO--43O.js → kanban-definition-UXKFOSKX-05lEbrKo.js} +1 -1
  132. package/dist/client/assets/kanban-definition-UXKFOSKX-05lEbrKo.js.br +0 -0
  133. package/dist/client/assets/kanban-definition-UXKFOSKX-05lEbrKo.js.gz +0 -0
  134. package/dist/client/assets/{layout-Cm_prknW.js → layout-CV4xlefz.js} +1 -1
  135. package/dist/client/assets/{layout-Cm_prknW.js.br → layout-CV4xlefz.js.br} +0 -0
  136. package/dist/client/assets/layout-CV4xlefz.js.gz +0 -0
  137. package/dist/client/assets/{linear-BVAsPkvS.js → linear-Ne3ggM1q.js} +1 -1
  138. package/dist/client/assets/linear-Ne3ggM1q.js.br +0 -0
  139. package/dist/client/assets/linear-Ne3ggM1q.js.gz +0 -0
  140. package/dist/client/assets/{mermaid.core-ufe77Xaz.js → mermaid.core-CAOB7F_V.js} +5 -5
  141. package/dist/client/assets/mermaid.core-CAOB7F_V.js.br +0 -0
  142. package/dist/client/assets/mermaid.core-CAOB7F_V.js.gz +0 -0
  143. package/dist/client/assets/{mindmap-definition-YA3MSWOX-CRyy1U2d.js → mindmap-definition-YA3MSWOX-BWwXAlmP.js} +1 -1
  144. package/dist/client/assets/mindmap-definition-YA3MSWOX-BWwXAlmP.js.br +0 -0
  145. package/dist/client/assets/mindmap-definition-YA3MSWOX-BWwXAlmP.js.gz +0 -0
  146. package/dist/client/assets/passwordBootstrap-Cm1ye6eX.js +2 -0
  147. package/dist/client/assets/passwordBootstrap-Cm1ye6eX.js.br +0 -0
  148. package/dist/client/assets/passwordBootstrap-Cm1ye6eX.js.gz +0 -0
  149. package/dist/client/assets/{pegDiagram-XKGWAZYB-DSHgdU9q.js → pegDiagram-XKGWAZYB-DKhyr6CD.js} +1 -1
  150. package/dist/client/assets/pegDiagram-XKGWAZYB-DKhyr6CD.js.br +0 -0
  151. package/dist/client/assets/pegDiagram-XKGWAZYB-DKhyr6CD.js.gz +0 -0
  152. package/dist/client/assets/{pieDiagram-E7YTZNPT-lIUeAuhN.js → pieDiagram-E7YTZNPT-h2Q03QIh.js} +1 -1
  153. package/dist/client/assets/pieDiagram-E7YTZNPT-h2Q03QIh.js.br +0 -0
  154. package/dist/client/assets/pieDiagram-E7YTZNPT-h2Q03QIh.js.gz +0 -0
  155. package/dist/client/assets/{quadrantDiagram-AXDQQJYC-CIgG9vBX.js → quadrantDiagram-AXDQQJYC-CWxDTEGF.js} +1 -1
  156. package/dist/client/assets/quadrantDiagram-AXDQQJYC-CWxDTEGF.js.br +0 -0
  157. package/dist/client/assets/quadrantDiagram-AXDQQJYC-CWxDTEGF.js.gz +0 -0
  158. package/dist/client/assets/{railroadDiagram-O6MQD6OU-DjP8oesA.js → railroadDiagram-O6MQD6OU-BY5sm6Td.js} +1 -1
  159. package/dist/client/assets/railroadDiagram-O6MQD6OU-BY5sm6Td.js.br +0 -0
  160. package/dist/client/assets/railroadDiagram-O6MQD6OU-BY5sm6Td.js.gz +0 -0
  161. package/dist/client/assets/rdpSession-CWvrHSd8.js +1 -0
  162. package/dist/client/assets/rdpSession-CWvrHSd8.js.br +0 -0
  163. package/dist/client/assets/rdpSession-CWvrHSd8.js.gz +0 -0
  164. package/dist/client/assets/{referenceLongPress-DBJnfFHa.js → referenceLongPress-5uMCEptL.js} +1 -1
  165. package/dist/client/assets/referenceLongPress-5uMCEptL.js.br +0 -0
  166. package/dist/client/assets/referenceLongPress-5uMCEptL.js.gz +0 -0
  167. package/dist/client/assets/{requirementDiagram-BXWQKSXE-Dbvu6IC_.js → requirementDiagram-BXWQKSXE-D8IK92YE.js} +1 -1
  168. package/dist/client/assets/requirementDiagram-BXWQKSXE-D8IK92YE.js.br +0 -0
  169. package/dist/client/assets/requirementDiagram-BXWQKSXE-D8IK92YE.js.gz +0 -0
  170. package/dist/client/assets/{sankeyDiagram-P5KCCOFB-1mZ4s-lv.js → sankeyDiagram-P5KCCOFB-NkH3NrGx.js} +1 -1
  171. package/dist/client/assets/{sankeyDiagram-P5KCCOFB-1mZ4s-lv.js.br → sankeyDiagram-P5KCCOFB-NkH3NrGx.js.br} +0 -0
  172. package/dist/client/assets/sankeyDiagram-P5KCCOFB-NkH3NrGx.js.gz +0 -0
  173. package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-Cu3hhzlV.js → sequenceDiagram-WJ2MYXX4-DieLFBCA.js} +1 -1
  174. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-DieLFBCA.js.br +0 -0
  175. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-DieLFBCA.js.gz +0 -0
  176. package/dist/client/assets/{sizeCapture-INFHLROL-xfm69HlR.js → sizeCapture-INFHLROL-C-rwOQvA.js} +1 -1
  177. package/dist/client/assets/sizeCapture-INFHLROL-C-rwOQvA.js.br +0 -0
  178. package/dist/client/assets/sizeCapture-INFHLROL-C-rwOQvA.js.gz +0 -0
  179. package/dist/client/assets/{sparkles-CDonlwGu.js → sparkles-Cku-tzxx.js} +1 -1
  180. package/dist/client/assets/{stateDiagram-D77RDMKH-u-bh6mDK.js → stateDiagram-D77RDMKH-C7mgOyy6.js} +1 -1
  181. package/dist/client/assets/stateDiagram-D77RDMKH-C7mgOyy6.js.br +0 -0
  182. package/dist/client/assets/stateDiagram-D77RDMKH-C7mgOyy6.js.gz +0 -0
  183. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-BDWPsG19.js +1 -0
  184. package/dist/client/assets/{swimlanes-42K2YHIH-U8WN__SO.js → swimlanes-42K2YHIH-C4aAuzlE.js} +1 -1
  185. package/dist/client/assets/swimlanes-42K2YHIH-C4aAuzlE.js.br +0 -0
  186. package/dist/client/assets/swimlanes-42K2YHIH-C4aAuzlE.js.gz +0 -0
  187. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-DE8jpsjW.js +8 -0
  188. package/dist/client/assets/{timeline-definition-24CTP7MA-CMsoNo4F.js → timeline-definition-24CTP7MA-CKntrnOJ.js} +1 -1
  189. package/dist/client/assets/timeline-definition-24CTP7MA-CKntrnOJ.js.br +0 -0
  190. package/dist/client/assets/timeline-definition-24CTP7MA-CKntrnOJ.js.gz +0 -0
  191. package/dist/client/assets/{triangle-alert-BgErMO2V.js → triangle-alert-DPNiOY7C.js} +1 -1
  192. package/dist/client/assets/{vennDiagram-4TSXK5OY-CPE6pVwh.js → vennDiagram-4TSXK5OY-W9jedFfD.js} +1 -1
  193. package/dist/client/assets/vennDiagram-4TSXK5OY-W9jedFfD.js.br +0 -0
  194. package/dist/client/assets/vennDiagram-4TSXK5OY-W9jedFfD.js.gz +0 -0
  195. package/dist/client/assets/{videoCompression-BWkZvEjM.js → videoCompression-BYHN4Eba.js} +1 -1
  196. package/dist/client/assets/videoCompression-BYHN4Eba.js.br +0 -0
  197. package/dist/client/assets/videoCompression-BYHN4Eba.js.gz +0 -0
  198. package/dist/client/assets/{wardleyDiagram-VM6X3IG4-4lWd-R4N.js → wardleyDiagram-VM6X3IG4-CzvXMjBC.js} +1 -1
  199. package/dist/client/assets/wardleyDiagram-VM6X3IG4-CzvXMjBC.js.br +0 -0
  200. package/dist/client/assets/wardleyDiagram-VM6X3IG4-CzvXMjBC.js.gz +0 -0
  201. package/dist/client/assets/{xychartDiagram-S5SC5T6Z-CpKJMCWV.js → xychartDiagram-S5SC5T6Z-VD8CKhIU.js} +1 -1
  202. package/dist/client/assets/xychartDiagram-S5SC5T6Z-VD8CKhIU.js.br +0 -0
  203. package/dist/client/assets/xychartDiagram-S5SC5T6Z-VD8CKhIU.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 +132 -2
  211. package/dist/server/routes/terminal.js +233 -65
  212. package/dist/server/utils/hostResources.js +163 -0
  213. package/dist/server/utils/tmuxRecoveryOperations.js +402 -0
  214. package/package.json +1 -1
  215. package/runtime-manifest.json +3 -3
  216. package/dist/client/assets/App-7IUcmCLC.js +0 -186
  217. package/dist/client/assets/App-7IUcmCLC.js.br +0 -0
  218. package/dist/client/assets/App-7IUcmCLC.js.gz +0 -0
  219. package/dist/client/assets/ArchitecturePanel-CUAB0wFe.js +0 -9
  220. package/dist/client/assets/ArchitecturePanel-CUAB0wFe.js.br +0 -0
  221. package/dist/client/assets/ArchitecturePanel-CUAB0wFe.js.gz +0 -0
  222. package/dist/client/assets/ChangeWalkthroughPanel-CKIG8diY.js.br +0 -0
  223. package/dist/client/assets/ChangeWalkthroughPanel-CKIG8diY.js.gz +0 -0
  224. package/dist/client/assets/CollaborationMainWorkspace-CIq-JAbF.js.br +0 -0
  225. package/dist/client/assets/CollaborationMainWorkspace-CIq-JAbF.js.gz +0 -0
  226. package/dist/client/assets/CollaborationTaskContent-7vWDzH-d.js +0 -2
  227. package/dist/client/assets/ComputerControlView-CPSI-M86.js +0 -5
  228. package/dist/client/assets/ComputerControlView-CPSI-M86.js.br +0 -0
  229. package/dist/client/assets/ComputerControlView-CPSI-M86.js.gz +0 -0
  230. package/dist/client/assets/DagPlayground-BxocNRPm.js.br +0 -0
  231. package/dist/client/assets/DagPlayground-BxocNRPm.js.gz +0 -0
  232. package/dist/client/assets/DiffLab-COGOFO0s.js.br +0 -0
  233. package/dist/client/assets/DiffLab-COGOFO0s.js.gz +0 -0
  234. package/dist/client/assets/DiffReview-5ERdwz1C.js.br +0 -0
  235. package/dist/client/assets/DiffReview-5ERdwz1C.js.gz +0 -0
  236. package/dist/client/assets/DiffReviewLab-BSz9IND6.js.br +0 -0
  237. package/dist/client/assets/DiffReviewLab-BSz9IND6.js.gz +0 -0
  238. package/dist/client/assets/DiffViewer-RT-p-ZBo.js.br +0 -0
  239. package/dist/client/assets/DiffViewer-RT-p-ZBo.js.gz +0 -0
  240. package/dist/client/assets/ModelPreview-DI9anVWA.js.br +0 -0
  241. package/dist/client/assets/ModelPreview-DI9anVWA.js.gz +0 -0
  242. package/dist/client/assets/RightSidebar-DOLn8R7c.js.br +0 -0
  243. package/dist/client/assets/RightSidebar-DOLn8R7c.js.gz +0 -0
  244. package/dist/client/assets/abnfDiagram-VCTEODGH-CXd0unH5.js.br +0 -0
  245. package/dist/client/assets/abnfDiagram-VCTEODGH-CXd0unH5.js.gz +0 -0
  246. package/dist/client/assets/app-DCFOZi_L.js +0 -35
  247. package/dist/client/assets/app-DCFOZi_L.js.br +0 -0
  248. package/dist/client/assets/app-DCFOZi_L.js.gz +0 -0
  249. package/dist/client/assets/arc-DCqJmX8M.js.br +0 -0
  250. package/dist/client/assets/arc-DCqJmX8M.js.gz +0 -0
  251. package/dist/client/assets/architectureDiagram-5GKGNRK7-DGu_m54H.js.br +0 -0
  252. package/dist/client/assets/architectureDiagram-5GKGNRK7-DGu_m54H.js.gz +0 -0
  253. package/dist/client/assets/blockDiagram-I7D4REHJ-BI0gsxDN.js.br +0 -0
  254. package/dist/client/assets/blockDiagram-I7D4REHJ-BI0gsxDN.js.gz +0 -0
  255. package/dist/client/assets/c4Diagram-7LVT6UL2-Ct3xzGtD.js.br +0 -0
  256. package/dist/client/assets/c4Diagram-7LVT6UL2-Ct3xzGtD.js.gz +0 -0
  257. package/dist/client/assets/channel-BLSCUksA.js +0 -1
  258. package/dist/client/assets/chunk-F27PBJKO-C5gZrGp4.js.br +0 -0
  259. package/dist/client/assets/chunk-F27PBJKO-C5gZrGp4.js.gz +0 -0
  260. package/dist/client/assets/chunk-IMKFNOWR-GW8b9ya-.js.br +0 -0
  261. package/dist/client/assets/chunk-IMKFNOWR-GW8b9ya-.js.gz +0 -0
  262. package/dist/client/assets/chunk-SVP7TREG-bA7RXwWn.js.br +0 -0
  263. package/dist/client/assets/chunk-SVP7TREG-bA7RXwWn.js.gz +0 -0
  264. package/dist/client/assets/chunk-TICWLB2K-BG8DAtll.js.br +0 -0
  265. package/dist/client/assets/chunk-TICWLB2K-BG8DAtll.js.gz +0 -0
  266. package/dist/client/assets/classDiagram-ZZMXUADV-DkVIqOvw.js +0 -1
  267. package/dist/client/assets/classDiagram-v2-VYDZK3BY-DkVIqOvw.js +0 -1
  268. package/dist/client/assets/cose-bilkent-JH36ORCC-Bwch0qL5.js.br +0 -0
  269. package/dist/client/assets/cynefin-OW5HDTMX-CrAXyA2Z.js.br +0 -0
  270. package/dist/client/assets/cynefin-OW5HDTMX-CrAXyA2Z.js.gz +0 -0
  271. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-YlP0Q93l.js.br +0 -0
  272. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-YlP0Q93l.js.gz +0 -0
  273. package/dist/client/assets/dagre-GXQ25YYZ-CZ4XcPK9.js.br +0 -0
  274. package/dist/client/assets/dagre-GXQ25YYZ-CZ4XcPK9.js.gz +0 -0
  275. package/dist/client/assets/diagram-S7CK7UJ4-c_8HfHGA.js.gz +0 -0
  276. package/dist/client/assets/diagram-UQ7AKVKN-BGtRfxMR.js.br +0 -0
  277. package/dist/client/assets/diagram-UQ7AKVKN-BGtRfxMR.js.gz +0 -0
  278. package/dist/client/assets/diagram-VSXAHHWV-_9yZnhuv.js.br +0 -0
  279. package/dist/client/assets/diagram-VSXAHHWV-_9yZnhuv.js.gz +0 -0
  280. package/dist/client/assets/diagram-VX7I27RA-C_mnc4_u.js.br +0 -0
  281. package/dist/client/assets/diagram-VX7I27RA-C_mnc4_u.js.gz +0 -0
  282. package/dist/client/assets/diagram-Z3DM3KII-sZ_AiSpj.js.br +0 -0
  283. package/dist/client/assets/diagram-Z3DM3KII-sZ_AiSpj.js.gz +0 -0
  284. package/dist/client/assets/ebnfDiagram-PWID7BFC-Dm-BXeqS.js.br +0 -0
  285. package/dist/client/assets/ebnfDiagram-PWID7BFC-Dm-BXeqS.js.gz +0 -0
  286. package/dist/client/assets/erDiagram-RLTQ6QDP-Dz4cBepd.js.br +0 -0
  287. package/dist/client/assets/erDiagram-RLTQ6QDP-Dz4cBepd.js.gz +0 -0
  288. package/dist/client/assets/flowDiagram-HODETNUW-CbRG8-WW.js.br +0 -0
  289. package/dist/client/assets/flowDiagram-HODETNUW-CbRG8-WW.js.gz +0 -0
  290. package/dist/client/assets/ganttDiagram-EL5Y4UJY-CmBXWlr0.js.br +0 -0
  291. package/dist/client/assets/ganttDiagram-EL5Y4UJY-CmBXWlr0.js.gz +0 -0
  292. package/dist/client/assets/gestureArbiter-B26W6rS7.js.br +0 -0
  293. package/dist/client/assets/gestureArbiter-B26W6rS7.js.gz +0 -0
  294. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-JW5QMYEk.js.br +0 -0
  295. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-JW5QMYEk.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-CsKPUwTw.js.br +0 -0
  299. package/dist/client/assets/ishikawaDiagram-5VMMS53U-CsKPUwTw.js.gz +0 -0
  300. package/dist/client/assets/journeyDiagram-3NMN7TZE-DpN98gN0.js.br +0 -0
  301. package/dist/client/assets/journeyDiagram-3NMN7TZE-DpN98gN0.js.gz +0 -0
  302. package/dist/client/assets/kanban-definition-UXKFOSKX-RHO--43O.js.br +0 -0
  303. package/dist/client/assets/kanban-definition-UXKFOSKX-RHO--43O.js.gz +0 -0
  304. package/dist/client/assets/layout-Cm_prknW.js.gz +0 -0
  305. package/dist/client/assets/linear-BVAsPkvS.js.br +0 -0
  306. package/dist/client/assets/linear-BVAsPkvS.js.gz +0 -0
  307. package/dist/client/assets/mermaid.core-ufe77Xaz.js.br +0 -0
  308. package/dist/client/assets/mermaid.core-ufe77Xaz.js.gz +0 -0
  309. package/dist/client/assets/mindmap-definition-YA3MSWOX-CRyy1U2d.js.br +0 -0
  310. package/dist/client/assets/mindmap-definition-YA3MSWOX-CRyy1U2d.js.gz +0 -0
  311. package/dist/client/assets/passwordBootstrap-3_SIzSH7.js +0 -2
  312. package/dist/client/assets/passwordBootstrap-3_SIzSH7.js.br +0 -0
  313. package/dist/client/assets/passwordBootstrap-3_SIzSH7.js.gz +0 -0
  314. package/dist/client/assets/pegDiagram-XKGWAZYB-DSHgdU9q.js.br +0 -0
  315. package/dist/client/assets/pegDiagram-XKGWAZYB-DSHgdU9q.js.gz +0 -0
  316. package/dist/client/assets/pieDiagram-E7YTZNPT-lIUeAuhN.js.br +0 -0
  317. package/dist/client/assets/pieDiagram-E7YTZNPT-lIUeAuhN.js.gz +0 -0
  318. package/dist/client/assets/quadrantDiagram-AXDQQJYC-CIgG9vBX.js.br +0 -0
  319. package/dist/client/assets/quadrantDiagram-AXDQQJYC-CIgG9vBX.js.gz +0 -0
  320. package/dist/client/assets/railroadDiagram-O6MQD6OU-DjP8oesA.js.br +0 -0
  321. package/dist/client/assets/railroadDiagram-O6MQD6OU-DjP8oesA.js.gz +0 -0
  322. package/dist/client/assets/rdpSession-BshIobdj.js +0 -1
  323. package/dist/client/assets/rdpSession-BshIobdj.js.br +0 -0
  324. package/dist/client/assets/rdpSession-BshIobdj.js.gz +0 -0
  325. package/dist/client/assets/referenceLongPress-DBJnfFHa.js.br +0 -0
  326. package/dist/client/assets/referenceLongPress-DBJnfFHa.js.gz +0 -0
  327. package/dist/client/assets/requirementDiagram-BXWQKSXE-Dbvu6IC_.js.br +0 -0
  328. package/dist/client/assets/requirementDiagram-BXWQKSXE-Dbvu6IC_.js.gz +0 -0
  329. package/dist/client/assets/sankeyDiagram-P5KCCOFB-1mZ4s-lv.js.gz +0 -0
  330. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-Cu3hhzlV.js.br +0 -0
  331. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-Cu3hhzlV.js.gz +0 -0
  332. package/dist/client/assets/sizeCapture-INFHLROL-xfm69HlR.js.br +0 -0
  333. package/dist/client/assets/sizeCapture-INFHLROL-xfm69HlR.js.gz +0 -0
  334. package/dist/client/assets/stateDiagram-D77RDMKH-u-bh6mDK.js.br +0 -0
  335. package/dist/client/assets/stateDiagram-D77RDMKH-u-bh6mDK.js.gz +0 -0
  336. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-BQ_m8Gzd.js +0 -1
  337. package/dist/client/assets/swimlanes-42K2YHIH-U8WN__SO.js.br +0 -0
  338. package/dist/client/assets/swimlanes-42K2YHIH-U8WN__SO.js.gz +0 -0
  339. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-FDEo3QWw.js +0 -8
  340. package/dist/client/assets/timeline-definition-24CTP7MA-CMsoNo4F.js.br +0 -0
  341. package/dist/client/assets/timeline-definition-24CTP7MA-CMsoNo4F.js.gz +0 -0
  342. package/dist/client/assets/vennDiagram-4TSXK5OY-CPE6pVwh.js.br +0 -0
  343. package/dist/client/assets/vennDiagram-4TSXK5OY-CPE6pVwh.js.gz +0 -0
  344. package/dist/client/assets/videoCompression-BWkZvEjM.js.br +0 -0
  345. package/dist/client/assets/videoCompression-BWkZvEjM.js.gz +0 -0
  346. package/dist/client/assets/wardleyDiagram-VM6X3IG4-4lWd-R4N.js.br +0 -0
  347. package/dist/client/assets/wardleyDiagram-VM6X3IG4-4lWd-R4N.js.gz +0 -0
  348. package/dist/client/assets/xychartDiagram-S5SC5T6Z-CpKJMCWV.js.br +0 -0
  349. package/dist/client/assets/xychartDiagram-S5SC5T6Z-CpKJMCWV.js.gz +0 -0
@@ -0,0 +1,402 @@
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
+ 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
+ }
22
+ return total;
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
+ } };
28
+ }
29
+ export class TmuxRecoveryOperationError extends Error {
30
+ code;
31
+ operationId;
32
+ constructor(code, message, operationId) {
33
+ super(message);
34
+ this.code = code;
35
+ this.operationId = operationId;
36
+ this.name = 'TmuxRecoveryOperationError';
37
+ }
38
+ }
39
+ function requestHash(input) {
40
+ return JSON.stringify(input);
41
+ }
42
+ function terminalState(state) {
43
+ return state === 'succeeded' || state === 'partial_failure';
44
+ }
45
+ /** Durable, bounded-concurrency queue for explicit tmux recovery operations. */
46
+ export class TmuxRecoveryOperationStore {
47
+ filePath;
48
+ concurrencyLimit;
49
+ onError;
50
+ state = { version: 1, operations: [] };
51
+ writeChain = Promise.resolve();
52
+ active = 0;
53
+ pumping = false;
54
+ pumpRequested = false;
55
+ runner;
56
+ admission;
57
+ listeners = new Set();
58
+ loaded = false;
59
+ constructor(filePath, concurrencyLimit, onError = () => { }) {
60
+ this.filePath = filePath;
61
+ this.concurrencyLimit = concurrencyLimit;
62
+ this.onError = onError;
63
+ if (!Number.isInteger(concurrencyLimit) || concurrencyLimit < 1 || concurrencyLimit > 16) {
64
+ throw new Error('tmux recovery concurrency must be between 1 and 16');
65
+ }
66
+ }
67
+ subscribe(listener) {
68
+ this.listeners.add(listener);
69
+ return () => this.listeners.delete(listener);
70
+ }
71
+ setRunner(runner) {
72
+ this.runner = runner;
73
+ }
74
+ setAdmission(admission) {
75
+ this.admission = admission;
76
+ }
77
+ async load() {
78
+ if (this.loaded)
79
+ return;
80
+ this.loaded = true;
81
+ try {
82
+ const parsed = JSON.parse(await fs.readFile(this.filePath, 'utf8'));
83
+ if (parsed.version !== 1 || !Array.isArray(parsed.operations))
84
+ throw new Error('Invalid tmux recovery operation state');
85
+ this.state = parsed;
86
+ }
87
+ catch (error) {
88
+ if (error.code !== 'ENOENT')
89
+ throw error;
90
+ }
91
+ const now = Date.now();
92
+ let recovered = false;
93
+ for (const operation of this.state.operations) {
94
+ for (const item of operation.items) {
95
+ if (item.state === 'running') {
96
+ // A killed worker may have submitted the native resume before it died.
97
+ // The runner always performs an exact-owner reconciliation before it launches.
98
+ item.state = operation.paused ? 'paused' : 'queued';
99
+ item.pauseReason = operation.paused ? 'manual' : undefined;
100
+ item.phase = 'restart_reconciliation';
101
+ item.errorCode = 'RECOVERY_WORKER_RESTARTED';
102
+ item.error = 'Service restarted during recovery; exact runtime ownership will be reconciled before retry.';
103
+ recovered = true;
104
+ }
105
+ }
106
+ if (!terminalState(operation.state) && !operation.paused)
107
+ operation.state = operation.items.some(item => item.state === 'paused' && item.pauseReason === 'resources') ? 'paused' : 'queued';
108
+ operation.updatedAt = recovered ? now : operation.updatedAt;
109
+ }
110
+ if (recovered)
111
+ await this.persist();
112
+ }
113
+ async create(input) {
114
+ if (!this.loaded)
115
+ await this.load();
116
+ if (!input.idempotencyKey || input.idempotencyKey.length > 200) {
117
+ throw new TmuxRecoveryOperationError('INVALID_IDEMPOTENCY_KEY', 'A non-empty idempotency key of at most 200 characters is required.');
118
+ }
119
+ const sessionIds = [...new Set(input.sessionIds)].sort();
120
+ if (sessionIds.length === 0)
121
+ throw new TmuxRecoveryOperationError('RECOVERY_SCOPE_EMPTY', 'The selected recovery scope contains no recoverable sessions.');
122
+ const concurrency = input.concurrency ?? this.concurrencyLimit;
123
+ if (!Number.isInteger(concurrency) || concurrency < 1 || concurrency > this.concurrencyLimit) {
124
+ throw new TmuxRecoveryOperationError('INVALID_RECOVERY_CONCURRENCY', `Concurrency must be between 1 and ${this.concurrencyLimit}.`);
125
+ }
126
+ const scope = input.scope.kind === 'sessions'
127
+ ? { ...input.scope, sessionIds: [...new Set(input.scope.sessionIds ?? [])].sort() }
128
+ : structuredClone(input.scope);
129
+ const fingerprint = requestHash({ incidentId: input.incidentId, sessionIds, scope, concurrency });
130
+ const existingKey = this.state.operations.find(operation => operation.idempotencyKey === input.idempotencyKey || operation.idempotencyKeyAliases?.includes(input.idempotencyKey));
131
+ if (existingKey) {
132
+ if (existingKey.requestHash !== fingerprint)
133
+ throw new TmuxRecoveryOperationError('IDEMPOTENCY_CONFLICT', 'The idempotency key was already used for a different recovery request.');
134
+ return structuredClone(existingKey);
135
+ }
136
+ if (this.state.operations.length >= 2000)
137
+ throw new TmuxRecoveryOperationError('RECOVERY_OPERATION_LIMIT', 'Recovery operation history is full; archive diagnostics before creating another operation.');
138
+ const inProgress = this.state.operations.find(operation => !terminalState(operation.state)
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);
152
+ const now = Date.now();
153
+ const operation = {
154
+ id: randomUUID(), incidentId: input.incidentId, idempotencyKey: input.idempotencyKey,
155
+ requestHash: fingerprint, scope, state: 'queued', paused: false,
156
+ concurrency, createdAt: now, updatedAt: now,
157
+ items: sessionIds.map(sessionId => ({ sessionId, state: 'queued', attempt: 0, phase: 'queued', startedAt: null, completedAt: null, estimatedRssBytes: 512 * 1024 ** 2 })),
158
+ };
159
+ this.state.operations.push(operation);
160
+ try {
161
+ await this.persist();
162
+ }
163
+ catch (error) {
164
+ this.state.operations = this.state.operations.filter(candidate => candidate.id !== operation.id);
165
+ throw error;
166
+ }
167
+ this.emit();
168
+ void this.pump();
169
+ return structuredClone(operation);
170
+ }
171
+ get(id) {
172
+ const operation = this.state.operations.find(candidate => candidate.id === id);
173
+ return operation ? summarizeRecoveryOperation(operation) : null;
174
+ }
175
+ latest() {
176
+ const operation = this.state.operations.at(-1);
177
+ return operation ? summarizeRecoveryOperation(operation) : null;
178
+ }
179
+ all() {
180
+ return this.state.operations.map(summarizeRecoveryOperation);
181
+ }
182
+ async pause(id) {
183
+ const operation = this.state.operations.find(candidate => candidate.id === id);
184
+ if (!operation)
185
+ return null;
186
+ if (!terminalState(operation.state)) {
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
+ }
195
+ operation.state = 'paused';
196
+ operation.updatedAt = Date.now();
197
+ await this.persist();
198
+ this.emit();
199
+ }
200
+ return this.get(id);
201
+ }
202
+ async resume(id) {
203
+ const operation = this.state.operations.find(candidate => candidate.id === id);
204
+ if (!operation)
205
+ return null;
206
+ if (!terminalState(operation.state)) {
207
+ operation.paused = false;
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;
218
+ operation.updatedAt = Date.now();
219
+ await this.persist();
220
+ this.emit();
221
+ void this.pump();
222
+ }
223
+ return this.get(id);
224
+ }
225
+ stats() {
226
+ const operations = this.state.operations;
227
+ const items = operations.flatMap(operation => operation.items);
228
+ const lastCompleted = [...items].filter(item => item.completedAt !== null).sort((a, b) => (b.completedAt ?? 0) - (a.completedAt ?? 0))[0];
229
+ return {
230
+ queued: items.filter(item => item.state === 'queued').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,
233
+ running: items.filter(item => item.state === 'running').length,
234
+ activeLaunches: this.active,
235
+ lastCompletedAt: lastCompleted?.completedAt ?? null,
236
+ lastCompletedSessionId: lastCompleted?.sessionId ?? null,
237
+ };
238
+ }
239
+ async resumePending() {
240
+ if (!this.loaded)
241
+ await this.load();
242
+ void this.pump();
243
+ }
244
+ notifyResourcesChanged() {
245
+ if (this.pumping) {
246
+ this.pumpRequested = true;
247
+ return;
248
+ }
249
+ void this.pump();
250
+ }
251
+ async flush() { await this.writeChain; }
252
+ async pump() {
253
+ if (this.pumping || !this.runner || !this.loaded)
254
+ return;
255
+ this.pumping = true;
256
+ try {
257
+ const deferred = new Set();
258
+ while (this.active < this.concurrencyLimit) {
259
+ const candidate = this.state.operations.find(operation => !operation.paused && !terminalState(operation.state)
260
+ && operation.items.filter(item => item.state === 'running').length < operation.concurrency
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}`));
263
+ if (!candidate || !item)
264
+ break;
265
+ if (this.admission) {
266
+ let admission;
267
+ try {
268
+ admission = await this.admission(candidate.id, item.sessionId);
269
+ }
270
+ catch (error) {
271
+ admission = { admitted: false, reason: error instanceof Error ? error.message : 'RESOURCE_SNAPSHOT_UNAVAILABLE' };
272
+ }
273
+ item.memAvailableBytes = admission.memAvailableBytes;
274
+ item.estimatedRssBytes = admission.estimatedRssBytes ?? item.estimatedRssBytes;
275
+ if (!admission.admitted) {
276
+ item.state = 'paused';
277
+ item.pauseReason = 'resources';
278
+ item.phase = 'resource_wait';
279
+ item.resourceWaitReason = admission.reason ?? 'Resource budget is not currently available.';
280
+ candidate.pauseReason = 'resources';
281
+ candidate.state = candidate.items.some(candidateItem => candidateItem.state === 'running') ? 'running' : 'paused';
282
+ candidate.updatedAt = Date.now();
283
+ deferred.add(`${candidate.id}:${item.sessionId}`);
284
+ await this.persist();
285
+ this.emit();
286
+ continue;
287
+ }
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;
291
+ }
292
+ if (candidate.paused)
293
+ break;
294
+ candidate.state = 'running';
295
+ item.state = 'running';
296
+ item.phase = item.phase === 'restart_reconciliation' ? item.phase : 'restoring';
297
+ item.attempt += 1;
298
+ item.startedAt = Date.now();
299
+ item.completedAt = null;
300
+ candidate.updatedAt = Date.now();
301
+ this.active += 1;
302
+ await this.persist();
303
+ this.emit();
304
+ void this.execute(candidate, item);
305
+ }
306
+ if (this.state.operations.some(operation => !operation.paused && !terminalState(operation.state)
307
+ && operation.items.some(item => item.state === 'resource_wait' || (item.state === 'paused' && item.pauseReason === 'resources')))) {
308
+ const retry = setTimeout(() => void this.pump(), 5_000);
309
+ retry.unref?.();
310
+ }
311
+ }
312
+ catch (error) {
313
+ this.onError(error);
314
+ }
315
+ finally {
316
+ this.pumping = false;
317
+ if (this.pumpRequested) {
318
+ this.pumpRequested = false;
319
+ queueMicrotask(() => void this.pump());
320
+ }
321
+ }
322
+ }
323
+ async execute(operation, item) {
324
+ try {
325
+ const result = await this.runner(operation.id, item.sessionId, phase => {
326
+ item.phase = phase.slice(0, 80);
327
+ operation.updatedAt = Date.now();
328
+ void this.persist().then(() => this.emit()).catch(error => this.onError(error));
329
+ });
330
+ if (result?.actualRssBytes !== undefined)
331
+ item.actualRssBytes = result.actualRssBytes;
332
+ item.state = 'succeeded';
333
+ item.phase = 'completed';
334
+ item.error = undefined;
335
+ item.errorCode = undefined;
336
+ }
337
+ catch (error) {
338
+ const value = error && typeof error === 'object' ? error : {};
339
+ const message = error instanceof Error ? error.message : String(error);
340
+ const code = typeof value.code === 'string' ? value.code
341
+ : message.includes('TERMINAL_INPUT_TARGET_CHANGED') ? 'TERMINAL_INPUT_TARGET_CHANGED' : 'TMUX_RECOVERY_FAILED';
342
+ item.state = 'failed';
343
+ item.phase = code === 'TERMINAL_INPUT_TARGET_CHANGED' ? 'target_changed' : 'failed';
344
+ item.errorCode = code;
345
+ item.error = message.slice(0, 1000);
346
+ this.onError({ operationId: operation.id, sessionId: item.sessionId, code, message });
347
+ }
348
+ finally {
349
+ item.completedAt = Date.now();
350
+ operation.updatedAt = item.completedAt;
351
+ const hasPending = operation.items.some(candidate => candidate.state === 'queued' || candidate.state === 'resource_wait' || candidate.state === 'paused' || candidate.state === 'running');
352
+ if (!hasPending) {
353
+ operation.paused = false;
354
+ operation.pauseReason = undefined;
355
+ operation.state = operation.items.some(candidate => candidate.state === 'failed') ? 'partial_failure' : 'succeeded';
356
+ }
357
+ else {
358
+ operation.state = operation.paused ? 'paused'
359
+ : operation.items.some(candidate => candidate.state === 'running') ? 'running'
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';
365
+ }
366
+ this.active = Math.max(0, this.active - 1);
367
+ try {
368
+ await this.persist();
369
+ }
370
+ catch (error) {
371
+ this.onError(error);
372
+ }
373
+ this.emit();
374
+ void this.pump();
375
+ }
376
+ }
377
+ emit() { for (const listener of this.listeners) {
378
+ try {
379
+ listener();
380
+ }
381
+ catch { /* observer failure is isolated */ }
382
+ } }
383
+ persist() {
384
+ const snapshot = JSON.stringify(this.state, null, 2);
385
+ const write = this.writeChain.then(async () => {
386
+ await fs.mkdir(path.dirname(this.filePath), { recursive: true });
387
+ const tempPath = `${this.filePath}.${process.pid}.${randomUUID()}.tmp`;
388
+ await fs.writeFile(tempPath, snapshot, { mode: 0o600 });
389
+ await fs.rename(tempPath, this.filePath);
390
+ });
391
+ this.writeChain = write.catch(error => { this.onError(error); });
392
+ return write;
393
+ }
394
+ }
395
+ export function configuredTmuxRecoveryConcurrency(value = process.env.TD_TMUX_RECOVERY_CONCURRENCY) {
396
+ if (value === undefined || value.trim() === '')
397
+ return 3;
398
+ const parsed = Number(value);
399
+ if (!Number.isInteger(parsed) || parsed < 1 || parsed > 16)
400
+ throw new Error('Recovery concurrency must be an integer from 1 to 16');
401
+ return parsed;
402
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "termdock",
3
- "version": "1.4.324",
3
+ "version": "1.4.326",
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.324",
4
+ "version": "1.4.326",
5
5
  "runtimeProtocolVersion": 1,
6
6
  "minimumDesktopVersion": "1.4.46",
7
7
  "nodeMajor": 22,
8
8
  "dependencyHash": "sha256-oaGYi/P5ob8sd6VnNBOwshKozjhdV+hYiCmLAsn5x00=",
9
- "serverBundleHash": "sha256-yjPt7bAXNp3KrOLjsqzi7sVLnPj/UD3Qz7jSJwgX9gU=",
10
- "clientBundleHash": "sha256-AoWtEiTNIyzQQDP3vrVfbjymEXr6cyRy/8C++LTIBtc=",
9
+ "serverBundleHash": "sha256-8rbCJEWANeXtZp/cvJ7UT9tGunnkMMxL7mcvARckvLQ=",
10
+ "clientBundleHash": "sha256-9MzxeyAxwRf4rg374l2f6wUzrybLPL+H5boh1/uodkQ=",
11
11
  "entrypoint": "dist/server/cli.js",
12
12
  "clientEntrypoint": "dist/client/index.html"
13
13
  }