termdock 1.4.356 → 1.4.357
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/README.md +22 -4
- package/dist/client/assets/AndroidMirrorView-BGagwKtL.js +3 -0
- package/dist/client/assets/AndroidMirrorView-BGagwKtL.js.br +0 -0
- package/dist/client/assets/AndroidMirrorView-BGagwKtL.js.gz +0 -0
- package/dist/client/assets/App-DpMhxwYW.js +178 -0
- package/dist/client/assets/App-DpMhxwYW.js.br +0 -0
- package/dist/client/assets/App-DpMhxwYW.js.gz +0 -0
- package/dist/client/assets/ArchitecturePanel-Bd_l74EC.js +9 -0
- package/dist/client/assets/ArchitecturePanel-Bd_l74EC.js.br +0 -0
- package/dist/client/assets/ArchitecturePanel-Bd_l74EC.js.gz +0 -0
- package/dist/client/assets/{ChangeWalkthroughPanel-DO_zJfZr.js → ChangeWalkthroughPanel-6DN-2BdR.js} +2 -2
- package/dist/client/assets/ChangeWalkthroughPanel-6DN-2BdR.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-6DN-2BdR.js.gz +0 -0
- package/dist/client/assets/{ChatRichContent-Cu1E1cJ8.js → ChatRichContent-DjwpmW7d.js} +29 -29
- package/dist/client/assets/ChatRichContent-DjwpmW7d.js.br +0 -0
- package/dist/client/assets/ChatRichContent-DjwpmW7d.js.gz +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-DPTJ9pCt.js +1 -0
- package/dist/client/assets/CollaborationMainWorkspace-DPTJ9pCt.js.br +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-DPTJ9pCt.js.gz +0 -0
- package/dist/client/assets/CollaborationTaskContent-Cbu1Bjl0.js +1 -0
- package/dist/client/assets/ComputerControlView-CwB-wQqB.js +6 -0
- package/dist/client/assets/ComputerControlView-CwB-wQqB.js.br +0 -0
- package/dist/client/assets/ComputerControlView-CwB-wQqB.js.gz +0 -0
- package/dist/client/assets/{DagPlayground-CPYwfryM.js → DagPlayground-DMn9Gyrw.js} +1 -1
- package/dist/client/assets/DagPlayground-DMn9Gyrw.js.br +0 -0
- package/dist/client/assets/DagPlayground-DMn9Gyrw.js.gz +0 -0
- package/dist/client/assets/{DiffLab-ptw96Q_4.js → DiffLab-YBWlCU2T.js} +1 -1
- package/dist/client/assets/DiffLab-YBWlCU2T.js.br +0 -0
- package/dist/client/assets/DiffLab-YBWlCU2T.js.gz +0 -0
- package/dist/client/assets/DiffReview-YOPDWqhv.js +1 -0
- package/dist/client/assets/DiffReview-YOPDWqhv.js.br +0 -0
- package/dist/client/assets/DiffReview-YOPDWqhv.js.gz +0 -0
- package/dist/client/assets/{DiffReviewLab-eEi3y-0G.js → DiffReviewLab-SYomq14c.js} +1 -1
- package/dist/client/assets/DiffReviewLab-SYomq14c.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-SYomq14c.js.gz +0 -0
- package/dist/client/assets/{DiffViewer-DqcQxp4Q.js → DiffViewer-mh9cBl5v.js} +1 -1
- package/dist/client/assets/DiffViewer-mh9cBl5v.js.br +0 -0
- package/dist/client/assets/DiffViewer-mh9cBl5v.js.gz +0 -0
- package/dist/client/assets/{GitLoadingSkeleton-DYrDIDF1.js → GitLoadingSkeleton-DKRTc5sz.js} +1 -1
- package/dist/client/assets/GitLoadingSkeleton-DKRTc5sz.js.br +0 -0
- package/dist/client/assets/GitLoadingSkeleton-DKRTc5sz.js.gz +0 -0
- package/dist/client/assets/Markdown-C8OP1j-g.js +23 -0
- package/dist/client/assets/Markdown-C8OP1j-g.js.br +0 -0
- package/dist/client/assets/Markdown-C8OP1j-g.js.gz +0 -0
- package/dist/client/assets/Markdown-DKQhs57e.css +1 -0
- package/dist/client/assets/Markdown-DKQhs57e.css.br +0 -0
- package/dist/client/assets/Markdown-DKQhs57e.css.gz +0 -0
- package/dist/client/assets/{ModelPreview-DjtHLlqP.js → ModelPreview-CsZry3Wd.js} +3 -3
- package/dist/client/assets/ModelPreview-CsZry3Wd.js.br +0 -0
- package/dist/client/assets/ModelPreview-CsZry3Wd.js.gz +0 -0
- package/dist/client/assets/RecordingSaveDialog-CoRGi97z.js +1 -0
- package/dist/client/assets/RecordingSaveDialog-CoRGi97z.js.br +0 -0
- package/dist/client/assets/RecordingSaveDialog-CoRGi97z.js.gz +0 -0
- package/dist/client/assets/RightSidebar-DNY2kC6B.js +1662 -0
- package/dist/client/assets/RightSidebar-DNY2kC6B.js.br +0 -0
- package/dist/client/assets/RightSidebar-DNY2kC6B.js.gz +0 -0
- package/dist/client/assets/SessionChatView-DXNpYUrk.js +13 -0
- package/dist/client/assets/SessionChatView-DXNpYUrk.js.br +0 -0
- package/dist/client/assets/SessionChatView-DXNpYUrk.js.gz +0 -0
- package/dist/client/assets/SessionResourceSidebar-B_379HBJ.js +2 -0
- package/dist/client/assets/SessionResourceSidebar-B_379HBJ.js.br +0 -0
- package/dist/client/assets/SessionResourceSidebar-B_379HBJ.js.gz +0 -0
- package/dist/client/assets/TodoWorkspace-DfwGOAHB.js +1 -0
- package/dist/client/assets/TodoWorkspace-DfwGOAHB.js.br +0 -0
- package/dist/client/assets/TodoWorkspace-DfwGOAHB.js.gz +0 -0
- package/dist/client/assets/{abnfDiagram-VCTEODGH-Cvf_KWZ0.js → abnfDiagram-VCTEODGH-C9M0gnl-.js} +1 -1
- package/dist/client/assets/abnfDiagram-VCTEODGH-C9M0gnl-.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-C9M0gnl-.js.gz +0 -0
- package/dist/client/assets/app-CovJYQoW.js +37 -0
- package/dist/client/assets/app-CovJYQoW.js.br +0 -0
- package/dist/client/assets/app-CovJYQoW.js.gz +0 -0
- package/dist/client/assets/{arc-UvdowQOf.js → arc-q4wfkQcT.js} +1 -1
- package/dist/client/assets/arc-q4wfkQcT.js.br +0 -0
- package/dist/client/assets/arc-q4wfkQcT.js.gz +0 -0
- package/dist/client/assets/{architectureDiagram-5GKGNRK7-DotsbCCA.js → architectureDiagram-5GKGNRK7-CCuna3ab.js} +1 -1
- package/dist/client/assets/architectureDiagram-5GKGNRK7-CCuna3ab.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-CCuna3ab.js.gz +0 -0
- package/dist/client/assets/{arrow-down-FGzRy9D-.js → arrow-down-WyzmLXwQ.js} +1 -1
- package/dist/client/assets/{blockDiagram-I7D4REHJ-CoOfSG4k.js → blockDiagram-I7D4REHJ-BXK68Qyt.js} +1 -1
- package/dist/client/assets/blockDiagram-I7D4REHJ-BXK68Qyt.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-BXK68Qyt.js.gz +0 -0
- package/dist/client/assets/{c4Diagram-7LVT6UL2-BAfjgs8B.js → c4Diagram-7LVT6UL2-BqwmmVmS.js} +1 -1
- package/dist/client/assets/c4Diagram-7LVT6UL2-BqwmmVmS.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-BqwmmVmS.js.gz +0 -0
- package/dist/client/assets/channel-Dd6WQGB7.js +1 -0
- package/dist/client/assets/{chevron-left-xqARwD-7.js → chevron-left-CxeWIsDK.js} +1 -1
- package/dist/client/assets/{chunk-2Q5K7J3B-DiiQ7BvG.js → chunk-2Q5K7J3B-esKGR38U.js} +1 -1
- package/dist/client/assets/{chunk-5VM5RSS4-CczSK8wW.js → chunk-5VM5RSS4-B3InxqDA.js} +1 -1
- package/dist/client/assets/{chunk-F27PBJKO-BI3Di4Ve.js → chunk-F27PBJKO-CjUVyF-E.js} +1 -1
- package/dist/client/assets/chunk-F27PBJKO-CjUVyF-E.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-CjUVyF-E.js.gz +0 -0
- package/dist/client/assets/{chunk-IMKFNOWR-Cvvs1wmn.js → chunk-IMKFNOWR-BR8mmBs7.js} +1 -1
- package/dist/client/assets/chunk-IMKFNOWR-BR8mmBs7.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-BR8mmBs7.js.gz +0 -0
- package/dist/client/assets/{chunk-JWPE2WC7-lrJRD9WA.js → chunk-JWPE2WC7-CplXNOA7.js} +1 -1
- package/dist/client/assets/{chunk-POPQ4Y6H-CnPC9D8B.js → chunk-POPQ4Y6H-D0JWCGnb.js} +1 -1
- package/dist/client/assets/{chunk-SVP7TREG-BZfMhm64.js → chunk-SVP7TREG-BdJtJSmy.js} +1 -1
- package/dist/client/assets/chunk-SVP7TREG-BdJtJSmy.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-BdJtJSmy.js.gz +0 -0
- package/dist/client/assets/{chunk-TICWLB2K-DmkEaRK3.js → chunk-TICWLB2K-CoevFj8I.js} +1 -1
- package/dist/client/assets/chunk-TICWLB2K-CoevFj8I.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-CoevFj8I.js.gz +0 -0
- package/dist/client/assets/{chunk-XXDRQBXY-BP9Lccpe.js → chunk-XXDRQBXY-D7qYRhMH.js} +1 -1
- package/dist/client/assets/{circle-DGZOpG8V.js → circle-xgKDXpwG.js} +1 -1
- package/dist/client/assets/classDiagram-ZZMXUADV-BdIUq_D7.js +1 -0
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-BdIUq_D7.js +1 -0
- package/dist/client/assets/{clipboard-rLx5CzbY.js → clipboard-DeK6pJD3.js} +1 -1
- package/dist/client/assets/clipboardText-BWOwer6N.js +1 -0
- package/dist/client/assets/clipboardText-BWOwer6N.js.br +0 -0
- package/dist/client/assets/clipboardText-BWOwer6N.js.gz +0 -0
- package/dist/client/assets/clipboardText-vX90C7eX.css +1 -0
- package/dist/client/assets/clipboardText-vX90C7eX.css.br +0 -0
- package/dist/client/assets/clipboardText-vX90C7eX.css.gz +0 -0
- package/dist/client/assets/{cose-bilkent-JH36ORCC-0xPYMc2z.js → cose-bilkent-JH36ORCC-CvnsiaWP.js} +1 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-CvnsiaWP.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-CvnsiaWP.js.gz +0 -0
- package/dist/client/assets/{cynefin-OW5HDTMX-BQ7-lCHm.js → cynefin-OW5HDTMX-BSGz8Olu.js} +1 -1
- package/dist/client/assets/cynefin-OW5HDTMX-BSGz8Olu.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-BSGz8Olu.js.gz +0 -0
- package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-CazHuSj1.js → cynefinDiagram-5FMLGOSQ-DYYT0AHs.js} +1 -1
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-DYYT0AHs.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-DYYT0AHs.js.gz +0 -0
- package/dist/client/assets/{dagre-GXQ25YYZ-CJNgsyHQ.js → dagre-GXQ25YYZ-BM883MN7.js} +1 -1
- package/dist/client/assets/dagre-GXQ25YYZ-BM883MN7.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-BM883MN7.js.gz +0 -0
- package/dist/client/assets/{diagram-S7CK7UJ4-D4xXIj1P.js → diagram-S7CK7UJ4-CYnxXy7R.js} +1 -1
- package/dist/client/assets/diagram-S7CK7UJ4-CYnxXy7R.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-CYnxXy7R.js.gz +0 -0
- package/dist/client/assets/{diagram-UQ7AKVKN-BWhpL-35.js → diagram-UQ7AKVKN-UOIBVxRf.js} +1 -1
- package/dist/client/assets/diagram-UQ7AKVKN-UOIBVxRf.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-UOIBVxRf.js.gz +0 -0
- package/dist/client/assets/{diagram-VSXAHHWV-DG9A7EgJ.js → diagram-VSXAHHWV-CqTJzfmm.js} +1 -1
- package/dist/client/assets/diagram-VSXAHHWV-CqTJzfmm.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-CqTJzfmm.js.gz +0 -0
- package/dist/client/assets/{diagram-VX7I27RA-L5PSvynM.js → diagram-VX7I27RA-T9Y88CFB.js} +1 -1
- package/dist/client/assets/diagram-VX7I27RA-T9Y88CFB.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-T9Y88CFB.js.gz +0 -0
- package/dist/client/assets/{diagram-Z3DM3KII-moBH7ruR.js → diagram-Z3DM3KII-kIQDy7E0.js} +1 -1
- package/dist/client/assets/diagram-Z3DM3KII-kIQDy7E0.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-kIQDy7E0.js.gz +0 -0
- package/dist/client/assets/{ebnfDiagram-PWID7BFC-DEiGgcRP.js → ebnfDiagram-PWID7BFC-z_VqR_JE.js} +1 -1
- package/dist/client/assets/ebnfDiagram-PWID7BFC-z_VqR_JE.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-z_VqR_JE.js.gz +0 -0
- package/dist/client/assets/{erDiagram-RLTQ6QDP-BboIleYi.js → erDiagram-RLTQ6QDP-0q52Z-pm.js} +1 -1
- package/dist/client/assets/erDiagram-RLTQ6QDP-0q52Z-pm.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-0q52Z-pm.js.gz +0 -0
- package/dist/client/assets/{external-link-AZ3wjUg5.js → external-link-CsydVmO1.js} +1 -1
- package/dist/client/assets/{flowDiagram-HODETNUW-COxz7Rda.js → flowDiagram-HODETNUW-BrGqcUWn.js} +1 -1
- package/dist/client/assets/flowDiagram-HODETNUW-BrGqcUWn.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-BrGqcUWn.js.gz +0 -0
- package/dist/client/assets/{ganttDiagram-EL5Y4UJY-_XdRvgyZ.js → ganttDiagram-EL5Y4UJY-CHAN6vQv.js} +1 -1
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-CHAN6vQv.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-CHAN6vQv.js.gz +0 -0
- package/dist/client/assets/{git-compare-90v75Jal.js → git-compare-BmKAtQTt.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-CBb9xBNW.js → gitGraphDiagram-WWUBYQGX-C0ZV4FeB.js} +1 -1
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-C0ZV4FeB.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-C0ZV4FeB.js.gz +0 -0
- package/dist/client/assets/index-DEAMSl55.css +1 -0
- package/dist/client/assets/index-DEAMSl55.css.br +0 -0
- package/dist/client/assets/index-DEAMSl55.css.gz +0 -0
- package/dist/client/assets/{infoDiagram-27XIBGKW-DjLdeNZi.js → infoDiagram-27XIBGKW-CrLj9y1o.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-5VMMS53U-Bcr-lhIE.js → ishikawaDiagram-5VMMS53U-BxGvUfLX.js} +1 -1
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-BxGvUfLX.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-BxGvUfLX.js.gz +0 -0
- package/dist/client/assets/{journeyDiagram-3NMN7TZE-3vK6s9Pq.js → journeyDiagram-3NMN7TZE-rW9xlQ8G.js} +1 -1
- package/dist/client/assets/journeyDiagram-3NMN7TZE-rW9xlQ8G.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-rW9xlQ8G.js.gz +0 -0
- package/dist/client/assets/{kanban-definition-UXKFOSKX-DqDYDca0.js → kanban-definition-UXKFOSKX-CFI5iv9R.js} +1 -1
- package/dist/client/assets/kanban-definition-UXKFOSKX-CFI5iv9R.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-CFI5iv9R.js.gz +0 -0
- package/dist/client/assets/{layout-C7_WwzCP.js → layout-Ct_an5XT.js} +1 -1
- package/dist/client/assets/layout-Ct_an5XT.js.br +0 -0
- package/dist/client/assets/layout-Ct_an5XT.js.gz +0 -0
- package/dist/client/assets/{linear-BQCRhl6P.js → linear-DpEFOA9l.js} +1 -1
- package/dist/client/assets/linear-DpEFOA9l.js.br +0 -0
- package/dist/client/assets/linear-DpEFOA9l.js.gz +0 -0
- package/dist/client/assets/{link-Cq14tNBm.js → link-34ChBc4F.js} +3 -3
- package/dist/client/assets/{link-Cq14tNBm.js.br → link-34ChBc4F.js.br} +0 -0
- package/dist/client/assets/link-34ChBc4F.js.gz +0 -0
- package/dist/client/assets/{list-tree-C281zrdg.js → list-tree-48dzbuUh.js} +1 -1
- package/dist/client/assets/{maximize-2-CovPxWdw.js → maximize-2-CbvSsu7O.js} +1 -1
- package/dist/client/assets/{mermaid.core-DGsccxt-.js → mermaid.core-DnVKnMmy.js} +5 -5
- package/dist/client/assets/mermaid.core-DnVKnMmy.js.br +0 -0
- package/dist/client/assets/mermaid.core-DnVKnMmy.js.gz +0 -0
- package/dist/client/assets/{mindmap-definition-YA3MSWOX-l0eF1PQE.js → mindmap-definition-YA3MSWOX-C6shupTY.js} +1 -1
- package/dist/client/assets/mindmap-definition-YA3MSWOX-C6shupTY.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-C6shupTY.js.gz +0 -0
- package/dist/client/assets/{passwordBootstrap-B5VzheZz.js → passwordBootstrap-Doe50DSa.js} +1 -1
- package/dist/client/assets/{passwordBootstrap-B5VzheZz.js.br → passwordBootstrap-Doe50DSa.js.br} +0 -0
- package/dist/client/assets/passwordBootstrap-Doe50DSa.js.gz +0 -0
- package/dist/client/assets/{pegDiagram-XKGWAZYB-fRrxGIDM.js → pegDiagram-XKGWAZYB-CDcnrvKX.js} +1 -1
- package/dist/client/assets/pegDiagram-XKGWAZYB-CDcnrvKX.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-CDcnrvKX.js.gz +0 -0
- package/dist/client/assets/{pieDiagram-E7YTZNPT-B-EBa3qN.js → pieDiagram-E7YTZNPT-CrGc03Tg.js} +1 -1
- package/dist/client/assets/pieDiagram-E7YTZNPT-CrGc03Tg.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-CrGc03Tg.js.gz +0 -0
- package/dist/client/assets/{quadrantDiagram-AXDQQJYC-Dj4e6f4h.js → quadrantDiagram-AXDQQJYC-3-aldwKj.js} +1 -1
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-3-aldwKj.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-3-aldwKj.js.gz +0 -0
- package/dist/client/assets/{quote-COQfrXhi.js → quote-B5GeKEq1.js} +1 -1
- package/dist/client/assets/{railroadDiagram-O6MQD6OU-CEMppxTC.js → railroadDiagram-O6MQD6OU-51uKwR2_.js} +1 -1
- package/dist/client/assets/railroadDiagram-O6MQD6OU-51uKwR2_.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-51uKwR2_.js.gz +0 -0
- package/dist/client/assets/rdpSession-ocpkj4XY.js +1 -0
- package/dist/client/assets/rdpSession-ocpkj4XY.js.br +0 -0
- package/dist/client/assets/rdpSession-ocpkj4XY.js.gz +0 -0
- package/dist/client/assets/referenceSelection-fvfRDbgp.js +4 -0
- package/dist/client/assets/referenceSelection-fvfRDbgp.js.br +0 -0
- package/dist/client/assets/referenceSelection-fvfRDbgp.js.gz +0 -0
- package/dist/client/assets/{requirementDiagram-BXWQKSXE-Dri1k4_x.js → requirementDiagram-BXWQKSXE-CY6kp0_Y.js} +1 -1
- package/dist/client/assets/requirementDiagram-BXWQKSXE-CY6kp0_Y.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-CY6kp0_Y.js.gz +0 -0
- package/dist/client/assets/{sankeyDiagram-P5KCCOFB-CMsL_tYL.js → sankeyDiagram-P5KCCOFB-BsA0NkHG.js} +1 -1
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-BsA0NkHG.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-BsA0NkHG.js.gz +0 -0
- package/dist/client/assets/{search-Dg6HWygj.js → search-CbpNLSpd.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-4_4hZtOd.js → sequenceDiagram-WJ2MYXX4-BDzn7N2D.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-4_4hZtOd.js.br → sequenceDiagram-WJ2MYXX4-BDzn7N2D.js.br} +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-BDzn7N2D.js.gz +0 -0
- package/dist/client/assets/{sizeCapture-INFHLROL-3QA6qj2j.js → sizeCapture-INFHLROL-gxtam7nc.js} +1 -1
- package/dist/client/assets/sizeCapture-INFHLROL-gxtam7nc.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-gxtam7nc.js.gz +0 -0
- package/dist/client/assets/{stateDiagram-D77RDMKH-90IFPhD9.js → stateDiagram-D77RDMKH-C4XjYLZR.js} +1 -1
- package/dist/client/assets/stateDiagram-D77RDMKH-C4XjYLZR.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-C4XjYLZR.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-BfHWFf-I.js +1 -0
- package/dist/client/assets/{sun-BAMMjiA8.js → sun-CMXn_ntS.js} +1 -1
- package/dist/client/assets/{swimlanes-42K2YHIH-BuHieVWC.js → swimlanes-42K2YHIH--a1wkQO8.js} +1 -1
- package/dist/client/assets/swimlanes-42K2YHIH--a1wkQO8.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH--a1wkQO8.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-DsiDF1XD.js +8 -0
- package/dist/client/assets/swiper-CTPycjLq.js +1 -0
- package/dist/client/assets/swiper-CTPycjLq.js.br +0 -0
- package/dist/client/assets/swiper-CTPycjLq.js.gz +0 -0
- package/dist/client/assets/{terminal-Dea8wJF3.js → terminal-DaiFCKy_.js} +7 -7
- package/dist/client/assets/terminal-DaiFCKy_.js.br +0 -0
- package/dist/client/assets/terminal-DaiFCKy_.js.gz +0 -0
- package/dist/client/assets/{timeline-definition-24CTP7MA-C7FpaNwf.js → timeline-definition-24CTP7MA-DFmXXUuU.js} +1 -1
- package/dist/client/assets/timeline-definition-24CTP7MA-DFmXXUuU.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-DFmXXUuU.js.gz +0 -0
- package/dist/client/assets/triangle-alert-DgGU_xB4.js +1 -0
- package/dist/client/assets/{unplug-DN2SNXUL.js → unplug-CnZtWzVW.js} +1 -1
- package/dist/client/assets/use-gesture-react.esm-DHU0wi7Q.js +1 -0
- package/dist/client/assets/use-gesture-react.esm-DHU0wi7Q.js.br +0 -0
- package/dist/client/assets/use-gesture-react.esm-DHU0wi7Q.js.gz +0 -0
- package/dist/client/assets/{vennDiagram-4TSXK5OY-CxoHHVcs.js → vennDiagram-4TSXK5OY-DgR4zroQ.js} +1 -1
- package/dist/client/assets/vennDiagram-4TSXK5OY-DgR4zroQ.js.br +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-DgR4zroQ.js.gz +0 -0
- package/dist/client/assets/{videoCompression-rr2lu3uy.js → videoCompression-CcffRZdP.js} +1 -1
- package/dist/client/assets/videoCompression-CcffRZdP.js.br +0 -0
- package/dist/client/assets/videoCompression-CcffRZdP.js.gz +0 -0
- package/dist/client/assets/{wardleyDiagram-VM6X3IG4-B4Hsh-Ad.js → wardleyDiagram-VM6X3IG4-CY4SVUkf.js} +1 -1
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-CY4SVUkf.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-CY4SVUkf.js.gz +0 -0
- package/dist/client/assets/{xychartDiagram-S5SC5T6Z-CghzsxQv.js → xychartDiagram-S5SC5T6Z-PblQhR-b.js} +1 -1
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-PblQhR-b.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-PblQhR-b.js.gz +0 -0
- package/dist/client/index.html +3 -3
- 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 +14 -69
- package/dist/server/agent/collaborationStore.js +5 -0
- package/dist/server/agent/installers.js +89 -33
- package/dist/server/agent/integrationServer.js +31 -2
- package/dist/server/agent/pluginPackages.js +51 -22
- package/dist/server/agent/sessionChatRoutes.js +45 -7
- package/dist/server/agentHook.js +56 -12
- package/dist/server/android/adb.js +24 -31
- package/dist/server/cli.js +52 -110
- package/dist/server/entry.js +17 -23
- package/dist/server/federation/cli.js +13 -47
- package/dist/server/federation/connectionErrors.js +37 -0
- package/dist/server/federation/connectionModel.js +83 -0
- package/dist/server/federation/desktopTargets.js +35 -13
- package/dist/server/federation/directRoutes.js +28 -36
- package/dist/server/federation/directTargetRegistry.js +106 -0
- package/dist/server/federation/httpUploadLimit.js +8 -0
- package/dist/server/federation/relay.js +13 -6
- package/dist/server/federation/relayTransport.js +147 -0
- package/dist/server/federation/routeAccess.js +5 -3
- package/dist/server/federation/runtime.js +4 -2
- package/dist/server/federation/selfRelay.js +10 -59
- package/dist/server/federation/serviceTransport.js +123 -0
- package/dist/server/federation/streamLimits.js +3 -0
- package/dist/server/federation/trustedCa.js +61 -0
- package/dist/server/routes/android.js +5 -7
- package/dist/server/routes/terminal.js +149 -111
- package/dist/server/shared/androidDevices.js +64 -0
- package/dist/server/shared/programStatus.js +174 -0
- package/dist/server/shared/shareResources.js +3 -2
- package/dist/server/todos/routes.js +36 -0
- package/dist/server/todos/store.js +31 -1
- package/dist/server/utils/bootCheck.js +41 -271
- package/dist/server/utils/localHttpsSetup.js +257 -0
- package/dist/server/utils/oscBuffer.js +9 -0
- package/dist/server/utils/sessionDisplayName.js +11 -9
- package/dist/server/utils/settings.js +6 -3
- package/dist/server/utils/tmuxDisplayGeometry.js +54 -0
- package/dist/server/utils/tmuxObserverSize.js +26 -0
- package/docs/integrations.md +2 -1
- package/package.json +5 -1
- package/runtime-manifest.json +3 -3
- package/scripts/install-utils.cjs +81 -0
- package/scripts/postinstall.mjs +19 -106
- package/dist/client/assets/AndroidMirrorView-DW9oRr0w.js +0 -3
- package/dist/client/assets/AndroidMirrorView-DW9oRr0w.js.br +0 -0
- package/dist/client/assets/AndroidMirrorView-DW9oRr0w.js.gz +0 -0
- package/dist/client/assets/App-DEZ2i9ZZ.js +0 -178
- package/dist/client/assets/App-DEZ2i9ZZ.js.br +0 -0
- package/dist/client/assets/App-DEZ2i9ZZ.js.gz +0 -0
- package/dist/client/assets/ArchitecturePanel-Bf4b-6An.js +0 -9
- package/dist/client/assets/ArchitecturePanel-Bf4b-6An.js.br +0 -0
- package/dist/client/assets/ArchitecturePanel-Bf4b-6An.js.gz +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-DO_zJfZr.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-DO_zJfZr.js.gz +0 -0
- package/dist/client/assets/ChatRichContent-Cu1E1cJ8.js.br +0 -0
- package/dist/client/assets/ChatRichContent-Cu1E1cJ8.js.gz +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-BhmpSEbf.js +0 -1
- package/dist/client/assets/CollaborationMainWorkspace-BhmpSEbf.js.br +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-BhmpSEbf.js.gz +0 -0
- package/dist/client/assets/CollaborationTaskContent-CX0Aqdi2.js +0 -2
- package/dist/client/assets/ComputerControlView-DjQLzn10.js +0 -6
- package/dist/client/assets/ComputerControlView-DjQLzn10.js.br +0 -0
- package/dist/client/assets/ComputerControlView-DjQLzn10.js.gz +0 -0
- package/dist/client/assets/DagPlayground-CPYwfryM.js.br +0 -0
- package/dist/client/assets/DagPlayground-CPYwfryM.js.gz +0 -0
- package/dist/client/assets/DiffLab-ptw96Q_4.js.br +0 -0
- package/dist/client/assets/DiffLab-ptw96Q_4.js.gz +0 -0
- package/dist/client/assets/DiffReview-12E2zWyL.js +0 -1
- package/dist/client/assets/DiffReview-12E2zWyL.js.br +0 -0
- package/dist/client/assets/DiffReview-12E2zWyL.js.gz +0 -0
- package/dist/client/assets/DiffReviewLab-eEi3y-0G.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-eEi3y-0G.js.gz +0 -0
- package/dist/client/assets/DiffViewer-DqcQxp4Q.js.br +0 -0
- package/dist/client/assets/DiffViewer-DqcQxp4Q.js.gz +0 -0
- package/dist/client/assets/GitLoadingSkeleton-DYrDIDF1.js.br +0 -0
- package/dist/client/assets/GitLoadingSkeleton-DYrDIDF1.js.gz +0 -0
- package/dist/client/assets/MarkdownPreview-CsJGsDRL.js +0 -19
- package/dist/client/assets/MarkdownPreview-CsJGsDRL.js.br +0 -0
- package/dist/client/assets/MarkdownPreview-CsJGsDRL.js.gz +0 -0
- package/dist/client/assets/ModelPreview-DjtHLlqP.js.br +0 -0
- package/dist/client/assets/ModelPreview-DjtHLlqP.js.gz +0 -0
- package/dist/client/assets/RecordingSaveDialog-DUtwgIME.js +0 -1
- package/dist/client/assets/RecordingSaveDialog-DUtwgIME.js.br +0 -0
- package/dist/client/assets/RecordingSaveDialog-DUtwgIME.js.gz +0 -0
- package/dist/client/assets/RightSidebar-BltjUFwI.js +0 -1662
- package/dist/client/assets/RightSidebar-BltjUFwI.js.br +0 -0
- package/dist/client/assets/RightSidebar-BltjUFwI.js.gz +0 -0
- package/dist/client/assets/SessionChatView-CdKfHRp8.js +0 -13
- package/dist/client/assets/SessionChatView-CdKfHRp8.js.br +0 -0
- package/dist/client/assets/SessionChatView-CdKfHRp8.js.gz +0 -0
- package/dist/client/assets/SessionChatView-D8GoESjb.css +0 -1
- 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-DmQOydhf.js +0 -2
- package/dist/client/assets/SessionResourceSidebar-DmQOydhf.js.br +0 -0
- package/dist/client/assets/SessionResourceSidebar-DmQOydhf.js.gz +0 -0
- package/dist/client/assets/TodoWorkspace-Bh1C035B.js +0 -1
- package/dist/client/assets/TodoWorkspace-Bh1C035B.js.br +0 -0
- package/dist/client/assets/TodoWorkspace-Bh1C035B.js.gz +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-Cvf_KWZ0.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-Cvf_KWZ0.js.gz +0 -0
- package/dist/client/assets/app-DuUnqxq-.js +0 -37
- package/dist/client/assets/app-DuUnqxq-.js.br +0 -0
- package/dist/client/assets/app-DuUnqxq-.js.gz +0 -0
- package/dist/client/assets/arc-UvdowQOf.js.br +0 -0
- package/dist/client/assets/arc-UvdowQOf.js.gz +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-DotsbCCA.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-DotsbCCA.js.gz +0 -0
- package/dist/client/assets/arrow-up-DNkfesW0.js +0 -1
- package/dist/client/assets/blockDiagram-I7D4REHJ-CoOfSG4k.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-CoOfSG4k.js.gz +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-BAfjgs8B.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-BAfjgs8B.js.gz +0 -0
- package/dist/client/assets/channel-BzMU9Wks.js +0 -1
- package/dist/client/assets/chunk-F27PBJKO-BI3Di4Ve.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-BI3Di4Ve.js.gz +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-Cvvs1wmn.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-Cvvs1wmn.js.gz +0 -0
- package/dist/client/assets/chunk-SVP7TREG-BZfMhm64.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-BZfMhm64.js.gz +0 -0
- package/dist/client/assets/chunk-TICWLB2K-DmkEaRK3.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-DmkEaRK3.js.gz +0 -0
- package/dist/client/assets/classDiagram-ZZMXUADV-DtAtEoWU.js +0 -1
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-DtAtEoWU.js +0 -1
- package/dist/client/assets/clipboardText-cZXParp1.js +0 -1
- package/dist/client/assets/clipboardText-cZXParp1.js.br +0 -0
- package/dist/client/assets/clipboardText-cZXParp1.js.gz +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-0xPYMc2z.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-0xPYMc2z.js.gz +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-BQ7-lCHm.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-BQ7-lCHm.js.gz +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CazHuSj1.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CazHuSj1.js.gz +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-CJNgsyHQ.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-CJNgsyHQ.js.gz +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-D4xXIj1P.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-D4xXIj1P.js.gz +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-BWhpL-35.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-BWhpL-35.js.gz +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-DG9A7EgJ.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-DG9A7EgJ.js.gz +0 -0
- package/dist/client/assets/diagram-VX7I27RA-L5PSvynM.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-L5PSvynM.js.gz +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-moBH7ruR.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-moBH7ruR.js.gz +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-DEiGgcRP.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-DEiGgcRP.js.gz +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-BboIleYi.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-BboIleYi.js.gz +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-COxz7Rda.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-COxz7Rda.js.gz +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-_XdRvgyZ.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-_XdRvgyZ.js.gz +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-CBb9xBNW.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-CBb9xBNW.js.gz +0 -0
- package/dist/client/assets/index-nIgxJ6I3.css +0 -1
- package/dist/client/assets/index-nIgxJ6I3.css.br +0 -0
- package/dist/client/assets/index-nIgxJ6I3.css.gz +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-Bcr-lhIE.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-Bcr-lhIE.js.gz +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-3vK6s9Pq.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-3vK6s9Pq.js.gz +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-DqDYDca0.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-DqDYDca0.js.gz +0 -0
- package/dist/client/assets/layout-C7_WwzCP.js.br +0 -0
- package/dist/client/assets/layout-C7_WwzCP.js.gz +0 -0
- package/dist/client/assets/linear-BQCRhl6P.js.br +0 -0
- package/dist/client/assets/linear-BQCRhl6P.js.gz +0 -0
- package/dist/client/assets/link-Cq14tNBm.js.gz +0 -0
- package/dist/client/assets/loader-circle-Df0zpx5N.js +0 -1
- package/dist/client/assets/mermaid.core-DGsccxt-.js.br +0 -0
- package/dist/client/assets/mermaid.core-DGsccxt-.js.gz +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-l0eF1PQE.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-l0eF1PQE.js.gz +0 -0
- package/dist/client/assets/passwordBootstrap-B5VzheZz.js.gz +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-fRrxGIDM.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-fRrxGIDM.js.gz +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-B-EBa3qN.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-B-EBa3qN.js.gz +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-Dj4e6f4h.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-Dj4e6f4h.js.gz +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-CEMppxTC.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-CEMppxTC.js.gz +0 -0
- package/dist/client/assets/rdpSession-C5rS-ImV.js +0 -1
- package/dist/client/assets/rdpSession-C5rS-ImV.js.br +0 -0
- package/dist/client/assets/rdpSession-C5rS-ImV.js.gz +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-Dri1k4_x.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-Dri1k4_x.js.gz +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-CMsL_tYL.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-CMsL_tYL.js.gz +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-4_4hZtOd.js.gz +0 -0
- package/dist/client/assets/settings-2-iGqzPez0.js +0 -1
- package/dist/client/assets/sizeCapture-INFHLROL-3QA6qj2j.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-3QA6qj2j.js.gz +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-90IFPhD9.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-90IFPhD9.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-CH-yvmL4.js +0 -1
- package/dist/client/assets/swimlanes-42K2YHIH-BuHieVWC.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH-BuHieVWC.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-P_rDqbtg.js +0 -8
- package/dist/client/assets/swiper-DJjq1TYT.js +0 -1
- 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-Cz6TPDW9.js +0 -4
- package/dist/client/assets/syntaxHighlight-Cz6TPDW9.js.br +0 -0
- package/dist/client/assets/syntaxHighlight-Cz6TPDW9.js.gz +0 -0
- package/dist/client/assets/terminal-Dea8wJF3.js.br +0 -0
- package/dist/client/assets/terminal-Dea8wJF3.js.gz +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-C7FpaNwf.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-C7FpaNwf.js.gz +0 -0
- package/dist/client/assets/triangle-alert-Oj-OsZDw.js +0 -1
- package/dist/client/assets/use-gesture-react.esm-DYpdiE_k.js +0 -1
- 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/vennDiagram-4TSXK5OY-CxoHHVcs.js.br +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-CxoHHVcs.js.gz +0 -0
- package/dist/client/assets/videoCompression-rr2lu3uy.js.br +0 -0
- package/dist/client/assets/videoCompression-rr2lu3uy.js.gz +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-B4Hsh-Ad.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-B4Hsh-Ad.js.gz +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-CghzsxQv.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-CghzsxQv.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,
|
|
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,o)=>{const a=e||("document"in self?document.currentScript.src:"")||location.href;if(s[a])return;let r={};const c=e=>n(e,a),d={module:{uri:a},exports:r,require:c};s[a]=Promise.all(i.map(e=>d[e]||c(e))).then(e=>(o(...e),r))}}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:"285237b81d8d0f5b17794822bbd5b73f"},{url:"assets/app-CovJYQoW.js",revision:null},{url:"assets/react-XDCjal2T.js",revision:null},{url:"assets/dnd-BCFAPC0L.js",revision:null},{url:"assets/terminal-DaiFCKy_.js",revision:null},{url:"assets/index-DEAMSl55.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,13 +1,13 @@
|
|
|
1
|
-
import { RELAY_CLIENT_CONNECT_TIMEOUT_MS } from '../federation/streamLimits.js';
|
|
2
1
|
import { encryptedRequestSubject } from '../federation/requestContext.js';
|
|
3
2
|
import { randomUUID } from 'node:crypto';
|
|
4
3
|
import { readFileSync, writeFileSync, renameSync, mkdirSync } from 'node:fs';
|
|
5
4
|
import { dirname } from 'node:path';
|
|
6
|
-
import
|
|
7
|
-
import { AsyncQueue, toBase64, fromBase64, PacketChannel } from '../federation/packets.js';
|
|
5
|
+
import { PacketChannel } from '../federation/packets.js';
|
|
8
6
|
import { secureConnection } from '../federation/secureProtocol.js';
|
|
9
7
|
import { socketDuplex } from '../federation/socketDuplex.js';
|
|
10
|
-
import {
|
|
8
|
+
import { RelayTransport } from '../federation/relayTransport.js';
|
|
9
|
+
import { createServiceSocket, waitForServiceSocket } from '../federation/serviceTransport.js';
|
|
10
|
+
import { serviceEndpoint } from '../federation/connectionModel.js';
|
|
11
11
|
import { COLLAB_LIMITS, STATUS_RANK } from './collaborationProtocol.js';
|
|
12
12
|
import { terminalMessage } from './collaborationStore.js';
|
|
13
13
|
/** The outer API gate already authenticated local CLI tokens. Browser callers
|
|
@@ -123,23 +123,19 @@ export class CollaborationRpc {
|
|
|
123
123
|
this.pending.clear();
|
|
124
124
|
}
|
|
125
125
|
}
|
|
126
|
-
export async function connectCollaborationRpc(identity, peer, endpoint, receive, configuredCa) {
|
|
126
|
+
export async function connectCollaborationRpc(identity, peer, endpoint, receive, configuredCa, certificateFingerprint256, signal) {
|
|
127
127
|
validateCollaborationNode(peer);
|
|
128
|
-
const
|
|
129
|
-
const
|
|
130
|
-
const
|
|
131
|
-
const
|
|
132
|
-
const duplex =
|
|
128
|
+
const url = endpoint ?? serviceEndpoint(peer.origin).href;
|
|
129
|
+
const socket = await createServiceSocket(url, { ca: configuredCa, caFingerprint256: peer.caFingerprint256, certificateFingerprint256 }, { signal, handshakeTimeout: 3000 });
|
|
130
|
+
const relay = endpoint ? new RelayTransport(url, peer.serviceId, () => socket, { entryUrl: peer.origin }) : undefined;
|
|
131
|
+
const wire = relay || socket;
|
|
132
|
+
const duplex = socketDuplex(wire);
|
|
133
133
|
try {
|
|
134
|
-
await
|
|
135
|
-
|
|
136
|
-
socket.once('error', reject);
|
|
137
|
-
socket.once('close', () => reject(new Error('PEER_DISCONNECTED')));
|
|
138
|
-
});
|
|
139
|
-
if (relay)
|
|
140
|
-
await relay.ready;
|
|
141
|
-
const secured = await secureConnection({ identity, duplex, initiator: true, targetPinnedPeerId: peer.serviceId, signal: AbortSignal.timeout(5000) });
|
|
134
|
+
await waitForServiceSocket(wire, signal);
|
|
135
|
+
const secured = await secureConnection({ identity, duplex, initiator: true, targetPinnedPeerId: peer.serviceId, signal: signal ? AbortSignal.any([signal, AbortSignal.timeout(5000)]) : AbortSignal.timeout(5000) });
|
|
142
136
|
const rpc = new CollaborationRpc(new PacketChannel(secured.duplex), receive);
|
|
137
|
+
if (relay)
|
|
138
|
+
relay.addEventListener('close', () => rpc.close(relay.transportFailure), { once: true });
|
|
143
139
|
if (receive) {
|
|
144
140
|
try {
|
|
145
141
|
await rpc.request({ type: 'collaboration-connect' });
|
|
@@ -160,57 +156,6 @@ export async function connectCollaborationRpc(identity, peer, endpoint, receive,
|
|
|
160
156
|
throw error;
|
|
161
157
|
}
|
|
162
158
|
}
|
|
163
|
-
function relayDuplex(socket, target) {
|
|
164
|
-
const queue = new AsyncQueue(64), streamId = randomUUID();
|
|
165
|
-
let readyResolve, readyReject;
|
|
166
|
-
const ready = new Promise((resolve, reject) => { readyResolve = resolve; readyReject = reject; });
|
|
167
|
-
void ready.catch(() => { });
|
|
168
|
-
const timer = setTimeout(() => fail(new Error('ROUTE_TIMEOUT')), RELAY_CLIENT_CONNECT_TIMEOUT_MS);
|
|
169
|
-
const fail = (error) => { clearTimeout(timer); readyReject(error); queue.end(error); socket.close(); };
|
|
170
|
-
const send = (frame) => {
|
|
171
|
-
if (socket.readyState !== 1 || socket.bufferedAmount > 1024 * 1024)
|
|
172
|
-
throw new Error('ROUTE_CONGESTED');
|
|
173
|
-
socket.send(JSON.stringify(frame));
|
|
174
|
-
};
|
|
175
|
-
socket.on('error', fail);
|
|
176
|
-
socket.on('close', () => fail(new Error('ROUTE_CLOSED')));
|
|
177
|
-
socket.on('message', (raw, binary) => {
|
|
178
|
-
try {
|
|
179
|
-
if (binary || raw.toString().length > 256 * 1024)
|
|
180
|
-
throw new Error('INVALID_RELAY_FRAME');
|
|
181
|
-
const frame = JSON.parse(raw.toString());
|
|
182
|
-
if (frame.type === 'ready') {
|
|
183
|
-
send({ type: 'open', streamId, serviceId: target });
|
|
184
|
-
return;
|
|
185
|
-
}
|
|
186
|
-
if (frame.streamId !== streamId)
|
|
187
|
-
return;
|
|
188
|
-
if (frame.type === 'opened') {
|
|
189
|
-
clearTimeout(timer);
|
|
190
|
-
readyResolve();
|
|
191
|
-
return;
|
|
192
|
-
}
|
|
193
|
-
if (frame.type !== 'data' || frame.encoding !== 'base64' || typeof frame.payload !== 'string')
|
|
194
|
-
throw new Error('ROUTE_CLOSED');
|
|
195
|
-
queue.push(fromBase64(frame.payload));
|
|
196
|
-
}
|
|
197
|
-
catch (error) {
|
|
198
|
-
fail(error instanceof Error ? error : new Error('INVALID_RELAY_FRAME'));
|
|
199
|
-
}
|
|
200
|
-
});
|
|
201
|
-
return { ready, duplex: { source: queue, close: () => socket.close(), async sink(source) {
|
|
202
|
-
await ready;
|
|
203
|
-
for await (const bytes of source)
|
|
204
|
-
for (let offset = 0; offset < bytes.length; offset += 65536) {
|
|
205
|
-
while (socket.bufferedAmount > 256 * 1024) {
|
|
206
|
-
if (socket.readyState !== 1)
|
|
207
|
-
throw new Error('ROUTE_CLOSED');
|
|
208
|
-
await new Promise(resolve => setTimeout(resolve, 10));
|
|
209
|
-
}
|
|
210
|
-
send({ type: 'data', streamId, encoding: 'base64', payload: toBase64(bytes.subarray(offset, offset + 65536)) });
|
|
211
|
-
}
|
|
212
|
-
} } };
|
|
213
|
-
}
|
|
214
159
|
/** Group-scoped, durable server-to-server delivery. A binding is installed only
|
|
215
160
|
* by an already authorized group administrator, never by the remote peer itself. */
|
|
216
161
|
export class CollaborationPeerTransport {
|
|
@@ -620,6 +620,11 @@ export class CollaborationStore {
|
|
|
620
620
|
this.persist(true);
|
|
621
621
|
return reply;
|
|
622
622
|
}
|
|
623
|
+
/** References only: callers can select a bounded page before projecting bodies. */
|
|
624
|
+
listGroupMessages(groupId) {
|
|
625
|
+
this.expire();
|
|
626
|
+
return this.document.messages.filter(message => message.groupId === groupId);
|
|
627
|
+
}
|
|
623
628
|
listMessages(groupId, limit = 200) {
|
|
624
629
|
return this.document.messages.filter((message) => message.groupId === groupId).slice(-Math.max(1, Math.min(limit, 500)));
|
|
625
630
|
}
|
|
@@ -54,7 +54,7 @@ const OWNED_FILE_STEM_JS = 'termdock.js';
|
|
|
54
54
|
function targetPath(agent) {
|
|
55
55
|
switch (agent) {
|
|
56
56
|
case 'claude': return claudeSettingsPath();
|
|
57
|
-
case 'codex': return path.join(homeDir(), '.codex', 'hooks.json');
|
|
57
|
+
case 'codex': return path.join(process.env.CODEX_HOME?.trim() || path.join(homeDir(), '.codex'), 'hooks.json');
|
|
58
58
|
case 'copilot': return path.join(homeDir(), '.copilot', 'hooks', OWNED_FILE_STEM_JSON);
|
|
59
59
|
case 'opencode': return path.join(xdgConfigDir(), 'opencode', 'plugins', OWNED_FILE_STEM_JS);
|
|
60
60
|
case 'pi': return path.join(homeDir(), '.pi', 'agent', 'extensions', 'termdock', 'index.ts');
|
|
@@ -92,7 +92,7 @@ function hookCommand(agent, event) {
|
|
|
92
92
|
/** Substring identifying a hook entry / owned file as termdock's. Every
|
|
93
93
|
* generated command and file embeds `agent-hook <slug>` verbatim. */
|
|
94
94
|
function marker(agent) {
|
|
95
|
-
return `agent-hook ${agent}`;
|
|
95
|
+
return `agent-hook ${agent} `;
|
|
96
96
|
}
|
|
97
97
|
/** Best-effort atomic write: tmp file + rename. */
|
|
98
98
|
function writeAtomic(file, content) {
|
|
@@ -116,6 +116,8 @@ function writeAtomic(file, content) {
|
|
|
116
116
|
const CLAUDE_HOOK_EVENTS = [
|
|
117
117
|
['SessionStart', 'session-start'],
|
|
118
118
|
['UserPromptSubmit', 'prompt-submit'],
|
|
119
|
+
['PermissionRequest', 'permission-request'],
|
|
120
|
+
['PreToolUse', 'tool-start'],
|
|
119
121
|
['Notification', 'notification'],
|
|
120
122
|
['PostToolUse', 'tool-complete'],
|
|
121
123
|
['Stop', 'stop'],
|
|
@@ -126,8 +128,10 @@ const CODEX_HOOK_EVENTS = [
|
|
|
126
128
|
['SessionStart', 'session-start'],
|
|
127
129
|
['UserPromptSubmit', 'prompt-submit'],
|
|
128
130
|
['PermissionRequest', 'permission-request'],
|
|
131
|
+
['PreToolUse', 'tool-start'],
|
|
129
132
|
['PostToolUse', 'tool-complete'],
|
|
130
133
|
['Stop', 'stop'],
|
|
134
|
+
['Interrupt', 'stop'],
|
|
131
135
|
['SessionEnd', 'session-end'],
|
|
132
136
|
];
|
|
133
137
|
/** Shared budget for Termdock status emitters, in seconds. */
|
|
@@ -205,6 +209,22 @@ function markerCommand(entry, mark) {
|
|
|
205
209
|
}
|
|
206
210
|
return null;
|
|
207
211
|
}
|
|
212
|
+
/** Remove only our handlers, including when a user grouped their own
|
|
213
|
+
* command alongside ours. Preserve matcher metadata and unrelated agents. */
|
|
214
|
+
function removeOwnedHookHandlers(list, mark) {
|
|
215
|
+
return list.flatMap((entry) => {
|
|
216
|
+
if (!entry || typeof entry !== 'object' || !Array.isArray(entry.hooks))
|
|
217
|
+
return [entry];
|
|
218
|
+
const group = entry;
|
|
219
|
+
const handlers = group.hooks;
|
|
220
|
+
const kept = handlers.filter(handler => !handler || typeof handler !== 'object'
|
|
221
|
+
|| typeof handler.command !== 'string'
|
|
222
|
+
|| !handler.command.includes(mark));
|
|
223
|
+
if (kept.length === handlers.length)
|
|
224
|
+
return [entry];
|
|
225
|
+
return kept.length ? [{ ...group, hooks: kept }] : [];
|
|
226
|
+
});
|
|
227
|
+
}
|
|
208
228
|
function hookMapState(file, agent, events) {
|
|
209
229
|
const root = readJsonObject(file);
|
|
210
230
|
if (!root)
|
|
@@ -272,7 +292,7 @@ function hookMapInstall(file, agent, events) {
|
|
|
272
292
|
if (!Array.isArray(list))
|
|
273
293
|
continue; // malformed user config; leave it alone
|
|
274
294
|
// Drop any previous termdock entry (stale exe path), then append ours.
|
|
275
|
-
const kept = list
|
|
295
|
+
const kept = removeOwnedHookHandlers(list, mark);
|
|
276
296
|
const handler = { type: 'command', command };
|
|
277
297
|
handler.timeout = hookTimeout(sentinel);
|
|
278
298
|
kept.push({ hooks: [handler] });
|
|
@@ -295,8 +315,8 @@ function hookMapUninstall(file, agent) {
|
|
|
295
315
|
const list = hooks[eventName];
|
|
296
316
|
if (!Array.isArray(list))
|
|
297
317
|
continue;
|
|
298
|
-
const kept = list
|
|
299
|
-
removed += list.
|
|
318
|
+
const kept = removeOwnedHookHandlers(list, mark);
|
|
319
|
+
removed += list.filter(entry => markerCommand(entry, mark) !== null).length;
|
|
300
320
|
if (kept.length === 0) {
|
|
301
321
|
delete hooks[eventName];
|
|
302
322
|
}
|
|
@@ -681,13 +701,33 @@ export function hooksState(agent) {
|
|
|
681
701
|
return ownedFileState(file, expected, marker(agent));
|
|
682
702
|
}
|
|
683
703
|
let codexRuntimeStateCache = null;
|
|
704
|
+
export function codexHookRegistryState(hooks) {
|
|
705
|
+
let approvalNeeded = false;
|
|
706
|
+
for (const [event, sentinel] of CODEX_HOOK_EVENTS) {
|
|
707
|
+
const eventName = event[0].toLowerCase() + event.slice(1);
|
|
708
|
+
const matching = hooks.filter(hook => hook.eventName === eventName && hook.command === hookCommand('codex', sentinel));
|
|
709
|
+
if (!matching.length)
|
|
710
|
+
return 'outdated';
|
|
711
|
+
if (!matching.some(hook => hook.enabled === true && ['trusted', 'managed'].includes(hook.trustStatus ?? '')))
|
|
712
|
+
approvalNeeded = true;
|
|
713
|
+
}
|
|
714
|
+
return approvalNeeded ? 'needs-approval' : 'installed';
|
|
715
|
+
}
|
|
684
716
|
/** Query Codex's own hook registry: a structurally present hook can still be
|
|
685
717
|
* quarantined until the user approves its current hash in `/hooks`. */
|
|
686
718
|
async function codexRuntimeHooksState() {
|
|
687
719
|
const structural = hooksState('codex');
|
|
688
720
|
if (structural !== 'installed')
|
|
689
721
|
return structural;
|
|
690
|
-
|
|
722
|
+
let stat;
|
|
723
|
+
try {
|
|
724
|
+
stat = fs.statSync(targetPath('codex'));
|
|
725
|
+
}
|
|
726
|
+
catch {
|
|
727
|
+
return 'unverified';
|
|
728
|
+
}
|
|
729
|
+
const key = `${targetPath('codex')}:${stat.mtimeMs}:${stat.size}:${process.cwd()}`;
|
|
730
|
+
if (codexRuntimeStateCache?.key === key && Date.now() - codexRuntimeStateCache.at < 30_000) {
|
|
691
731
|
return codexRuntimeStateCache.state;
|
|
692
732
|
}
|
|
693
733
|
const state = await new Promise((resolve) => {
|
|
@@ -705,11 +745,17 @@ async function codexRuntimeHooksState() {
|
|
|
705
745
|
child.kill();
|
|
706
746
|
resolve(value);
|
|
707
747
|
};
|
|
708
|
-
const timer = setTimeout(() => finish(
|
|
748
|
+
const timer = setTimeout(() => finish('unverified'), 5_000);
|
|
709
749
|
timer.unref?.();
|
|
710
|
-
child.on('error', () => finish(
|
|
750
|
+
child.on('error', () => finish('unverified'));
|
|
751
|
+
child.on('close', () => finish('unverified'));
|
|
752
|
+
child.stdin.on('error', () => finish('unverified'));
|
|
711
753
|
child.stdout.on('data', (chunk) => {
|
|
712
754
|
buffer += chunk.toString();
|
|
755
|
+
if (buffer.length > 1024 * 1024) {
|
|
756
|
+
finish('unverified');
|
|
757
|
+
return;
|
|
758
|
+
}
|
|
713
759
|
for (;;) {
|
|
714
760
|
const newline = buffer.indexOf('\n');
|
|
715
761
|
if (newline < 0)
|
|
@@ -725,28 +771,31 @@ async function codexRuntimeHooksState() {
|
|
|
725
771
|
catch {
|
|
726
772
|
continue;
|
|
727
773
|
}
|
|
774
|
+
if (message.error && (message.id === 1 || message.id === 2)) {
|
|
775
|
+
finish('unverified');
|
|
776
|
+
return;
|
|
777
|
+
}
|
|
728
778
|
if (message.id === 1) {
|
|
729
779
|
child.stdin.write(`${JSON.stringify({ method: 'initialized', params: {} })}\n`);
|
|
730
780
|
child.stdin.write(`${JSON.stringify({ id: 2, method: 'hooks/list', params: { cwds: [process.cwd()] } })}\n`);
|
|
731
781
|
}
|
|
732
782
|
else if (message.id === 2) {
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
else if (ours.some((hook) => hook.enabled === false || !['trusted', 'managed'].includes(hook.trustStatus ?? '')))
|
|
739
|
-
finish('needs-approval');
|
|
740
|
-
else
|
|
741
|
-
finish('installed');
|
|
783
|
+
if (!Array.isArray(message.result?.data)) {
|
|
784
|
+
finish('unverified');
|
|
785
|
+
return;
|
|
786
|
+
}
|
|
787
|
+
finish(codexHookRegistryState(message.result.data.flatMap(entry => entry.hooks ?? [])));
|
|
742
788
|
}
|
|
743
789
|
}
|
|
744
790
|
});
|
|
745
791
|
child.stdin.write(`${JSON.stringify({ id: 1, method: 'initialize', params: { clientInfo: { name: 'termdock', version: '1' } } })}\n`);
|
|
746
792
|
});
|
|
747
|
-
codexRuntimeStateCache = { at: Date.now(), state };
|
|
793
|
+
codexRuntimeStateCache = { at: Date.now(), key, state };
|
|
748
794
|
return state;
|
|
749
795
|
}
|
|
796
|
+
export async function runtimeHooksStateForSlug(slug) {
|
|
797
|
+
return slug === 'codex' ? codexRuntimeHooksState() : hooksStateForSlug(slug);
|
|
798
|
+
}
|
|
750
799
|
export function listHookAgents() {
|
|
751
800
|
return HOOK_AGENTS.map((slug) => ({
|
|
752
801
|
slug,
|
|
@@ -908,18 +957,17 @@ export function pluginHooksState(slug, file, events) {
|
|
|
908
957
|
const list = hooks && typeof hooks === 'object'
|
|
909
958
|
? hooks[hookEvent]
|
|
910
959
|
: null;
|
|
911
|
-
const ours = Array.isArray(list)
|
|
912
|
-
|
|
913
|
-
: undefined;
|
|
914
|
-
if (ours !== undefined) {
|
|
960
|
+
const ours = Array.isArray(list) ? list.filter((entry) => markerCommand(entry, mark) !== null) : [];
|
|
961
|
+
if (ours.length) {
|
|
915
962
|
any = true;
|
|
916
|
-
const
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
963
|
+
const covered = ours.some((entry) => {
|
|
964
|
+
const group = entry;
|
|
965
|
+
return (matcher ?? undefined) === group.matcher && Array.isArray(group.hooks)
|
|
966
|
+
&& group.hooks.some(handler => handler && typeof handler === 'object'
|
|
967
|
+
&& handler.command === hookCommandForPlugin(slug, sentinel, status)
|
|
968
|
+
&& handler.timeout === (timeout ?? hookTimeout(sentinel)));
|
|
969
|
+
});
|
|
970
|
+
if (!covered)
|
|
923
971
|
complete = false;
|
|
924
972
|
}
|
|
925
973
|
else {
|
|
@@ -954,6 +1002,12 @@ export function installPluginHooks(slug, file, events) {
|
|
|
954
1002
|
}
|
|
955
1003
|
const hooks = root.hooks;
|
|
956
1004
|
const mark = marker(slug);
|
|
1005
|
+
// Clear the previous owned set once, then add every mapping. Clearing on
|
|
1006
|
+
// each mapping loses all but the last matcher sharing a native hook event.
|
|
1007
|
+
for (const [eventName, list] of Object.entries(hooks)) {
|
|
1008
|
+
if (Array.isArray(list))
|
|
1009
|
+
hooks[eventName] = removeOwnedHookHandlers(list, mark);
|
|
1010
|
+
}
|
|
957
1011
|
for (const [hookEvent, sentinel, matcher, timeout, status] of events) {
|
|
958
1012
|
const command = hookCommandForPlugin(slug, sentinel, status);
|
|
959
1013
|
let list = hooks[hookEvent];
|
|
@@ -963,7 +1017,7 @@ export function installPluginHooks(slug, file, events) {
|
|
|
963
1017
|
}
|
|
964
1018
|
if (!Array.isArray(list))
|
|
965
1019
|
continue;
|
|
966
|
-
const kept = list
|
|
1020
|
+
const kept = [...list];
|
|
967
1021
|
const handler = { type: 'command', command };
|
|
968
1022
|
handler.timeout = timeout ?? hookTimeout(sentinel);
|
|
969
1023
|
const entry = { hooks: [handler] };
|
|
@@ -988,8 +1042,8 @@ function uninstallPluginHooks(slug, file) {
|
|
|
988
1042
|
const list = hooks[eventName];
|
|
989
1043
|
if (!Array.isArray(list))
|
|
990
1044
|
continue;
|
|
991
|
-
const kept = list
|
|
992
|
-
removed += list.
|
|
1045
|
+
const kept = removeOwnedHookHandlers(list, mark);
|
|
1046
|
+
removed += list.filter(entry => markerCommand(entry, mark) !== null).length;
|
|
993
1047
|
if (kept.length === 0) {
|
|
994
1048
|
delete hooks[eventName];
|
|
995
1049
|
}
|
|
@@ -1014,7 +1068,9 @@ export function refreshStaleHooksAtLaunch() {
|
|
|
1014
1068
|
if (hooksState(agent) !== 'outdated')
|
|
1015
1069
|
continue;
|
|
1016
1070
|
try {
|
|
1017
|
-
void installHooks(agent)
|
|
1071
|
+
void installHooks(agent).catch((error) => {
|
|
1072
|
+
console.warn(`[agent-hooks] could not refresh stale ${agent} hooks:`, error.message);
|
|
1073
|
+
});
|
|
1018
1074
|
refreshed++;
|
|
1019
1075
|
console.log(`[agent-hooks] refreshed stale ${agent} hooks at ${abbreviateHome(targetPath(agent))}`);
|
|
1020
1076
|
}
|
|
@@ -9,7 +9,16 @@ import { terminalMessage } from './collaborationStore.js';
|
|
|
9
9
|
import { IntegrationStore, INTEGRATION_PROTOCOL, INTEGRATION_OPERATIONS, atomicJson, integrationError } from './integrationStore.js';
|
|
10
10
|
import { IntegrationSessions, publicIntegrationSession } from './integrationSessions.js';
|
|
11
11
|
import { getTermdockVersion } from '../utils/version.js';
|
|
12
|
-
export function integrationSocketPath(port
|
|
12
|
+
export function integrationSocketPath(port, home = homedir()) {
|
|
13
|
+
const preferred = path.join(home, '.termdock', `integration-${port}.sock`);
|
|
14
|
+
// Darwin's sockaddr_un is shorter than Linux's. Node can truncate a long
|
|
15
|
+
// pathname while binding, leaving chmod and clients looking at another name.
|
|
16
|
+
if (Buffer.byteLength(preferred) < 100)
|
|
17
|
+
return preferred;
|
|
18
|
+
const owner = process.getuid?.() ?? 'user';
|
|
19
|
+
const key = createHash('sha256').update(home).digest('hex').slice(0, 16);
|
|
20
|
+
return path.join('/tmp', `td-integration-${owner}-${key}`, `${port}.sock`);
|
|
21
|
+
}
|
|
13
22
|
function scopedId(input, ids, type) {
|
|
14
23
|
if (typeof input !== 'string')
|
|
15
24
|
integrationError(`INVALID_${type}_ID`, 'A message or member id is required');
|
|
@@ -618,6 +627,14 @@ export class IntegrationRuntime {
|
|
|
618
627
|
}
|
|
619
628
|
async listen() {
|
|
620
629
|
fs.mkdirSync(path.dirname(this.options.socketPath), { recursive: true, mode: 0o700 });
|
|
630
|
+
const directory = path.dirname(this.options.socketPath);
|
|
631
|
+
if (directory.startsWith('/tmp/td-integration-')) {
|
|
632
|
+
const stat = fs.lstatSync(directory);
|
|
633
|
+
if (!stat.isDirectory() || (process.getuid && stat.uid !== process.getuid())) {
|
|
634
|
+
integrationError('INTEGRATION_SOCKET_DIRECTORY_INVALID', 'Socket directory must be private and owned by this user');
|
|
635
|
+
}
|
|
636
|
+
fs.chmodSync(directory, 0o700);
|
|
637
|
+
}
|
|
621
638
|
// A stale socket may be removed only after proving no listener exists.
|
|
622
639
|
if (fs.existsSync(this.options.socketPath)) {
|
|
623
640
|
const { createConnection } = await import('node:net');
|
|
@@ -635,7 +652,19 @@ export class IntegrationRuntime {
|
|
|
635
652
|
integrationError('INTEGRATION_SOCKET_INVALID', 'Refusing to replace a non-socket file');
|
|
636
653
|
fs.unlinkSync(this.options.socketPath);
|
|
637
654
|
}
|
|
638
|
-
await new Promise((resolve, reject) => {
|
|
655
|
+
await new Promise((resolve, reject) => {
|
|
656
|
+
this.server.once('error', reject);
|
|
657
|
+
this.server.listen(this.options.socketPath, () => {
|
|
658
|
+
this.server.removeListener('error', reject);
|
|
659
|
+
try {
|
|
660
|
+
fs.chmodSync(this.options.socketPath, 0o600);
|
|
661
|
+
resolve();
|
|
662
|
+
}
|
|
663
|
+
catch (error) {
|
|
664
|
+
reject(error);
|
|
665
|
+
}
|
|
666
|
+
});
|
|
667
|
+
});
|
|
639
668
|
this.sync();
|
|
640
669
|
await this.sessions.refreshAll();
|
|
641
670
|
void this.pumpReleaseBatches();
|
|
@@ -11,36 +11,63 @@ const MAX_PACKAGE_BYTES = 16 * 1024 * 1024;
|
|
|
11
11
|
const MAX_SINGLE_FILE_BYTES = 8 * 1024 * 1024;
|
|
12
12
|
const GIT_TIMEOUT_MS = 45_000;
|
|
13
13
|
const IGNORED_NAMES = new Set(['.git', '.github', 'node_modules', SOURCE_METADATA_FILE]);
|
|
14
|
-
const DEFAULT_GIT_HOSTS = new Set(['github.com', 'gitlab.com', 'codeberg.org', 'bitbucket.org']);
|
|
15
14
|
function hardenedGitEnv() {
|
|
16
|
-
|
|
15
|
+
const env = {
|
|
17
16
|
...process.env,
|
|
18
17
|
GIT_TERMINAL_PROMPT: '0',
|
|
19
|
-
|
|
20
|
-
GIT_CONFIG_GLOBAL: '/dev/null',
|
|
21
|
-
GIT_CONFIG_SYSTEM: '/dev/null',
|
|
18
|
+
GIT_LFS_SKIP_SMUDGE: '1',
|
|
22
19
|
};
|
|
20
|
+
// Keep the service user's credential helpers, SSH agent/config, CA and
|
|
21
|
+
// proxy settings. Only repository-local context inherited from a caller
|
|
22
|
+
// must not redirect these operations into another working tree.
|
|
23
|
+
for (const key of ['GIT_DIR', 'GIT_WORK_TREE', 'GIT_INDEX_FILE', 'GIT_COMMON_DIR',
|
|
24
|
+
'GIT_OBJECT_DIRECTORY', 'GIT_ALTERNATE_OBJECT_DIRECTORIES'])
|
|
25
|
+
delete env[key];
|
|
26
|
+
if (!env.GIT_SSH_COMMAND && !env.GIT_SSH)
|
|
27
|
+
env.GIT_SSH_COMMAND = 'ssh -o BatchMode=yes';
|
|
28
|
+
return env;
|
|
23
29
|
}
|
|
24
|
-
|
|
30
|
+
const GIT_OPTIONS = [
|
|
31
|
+
'-c', `core.hooksPath=${os.devNull}`,
|
|
32
|
+
'-c', 'protocol.allow=never',
|
|
33
|
+
'-c', 'protocol.http.allow=always',
|
|
34
|
+
'-c', 'protocol.https.allow=always',
|
|
35
|
+
'-c', 'protocol.ssh.allow=always',
|
|
36
|
+
'-c', 'filter.lfs.smudge=',
|
|
37
|
+
'-c', 'filter.lfs.process=',
|
|
38
|
+
'-c', 'filter.lfs.required=false',
|
|
39
|
+
];
|
|
40
|
+
function gitHostAllowed(host) {
|
|
25
41
|
const configured = (process.env.TERMDOCK_PLUGIN_GIT_HOSTS ?? '')
|
|
26
42
|
.split(',')
|
|
27
43
|
.map((host) => host.trim().toLowerCase())
|
|
28
44
|
.filter(Boolean);
|
|
29
|
-
|
|
45
|
+
// An explicit administrative allowlist is optional. Self-hosted and
|
|
46
|
+
// private-network hosts work without having to edit service environment.
|
|
47
|
+
return configured.length === 0 || configured.includes(host.toLowerCase());
|
|
30
48
|
}
|
|
31
49
|
export function normalizeGitPluginSource(input) {
|
|
50
|
+
const source = input.trim();
|
|
51
|
+
if (!source || source.startsWith('-') || /[\x00-\x20\x7f]/.test(source) || /^[A-Za-z]:[\\/]/.test(source))
|
|
52
|
+
return null;
|
|
53
|
+
if (!source.includes('://')) {
|
|
54
|
+
const scp = /^(?:[A-Za-z0-9_.-]+@)?(\[[0-9a-fA-F:]+\]|[A-Za-z0-9][A-Za-z0-9._-]*):([^?#\\]+)$/.exec(source);
|
|
55
|
+
if (!scp || scp[2].startsWith('-') || !gitHostAllowed(scp[1]))
|
|
56
|
+
return null;
|
|
57
|
+
return source;
|
|
58
|
+
}
|
|
32
59
|
let url;
|
|
33
60
|
try {
|
|
34
|
-
url = new URL(
|
|
61
|
+
url = new URL(source);
|
|
35
62
|
}
|
|
36
63
|
catch {
|
|
37
64
|
return null;
|
|
38
65
|
}
|
|
39
|
-
if (
|
|
66
|
+
if (!['https:', 'http:', 'ssh:'].includes(url.protocol) || url.password || url.search || url.hash)
|
|
40
67
|
return null;
|
|
41
|
-
if (!
|
|
68
|
+
if (!url.hostname || url.hostname.startsWith('-') || !gitHostAllowed(url.hostname))
|
|
42
69
|
return null;
|
|
43
|
-
if (
|
|
70
|
+
if (url.pathname === '/' || /%0[0-9a-f]|%1[0-9a-f]|%7f/i.test(url.pathname))
|
|
44
71
|
return null;
|
|
45
72
|
url.pathname = url.pathname.replace(/\/$/, '');
|
|
46
73
|
return url.toString();
|
|
@@ -157,10 +184,7 @@ export async function preparePluginPackage(sourceInput, expectedSlug) {
|
|
|
157
184
|
if (remote) {
|
|
158
185
|
packageDir = path.join(temporaryRoot, 'repo');
|
|
159
186
|
await execFileAsync('git', [
|
|
160
|
-
|
|
161
|
-
'-c', 'core.hooksPath=/dev/null',
|
|
162
|
-
'-c', 'filter.lfs.smudge=',
|
|
163
|
-
'-c', 'filter.lfs.required=false',
|
|
187
|
+
...GIT_OPTIONS,
|
|
164
188
|
'clone', '--depth', '1', '--single-branch', '--no-recurse-submodules', '--', remote, packageDir,
|
|
165
189
|
], {
|
|
166
190
|
timeout: GIT_TIMEOUT_MS,
|
|
@@ -170,16 +194,20 @@ export async function preparePluginPackage(sourceInput, expectedSlug) {
|
|
|
170
194
|
const result = await execFileAsync('git', ['-C', packageDir, 'rev-parse', 'HEAD'], {
|
|
171
195
|
timeout: 5000,
|
|
172
196
|
maxBuffer: 128 * 1024,
|
|
197
|
+
env: hardenedGitEnv(),
|
|
173
198
|
});
|
|
174
199
|
revision = result.stdout.trim();
|
|
175
200
|
type = 'git';
|
|
176
201
|
normalizedSource = remote;
|
|
177
202
|
}
|
|
178
203
|
else {
|
|
179
|
-
|
|
204
|
+
if (source.includes('://') || /^(?:[^/]+@[^/]+:|[^/]+::)/.test(source)) {
|
|
205
|
+
throw new Error('Unsupported Git source: use an HTTPS, HTTP or SSH repository URL, an scp-style Git address, or a local package directory');
|
|
206
|
+
}
|
|
207
|
+
const resolved = path.resolve(source === '~' ? os.homedir() : source.startsWith('~/') ? path.join(os.homedir(), source.slice(2)) : source);
|
|
180
208
|
const stat = await fs.promises.stat(resolved).catch(() => null);
|
|
181
209
|
if (!stat)
|
|
182
|
-
throw new Error('Plugin source must be an existing local path or an
|
|
210
|
+
throw new Error('Plugin source must be an existing local path or an accessible HTTPS, HTTP or SSH Git repository');
|
|
183
211
|
packageDir = stat.isDirectory() ? resolved : path.dirname(resolved);
|
|
184
212
|
if (!stat.isDirectory() && path.basename(resolved) !== MANIFEST_FILE) {
|
|
185
213
|
throw new Error('A local plugin file must be named manifest.json');
|
|
@@ -224,8 +252,10 @@ export async function preparePluginPackage(sourceInput, expectedSlug) {
|
|
|
224
252
|
export async function commitPreparedPlugin(prepared, replace = false) {
|
|
225
253
|
await fs.promises.mkdir(PLUGINS_DIR, { recursive: true });
|
|
226
254
|
const target = path.join(PLUGINS_DIR, prepared.manifest.slug);
|
|
227
|
-
if (!replace && fs.existsSync(target))
|
|
255
|
+
if (!replace && fs.existsSync(target)) {
|
|
256
|
+
await prepared.cleanup();
|
|
228
257
|
throw new Error(`Plugin "${prepared.manifest.slug}" already exists`);
|
|
258
|
+
}
|
|
229
259
|
const stage = path.join(PLUGINS_DIR, `.stage-${prepared.manifest.slug}-${randomUUID()}`);
|
|
230
260
|
const backup = path.join(PLUGINS_DIR, `.backup-${prepared.manifest.slug}-${randomUUID()}`);
|
|
231
261
|
try {
|
|
@@ -260,11 +290,10 @@ export async function checkPluginPackageUpdate(plugin) {
|
|
|
260
290
|
if (metadata.type === 'git') {
|
|
261
291
|
const remote = normalizeGitPluginSource(metadata.source);
|
|
262
292
|
if (!remote)
|
|
263
|
-
throw new Error('The stored Git source is
|
|
293
|
+
throw new Error('The stored Git source is invalid or excluded by TERMDOCK_PLUGIN_GIT_HOSTS');
|
|
264
294
|
const { stdout } = await execFileAsync('git', [
|
|
265
|
-
|
|
266
|
-
'-
|
|
267
|
-
'ls-remote', remote, 'HEAD',
|
|
295
|
+
...GIT_OPTIONS,
|
|
296
|
+
'ls-remote', '--', remote, 'HEAD',
|
|
268
297
|
], {
|
|
269
298
|
timeout: 15_000,
|
|
270
299
|
maxBuffer: 128 * 1024,
|