termdock 1.4.179 → 1.4.180
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/.desktop-dist/main.js +1 -1
- package/dist/client/assets/{App-DXq9kwY5.js → App-DBds0RoW.js} +35 -35
- package/dist/client/assets/App-DBds0RoW.js.br +0 -0
- package/dist/client/assets/App-DBds0RoW.js.gz +0 -0
- package/dist/client/assets/{ChangeWalkthroughPanel-DWUBYx6Q.js → ChangeWalkthroughPanel-DonkfMV2.js} +2 -2
- package/dist/client/assets/ChangeWalkthroughPanel-DonkfMV2.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-DonkfMV2.js.gz +0 -0
- package/dist/client/assets/{DagPlayground-DyczrcHM.js → DagPlayground-CYL8vhaU.js} +1 -1
- package/dist/client/assets/DagPlayground-CYL8vhaU.js.br +0 -0
- package/dist/client/assets/DagPlayground-CYL8vhaU.js.gz +0 -0
- package/dist/client/assets/{DiffLab-D5wb-H7y.js → DiffLab-COUjebir.js} +1 -1
- package/dist/client/assets/DiffLab-COUjebir.js.br +0 -0
- package/dist/client/assets/DiffLab-COUjebir.js.gz +0 -0
- package/dist/client/assets/{DiffReview-CVIz-B5T.js → DiffReview-DqiRXomQ.js} +1 -1
- package/dist/client/assets/DiffReview-DqiRXomQ.js.br +0 -0
- package/dist/client/assets/DiffReview-DqiRXomQ.js.gz +0 -0
- package/dist/client/assets/{DiffReviewLab-99hTNRaj.js → DiffReviewLab-Aqib8Qr6.js} +1 -1
- package/dist/client/assets/DiffReviewLab-Aqib8Qr6.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-Aqib8Qr6.js.gz +0 -0
- package/dist/client/assets/{DiffViewer-BPor2_7o.js → DiffViewer-KR2GhX72.js} +1 -1
- package/dist/client/assets/DiffViewer-KR2GhX72.js.br +0 -0
- package/dist/client/assets/DiffViewer-KR2GhX72.js.gz +0 -0
- package/dist/client/assets/{ModelPreview-DpImj4vY.js → ModelPreview-Bo6giTPm.js} +1 -1
- package/dist/client/assets/ModelPreview-Bo6giTPm.js.br +0 -0
- package/dist/client/assets/ModelPreview-Bo6giTPm.js.gz +0 -0
- package/dist/client/assets/RightSidebar-rROjRuPY.js +1678 -0
- package/dist/client/assets/RightSidebar-rROjRuPY.js.br +0 -0
- package/dist/client/assets/RightSidebar-rROjRuPY.js.gz +0 -0
- package/dist/client/assets/{abnfDiagram-VCTEODGH-CNWmFVMh.js → abnfDiagram-VCTEODGH-m85vHRkF.js} +1 -1
- package/dist/client/assets/abnfDiagram-VCTEODGH-m85vHRkF.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-m85vHRkF.js.gz +0 -0
- package/dist/client/assets/app-Djvvt1Mi.js +34 -0
- package/dist/client/assets/app-Djvvt1Mi.js.br +0 -0
- package/dist/client/assets/app-Djvvt1Mi.js.gz +0 -0
- package/dist/client/assets/{arc-Z8mcHjh7.js → arc-DmZ3EVhj.js} +1 -1
- package/dist/client/assets/arc-DmZ3EVhj.js.br +0 -0
- package/dist/client/assets/arc-DmZ3EVhj.js.gz +0 -0
- package/dist/client/assets/{architectureDiagram-5GKGNRK7-DuxbAeFP.js → architectureDiagram-5GKGNRK7-C8yGaNGM.js} +1 -1
- package/dist/client/assets/architectureDiagram-5GKGNRK7-C8yGaNGM.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-C8yGaNGM.js.gz +0 -0
- package/dist/client/assets/{blockDiagram-I7D4REHJ-SxAFw0An.js → blockDiagram-I7D4REHJ-CZhh__cR.js} +1 -1
- package/dist/client/assets/blockDiagram-I7D4REHJ-CZhh__cR.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-CZhh__cR.js.gz +0 -0
- package/dist/client/assets/{c4Diagram-7LVT6UL2-CcRdiWo7.js → c4Diagram-7LVT6UL2-py7O2OOO.js} +1 -1
- package/dist/client/assets/c4Diagram-7LVT6UL2-py7O2OOO.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-py7O2OOO.js.gz +0 -0
- package/dist/client/assets/channel-BnKOV34C.js +1 -0
- package/dist/client/assets/{chunk-2Q5K7J3B-DJ_qzvZZ.js → chunk-2Q5K7J3B-SXGoQcYW.js} +1 -1
- package/dist/client/assets/{chunk-5VM5RSS4-l3H0C2ci.js → chunk-5VM5RSS4-1ZVyPSGv.js} +1 -1
- package/dist/client/assets/{chunk-F27PBJKO-B7xASv8n.js → chunk-F27PBJKO-DkIqnjYj.js} +1 -1
- package/dist/client/assets/chunk-F27PBJKO-DkIqnjYj.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-DkIqnjYj.js.gz +0 -0
- package/dist/client/assets/{chunk-IMKFNOWR-Wg5gR7sZ.js → chunk-IMKFNOWR-CLS_EByq.js} +1 -1
- package/dist/client/assets/chunk-IMKFNOWR-CLS_EByq.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-CLS_EByq.js.gz +0 -0
- package/dist/client/assets/{chunk-JWPE2WC7-BlXUS79m.js → chunk-JWPE2WC7-8LtK4UYW.js} +1 -1
- package/dist/client/assets/{chunk-POPQ4Y6H-CU38G8hb.js → chunk-POPQ4Y6H-D1PhOQEv.js} +1 -1
- package/dist/client/assets/{chunk-SVP7TREG-D-yZlXqX.js → chunk-SVP7TREG-cVWIfR_4.js} +1 -1
- package/dist/client/assets/chunk-SVP7TREG-cVWIfR_4.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-cVWIfR_4.js.gz +0 -0
- package/dist/client/assets/{chunk-TICWLB2K-DrOYmcBB.js → chunk-TICWLB2K-BiO8AIZ7.js} +1 -1
- package/dist/client/assets/chunk-TICWLB2K-BiO8AIZ7.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-BiO8AIZ7.js.gz +0 -0
- package/dist/client/assets/{chunk-XXDRQBXY-BbsHtVFa.js → chunk-XXDRQBXY-CwP0rAj8.js} +1 -1
- package/dist/client/assets/classDiagram-ZZMXUADV-CZ5ElqWa.js +1 -0
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-CZ5ElqWa.js +1 -0
- package/dist/client/assets/{cose-bilkent-JH36ORCC-_wKUNL8T.js → cose-bilkent-JH36ORCC-Dv9GK27H.js} +1 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-Dv9GK27H.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-Dv9GK27H.js.gz +0 -0
- package/dist/client/assets/{cynefin-OW5HDTMX-CPr--Wnc.js → cynefin-OW5HDTMX-DDI6luT6.js} +1 -1
- package/dist/client/assets/cynefin-OW5HDTMX-DDI6luT6.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-DDI6luT6.js.gz +0 -0
- package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-5ygpPOWT.js → cynefinDiagram-5FMLGOSQ-DQpaBQcE.js} +1 -1
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-DQpaBQcE.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-DQpaBQcE.js.gz +0 -0
- package/dist/client/assets/{dagre-GXQ25YYZ-Cvx65nHO.js → dagre-GXQ25YYZ-CZ-1rzmK.js} +1 -1
- package/dist/client/assets/dagre-GXQ25YYZ-CZ-1rzmK.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-CZ-1rzmK.js.gz +0 -0
- package/dist/client/assets/{diagram-S7CK7UJ4-Dw5cp_BA.js → diagram-S7CK7UJ4-DeYvGv1c.js} +1 -1
- package/dist/client/assets/diagram-S7CK7UJ4-DeYvGv1c.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-DeYvGv1c.js.gz +0 -0
- package/dist/client/assets/{diagram-UQ7AKVKN-D8BZ5Tp3.js → diagram-UQ7AKVKN-BaYQC1t6.js} +1 -1
- package/dist/client/assets/diagram-UQ7AKVKN-BaYQC1t6.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-BaYQC1t6.js.gz +0 -0
- package/dist/client/assets/{diagram-VSXAHHWV-BxJD7ZWH.js → diagram-VSXAHHWV-B517BnK0.js} +1 -1
- package/dist/client/assets/diagram-VSXAHHWV-B517BnK0.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-B517BnK0.js.gz +0 -0
- package/dist/client/assets/{diagram-VX7I27RA-CvzlU0bI.js → diagram-VX7I27RA-DyjVlDcv.js} +1 -1
- package/dist/client/assets/diagram-VX7I27RA-DyjVlDcv.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-DyjVlDcv.js.gz +0 -0
- package/dist/client/assets/{diagram-Z3DM3KII-Be4HdFlL.js → diagram-Z3DM3KII-Cy9JXHOz.js} +1 -1
- package/dist/client/assets/diagram-Z3DM3KII-Cy9JXHOz.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-Cy9JXHOz.js.gz +0 -0
- package/dist/client/assets/{ebnfDiagram-PWID7BFC-C_wrrPjF.js → ebnfDiagram-PWID7BFC-xvEH045b.js} +1 -1
- package/dist/client/assets/ebnfDiagram-PWID7BFC-xvEH045b.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-xvEH045b.js.gz +0 -0
- package/dist/client/assets/{erDiagram-RLTQ6QDP-IHyLgV6M.js → erDiagram-RLTQ6QDP-BTJDgwKq.js} +1 -1
- package/dist/client/assets/erDiagram-RLTQ6QDP-BTJDgwKq.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-BTJDgwKq.js.gz +0 -0
- package/dist/client/assets/{flowDiagram-HODETNUW-CpfW88Uc.js → flowDiagram-HODETNUW-6pq1SF-S.js} +1 -1
- package/dist/client/assets/flowDiagram-HODETNUW-6pq1SF-S.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-6pq1SF-S.js.gz +0 -0
- package/dist/client/assets/{ganttDiagram-EL5Y4UJY-CsbQ6KLb.js → ganttDiagram-EL5Y4UJY-DS_l5v9m.js} +1 -1
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-DS_l5v9m.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-DS_l5v9m.js.gz +0 -0
- package/dist/client/assets/{gestureArbiter-CJQ8K48V.js → gestureArbiter-FtwbRpdp.js} +1 -1
- package/dist/client/assets/{gestureArbiter-CJQ8K48V.js.br → gestureArbiter-FtwbRpdp.js.br} +0 -0
- package/dist/client/assets/gestureArbiter-FtwbRpdp.js.gz +0 -0
- package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-DJZqSGtH.js → gitGraphDiagram-WWUBYQGX-DEGFo3aa.js} +1 -1
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DEGFo3aa.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DEGFo3aa.js.gz +0 -0
- package/dist/client/assets/{infoDiagram-27XIBGKW-D6sSgR2Y.js → infoDiagram-27XIBGKW-CFVSyJdD.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-5VMMS53U-BJJSUXep.js → ishikawaDiagram-5VMMS53U-_YX0U_wu.js} +1 -1
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-_YX0U_wu.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-_YX0U_wu.js.gz +0 -0
- package/dist/client/assets/{journeyDiagram-3NMN7TZE-ou1XS2DP.js → journeyDiagram-3NMN7TZE-DCujswss.js} +1 -1
- package/dist/client/assets/journeyDiagram-3NMN7TZE-DCujswss.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-DCujswss.js.gz +0 -0
- package/dist/client/assets/{kanban-definition-UXKFOSKX-BFQGYQzd.js → kanban-definition-UXKFOSKX-DC6lqIBi.js} +1 -1
- package/dist/client/assets/kanban-definition-UXKFOSKX-DC6lqIBi.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-DC6lqIBi.js.gz +0 -0
- package/dist/client/assets/{layout-zUU3xcam.js → layout-D_hlL0MC.js} +1 -1
- package/dist/client/assets/layout-D_hlL0MC.js.br +0 -0
- package/dist/client/assets/layout-D_hlL0MC.js.gz +0 -0
- package/dist/client/assets/{linear-CYwYQI2I.js → linear-BxpjJ2yt.js} +1 -1
- package/dist/client/assets/linear-BxpjJ2yt.js.br +0 -0
- package/dist/client/assets/linear-BxpjJ2yt.js.gz +0 -0
- package/dist/client/assets/{mermaid.core-91Llsw5j.js → mermaid.core-BRLYB1Uj.js} +5 -5
- package/dist/client/assets/mermaid.core-BRLYB1Uj.js.br +0 -0
- package/dist/client/assets/mermaid.core-BRLYB1Uj.js.gz +0 -0
- package/dist/client/assets/{mindmap-definition-YA3MSWOX-RWG074lb.js → mindmap-definition-YA3MSWOX-BF2f-Z54.js} +1 -1
- package/dist/client/assets/mindmap-definition-YA3MSWOX-BF2f-Z54.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-BF2f-Z54.js.gz +0 -0
- package/dist/client/assets/{passwordBootstrap-DRknuNUN.js → passwordBootstrap-hj2Lcgoj.js} +1 -1
- package/dist/client/assets/passwordBootstrap-hj2Lcgoj.js.br +0 -0
- package/dist/client/assets/passwordBootstrap-hj2Lcgoj.js.gz +0 -0
- package/dist/client/assets/{pegDiagram-XKGWAZYB-Dyh2rzGS.js → pegDiagram-XKGWAZYB-FxHPBhCy.js} +1 -1
- package/dist/client/assets/pegDiagram-XKGWAZYB-FxHPBhCy.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-FxHPBhCy.js.gz +0 -0
- package/dist/client/assets/{pieDiagram-E7YTZNPT-CL3UcUfh.js → pieDiagram-E7YTZNPT-DqAcArGH.js} +1 -1
- package/dist/client/assets/pieDiagram-E7YTZNPT-DqAcArGH.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-DqAcArGH.js.gz +0 -0
- package/dist/client/assets/{quadrantDiagram-AXDQQJYC-DOkejMel.js → quadrantDiagram-AXDQQJYC-31lk30-Y.js} +1 -1
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-31lk30-Y.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-31lk30-Y.js.gz +0 -0
- package/dist/client/assets/{railroadDiagram-O6MQD6OU-BC780Uh3.js → railroadDiagram-O6MQD6OU-C-Jt17Wl.js} +1 -1
- package/dist/client/assets/railroadDiagram-O6MQD6OU-C-Jt17Wl.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-C-Jt17Wl.js.gz +0 -0
- package/dist/client/assets/{referenceLongPress-Dlc0425_.js → referenceLongPress-BPFSnCDQ.js} +1 -1
- package/dist/client/assets/referenceLongPress-BPFSnCDQ.js.br +0 -0
- package/dist/client/assets/referenceLongPress-BPFSnCDQ.js.gz +0 -0
- package/dist/client/assets/{requirementDiagram-BXWQKSXE-CwCGr0qR.js → requirementDiagram-BXWQKSXE-DdrbsuCJ.js} +1 -1
- package/dist/client/assets/requirementDiagram-BXWQKSXE-DdrbsuCJ.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-DdrbsuCJ.js.gz +0 -0
- package/dist/client/assets/{sankeyDiagram-P5KCCOFB-CYDYBwJQ.js → sankeyDiagram-P5KCCOFB-CZjs9KFo.js} +1 -1
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-CZjs9KFo.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-CZjs9KFo.js.gz +0 -0
- package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-DhHsZi3K.js → sequenceDiagram-WJ2MYXX4-CkD1f6v4.js} +1 -1
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-CkD1f6v4.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-CkD1f6v4.js.gz +0 -0
- package/dist/client/assets/{sizeCapture-INFHLROL-4oUXWvYA.js → sizeCapture-INFHLROL-BMuKV0gL.js} +1 -1
- package/dist/client/assets/sizeCapture-INFHLROL-BMuKV0gL.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-BMuKV0gL.js.gz +0 -0
- package/dist/client/assets/{sparkles-gqiuBkfP.js → sparkles-DuRvUCWG.js} +1 -1
- package/dist/client/assets/{stateDiagram-D77RDMKH-7hUELZGo.js → stateDiagram-D77RDMKH-B1lLo2WA.js} +1 -1
- package/dist/client/assets/stateDiagram-D77RDMKH-B1lLo2WA.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-B1lLo2WA.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-F5MbngH8.js +1 -0
- package/dist/client/assets/{swimlanes-42K2YHIH-E1qoordP.js → swimlanes-42K2YHIH-CfC5CNjA.js} +1 -1
- package/dist/client/assets/swimlanes-42K2YHIH-CfC5CNjA.js.br +0 -0
- package/dist/client/assets/{swimlanes-42K2YHIH-E1qoordP.js.gz → swimlanes-42K2YHIH-CfC5CNjA.js.gz} +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-BqbZwNvL.js +8 -0
- package/dist/client/assets/{timeline-definition-24CTP7MA-CTYyCnUW.js → timeline-definition-24CTP7MA-0mM-Skdo.js} +1 -1
- package/dist/client/assets/timeline-definition-24CTP7MA-0mM-Skdo.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-0mM-Skdo.js.gz +0 -0
- package/dist/client/assets/{triangle-alert-DrBuMUPw.js → triangle-alert-wyGdnPOg.js} +1 -1
- package/dist/client/assets/{vennDiagram-4TSXK5OY-DVWbhWsS.js → vennDiagram-4TSXK5OY-BYsJo_hU.js} +1 -1
- package/dist/client/assets/{vennDiagram-4TSXK5OY-DVWbhWsS.js.br → vennDiagram-4TSXK5OY-BYsJo_hU.js.br} +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-BYsJo_hU.js.gz +0 -0
- package/dist/client/assets/{wardleyDiagram-VM6X3IG4-BFAwOxhc.js → wardleyDiagram-VM6X3IG4-ree3u-pI.js} +1 -1
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-ree3u-pI.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-ree3u-pI.js.gz +0 -0
- package/dist/client/assets/{xychartDiagram-S5SC5T6Z-DYXOiBiX.js → xychartDiagram-S5SC5T6Z-DDono4Wc.js} +1 -1
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-DDono4Wc.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-DDono4Wc.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-downloads.js +40 -0
- package/dist/client/sw-downloads.js.br +0 -0
- package/dist/client/sw-downloads.js.gz +0 -0
- package/dist/client/sw-encrypted-background.js +25 -0
- package/dist/client/sw-encrypted-background.js.br +0 -0
- package/dist/client/sw-encrypted-background.js.gz +0 -0
- package/dist/client/sw-notifications.js +14 -6
- package/dist/client/sw-notifications.js.br +0 -0
- package/dist/client/sw-notifications.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/sessionBindingRecovery.js +21 -0
- package/dist/server/cli.js +9 -5
- package/dist/server/entry.js +2 -0
- package/dist/server/federation/requestContext.js +7 -1
- package/dist/server/federation/runtime.js +5 -3
- package/dist/server/notifications/pushService.js +3 -0
- package/dist/server/routes/notifications.js +4 -0
- package/dist/server/routes/terminal.js +2 -20
- package/dist/server/utils/publicSecurity.js +1 -1
- package/package.json +2 -1
- package/runtime-manifest.json +3 -3
- package/dist/client/assets/App-DXq9kwY5.js.br +0 -0
- package/dist/client/assets/App-DXq9kwY5.js.gz +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-DWUBYx6Q.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-DWUBYx6Q.js.gz +0 -0
- package/dist/client/assets/DagPlayground-DyczrcHM.js.br +0 -0
- package/dist/client/assets/DagPlayground-DyczrcHM.js.gz +0 -0
- package/dist/client/assets/DiffLab-D5wb-H7y.js.br +0 -0
- package/dist/client/assets/DiffLab-D5wb-H7y.js.gz +0 -0
- package/dist/client/assets/DiffReview-CVIz-B5T.js.br +0 -0
- package/dist/client/assets/DiffReview-CVIz-B5T.js.gz +0 -0
- package/dist/client/assets/DiffReviewLab-99hTNRaj.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-99hTNRaj.js.gz +0 -0
- package/dist/client/assets/DiffViewer-BPor2_7o.js.br +0 -0
- package/dist/client/assets/DiffViewer-BPor2_7o.js.gz +0 -0
- package/dist/client/assets/ModelPreview-DpImj4vY.js.br +0 -0
- package/dist/client/assets/ModelPreview-DpImj4vY.js.gz +0 -0
- package/dist/client/assets/RightSidebar-BW8SSsoA.js +0 -79
- package/dist/client/assets/RightSidebar-BW8SSsoA.js.br +0 -0
- package/dist/client/assets/RightSidebar-BW8SSsoA.js.gz +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-CNWmFVMh.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-CNWmFVMh.js.gz +0 -0
- package/dist/client/assets/app-Pl7tV8Be.js +0 -34
- package/dist/client/assets/app-Pl7tV8Be.js.br +0 -0
- package/dist/client/assets/app-Pl7tV8Be.js.gz +0 -0
- package/dist/client/assets/arc-Z8mcHjh7.js.br +0 -0
- package/dist/client/assets/arc-Z8mcHjh7.js.gz +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-DuxbAeFP.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-DuxbAeFP.js.gz +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-SxAFw0An.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-SxAFw0An.js.gz +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-CcRdiWo7.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-CcRdiWo7.js.gz +0 -0
- package/dist/client/assets/channel-nXn0ntBk.js +0 -1
- package/dist/client/assets/chunk-F27PBJKO-B7xASv8n.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-B7xASv8n.js.gz +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-Wg5gR7sZ.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-Wg5gR7sZ.js.gz +0 -0
- package/dist/client/assets/chunk-SVP7TREG-D-yZlXqX.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-D-yZlXqX.js.gz +0 -0
- package/dist/client/assets/chunk-TICWLB2K-DrOYmcBB.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-DrOYmcBB.js.gz +0 -0
- package/dist/client/assets/classDiagram-ZZMXUADV-DxqN38m7.js +0 -1
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-DxqN38m7.js +0 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-_wKUNL8T.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-_wKUNL8T.js.gz +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-CPr--Wnc.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-CPr--Wnc.js.gz +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-5ygpPOWT.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-5ygpPOWT.js.gz +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-Cvx65nHO.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-Cvx65nHO.js.gz +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-Dw5cp_BA.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-Dw5cp_BA.js.gz +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-D8BZ5Tp3.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-D8BZ5Tp3.js.gz +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-BxJD7ZWH.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-BxJD7ZWH.js.gz +0 -0
- package/dist/client/assets/diagram-VX7I27RA-CvzlU0bI.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-CvzlU0bI.js.gz +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-Be4HdFlL.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-Be4HdFlL.js.gz +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-C_wrrPjF.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-C_wrrPjF.js.gz +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-IHyLgV6M.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-IHyLgV6M.js.gz +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-CpfW88Uc.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-CpfW88Uc.js.gz +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-CsbQ6KLb.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-CsbQ6KLb.js.gz +0 -0
- package/dist/client/assets/gestureArbiter-CJQ8K48V.js.gz +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DJZqSGtH.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DJZqSGtH.js.gz +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-BJJSUXep.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-BJJSUXep.js.gz +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-ou1XS2DP.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-ou1XS2DP.js.gz +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-BFQGYQzd.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-BFQGYQzd.js.gz +0 -0
- package/dist/client/assets/layout-zUU3xcam.js.br +0 -0
- package/dist/client/assets/layout-zUU3xcam.js.gz +0 -0
- package/dist/client/assets/linear-CYwYQI2I.js.br +0 -0
- package/dist/client/assets/linear-CYwYQI2I.js.gz +0 -0
- package/dist/client/assets/mermaid.core-91Llsw5j.js.br +0 -0
- package/dist/client/assets/mermaid.core-91Llsw5j.js.gz +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-RWG074lb.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-RWG074lb.js.gz +0 -0
- package/dist/client/assets/passwordBootstrap-DRknuNUN.js.br +0 -0
- package/dist/client/assets/passwordBootstrap-DRknuNUN.js.gz +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-Dyh2rzGS.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-Dyh2rzGS.js.gz +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-CL3UcUfh.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-CL3UcUfh.js.gz +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-DOkejMel.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-DOkejMel.js.gz +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-BC780Uh3.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-BC780Uh3.js.gz +0 -0
- package/dist/client/assets/referenceLongPress-Dlc0425_.js.br +0 -0
- package/dist/client/assets/referenceLongPress-Dlc0425_.js.gz +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-CwCGr0qR.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-CwCGr0qR.js.gz +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-CYDYBwJQ.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-CYDYBwJQ.js.gz +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-DhHsZi3K.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-DhHsZi3K.js.gz +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-4oUXWvYA.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-4oUXWvYA.js.gz +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-7hUELZGo.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-7hUELZGo.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-MO84Jqt6.js +0 -1
- package/dist/client/assets/swimlanes-42K2YHIH-E1qoordP.js.br +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-DnSXMnZQ.js +0 -8
- package/dist/client/assets/timeline-definition-24CTP7MA-CTYyCnUW.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-CTYyCnUW.js.gz +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-DVWbhWsS.js.gz +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-BFAwOxhc.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-BFAwOxhc.js.gz +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-DYXOiBiX.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-DYXOiBiX.js.gz +0 -0
|
@@ -17,6 +17,7 @@ self.addEventListener('push', (event) => {
|
|
|
17
17
|
data: {
|
|
18
18
|
url: payload.url || '/',
|
|
19
19
|
sessionId: payload.sessionId,
|
|
20
|
+
targetPeerId: payload.targetPeerId,
|
|
20
21
|
},
|
|
21
22
|
};
|
|
22
23
|
event.waitUntil((async () => {
|
|
@@ -59,8 +60,15 @@ self.addEventListener('push', (event) => {
|
|
|
59
60
|
|
|
60
61
|
self.addEventListener('pushsubscriptionchange', (event) => {
|
|
61
62
|
event.waitUntil((async () => {
|
|
62
|
-
|
|
63
|
-
|
|
63
|
+
try {
|
|
64
|
+
let subscription = event.newSubscription || await self.registration.pushManager.getSubscription();
|
|
65
|
+
if (!subscription && event.oldSubscription?.options) {
|
|
66
|
+
subscription = await self.registration.pushManager.subscribe(event.oldSubscription.options);
|
|
67
|
+
}
|
|
68
|
+
if (subscription) await self.termdockBackground?.renewSubscriptions(subscription.toJSON());
|
|
69
|
+
} catch (error) {
|
|
70
|
+
console.warn('Background encrypted subscription sync failed', error);
|
|
71
|
+
}
|
|
64
72
|
const windows = await self.clients.matchAll({ type: 'window', includeUncontrolled: true });
|
|
65
73
|
for (const client of windows) {
|
|
66
74
|
client.postMessage({ type: 'termdock:push-subscription-changed' });
|
|
@@ -69,9 +77,8 @@ self.addEventListener('pushsubscriptionchange', (event) => {
|
|
|
69
77
|
});
|
|
70
78
|
|
|
71
79
|
async function reportNotificationClick(stage, traceId, data = {}) {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
console.debug(`PWA_NOTIFICATION_CLICK ${stage}`, { traceId, ...data });
|
|
80
|
+
try { await self.termdockBackground?.reportClick(stage, traceId, data); }
|
|
81
|
+
catch { console.debug(`PWA_NOTIFICATION_CLICK ${stage}`, { traceId, ...data }); }
|
|
75
82
|
}
|
|
76
83
|
|
|
77
84
|
const NOTIFICATION_TARGET_CACHE = 'termdock-notification-target-v1';
|
|
@@ -136,6 +143,7 @@ self.addEventListener('notificationclick', (event) => {
|
|
|
136
143
|
|
|
137
144
|
event.waitUntil((async () => {
|
|
138
145
|
await reportNotificationClick('sw-click-start', traceId, {
|
|
146
|
+
targetPeerId: data.targetPeerId,
|
|
139
147
|
sessionId: data.sessionId || null,
|
|
140
148
|
url: data.url || null,
|
|
141
149
|
tag: event.notification.tag || null,
|
|
@@ -214,5 +222,5 @@ self.addEventListener('notificationclick', (event) => {
|
|
|
214
222
|
resultUrl: openedClient?.url || null,
|
|
215
223
|
});
|
|
216
224
|
}
|
|
217
|
-
})());
|
|
225
|
+
})().finally(() => self.termdockBackground?.flushLogs().catch(() => {})));
|
|
218
226
|
});
|
|
Binary file
|
|
Binary file
|
package/dist/client/sw.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
if(!self.define){let e,s={};const
|
|
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),t={module:{uri:o},exports:c,require:r};s[o]=Promise.all(i.map(e=>t[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:"1d87402f5f09e34eb3f563b011b5205f"},{url:"assets/app-Djvvt1Mi.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-PWu1VEN_.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:"favicon.ico",revision:"2994debfa6f59a0898e24eb0c54d64b5"},{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:"29b4d23945d109a334e1c3902a8cf02a"},{url:"sw-notifications.js",revision:"a5a2b585a4336d66519195e5e63aee2d"},{url:"sw-secure-api.js",revision:"739c54d3fc8f4cbb87bab12b6b8a8160"},{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,24 @@
|
|
|
1
|
+
export function resolveCollaborationSessionId(input, records, routing) {
|
|
2
|
+
const sessionId = typeof input.sessionId === 'string' ? input.sessionId.trim() : '';
|
|
3
|
+
if (sessionId && records.some((record) => record.sessionId === sessionId))
|
|
4
|
+
return sessionId;
|
|
5
|
+
const backendSessionId = typeof input.backendSessionId === 'string' ? input.backendSessionId.trim() : '';
|
|
6
|
+
if (backendSessionId) {
|
|
7
|
+
const owner = routing.ownerOfBackend(backendSessionId);
|
|
8
|
+
if (owner && records.some((record) => record.sessionId === owner))
|
|
9
|
+
return owner;
|
|
10
|
+
const resolved = records.find((record) => record.backendSessionId === backendSessionId)?.sessionId;
|
|
11
|
+
if (resolved)
|
|
12
|
+
return resolved;
|
|
13
|
+
}
|
|
14
|
+
const tmuxSessionName = typeof input.tmuxSessionName === 'string' ? input.tmuxSessionName.trim() : '';
|
|
15
|
+
if (!tmuxSessionName)
|
|
16
|
+
return null;
|
|
17
|
+
const bound = records.find((record) => routing.get(record.sessionId)?.tmuxSessionName === tmuxSessionName);
|
|
18
|
+
if (bound)
|
|
19
|
+
return bound.sessionId;
|
|
20
|
+
return records.find((record) => record.tmuxSessionName === tmuxSessionName)?.sessionId ?? null;
|
|
21
|
+
}
|
|
1
22
|
export function resolveCollaborationBackend(record, records, backends, routing) {
|
|
2
23
|
routing.assertReadable();
|
|
3
24
|
const binding = routing.get(record.sessionId);
|
package/dist/server/cli.js
CHANGED
|
@@ -1255,9 +1255,12 @@ async function runCollab(command) {
|
|
|
1255
1255
|
}
|
|
1256
1256
|
const backendSessionId = process.env.TERMDOCK_BACKEND_SESSION_ID?.trim() || null;
|
|
1257
1257
|
let tmuxSessionName = null;
|
|
1258
|
-
if (
|
|
1258
|
+
if (process.env.TMUX) {
|
|
1259
1259
|
try {
|
|
1260
|
-
const
|
|
1260
|
+
const paneId = process.env.TMUX_PANE?.trim();
|
|
1261
|
+
const { stdout } = await execFileAsync(process.env.TMUX_BIN || 'tmux', [
|
|
1262
|
+
'display-message', '-p', ...(/^%\d+$/.test(paneId ?? '') ? ['-t', paneId] : []), '#S',
|
|
1263
|
+
], {
|
|
1261
1264
|
timeout: 2_000,
|
|
1262
1265
|
maxBuffer: 16 * 1024,
|
|
1263
1266
|
});
|
|
@@ -1266,15 +1269,16 @@ async function runCollab(command) {
|
|
|
1266
1269
|
tmuxSessionName = detected;
|
|
1267
1270
|
}
|
|
1268
1271
|
catch {
|
|
1269
|
-
//
|
|
1270
|
-
//
|
|
1272
|
+
// Keep a working backend context if tmux inspection fails. A surviving
|
|
1273
|
+
// pane may retain an obsolete backend id after TD reattaches it, so
|
|
1274
|
+
// send both identities whenever tmux inspection succeeds.
|
|
1271
1275
|
}
|
|
1272
1276
|
}
|
|
1273
1277
|
if (!backendSessionId && !tmuxSessionName) {
|
|
1274
1278
|
console.error(JSON.stringify({ ok: false, code: 'SESSION_NOT_FOUND', error: 'td collab must run inside a Termdock-managed Session.' }));
|
|
1275
1279
|
process.exit(1);
|
|
1276
1280
|
}
|
|
1277
|
-
const context =
|
|
1281
|
+
const context = { backendSessionId, tmuxSessionName };
|
|
1278
1282
|
const baseUrl = runningState.localUrl
|
|
1279
1283
|
?? `${runningState.scheme ?? 'http'}://${runningState.host === '0.0.0.0' ? 'localhost' : runningState.host}:${runningState.port}`;
|
|
1280
1284
|
process.exitCode = await executeCollaborationCommand(command, Object.fromEntries(Object.entries(context).filter((entry) => typeof entry[1] === 'string')), { request: (method, endpoint, body, timeout) => method === 'GET'
|
package/dist/server/entry.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { setPushTargetPeerId } from './notifications/pushService.js';
|
|
1
2
|
import { desktopDirectTargets } from './federation/desktopTargets.js';
|
|
2
3
|
import { createOpenAccessRouter } from './federation/openAccess.js';
|
|
3
4
|
import { createPasswordLoginRouter } from './federation/passwordLoginRoutes.js';
|
|
@@ -474,6 +475,7 @@ export function startServer(options = {}) {
|
|
|
474
475
|
});
|
|
475
476
|
void federation.then(runtime => {
|
|
476
477
|
federationServiceId = runtime.serviceId;
|
|
478
|
+
setPushTargetPeerId(runtime.serviceId);
|
|
477
479
|
refreshDirectTargets();
|
|
478
480
|
app.locals.passwordRuntime = runtime;
|
|
479
481
|
entrySubjectAllowed = subjectId => runtime.store.authorize({ subjectId, serviceId: runtime.serviceId, action: 'authorization.manage' }).allowed;
|
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
// Object identity is deliberately used instead of a remotely forgeable header.
|
|
2
2
|
const verified = new WeakSet();
|
|
3
|
-
|
|
3
|
+
const subjects = new WeakMap();
|
|
4
|
+
export function markEncryptedRequest(request, subjectId) {
|
|
5
|
+
verified.add(request);
|
|
6
|
+
if (subjectId)
|
|
7
|
+
subjects.set(request, subjectId);
|
|
8
|
+
}
|
|
4
9
|
export function isEncryptedRequest(request) { return verified.has(request); }
|
|
10
|
+
export function encryptedRequestSubject(request) { return subjects.get(request); }
|
|
@@ -95,7 +95,9 @@ export async function createFederationRuntime(app, directory, handlers, options
|
|
|
95
95
|
return;
|
|
96
96
|
}
|
|
97
97
|
delete request.headers['x-termdock-inner'];
|
|
98
|
-
|
|
98
|
+
const subject = request.headers['x-termdock-device'];
|
|
99
|
+
delete request.headers['x-termdock-device'];
|
|
100
|
+
markEncryptedRequest(request, typeof subject === 'string' ? subject : undefined);
|
|
99
101
|
app(request, response);
|
|
100
102
|
});
|
|
101
103
|
await new Promise((resolve, reject) => { internal.once('error', reject); internal.listen(0, '127.0.0.1', resolve); });
|
|
@@ -152,7 +154,7 @@ export async function createFederationRuntime(app, directory, handlers, options
|
|
|
152
154
|
};
|
|
153
155
|
try {
|
|
154
156
|
httpAllowed(operation.head);
|
|
155
|
-
const headers = new Headers({ 'x-termdock-inner': internalToken });
|
|
157
|
+
const headers = new Headers({ 'x-termdock-inner': internalToken, 'x-termdock-device': subjectId });
|
|
156
158
|
const supplied = operation.head.headers;
|
|
157
159
|
if (supplied && typeof supplied === 'object')
|
|
158
160
|
for (const [name, value] of Object.entries(supplied)) {
|
|
@@ -482,7 +484,7 @@ export async function createFederationRuntime(app, directory, handlers, options
|
|
|
482
484
|
send({ type: 'ws-ready', id: packet.id });
|
|
483
485
|
if (match)
|
|
484
486
|
handlers.terminal(logical, match[1], randomUUID(), {
|
|
485
|
-
sinceSeq: Math.max(0, Number(url.searchParams.get('since')) || 0), streamEpoch: url.searchParams.get('epoch') ?? undefined,
|
|
487
|
+
pushClientId: `device:${subjectId}`, sinceSeq: Math.max(0, Number(url.searchParams.get('since')) || 0), streamEpoch: url.searchParams.get('epoch') ?? undefined,
|
|
486
488
|
flowControl: url.searchParams.get('flow') === '2', outputActive: url.searchParams.get('active') !== '0',
|
|
487
489
|
independentTmux: full(subjectId) && url.searchParams.get('transport') === 'tmux-client',
|
|
488
490
|
}, allowed(subjectId, 'session.resize', match[1]) ? readTerminalHandshakeDimensions(url.searchParams) : undefined);
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
let pushTargetPeerId;
|
|
2
|
+
export function setPushTargetPeerId(value) { pushTargetPeerId = value; }
|
|
1
3
|
import fs from 'node:fs';
|
|
2
4
|
import os from 'node:os';
|
|
3
5
|
import path from 'node:path';
|
|
@@ -124,6 +126,7 @@ async function sendPayload(options) {
|
|
|
124
126
|
};
|
|
125
127
|
await webpush.sendNotification(subscription, JSON.stringify({
|
|
126
128
|
...options.build(entry.locale),
|
|
129
|
+
targetPeerId: pushTargetPeerId,
|
|
127
130
|
alertStyle: entry.alertStyle,
|
|
128
131
|
locale: entry.locale,
|
|
129
132
|
}), {
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import { Router } from 'express';
|
|
2
|
+
import { encryptedRequestSubject } from '../federation/requestContext.js';
|
|
2
3
|
import { getPushSubscription, getVapidPublicKey, removePushSubscription, updatePushPreferences, upsertPushSubscription, } from '../notifications/pushService.js';
|
|
3
4
|
const router = Router();
|
|
4
5
|
function clientIdFromRequest(req) {
|
|
6
|
+
const subject = encryptedRequestSubject(req);
|
|
7
|
+
if (subject)
|
|
8
|
+
return `device:${subject}`;
|
|
5
9
|
return typeof req.cookies?.['termdock-client'] === 'string' ? req.cookies['termdock-client'] : '';
|
|
6
10
|
}
|
|
7
11
|
function validAlertStyle(value) {
|
|
@@ -39,7 +39,7 @@ import { CollaborationStore } from '../agent/collaborationStore.js';
|
|
|
39
39
|
import { formatCollaborationDelivery } from '../agent/collaborationPrompt.js';
|
|
40
40
|
import { resolveCollaborationSpawnMode } from '../agent/collaborationSpawn.js';
|
|
41
41
|
import { SessionSearchStore } from '../agent/sessionSearchStore.js';
|
|
42
|
-
import { resolveCollaborationBackend } from '../agent/sessionBindingRecovery.js';
|
|
42
|
+
import { resolveCollaborationBackend, resolveCollaborationSessionId } from '../agent/sessionBindingRecovery.js';
|
|
43
43
|
import { CollaborationRoutingStore, selectCollaborationPane } from '../agent/collaborationRouting.js';
|
|
44
44
|
import { CollaborationDeliveryWorker } from '../agent/collaborationDeliveryWorker.js';
|
|
45
45
|
import { writeCollaborationTmuxPane } from '../agent/collaborationTmuxDelivery.js';
|
|
@@ -1410,25 +1410,7 @@ async function runAgentAutomation(automation, req) {
|
|
|
1410
1410
|
}
|
|
1411
1411
|
}
|
|
1412
1412
|
function resolveFrontendSessionId(input) {
|
|
1413
|
-
|
|
1414
|
-
if (sessionId && globalSessionState.sessions.some((record) => record.sessionId === sessionId))
|
|
1415
|
-
return sessionId;
|
|
1416
|
-
const backendSessionId = typeof input.backendSessionId === 'string' ? input.backendSessionId.trim() : '';
|
|
1417
|
-
if (backendSessionId) {
|
|
1418
|
-
const owner = collaborationRouting.ownerOfBackend(backendSessionId);
|
|
1419
|
-
if (owner && globalSessionState.sessions.some((record) => record.sessionId === owner))
|
|
1420
|
-
return owner;
|
|
1421
|
-
const resolved = globalSessionState.sessions.find((record) => record.backendSessionId === backendSessionId)?.sessionId;
|
|
1422
|
-
if (resolved)
|
|
1423
|
-
return resolved;
|
|
1424
|
-
}
|
|
1425
|
-
const tmuxSessionName = typeof input.tmuxSessionName === 'string' ? input.tmuxSessionName.trim() : '';
|
|
1426
|
-
if (!tmuxSessionName)
|
|
1427
|
-
return null;
|
|
1428
|
-
const bound = globalSessionState.sessions.find((record) => collaborationRouting.get(record.sessionId)?.tmuxSessionName === tmuxSessionName);
|
|
1429
|
-
if (bound)
|
|
1430
|
-
return bound.sessionId;
|
|
1431
|
-
return globalSessionState.sessions.find((record) => record.tmuxSessionName === tmuxSessionName)?.sessionId ?? null;
|
|
1413
|
+
return resolveCollaborationSessionId(input, globalSessionState.sessions, collaborationRouting);
|
|
1432
1414
|
}
|
|
1433
1415
|
function collaborationRemoteSessions() {
|
|
1434
1416
|
return Array.from(new Map(collaborationStore.list().flatMap((group) => group.remoteSessions ?? [])
|
|
@@ -34,7 +34,7 @@ export const securityHeaders = (req, res, next) => {
|
|
|
34
34
|
const shellSource = /^[a-z0-9.\-:\[\]]+$/i.test(host) ? `http://${host}/preview-shell.html https://${host}/preview-shell.html` : "'none'";
|
|
35
35
|
const shell = req.path === '/preview-shell.html';
|
|
36
36
|
res.setHeader('Content-Security-Policy', shell
|
|
37
|
-
? "sandbox allow-scripts; default-src 'none'; script-src 'unsafe-inline' blob: https: http:; style-src 'unsafe-inline' blob: https:; img-src blob: data: https:; font-src blob: data: https:; media-src blob: data: https:; connect-src https:; frame-src 'none'; frame-ancestors 'self'; object-src 'none'; base-uri https://termdock-preview.invalid; form-action 'none'"
|
|
37
|
+
? "sandbox allow-scripts; default-src 'none'; script-src 'unsafe-inline' 'wasm-unsafe-eval' blob: https: http:; style-src 'unsafe-inline' blob: https:; img-src blob: data: https:; font-src blob: data: https:; media-src blob: data: https:; connect-src blob: https: wss:; worker-src blob:; frame-src 'none'; frame-ancestors 'self'; object-src 'none'; base-uri https://termdock-preview.invalid; form-action 'none'"
|
|
38
38
|
: preview
|
|
39
39
|
? "sandbox allow-scripts; frame-ancestors 'self'; object-src 'none'; base-uri 'self'"
|
|
40
40
|
: `script-src 'self' 'wasm-unsafe-eval'; script-src-attr 'none'; worker-src 'self' blob:; frame-src ${shellSource}; frame-ancestors 'self'; object-src 'none'; base-uri 'self'`);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "termdock",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.180",
|
|
4
4
|
"description": "A complete web-based terminal application with modern UI",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": ".desktop-dist/main.js",
|
|
@@ -119,6 +119,7 @@
|
|
|
119
119
|
"concurrently": "^8.2.0",
|
|
120
120
|
"cross-env": "^10.1.0",
|
|
121
121
|
"electron": "^43.2.0",
|
|
122
|
+
"es-module-shims": "^2.8.4",
|
|
122
123
|
"esbuild": "^0.27.7",
|
|
123
124
|
"eslint": "^9.39.2",
|
|
124
125
|
"jsdom": "^24.0.0",
|
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.180",
|
|
5
5
|
"runtimeProtocolVersion": 1,
|
|
6
6
|
"minimumDesktopVersion": "1.4.46",
|
|
7
7
|
"nodeMajor": 22,
|
|
8
8
|
"dependencyHash": "sha256-kSujny2SLOFnZ1ffxm1FYtli7g1vEN8d3vj1oQeLLdc=",
|
|
9
|
-
"serverBundleHash": "sha256-
|
|
10
|
-
"clientBundleHash": "sha256-
|
|
9
|
+
"serverBundleHash": "sha256-OJ83J67z97pdLmRW6AEkj8r5LkhdkmNIeAxu2L4niig=",
|
|
10
|
+
"clientBundleHash": "sha256-uS0kVZf+KwoYUsvNs5oQQ2EOdE7L45iUtfuHunLnQ2Q=",
|
|
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
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|