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.
- package/dist/client/assets/App-C0c83Pxp.js +186 -0
- package/dist/client/assets/App-C0c83Pxp.js.br +0 -0
- package/dist/client/assets/App-C0c83Pxp.js.gz +0 -0
- package/dist/client/assets/ArchitecturePanel-znWmrZsF.js +9 -0
- package/dist/client/assets/ArchitecturePanel-znWmrZsF.js.br +0 -0
- package/dist/client/assets/ArchitecturePanel-znWmrZsF.js.gz +0 -0
- package/dist/client/assets/{ChangeWalkthroughPanel-ChPZVfRz.js → ChangeWalkthroughPanel-Bt4fjEoD.js} +1 -1
- package/dist/client/assets/ChangeWalkthroughPanel-Bt4fjEoD.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-Bt4fjEoD.js.gz +0 -0
- package/dist/client/assets/{CollaborationMainWorkspace-DkNhqCj4.js → CollaborationMainWorkspace-0s90d39f.js} +1 -1
- package/dist/client/assets/CollaborationMainWorkspace-0s90d39f.js.br +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-0s90d39f.js.gz +0 -0
- package/dist/client/assets/CollaborationTaskContent-CHVGId4O.js +2 -0
- package/dist/client/assets/ComputerControlView-BxLiNZeK.js +5 -0
- package/dist/client/assets/ComputerControlView-BxLiNZeK.js.br +0 -0
- package/dist/client/assets/ComputerControlView-BxLiNZeK.js.gz +0 -0
- package/dist/client/assets/{DagPlayground-BIL5vjer.js → DagPlayground-311LPbK_.js} +1 -1
- package/dist/client/assets/DagPlayground-311LPbK_.js.br +0 -0
- package/dist/client/assets/DagPlayground-311LPbK_.js.gz +0 -0
- package/dist/client/assets/{DiffLab-CX1AwU2v.js → DiffLab-CHZ0EL2E.js} +1 -1
- package/dist/client/assets/DiffLab-CHZ0EL2E.js.br +0 -0
- package/dist/client/assets/DiffLab-CHZ0EL2E.js.gz +0 -0
- package/dist/client/assets/{DiffReview-CLc1hwO7.js → DiffReview-BA7zArOA.js} +1 -1
- package/dist/client/assets/DiffReview-BA7zArOA.js.br +0 -0
- package/dist/client/assets/DiffReview-BA7zArOA.js.gz +0 -0
- package/dist/client/assets/{DiffReviewLab-DE6m1o4p.js → DiffReviewLab-C_6SxWtH.js} +1 -1
- package/dist/client/assets/DiffReviewLab-C_6SxWtH.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-C_6SxWtH.js.gz +0 -0
- package/dist/client/assets/{DiffViewer-BDwtwbQM.js → DiffViewer-B0YoRCEi.js} +1 -1
- package/dist/client/assets/DiffViewer-B0YoRCEi.js.br +0 -0
- package/dist/client/assets/DiffViewer-B0YoRCEi.js.gz +0 -0
- package/dist/client/assets/{ModelPreview-DEwATnxi.js → ModelPreview-BboTxu4_.js} +1 -1
- package/dist/client/assets/ModelPreview-BboTxu4_.js.br +0 -0
- package/dist/client/assets/ModelPreview-BboTxu4_.js.gz +0 -0
- package/dist/client/assets/{RightSidebar-jOQJePDV.js → RightSidebar-TFRZlsFX.js} +27 -27
- package/dist/client/assets/RightSidebar-TFRZlsFX.js.br +0 -0
- package/dist/client/assets/RightSidebar-TFRZlsFX.js.gz +0 -0
- package/dist/client/assets/{abnfDiagram-VCTEODGH-GBSf8AEr.js → abnfDiagram-VCTEODGH-BK2-PKkq.js} +1 -1
- package/dist/client/assets/abnfDiagram-VCTEODGH-BK2-PKkq.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-BK2-PKkq.js.gz +0 -0
- package/dist/client/assets/{app-VCmiASzh.js → app-D2yRvfNE.js} +13 -13
- package/dist/client/assets/app-D2yRvfNE.js.br +0 -0
- package/dist/client/assets/app-D2yRvfNE.js.gz +0 -0
- package/dist/client/assets/{arc-BecvFgjf.js → arc-DqI6rAeJ.js} +1 -1
- package/dist/client/assets/arc-DqI6rAeJ.js.br +0 -0
- package/dist/client/assets/arc-DqI6rAeJ.js.gz +0 -0
- package/dist/client/assets/{architectureDiagram-5GKGNRK7-Cfk47zEF.js → architectureDiagram-5GKGNRK7-CZBYAIxt.js} +1 -1
- package/dist/client/assets/{architectureDiagram-5GKGNRK7-Cfk47zEF.js.br → architectureDiagram-5GKGNRK7-CZBYAIxt.js.br} +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-CZBYAIxt.js.gz +0 -0
- package/dist/client/assets/{blockDiagram-I7D4REHJ-BHYgsLvx.js → blockDiagram-I7D4REHJ-BAZ4LopQ.js} +1 -1
- package/dist/client/assets/blockDiagram-I7D4REHJ-BAZ4LopQ.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-BAZ4LopQ.js.gz +0 -0
- package/dist/client/assets/{c4Diagram-7LVT6UL2-ClWWjTyz.js → c4Diagram-7LVT6UL2-Boh80g9D.js} +1 -1
- package/dist/client/assets/c4Diagram-7LVT6UL2-Boh80g9D.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-Boh80g9D.js.gz +0 -0
- package/dist/client/assets/channel-B3pP90yO.js +1 -0
- package/dist/client/assets/{chunk-2Q5K7J3B-Cat1Dsqx.js → chunk-2Q5K7J3B-CQtYmkXv.js} +1 -1
- package/dist/client/assets/{chunk-5VM5RSS4-CT0S2-E8.js → chunk-5VM5RSS4-lfjEsOLd.js} +1 -1
- package/dist/client/assets/{chunk-F27PBJKO-7o5_yA1b.js → chunk-F27PBJKO-B3iWUfsu.js} +1 -1
- package/dist/client/assets/chunk-F27PBJKO-B3iWUfsu.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-B3iWUfsu.js.gz +0 -0
- package/dist/client/assets/{chunk-IMKFNOWR-iAZxGMup.js → chunk-IMKFNOWR-BV8W69Xy.js} +1 -1
- package/dist/client/assets/chunk-IMKFNOWR-BV8W69Xy.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-BV8W69Xy.js.gz +0 -0
- package/dist/client/assets/{chunk-JWPE2WC7-DLvwOWZm.js → chunk-JWPE2WC7-BHn7J2ij.js} +1 -1
- package/dist/client/assets/{chunk-POPQ4Y6H-BpiRuG56.js → chunk-POPQ4Y6H-1UAKkjro.js} +1 -1
- package/dist/client/assets/{chunk-SVP7TREG-DpB7xpqI.js → chunk-SVP7TREG-DMDJrwWD.js} +1 -1
- package/dist/client/assets/chunk-SVP7TREG-DMDJrwWD.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-DMDJrwWD.js.gz +0 -0
- package/dist/client/assets/{chunk-TICWLB2K-Z_Sti6yX.js → chunk-TICWLB2K-DViVpzs1.js} +1 -1
- package/dist/client/assets/chunk-TICWLB2K-DViVpzs1.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-DViVpzs1.js.gz +0 -0
- package/dist/client/assets/{chunk-XXDRQBXY-DKngx1rf.js → chunk-XXDRQBXY-Cyg6qo-b.js} +1 -1
- package/dist/client/assets/classDiagram-ZZMXUADV-CcfJXXoP.js +1 -0
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-CcfJXXoP.js +1 -0
- package/dist/client/assets/{cose-bilkent-JH36ORCC-CDo8eUXo.js → cose-bilkent-JH36ORCC-Dq6PJ-un.js} +1 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-Dq6PJ-un.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-Dq6PJ-un.js.gz +0 -0
- package/dist/client/assets/{cynefin-OW5HDTMX-R6vltrl4.js → cynefin-OW5HDTMX--pc9zClZ.js} +1 -1
- package/dist/client/assets/{cynefin-OW5HDTMX-R6vltrl4.js.br → cynefin-OW5HDTMX--pc9zClZ.js.br} +0 -0
- package/dist/client/assets/{cynefin-OW5HDTMX-R6vltrl4.js.gz → cynefin-OW5HDTMX--pc9zClZ.js.gz} +0 -0
- package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-BTGMG-zO.js → cynefinDiagram-5FMLGOSQ-1whKia5t.js} +1 -1
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-1whKia5t.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-1whKia5t.js.gz +0 -0
- package/dist/client/assets/{dagre-GXQ25YYZ-D67dNSHU.js → dagre-GXQ25YYZ-8TjGkCEP.js} +1 -1
- package/dist/client/assets/dagre-GXQ25YYZ-8TjGkCEP.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-8TjGkCEP.js.gz +0 -0
- package/dist/client/assets/{diagram-S7CK7UJ4-CxZmcHs4.js → diagram-S7CK7UJ4-BTgsveUu.js} +1 -1
- package/dist/client/assets/diagram-S7CK7UJ4-BTgsveUu.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-BTgsveUu.js.gz +0 -0
- package/dist/client/assets/{diagram-UQ7AKVKN-BErivsDz.js → diagram-UQ7AKVKN-CPxoDqq7.js} +1 -1
- package/dist/client/assets/diagram-UQ7AKVKN-CPxoDqq7.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-CPxoDqq7.js.gz +0 -0
- package/dist/client/assets/{diagram-VSXAHHWV-BQWEvK9d.js → diagram-VSXAHHWV-BtNBFyC3.js} +1 -1
- package/dist/client/assets/diagram-VSXAHHWV-BtNBFyC3.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-BtNBFyC3.js.gz +0 -0
- package/dist/client/assets/{diagram-VX7I27RA-COR5k4JL.js → diagram-VX7I27RA-DLfdx0dh.js} +1 -1
- package/dist/client/assets/diagram-VX7I27RA-DLfdx0dh.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-DLfdx0dh.js.gz +0 -0
- package/dist/client/assets/{diagram-Z3DM3KII-Cx6oTlVi.js → diagram-Z3DM3KII-C9FdZJ41.js} +1 -1
- package/dist/client/assets/diagram-Z3DM3KII-C9FdZJ41.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-C9FdZJ41.js.gz +0 -0
- package/dist/client/assets/{ebnfDiagram-PWID7BFC-dKNZki9k.js → ebnfDiagram-PWID7BFC-CAxaqCAJ.js} +1 -1
- package/dist/client/assets/ebnfDiagram-PWID7BFC-CAxaqCAJ.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-CAxaqCAJ.js.gz +0 -0
- package/dist/client/assets/{erDiagram-RLTQ6QDP-DD06d9Gl.js → erDiagram-RLTQ6QDP-BBO2Iz-B.js} +1 -1
- package/dist/client/assets/erDiagram-RLTQ6QDP-BBO2Iz-B.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-BBO2Iz-B.js.gz +0 -0
- package/dist/client/assets/{flowDiagram-HODETNUW-DXNAvw1d.js → flowDiagram-HODETNUW-DQ-nPGNL.js} +1 -1
- package/dist/client/assets/flowDiagram-HODETNUW-DQ-nPGNL.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-DQ-nPGNL.js.gz +0 -0
- package/dist/client/assets/{ganttDiagram-EL5Y4UJY-BSMu3Rsd.js → ganttDiagram-EL5Y4UJY-C4bKdSCF.js} +1 -1
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-C4bKdSCF.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-C4bKdSCF.js.gz +0 -0
- package/dist/client/assets/{gestureArbiter-D1TteC76.js → gestureArbiter-miROLzXb.js} +1 -1
- package/dist/client/assets/gestureArbiter-miROLzXb.js.br +0 -0
- package/dist/client/assets/gestureArbiter-miROLzXb.js.gz +0 -0
- package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-DNDKI803.js → gitGraphDiagram-WWUBYQGX-cAbsg4ei.js} +1 -1
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-cAbsg4ei.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-cAbsg4ei.js.gz +0 -0
- package/dist/client/assets/index-Dd_3ISCb.css +1 -0
- package/dist/client/assets/index-Dd_3ISCb.css.br +0 -0
- package/dist/client/assets/{index-Ctz-IDjR.css.gz → index-Dd_3ISCb.css.gz} +0 -0
- package/dist/client/assets/{infoDiagram-27XIBGKW-BRmB1D5B.js → infoDiagram-27XIBGKW-EV88OFTf.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-5VMMS53U-DXU4nnZ6.js → ishikawaDiagram-5VMMS53U-Bi-60w6U.js} +1 -1
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-Bi-60w6U.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-Bi-60w6U.js.gz +0 -0
- package/dist/client/assets/{journeyDiagram-3NMN7TZE-DFx7AfiP.js → journeyDiagram-3NMN7TZE-Bgbk61sp.js} +1 -1
- package/dist/client/assets/journeyDiagram-3NMN7TZE-Bgbk61sp.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-Bgbk61sp.js.gz +0 -0
- package/dist/client/assets/{kanban-definition-UXKFOSKX-B1ikfXJe.js → kanban-definition-UXKFOSKX-Ly6IeL8s.js} +1 -1
- package/dist/client/assets/kanban-definition-UXKFOSKX-Ly6IeL8s.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-Ly6IeL8s.js.gz +0 -0
- package/dist/client/assets/{layout-DkyvZr1Y.js → layout-CEjMszLD.js} +1 -1
- package/dist/client/assets/layout-CEjMszLD.js.br +0 -0
- package/dist/client/assets/layout-CEjMszLD.js.gz +0 -0
- package/dist/client/assets/{linear-CECAbRuX.js → linear-BCB67kKS.js} +1 -1
- package/dist/client/assets/linear-BCB67kKS.js.br +0 -0
- package/dist/client/assets/linear-BCB67kKS.js.gz +0 -0
- package/dist/client/assets/{mermaid.core-CYY7Wb75.js → mermaid.core-BmSOfxMH.js} +5 -5
- package/dist/client/assets/mermaid.core-BmSOfxMH.js.br +0 -0
- package/dist/client/assets/mermaid.core-BmSOfxMH.js.gz +0 -0
- package/dist/client/assets/{mindmap-definition-YA3MSWOX-CTs-Y3Lq.js → mindmap-definition-YA3MSWOX-VEZ7qGHM.js} +1 -1
- package/dist/client/assets/mindmap-definition-YA3MSWOX-VEZ7qGHM.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-VEZ7qGHM.js.gz +0 -0
- package/dist/client/assets/{passwordBootstrap-CPNGDwv6.js → passwordBootstrap-BUV0AT5k.js} +1 -1
- package/dist/client/assets/passwordBootstrap-BUV0AT5k.js.br +0 -0
- package/dist/client/assets/passwordBootstrap-BUV0AT5k.js.gz +0 -0
- package/dist/client/assets/{pegDiagram-XKGWAZYB-Y1oZrwtK.js → pegDiagram-XKGWAZYB-DtFnROHy.js} +1 -1
- package/dist/client/assets/pegDiagram-XKGWAZYB-DtFnROHy.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-DtFnROHy.js.gz +0 -0
- package/dist/client/assets/{pieDiagram-E7YTZNPT-DYSm5OxQ.js → pieDiagram-E7YTZNPT-CrRFKgsg.js} +1 -1
- package/dist/client/assets/pieDiagram-E7YTZNPT-CrRFKgsg.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-CrRFKgsg.js.gz +0 -0
- package/dist/client/assets/{quadrantDiagram-AXDQQJYC-DpibIBz0.js → quadrantDiagram-AXDQQJYC-DrxOcCWy.js} +1 -1
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-DrxOcCWy.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-DrxOcCWy.js.gz +0 -0
- package/dist/client/assets/{railroadDiagram-O6MQD6OU-b7jp7C1K.js → railroadDiagram-O6MQD6OU-BaXzskST.js} +1 -1
- package/dist/client/assets/railroadDiagram-O6MQD6OU-BaXzskST.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-BaXzskST.js.gz +0 -0
- package/dist/client/assets/rdpSession-DtIeoTyy.js +1 -0
- package/dist/client/assets/rdpSession-DtIeoTyy.js.br +0 -0
- package/dist/client/assets/rdpSession-DtIeoTyy.js.gz +0 -0
- package/dist/client/assets/{referenceLongPress-BPQ_i68g.js → referenceLongPress-DqibFmuj.js} +1 -1
- package/dist/client/assets/referenceLongPress-DqibFmuj.js.br +0 -0
- package/dist/client/assets/referenceLongPress-DqibFmuj.js.gz +0 -0
- package/dist/client/assets/{requirementDiagram-BXWQKSXE-BMinO1mf.js → requirementDiagram-BXWQKSXE-BdwuNHm0.js} +1 -1
- package/dist/client/assets/requirementDiagram-BXWQKSXE-BdwuNHm0.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-BdwuNHm0.js.gz +0 -0
- package/dist/client/assets/{sankeyDiagram-P5KCCOFB-CmC977VA.js → sankeyDiagram-P5KCCOFB-L8-WTgQS.js} +1 -1
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-L8-WTgQS.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-L8-WTgQS.js.gz +0 -0
- package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-D6eGbgK8.js → sequenceDiagram-WJ2MYXX4-Hloa_AO5.js} +1 -1
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-Hloa_AO5.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-Hloa_AO5.js.gz +0 -0
- package/dist/client/assets/{sizeCapture-INFHLROL-CnRvyBd8.js → sizeCapture-INFHLROL-0sRpfplV.js} +1 -1
- package/dist/client/assets/sizeCapture-INFHLROL-0sRpfplV.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-0sRpfplV.js.gz +0 -0
- package/dist/client/assets/{sparkles-DzadqrlX.js → sparkles-CgDDXr95.js} +1 -1
- package/dist/client/assets/{stateDiagram-D77RDMKH-DRSalH10.js → stateDiagram-D77RDMKH-DqT3kcLM.js} +1 -1
- package/dist/client/assets/stateDiagram-D77RDMKH-DqT3kcLM.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-DqT3kcLM.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-DjkkxZUN.js +1 -0
- package/dist/client/assets/{swimlanes-42K2YHIH-u-NnDSzq.js → swimlanes-42K2YHIH-BH5xHrJq.js} +1 -1
- package/dist/client/assets/swimlanes-42K2YHIH-BH5xHrJq.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH-BH5xHrJq.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-DpLhj_Dx.js +8 -0
- package/dist/client/assets/{timeline-definition-24CTP7MA-DkLijg_J.js → timeline-definition-24CTP7MA-D3Ez5FZh.js} +1 -1
- package/dist/client/assets/timeline-definition-24CTP7MA-D3Ez5FZh.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-D3Ez5FZh.js.gz +0 -0
- package/dist/client/assets/{triangle-alert-D_6xTTiX.js → triangle-alert-DqUvQ_x8.js} +1 -1
- package/dist/client/assets/{vennDiagram-4TSXK5OY-AWGJtiv3.js → vennDiagram-4TSXK5OY-DEGLdtyy.js} +1 -1
- package/dist/client/assets/vennDiagram-4TSXK5OY-DEGLdtyy.js.br +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-DEGLdtyy.js.gz +0 -0
- package/dist/client/assets/{videoCompression-D3y7Bq8J.js → videoCompression-DIBRptEJ.js} +1 -1
- package/dist/client/assets/videoCompression-DIBRptEJ.js.br +0 -0
- package/dist/client/assets/videoCompression-DIBRptEJ.js.gz +0 -0
- package/dist/client/assets/{wardleyDiagram-VM6X3IG4-DI0aZr_y.js → wardleyDiagram-VM6X3IG4-BWXojK8h.js} +1 -1
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-BWXojK8h.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-BWXojK8h.js.gz +0 -0
- package/dist/client/assets/{xychartDiagram-S5SC5T6Z-CCoIN3uU.js → xychartDiagram-S5SC5T6Z-CI95cYmG.js} +1 -1
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-CI95cYmG.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-CI95cYmG.js.gz +0 -0
- package/dist/client/index.html +2 -2
- package/dist/client/index.html.br +0 -0
- package/dist/client/index.html.gz +0 -0
- package/dist/client/sw.js +1 -1
- package/dist/client/sw.js.br +0 -0
- package/dist/client/sw.js.gz +0 -0
- package/dist/server/agent/integrationServer.js +6 -1
- package/dist/server/routes/terminal.js +21 -13
- package/dist/server/utils/hostResources.js +35 -0
- package/dist/server/utils/tmuxRecoveryOperations.js +72 -18
- package/docs/systemd.md +35 -0
- package/package.json +3 -1
- package/packaging/systemd/termdock.service.d/10-preserve-tmux.conf +5 -0
- package/runtime-manifest.json +3 -3
- package/dist/client/assets/App-D8MWr9xp.js +0 -186
- package/dist/client/assets/App-D8MWr9xp.js.br +0 -0
- package/dist/client/assets/App-D8MWr9xp.js.gz +0 -0
- package/dist/client/assets/ArchitecturePanel-CJXvqmtu.js +0 -9
- package/dist/client/assets/ArchitecturePanel-CJXvqmtu.js.br +0 -0
- package/dist/client/assets/ArchitecturePanel-CJXvqmtu.js.gz +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-ChPZVfRz.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-ChPZVfRz.js.gz +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-DkNhqCj4.js.br +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-DkNhqCj4.js.gz +0 -0
- package/dist/client/assets/CollaborationTaskContent-BA3bVNJo.js +0 -2
- package/dist/client/assets/ComputerControlView-BTntDI6C.js +0 -5
- package/dist/client/assets/ComputerControlView-BTntDI6C.js.br +0 -0
- package/dist/client/assets/ComputerControlView-BTntDI6C.js.gz +0 -0
- package/dist/client/assets/DagPlayground-BIL5vjer.js.br +0 -0
- package/dist/client/assets/DagPlayground-BIL5vjer.js.gz +0 -0
- package/dist/client/assets/DiffLab-CX1AwU2v.js.br +0 -0
- package/dist/client/assets/DiffLab-CX1AwU2v.js.gz +0 -0
- package/dist/client/assets/DiffReview-CLc1hwO7.js.br +0 -0
- package/dist/client/assets/DiffReview-CLc1hwO7.js.gz +0 -0
- package/dist/client/assets/DiffReviewLab-DE6m1o4p.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-DE6m1o4p.js.gz +0 -0
- package/dist/client/assets/DiffViewer-BDwtwbQM.js.br +0 -0
- package/dist/client/assets/DiffViewer-BDwtwbQM.js.gz +0 -0
- package/dist/client/assets/ModelPreview-DEwATnxi.js.br +0 -0
- package/dist/client/assets/ModelPreview-DEwATnxi.js.gz +0 -0
- package/dist/client/assets/RightSidebar-jOQJePDV.js.br +0 -0
- package/dist/client/assets/RightSidebar-jOQJePDV.js.gz +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-GBSf8AEr.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-GBSf8AEr.js.gz +0 -0
- package/dist/client/assets/app-VCmiASzh.js.br +0 -0
- package/dist/client/assets/app-VCmiASzh.js.gz +0 -0
- package/dist/client/assets/arc-BecvFgjf.js.br +0 -0
- package/dist/client/assets/arc-BecvFgjf.js.gz +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-Cfk47zEF.js.gz +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-BHYgsLvx.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-BHYgsLvx.js.gz +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-ClWWjTyz.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-ClWWjTyz.js.gz +0 -0
- package/dist/client/assets/channel-8F8qxLSK.js +0 -1
- package/dist/client/assets/chunk-F27PBJKO-7o5_yA1b.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-7o5_yA1b.js.gz +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-iAZxGMup.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-iAZxGMup.js.gz +0 -0
- package/dist/client/assets/chunk-SVP7TREG-DpB7xpqI.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-DpB7xpqI.js.gz +0 -0
- package/dist/client/assets/chunk-TICWLB2K-Z_Sti6yX.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-Z_Sti6yX.js.gz +0 -0
- package/dist/client/assets/classDiagram-ZZMXUADV-C0AmKz7U.js +0 -1
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-C0AmKz7U.js +0 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-CDo8eUXo.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-CDo8eUXo.js.gz +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-BTGMG-zO.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-BTGMG-zO.js.gz +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-D67dNSHU.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-D67dNSHU.js.gz +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-CxZmcHs4.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-CxZmcHs4.js.gz +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-BErivsDz.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-BErivsDz.js.gz +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-BQWEvK9d.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-BQWEvK9d.js.gz +0 -0
- package/dist/client/assets/diagram-VX7I27RA-COR5k4JL.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-COR5k4JL.js.gz +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-Cx6oTlVi.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-Cx6oTlVi.js.gz +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-dKNZki9k.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-dKNZki9k.js.gz +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-DD06d9Gl.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-DD06d9Gl.js.gz +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-DXNAvw1d.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-DXNAvw1d.js.gz +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-BSMu3Rsd.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-BSMu3Rsd.js.gz +0 -0
- package/dist/client/assets/gestureArbiter-D1TteC76.js.br +0 -0
- package/dist/client/assets/gestureArbiter-D1TteC76.js.gz +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DNDKI803.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DNDKI803.js.gz +0 -0
- package/dist/client/assets/index-Ctz-IDjR.css +0 -1
- package/dist/client/assets/index-Ctz-IDjR.css.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-DXU4nnZ6.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-DXU4nnZ6.js.gz +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-DFx7AfiP.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-DFx7AfiP.js.gz +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-B1ikfXJe.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-B1ikfXJe.js.gz +0 -0
- package/dist/client/assets/layout-DkyvZr1Y.js.br +0 -0
- package/dist/client/assets/layout-DkyvZr1Y.js.gz +0 -0
- package/dist/client/assets/linear-CECAbRuX.js.br +0 -0
- package/dist/client/assets/linear-CECAbRuX.js.gz +0 -0
- package/dist/client/assets/mermaid.core-CYY7Wb75.js.br +0 -0
- package/dist/client/assets/mermaid.core-CYY7Wb75.js.gz +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-CTs-Y3Lq.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-CTs-Y3Lq.js.gz +0 -0
- package/dist/client/assets/passwordBootstrap-CPNGDwv6.js.br +0 -0
- package/dist/client/assets/passwordBootstrap-CPNGDwv6.js.gz +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-Y1oZrwtK.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-Y1oZrwtK.js.gz +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-DYSm5OxQ.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-DYSm5OxQ.js.gz +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-DpibIBz0.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-DpibIBz0.js.gz +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-b7jp7C1K.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-b7jp7C1K.js.gz +0 -0
- package/dist/client/assets/rdpSession-DU_OJfX5.js +0 -1
- package/dist/client/assets/rdpSession-DU_OJfX5.js.br +0 -0
- package/dist/client/assets/rdpSession-DU_OJfX5.js.gz +0 -0
- package/dist/client/assets/referenceLongPress-BPQ_i68g.js.br +0 -0
- package/dist/client/assets/referenceLongPress-BPQ_i68g.js.gz +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-BMinO1mf.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-BMinO1mf.js.gz +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-CmC977VA.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-CmC977VA.js.gz +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-D6eGbgK8.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-D6eGbgK8.js.gz +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-CnRvyBd8.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-CnRvyBd8.js.gz +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-DRSalH10.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-DRSalH10.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-DKe8v_ic.js +0 -1
- package/dist/client/assets/swimlanes-42K2YHIH-u-NnDSzq.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH-u-NnDSzq.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-ei5b8ZYx.js +0 -8
- package/dist/client/assets/timeline-definition-24CTP7MA-DkLijg_J.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-DkLijg_J.js.gz +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-AWGJtiv3.js.br +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-AWGJtiv3.js.gz +0 -0
- package/dist/client/assets/videoCompression-D3y7Bq8J.js.br +0 -0
- package/dist/client/assets/videoCompression-D3y7Bq8J.js.gz +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-DI0aZr_y.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-DI0aZr_y.js.gz +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-CCoIN3uU.js.br +0 -0
- 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
|
-
|
|
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.
|
|
122
|
-
|
|
123
|
-
|
|
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.
|
|
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
|
-
|
|
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 = '
|
|
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.
|
|
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' : '
|
|
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 {
|
package/docs/systemd.md
ADDED
|
@@ -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.
|
|
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"
|
package/runtime-manifest.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"packageName": "termdock",
|
|
4
|
-
"version": "1.4.
|
|
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-
|
|
10
|
-
"clientBundleHash": "sha256-
|
|
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
|
}
|