termdock 1.4.330 → 1.4.331
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-JL8Fd8uO.js → App-xBkso5In.js} +6 -6
- package/dist/client/assets/App-xBkso5In.js.br +0 -0
- package/dist/client/assets/App-xBkso5In.js.gz +0 -0
- package/dist/client/assets/{ArchitecturePanel-CwvZXpvS.js → ArchitecturePanel-DNY0prqs.js} +2 -2
- package/dist/client/assets/ArchitecturePanel-DNY0prqs.js.br +0 -0
- package/dist/client/assets/ArchitecturePanel-DNY0prqs.js.gz +0 -0
- package/dist/client/assets/{ChangeWalkthroughPanel-BF3p_M6Y.js → ChangeWalkthroughPanel-xvUzbgKh.js} +1 -1
- package/dist/client/assets/ChangeWalkthroughPanel-xvUzbgKh.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-xvUzbgKh.js.gz +0 -0
- package/dist/client/assets/{CollaborationMainWorkspace-CYpn4j_x.js → CollaborationMainWorkspace-DsIWXeh0.js} +1 -1
- package/dist/client/assets/CollaborationMainWorkspace-DsIWXeh0.js.br +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-DsIWXeh0.js.gz +0 -0
- package/dist/client/assets/CollaborationTaskContent-DatXl2k_.js +2 -0
- package/dist/client/assets/{ComputerControlView-DWlZmlCH.js → ComputerControlView-D-1UEmtr.js} +3 -3
- package/dist/client/assets/ComputerControlView-D-1UEmtr.js.br +0 -0
- package/dist/client/assets/ComputerControlView-D-1UEmtr.js.gz +0 -0
- package/dist/client/assets/{DagPlayground-IbzlcDVX.js → DagPlayground-1KaifMRo.js} +1 -1
- package/dist/client/assets/DagPlayground-1KaifMRo.js.br +0 -0
- package/dist/client/assets/DagPlayground-1KaifMRo.js.gz +0 -0
- package/dist/client/assets/{DiffLab-DEAYEwfY.js → DiffLab-Dh7lMk1W.js} +1 -1
- package/dist/client/assets/DiffLab-Dh7lMk1W.js.br +0 -0
- package/dist/client/assets/DiffLab-Dh7lMk1W.js.gz +0 -0
- package/dist/client/assets/{DiffReview-BPHfC8nZ.js → DiffReview-Bxe6OacV.js} +1 -1
- package/dist/client/assets/DiffReview-Bxe6OacV.js.br +0 -0
- package/dist/client/assets/DiffReview-Bxe6OacV.js.gz +0 -0
- package/dist/client/assets/{DiffReviewLab-2iKu20Ik.js → DiffReviewLab-CwdLf6kM.js} +1 -1
- package/dist/client/assets/DiffReviewLab-CwdLf6kM.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-CwdLf6kM.js.gz +0 -0
- package/dist/client/assets/{DiffViewer-C4S3oEQV.js → DiffViewer-oGb-V3AK.js} +1 -1
- package/dist/client/assets/DiffViewer-oGb-V3AK.js.br +0 -0
- package/dist/client/assets/DiffViewer-oGb-V3AK.js.gz +0 -0
- package/dist/client/assets/{ModelPreview-D_KABt7i.js → ModelPreview-BTunplWr.js} +1 -1
- package/dist/client/assets/{ModelPreview-D_KABt7i.js.br → ModelPreview-BTunplWr.js.br} +0 -0
- package/dist/client/assets/ModelPreview-BTunplWr.js.gz +0 -0
- package/dist/client/assets/{RightSidebar-scaBEaFJ.js → RightSidebar-DvYmab8z.js} +3 -3
- package/dist/client/assets/RightSidebar-DvYmab8z.js.br +0 -0
- package/dist/client/assets/RightSidebar-DvYmab8z.js.gz +0 -0
- package/dist/client/assets/{abnfDiagram-VCTEODGH-OAQJcJ5a.js → abnfDiagram-VCTEODGH-D4LxQjpJ.js} +1 -1
- package/dist/client/assets/abnfDiagram-VCTEODGH-D4LxQjpJ.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-D4LxQjpJ.js.gz +0 -0
- package/dist/client/assets/app-A96wp9Xv.js +35 -0
- package/dist/client/assets/app-A96wp9Xv.js.br +0 -0
- package/dist/client/assets/app-A96wp9Xv.js.gz +0 -0
- package/dist/client/assets/{arc-B29HLhod.js → arc-BcCf73Fm.js} +1 -1
- package/dist/client/assets/arc-BcCf73Fm.js.br +0 -0
- package/dist/client/assets/arc-BcCf73Fm.js.gz +0 -0
- package/dist/client/assets/{architectureDiagram-5GKGNRK7-CQeKeLzl.js → architectureDiagram-5GKGNRK7-Dfg95GK6.js} +1 -1
- package/dist/client/assets/architectureDiagram-5GKGNRK7-Dfg95GK6.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-Dfg95GK6.js.gz +0 -0
- package/dist/client/assets/{blockDiagram-I7D4REHJ-CgQQGQN_.js → blockDiagram-I7D4REHJ-BwXSp0xK.js} +1 -1
- package/dist/client/assets/blockDiagram-I7D4REHJ-BwXSp0xK.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-BwXSp0xK.js.gz +0 -0
- package/dist/client/assets/{c4Diagram-7LVT6UL2-BTeUIAS9.js → c4Diagram-7LVT6UL2-D4GfUedH.js} +1 -1
- package/dist/client/assets/c4Diagram-7LVT6UL2-D4GfUedH.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-D4GfUedH.js.gz +0 -0
- package/dist/client/assets/channel-k5dcS0_z.js +1 -0
- package/dist/client/assets/{chunk-2Q5K7J3B-Bao8D59Y.js → chunk-2Q5K7J3B-BqcmDKjo.js} +1 -1
- package/dist/client/assets/{chunk-5VM5RSS4-RIpn4ucJ.js → chunk-5VM5RSS4-BBV3_wnk.js} +1 -1
- package/dist/client/assets/{chunk-F27PBJKO-Cu3ypVNN.js → chunk-F27PBJKO-B-r7e040.js} +1 -1
- package/dist/client/assets/chunk-F27PBJKO-B-r7e040.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-B-r7e040.js.gz +0 -0
- package/dist/client/assets/{chunk-IMKFNOWR-BioTa0jG.js → chunk-IMKFNOWR-B83oWEy_.js} +1 -1
- package/dist/client/assets/chunk-IMKFNOWR-B83oWEy_.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-B83oWEy_.js.gz +0 -0
- package/dist/client/assets/{chunk-JWPE2WC7-BPE5l-1s.js → chunk-JWPE2WC7-C2FW583q.js} +1 -1
- package/dist/client/assets/{chunk-POPQ4Y6H-DUF-0HB1.js → chunk-POPQ4Y6H-BWU7oLd-.js} +1 -1
- package/dist/client/assets/{chunk-SVP7TREG-BHaV6_ki.js → chunk-SVP7TREG-C5OgXymb.js} +1 -1
- package/dist/client/assets/chunk-SVP7TREG-C5OgXymb.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-C5OgXymb.js.gz +0 -0
- package/dist/client/assets/{chunk-TICWLB2K-SU15adqY.js → chunk-TICWLB2K-B1LlRwu4.js} +1 -1
- package/dist/client/assets/chunk-TICWLB2K-B1LlRwu4.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-B1LlRwu4.js.gz +0 -0
- package/dist/client/assets/{chunk-XXDRQBXY-oLy1dZJs.js → chunk-XXDRQBXY-7l9gcG6S.js} +1 -1
- package/dist/client/assets/classDiagram-ZZMXUADV-DQzBzWJL.js +1 -0
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-DQzBzWJL.js +1 -0
- package/dist/client/assets/{cose-bilkent-JH36ORCC-EE27IbbX.js → cose-bilkent-JH36ORCC-DNBCyqkI.js} +1 -1
- package/dist/client/assets/{cose-bilkent-JH36ORCC-EE27IbbX.js.br → cose-bilkent-JH36ORCC-DNBCyqkI.js.br} +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-DNBCyqkI.js.gz +0 -0
- package/dist/client/assets/{cynefin-OW5HDTMX-CpY9J9iu.js → cynefin-OW5HDTMX-BiCAbJSv.js} +1 -1
- package/dist/client/assets/cynefin-OW5HDTMX-BiCAbJSv.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-BiCAbJSv.js.gz +0 -0
- package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-mJxcQnkp.js → cynefinDiagram-5FMLGOSQ-CaRucQy9.js} +1 -1
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CaRucQy9.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CaRucQy9.js.gz +0 -0
- package/dist/client/assets/{dagre-GXQ25YYZ-DAUZrxwq.js → dagre-GXQ25YYZ-kU4wdq9U.js} +1 -1
- package/dist/client/assets/dagre-GXQ25YYZ-kU4wdq9U.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-kU4wdq9U.js.gz +0 -0
- package/dist/client/assets/{diagram-S7CK7UJ4-3rquuCu6.js → diagram-S7CK7UJ4-BvDFZeQg.js} +1 -1
- package/dist/client/assets/diagram-S7CK7UJ4-BvDFZeQg.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-BvDFZeQg.js.gz +0 -0
- package/dist/client/assets/{diagram-UQ7AKVKN-CZWjaDbi.js → diagram-UQ7AKVKN-DYTly1n3.js} +1 -1
- package/dist/client/assets/diagram-UQ7AKVKN-DYTly1n3.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-DYTly1n3.js.gz +0 -0
- package/dist/client/assets/{diagram-VSXAHHWV-CNQEg3jR.js → diagram-VSXAHHWV-C0bMSg7N.js} +1 -1
- package/dist/client/assets/diagram-VSXAHHWV-C0bMSg7N.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-C0bMSg7N.js.gz +0 -0
- package/dist/client/assets/{diagram-VX7I27RA-DYorDR1n.js → diagram-VX7I27RA-C9_Uoa7n.js} +1 -1
- package/dist/client/assets/diagram-VX7I27RA-C9_Uoa7n.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-C9_Uoa7n.js.gz +0 -0
- package/dist/client/assets/{diagram-Z3DM3KII-BPgvVftJ.js → diagram-Z3DM3KII-CLsF0k3J.js} +1 -1
- package/dist/client/assets/diagram-Z3DM3KII-CLsF0k3J.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-CLsF0k3J.js.gz +0 -0
- package/dist/client/assets/{ebnfDiagram-PWID7BFC-KqpJv-fX.js → ebnfDiagram-PWID7BFC-Bt6b2Ygi.js} +1 -1
- package/dist/client/assets/ebnfDiagram-PWID7BFC-Bt6b2Ygi.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-Bt6b2Ygi.js.gz +0 -0
- package/dist/client/assets/{erDiagram-RLTQ6QDP-Bwj_TPoi.js → erDiagram-RLTQ6QDP-Bs5jB7E2.js} +1 -1
- package/dist/client/assets/erDiagram-RLTQ6QDP-Bs5jB7E2.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-Bs5jB7E2.js.gz +0 -0
- package/dist/client/assets/{flowDiagram-HODETNUW-BYALZ5I6.js → flowDiagram-HODETNUW-BCSeo8DJ.js} +1 -1
- package/dist/client/assets/flowDiagram-HODETNUW-BCSeo8DJ.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-BCSeo8DJ.js.gz +0 -0
- package/dist/client/assets/{ganttDiagram-EL5Y4UJY-DwrR8yW_.js → ganttDiagram-EL5Y4UJY-BnCBe-Ue.js} +1 -1
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-BnCBe-Ue.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-BnCBe-Ue.js.gz +0 -0
- package/dist/client/assets/{gestureArbiter-4NWfZprH.js → gestureArbiter-W1Lo4NZw.js} +1 -1
- package/dist/client/assets/gestureArbiter-W1Lo4NZw.js.br +0 -0
- package/dist/client/assets/gestureArbiter-W1Lo4NZw.js.gz +0 -0
- package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-C3pH5ZGR.js → gitGraphDiagram-WWUBYQGX-C7BJXlkD.js} +1 -1
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-C7BJXlkD.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-C7BJXlkD.js.gz +0 -0
- package/dist/client/assets/{infoDiagram-27XIBGKW-DpnbClE9.js → infoDiagram-27XIBGKW-CJXzvnav.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-5VMMS53U-BFhiY6uy.js → ishikawaDiagram-5VMMS53U-BoBCZ1Wa.js} +1 -1
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-BoBCZ1Wa.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-BoBCZ1Wa.js.gz +0 -0
- package/dist/client/assets/{journeyDiagram-3NMN7TZE-Beg2Cmg4.js → journeyDiagram-3NMN7TZE-C5bywqIt.js} +1 -1
- package/dist/client/assets/journeyDiagram-3NMN7TZE-C5bywqIt.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-C5bywqIt.js.gz +0 -0
- package/dist/client/assets/{kanban-definition-UXKFOSKX-CNb51-_F.js → kanban-definition-UXKFOSKX-ChHpoQyu.js} +1 -1
- package/dist/client/assets/kanban-definition-UXKFOSKX-ChHpoQyu.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-ChHpoQyu.js.gz +0 -0
- package/dist/client/assets/{layout-B07GM-uc.js → layout-e7M-xuok.js} +1 -1
- package/dist/client/assets/layout-e7M-xuok.js.br +0 -0
- package/dist/client/assets/layout-e7M-xuok.js.gz +0 -0
- package/dist/client/assets/{linear-DRJlaLbJ.js → linear-A5CrihlL.js} +1 -1
- package/dist/client/assets/linear-A5CrihlL.js.br +0 -0
- package/dist/client/assets/linear-A5CrihlL.js.gz +0 -0
- package/dist/client/assets/{mermaid.core-BySznxI_.js → mermaid.core-BNac_Y3z.js} +5 -5
- package/dist/client/assets/mermaid.core-BNac_Y3z.js.br +0 -0
- package/dist/client/assets/{mermaid.core-BySznxI_.js.gz → mermaid.core-BNac_Y3z.js.gz} +0 -0
- package/dist/client/assets/{mindmap-definition-YA3MSWOX-BtStMFHK.js → mindmap-definition-YA3MSWOX-fQoEGcCr.js} +1 -1
- package/dist/client/assets/mindmap-definition-YA3MSWOX-fQoEGcCr.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-fQoEGcCr.js.gz +0 -0
- package/dist/client/assets/{passwordBootstrap-B-T8YSfQ.js → passwordBootstrap--0YoOXsx.js} +1 -1
- package/dist/client/assets/passwordBootstrap--0YoOXsx.js.br +0 -0
- package/dist/client/assets/passwordBootstrap--0YoOXsx.js.gz +0 -0
- package/dist/client/assets/{pegDiagram-XKGWAZYB-BNJzxFGK.js → pegDiagram-XKGWAZYB-CYbfla8A.js} +1 -1
- package/dist/client/assets/pegDiagram-XKGWAZYB-CYbfla8A.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-CYbfla8A.js.gz +0 -0
- package/dist/client/assets/{pieDiagram-E7YTZNPT-Df1Y6zou.js → pieDiagram-E7YTZNPT-B6--ZKXC.js} +1 -1
- package/dist/client/assets/pieDiagram-E7YTZNPT-B6--ZKXC.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-B6--ZKXC.js.gz +0 -0
- package/dist/client/assets/{quadrantDiagram-AXDQQJYC-Q3jN6--F.js → quadrantDiagram-AXDQQJYC-Bau_h7Jl.js} +1 -1
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-Bau_h7Jl.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-Bau_h7Jl.js.gz +0 -0
- package/dist/client/assets/{railroadDiagram-O6MQD6OU-c-1SN7pC.js → railroadDiagram-O6MQD6OU-CApEuiEL.js} +1 -1
- package/dist/client/assets/railroadDiagram-O6MQD6OU-CApEuiEL.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-CApEuiEL.js.gz +0 -0
- package/dist/client/assets/{rdpSession-B6j6_C4D.js → rdpSession-CydBq1bk.js} +1 -1
- package/dist/client/assets/rdpSession-CydBq1bk.js.br +0 -0
- package/dist/client/assets/rdpSession-CydBq1bk.js.gz +0 -0
- package/dist/client/assets/{referenceLongPress-Bln9X6SW.js → referenceLongPress-8ExgTbB3.js} +1 -1
- package/dist/client/assets/referenceLongPress-8ExgTbB3.js.br +0 -0
- package/dist/client/assets/referenceLongPress-8ExgTbB3.js.gz +0 -0
- package/dist/client/assets/{requirementDiagram-BXWQKSXE-wcsUZu82.js → requirementDiagram-BXWQKSXE-Rxe80d7j.js} +1 -1
- package/dist/client/assets/requirementDiagram-BXWQKSXE-Rxe80d7j.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-Rxe80d7j.js.gz +0 -0
- package/dist/client/assets/{sankeyDiagram-P5KCCOFB-CfXyROPC.js → sankeyDiagram-P5KCCOFB-BaPl8d6E.js} +1 -1
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-BaPl8d6E.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-BaPl8d6E.js.gz +0 -0
- package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-D-IasKbj.js → sequenceDiagram-WJ2MYXX4-Asyx5gWK.js} +1 -1
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-Asyx5gWK.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-Asyx5gWK.js.gz +0 -0
- package/dist/client/assets/{sizeCapture-INFHLROL-Cyoh7jyx.js → sizeCapture-INFHLROL-BQaSglof.js} +1 -1
- package/dist/client/assets/sizeCapture-INFHLROL-BQaSglof.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-BQaSglof.js.gz +0 -0
- package/dist/client/assets/{sparkles-kooHQYLJ.js → sparkles-BMR6NziM.js} +1 -1
- package/dist/client/assets/{stateDiagram-D77RDMKH-BFeLYGOW.js → stateDiagram-D77RDMKH-DycNNggj.js} +1 -1
- package/dist/client/assets/stateDiagram-D77RDMKH-DycNNggj.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-DycNNggj.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-CS1AgP_n.js +1 -0
- package/dist/client/assets/{swimlanes-42K2YHIH-BtMhgPB2.js → swimlanes-42K2YHIH-2Z5Zd5j6.js} +1 -1
- package/dist/client/assets/swimlanes-42K2YHIH-2Z5Zd5j6.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH-2Z5Zd5j6.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-Cxqp7K9j.js +8 -0
- package/dist/client/assets/{timeline-definition-24CTP7MA-BccUO5W0.js → timeline-definition-24CTP7MA-BHiRARcP.js} +1 -1
- package/dist/client/assets/timeline-definition-24CTP7MA-BHiRARcP.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-BHiRARcP.js.gz +0 -0
- package/dist/client/assets/{triangle-alert-rgLWcpfP.js → triangle-alert-TsfoVQJR.js} +1 -1
- package/dist/client/assets/{vennDiagram-4TSXK5OY-hNN_O594.js → vennDiagram-4TSXK5OY-JgKZ8N2y.js} +1 -1
- package/dist/client/assets/vennDiagram-4TSXK5OY-JgKZ8N2y.js.br +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-JgKZ8N2y.js.gz +0 -0
- package/dist/client/assets/{videoCompression-DS0r00L6.js → videoCompression-DGfMcwdq.js} +1 -1
- package/dist/client/assets/videoCompression-DGfMcwdq.js.br +0 -0
- package/dist/client/assets/videoCompression-DGfMcwdq.js.gz +0 -0
- package/dist/client/assets/{wardleyDiagram-VM6X3IG4-C6h02bPv.js → wardleyDiagram-VM6X3IG4-DNmP9dmD.js} +1 -1
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-DNmP9dmD.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-DNmP9dmD.js.gz +0 -0
- package/dist/client/assets/{xychartDiagram-S5SC5T6Z-DvNnLmXs.js → xychartDiagram-S5SC5T6Z-BBFR9gmo.js} +1 -1
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-BBFR9gmo.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-BBFR9gmo.js.gz +0 -0
- package/dist/client/index.html +1 -1
- package/dist/client/index.html.br +0 -0
- package/dist/client/index.html.gz +0 -0
- package/dist/client/sw-encrypted-background.js +1 -1
- package/dist/client/sw-encrypted-background.js.br +0 -0
- package/dist/client/sw-encrypted-background.js.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/collaborationPeerTransport.js +2 -1
- package/dist/server/federation/relay.js +121 -37
- package/dist/server/federation/streamLimits.js +5 -0
- package/package.json +1 -1
- package/runtime-manifest.json +3 -3
- package/dist/client/assets/App-JL8Fd8uO.js.br +0 -0
- package/dist/client/assets/App-JL8Fd8uO.js.gz +0 -0
- package/dist/client/assets/ArchitecturePanel-CwvZXpvS.js.br +0 -0
- package/dist/client/assets/ArchitecturePanel-CwvZXpvS.js.gz +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-BF3p_M6Y.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-BF3p_M6Y.js.gz +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-CYpn4j_x.js.br +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-CYpn4j_x.js.gz +0 -0
- package/dist/client/assets/CollaborationTaskContent-BjjX05Cv.js +0 -2
- package/dist/client/assets/ComputerControlView-DWlZmlCH.js.br +0 -0
- package/dist/client/assets/ComputerControlView-DWlZmlCH.js.gz +0 -0
- package/dist/client/assets/DagPlayground-IbzlcDVX.js.br +0 -0
- package/dist/client/assets/DagPlayground-IbzlcDVX.js.gz +0 -0
- package/dist/client/assets/DiffLab-DEAYEwfY.js.br +0 -0
- package/dist/client/assets/DiffLab-DEAYEwfY.js.gz +0 -0
- package/dist/client/assets/DiffReview-BPHfC8nZ.js.br +0 -0
- package/dist/client/assets/DiffReview-BPHfC8nZ.js.gz +0 -0
- package/dist/client/assets/DiffReviewLab-2iKu20Ik.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-2iKu20Ik.js.gz +0 -0
- package/dist/client/assets/DiffViewer-C4S3oEQV.js.br +0 -0
- package/dist/client/assets/DiffViewer-C4S3oEQV.js.gz +0 -0
- package/dist/client/assets/ModelPreview-D_KABt7i.js.gz +0 -0
- package/dist/client/assets/RightSidebar-scaBEaFJ.js.br +0 -0
- package/dist/client/assets/RightSidebar-scaBEaFJ.js.gz +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-OAQJcJ5a.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-OAQJcJ5a.js.gz +0 -0
- package/dist/client/assets/app-aNkllBsm.js +0 -35
- package/dist/client/assets/app-aNkllBsm.js.br +0 -0
- package/dist/client/assets/app-aNkllBsm.js.gz +0 -0
- package/dist/client/assets/arc-B29HLhod.js.br +0 -0
- package/dist/client/assets/arc-B29HLhod.js.gz +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-CQeKeLzl.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-CQeKeLzl.js.gz +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-CgQQGQN_.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-CgQQGQN_.js.gz +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-BTeUIAS9.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-BTeUIAS9.js.gz +0 -0
- package/dist/client/assets/channel-DPAqeRss.js +0 -1
- package/dist/client/assets/chunk-F27PBJKO-Cu3ypVNN.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-Cu3ypVNN.js.gz +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-BioTa0jG.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-BioTa0jG.js.gz +0 -0
- package/dist/client/assets/chunk-SVP7TREG-BHaV6_ki.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-BHaV6_ki.js.gz +0 -0
- package/dist/client/assets/chunk-TICWLB2K-SU15adqY.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-SU15adqY.js.gz +0 -0
- package/dist/client/assets/classDiagram-ZZMXUADV-kQeU2Z7d.js +0 -1
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-kQeU2Z7d.js +0 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-EE27IbbX.js.gz +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-CpY9J9iu.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-CpY9J9iu.js.gz +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-mJxcQnkp.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-mJxcQnkp.js.gz +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-DAUZrxwq.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-DAUZrxwq.js.gz +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-3rquuCu6.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-3rquuCu6.js.gz +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-CZWjaDbi.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-CZWjaDbi.js.gz +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-CNQEg3jR.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-CNQEg3jR.js.gz +0 -0
- package/dist/client/assets/diagram-VX7I27RA-DYorDR1n.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-DYorDR1n.js.gz +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-BPgvVftJ.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-BPgvVftJ.js.gz +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-KqpJv-fX.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-KqpJv-fX.js.gz +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-Bwj_TPoi.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-Bwj_TPoi.js.gz +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-BYALZ5I6.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-BYALZ5I6.js.gz +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-DwrR8yW_.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-DwrR8yW_.js.gz +0 -0
- package/dist/client/assets/gestureArbiter-4NWfZprH.js.br +0 -0
- package/dist/client/assets/gestureArbiter-4NWfZprH.js.gz +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-C3pH5ZGR.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-C3pH5ZGR.js.gz +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-BFhiY6uy.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-BFhiY6uy.js.gz +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-Beg2Cmg4.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-Beg2Cmg4.js.gz +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-CNb51-_F.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-CNb51-_F.js.gz +0 -0
- package/dist/client/assets/layout-B07GM-uc.js.br +0 -0
- package/dist/client/assets/layout-B07GM-uc.js.gz +0 -0
- package/dist/client/assets/linear-DRJlaLbJ.js.br +0 -0
- package/dist/client/assets/linear-DRJlaLbJ.js.gz +0 -0
- package/dist/client/assets/mermaid.core-BySznxI_.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-BtStMFHK.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-BtStMFHK.js.gz +0 -0
- package/dist/client/assets/passwordBootstrap-B-T8YSfQ.js.br +0 -0
- package/dist/client/assets/passwordBootstrap-B-T8YSfQ.js.gz +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-BNJzxFGK.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-BNJzxFGK.js.gz +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-Df1Y6zou.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-Df1Y6zou.js.gz +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-Q3jN6--F.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-Q3jN6--F.js.gz +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-c-1SN7pC.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-c-1SN7pC.js.gz +0 -0
- package/dist/client/assets/rdpSession-B6j6_C4D.js.br +0 -0
- package/dist/client/assets/rdpSession-B6j6_C4D.js.gz +0 -0
- package/dist/client/assets/referenceLongPress-Bln9X6SW.js.br +0 -0
- package/dist/client/assets/referenceLongPress-Bln9X6SW.js.gz +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-wcsUZu82.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-wcsUZu82.js.gz +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-CfXyROPC.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-CfXyROPC.js.gz +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-D-IasKbj.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-D-IasKbj.js.gz +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-Cyoh7jyx.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-Cyoh7jyx.js.gz +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-BFeLYGOW.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-BFeLYGOW.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-Cn5inEsZ.js +0 -1
- package/dist/client/assets/swimlanes-42K2YHIH-BtMhgPB2.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH-BtMhgPB2.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-Di2Vfydj.js +0 -8
- package/dist/client/assets/timeline-definition-24CTP7MA-BccUO5W0.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-BccUO5W0.js.gz +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-hNN_O594.js.br +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-hNN_O594.js.gz +0 -0
- package/dist/client/assets/videoCompression-DS0r00L6.js.br +0 -0
- package/dist/client/assets/videoCompression-DS0r00L6.js.gz +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-C6h02bPv.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-C6h02bPv.js.gz +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-DvNnLmXs.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-DvNnLmXs.js.gz +0 -0
|
Binary file
|
|
Binary file
|
package/dist/client/sw.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
if(!self.define){let e,s={};const n=(n,i)=>(n=new URL(n+".js",i).href,s[n]||new Promise(s=>{if("document"in self){const e=document.createElement("script");e.src=n,e.onload=s,document.head.appendChild(e)}else e=n,importScripts(n),s()}).then(()=>{let e=s[n];if(!e)throw new Error(`Module ${n} didn’t register its module`);return e}));self.define=(i,a)=>{const o=e||("document"in self?document.currentScript.src:"")||location.href;if(s[o])return;let
|
|
1
|
+
if(!self.define){let e,s={};const n=(n,i)=>(n=new URL(n+".js",i).href,s[n]||new Promise(s=>{if("document"in self){const e=document.createElement("script");e.src=n,e.onload=s,document.head.appendChild(e)}else e=n,importScripts(n),s()}).then(()=>{let e=s[n];if(!e)throw new Error(`Module ${n} didn’t register its module`);return e}));self.define=(i,a)=>{const o=e||("document"in self?document.currentScript.src:"")||location.href;if(s[o])return;let c={};const r=e=>n(e,o),d={module:{uri:o},exports:c,require:r};s[o]=Promise.all(i.map(e=>d[e]||r(e))).then(e=>(a(...e),c))}}define(["./workbox-9845bf53"],function(e){"use strict";importScripts("sw-encrypted-background.js","sw-notifications.js","sw-secure-api.js","sw-downloads.js"),self.addEventListener("message",e=>{e.data&&"SKIP_WAITING"===e.data.type&&self.skipWaiting()}),e.clientsClaim(),e.precacheAndRoute([{url:"index.html",revision:"bc64b8c1fa3ef473a31f37178b747d16"},{url:"assets/app-A96wp9Xv.js",revision:null},{url:"assets/react-XDCjal2T.js",revision:null},{url:"assets/dnd-BCFAPC0L.js",revision:null},{url:"assets/terminal-C7X98Amf.js",revision:null},{url:"assets/index-e1PkqIqN.css",revision:null},{url:"icons/agents/opencode.svg",revision:"851c2931d95821ba2b39b68587b48976"},{url:"icons/agents/kimi.svg",revision:"5366c710f4f763022fe159a69cf17409"},{url:"icons/agents/grok.svg",revision:"cd745b0b964545bc7a6b4f36021c3298"},{url:"icons/agents/goose.svg",revision:"c79b927278983c19098d77b4b0c11ab3"},{url:"icons/agents/gemini.svg",revision:"7a64f6d6f80a908255e9c0256903882e"},{url:"icons/agents/droid.svg",revision:"f28723b8c5c115e0908ba3c72613e256"},{url:"icons/agents/cursor.svg",revision:"a1528f3d3cda497f75a5db28defb19de"},{url:"icons/agents/copilot.svg",revision:"dd52e96c1eac0b6ec4bedcd0ddd3b52d"},{url:"icons/agents/codex.svg",revision:"608e55babb0b217e1f2da287342b46d3"},{url:"icons/agents/claude.svg",revision:"08af0225b7acdd8e8f573f3247e5e1c3"},{url:"icons/agents/amp.svg",revision:"af12f8b33faa81e4d46ea7b93c7e43f3"},{url:"apple-touch-icon-180x180.png",revision:"628c2e2f28a9b545aa57be1352025643"},{url:"boot-logo.png",revision:"2e3a25efd9b0b8ca1eab53b5f2284556"},{url:"favicon.ico",revision:"2994debfa6f59a0898e24eb0c54d64b5"},{url:"ipad-status-bar.js",revision:"3a8080edb8a5cc658a7908f6ad69537f"},{url:"maskable-icon-512x512.png",revision:"4d489331fd81f0713c400b26426442b9"},{url:"pwa-192x192.png",revision:"4d6f899888cfb8ccd7a1fd3c9e583ad2"},{url:"pwa-512x512.png",revision:"0885dd7ec8932e7f878b013d51a380a4"},{url:"robots.txt",revision:"d9339907142917dee4aac78494ac9cfe"},{url:"sw-downloads.js",revision:"48dab2e78bd93b4eee27fca487eccfde"},{url:"sw-notifications.js",revision:"fde578590ea8b0540d488ef448b48f45"},{url:"sw-secure-api.js",revision:"cf2bdbd03d41d66d60344c0b5a1075de"},{url:"manifest.webmanifest",revision:"83f9a43b74c236012adafb077fb6d774"}],{}),e.cleanupOutdatedCaches(),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("index.html"),{denylist:[/^\/api\//,/^\/__termdock-download\//,/^\/health$/]})),e.registerRoute(/\/assets\/.*\.(?:js|css)$/,new e.CacheFirst({cacheName:"termdock-lazy-assets-v1",plugins:[new e.CacheableResponsePlugin({statuses:[0,200]}),new e.ExpirationPlugin({maxEntries:96,maxAgeSeconds:2592e3})]}),"GET"),e.registerRoute(/\/fonts\/terminal\/[^/]+-[a-f0-9]{12}\.woff2$/,new e.CacheFirst({cacheName:"termdock-fonts-v2",plugins:[new e.CacheableResponsePlugin({statuses:[0,200]}),new e.ExpirationPlugin({maxEntries:384,maxAgeSeconds:2592e3})]}),"GET"),e.registerRoute(/\/fonts\/.*\.(?:woff2|ttf)$/,new e.StaleWhileRevalidate({cacheName:"termdock-fonts-v1",plugins:[new e.ExpirationPlugin({maxEntries:24,maxAgeSeconds:2592e3})]}),"GET")});
|
package/dist/client/sw.js.br
CHANGED
|
Binary file
|
package/dist/client/sw.js.gz
CHANGED
|
Binary file
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { RELAY_CLIENT_CONNECT_TIMEOUT_MS } from '../federation/streamLimits.js';
|
|
1
2
|
import { encryptedRequestSubject } from '../federation/requestContext.js';
|
|
2
3
|
import { randomUUID } from 'node:crypto';
|
|
3
4
|
import { readFileSync, writeFileSync, renameSync, mkdirSync } from 'node:fs';
|
|
@@ -164,7 +165,7 @@ function relayDuplex(socket, target) {
|
|
|
164
165
|
let readyResolve, readyReject;
|
|
165
166
|
const ready = new Promise((resolve, reject) => { readyResolve = resolve; readyReject = reject; });
|
|
166
167
|
void ready.catch(() => { });
|
|
167
|
-
const timer = setTimeout(() => fail(new Error('ROUTE_TIMEOUT')),
|
|
168
|
+
const timer = setTimeout(() => fail(new Error('ROUTE_TIMEOUT')), RELAY_CLIENT_CONNECT_TIMEOUT_MS);
|
|
168
169
|
const fail = (error) => { clearTimeout(timer); readyReject(error); queue.end(error); socket.close(); };
|
|
169
170
|
const send = (frame) => {
|
|
170
171
|
if (socket.readyState !== 1 || socket.bufferedAmount > 1024 * 1024)
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import { RELAY_PROVIDER_CONNECT_TIMEOUT_MS, RELAY_ROUTE_OPEN_TIMEOUT_MS } from './streamLimits.js';
|
|
1
2
|
import { randomUUID } from 'node:crypto';
|
|
2
3
|
import { EventEmitter } from 'node:events';
|
|
3
4
|
const defaults = { maxFrameBytes: 256 * 1024, maxBufferedBytes: 1024 * 1024,
|
|
4
|
-
maxStreams: 128, heartbeatMs: 30_000, maxRouteTtlMs: 90_000, connectTimeoutMs:
|
|
5
|
+
maxStreams: 128, heartbeatMs: 30_000, maxRouteTtlMs: 90_000, connectTimeoutMs: RELAY_PROVIDER_CONNECT_TIMEOUT_MS, routeTimeoutMs: RELAY_ROUTE_OPEN_TIMEOUT_MS };
|
|
5
6
|
const identifier = (v) => typeof v === 'string' && /^[a-zA-Z0-9_.:-]{1,160}$/.test(v);
|
|
6
7
|
function parse(raw, limits) {
|
|
7
8
|
if (Buffer.byteLength(raw instanceof Array ? Buffer.concat(raw) : raw) > limits.maxFrameBytes)
|
|
@@ -90,9 +91,11 @@ export class RelayRouter {
|
|
|
90
91
|
this.options = options;
|
|
91
92
|
this.limits = { ...defaults, ...options };
|
|
92
93
|
this.sweep = setInterval(() => {
|
|
93
|
-
for (const [id,
|
|
94
|
-
|
|
95
|
-
this.
|
|
94
|
+
for (const [id, routes] of this.routes)
|
|
95
|
+
for (const [peer, route] of routes) {
|
|
96
|
+
if (route.expires <= Date.now() || peer.ws.readyState !== 1 || !this.canRegister(peer, id))
|
|
97
|
+
this.withdraw(id, peer);
|
|
98
|
+
}
|
|
96
99
|
for (const peer of this.peers)
|
|
97
100
|
for (const stream of [...peer.streams.values()]) {
|
|
98
101
|
if (stream.owner === peer && !this.canRoute(peer, stream.serviceId))
|
|
@@ -107,16 +110,22 @@ export class RelayRouter {
|
|
|
107
110
|
canRoute(peer, serviceId) {
|
|
108
111
|
return !this.directPeers.has(peer) && this.options.allowRoute(peer.principal, serviceId);
|
|
109
112
|
}
|
|
113
|
+
providers(serviceId) {
|
|
114
|
+
return [...(this.routes.get(serviceId) || [])]
|
|
115
|
+
.filter(([peer, route]) => route.expires > Date.now() && peer.ws.readyState === 1 && this.canRegister(peer, serviceId))
|
|
116
|
+
// Recent target failures lower priority but never make the only route disappear.
|
|
117
|
+
.sort((a, b) => Math.max(0, a[1].retryAfter - Date.now()) - Math.max(0, b[1].retryAfter - Date.now()))
|
|
118
|
+
.map(([peer]) => peer);
|
|
119
|
+
}
|
|
110
120
|
hasRoute(serviceId) {
|
|
111
|
-
|
|
112
|
-
return !this.stopped && !!route && route.expires > Date.now() && route.peer.ws.readyState === 1 && this.canRegister(route.peer, serviceId);
|
|
121
|
+
return !this.stopped && this.providers(serviceId).length > 0;
|
|
113
122
|
}
|
|
114
123
|
activeRouteIds() {
|
|
115
124
|
return [...this.routes.keys()].filter(serviceId => this.hasRoute(serviceId));
|
|
116
125
|
}
|
|
117
126
|
/** Trusted local configuration only. Clients never supply a target URL or factory. */
|
|
118
127
|
registerDirect(serviceId, connect) {
|
|
119
|
-
if (this.stopped || !identifier(serviceId) || typeof connect !== 'function' || this.
|
|
128
|
+
if (this.stopped || !identifier(serviceId) || typeof connect !== 'function' || [...this.peers].some(peer => this.directPeers.get(peer) === serviceId))
|
|
120
129
|
throw new Error('Invalid or already registered direct target');
|
|
121
130
|
const [routerWire, clientWire] = memoryPair();
|
|
122
131
|
// The private WeakMap marks this peer; its placeholder principal is never
|
|
@@ -139,6 +148,10 @@ export class RelayRouter {
|
|
|
139
148
|
}
|
|
140
149
|
/** Caller awaits attach before completing its application-level ready handshake. */
|
|
141
150
|
async attach(ws, context) {
|
|
151
|
+
if (this.stopped) {
|
|
152
|
+
ws.close(1001, 'Router stopped');
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
142
155
|
// Reject early application frames rather than buffering untrusted traffic while authenticating.
|
|
143
156
|
let early = false;
|
|
144
157
|
const rejectEarly = () => { early = true; ws.close(1008, 'Authentication pending'); };
|
|
@@ -151,7 +164,7 @@ export class RelayRouter {
|
|
|
151
164
|
principal = null;
|
|
152
165
|
}
|
|
153
166
|
ws.off('message', rejectEarly);
|
|
154
|
-
if (principal === null || early || ws.readyState !== 1) {
|
|
167
|
+
if (this.stopped || principal === null || early || ws.readyState !== 1) {
|
|
155
168
|
ws.close(1008, 'Relay authentication required');
|
|
156
169
|
return false;
|
|
157
170
|
}
|
|
@@ -169,72 +182,131 @@ export class RelayRouter {
|
|
|
169
182
|
return true;
|
|
170
183
|
}
|
|
171
184
|
withdraw(serviceId, peer) {
|
|
172
|
-
|
|
185
|
+
const routes = this.routes.get(serviceId);
|
|
186
|
+
routes?.delete(peer);
|
|
187
|
+
if (!routes?.size)
|
|
173
188
|
this.routes.delete(serviceId);
|
|
174
189
|
for (const stream of [...peer.streams.values()])
|
|
175
190
|
if (stream.serviceId === serviceId && stream.provider === peer)
|
|
176
|
-
this.
|
|
191
|
+
this.providerFailed(stream, 'Route unavailable');
|
|
177
192
|
}
|
|
178
193
|
remove(peer) {
|
|
179
194
|
this.peers.delete(peer);
|
|
180
|
-
|
|
181
|
-
|
|
195
|
+
// Consumers cannot fail over after disconnecting; remove them first.
|
|
196
|
+
for (const stream of [...peer.streams.values()])
|
|
197
|
+
if (stream.owner === peer)
|
|
198
|
+
this.closeStream(stream, 'Relay disconnected');
|
|
199
|
+
for (const [id, routes] of this.routes)
|
|
200
|
+
if (routes.has(peer))
|
|
182
201
|
this.withdraw(id, peer);
|
|
183
202
|
for (const stream of [...peer.streams.values()])
|
|
184
|
-
this.
|
|
203
|
+
this.providerFailed(stream, 'Relay disconnected');
|
|
185
204
|
}
|
|
186
205
|
closeStream(s, reason) {
|
|
206
|
+
if (s.owner.streams.get(s.ownerId) !== s)
|
|
207
|
+
return;
|
|
208
|
+
clearTimeout(s.deadline);
|
|
187
209
|
s.owner.streams.delete(s.ownerId);
|
|
188
|
-
s.provider.streams.
|
|
210
|
+
if (s.provider.streams.get(s.providerId) === s) {
|
|
211
|
+
s.provider.streams.delete(s.providerId);
|
|
212
|
+
send(s.provider.ws, { type: 'close', streamId: s.providerId, reason }, this.limits);
|
|
213
|
+
}
|
|
189
214
|
send(s.owner.ws, { type: 'close', streamId: s.ownerId, reason }, this.limits);
|
|
215
|
+
}
|
|
216
|
+
providerFailed(s, reason) {
|
|
217
|
+
if (s.owner.streams.get(s.ownerId) !== s)
|
|
218
|
+
return;
|
|
219
|
+
clearTimeout(s.deadline);
|
|
220
|
+
s.provider.streams.delete(s.providerId);
|
|
190
221
|
send(s.provider.ws, { type: 'close', streamId: s.providerId, reason }, this.limits);
|
|
222
|
+
const route = this.routes.get(s.serviceId)?.get(s.provider);
|
|
223
|
+
if (route)
|
|
224
|
+
route.retryAfter = Date.now() + 5000;
|
|
225
|
+
// Never replay ciphertext (or terminal input) onto a replacement transport.
|
|
226
|
+
if (s.opened || !this.openProvider(s))
|
|
227
|
+
this.closeStream(s, reason);
|
|
228
|
+
}
|
|
229
|
+
openProvider(s) {
|
|
230
|
+
if (this.stopped || Date.now() >= s.expires || s.owner.ws.readyState !== 1 || !this.canRoute(s.owner, s.serviceId))
|
|
231
|
+
return false;
|
|
232
|
+
for (const provider of this.providers(s.serviceId)) {
|
|
233
|
+
if (provider === s.owner || s.attempted.has(provider) || provider.streams.size >= this.limits.maxStreams)
|
|
234
|
+
continue;
|
|
235
|
+
s.attempted.add(provider);
|
|
236
|
+
s.provider = provider;
|
|
237
|
+
s.providerId = randomUUID();
|
|
238
|
+
provider.streams.set(s.providerId, s);
|
|
239
|
+
if (!send(provider.ws, { type: 'open', streamId: s.providerId, serviceId: s.serviceId }, this.limits)) {
|
|
240
|
+
provider.streams.delete(s.providerId);
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
s.deadline = setTimeout(() => this.providerFailed(s, 'Target timeout'), Math.min(this.limits.connectTimeoutMs, s.expires - Date.now()));
|
|
244
|
+
s.deadline.unref?.();
|
|
245
|
+
return true;
|
|
246
|
+
}
|
|
247
|
+
return false;
|
|
191
248
|
}
|
|
192
249
|
receive(peer, f) {
|
|
193
250
|
if (f.type === 'register') {
|
|
194
251
|
if (!f.serviceIds.every(id => this.canRegister(peer, id)))
|
|
195
252
|
throw new Error('Registration denied');
|
|
253
|
+
for (const [id, routes] of this.routes)
|
|
254
|
+
if (routes.has(peer) && !f.serviceIds.includes(id))
|
|
255
|
+
this.withdraw(id, peer);
|
|
196
256
|
for (const id of f.serviceIds) {
|
|
197
|
-
|
|
198
|
-
if (
|
|
199
|
-
|
|
257
|
+
let routes = this.routes.get(id);
|
|
258
|
+
if (!routes) {
|
|
259
|
+
routes = new Map();
|
|
260
|
+
this.routes.set(id, routes);
|
|
261
|
+
}
|
|
262
|
+
routes.set(peer, { expires: Date.now() + Math.min(f.ttlMs, this.limits.maxRouteTtlMs), retryAfter: routes.get(peer)?.retryAfter ?? 0 });
|
|
200
263
|
}
|
|
201
|
-
for (const [id, r] of this.routes)
|
|
202
|
-
if (r.peer === peer && !f.serviceIds.includes(id))
|
|
203
|
-
this.withdraw(id, peer);
|
|
204
|
-
for (const id of f.serviceIds)
|
|
205
|
-
this.routes.set(id, { peer, expires: Date.now() + Math.min(f.ttlMs, this.limits.maxRouteTtlMs) });
|
|
206
264
|
return;
|
|
207
265
|
}
|
|
208
266
|
if (f.type === 'open') {
|
|
209
|
-
const route = this.routes.get(f.serviceId);
|
|
210
267
|
if (peer.streams.has(f.streamId))
|
|
211
268
|
throw new Error('Duplicate stream');
|
|
212
|
-
if (!this.canRoute(peer, f.serviceId) || !
|
|
269
|
+
if (!this.canRoute(peer, f.serviceId) || !this.hasRoute(f.serviceId)) {
|
|
213
270
|
send(peer.ws, { type: 'close', streamId: f.streamId, reason: 'Route unavailable or denied' }, this.limits);
|
|
214
271
|
return;
|
|
215
272
|
}
|
|
216
|
-
if (peer.streams.size >= this.limits.maxStreams
|
|
273
|
+
if (peer.streams.size >= this.limits.maxStreams)
|
|
217
274
|
throw new Error('Stream budget exceeded');
|
|
218
|
-
const s = { owner: peer, ownerId: f.streamId, provider:
|
|
275
|
+
const s = { owner: peer, ownerId: f.streamId, provider: peer, providerId: '', serviceId: f.serviceId, opened: false, expires: Date.now() + this.limits.routeTimeoutMs, attempted: new Set() };
|
|
219
276
|
peer.streams.set(s.ownerId, s);
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
this.closeStream(s, 'Relay disconnected');
|
|
277
|
+
if (!this.openProvider(s))
|
|
278
|
+
this.closeStream(s, 'Route unavailable or congested');
|
|
223
279
|
return;
|
|
224
280
|
}
|
|
225
281
|
const s = peer.streams.get(f.streamId);
|
|
226
282
|
if (!s)
|
|
227
283
|
return;
|
|
228
|
-
if (!this.canRoute(s.owner, s.serviceId)
|
|
284
|
+
if (!this.canRoute(s.owner, s.serviceId)) {
|
|
229
285
|
this.closeStream(s, 'Authorization revoked');
|
|
230
286
|
return;
|
|
231
287
|
}
|
|
288
|
+
const registration = this.routes.get(s.serviceId)?.get(s.provider);
|
|
289
|
+
if (!registration || registration.expires <= Date.now() || !this.canRegister(s.provider, s.serviceId)) {
|
|
290
|
+
this.withdraw(s.serviceId, s.provider);
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
232
293
|
if (f.type === 'close') {
|
|
233
|
-
|
|
294
|
+
if (peer === s.provider)
|
|
295
|
+
this.providerFailed(s, 'Channel closed');
|
|
296
|
+
else
|
|
297
|
+
this.closeStream(s, 'Channel closed');
|
|
234
298
|
return;
|
|
235
299
|
}
|
|
236
300
|
if (f.type === 'opened' && peer !== s.provider)
|
|
237
301
|
throw new Error('Invalid channel direction');
|
|
302
|
+
if (f.type === 'opened') {
|
|
303
|
+
if (s.opened)
|
|
304
|
+
throw new Error('Channel already opened');
|
|
305
|
+
clearTimeout(s.deadline);
|
|
306
|
+
s.opened = true;
|
|
307
|
+
}
|
|
308
|
+
else if (!s.opened)
|
|
309
|
+
throw new Error('Channel not ready');
|
|
238
310
|
const target = peer === s.owner ? s.provider : s.owner;
|
|
239
311
|
if (!send(target.ws, { ...f, streamId: peer === s.owner ? s.providerId : s.ownerId }, this.limits))
|
|
240
312
|
this.closeStream(s, 'Relay congestion');
|
|
@@ -251,6 +323,7 @@ export class RelayClient {
|
|
|
251
323
|
limits;
|
|
252
324
|
streams = new Map();
|
|
253
325
|
renewal;
|
|
326
|
+
pending = new Map();
|
|
254
327
|
stopped = false;
|
|
255
328
|
constructor(upstream, options) {
|
|
256
329
|
this.upstream = upstream;
|
|
@@ -265,6 +338,8 @@ export class RelayClient {
|
|
|
265
338
|
upstream.on('message', raw => { void this.receive(raw).catch(() => upstream.close(1008, 'Invalid relay frame')); });
|
|
266
339
|
}
|
|
267
340
|
drop(id, reason) {
|
|
341
|
+
clearTimeout(this.pending.get(id));
|
|
342
|
+
this.pending.delete(id);
|
|
268
343
|
const target = this.streams.get(id);
|
|
269
344
|
this.streams.delete(id);
|
|
270
345
|
target?.close();
|
|
@@ -276,26 +351,35 @@ export class RelayClient {
|
|
|
276
351
|
throw new Error('Unexpected registration');
|
|
277
352
|
if (f.type === 'open') {
|
|
278
353
|
const connect = this.options.targets.get(f.serviceId);
|
|
279
|
-
if (
|
|
354
|
+
if (this.streams.has(f.streamId))
|
|
355
|
+
throw new Error('Duplicate stream');
|
|
356
|
+
if (!connect || this.streams.size >= this.limits.maxStreams) {
|
|
280
357
|
this.drop(f.streamId, 'Target unavailable');
|
|
281
358
|
return;
|
|
282
359
|
}
|
|
283
360
|
this.streams.set(f.streamId, null);
|
|
284
|
-
|
|
285
|
-
const timer = setTimeout(() => { timedOut = true; this.drop(f.streamId, 'Target timeout'); }, this.limits.connectTimeoutMs);
|
|
361
|
+
const timer = setTimeout(() => { this.drop(f.streamId, 'Target timeout'); }, this.limits.connectTimeoutMs);
|
|
286
362
|
timer.unref?.();
|
|
363
|
+
this.pending.set(f.streamId, timer);
|
|
287
364
|
let target;
|
|
288
365
|
try {
|
|
289
366
|
target = await connect();
|
|
290
367
|
}
|
|
291
368
|
catch {
|
|
292
|
-
|
|
293
|
-
|
|
369
|
+
if (this.pending.get(f.streamId) === timer)
|
|
370
|
+
this.drop(f.streamId, 'Target unavailable');
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
// A canceled attempt may complete after the same ID has been reused.
|
|
374
|
+
if (this.pending.get(f.streamId) !== timer || this.stopped) {
|
|
375
|
+
target.close();
|
|
294
376
|
return;
|
|
295
377
|
}
|
|
296
378
|
clearTimeout(timer);
|
|
297
|
-
|
|
379
|
+
this.pending.delete(f.streamId);
|
|
380
|
+
if (target.readyState !== 1) {
|
|
298
381
|
target.close();
|
|
382
|
+
this.drop(f.streamId, 'Target not ready');
|
|
299
383
|
return;
|
|
300
384
|
}
|
|
301
385
|
this.streams.set(f.streamId, target);
|
|
@@ -3,3 +3,8 @@
|
|
|
3
3
|
export const MAX_ACTIVE_HTTP_REQUESTS = 8;
|
|
4
4
|
export const MAX_SERVER_HTTP_REQUESTS = 32;
|
|
5
5
|
export const MAX_OPEN_SECURE_SOCKETS = 128;
|
|
6
|
+
// Relay selection must finish before foreground/background clients abandon the
|
|
7
|
+
// transport, leaving time for the final pinned Noise handshake.
|
|
8
|
+
export const RELAY_PROVIDER_CONNECT_TIMEOUT_MS = 10_000;
|
|
9
|
+
export const RELAY_ROUTE_OPEN_TIMEOUT_MS = 15_000;
|
|
10
|
+
export const RELAY_CLIENT_CONNECT_TIMEOUT_MS = 20_000;
|
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.331",
|
|
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-8G1r0kK1SCfOUPNd0nZl3wgoQuslq1dDeS5wpBtmPeI=",
|
|
10
|
+
"clientBundleHash": "sha256-R0LHH5Yo2BX1nGwLCClboWwzkoz/xOgeYTdOEEWULMk=",
|
|
11
11
|
"entrypoint": "dist/server/cli.js",
|
|
12
12
|
"clientEntrypoint": "dist/client/index.html"
|
|
13
13
|
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{bA as r}from"./app-aNkllBsm.js";import{b as m}from"./dnd-BCFAPC0L.js";import{b as n}from"./RightSidebar-scaBEaFJ.js";import"./react-XDCjal2T.js";import"./terminal-C7X98Amf.js";import"./App-JL8Fd8uO.js";import"./gestureArbiter-4NWfZprH.js";import"./triangle-alert-rgLWcpfP.js";import"./referenceLongPress-Bln9X6SW.js";import"./DiffReview-BPHfC8nZ.js";import"./sparkles-kooHQYLJ.js";import"./DiffViewer-C4S3oEQV.js";import"./ChangeWalkthroughPanel-BF3p_M6Y.js";function g({content:o}){const e=m.useMemo(()=>n(o.split(`
|
|
2
|
-
`),null,null),[o]);return r.jsx("div",{className:"min-w-0 space-y-3 break-words text-sm leading-6 text-foreground [&_h1]:text-lg [&_h2]:text-base [&_h3]:text-sm [&_pre]:max-w-full [&_table]:text-xs",children:e.map((t,i)=>r.jsx("div",{className:"min-w-0",children:typeof t.content=="function"?t.content(null):t.content},i))})}export{g as default};
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|