termdock 1.4.324 → 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 (343) 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-CUAB0wFe.js → ArchitecturePanel-CJXvqmtu.js} +6 -6
  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-CKIG8diY.js → ChangeWalkthroughPanel-ChPZVfRz.js} +2 -2
  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-CIq-JAbF.js → CollaborationMainWorkspace-DkNhqCj4.js} +1 -1
  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-CPSI-M86.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-BxocNRPm.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-COGOFO0s.js → DiffLab-CX1AwU2v.js} +2 -2
  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-5ERdwz1C.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-BSz9IND6.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-RT-p-ZBo.js → DiffViewer-BDwtwbQM.js} +8 -8
  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-DI9anVWA.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-DOLn8R7c.js → RightSidebar-jOQJePDV.js} +3 -3
  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-CXd0unH5.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-DCqJmX8M.js → arc-BecvFgjf.js} +1 -1
  45. package/dist/client/assets/{arc-DCqJmX8M.js.br → arc-BecvFgjf.js.br} +0 -0
  46. package/dist/client/assets/arc-BecvFgjf.js.gz +0 -0
  47. package/dist/client/assets/{architectureDiagram-5GKGNRK7-DGu_m54H.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-BI0gsxDN.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-Ct3xzGtD.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-BPd2UShA.js → chunk-2Q5K7J3B-Cat1Dsqx.js} +1 -1
  58. package/dist/client/assets/{chunk-5VM5RSS4-CoFZ5Fo3.js → chunk-5VM5RSS4-CT0S2-E8.js} +1 -1
  59. package/dist/client/assets/{chunk-F27PBJKO-C5gZrGp4.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-GW8b9ya-.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-GpMoViQf.js → chunk-JWPE2WC7-DLvwOWZm.js} +1 -1
  66. package/dist/client/assets/{chunk-POPQ4Y6H-C_vgVPaw.js → chunk-POPQ4Y6H-BpiRuG56.js} +1 -1
  67. package/dist/client/assets/{chunk-SVP7TREG-bA7RXwWn.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-BG8DAtll.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-Ces56sud.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-Bwch0qL5.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-CrAXyA2Z.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-R6vltrl4.js.gz +0 -0
  82. package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-YlP0Q93l.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-CZ4XcPK9.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-c_8HfHGA.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-BGtRfxMR.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-_9yZnhuv.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-C_mnc4_u.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-sZ_AiSpj.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-Dm-BXeqS.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-Dz4cBepd.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-CbRG8-WW.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-CmBXWlr0.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-B26W6rS7.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-JW5QMYEk.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/{infoDiagram-27XIBGKW-CsA6WdPn.js → infoDiagram-27XIBGKW-BRmB1D5B.js} +1 -1
  122. package/dist/client/assets/{ishikawaDiagram-5VMMS53U-CsKPUwTw.js → ishikawaDiagram-5VMMS53U-DXU4nnZ6.js} +1 -1
  123. package/dist/client/assets/ishikawaDiagram-5VMMS53U-DXU4nnZ6.js.br +0 -0
  124. package/dist/client/assets/ishikawaDiagram-5VMMS53U-DXU4nnZ6.js.gz +0 -0
  125. package/dist/client/assets/{journeyDiagram-3NMN7TZE-DpN98gN0.js → journeyDiagram-3NMN7TZE-DFx7AfiP.js} +1 -1
  126. package/dist/client/assets/journeyDiagram-3NMN7TZE-DFx7AfiP.js.br +0 -0
  127. package/dist/client/assets/journeyDiagram-3NMN7TZE-DFx7AfiP.js.gz +0 -0
  128. package/dist/client/assets/{kanban-definition-UXKFOSKX-RHO--43O.js → kanban-definition-UXKFOSKX-B1ikfXJe.js} +1 -1
  129. package/dist/client/assets/kanban-definition-UXKFOSKX-B1ikfXJe.js.br +0 -0
  130. package/dist/client/assets/kanban-definition-UXKFOSKX-B1ikfXJe.js.gz +0 -0
  131. package/dist/client/assets/{layout-Cm_prknW.js → layout-DkyvZr1Y.js} +1 -1
  132. package/dist/client/assets/layout-DkyvZr1Y.js.br +0 -0
  133. package/dist/client/assets/layout-DkyvZr1Y.js.gz +0 -0
  134. package/dist/client/assets/{linear-BVAsPkvS.js → linear-CECAbRuX.js} +1 -1
  135. package/dist/client/assets/linear-CECAbRuX.js.br +0 -0
  136. package/dist/client/assets/linear-CECAbRuX.js.gz +0 -0
  137. package/dist/client/assets/{mermaid.core-ufe77Xaz.js → mermaid.core-CYY7Wb75.js} +5 -5
  138. package/dist/client/assets/mermaid.core-CYY7Wb75.js.br +0 -0
  139. package/dist/client/assets/mermaid.core-CYY7Wb75.js.gz +0 -0
  140. package/dist/client/assets/{mindmap-definition-YA3MSWOX-CRyy1U2d.js → mindmap-definition-YA3MSWOX-CTs-Y3Lq.js} +1 -1
  141. package/dist/client/assets/mindmap-definition-YA3MSWOX-CTs-Y3Lq.js.br +0 -0
  142. package/dist/client/assets/mindmap-definition-YA3MSWOX-CTs-Y3Lq.js.gz +0 -0
  143. package/dist/client/assets/passwordBootstrap-CPNGDwv6.js +2 -0
  144. package/dist/client/assets/passwordBootstrap-CPNGDwv6.js.br +0 -0
  145. package/dist/client/assets/passwordBootstrap-CPNGDwv6.js.gz +0 -0
  146. package/dist/client/assets/{pegDiagram-XKGWAZYB-DSHgdU9q.js → pegDiagram-XKGWAZYB-Y1oZrwtK.js} +1 -1
  147. package/dist/client/assets/pegDiagram-XKGWAZYB-Y1oZrwtK.js.br +0 -0
  148. package/dist/client/assets/pegDiagram-XKGWAZYB-Y1oZrwtK.js.gz +0 -0
  149. package/dist/client/assets/{pieDiagram-E7YTZNPT-lIUeAuhN.js → pieDiagram-E7YTZNPT-DYSm5OxQ.js} +1 -1
  150. package/dist/client/assets/pieDiagram-E7YTZNPT-DYSm5OxQ.js.br +0 -0
  151. package/dist/client/assets/pieDiagram-E7YTZNPT-DYSm5OxQ.js.gz +0 -0
  152. package/dist/client/assets/{quadrantDiagram-AXDQQJYC-CIgG9vBX.js → quadrantDiagram-AXDQQJYC-DpibIBz0.js} +1 -1
  153. package/dist/client/assets/quadrantDiagram-AXDQQJYC-DpibIBz0.js.br +0 -0
  154. package/dist/client/assets/quadrantDiagram-AXDQQJYC-DpibIBz0.js.gz +0 -0
  155. package/dist/client/assets/{railroadDiagram-O6MQD6OU-DjP8oesA.js → railroadDiagram-O6MQD6OU-b7jp7C1K.js} +1 -1
  156. package/dist/client/assets/railroadDiagram-O6MQD6OU-b7jp7C1K.js.br +0 -0
  157. package/dist/client/assets/railroadDiagram-O6MQD6OU-b7jp7C1K.js.gz +0 -0
  158. package/dist/client/assets/{rdpSession-BshIobdj.js → rdpSession-DU_OJfX5.js} +1 -1
  159. package/dist/client/assets/rdpSession-DU_OJfX5.js.br +0 -0
  160. package/dist/client/assets/rdpSession-DU_OJfX5.js.gz +0 -0
  161. package/dist/client/assets/{referenceLongPress-DBJnfFHa.js → referenceLongPress-BPQ_i68g.js} +1 -1
  162. package/dist/client/assets/referenceLongPress-BPQ_i68g.js.br +0 -0
  163. package/dist/client/assets/referenceLongPress-BPQ_i68g.js.gz +0 -0
  164. package/dist/client/assets/{requirementDiagram-BXWQKSXE-Dbvu6IC_.js → requirementDiagram-BXWQKSXE-BMinO1mf.js} +1 -1
  165. package/dist/client/assets/requirementDiagram-BXWQKSXE-BMinO1mf.js.br +0 -0
  166. package/dist/client/assets/requirementDiagram-BXWQKSXE-BMinO1mf.js.gz +0 -0
  167. package/dist/client/assets/{sankeyDiagram-P5KCCOFB-1mZ4s-lv.js → sankeyDiagram-P5KCCOFB-CmC977VA.js} +1 -1
  168. package/dist/client/assets/sankeyDiagram-P5KCCOFB-CmC977VA.js.br +0 -0
  169. package/dist/client/assets/sankeyDiagram-P5KCCOFB-CmC977VA.js.gz +0 -0
  170. package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-Cu3hhzlV.js → sequenceDiagram-WJ2MYXX4-D6eGbgK8.js} +1 -1
  171. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-D6eGbgK8.js.br +0 -0
  172. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-D6eGbgK8.js.gz +0 -0
  173. package/dist/client/assets/{sizeCapture-INFHLROL-xfm69HlR.js → sizeCapture-INFHLROL-CnRvyBd8.js} +1 -1
  174. package/dist/client/assets/sizeCapture-INFHLROL-CnRvyBd8.js.br +0 -0
  175. package/dist/client/assets/sizeCapture-INFHLROL-CnRvyBd8.js.gz +0 -0
  176. package/dist/client/assets/{sparkles-CDonlwGu.js → sparkles-DzadqrlX.js} +1 -1
  177. package/dist/client/assets/{stateDiagram-D77RDMKH-u-bh6mDK.js → stateDiagram-D77RDMKH-DRSalH10.js} +1 -1
  178. package/dist/client/assets/stateDiagram-D77RDMKH-DRSalH10.js.br +0 -0
  179. package/dist/client/assets/stateDiagram-D77RDMKH-DRSalH10.js.gz +0 -0
  180. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-DKe8v_ic.js +1 -0
  181. package/dist/client/assets/{swimlanes-42K2YHIH-U8WN__SO.js → swimlanes-42K2YHIH-u-NnDSzq.js} +1 -1
  182. package/dist/client/assets/swimlanes-42K2YHIH-u-NnDSzq.js.br +0 -0
  183. package/dist/client/assets/swimlanes-42K2YHIH-u-NnDSzq.js.gz +0 -0
  184. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-ei5b8ZYx.js +8 -0
  185. package/dist/client/assets/{timeline-definition-24CTP7MA-CMsoNo4F.js → timeline-definition-24CTP7MA-DkLijg_J.js} +1 -1
  186. package/dist/client/assets/timeline-definition-24CTP7MA-DkLijg_J.js.br +0 -0
  187. package/dist/client/assets/timeline-definition-24CTP7MA-DkLijg_J.js.gz +0 -0
  188. package/dist/client/assets/{triangle-alert-BgErMO2V.js → triangle-alert-D_6xTTiX.js} +1 -1
  189. package/dist/client/assets/{vennDiagram-4TSXK5OY-CPE6pVwh.js → vennDiagram-4TSXK5OY-AWGJtiv3.js} +1 -1
  190. package/dist/client/assets/{vennDiagram-4TSXK5OY-CPE6pVwh.js.br → vennDiagram-4TSXK5OY-AWGJtiv3.js.br} +0 -0
  191. package/dist/client/assets/vennDiagram-4TSXK5OY-AWGJtiv3.js.gz +0 -0
  192. package/dist/client/assets/{videoCompression-BWkZvEjM.js → videoCompression-D3y7Bq8J.js} +1 -1
  193. package/dist/client/assets/videoCompression-D3y7Bq8J.js.br +0 -0
  194. package/dist/client/assets/videoCompression-D3y7Bq8J.js.gz +0 -0
  195. package/dist/client/assets/{wardleyDiagram-VM6X3IG4-4lWd-R4N.js → wardleyDiagram-VM6X3IG4-DI0aZr_y.js} +1 -1
  196. package/dist/client/assets/wardleyDiagram-VM6X3IG4-DI0aZr_y.js.br +0 -0
  197. package/dist/client/assets/wardleyDiagram-VM6X3IG4-DI0aZr_y.js.gz +0 -0
  198. package/dist/client/assets/{xychartDiagram-S5SC5T6Z-CpKJMCWV.js → xychartDiagram-S5SC5T6Z-CCoIN3uU.js} +1 -1
  199. package/dist/client/assets/xychartDiagram-S5SC5T6Z-CCoIN3uU.js.br +0 -0
  200. package/dist/client/assets/xychartDiagram-S5SC5T6Z-CCoIN3uU.js.gz +0 -0
  201. package/dist/client/index.html +1 -1
  202. package/dist/client/index.html.br +0 -0
  203. package/dist/client/index.html.gz +0 -0
  204. package/dist/client/sw.js +1 -1
  205. package/dist/client/sw.js.br +0 -0
  206. package/dist/client/sw.js.gz +0 -0
  207. package/dist/server/agent/integrationServer.js +127 -2
  208. package/dist/server/routes/terminal.js +225 -65
  209. package/dist/server/utils/hostResources.js +128 -0
  210. package/dist/server/utils/tmuxRecoveryOperations.js +348 -0
  211. package/package.json +1 -1
  212. package/runtime-manifest.json +3 -3
  213. package/dist/client/assets/App-7IUcmCLC.js +0 -186
  214. package/dist/client/assets/App-7IUcmCLC.js.br +0 -0
  215. package/dist/client/assets/App-7IUcmCLC.js.gz +0 -0
  216. package/dist/client/assets/ArchitecturePanel-CUAB0wFe.js.br +0 -0
  217. package/dist/client/assets/ArchitecturePanel-CUAB0wFe.js.gz +0 -0
  218. package/dist/client/assets/ChangeWalkthroughPanel-CKIG8diY.js.br +0 -0
  219. package/dist/client/assets/ChangeWalkthroughPanel-CKIG8diY.js.gz +0 -0
  220. package/dist/client/assets/CollaborationMainWorkspace-CIq-JAbF.js.br +0 -0
  221. package/dist/client/assets/CollaborationMainWorkspace-CIq-JAbF.js.gz +0 -0
  222. package/dist/client/assets/CollaborationTaskContent-7vWDzH-d.js +0 -2
  223. package/dist/client/assets/ComputerControlView-CPSI-M86.js.br +0 -0
  224. package/dist/client/assets/ComputerControlView-CPSI-M86.js.gz +0 -0
  225. package/dist/client/assets/DagPlayground-BxocNRPm.js.br +0 -0
  226. package/dist/client/assets/DagPlayground-BxocNRPm.js.gz +0 -0
  227. package/dist/client/assets/DiffLab-COGOFO0s.js.br +0 -0
  228. package/dist/client/assets/DiffLab-COGOFO0s.js.gz +0 -0
  229. package/dist/client/assets/DiffReview-5ERdwz1C.js.br +0 -0
  230. package/dist/client/assets/DiffReview-5ERdwz1C.js.gz +0 -0
  231. package/dist/client/assets/DiffReviewLab-BSz9IND6.js.br +0 -0
  232. package/dist/client/assets/DiffReviewLab-BSz9IND6.js.gz +0 -0
  233. package/dist/client/assets/DiffViewer-RT-p-ZBo.js.br +0 -0
  234. package/dist/client/assets/DiffViewer-RT-p-ZBo.js.gz +0 -0
  235. package/dist/client/assets/ModelPreview-DI9anVWA.js.br +0 -0
  236. package/dist/client/assets/ModelPreview-DI9anVWA.js.gz +0 -0
  237. package/dist/client/assets/RightSidebar-DOLn8R7c.js.br +0 -0
  238. package/dist/client/assets/RightSidebar-DOLn8R7c.js.gz +0 -0
  239. package/dist/client/assets/abnfDiagram-VCTEODGH-CXd0unH5.js.br +0 -0
  240. package/dist/client/assets/abnfDiagram-VCTEODGH-CXd0unH5.js.gz +0 -0
  241. package/dist/client/assets/app-DCFOZi_L.js +0 -35
  242. package/dist/client/assets/app-DCFOZi_L.js.br +0 -0
  243. package/dist/client/assets/app-DCFOZi_L.js.gz +0 -0
  244. package/dist/client/assets/arc-DCqJmX8M.js.gz +0 -0
  245. package/dist/client/assets/architectureDiagram-5GKGNRK7-DGu_m54H.js.br +0 -0
  246. package/dist/client/assets/architectureDiagram-5GKGNRK7-DGu_m54H.js.gz +0 -0
  247. package/dist/client/assets/blockDiagram-I7D4REHJ-BI0gsxDN.js.br +0 -0
  248. package/dist/client/assets/blockDiagram-I7D4REHJ-BI0gsxDN.js.gz +0 -0
  249. package/dist/client/assets/c4Diagram-7LVT6UL2-Ct3xzGtD.js.br +0 -0
  250. package/dist/client/assets/c4Diagram-7LVT6UL2-Ct3xzGtD.js.gz +0 -0
  251. package/dist/client/assets/channel-BLSCUksA.js +0 -1
  252. package/dist/client/assets/chunk-F27PBJKO-C5gZrGp4.js.br +0 -0
  253. package/dist/client/assets/chunk-F27PBJKO-C5gZrGp4.js.gz +0 -0
  254. package/dist/client/assets/chunk-IMKFNOWR-GW8b9ya-.js.br +0 -0
  255. package/dist/client/assets/chunk-IMKFNOWR-GW8b9ya-.js.gz +0 -0
  256. package/dist/client/assets/chunk-SVP7TREG-bA7RXwWn.js.br +0 -0
  257. package/dist/client/assets/chunk-SVP7TREG-bA7RXwWn.js.gz +0 -0
  258. package/dist/client/assets/chunk-TICWLB2K-BG8DAtll.js.br +0 -0
  259. package/dist/client/assets/chunk-TICWLB2K-BG8DAtll.js.gz +0 -0
  260. package/dist/client/assets/classDiagram-ZZMXUADV-DkVIqOvw.js +0 -1
  261. package/dist/client/assets/classDiagram-v2-VYDZK3BY-DkVIqOvw.js +0 -1
  262. package/dist/client/assets/cose-bilkent-JH36ORCC-Bwch0qL5.js.br +0 -0
  263. package/dist/client/assets/cose-bilkent-JH36ORCC-Bwch0qL5.js.gz +0 -0
  264. package/dist/client/assets/cynefin-OW5HDTMX-CrAXyA2Z.js.br +0 -0
  265. package/dist/client/assets/cynefin-OW5HDTMX-CrAXyA2Z.js.gz +0 -0
  266. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-YlP0Q93l.js.br +0 -0
  267. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-YlP0Q93l.js.gz +0 -0
  268. package/dist/client/assets/dagre-GXQ25YYZ-CZ4XcPK9.js.br +0 -0
  269. package/dist/client/assets/dagre-GXQ25YYZ-CZ4XcPK9.js.gz +0 -0
  270. package/dist/client/assets/diagram-S7CK7UJ4-c_8HfHGA.js.br +0 -0
  271. package/dist/client/assets/diagram-S7CK7UJ4-c_8HfHGA.js.gz +0 -0
  272. package/dist/client/assets/diagram-UQ7AKVKN-BGtRfxMR.js.br +0 -0
  273. package/dist/client/assets/diagram-UQ7AKVKN-BGtRfxMR.js.gz +0 -0
  274. package/dist/client/assets/diagram-VSXAHHWV-_9yZnhuv.js.br +0 -0
  275. package/dist/client/assets/diagram-VSXAHHWV-_9yZnhuv.js.gz +0 -0
  276. package/dist/client/assets/diagram-VX7I27RA-C_mnc4_u.js.br +0 -0
  277. package/dist/client/assets/diagram-VX7I27RA-C_mnc4_u.js.gz +0 -0
  278. package/dist/client/assets/diagram-Z3DM3KII-sZ_AiSpj.js.br +0 -0
  279. package/dist/client/assets/diagram-Z3DM3KII-sZ_AiSpj.js.gz +0 -0
  280. package/dist/client/assets/ebnfDiagram-PWID7BFC-Dm-BXeqS.js.br +0 -0
  281. package/dist/client/assets/ebnfDiagram-PWID7BFC-Dm-BXeqS.js.gz +0 -0
  282. package/dist/client/assets/erDiagram-RLTQ6QDP-Dz4cBepd.js.br +0 -0
  283. package/dist/client/assets/erDiagram-RLTQ6QDP-Dz4cBepd.js.gz +0 -0
  284. package/dist/client/assets/flowDiagram-HODETNUW-CbRG8-WW.js.br +0 -0
  285. package/dist/client/assets/flowDiagram-HODETNUW-CbRG8-WW.js.gz +0 -0
  286. package/dist/client/assets/ganttDiagram-EL5Y4UJY-CmBXWlr0.js.br +0 -0
  287. package/dist/client/assets/ganttDiagram-EL5Y4UJY-CmBXWlr0.js.gz +0 -0
  288. package/dist/client/assets/gestureArbiter-B26W6rS7.js.br +0 -0
  289. package/dist/client/assets/gestureArbiter-B26W6rS7.js.gz +0 -0
  290. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-JW5QMYEk.js.br +0 -0
  291. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-JW5QMYEk.js.gz +0 -0
  292. package/dist/client/assets/ishikawaDiagram-5VMMS53U-CsKPUwTw.js.br +0 -0
  293. package/dist/client/assets/ishikawaDiagram-5VMMS53U-CsKPUwTw.js.gz +0 -0
  294. package/dist/client/assets/journeyDiagram-3NMN7TZE-DpN98gN0.js.br +0 -0
  295. package/dist/client/assets/journeyDiagram-3NMN7TZE-DpN98gN0.js.gz +0 -0
  296. package/dist/client/assets/kanban-definition-UXKFOSKX-RHO--43O.js.br +0 -0
  297. package/dist/client/assets/kanban-definition-UXKFOSKX-RHO--43O.js.gz +0 -0
  298. package/dist/client/assets/layout-Cm_prknW.js.br +0 -0
  299. package/dist/client/assets/layout-Cm_prknW.js.gz +0 -0
  300. package/dist/client/assets/linear-BVAsPkvS.js.br +0 -0
  301. package/dist/client/assets/linear-BVAsPkvS.js.gz +0 -0
  302. package/dist/client/assets/mermaid.core-ufe77Xaz.js.br +0 -0
  303. package/dist/client/assets/mermaid.core-ufe77Xaz.js.gz +0 -0
  304. package/dist/client/assets/mindmap-definition-YA3MSWOX-CRyy1U2d.js.br +0 -0
  305. package/dist/client/assets/mindmap-definition-YA3MSWOX-CRyy1U2d.js.gz +0 -0
  306. package/dist/client/assets/passwordBootstrap-3_SIzSH7.js +0 -2
  307. package/dist/client/assets/passwordBootstrap-3_SIzSH7.js.br +0 -0
  308. package/dist/client/assets/passwordBootstrap-3_SIzSH7.js.gz +0 -0
  309. package/dist/client/assets/pegDiagram-XKGWAZYB-DSHgdU9q.js.br +0 -0
  310. package/dist/client/assets/pegDiagram-XKGWAZYB-DSHgdU9q.js.gz +0 -0
  311. package/dist/client/assets/pieDiagram-E7YTZNPT-lIUeAuhN.js.br +0 -0
  312. package/dist/client/assets/pieDiagram-E7YTZNPT-lIUeAuhN.js.gz +0 -0
  313. package/dist/client/assets/quadrantDiagram-AXDQQJYC-CIgG9vBX.js.br +0 -0
  314. package/dist/client/assets/quadrantDiagram-AXDQQJYC-CIgG9vBX.js.gz +0 -0
  315. package/dist/client/assets/railroadDiagram-O6MQD6OU-DjP8oesA.js.br +0 -0
  316. package/dist/client/assets/railroadDiagram-O6MQD6OU-DjP8oesA.js.gz +0 -0
  317. package/dist/client/assets/rdpSession-BshIobdj.js.br +0 -0
  318. package/dist/client/assets/rdpSession-BshIobdj.js.gz +0 -0
  319. package/dist/client/assets/referenceLongPress-DBJnfFHa.js.br +0 -0
  320. package/dist/client/assets/referenceLongPress-DBJnfFHa.js.gz +0 -0
  321. package/dist/client/assets/requirementDiagram-BXWQKSXE-Dbvu6IC_.js.br +0 -0
  322. package/dist/client/assets/requirementDiagram-BXWQKSXE-Dbvu6IC_.js.gz +0 -0
  323. package/dist/client/assets/sankeyDiagram-P5KCCOFB-1mZ4s-lv.js.br +0 -0
  324. package/dist/client/assets/sankeyDiagram-P5KCCOFB-1mZ4s-lv.js.gz +0 -0
  325. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-Cu3hhzlV.js.br +0 -0
  326. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-Cu3hhzlV.js.gz +0 -0
  327. package/dist/client/assets/sizeCapture-INFHLROL-xfm69HlR.js.br +0 -0
  328. package/dist/client/assets/sizeCapture-INFHLROL-xfm69HlR.js.gz +0 -0
  329. package/dist/client/assets/stateDiagram-D77RDMKH-u-bh6mDK.js.br +0 -0
  330. package/dist/client/assets/stateDiagram-D77RDMKH-u-bh6mDK.js.gz +0 -0
  331. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-BQ_m8Gzd.js +0 -1
  332. package/dist/client/assets/swimlanes-42K2YHIH-U8WN__SO.js.br +0 -0
  333. package/dist/client/assets/swimlanes-42K2YHIH-U8WN__SO.js.gz +0 -0
  334. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-FDEo3QWw.js +0 -8
  335. package/dist/client/assets/timeline-definition-24CTP7MA-CMsoNo4F.js.br +0 -0
  336. package/dist/client/assets/timeline-definition-24CTP7MA-CMsoNo4F.js.gz +0 -0
  337. package/dist/client/assets/vennDiagram-4TSXK5OY-CPE6pVwh.js.gz +0 -0
  338. package/dist/client/assets/videoCompression-BWkZvEjM.js.br +0 -0
  339. package/dist/client/assets/videoCompression-BWkZvEjM.js.gz +0 -0
  340. package/dist/client/assets/wardleyDiagram-VM6X3IG4-4lWd-R4N.js.br +0 -0
  341. package/dist/client/assets/wardleyDiagram-VM6X3IG4-4lWd-R4N.js.gz +0 -0
  342. package/dist/client/assets/xychartDiagram-S5SC5T6Z-CpKJMCWV.js.br +0 -0
  343. package/dist/client/assets/xychartDiagram-S5SC5T6Z-CpKJMCWV.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
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "termdock",
3
- "version": "1.4.324",
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",
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "packageName": "termdock",
4
- "version": "1.4.324",
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-yjPt7bAXNp3KrOLjsqzi7sVLnPj/UD3Qz7jSJwgX9gU=",
10
- "clientBundleHash": "sha256-AoWtEiTNIyzQQDP3vrVfbjymEXr6cyRy/8C++LTIBtc=",
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
  }