termdock 1.4.351 → 1.4.353
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/AndroidMirrorView-C39BgFa_.js +3 -0
- package/dist/client/assets/AndroidMirrorView-C39BgFa_.js.br +0 -0
- package/dist/client/assets/AndroidMirrorView-C39BgFa_.js.gz +0 -0
- package/dist/client/assets/App-AjjtXg93.js +178 -0
- package/dist/client/assets/App-AjjtXg93.js.br +0 -0
- package/dist/client/assets/App-AjjtXg93.js.gz +0 -0
- package/dist/client/assets/ArchitecturePanel-Xi_R4Tso.js +9 -0
- package/dist/client/assets/ArchitecturePanel-Xi_R4Tso.js.br +0 -0
- package/dist/client/assets/ArchitecturePanel-Xi_R4Tso.js.gz +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-BH1Una8m.js +2 -0
- package/dist/client/assets/ChangeWalkthroughPanel-BH1Una8m.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-BH1Una8m.js.gz +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-CA9ZGT5N.js +1 -0
- package/dist/client/assets/CollaborationMainWorkspace-CA9ZGT5N.js.br +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-CA9ZGT5N.js.gz +0 -0
- package/dist/client/assets/CollaborationTaskContent-D_NDzA-t.js +2 -0
- package/dist/client/assets/ComputerControlView-BGvF5NeQ.js +6 -0
- package/dist/client/assets/ComputerControlView-BGvF5NeQ.js.br +0 -0
- package/dist/client/assets/ComputerControlView-BGvF5NeQ.js.gz +0 -0
- package/dist/client/assets/DagPlayground-CKqB6zap.js +1 -0
- package/dist/client/assets/DagPlayground-CKqB6zap.js.br +0 -0
- package/dist/client/assets/DagPlayground-CKqB6zap.js.gz +0 -0
- package/dist/client/assets/{DiffLab-DFut8ZHi.js → DiffLab-CDt8EP6I.js} +2 -2
- package/dist/client/assets/DiffLab-CDt8EP6I.js.br +0 -0
- package/dist/client/assets/DiffLab-CDt8EP6I.js.gz +0 -0
- package/dist/client/assets/DiffReview-YADkwVd6.js +1 -0
- package/dist/client/assets/DiffReview-YADkwVd6.js.br +0 -0
- package/dist/client/assets/DiffReview-YADkwVd6.js.gz +0 -0
- package/dist/client/assets/{DiffReviewLab-Y9JlI5DQ.js → DiffReviewLab-YqgsRn_K.js} +2 -2
- package/dist/client/assets/DiffReviewLab-YqgsRn_K.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-YqgsRn_K.js.gz +0 -0
- package/dist/client/assets/DiffViewer-CT5_YwM2.js +34 -0
- package/dist/client/assets/DiffViewer-CT5_YwM2.js.br +0 -0
- package/dist/client/assets/DiffViewer-CT5_YwM2.js.gz +0 -0
- package/dist/client/assets/GitLoadingSkeleton-DfWzAnA2.js +1 -0
- package/dist/client/assets/GitLoadingSkeleton-DfWzAnA2.js.br +0 -0
- package/dist/client/assets/GitLoadingSkeleton-DfWzAnA2.js.gz +0 -0
- package/dist/client/assets/MarkdownPreview-DHLp5cqt.js +19 -0
- package/dist/client/assets/MarkdownPreview-DHLp5cqt.js.br +0 -0
- package/dist/client/assets/MarkdownPreview-DHLp5cqt.js.gz +0 -0
- package/dist/client/assets/{ModelPreview-Cv6JgunE.js → ModelPreview-DymFzc55.js} +166 -166
- package/dist/client/assets/ModelPreview-DymFzc55.js.br +0 -0
- package/dist/client/assets/ModelPreview-DymFzc55.js.gz +0 -0
- package/dist/client/assets/RecordingSaveDialog-CxSN76bp.js +1 -0
- package/dist/client/assets/RecordingSaveDialog-CxSN76bp.js.br +0 -0
- package/dist/client/assets/RecordingSaveDialog-CxSN76bp.js.gz +0 -0
- package/dist/client/assets/RightSidebar-eIuDnhJn.js +1662 -0
- package/dist/client/assets/RightSidebar-eIuDnhJn.js.br +0 -0
- package/dist/client/assets/RightSidebar-eIuDnhJn.js.gz +0 -0
- package/dist/client/assets/SessionChatView-C5wXAt7h.js +13 -0
- package/dist/client/assets/SessionChatView-C5wXAt7h.js.br +0 -0
- package/dist/client/assets/SessionChatView-C5wXAt7h.js.gz +0 -0
- package/dist/client/assets/SessionChatView-D8GoESjb.css +1 -0
- package/dist/client/assets/SessionChatView-D8GoESjb.css.br +0 -0
- package/dist/client/assets/SessionChatView-D8GoESjb.css.gz +0 -0
- package/dist/client/assets/SessionResourceSidebar-Czai5Bt3.js +2 -0
- package/dist/client/assets/SessionResourceSidebar-Czai5Bt3.js.br +0 -0
- package/dist/client/assets/SessionResourceSidebar-Czai5Bt3.js.gz +0 -0
- package/dist/client/assets/TodoWorkspace-BftnnEU0.js +1 -0
- package/dist/client/assets/TodoWorkspace-BftnnEU0.js.br +0 -0
- package/dist/client/assets/TodoWorkspace-BftnnEU0.js.gz +0 -0
- package/dist/client/assets/{abnfDiagram-VCTEODGH-CcCffdpj.js → abnfDiagram-VCTEODGH-DI1Y-QAP.js} +1 -1
- package/dist/client/assets/abnfDiagram-VCTEODGH-DI1Y-QAP.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-DI1Y-QAP.js.gz +0 -0
- package/dist/client/assets/app-DvMXSNN7.js +36 -0
- package/dist/client/assets/app-DvMXSNN7.js.br +0 -0
- package/dist/client/assets/app-DvMXSNN7.js.gz +0 -0
- package/dist/client/assets/{arc-CXcCuzb3.js → arc-QdJAJx_D.js} +1 -1
- package/dist/client/assets/arc-QdJAJx_D.js.br +0 -0
- package/dist/client/assets/arc-QdJAJx_D.js.gz +0 -0
- package/dist/client/assets/{architectureDiagram-5GKGNRK7-CmR7whZz.js → architectureDiagram-5GKGNRK7-Bw2CvoGg.js} +1 -1
- package/dist/client/assets/architectureDiagram-5GKGNRK7-Bw2CvoGg.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-Bw2CvoGg.js.gz +0 -0
- package/dist/client/assets/arrow-down-CZKuaGwN.js +1 -0
- package/dist/client/assets/arrow-up-CYLC6_to.js +1 -0
- package/dist/client/assets/{blockDiagram-I7D4REHJ-DODhUpHm.js → blockDiagram-I7D4REHJ-CM2GI6sC.js} +1 -1
- package/dist/client/assets/blockDiagram-I7D4REHJ-CM2GI6sC.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-CM2GI6sC.js.gz +0 -0
- package/dist/client/assets/{c4Diagram-7LVT6UL2-BF9eEb2Y.js → c4Diagram-7LVT6UL2-BAB2TKr4.js} +1 -1
- package/dist/client/assets/c4Diagram-7LVT6UL2-BAB2TKr4.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-BAB2TKr4.js.gz +0 -0
- package/dist/client/assets/channel-CcDRt0AM.js +1 -0
- package/dist/client/assets/chevron-left-BNby2AjR.js +1 -0
- package/dist/client/assets/{chunk-2Q5K7J3B-CB7-8Zex.js → chunk-2Q5K7J3B-DI2pKKMQ.js} +1 -1
- package/dist/client/assets/{chunk-5VM5RSS4-8Uxe2lki.js → chunk-5VM5RSS4-D5l5zyYl.js} +1 -1
- package/dist/client/assets/{chunk-F27PBJKO-Bv45U-az.js → chunk-F27PBJKO-Japl432v.js} +1 -1
- package/dist/client/assets/{chunk-F27PBJKO-Bv45U-az.js.br → chunk-F27PBJKO-Japl432v.js.br} +0 -0
- package/dist/client/assets/chunk-F27PBJKO-Japl432v.js.gz +0 -0
- package/dist/client/assets/{chunk-IMKFNOWR-CfEErbEd.js → chunk-IMKFNOWR-CDJoLgpw.js} +1 -1
- package/dist/client/assets/chunk-IMKFNOWR-CDJoLgpw.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-CDJoLgpw.js.gz +0 -0
- package/dist/client/assets/{chunk-JWPE2WC7-CjUqcCSL.js → chunk-JWPE2WC7-BQ2cpPDE.js} +1 -1
- package/dist/client/assets/{chunk-POPQ4Y6H-BHbP3O75.js → chunk-POPQ4Y6H-CWjI0yRx.js} +1 -1
- package/dist/client/assets/{chunk-SVP7TREG-CbyJW-OT.js → chunk-SVP7TREG-BzEphMpl.js} +1 -1
- package/dist/client/assets/chunk-SVP7TREG-BzEphMpl.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-BzEphMpl.js.gz +0 -0
- package/dist/client/assets/{chunk-TICWLB2K-t93EivmS.js → chunk-TICWLB2K-B2hsw7jN.js} +1 -1
- package/dist/client/assets/chunk-TICWLB2K-B2hsw7jN.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-B2hsw7jN.js.gz +0 -0
- package/dist/client/assets/{chunk-XXDRQBXY-C_Pe8Osb.js → chunk-XXDRQBXY-BEWjHo7s.js} +1 -1
- package/dist/client/assets/classDiagram-ZZMXUADV-Dz0qH9Hg.js +1 -0
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-Dz0qH9Hg.js +1 -0
- package/dist/client/assets/clipboard-6kE6vzDi.js +1 -0
- package/dist/client/assets/clipboardText-B7202UNa.js +1 -0
- package/dist/client/assets/clipboardText-B7202UNa.js.br +0 -0
- package/dist/client/assets/clipboardText-B7202UNa.js.gz +0 -0
- package/dist/client/assets/{cose-bilkent-JH36ORCC-CksG0bvP.js → cose-bilkent-JH36ORCC-DpS77pec.js} +1 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-DpS77pec.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-DpS77pec.js.gz +0 -0
- package/dist/client/assets/{cynefin-OW5HDTMX-CV3T078G.js → cynefin-OW5HDTMX-D1y5kNwR.js} +1 -1
- package/dist/client/assets/cynefin-OW5HDTMX-D1y5kNwR.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-D1y5kNwR.js.gz +0 -0
- package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-BQnJabEs.js → cynefinDiagram-5FMLGOSQ-CqTCLyMC.js} +1 -1
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CqTCLyMC.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CqTCLyMC.js.gz +0 -0
- package/dist/client/assets/{dagre-GXQ25YYZ-BeIQp5Pv.js → dagre-GXQ25YYZ-DkJ-kRn6.js} +1 -1
- package/dist/client/assets/dagre-GXQ25YYZ-DkJ-kRn6.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-DkJ-kRn6.js.gz +0 -0
- package/dist/client/assets/{diagram-S7CK7UJ4-D-Mibxiq.js → diagram-S7CK7UJ4-DenrrE_C.js} +1 -1
- package/dist/client/assets/diagram-S7CK7UJ4-DenrrE_C.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-DenrrE_C.js.gz +0 -0
- package/dist/client/assets/{diagram-UQ7AKVKN-eiIMWp9t.js → diagram-UQ7AKVKN-B2ikSD8K.js} +1 -1
- package/dist/client/assets/diagram-UQ7AKVKN-B2ikSD8K.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-B2ikSD8K.js.gz +0 -0
- package/dist/client/assets/{diagram-VSXAHHWV-CTVOWtNL.js → diagram-VSXAHHWV-CQcNoZDC.js} +1 -1
- package/dist/client/assets/diagram-VSXAHHWV-CQcNoZDC.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-CQcNoZDC.js.gz +0 -0
- package/dist/client/assets/{diagram-VX7I27RA-NKKk6uh7.js → diagram-VX7I27RA-Cq3FaI-1.js} +1 -1
- package/dist/client/assets/diagram-VX7I27RA-Cq3FaI-1.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-Cq3FaI-1.js.gz +0 -0
- package/dist/client/assets/{diagram-Z3DM3KII-DKYdBuNs.js → diagram-Z3DM3KII-BcWReLM8.js} +1 -1
- package/dist/client/assets/diagram-Z3DM3KII-BcWReLM8.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-BcWReLM8.js.gz +0 -0
- package/dist/client/assets/{ebnfDiagram-PWID7BFC-DaM3D5Ed.js → ebnfDiagram-PWID7BFC-DwwFkjaL.js} +1 -1
- package/dist/client/assets/ebnfDiagram-PWID7BFC-DwwFkjaL.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-DwwFkjaL.js.gz +0 -0
- package/dist/client/assets/{erDiagram-RLTQ6QDP-Df9kQwWg.js → erDiagram-RLTQ6QDP-B1MNvouo.js} +1 -1
- package/dist/client/assets/erDiagram-RLTQ6QDP-B1MNvouo.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-B1MNvouo.js.gz +0 -0
- package/dist/client/assets/{flowDiagram-HODETNUW-CWjDvpsN.js → flowDiagram-HODETNUW-B_tIl0Vb.js} +1 -1
- package/dist/client/assets/flowDiagram-HODETNUW-B_tIl0Vb.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-B_tIl0Vb.js.gz +0 -0
- package/dist/client/assets/{ganttDiagram-EL5Y4UJY-mKt-CgrH.js → ganttDiagram-EL5Y4UJY-CV0YyZHk.js} +1 -1
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-CV0YyZHk.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-CV0YyZHk.js.gz +0 -0
- package/dist/client/assets/gestureArbiter-DszagC-d.js +1 -0
- package/dist/client/assets/gestureArbiter-DszagC-d.js.br +0 -0
- package/dist/client/assets/gestureArbiter-DszagC-d.js.gz +0 -0
- package/dist/client/assets/git-compare-CGiJqTYP.js +1 -0
- package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-BqnaVVZ0.js → gitGraphDiagram-WWUBYQGX-DZvnSoyE.js} +1 -1
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DZvnSoyE.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DZvnSoyE.js.gz +0 -0
- package/dist/client/assets/index-CA1fR_jI.css +1 -0
- package/dist/client/assets/index-CA1fR_jI.css.br +0 -0
- package/dist/client/assets/index-CA1fR_jI.css.gz +0 -0
- package/dist/client/assets/{infoDiagram-27XIBGKW-CkniyUX9.js → infoDiagram-27XIBGKW-G1OS50nR.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-5VMMS53U-CKo9urjS.js → ishikawaDiagram-5VMMS53U-C0-s6pfy.js} +1 -1
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-C0-s6pfy.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-C0-s6pfy.js.gz +0 -0
- package/dist/client/assets/{journeyDiagram-3NMN7TZE-Cd4jK-oI.js → journeyDiagram-3NMN7TZE-B-9Omdit.js} +1 -1
- package/dist/client/assets/journeyDiagram-3NMN7TZE-B-9Omdit.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-B-9Omdit.js.gz +0 -0
- package/dist/client/assets/{kanban-definition-UXKFOSKX-BuulZGO-.js → kanban-definition-UXKFOSKX-BS_qXegp.js} +1 -1
- package/dist/client/assets/kanban-definition-UXKFOSKX-BS_qXegp.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-BS_qXegp.js.gz +0 -0
- package/dist/client/assets/{layout-BpJ2ofrz.js → layout-0NYin1Qz.js} +1 -1
- package/dist/client/assets/{layout-BpJ2ofrz.js.br → layout-0NYin1Qz.js.br} +0 -0
- package/dist/client/assets/layout-0NYin1Qz.js.gz +0 -0
- package/dist/client/assets/{linear-CaSbGLIA.js → linear-CTVKrsxK.js} +1 -1
- package/dist/client/assets/linear-CTVKrsxK.js.br +0 -0
- package/dist/client/assets/linear-CTVKrsxK.js.gz +0 -0
- package/dist/client/assets/link-C5oPMHMJ.js +8 -0
- package/dist/client/assets/link-C5oPMHMJ.js.br +0 -0
- package/dist/client/assets/link-C5oPMHMJ.js.gz +0 -0
- package/dist/client/assets/list-tree-BPg9QdiM.js +1 -0
- package/dist/client/assets/loader-circle-CTtHKNWd.js +1 -0
- package/dist/client/assets/maximize-2-32OfQ0kG.js +1 -0
- package/dist/client/assets/{mermaid.core-BlkorXd6.js → mermaid.core-BgCZP9ke.js} +5 -5
- package/dist/client/assets/mermaid.core-BgCZP9ke.js.br +0 -0
- package/dist/client/assets/mermaid.core-BgCZP9ke.js.gz +0 -0
- package/dist/client/assets/{mindmap-definition-YA3MSWOX-BqKhK1NJ.js → mindmap-definition-YA3MSWOX-BjSZRjkg.js} +2 -2
- package/dist/client/assets/mindmap-definition-YA3MSWOX-BjSZRjkg.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-BjSZRjkg.js.gz +0 -0
- package/dist/client/assets/passwordBootstrap-CXQgj5nw.js +2 -0
- package/dist/client/assets/passwordBootstrap-CXQgj5nw.js.br +0 -0
- package/dist/client/assets/passwordBootstrap-CXQgj5nw.js.gz +0 -0
- package/dist/client/assets/{pegDiagram-XKGWAZYB-BlWgUklx.js → pegDiagram-XKGWAZYB-qDU0sU6m.js} +1 -1
- package/dist/client/assets/pegDiagram-XKGWAZYB-qDU0sU6m.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-qDU0sU6m.js.gz +0 -0
- package/dist/client/assets/{pieDiagram-E7YTZNPT-Bp32kHHQ.js → pieDiagram-E7YTZNPT-CZF3MEOJ.js} +1 -1
- package/dist/client/assets/pieDiagram-E7YTZNPT-CZF3MEOJ.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-CZF3MEOJ.js.gz +0 -0
- package/dist/client/assets/{quadrantDiagram-AXDQQJYC-0qeSh9-W.js → quadrantDiagram-AXDQQJYC-DcZW4RMG.js} +1 -1
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-DcZW4RMG.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-DcZW4RMG.js.gz +0 -0
- package/dist/client/assets/quote-CuTMveNr.js +1 -0
- package/dist/client/assets/{railroadDiagram-O6MQD6OU-COmWghVD.js → railroadDiagram-O6MQD6OU-DtQROK31.js} +1 -1
- package/dist/client/assets/railroadDiagram-O6MQD6OU-DtQROK31.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-DtQROK31.js.gz +0 -0
- package/dist/client/assets/rdpSession-a1ZvAyiW.js +1 -0
- package/dist/client/assets/rdpSession-a1ZvAyiW.js.br +0 -0
- package/dist/client/assets/rdpSession-a1ZvAyiW.js.gz +0 -0
- package/dist/client/assets/{requirementDiagram-BXWQKSXE-CeohDJAC.js → requirementDiagram-BXWQKSXE-B8yR39lm.js} +1 -1
- package/dist/client/assets/requirementDiagram-BXWQKSXE-B8yR39lm.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-B8yR39lm.js.gz +0 -0
- package/dist/client/assets/{sankeyDiagram-P5KCCOFB-rA5x9iOw.js → sankeyDiagram-P5KCCOFB-D27zuIFg.js} +1 -1
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-D27zuIFg.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-D27zuIFg.js.gz +0 -0
- package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-Cw2BZ0po.js → sequenceDiagram-WJ2MYXX4-BI3gSsUa.js} +1 -1
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-BI3gSsUa.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-BI3gSsUa.js.gz +0 -0
- package/dist/client/assets/settings-2-GFFo5UwO.js +1 -0
- package/dist/client/assets/{sizeCapture-INFHLROL-Dz1ykd8a.js → sizeCapture-INFHLROL-NBzIIRER.js} +1 -1
- package/dist/client/assets/sizeCapture-INFHLROL-NBzIIRER.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-NBzIIRER.js.gz +0 -0
- package/dist/client/assets/{sparkles-0HeBLLwx.js → sparkles-ZXBp-KvJ.js} +1 -1
- package/dist/client/assets/{stateDiagram-D77RDMKH-DHfjTfLj.js → stateDiagram-D77RDMKH-D-D0FB4D.js} +1 -1
- package/dist/client/assets/stateDiagram-D77RDMKH-D-D0FB4D.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-D-D0FB4D.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-Dk-QpCnJ.js +1 -0
- package/dist/client/assets/sun-CO5F9zS4.js +1 -0
- package/dist/client/assets/{swimlanes-42K2YHIH-CAJkSUVz.js → swimlanes-42K2YHIH-CH_jxbV3.js} +1 -1
- package/dist/client/assets/swimlanes-42K2YHIH-CH_jxbV3.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH-CH_jxbV3.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-C4E5FOdv.js +8 -0
- package/dist/client/assets/swiper-DJjq1TYT.js +1 -0
- package/dist/client/assets/swiper-DJjq1TYT.js.br +0 -0
- package/dist/client/assets/swiper-DJjq1TYT.js.gz +0 -0
- package/dist/client/assets/syntaxHighlight-C9PKWUqs.js +4 -0
- package/dist/client/assets/syntaxHighlight-C9PKWUqs.js.br +0 -0
- package/dist/client/assets/syntaxHighlight-C9PKWUqs.js.gz +0 -0
- package/dist/client/assets/{timeline-definition-24CTP7MA-plr9yv12.js → timeline-definition-24CTP7MA-DuiaCBON.js} +1 -1
- package/dist/client/assets/timeline-definition-24CTP7MA-DuiaCBON.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-DuiaCBON.js.gz +0 -0
- package/dist/client/assets/triangle-alert-CuGUScPU.js +1 -0
- package/dist/client/assets/unplug-C0pb-BKU.js +1 -0
- package/dist/client/assets/use-gesture-react.esm-DYpdiE_k.js +1 -0
- package/dist/client/assets/use-gesture-react.esm-DYpdiE_k.js.br +0 -0
- package/dist/client/assets/use-gesture-react.esm-DYpdiE_k.js.gz +0 -0
- package/dist/client/assets/v4-EwEgHOG0.js +1 -0
- package/dist/client/assets/{vennDiagram-4TSXK5OY-Cz04de3S.js → vennDiagram-4TSXK5OY-DUEZFEzo.js} +1 -1
- package/dist/client/assets/vennDiagram-4TSXK5OY-DUEZFEzo.js.br +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-DUEZFEzo.js.gz +0 -0
- package/dist/client/assets/videoCompression-JAcp0atl.js +3 -0
- package/dist/client/assets/videoCompression-JAcp0atl.js.br +0 -0
- package/dist/client/assets/videoCompression-JAcp0atl.js.gz +0 -0
- package/dist/client/assets/{wardleyDiagram-VM6X3IG4-DnT-q6At.js → wardleyDiagram-VM6X3IG4-CnHmIbot.js} +1 -1
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-CnHmIbot.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-CnHmIbot.js.gz +0 -0
- package/dist/client/assets/{xychartDiagram-S5SC5T6Z-C0y08MEX.js → xychartDiagram-S5SC5T6Z-CDAoHQTr.js} +1 -1
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-CDAoHQTr.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-CDAoHQTr.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/collaborationDeliveryWorker.js +11 -0
- package/dist/server/agent/collaborationPrompt.js +4 -2
- package/dist/server/agent/collaborationStore.js +7 -1
- package/dist/server/agent/sessionAttachmentRoutes.js +39 -0
- package/dist/server/agent/sessionChatRoutes.js +64 -0
- package/dist/server/agent/sessionViewModeRoutes.js +72 -0
- package/dist/server/android/recording.js +19 -17
- package/dist/server/cli.js +34 -0
- package/dist/server/entry.js +25 -17
- package/dist/server/federation/accessPolicy.js +8 -3
- package/dist/server/federation/authorization.js +26 -3
- package/dist/server/federation/invitations.js +27 -6
- package/dist/server/federation/requestContext.js +5 -1
- package/dist/server/federation/resourceAccess.js +63 -0
- package/dist/server/federation/runtime.js +60 -17
- package/dist/server/federation/sessionSharing.js +39 -0
- package/dist/server/routes/android.js +36 -7
- package/dist/server/routes/computer.js +14 -4
- package/dist/server/routes/filesystem.js +6 -3
- package/dist/server/routes/rdp.js +4 -3
- package/dist/server/routes/sharedFiles.js +51 -0
- package/dist/server/routes/terminal.js +83 -14
- package/dist/server/routes/vncReadOnly.js +134 -0
- package/dist/server/shared/shareResources.js +37 -0
- package/dist/server/todos/cli.js +91 -0
- package/dist/server/todos/routes.js +73 -0
- package/dist/server/todos/store.js +240 -0
- package/dist/server/todos/types.js +1 -0
- package/dist/server/utils/autoUpdate.js +7 -2
- package/dist/server/utils/clientSnapshotMaintenance.js +200 -0
- package/dist/server/utils/runtimeClient.js +79 -0
- package/dist/server/utils/serverCleanup.js +24 -0
- package/dist/server/utils/storageMaintenance.js +60 -0
- package/dist/server/utils/workspaceCacheMaintenance.js +158 -0
- package/package.json +1 -1
- package/runtime-manifest.json +3 -3
- package/dist/client/assets/App-BiDKeTpx.js +0 -187
- package/dist/client/assets/App-BiDKeTpx.js.br +0 -0
- package/dist/client/assets/App-BiDKeTpx.js.gz +0 -0
- package/dist/client/assets/ArchitecturePanel-DfRsqSBx.js +0 -9
- package/dist/client/assets/ArchitecturePanel-DfRsqSBx.js.br +0 -0
- package/dist/client/assets/ArchitecturePanel-DfRsqSBx.js.gz +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-DksecDp5.js +0 -2
- package/dist/client/assets/ChangeWalkthroughPanel-DksecDp5.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-DksecDp5.js.gz +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-D-TgDrxX.js +0 -1
- package/dist/client/assets/CollaborationMainWorkspace-D-TgDrxX.js.br +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-D-TgDrxX.js.gz +0 -0
- package/dist/client/assets/CollaborationTaskContent-Ce6gFw26.js +0 -2
- package/dist/client/assets/ComputerControlView-BKwuceeG.js +0 -6
- package/dist/client/assets/ComputerControlView-BKwuceeG.js.br +0 -0
- package/dist/client/assets/ComputerControlView-BKwuceeG.js.gz +0 -0
- package/dist/client/assets/DagPlayground-Cshoqo5l.js +0 -1
- package/dist/client/assets/DagPlayground-Cshoqo5l.js.br +0 -0
- package/dist/client/assets/DagPlayground-Cshoqo5l.js.gz +0 -0
- package/dist/client/assets/DiffLab-DFut8ZHi.js.br +0 -0
- package/dist/client/assets/DiffLab-DFut8ZHi.js.gz +0 -0
- package/dist/client/assets/DiffReview-DkEi5c3c.js +0 -1
- package/dist/client/assets/DiffReview-DkEi5c3c.js.br +0 -0
- package/dist/client/assets/DiffReview-DkEi5c3c.js.gz +0 -0
- package/dist/client/assets/DiffReviewLab-Y9JlI5DQ.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-Y9JlI5DQ.js.gz +0 -0
- package/dist/client/assets/DiffViewer-3JGF6U0m.js +0 -37
- package/dist/client/assets/DiffViewer-3JGF6U0m.js.br +0 -0
- package/dist/client/assets/DiffViewer-3JGF6U0m.js.gz +0 -0
- package/dist/client/assets/ModelPreview-Cv6JgunE.js.br +0 -0
- package/dist/client/assets/ModelPreview-Cv6JgunE.js.gz +0 -0
- package/dist/client/assets/RightSidebar-akYx_nRq.js +0 -1679
- package/dist/client/assets/RightSidebar-akYx_nRq.js.br +0 -0
- package/dist/client/assets/RightSidebar-akYx_nRq.js.gz +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-CcCffdpj.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-CcCffdpj.js.gz +0 -0
- package/dist/client/assets/app-BB0CAQ8D.js +0 -35
- package/dist/client/assets/app-BB0CAQ8D.js.br +0 -0
- package/dist/client/assets/app-BB0CAQ8D.js.gz +0 -0
- package/dist/client/assets/arc-CXcCuzb3.js.br +0 -0
- package/dist/client/assets/arc-CXcCuzb3.js.gz +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-CmR7whZz.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-CmR7whZz.js.gz +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-DODhUpHm.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-DODhUpHm.js.gz +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-BF9eEb2Y.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-BF9eEb2Y.js.gz +0 -0
- package/dist/client/assets/channel-BKkTA-X_.js +0 -1
- package/dist/client/assets/chunk-F27PBJKO-Bv45U-az.js.gz +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-CfEErbEd.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-CfEErbEd.js.gz +0 -0
- package/dist/client/assets/chunk-SVP7TREG-CbyJW-OT.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-CbyJW-OT.js.gz +0 -0
- package/dist/client/assets/chunk-TICWLB2K-t93EivmS.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-t93EivmS.js.gz +0 -0
- package/dist/client/assets/classDiagram-ZZMXUADV-D9nwA51-.js +0 -1
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-D9nwA51-.js +0 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-CksG0bvP.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-CksG0bvP.js.gz +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-CV3T078G.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-CV3T078G.js.gz +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-BQnJabEs.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-BQnJabEs.js.gz +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-BeIQp5Pv.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-BeIQp5Pv.js.gz +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-D-Mibxiq.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-D-Mibxiq.js.gz +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-eiIMWp9t.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-eiIMWp9t.js.gz +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-CTVOWtNL.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-CTVOWtNL.js.gz +0 -0
- package/dist/client/assets/diagram-VX7I27RA-NKKk6uh7.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-NKKk6uh7.js.gz +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-DKYdBuNs.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-DKYdBuNs.js.gz +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-DaM3D5Ed.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-DaM3D5Ed.js.gz +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-Df9kQwWg.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-Df9kQwWg.js.gz +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-CWjDvpsN.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-CWjDvpsN.js.gz +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-mKt-CgrH.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-mKt-CgrH.js.gz +0 -0
- package/dist/client/assets/gestureArbiter-C8TBuoU3.js +0 -1
- package/dist/client/assets/gestureArbiter-C8TBuoU3.js.br +0 -0
- package/dist/client/assets/gestureArbiter-C8TBuoU3.js.gz +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BqnaVVZ0.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BqnaVVZ0.js.gz +0 -0
- package/dist/client/assets/index-3lPto_1X.css +0 -1
- package/dist/client/assets/index-3lPto_1X.css.br +0 -0
- package/dist/client/assets/index-3lPto_1X.css.gz +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-CKo9urjS.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-CKo9urjS.js.gz +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-Cd4jK-oI.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-Cd4jK-oI.js.gz +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-BuulZGO-.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-BuulZGO-.js.gz +0 -0
- package/dist/client/assets/layout-BpJ2ofrz.js.gz +0 -0
- package/dist/client/assets/linear-CaSbGLIA.js.br +0 -0
- package/dist/client/assets/linear-CaSbGLIA.js.gz +0 -0
- package/dist/client/assets/mermaid.core-BlkorXd6.js.br +0 -0
- package/dist/client/assets/mermaid.core-BlkorXd6.js.gz +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-BqKhK1NJ.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-BqKhK1NJ.js.gz +0 -0
- package/dist/client/assets/passwordBootstrap-DLUamTjd.js +0 -2
- package/dist/client/assets/passwordBootstrap-DLUamTjd.js.br +0 -0
- package/dist/client/assets/passwordBootstrap-DLUamTjd.js.gz +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-BlWgUklx.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-BlWgUklx.js.gz +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-Bp32kHHQ.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-Bp32kHHQ.js.gz +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-0qeSh9-W.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-0qeSh9-W.js.gz +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-COmWghVD.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-COmWghVD.js.gz +0 -0
- package/dist/client/assets/rdpSession-Bbycnmly.js +0 -1
- package/dist/client/assets/rdpSession-Bbycnmly.js.br +0 -0
- package/dist/client/assets/rdpSession-Bbycnmly.js.gz +0 -0
- package/dist/client/assets/referenceLongPress-CQ9ote5C.js +0 -1
- package/dist/client/assets/referenceLongPress-CQ9ote5C.js.br +0 -0
- package/dist/client/assets/referenceLongPress-CQ9ote5C.js.gz +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-CeohDJAC.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-CeohDJAC.js.gz +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-rA5x9iOw.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-rA5x9iOw.js.gz +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-Cw2BZ0po.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-Cw2BZ0po.js.gz +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-Dz1ykd8a.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-Dz1ykd8a.js.gz +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-DHfjTfLj.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-DHfjTfLj.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-B9AqPaxQ.js +0 -1
- package/dist/client/assets/swimlanes-42K2YHIH-CAJkSUVz.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH-CAJkSUVz.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-DPbqRuWV.js +0 -8
- package/dist/client/assets/timeline-definition-24CTP7MA-plr9yv12.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-plr9yv12.js.gz +0 -0
- package/dist/client/assets/triangle-alert-ibl6FV9I.js +0 -1
- package/dist/client/assets/vennDiagram-4TSXK5OY-Cz04de3S.js.br +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-Cz04de3S.js.gz +0 -0
- package/dist/client/assets/videoCompression-DCsUD6X6.js +0 -3
- package/dist/client/assets/videoCompression-DCsUD6X6.js.br +0 -0
- package/dist/client/assets/videoCompression-DCsUD6X6.js.gz +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-DnT-q6At.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-DnT-q6At.js.gz +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-C0y08MEX.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-C0y08MEX.js.gz +0 -0
- /package/dist/client/assets/{gestureArbiter-C2J0D0kV.css → swiper-C2J0D0kV.css} +0 -0
- /package/dist/client/assets/{gestureArbiter-C2J0D0kV.css.br → swiper-C2J0D0kV.css.br} +0 -0
- /package/dist/client/assets/{gestureArbiter-C2J0D0kV.css.gz → swiper-C2J0D0kV.css.gz} +0 -0
|
@@ -18,6 +18,32 @@ function isCompleteSnapshot(clientDist, serverBundleHash, clientBundleHash) {
|
|
|
18
18
|
&& marker.clientEntrypoint === 'dist/client/index.html'
|
|
19
19
|
&& fs.existsSync(path.join(clientDist, 'index.html'));
|
|
20
20
|
}
|
|
21
|
+
function hasExactClientContents(directory, expected) {
|
|
22
|
+
try {
|
|
23
|
+
const hash = crypto.createHash('sha256');
|
|
24
|
+
let entries = 0;
|
|
25
|
+
const visit = (current, relative = '') => {
|
|
26
|
+
if (!fs.lstatSync(current).isDirectory())
|
|
27
|
+
throw new Error('Linked snapshot');
|
|
28
|
+
for (const entry of fs.readdirSync(current, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name))) {
|
|
29
|
+
if (++entries > 10_000)
|
|
30
|
+
throw new Error('Snapshot entry limit');
|
|
31
|
+
const file = path.join(current, entry.name), name = path.join(relative, entry.name);
|
|
32
|
+
if (entry.isDirectory())
|
|
33
|
+
visit(file, name);
|
|
34
|
+
else if (entry.isFile())
|
|
35
|
+
hash.update(name.split(path.sep).join('/')).update('\0').update(fs.readFileSync(file)).update('\0');
|
|
36
|
+
else
|
|
37
|
+
throw new Error('Linked snapshot');
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
visit(directory);
|
|
41
|
+
return `sha256-${hash.digest('base64')}` === expected;
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
21
47
|
/**
|
|
22
48
|
* Keep the browser bundle served by this process immutable for its lifetime.
|
|
23
49
|
*
|
|
@@ -47,8 +73,31 @@ export function pinBundledRuntimeClientDist(defaultClientDist, homeDir = os.home
|
|
|
47
73
|
const snapshotRoot = path.join(snapshotsRoot, snapshotKey);
|
|
48
74
|
const snapshotClientDist = path.join(snapshotRoot, 'dist', 'client');
|
|
49
75
|
if (isCompleteSnapshot(snapshotClientDist, manifest.serverBundleHash, manifest.clientBundleHash)) {
|
|
76
|
+
try {
|
|
77
|
+
fs.utimesSync(snapshotRoot, new Date(), new Date());
|
|
78
|
+
}
|
|
79
|
+
catch { /* Read-only caches remain usable. */ }
|
|
50
80
|
return snapshotClientDist;
|
|
51
81
|
}
|
|
82
|
+
// Server-only upgrades do not need another full copy of the same client.
|
|
83
|
+
try {
|
|
84
|
+
for (const entry of fs.readdirSync(snapshotsRoot, { withFileTypes: true })) {
|
|
85
|
+
if (!entry.isDirectory() || !/^[a-f0-9]{24}$/.test(entry.name))
|
|
86
|
+
continue;
|
|
87
|
+
const candidate = path.join(snapshotsRoot, entry.name, 'dist', 'client');
|
|
88
|
+
const marker = readManifest(path.join(snapshotsRoot, entry.name, 'snapshot-manifest.json'));
|
|
89
|
+
if (typeof marker?.serverBundleHash === 'string' && marker.clientBundleHash === manifest.clientBundleHash
|
|
90
|
+
&& isCompleteSnapshot(candidate, marker.serverBundleHash, manifest.clientBundleHash)
|
|
91
|
+
&& hasExactClientContents(candidate, manifest.clientBundleHash)) {
|
|
92
|
+
try {
|
|
93
|
+
fs.utimesSync(path.join(snapshotsRoot, entry.name), new Date(), new Date());
|
|
94
|
+
}
|
|
95
|
+
catch { /* Read-only caches remain usable. */ }
|
|
96
|
+
return candidate;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch { /* First run or an unavailable cache; copy the installed bundle. */ }
|
|
52
101
|
fs.mkdirSync(snapshotsRoot, { recursive: true, mode: 0o700 });
|
|
53
102
|
const temporaryRoot = fs.mkdtempSync(path.join(snapshotsRoot, `.${snapshotKey}-`));
|
|
54
103
|
const temporaryClientDist = path.join(temporaryRoot, 'dist', 'client');
|
|
@@ -119,3 +168,33 @@ export function indexRetainedClientModules(homeDir = os.homedir()) {
|
|
|
119
168
|
catch { /* No retained snapshots on first install. */ }
|
|
120
169
|
return modules;
|
|
121
170
|
}
|
|
171
|
+
const touchedSnapshots = new Map();
|
|
172
|
+
/** Refresh expired index entries without losing a module kept by another build. */
|
|
173
|
+
export function resolveRetainedClientModule(modules, url, homeDir = os.homedir()) {
|
|
174
|
+
let retainedPath = modules.get(url);
|
|
175
|
+
if (retainedPath && !fs.existsSync(retainedPath)) {
|
|
176
|
+
modules.clear();
|
|
177
|
+
for (const [key, file] of indexRetainedClientModules(homeDir))
|
|
178
|
+
modules.set(key, file);
|
|
179
|
+
retainedPath = modules.get(url);
|
|
180
|
+
}
|
|
181
|
+
if (retainedPath)
|
|
182
|
+
touchRetainedClientModule(retainedPath);
|
|
183
|
+
return retainedPath;
|
|
184
|
+
}
|
|
185
|
+
/** A page that still loads an older module renews that snapshot's grace period. */
|
|
186
|
+
export function touchRetainedClientModule(modulePath) {
|
|
187
|
+
const directory = path.resolve(modulePath, '..', '..', '..', '..');
|
|
188
|
+
if (path.basename(path.dirname(directory)) !== 'client-snapshots' || !/^[a-f0-9]{24}$/.test(path.basename(directory)))
|
|
189
|
+
return;
|
|
190
|
+
const now = Date.now();
|
|
191
|
+
if (now - (touchedSnapshots.get(directory) ?? 0) < 60_000)
|
|
192
|
+
return;
|
|
193
|
+
touchedSnapshots.set(directory, now);
|
|
194
|
+
if (touchedSnapshots.size > 1024)
|
|
195
|
+
touchedSnapshots.delete(touchedSnapshots.keys().next().value);
|
|
196
|
+
try {
|
|
197
|
+
fs.utimesSync(directory, new Date(now), new Date(now));
|
|
198
|
+
}
|
|
199
|
+
catch { /* Already expired or read-only. */ }
|
|
200
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/** Share one close listener across server resources, including async startup. */
|
|
2
|
+
export function serverCleanup(server, onError = error => console.error('[server-cleanup]', error)) {
|
|
3
|
+
const callbacks = [];
|
|
4
|
+
let closed = false;
|
|
5
|
+
const run = (callback) => {
|
|
6
|
+
try {
|
|
7
|
+
callback();
|
|
8
|
+
}
|
|
9
|
+
catch (error) {
|
|
10
|
+
onError(error);
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
server.once('close', () => {
|
|
14
|
+
closed = true;
|
|
15
|
+
for (const callback of callbacks.splice(0))
|
|
16
|
+
run(callback);
|
|
17
|
+
});
|
|
18
|
+
return (callback) => {
|
|
19
|
+
if (closed)
|
|
20
|
+
run(callback);
|
|
21
|
+
else
|
|
22
|
+
callbacks.push(callback);
|
|
23
|
+
};
|
|
24
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { leaseClientSnapshot, pruneClientSnapshots } from './clientSnapshotMaintenance.js';
|
|
4
|
+
import { pruneWorkspaceCaches } from './workspaceCacheMaintenance.js';
|
|
5
|
+
/** The same conservative migration handles existing data and future upgrades. */
|
|
6
|
+
export async function maintainGeneratedStorage(options) {
|
|
7
|
+
const startedAt = Date.now();
|
|
8
|
+
const entries = [
|
|
9
|
+
...await pruneClientSnapshots(options),
|
|
10
|
+
...await pruneWorkspaceCaches(options),
|
|
11
|
+
];
|
|
12
|
+
const report = { kind: 'termdock-generated-storage-maintenance', version: 1, startedAt, finishedAt: Date.now(), dryRun: options.dryRun === true,
|
|
13
|
+
reclaimedBytes: entries.filter(item => item.action === 'removed').reduce((sum, item) => sum + item.bytes, 0), entries };
|
|
14
|
+
if (!options.dryRun) {
|
|
15
|
+
const file = path.join(options.stateDirectory, 'storage-maintenance.json');
|
|
16
|
+
try {
|
|
17
|
+
// Preserve a pre-existing foreign file instead of claiming its path.
|
|
18
|
+
try {
|
|
19
|
+
if (JSON.parse(await fs.readFile(file, 'utf8')).kind !== report.kind)
|
|
20
|
+
return report;
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
if (error.code !== 'ENOENT')
|
|
24
|
+
return report;
|
|
25
|
+
}
|
|
26
|
+
const temporary = `${file}.${process.pid}.tmp`;
|
|
27
|
+
await fs.writeFile(temporary, `${JSON.stringify(report, null, 2)}\n`, { mode: 0o600 });
|
|
28
|
+
await fs.rename(temporary, file);
|
|
29
|
+
}
|
|
30
|
+
catch { /* Cleanup must not turn diagnostic storage failure into downtime. */ }
|
|
31
|
+
}
|
|
32
|
+
return report;
|
|
33
|
+
}
|
|
34
|
+
export function startGeneratedStorageMaintenance(options) {
|
|
35
|
+
if (process.env.NODE_ENV === 'test')
|
|
36
|
+
return () => { };
|
|
37
|
+
const release = leaseClientSnapshot(options.clientDirectory, options.stateDirectory);
|
|
38
|
+
let stopped = false, running = false;
|
|
39
|
+
const run = async () => {
|
|
40
|
+
if (running || stopped)
|
|
41
|
+
return;
|
|
42
|
+
running = true;
|
|
43
|
+
try {
|
|
44
|
+
const report = await maintainGeneratedStorage(options);
|
|
45
|
+
console.log(`[storage-maintenance] reclaimed ${report.reclaimedBytes} bytes; ${report.entries.filter(item => item.action === 'retained').length} paths retained`);
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
console.warn('[storage-maintenance] retained unverified data:', error instanceof Error ? error.message : 'check failed');
|
|
49
|
+
}
|
|
50
|
+
finally {
|
|
51
|
+
running = false;
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
// Let the listener become healthy before migrating large legacy caches.
|
|
55
|
+
const startup = setTimeout(() => { void run(); }, 5_000);
|
|
56
|
+
startup.unref();
|
|
57
|
+
const timer = setInterval(() => { void run(); }, 6 * 60 * 60_000);
|
|
58
|
+
timer.unref();
|
|
59
|
+
return () => { stopped = true; clearTimeout(startup); clearInterval(timer); release(); };
|
|
60
|
+
}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { execFile } from 'node:child_process';
|
|
4
|
+
import { promisify } from 'node:util';
|
|
5
|
+
const exec = promisify(execFile);
|
|
6
|
+
const DAY = 24 * 60 * 60_000;
|
|
7
|
+
const git = async (cwd, args) => (await exec('git', ['-C', cwd, ...args], {
|
|
8
|
+
timeout: 15_000, maxBuffer: 1024 * 1024, env: { ...process.env, GIT_OPTIONAL_LOCKS: '0', GIT_TERMINAL_PROMPT: '0' },
|
|
9
|
+
})).stdout.trim();
|
|
10
|
+
// A separate Node process runs INSIDE Cargo's Linux flock. No shell evaluates
|
|
11
|
+
// paths. Source, node_modules, final binaries, bundles and unknown files stay.
|
|
12
|
+
const CARGO_CACHE_WORKER = String.raw `
|
|
13
|
+
const fs = await import('node:fs/promises');
|
|
14
|
+
const path = await import('node:path');
|
|
15
|
+
const { execFileSync } = await import('node:child_process');
|
|
16
|
+
const o = JSON.parse(process.argv[1]);
|
|
17
|
+
const result = [];
|
|
18
|
+
const real = async p => (await fs.lstat(p)).isDirectory() && await fs.realpath(p) === path.resolve(p);
|
|
19
|
+
const git = args => execFileSync('git', ['-C', o.workspace, ...args], { encoding: 'utf8', timeout: 15000, env: { ...process.env, GIT_OPTIONAL_LOCKS: '0' } }).trim();
|
|
20
|
+
const busy = async () => {
|
|
21
|
+
for (const e of await fs.readdir('/proc')) {
|
|
22
|
+
if (!/^\d+$/.test(e) || [process.pid, process.ppid].includes(Number(e))) continue;
|
|
23
|
+
const p = '/proc/' + e;
|
|
24
|
+
try {
|
|
25
|
+
if ((await fs.stat(p)).uid !== process.getuid()) continue;
|
|
26
|
+
for (const link of ['cwd', 'exe']) {
|
|
27
|
+
let value; try { value = await fs.readlink(p + '/' + link); } catch { continue; }
|
|
28
|
+
if (value === o.workspace || value.startsWith(o.workspace + path.sep)) return true;
|
|
29
|
+
}
|
|
30
|
+
const args = (await fs.readFile(p + '/cmdline', 'utf8')).split('\0');
|
|
31
|
+
if (args.some(a => a.includes(o.workspace))) return true;
|
|
32
|
+
// Protect libraries and executables mapped from an otherwise idle checkout.
|
|
33
|
+
try { if ((await fs.readFile(p + '/maps', 'utf8')).includes(o.workspace + path.sep)) return true; } catch {}
|
|
34
|
+
} catch (error) { if (!['ENOENT', 'ESRCH'].includes(error.code)) return true; }
|
|
35
|
+
}
|
|
36
|
+
return false;
|
|
37
|
+
};
|
|
38
|
+
try {
|
|
39
|
+
if (!await real(o.workspace) || !await real(o.target) || !await real(o.profile)) throw new Error('linked-or-missing-directory');
|
|
40
|
+
if (git(['branch', '--show-current']) !== o.branch || git(['rev-parse', '--show-toplevel']) !== o.workspace) throw new Error('workspace-identity-changed');
|
|
41
|
+
const lock = await fs.lstat(path.join(o.profile, '.cargo-lock'));
|
|
42
|
+
if (!lock.isFile() || lock.ino !== o.lockIno || lock.dev !== o.lockDev) throw new Error('cargo-lock-changed');
|
|
43
|
+
const tag = path.join(o.target, 'CACHEDIR.TAG');
|
|
44
|
+
if (!(await fs.lstat(tag)).isFile() || !(await fs.readFile(tag, 'utf8')).startsWith('Signature: 8a477f597d28d172789f06886806bc55')) throw new Error('missing-cargo-cache-tag');
|
|
45
|
+
const manifest = path.join(o.target, '..', 'Cargo.toml');
|
|
46
|
+
if (!(await fs.lstat(manifest)).isFile()) throw new Error('missing-cargo-manifest');
|
|
47
|
+
if (await busy()) throw new Error('workspace-in-use');
|
|
48
|
+
for (const name of ['deps', 'incremental', 'build', '.fingerprint']) {
|
|
49
|
+
const directory = path.join(o.profile, name);
|
|
50
|
+
try {
|
|
51
|
+
if (!await real(directory)) continue;
|
|
52
|
+
const relative = path.relative(o.workspace, directory).split(path.sep).join('/');
|
|
53
|
+
if (git(['ls-files', '--', relative])) throw new Error('tracked-files-in-cache');
|
|
54
|
+
execFileSync('git', ['-C', o.workspace, 'check-ignore', '--quiet', '--', relative + '/'], { timeout: 15000 });
|
|
55
|
+
const entries = await fs.readdir(directory, { withFileTypes: true });
|
|
56
|
+
if (!entries.length) continue;
|
|
57
|
+
if (entries.some(e => name === 'deps'
|
|
58
|
+
? !e.isFile() || !/^[A-Za-z0-9_.-]+-[a-f0-9]{8,32}(?:\.[A-Za-z0-9_.-]+)?$/.test(e.name)
|
|
59
|
+
: !e.isDirectory() || !(name === 'incremental' ? /^[A-Za-z0-9_]+-[a-z0-9]+$/ : /^[A-Za-z0-9_.-]+-[a-f0-9]{8,32}$/).test(e.name))) throw new Error('unknown-cache-content');
|
|
60
|
+
let bytes = 0, newest = 0, count = 0, observed = [];
|
|
61
|
+
const identity = s => [s.dev,s.ino,s.size,s.mtimeMs,s.ctimeMs,s.isFile() ? s.atimeMs : 0].join(':');
|
|
62
|
+
const walk = async p => {
|
|
63
|
+
if (++count > 500000) throw new Error('cache-scan-limit');
|
|
64
|
+
const s = await fs.lstat(p);
|
|
65
|
+
if (!s.isFile() && !s.isDirectory()) throw new Error('linked-or-special-cache-content');
|
|
66
|
+
if (name === 'build') {
|
|
67
|
+
const parts = path.relative(directory, p).split(path.sep);
|
|
68
|
+
if (parts.length === 2 && (s.isDirectory() ? parts[1] !== 'out'
|
|
69
|
+
: !/^(?:invoked\.timestamp|output|stderr|root-output|build-script-build|build_script_build-[a-f0-9]+(?:\.d)?)$/.test(parts[1]))) throw new Error('unknown-cache-content');
|
|
70
|
+
}
|
|
71
|
+
observed.push([p,identity(s)]); newest = Math.max(newest,s.mtimeMs,s.isFile() ? s.atimeMs : 0);
|
|
72
|
+
if (s.isFile()) {
|
|
73
|
+
const file = path.basename(p);
|
|
74
|
+
if (name === 'incremental' && !/\.(?:o|bin|rmeta|bc|lock)$/.test(file)) throw new Error('unknown-cache-content');
|
|
75
|
+
if (name === '.fingerprint' && !/^(?:invoked\.timestamp|(?:lib|bin|test|bench|example|dep|run|build|output)[-_][A-Za-z0-9_.-]+)$/.test(file)) throw new Error('unknown-cache-content');
|
|
76
|
+
bytes += s.size; return;
|
|
77
|
+
}
|
|
78
|
+
for (const e of await fs.readdir(p)) await walk(path.join(p,e));
|
|
79
|
+
};
|
|
80
|
+
const cold = [];
|
|
81
|
+
for (const entry of entries) {
|
|
82
|
+
bytes = 0; newest = 0; observed = [];
|
|
83
|
+
const file = path.join(directory, entry.name); await walk(file);
|
|
84
|
+
if (o.now - newest >= o.idleMs) cold.push({ file, bytes, observed });
|
|
85
|
+
}
|
|
86
|
+
if (!cold.length) throw new Error('recently-used-cache');
|
|
87
|
+
if (await busy()) throw new Error('workspace-in-use');
|
|
88
|
+
for (const item of cold) for (const [p,id] of item.observed) if (identity(await fs.lstat(p)) !== id) throw new Error('cache-changed-during-check');
|
|
89
|
+
// Holding .cargo-lock keeps a new Cargo build from racing the deletion.
|
|
90
|
+
// Reclaim cold units inside a mixed cache, leaving recently read units.
|
|
91
|
+
if (!o.dryRun) {
|
|
92
|
+
for (const item of cold) await fs.rm(item.file, { recursive: true });
|
|
93
|
+
try { await fs.rmdir(directory); } catch (error) { if (!['ENOTEMPTY','EEXIST'].includes(error.code)) throw error; }
|
|
94
|
+
}
|
|
95
|
+
result.push({ path: directory, action: o.dryRun ? 'would-remove' : 'removed', reason: 'verified-idle-cargo-intermediates',
|
|
96
|
+
bytes: cold.reduce((sum,item) => sum + item.bytes, 0), entriesRemoved: cold.length, entriesRetained: entries.length - cold.length });
|
|
97
|
+
} catch (error) { result.push({ path: directory, action: 'retained', reason: error.message || 'cache-validation-failed', bytes: 0 }); }
|
|
98
|
+
}
|
|
99
|
+
} catch (error) { result.push({ path: o.profile, action: 'retained', reason: error.message, bytes: 0 }); }
|
|
100
|
+
process.stdout.write(JSON.stringify(result));
|
|
101
|
+
`;
|
|
102
|
+
/** Only registered Termdock task worktrees and Cargo's disposable internals. */
|
|
103
|
+
export async function pruneWorkspaceCaches(options) {
|
|
104
|
+
const root = path.join(options.stateDirectory, 'task-workspaces'), result = [];
|
|
105
|
+
try {
|
|
106
|
+
if (await fs.realpath(root) !== path.resolve(root) || !(await fs.lstat(root)).isDirectory())
|
|
107
|
+
return [];
|
|
108
|
+
for (const goal of await fs.readdir(root, { withFileTypes: true })) {
|
|
109
|
+
if (!goal.isDirectory() || !/^[a-f0-9]{32}$/.test(goal.name))
|
|
110
|
+
continue;
|
|
111
|
+
for (const task of await fs.readdir(path.join(root, goal.name), { withFileTypes: true })) {
|
|
112
|
+
if (!task.isDirectory())
|
|
113
|
+
continue;
|
|
114
|
+
if (!/^[a-f0-9]{32}-[a-f0-9]{8}$/.test(task.name)) {
|
|
115
|
+
result.push({ path: path.join(root, goal.name, task.name), action: 'retained', reason: 'unrecognized-workspace-name', bytes: 0 });
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
const workspace = path.join(root, goal.name, task.name), branch = `termdock/task/${task.name}`;
|
|
119
|
+
try {
|
|
120
|
+
if (await fs.realpath(workspace) !== workspace || !(await fs.lstat(path.join(workspace, '.git'))).isFile()
|
|
121
|
+
|| await git(workspace, ['rev-parse', '--show-toplevel']) !== workspace || await git(workspace, ['branch', '--show-current']) !== branch)
|
|
122
|
+
continue;
|
|
123
|
+
// Target paths come from tracked manifests, never user-configured output paths.
|
|
124
|
+
const manifests = (await git(workspace, ['ls-files', '-z', '--', 'Cargo.toml', '**/Cargo.toml'])).split('\0').filter(Boolean);
|
|
125
|
+
for (const manifest of manifests) {
|
|
126
|
+
const target = path.join(workspace, path.dirname(manifest), 'target');
|
|
127
|
+
for (const profile of ['debug', 'release']) {
|
|
128
|
+
const directory = path.join(target, profile);
|
|
129
|
+
try {
|
|
130
|
+
const lock = await fs.lstat(path.join(directory, '.cargo-lock'));
|
|
131
|
+
if (process.platform !== 'linux') {
|
|
132
|
+
result.push({ path: directory, action: 'retained', reason: 'cargo-lock-check-unavailable', bytes: 0 });
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
if (!lock.isFile())
|
|
136
|
+
continue;
|
|
137
|
+
const args = { workspace, branch, target, profile: directory, lockIno: lock.ino, lockDev: lock.dev,
|
|
138
|
+
now: options.now ?? Date.now(), idleMs: options.idleMs ?? 7 * DAY, dryRun: options.dryRun === true };
|
|
139
|
+
const { stdout } = await exec('flock', ['-n', '-E', '75', '--', path.join(directory, '.cargo-lock'), process.execPath,
|
|
140
|
+
'--input-type=module', '-e', CARGO_CACHE_WORKER, JSON.stringify(args)], { timeout: 120_000, maxBuffer: 256 * 1024 });
|
|
141
|
+
result.push(...JSON.parse(stdout));
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
if (error.code !== 'ENOENT')
|
|
145
|
+
result.push({ path: directory, action: 'retained', reason: 'cargo-locked-or-check-unavailable', bytes: 0 });
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
result.push({ path: workspace, action: 'retained', reason: 'workspace-identity-unverified', bytes: 0 });
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
catch { /* An absent or unreadable state root is never a reason to delete. */ }
|
|
157
|
+
return result;
|
|
158
|
+
}
|
package/package.json
CHANGED
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.353",
|
|
5
5
|
"runtimeProtocolVersion": 1,
|
|
6
6
|
"minimumDesktopVersion": "1.4.46",
|
|
7
7
|
"nodeMajor": 22,
|
|
8
8
|
"dependencyHash": "sha256-ObG1OGq7e7fMFQmYoPxPp3jRodEusYHulVNa5mT1aW8=",
|
|
9
|
-
"serverBundleHash": "sha256-
|
|
10
|
-
"clientBundleHash": "sha256-
|
|
9
|
+
"serverBundleHash": "sha256-BytBn+wZV+5Djv9XYLw86ORzRirpOjdtlg/oM+wPdWs=",
|
|
10
|
+
"clientBundleHash": "sha256-6TybQLjjHJHW8NiF67Zk6drUXSae+vgx81phwPVL67U=",
|
|
11
11
|
"entrypoint": "dist/server/cli.js",
|
|
12
12
|
"clientEntrypoint": "dist/client/index.html"
|
|
13
13
|
}
|