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
package/scripts/postinstall.mjs
CHANGED
|
@@ -1,14 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* 对于 npm 全局安装 (npm i -g termdock) 的场景,npm 10+ 默认不运行
|
|
7
|
-
* lifecycle scripts。此时 postinstall 不会执行,但 cli.ts 启动时的
|
|
8
|
-
* bootCheck 会做同样的检查并写入 marker,确保首次启动时一切就绪。
|
|
9
|
-
*/
|
|
3
|
+
/** Ensure native modules work even when installed with a restricted lifecycle
|
|
4
|
+
* environment. --ignore-scripts/policy skips are repaired at first CLI start. */
|
|
10
5
|
|
|
11
|
-
import { execSync, spawnSync } from 'child_process';
|
|
12
6
|
import { createRequire } from 'module';
|
|
13
7
|
import fs from 'fs';
|
|
14
8
|
import os from 'os';
|
|
@@ -18,33 +12,7 @@ import { fileURLToPath } from 'node:url';
|
|
|
18
12
|
const require_ = createRequire(import.meta.url);
|
|
19
13
|
const pkgRoot = fileURLToPath(new URL('..', import.meta.url));
|
|
20
14
|
|
|
21
|
-
|
|
22
|
-
console.log(` $ ${cmd}`);
|
|
23
|
-
return execSync(cmd, { stdio: 'inherit', ...opts });
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
function runOk(cmd, opts = {}) {
|
|
27
|
-
try { run(cmd, opts); return true; } catch { return false; }
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
function runQuiet(cmd, timeoutMs = 30_000) {
|
|
31
|
-
try {
|
|
32
|
-
const r = spawnSync(cmd, [], { shell: true, timeout: timeoutMs, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });
|
|
33
|
-
return { ok: r.status === 0, stdout: r.stdout, stderr: r.stderr };
|
|
34
|
-
} catch {
|
|
35
|
-
return { ok: false, stdout: '', stderr: '' };
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
function which(bin) {
|
|
40
|
-
try { execSync(`command -v ${bin} 2>/dev/null`, { stdio: 'pipe' }); return true; } catch { /* not in PATH */ }
|
|
41
|
-
// macOS non-interactive SSH 的 PATH 不含 Homebrew,手动探测
|
|
42
|
-
const extraPaths = ['/opt/homebrew/bin', '/usr/local/bin', '/opt/local/bin'];
|
|
43
|
-
for (const dir of extraPaths) {
|
|
44
|
-
try { fs.accessSync(path.join(dir, bin), fs.constants.X_OK); return true; } catch { /* not here */ }
|
|
45
|
-
}
|
|
46
|
-
return false;
|
|
47
|
-
}
|
|
15
|
+
const { checkTmux, probeNodePty, clearPtyModuleCache } = require_('./install-utils.cjs');
|
|
48
16
|
|
|
49
17
|
// —— native modules: 实际 spawn 测试,不只是 require ——
|
|
50
18
|
console.log('\n=== Rebuilding native modules ===');
|
|
@@ -80,95 +48,40 @@ function fixSpawnHelperPermissions() {
|
|
|
80
48
|
}
|
|
81
49
|
fixSpawnHelperPermissions();
|
|
82
50
|
function testPty() {
|
|
83
|
-
try {
|
|
84
|
-
const pty = require_(PTY_PATH);
|
|
85
|
-
const proc = pty.spawn(process.env.SHELL || '/bin/bash', [], { name: 'xterm', cols: 80, rows: 24 });
|
|
86
|
-
proc.kill();
|
|
87
|
-
return true;
|
|
88
|
-
} catch { return false; }
|
|
51
|
+
try { probeNodePty(PTY_PATH); return true; } catch { return false; }
|
|
89
52
|
}
|
|
90
|
-
|
|
53
|
+
let rebuilt = false;
|
|
91
54
|
if (testPty()) {
|
|
92
55
|
console.log(' node-pty OK');
|
|
93
56
|
} else {
|
|
94
57
|
console.log(' node-pty needs rebuild (prebuilt binary incompatible with this OS/Node version)...');
|
|
95
58
|
fs.rmSync(path.join(PTY_PATH, 'prebuilds'), { recursive: true, force: true });
|
|
96
59
|
rebuildNodePty(PTY_PATH, { timeout: 120_000 });
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
}
|
|
60
|
+
clearPtyModuleCache(PTY_PATH);
|
|
61
|
+
if (!testPty()) throw new Error('node-pty rebuilt, but a terminal still cannot be created. Check the native module output above.');
|
|
62
|
+
rebuilt = true;
|
|
63
|
+
console.log(' ✓ node-pty rebuilt successfully');
|
|
102
64
|
}
|
|
103
65
|
|
|
104
66
|
// —— tmux ——
|
|
105
67
|
console.log('\n=== Checking tmux ===');
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
let installed = false;
|
|
110
|
-
|
|
111
|
-
if (platform === 'darwin') {
|
|
112
|
-
// macOS: try brew → macports → nix, in that order
|
|
113
|
-
const brew = which('brew');
|
|
114
|
-
if (brew) {
|
|
115
|
-
installed = runOk('brew install tmux 2>&1', { timeout: 120_000 });
|
|
116
|
-
} else if (which('port')) {
|
|
117
|
-
installed = runOk('port install tmux 2>&1', { timeout: 120_000 });
|
|
118
|
-
} else if (which('nix-env')) {
|
|
119
|
-
installed = runOk('nix-env -iA nixpkgs.tmux 2>&1', { timeout: 120_000 });
|
|
120
|
-
} else {
|
|
121
|
-
console.log(' No package manager found (brew/port/nix).');
|
|
122
|
-
console.log(' Install Homebrew: https://brew.sh — then reinstall termdock.');
|
|
123
|
-
}
|
|
124
|
-
} else if (platform === 'linux') {
|
|
125
|
-
const managers = [
|
|
126
|
-
{ bin: 'apt-get', cmd: 'apt-get install -y tmux', sudo: true },
|
|
127
|
-
{ bin: 'dnf', cmd: 'dnf install -y tmux', sudo: true },
|
|
128
|
-
{ bin: 'yum', cmd: 'yum install -y tmux', sudo: true },
|
|
129
|
-
{ bin: 'apk', cmd: 'apk add tmux', sudo: false },
|
|
130
|
-
{ bin: 'pacman', cmd: 'pacman -S --noconfirm tmux', sudo: true },
|
|
131
|
-
{ bin: 'zypper', cmd: 'zypper install -y tmux', sudo: true },
|
|
132
|
-
];
|
|
133
|
-
for (const m of managers) {
|
|
134
|
-
if (!which(m.bin)) continue;
|
|
135
|
-
const cmd = m.sudo ? `sudo ${m.cmd}` : m.cmd;
|
|
136
|
-
if (runOk(`${cmd} 2>&1`, { timeout: 120_000 })) {
|
|
137
|
-
installed = true;
|
|
138
|
-
break;
|
|
139
|
-
}
|
|
140
|
-
// retry without sudo
|
|
141
|
-
if (m.sudo && runOk(`${m.cmd} 2>&1`, { timeout: 120_000 })) {
|
|
142
|
-
installed = true;
|
|
143
|
-
break;
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
if (installed) {
|
|
149
|
-
console.log(' ✓ tmux installed');
|
|
150
|
-
} else {
|
|
151
|
-
console.log(' ⚠ tmux not available — shell mode will be used.');
|
|
152
|
-
console.log(' Termdock will check again on next start and try to fix automatically.');
|
|
153
|
-
}
|
|
154
|
-
} else {
|
|
155
|
-
const ver = execSync('tmux -V', { encoding: 'utf-8' }).trim();
|
|
156
|
-
console.log(` ✓ tmux ${ver}`);
|
|
157
|
-
}
|
|
68
|
+
const tmux = checkTmux();
|
|
69
|
+
if (tmux.ok) console.log(` ✓ ${tmux.version}${tmux.installed ? ' (just installed)' : ''}`);
|
|
70
|
+
else console.log(` ⚠ ${tmux.error}\n Shell mode will be used; Termdock retries on the next start.`);
|
|
158
71
|
|
|
159
|
-
//
|
|
160
|
-
// 只有 node-pty 和 tmux 都就绪才写 marker;否则 CLI 启动时 bootCheck 会补做
|
|
72
|
+
// Diagnostic marker only: CLI revalidates dependencies even after installation.
|
|
161
73
|
const markerDir = path.join(os.homedir(), '.termdock');
|
|
162
74
|
const markerFile = path.join(markerDir, '.boot-check-ok');
|
|
163
|
-
if (
|
|
75
|
+
if (tmux.ok) {
|
|
164
76
|
try {
|
|
165
|
-
fs.mkdirSync(markerDir, { recursive: true });
|
|
77
|
+
fs.mkdirSync(markerDir, { recursive: true, mode: 0o700 });
|
|
166
78
|
fs.writeFileSync(markerFile, JSON.stringify({
|
|
167
79
|
checkedAt: new Date().toISOString(),
|
|
168
80
|
source: 'postinstall',
|
|
169
|
-
nodePty: { ok: true, rebuilt
|
|
170
|
-
tmux
|
|
171
|
-
|
|
81
|
+
nodePty: { ok: true, rebuilt },
|
|
82
|
+
tmux,
|
|
83
|
+
runtime: { node: process.version, abi: process.versions.modules, platform: process.platform, arch: process.arch, ptyPath: PTY_PATH },
|
|
84
|
+
}), { encoding: 'utf-8', mode: 0o600 });
|
|
172
85
|
} catch { /* non-critical */ }
|
|
173
86
|
} else {
|
|
174
87
|
console.log(' ℹ Boot check marker not written (some checks failed).');
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{aV as k,aR as $t,dp as Dn,ab as jn,ao as Tn,d1 as _n,e8 as ce,e6 as On,bK as Hr,cg as r,ei as In,ea as Pn,cl as Ln,a9 as Un,e5 as zn,cv as zt,A as Cr,D as Bt,dP as Bn,U as Fn,u as Re,R as $n,a1 as qn,n as Vn,a4 as Nr,g as Rr,aa as rt,c as Yn,J as Hn,at as Wr,cm as Wn,dO as Kn,C as Qn,aN as Xn}from"./app-DuUnqxq-.js";import{b as c,r as nt}from"./dnd-BCFAPC0L.js";import{v as Gn}from"./v4-EwEgHOG0.js";import{R as Jn}from"./RecordingSaveDialog-DUtwgIME.js";import{U as Zn,K as es}from"./unplug-DN2SNXUL.js";import{C as ts}from"./circle-DGZOpG8V.js";const rs=[["path",{d:"M10.268 21a2 2 0 0 0 3.464 0",key:"vwvbt9"}],["path",{d:"M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326",key:"11g9vi"}]],ns=k("bell",rs);const ss=[["path",{d:"M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z",key:"18u6gg"}],["circle",{cx:"12",cy:"13",r:"3",key:"1vg3eu"}]],is=k("camera",ss);const as=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M12 3v18",key:"108xh3"}]],Mr=k("columns-2",as);const os=[["circle",{cx:"9",cy:"12",r:"1",key:"1vctgf"}],["circle",{cx:"9",cy:"5",r:"1",key:"hp0tcf"}],["circle",{cx:"9",cy:"19",r:"1",key:"fkjjf6"}],["circle",{cx:"15",cy:"12",r:"1",key:"1tmaij"}],["circle",{cx:"15",cy:"5",r:"1",key:"19l28e"}],["circle",{cx:"15",cy:"19",r:"1",key:"f4zoj3"}]],cs=k("grip-vertical",os);const ls=[["path",{d:"M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8",key:"5wwlr5"}],["path",{d:"M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z",key:"r6nss1"}]],ds=k("house",ls);const us=[["path",{d:"M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z",key:"zw3jo"}],["path",{d:"M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12",key:"1wduqc"}],["path",{d:"M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17",key:"kqbvx6"}]],hs=k("layers",us);const fs=[["path",{d:"M8 3H5a2 2 0 0 0-2 2v3",key:"1dcmit"}],["path",{d:"M21 8V5a2 2 0 0 0-2-2h-3",key:"1e4gt3"}],["path",{d:"M3 16v3a2 2 0 0 0 2 2h3",key:"wsl5sc"}],["path",{d:"M16 21h3a2 2 0 0 0 2-2v-3",key:"18trek"}]],ps=k("maximize",fs);const ms=[["path",{d:"M5 12h14",key:"1ays0h"}]],xs=k("minus",ms);const ys=[["path",{d:"M8 3v3a2 2 0 0 1-2 2H3",key:"hohbtr"}],["path",{d:"M21 8h-3a2 2 0 0 1-2-2V3",key:"5jw1f3"}],["path",{d:"M3 16h3a2 2 0 0 1 2 2v3",key:"198tvr"}],["path",{d:"M16 21v-3a2 2 0 0 1 2-2h3",key:"ph8mxp"}]],gs=k("minimize",ys);const bs=[["path",{d:"M18 8V6a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h8",key:"10dyio"}],["path",{d:"M10 19v-3.96 3.15",key:"1irgej"}],["path",{d:"M7 19h5",key:"qswx4l"}],["rect",{width:"6",height:"10",x:"16",y:"12",rx:"2",key:"1egngj"}]],vs=k("monitor-smartphone",bs);const ws=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M15 3v18",key:"14nvp0"}],["path",{d:"m8 9 3 3-3 3",key:"12hl5m"}]],Ss=k("panel-right-close",ws);const Es=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M15 3v18",key:"14nvp0"}],["path",{d:"m10 15-3-3 3-3",key:"1pgupc"}]],ks=k("panel-right-open",Es);const Cs=[["path",{d:"M12 22v-5",key:"1ega77"}],["path",{d:"M15 8V2",key:"18g5xt"}],["path",{d:"M17 8a1 1 0 0 1 1 1v4a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V9a1 1 0 0 1 1-1z",key:"1xoxul"}],["path",{d:"M9 8V2",key:"14iosj"}]],Ns=k("plug",Cs);const Rs=[["path",{d:"M12 2v10",key:"mnfbl"}],["path",{d:"M18.4 6.6a9 9 0 1 1-12.77.04",key:"obofu9"}]],Ms=k("power",Rs);const As=[["path",{d:"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8",key:"1p45f6"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}]],Ds=k("rotate-cw",As);const js=[["path",{d:"M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z",key:"1ffxy3"}],["path",{d:"m21.854 2.147-10.94 10.939",key:"12cjpa"}]],Ts=k("send",js);const _s=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}]],Kr=k("square",_s);const Os=[["path",{d:"M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z",key:"uqj9uw"}],["path",{d:"M16 9a5 5 0 0 1 0 6",key:"1q6k2b"}]],Is=k("volume-1",Os);const Ps=[["path",{d:"M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z",key:"uqj9uw"}],["path",{d:"M16 9a5 5 0 0 1 0 6",key:"1q6k2b"}],["path",{d:"M19.364 18.364a9 9 0 0 0 0-12.728",key:"ijwkga"}]],Ls=k("volume-2",Ps),Ar=$t(i=>({overlay:"off",setOverlay:t=>i({overlay:t})}));function Us(i){let t=1,n="terminal";for(;;){let s=!1;for(const d of i.values())if(d.name===n){s=!0;break}if(!s)break;n=`terminal-${t}`,t++}return n}const zs=$t((i,t)=>({sessions:new Map,activeSessionId:null,nextSessionNumber:1,createSession:n=>{const s=Gn(),d=Date.now(),h=t().sessions,p=Us(h),x={id:s,cwd:n,sessionId:null,name:p,customName:!1,createdAt:d,lastActivity:d};return i(l=>{const E=new Map(l.sessions);return E.set(s,x),{sessions:E,activeSessionId:l.activeSessionId??s,nextSessionNumber:l.nextSessionNumber+1}}),s},closeSession:n=>{i(s=>{const d=new Map(s.sessions),h=s.activeSessionId===n;d.delete(n);let p=s.activeSessionId;if(h){const x=Array.from(d.keys());p=x.length>0?x[0]:null}return{sessions:d,activeSessionId:p}})},switchSession:n=>{i(s=>s.sessions.has(n)?{activeSessionId:n}:s)},updateSession:(n,s)=>{i(d=>{const h=d.sessions.get(n);if(!h)return d;const p=new Map(d.sessions);return p.set(n,{...h,...s,lastActivity:Date.now()}),{sessions:p}})},setTerminalSession:(n,s)=>{t().updateSession(n,{sessionId:s.sessionId})},getActiveSession:()=>{const n=t();if(n.activeSessionId)return n.sessions.get(n.activeSessionId)},getSessionCount:()=>t().sessions.size,clearAllSessions:()=>{i({sessions:new Map,activeSessionId:null,nextSessionNumber:1})}})),Bs=[7e5,1e6,14e5,18e5,24e5,32e5,4e6,5e6,6e6,8e6,1e7,12e6].map(i=>({id:"auto",maxSize:1600,bitRate:i,maxFps:30}));class Fs{level=6;badSince=null;goodSince=null;connectedAt=0;lastSample=-1/0;lastChange=-1/0;lastUpgrade=-1/0;upgradeAfter=0;failedProbes=0;baselineRtt=1/0;get quality(){return Bs[this.level]}connected(t){this.connectedAt=t,this.badSince=this.goodSince=null,this.lastSample=-1/0}sample(t,n,s=1600){if(n-this.lastSample>2500&&(this.badSince=this.goodSince=null),this.lastSample=n,t.rttMs!==null&&(this.baselineRtt=Math.min(this.baselineRtt,t.rttMs)),n-this.connectedAt<3e3)return null;const d=t.rttMs!==null&&t.rttMs>this.baselineRtt+150,h=t.deliveryDelayMs>250||t.decodeQueue>=4||d&&t.frames>0&&t.deliveryDelayMs>100,p=t.deliveryDelayMs>800||t.decodeQueue>=8,x=t.rttMs!==null&&t.rttMs<this.baselineRtt+100&&t.deliveryDelayMs<80&&t.decodeQueue<=1;this.badSince=h?this.badSince??n:null,this.goodSince=x?this.goodSince??n:null;const l=s<=1080?7:s<=1600?9:11;if(this.badSince!==null&&n-this.badSince>=(p?1e3:2e3)&&n-this.lastChange>=(p?2e3:3e3)&&this.level>0){this.level=Math.max(0,this.level-(p?2:1));const E=n-this.lastUpgrade<2e4;this.failedProbes=E?this.failedProbes+1:0,this.upgradeAfter=n+(E?Math.min(3e4,8e3*2**(this.failedProbes-1)):5e3),this.lastUpgrade=-1/0}else if(this.goodSince!==null&&n-this.goodSince>=3e3&&n-this.lastChange>=4e3&&n>=this.upgradeAfter&&this.level<l)this.level++,this.lastUpgrade=n;else return null;return this.lastChange=n,this.badSince=this.goodSince=null,this.quality}}const $s=0,qs=1,Vs=2,Ys=3,Hs=4,Ws=5,Ks=7,Qs=10,Xs=11,Gs=16,jt=17,Dr=0,Tt=1,Js=2,jr=3,_t=0,Tr=1,_r=1,fe=0xffffffffffffffffn,st=0xfffffffffffffffen,Me={HOME:3,APP_SWITCH:187,POWER:26,VOLUME_UP:24,VOLUME_DOWN:25};function Qr(i,t,n){i.setUint32(t,Math.max(0,Math.round(n.x))&4294967295),i.setUint32(t+4,Math.max(0,Math.round(n.y))&4294967295),i.setUint16(t+8,Math.min(65535,Math.round(n.screenWidth))),i.setUint16(t+10,Math.min(65535,Math.round(n.screenHeight)))}function Zs(i,t,n,s,d,h){const p=new Uint8Array(32),x=new DataView(p.buffer);return x.setUint8(0,Vs),x.setUint8(1,i),x.setBigUint64(2,t),Qr(x,10,n),x.setUint16(22,Math.max(0,Math.min(65535,Math.round(s*65536)))),x.setUint32(24,d>>>0),x.setUint32(28,h>>>0),p}function Ot(i,t,n=0,s=0){const d=new Uint8Array(14),h=new DataView(d.buffer);return h.setUint8(0,$s),h.setUint8(1,i),h.setUint32(2,t>>>0),h.setUint32(6,n>>>0),h.setUint32(10,s>>>0),d}function ei(i,t,n,s=0){const d=new Uint8Array(21),h=new DataView(d.buffer);h.setUint8(0,Ys),Qr(h,1,i);const p=x=>Math.max(-32768,Math.min(32767,Math.round(Math.max(-1,Math.min(1,x/16))*32768)));return h.setInt16(13,p(t)),h.setInt16(15,p(n)),h.setUint32(17,s>>>0),d}function ti(i){const t=new TextEncoder().encode(i);if(!t.length)return null;const n=t.subarray(0,300),s=new Uint8Array(5+n.length),d=new DataView(s.buffer);return d.setUint8(0,qs),d.setUint32(1,n.length),s.set(n,5),s}function ri(i){const t=new TextEncoder().encode(i);if(!t.length||t.length>255)return null;const n=new Uint8Array(2+t.length);return n[0]=Gs,n[1]=t.length,n.set(t,2),n}function Ae(i){return new Uint8Array([i])}function Or(i){return new Uint8Array([Hs,i])}function ni(i){return new Uint8Array([Qs,i?1:0])}function si(i){let t="";for(let n=0;n<i.length;n+=32768)t+=String.fromCharCode(...i.subarray(n,n+32768));return btoa(t)}function ii(i){const t=atob(i),n=new Uint8Array(t.length);for(let s=0;s<t.length;s++)n[s]=t.charCodeAt(s);return n}function It(i){return i.toString(16).padStart(2,"0")}function Xr(i,t,n){for(let s=0;s+4<i.length;s++){const d=i[s]===0&&i[s+1]===0&&i[s+2]===1,p=i[s]===0&&i[s+1]===0&&i[s+2]===0&&i[s+3]===1?s+4:d?s+3:-1;if(p<0||p>=i.length)continue;if((n?i[p]>>1&63:i[p]&31)!==t){s=p-1;continue}let l=p+1;for(;l+2<i.length&&!(i[l]===0&&i[l+1]===0&&(i[l+2]===1||i[l+2]===0&&i[l+3]===1));)l++;return i.subarray(p,Math.min(i.length,l))}return null}function ai(i){const t=i?Xr(i,7,!1):null;return t&&t.length>=4?`avc1.${It(t[1])}${It(t[2])}${It(t[3])}`:"avc1.42e01e"}function oi(i){const t=i?Xr(i,32,!0):null;if(t&&t.length>=13){const n=t[1]>>6&3,s=t[1]&31,d=t[12];return`hev1.${n}.${s}.L${d}.B0`}return"hev1.1.6.L120.B0"}class ci{constructor(t,n){this.canvas=t,this.callbacks=n}canvas;callbacks;readOnly=!1;setReadOnly(t){this.readOnly=t}liveBitrate=!1;bitrateFailureDetail;get lastBitrateFailure(){return this.bitrateFailureDetail}bitrateRequestId=0;bitratePending=null;get supportsLiveBitrate(){return this.liveBitrate}get canSetBitrate(){return this.liveBitrate&&!this.bitratePending&&this.socket?.readyState===1}setBitrate(t){return!this.canSetBitrate||!Number.isInteger(t)||t<3e5||t>3e7?Promise.resolve(!1):new Promise(n=>{const s=++this.bitrateRequestId,d=setTimeout(()=>this.finishBitrate(!1,`BITRATE_CLIENT_TIMEOUT: requested=${t} bps; no server confirmation within 4000ms`),4e3);this.bitratePending={id:s,value:t,resolve:n,timer:d},this.send({type:"bitrate",requestId:s,bitRate:t})})}finishBitrate(t,n){const s=this.bitratePending;s&&(this.bitratePending=null,clearTimeout(s.timer),t||(this.liveBitrate=!1,this.bitrateFailureDetail=n??this.bitrateFailureDetail??"BITRATE_REASON_UNAVAILABLE: server rejected adjustment without a diagnostic",this.closedByUser||this.callbacks.onBitrateSupport?.(!1,this.bitrateFailureDetail)),s.resolve(t))}socket=null;decoder=null;configured=!1;configData=null;header=null;closedByUser=!1;failureReason=null;lastMessageAt=0;lastFrameAt=0;lastResetAt=0;heartbeat=null;statsTimer=null;stallTimer=null;pendingConfig=null;needsKeyframe=!1;frameCount=0;receivedFrames=0;decodedFrames=0;controlsSent=0;lastSeq=0;lastType="";bytesSinceSample=0;warnedUnsupported=!1;lastSampleAt=0;serial="";autoQuality=!1;pingAt=null;rttMs=null;rttAt=0;minimumFrameOffset=1/0;deliveryDelayMs=0;peakDecodeQueue=0;sampleFrames=0;get currentHeader(){return this.header}connect(t,n){this.liveBitrate=!1,this.bitrateFailureDetail=void 0,this.serial=t,this.autoQuality=n?.id==="auto",this.closedByUser=!1,this.failureReason=null,this.callbacks.onState("connecting");let s;try{s=Dn(jn(t,n))}catch(d){this.reportError(d instanceof Error?d.message:"ANDROID_STREAM_FAILED");return}this.socket=s,s.onopen=()=>{this.lastMessageAt=Date.now()},s.onmessage=d=>{this.closedByUser||this.handleMessage(d.data)},s.onerror=()=>{!this.closedByUser&&!this.failureReason&&this.reportError("SCRCPY_CONNECTION_LOST")},s.onclose=d=>{if(this.finishBitrate(!1,"BITRATE_CONNECTION_CLOSED: preview connection closed"),this.liveBitrate=!1,this.teardownTimers(),this.closedByUser)this.callbacks.onState("idle");else{const h=`WebSocket close code=${d.code}${d.reason?`: ${d.reason}`:""}`;this.reportError(`${this.failureReason||"SCRCPY_CONNECTION_CLOSED"}
|
|
2
|
-
${h}`)}},this.startTimers()}reportError(t){this.failureReason=t,this.callbacks.onState("error",t)}disconnect(){this.closedByUser=!0,this.finishBitrate(!1),this.liveBitrate=!1,this.teardownTimers();try{this.decoder?.close()}catch{}this.decoder=null,this.configured=!1;try{this.socket?.close()}catch{}this.socket=null,this.callbacks.onState("idle")}teardownTimers(){this.heartbeat&&clearInterval(this.heartbeat),this.statsTimer&&clearInterval(this.statsTimer),this.stallTimer&&clearInterval(this.stallTimer),this.heartbeat=null,this.statsTimer=null,this.stallTimer=null}startTimers(){this.lastSampleAt=Date.now(),this.heartbeat=setInterval(()=>{if(!(!this.socket||this.socket.readyState!==1)){if(Date.now()-this.lastMessageAt>45e3){try{this.socket.close()}catch{}return}this.pingAt===null&&(this.pingAt=performance.now(),this.send({type:"ping"}))}},this.autoQuality?2e3:15e3),this.stallTimer=setInterval(()=>{if(!this.header||this.closedByUser)return;const t=Date.now();t-this.lastFrameAt>8e3&&t-this.lastResetAt>8e3&&(this.lastResetAt=t,console.warn("[android] no frames for 8s; requesting keyframe reset"),this.sendControl(Ae(jt)))},2e3),this.statsTimer=setInterval(()=>{const t=Date.now(),n=(t-this.lastSampleAt)/1e3;n<=0||(this.callbacks.onStats({fps:Math.round(this.frameCount/n*10)/10,kbps:Math.round(this.bytesSinceSample*8/n/1e3),width:this.header?.width??0,height:this.header?.height??0,received:this.receivedFrames,decoded:this.decodedFrames,controls:this.controlsSent,last:this.lastType,adaptation:this.autoQuality?{rttMs:this.pingAt!==null&&performance.now()-this.pingAt>2e3?performance.now()-this.pingAt:performance.now()-this.rttAt<6e3?this.rttMs:null,deliveryDelayMs:this.sampleFrames?this.deliveryDelayMs:0,decodeQueue:Math.max(this.peakDecodeQueue,this.decoder?.decodeQueueSize??0),frames:this.sampleFrames}:void 0}),this.sampleFrames=0,this.peakDecodeQueue=0,this.frameCount=0,this.bytesSinceSample=0,this.lastSampleAt=t)},1e3)}send(t){if(!(!this.socket||this.socket.readyState!==1))try{this.socket.send(JSON.stringify(t))}catch{}}sendControl(t){!t||this.readOnly&&!(t.length===1&&t[0]===jt)||(this.controlsSent++,this.send({type:"control",data:si(t)}))}ack(){this.send({type:"ack",seq:this.lastSeq})}handleMessage(t){if(typeof t!="string")return;this.lastMessageAt=Date.now();let n;try{n=JSON.parse(t)}catch{return}this.lastType=`${n.type??"?"}${n.config?":cfg":""}${n.key?":key":""}`;try{this.dispatchMessage(n)}catch(s){console.warn("[android] message handling failed",s),this.callbacks.onWarning(`处理消息失败:${s instanceof Error?s.message:String(s)}`)}}dispatchMessage(t){switch(t.type){case"bitrate-support":this.liveBitrate=t.supported===!0,this.bitrateFailureDetail=this.liveBitrate?void 0:typeof t.detail=="string"?t.detail.slice(0,4096):"BITRATE_REASON_UNAVAILABLE: server did not provide diagnostics",this.liveBitrate||this.finishBitrate(!1,this.bitrateFailureDetail),this.callbacks.onBitrateSupport?.(this.liveBitrate,this.bitrateFailureDetail);break;case"bitrate-result":t.requestId===this.bitratePending?.id&&this.finishBitrate(t.applied===!0&&t.bitRate===this.bitratePending?.value,typeof t.detail=="string"?t.detail.slice(0,4096):void 0);break;case"header":this.header={deviceName:t.deviceName??this.serial,codec:t.codec??"h264",width:t.width??0,height:t.height??0},this.lastFrameAt=Date.now(),this.callbacks.onHeader(this.header),this.failureReason=null,this.callbacks.onState("streaming");break;case"frame":this.handleFrame(t);break;case"error":this.reportError(t.message||"SCRCPY_ERROR");break;case"closed":this.reportError(this.failureReason||"SCRCPY_SESSION_CLOSED");break;case"pong":this.pingAt!==null&&(this.rttMs=performance.now()-this.pingAt,this.rttAt=performance.now(),this.pingAt=null);break}}handleFrame(t){if(typeof t.data!="string")return;typeof t.seq=="number"&&(this.lastSeq=t.seq);const n=ii(t.data);if(this.bytesSinceSample+=t.data.length,this.receivedFrames++,this.lastFrameAt=Date.now(),this.decoder?.state==="closed"&&(this.decoder=null,this.configured=!1),t.config){this.configData=n,this.pendingConfig=n,this.configureDecoder(),this.ack();return}this.sampleFrames++;const s=Number(t.pts);if(t.pts!==void 0&&Number.isFinite(s)){const p=performance.now()-s/1e3;this.minimumFrameOffset=Math.min(this.minimumFrameOffset,p),this.deliveryDelayMs=Math.max(0,p-this.minimumFrameOffset)}this.configured||this.configureDecoder();const d=t.key===!0;if(this.needsKeyframe&&!d){this.ack();return}let h=n;this.pendingConfig&&(h=new Uint8Array(this.pendingConfig.length+n.length),h.set(this.pendingConfig,0),h.set(n,this.pendingConfig.length),this.pendingConfig=null),d&&(this.needsKeyframe=!1),this.decode(h,d,t.pts),this.ack()}configureDecoder(){const t=this.header?.codec??"h264";if(!this.decoder||this.decoder.state==="closed"){if(typeof VideoDecoder>"u"){this.warnedUnsupported||(this.warnedUnsupported=!0,this.callbacks.onWarning("当前浏览器不支持 WebCodecs(VideoDecoder),无法解码投屏画面。")),this.reportError("VIDEO_DECODER_UNSUPPORTED");return}try{this.decoder=new VideoDecoder({output:h=>this.onDecodedFrame(h),error:h=>{this.closedByUser||(this.configured=!1,this.decoderRecovering=!0,console.warn("[android] video decoder error",h),this.reportError(`VIDEO_DECODER_ERROR: ${h.message}`),this.sendControl(Ae(jt)))}})}catch(h){console.warn("[android] VideoDecoder unavailable",h),this.callbacks.onWarning(`创建 VideoDecoder 失败:${h instanceof Error?h.message:String(h)}`),this.reportError("VIDEO_DECODER_UNSUPPORTED");return}}const n={codec:"avc1.42e01e",optimizeForLatency:!0};let s;t==="h264"?(s=[ai(this.configData),"avc1.42e01e","avc1.4d401e","avc1.64001f"].filter((p,x,l)=>l.indexOf(p)===x),n.avc={format:"annexb"}):t==="h265"?(s=[oi(this.configData),"hev1.1.6.L120.B0","hvc1.1.6.L120.B0"],n.hevc={format:"annexb"}):s=["av01.0.04M.08"];const d=[];for(const h of s)try{this.decoder.configure({...n,codec:h}),this.configured=!0,this.needsKeyframe=!0,h!==s[0]&&console.warn("[android] decoder configured with fallback codec",h);return}catch(p){d.push(`${h}: ${p instanceof Error?p.message:String(p)}`),console.warn("[android] decoder configure failed",h,p)}this.callbacks.onWarning(`解码器配置失败(${d.join(";")})`),this.reportError("VIDEO_DECODER_UNSUPPORTED")}decode(t,n,s){if(!(!this.decoder||this.decoder.state!=="configured"))try{this.decoder.decode(new EncodedVideoChunk({type:n?"key":"delta",timestamp:s?Number(s):this.lastTimestamp+1,data:t})),this.peakDecodeQueue=Math.max(this.peakDecodeQueue,this.decoder.decodeQueueSize),this.lastTimestamp=s?Number(s):this.lastTimestamp+1}catch(d){this.decodeFailureCount++<3&&(console.warn("[android] decode threw",d),this.callbacks.onWarning(`送入解码器失败:${d instanceof Error?d.message:String(d)}`))}}decoderRecovering=!1;decodeFailureCount=0;lastTimestamp=0;onDecodedFrame(t){if(this.closedByUser){t.close();return}this.frameCount++,this.decodedFrames++;const n=t.displayWidth||t.codedWidth,s=t.displayHeight||t.codedHeight,d=this.canvas;(d.width!==n||d.height!==s)&&(d.width=n,d.height=s,this.header&&(this.header={...this.header,width:n,height:s},this.callbacks.onHeader(this.header)));const h=d.getContext("2d");h&&h.drawImage(t,0,0,d.width,d.height),t.close(),this.decoderRecovering&&(this.decoderRecovering=!1,this.failureReason=null,this.callbacks.onState("streaming"))}pointerPoint(t,n){return{x:t,y:n,screenWidth:this.header?.width??0,screenHeight:this.header?.height??0}}touch(t,n,s,d){const h=t===Tt||t===jr,p=h?0:1,x=d===fe&&!h?_r:0,l=(t===Dr||t===Tt)&&d===fe?_r:0;this.sendControl(Zs(t,d,this.pointerPoint(n,s),p,l,x))}pointerDown(t,n,s){this.touch(Dr,t,n,s==="mouse"?fe:st)}pointerMove(t,n,s){this.touch(Js,t,n,s==="mouse"?fe:st)}pointerUp(t,n,s){this.touch(Tt,t,n,s==="mouse"?fe:st)}pointerCancel(t,n,s){this.touch(jr,t,n,s==="mouse"?fe:st)}scroll(t,n,s,d){this.sendControl(ei(this.pointerPoint(t,n),s,d))}key(t,n=_t){this.sendControl(Ot(n,t))}tapKey(t){this.sendControl(Ot(_t,t)),this.sendControl(Ot(Tr,t))}back(){this.sendControl(Or(_t)),this.sendControl(Or(Tr))}home(){this.tapKey(Me.HOME)}recents(){this.tapKey(Me.APP_SWITCH)}power(){this.tapKey(Me.POWER)}volumeUp(){this.tapKey(Me.VOLUME_UP)}volumeDown(){this.tapKey(Me.VOLUME_DOWN)}rotate(){this.sendControl(Ae(Xs))}expandNotifications(){this.sendControl(Ae(Ws))}collapsePanels(){this.sendControl(Ae(Ks))}setDisplayPower(t){this.sendControl(ni(t))}sendText(t){this.sendControl(ti(t))}startApp(t){this.sendControl(ri(t))}}function li(){try{return crypto.randomUUID().slice(0,8)}catch{return Math.random().toString(36).slice(2,10)}}function di(){return`termdock-mirror-shot-${new Date().toISOString().replace(/[-:T]/g,"").slice(0,14)}-${li()}.png`}function Ir(i){const t=Math.max(0,Math.floor(i/1e3)),n=Math.floor(t/60),s=t%60;return`${String(n).padStart(2,"0")}:${String(s).padStart(2,"0")}`}async function ui(i,t=di()){const n=i.width,s=i.height;if(!n||!s)throw new Error("投屏画面尚未就绪");const d=document.createElement("canvas");d.width=n,d.height=s;const h=d.getContext("2d");if(!h)throw new Error("无法读取投屏画面");h.drawImage(i,0,0);const p=await new Promise(x=>d.toBlob(x,"image/png"));if(!p||p.size===0)throw new Error("截图失败,请重试");return new File([p],t,{type:"image/png"})}function Gr(i,t,n){const s=n.contentWidth*(t-1)/2,d=n.contentHeight*(t-1)/2;return{x:Math.max(-s,Math.min(s,i.x)),y:Math.max(-d,Math.min(d,i.y))}}function Pr(i,t,n,s,d){const h=Math.max(1,Math.min(8,i.zoom*d)),p=h/i.zoom;return{zoom:h,pan:Gr({x:s.x-t.cx-(n.x-t.cx-i.pan.x)*p,y:s.y-t.cy-(n.y-t.cy-i.pan.y)*p},h,t)}}async function Jr(i,t,n){if(!t)throw new Error("没有可接收内容的终端");if(!await _n(i,t,()=>!0,n))throw new Error("目标终端不可用,内容尚未插入,请连接终端后重试")}function Lr(i,t,n){return Jr(Tn(i,null),t,n)}const Ft=new Map;function hi(i,t){Ft.set(i,t)}function fi(i,t){const n=Ft.get(i.id)??t;n?.(i),n&&Ft.delete(i.id)}const Pt=$t(i=>({pending:[],enqueue:(t,n,s="/",d)=>i(h=>h.pending.some(p=>p.file.id===t.id)?h:{pending:[...h.pending,{file:t,sessionId:n,initialPath:s,insert:d}]}),remove:t=>i(n=>({pending:n.pending.filter(s=>s.file.id!==t)}))})),pe="android-mirror",De=pe,Zr="termdock:android:quality:v1",Lt=176,pi=204,H=1,lt=8,Ur=[1,1.25,1.5,2,2.5,3,4,6,8],mi=i=>Math.max(H,Math.min(lt,i));function xi(i){return`${Number.isInteger(i)?i:i.toFixed(1)}×`}function it(i){const t=i.parentElement;if(!t)return null;const n=t.getBoundingClientRect(),s=getComputedStyle(t),d=parseFloat(s.paddingLeft)||0,h=parseFloat(s.paddingTop)||0,p=t.clientWidth-d-(parseFloat(s.paddingRight)||0),x=t.clientHeight-h-(parseFloat(s.paddingBottom)||0);return{cx:n.left+t.clientLeft+d+p/2,cy:n.top+t.clientTop+h+x/2,width:p,height:x,contentWidth:i.offsetWidth,contentHeight:i.offsetHeight}}function yi(i,t){try{i.setPointerCapture?.(t)}catch{}}function zr(i,t){try{i.releasePointerCapture?.(t)}catch{}}const Br=i=>typeof requestAnimationFrame=="function"?requestAnimationFrame(i):window.setTimeout(i,16),at=i=>{typeof cancelAnimationFrame=="function"?cancelAnimationFrame(i):window.clearTimeout(i)},Ut={auto:"android.qualityAuto",low:"android.qualityLow",medium:"android.qualityMedium",high:"android.qualityHigh",custom:"android.qualityCustom"},gi=()=>{try{const i=localStorage.getItem(Zr);return i?zt(JSON.parse(i)):Bt}catch{return Bt}},je=i=>{try{localStorage.setItem(Zr,JSON.stringify(i))}catch{}};function en({sessionId:i,dockOnly:t=!1,onInsertPrompt:n,onInsertFile:s,onRecordingComplete:d,onCloseTab:h}){const p=In(),x=c.useRef(p);x.current=p;const{t:l}=Pn(),E=Ar(e=>e.overlay),w=Ar(e=>e.setOverlay),b=c.useRef(null),g=c.useRef(null),me=c.useRef(null),W=c.useMemo(gi,[]),B=c.useRef(W),te=c.useRef(null),Te=c.useRef(null),[qt,Vt]=c.useState(4e6),K=c.useRef(null),N=c.useRef(new Map),F=c.useRef(null),_e=c.useRef(!1),[dt,Oe]=c.useState(H),T=c.useRef(dt),$=c.useRef({x:0,y:0}),Yt=c.useRef(null),q=c.useRef(0),Ie=c.useRef(0),Pe=c.useRef(null),le=c.useRef(0),[Le,tn]=c.useState(null),[xe,ut]=c.useState(null),[rn,Ht]=c.useState(!0),[y,Ue]=c.useState(""),[Q,de]=c.useState(W.id),[V,ht]=c.useState([]),[I,re]=c.useState(null),[ze,Wt]=c.useState(""),[ft,pt]=c.useState(!0),[C,ne]=c.useState({maxSize:W.maxSize,bitRate:W.bitRate,maxFps:W.maxFps}),[P,Kt]=c.useState("idle"),[mt,xt]=c.useState(null),[ye,Be]=c.useState(null),[yt,gt]=c.useState(null),[se,nn]=c.useState({fps:0,kbps:0,width:0,height:0,received:0,decoded:0,controls:0,last:""}),[X,Fe]=c.useState(null),[Qt,Xt]=c.useState(null),[bt,vt]=c.useState(null),[sn,Gt]=c.useState([]),[ge,be]=c.useState(null),[$e,ve]=c.useState([]),[an,we]=c.useState(!1),Se=c.useRef(null),on=c.useRef(0),Ee=c.useRef([]),[qe,Jt]=c.useState(!1),[Zt,er]=c.useState(""),[tr,rr]=c.useState(!1),[wt,cn]=c.useState(!1),[St,nr]=c.useState(""),[Et,sr]=c.useState(null),[ir,G]=c.useState(null),[L,Ve]=c.useState(!1),[ln,ar]=c.useState(0),J=c.useRef(null),[or,Ye]=c.useState(!1),Z=c.useRef(!1),cr=c.useRef(new Set),kt=c.useRef(null),ue=c.useRef(null),Ct=c.useRef(!1),[ke,lr]=c.useState(!1),Ce=c.useRef(d);Ce.current=d;const[he,ee]=c.useState(!1),[Nt,dn]=c.useState(null),Rt=c.useRef(null),dr=c.useRef(null),un=zs(e=>e.activeSessionId??e.sessions.keys().next().value??null),Mt=i??un,U=ce(e=>!!e.docks[De]),He=ce(e=>e.hosts[De]),At=ce(e=>e.setDock),We=c.useCallback(async()=>{Ht(!0);try{const e=await Ln();tn(e),ut(null)}catch(e){ut(e instanceof Error?e.message:"ADB_UNAVAILABLE")}finally{Ht(!1)}},[]);c.useEffect(()=>{We()},[We]);const ie=c.useMemo(()=>Un(Le?.devices??[],y),[Le?.devices,y]),ae=ie.find(e=>e.serial===y)??null,Ke=!!(xe&&/ADB_NOT_FOUND|ADB_UNAVAILABLE/i.test(xe)),ur=!!(Le?.adbAvailable&&!Le.scrcpyVersion),A=c.useCallback(()=>{const e=K.current,a=[...N.current.keys()];K.current=null,N.current.clear(),F.current=null,_e.current=!1,Se.current=null,at(q.current),q.current=0,e&&g.current?.pointerCancel(e.x,e.y,e.type);const o=b.current;if(o)for(const u of a)zr(o,u);be(null),we(!1),ve([]),Oe(T.current)},[]);c.useEffect(()=>{const e=u=>{N.current.has(u.pointerId)&&(u.type==="pointercancel"||u.target!==b.current)&&A()},a=()=>A(),o=()=>{document.hidden&&A()};return window.addEventListener("pointerup",e,!0),window.addEventListener("pointercancel",e,!0),window.addEventListener("blur",a),document.addEventListener("visibilitychange",o),()=>{window.removeEventListener("pointerup",e,!0),window.removeEventListener("pointercancel",e,!0),window.removeEventListener("blur",a),document.removeEventListener("visibilitychange",o),A()}},[A]);const hn=c.useCallback(()=>{A(),g.current?.disconnect(),g.current=null,Kt("idle"),xt(null),Be(null),gt(null)},[A]),_=c.useCallback((e,a=!1)=>{const o=b.current;if(!o||!e)return;A(),g.current?.disconnect(),xt(null),me.current!==e&&(Be(null),le.current=0),!a&&me.current!==e&>(null),me.current=e,Xt(null),Fe(null);const u=new ci(o,{onBitrateSupport:(m,v)=>{g.current!==u||B.current.id!=="auto"||Fe(m?null:v??"BITRATE_REASON_UNAVAILABLE")},onState:(m,v)=>{g.current===u&&(Kt(m),xt(v??null),m==="error"?Be(v||"SCRCPY_ERROR"):m==="streaming"&&Be(null))},onHeader:m=>{g.current===u&>(m)},onStats:m=>{g.current===u&&nn(m)},onWarning:m=>{g.current===u&&Xt(m)}});u.setReadOnly(!!x.current&&!x.current.android?.some(m=>m.serial===e&&m.access==="control")),g.current=u;let f=B.current;f.id==="auto"?(te.current?.serial!==e&&(te.current={serial:e,policy:new Fs}),te.current.policy.connected(performance.now()),f=te.current.policy.quality,Vt(f.bitRate)):te.current=null,Te.current=f,u.connect(e,f)},[A]);c.useEffect(()=>{if(Q!=="auto"||B.current.id!=="auto"||P!=="streaming"||!se.adaptation||document.hidden)return;const e=te.current,a=g.current;if(!e||e.serial!==y||!a?.canSetBitrate)return;const o=b.current,u=o?Math.max(o.clientWidth,o.clientHeight)*(window.devicePixelRatio||1)*T.current:1600,f=e.policy.sample(se.adaptation,performance.now(),u||1600);f&&a.setBitrate(f.bitRate).then(m=>{m&&g.current===a&&(Te.current=f,Vt(f.bitRate))})},[se,Q,P,y,_]);const D=c.useCallback(e=>{if(x.current)return;const a={...e.quality?{quality:{id:e.quality.id,maxSize:e.quality.maxSize,bitRate:e.quality.bitRate,maxFps:e.quality.maxFps}}:{},...e.activePresetId!==void 0?{activePresetId:e.activePresetId}:{},...e.presets!==void 0?{presets:e.presets}:{},...e.docked!==void 0?{docked:e.docked}:{},...e.deviceSerial!==void 0?{deviceSerial:e.deviceSerial}:{}};zn({androidPanel:a}).catch(()=>{})},[]);c.useEffect(()=>{let e=!1;if(!x.current)return Hr().then(a=>{if(e)return;const o=a.androidPanel;if(o?.quality){const u=zt(o.quality);B.current=u,de(u.id),ne({maxSize:u.maxSize,bitRate:u.bitRate,maxFps:u.maxFps}),je(u)}ht(o?.presets??[]),re(o?.activePresetId??null),o?.deviceSerial&&(Pe.current=o.deviceSerial,Ue(o.deviceSerial))}).catch(()=>{}),()=>{e=!0}},[]);const fn=c.useCallback(e=>{const a=++on.current;Gt(u=>[...u,{id:a,left:e.left,top:e.top}]);const o=window.setTimeout(()=>{Gt(u=>u.filter(f=>f.id!==a)),Ee.current=Ee.current.filter(u=>u!==o)},300);Ee.current.push(o)},[]),Qe=c.useCallback((e,a)=>{const o=g.current,u=Te.current;o?.supportsLiveBitrate&&me.current===e&&u&&u.maxSize===a.maxSize&&u.maxFps===a.maxFps?o.setBitrate(a.bitRate).then(f=>{g.current===o&&(f?(Te.current=a,Fe(null)):Fe(o.lastBitrateFailure??"BITRATE_REASON_UNAVAILABLE"))}):_(e)},[_,l]),pn=c.useCallback(e=>{if(te.current=null,e.startsWith("user:")){const o=V.find(f=>f.id===e.slice(5));if(!o)return;const u={id:"custom",maxSize:o.maxSize,bitRate:o.bitRate,maxFps:o.maxFps};B.current=u,de("custom"),re(o.id),ne({maxSize:o.maxSize,bitRate:o.bitRate,maxFps:o.maxFps}),pt(!0),je(u),D({quality:u,activePresetId:o.id}),y&&_(y);return}if(e==="custom"){const o=B.current;de("custom"),re(null),ne({maxSize:o.maxSize,bitRate:o.bitRate,maxFps:o.maxFps}),pt(!0);return}const a=e==="auto"?zt({id:"auto"}):Cr.find(o=>o.id===e)??Bt;B.current=a,de(a.id),re(null),je(a),D({quality:a,activePresetId:null}),y&&_(y)},[_,y,V,D]),mn=c.useCallback(()=>{const e={id:"custom",maxSize:C.maxSize,bitRate:C.bitRate,maxFps:C.maxFps};B.current=e,je(e),D({quality:e,activePresetId:null}),de("custom"),re(null),y&&Qe(y,e)},[Qe,y,C,D]),hr=c.useCallback(()=>{const e=ze.trim();if(!e)return;const a=`p${Date.now().toString(36)}${Math.random().toString(36).slice(2,6)}`,o={id:a,name:e,maxSize:C.maxSize,bitRate:C.bitRate,maxFps:C.maxFps},u=[...V.filter(m=>m.name!==e),o].slice(-12),f={id:"custom",maxSize:C.maxSize,bitRate:C.bitRate,maxFps:C.maxFps};ht(u),Wt(""),re(a),de("custom"),B.current=f,je(f),D({quality:f,activePresetId:a,presets:u}),y&&Qe(y,f)},[ze,C,V,y,Qe,D]),xn=c.useCallback(()=>{if(!I)return;const e=V.filter(a=>a.id!==I);ht(e),re(null),D({activePresetId:null,presets:e})},[I,V,D]);c.useEffect(()=>()=>{g.current?.disconnect(),g.current=null;for(const e of Ee.current)window.clearTimeout(e);Ee.current=[]},[]),c.useEffect(()=>{if(E==="off")return;const e=a=>{a.key==="Escape"&&w("off")};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[E,w]),c.useEffect(()=>{const e=ie.filter(o=>o.state==="device");if(y||e.length!==1)return;const a=e[0].serial;Pe.current!==a&&(Pe.current=a,Ue(a))},[ie,y]),c.useEffect(()=>{y&&_(y)},[y,_]),c.useEffect(()=>{if(P==="streaming"&&(le.current=0),P!=="error"||!y||!wi(mt??"")){vt(null);return}const e=Math.min(8e3,700*2**le.current),a=le.current+1;vt({attempt:a,delayMs:e});const o=window.setTimeout(()=>{le.current=a,vt(null),_(y)},e);return()=>window.clearTimeout(o)},[P,mt,y,_]);const fr=c.useCallback((e,a,o)=>{const u=b.current,f=o??(u?it(u):null);return!u||!f?{x:0,y:0}:Gr(e,a,f)},[]),O=c.useCallback(()=>{const e=b.current;if(!e)return;const{x:a,y:o}=$.current,u=T.current,f=u===H&&a===0&&o===0?"":`translate3d(${a}px, ${o}px, 0) scale(${u})`;e.style.transform!==f&&(e.style.transform=f);const m=Yt.current;m&&(m.textContent=u>H?xi(u):"")},[]),Xe=c.useCallback((e,a,o=!0)=>{const u=b.current,f=T.current,m=mi(e);if(!u||m===f)return;const v=it(u);if(!v)return;const M=a??{x:v.cx,y:v.cy},j=Pr({zoom:f,pan:$.current},v,M,M,m/f);T.current=j.zoom,$.current=j.pan,o&&O()},[O]),Dt=c.useCallback(()=>{const e=T.current;Oe(a=>a<=H+.01==e<=H+.01&&a>=lt-.01==e>=lt-.01?a:e)},[]);c.useEffect(()=>()=>{at(q.current),at(Ie.current)},[]);const pr=()=>{let e=0,a=0;for(const u of N.current.values())e+=u.x,a+=u.y;const o=N.current.size;return o?{x:e/o,y:a/o}:null},mr=()=>{const[e,a]=Array.from(N.current.values());return e&&a?Math.hypot(e.x-a.x,e.y-a.y):0},xr=()=>{const e=pr(),a=b.current?it(b.current):null;!e||!a||(F.current={startCentroid:e,startDistance:mr(),box:a})},Ge=c.useCallback(()=>{const e=F.current,a=pr();if(!e||!a)return;const o=mr(),u=e.startDistance>0&&o>0?o/e.startDistance:1,f=Pr({zoom:T.current,pan:$.current},e.box,e.startCentroid,a,u);T.current=f.zoom,$.current=f.pan,e.startCentroid=a,e.startDistance=o},[]),yn=c.useCallback(()=>{q.current||(q.current=Br(()=>{q.current=0,Ge(),O()}))},[Ge,O]),Je=c.useCallback(()=>{q.current&&(at(q.current),q.current=0,Ge(),O())},[Ge,O]);c.useEffect(()=>{const e=b.current;if(!e)return;const a=e.parentElement;if(!a)return;const o=f=>{if(f.ctrlKey||f.metaKey){if(f.preventDefault(),!f.deltaY||F.current)return;const M=f.deltaMode===1?16:f.deltaMode===2?e.parentElement?.clientHeight||600:1,j=Math.max(-600,Math.min(600,f.deltaY*M));Xe(T.current*Math.exp(-j*.002),{x:f.clientX,y:f.clientY},!1),Ie.current||(Ie.current=Br(()=>{Ie.current=0,O(),Dt()}));return}const m=g.current;if(!m||f.target!==e)return;f.preventDefault();const v=ct(e,f.clientX,f.clientY);m.scroll(v.x,v.y,f.deltaX,f.deltaY)},u=f=>f.preventDefault();return a.addEventListener("wheel",o,{passive:!1}),a.addEventListener("gesturestart",u,{passive:!1}),a.addEventListener("gesturechange",u,{passive:!1}),()=>{a.removeEventListener("wheel",o),a.removeEventListener("gesturestart",u),a.removeEventListener("gesturechange",u)}},[Xe,O,Dt]),c.useEffect(()=>{const e=b.current,a=e?.parentElement;if(!e||!a||typeof ResizeObserver>"u")return;const o=new ResizeObserver(()=>{F.current&&(F.current.box=it(e));const u=fr($.current,T.current);u.x===$.current.x&&u.y===$.current.y||($.current=u,O())});return o.observe(e),o.observe(a),()=>o.disconnect()},[fr,O]),c.useLayoutEffect(()=>{O()});const gn=e=>{const a=g.current,o=b.current;if(!a||!o)return;if(e.pointerType==="mouse"&&e.button!==0){e.preventDefault(),e.button===2?a.back():e.button===1&&a.home();return}e.preventDefault(),o.closest(".android-mirror-panel")?.focus({preventScroll:!0}),O(),Dt(),Je(),yi(o,e.pointerId),N.current.set(e.pointerId,{x:e.clientX,y:e.clientY});const u=e.pointerType==="mouse"&&e.altKey;if(N.current.size>=2||u){const v=K.current;v&&(a.pointerCancel(v.x,v.y,v.type),K.current=null,Se.current=null,be(null),we(!1),ve([])),_e.current=!0,xr();return}if(_e.current)return;const f=ct(o,e.clientX,e.clientY);K.current={id:e.pointerId,type:e.pointerType,x:f.x,y:f.y},a.pointerDown(f.x,f.y,e.pointerType);const m=Vr(o,e.clientX,e.clientY);m&&(Se.current={left:m.left,top:m.top},ve([]),we(!1),be(m))},bn=e=>{const a=g.current,o=b.current;if(!o||!N.current.has(e.pointerId))return;if(e.pointerType==="mouse"){const M=o.getBoundingClientRect(),j=o.parentElement?.getBoundingClientRect()??M;if(!(e.buttons&1)||e.clientX<Math.max(M.left,j.left)||e.clientX>=Math.min(M.right,j.right)||e.clientY<Math.max(M.top,j.top)||e.clientY>=Math.min(M.bottom,j.bottom)){A();return}}if(e.preventDefault(),N.current.set(e.pointerId,{x:e.clientX,y:e.clientY}),F.current){yn();return}const u=K.current;if(!a||!u||u.id!==e.pointerId)return;const f=ct(o,e.clientX,e.clientY);u.x=f.x,u.y=f.y,a.pointerMove(f.x,f.y,u.type);const m=Vr(o,e.clientX,e.clientY),v=Se.current;!m||!v||(be(m),Math.hypot(m.left-v.left,m.top-v.top)>=6&&(we(!0),ve(M=>{const j=M[M.length-1];if(j&&Math.hypot(m.left-j.x,m.top-j.y)<4)return M;const tt=[...M,{x:m.left,y:m.top}];return tt.length>12?tt.slice(tt.length-12):tt})))},vn=e=>{const a=g.current,o=b.current;if(!o||!N.current.has(e.pointerId))return;if(Je(),N.current.delete(e.pointerId),zr(o,e.pointerId),N.current.size===0&&(_e.current=!1),F.current){N.current.size===0?(F.current=null,Oe(T.current)):xr();return}const u=K.current;if(!u||u.id!==e.pointerId)return;const f=ct(o,e.clientX,e.clientY);a?.pointerUp(f.x,f.y,u.type),ge&&fn(ge),be(null),we(!1),window.setTimeout(()=>ve([]),200),K.current=null,Se.current=null},wn=e=>{if(he||qe||wt)return;const a=g.current;a&&(e.key==="Backspace"?(e.preventDefault(),a.key(67)):e.key==="Escape"?(e.preventDefault(),a.back()):e.key==="Enter"&&(e.preventDefault(),a.key(66)))},yr=async()=>{const e=Zt.trim();if(e){rr(!0);try{const a=await Xn(e);er(""),Jt(!1),await We(),Ue(a.serial)}catch(a){ut(a instanceof Error?a.message:"ADB_CONNECT_FAILED")}finally{rr(!1)}}},gr=()=>{const e=g.current,a=St;!e||!a||(e.sendText(a),nr(""))},Ze=c.useCallback(e=>{sr(e),ue.current!==null&&window.clearTimeout(ue.current),ue.current=window.setTimeout(()=>{ue.current=null,sr(null)},2500)},[]),br=c.useCallback(e=>{const a=T.current,o=e==="in"?Ur.find(u=>u>a+.01):[...Ur].reverse().find(u=>u<a-.01);o!==void 0&&(a<=H&&o>H&&Ze(l("android.zoomPanHint")),Je(),Xe(o),Oe(o))},[Xe,Je,Ze,l]),vr=(e,a)=>{Promise.resolve().then(()=>n?.(e,a)).catch(o=>{G(o instanceof Error?o.message:String(o))})},Sn=c.useCallback(async(e,a,o)=>{try{if(!s)throw new Error(l("android.captureUnavailable"));if(await s(e,o)===!1)throw new Error(l("android.captureUnavailable"));Ze(a)}catch(u){G(l("android.captureFailed")+(u instanceof Error?`:${u.message}`:""))}},[s,Ze,l]),En=async e=>{const a=Wr(e),o=b.current;if(!(!o||Ct.current)){Ct.current=!0,lr(!0),G(null);try{const u=await ui(o);if(!a())throw new Error(l("android.captureUnavailable"));await Sn(u,l("android.captureInserted"),e)}catch(u){G(u instanceof Error?u.message:String(u))}finally{Ct.current=!1,lr(!1)}}},Ne=c.useCallback(e=>{(e.status==="ready"||e.status==="error")&&Ce.current&&!cr.current.has(e.id)&&(cr.current.add(e.id),x.current?Ce.current(e):fi(e,Ce.current))},[]),wr=c.useCallback(async e=>{const a=J.current;if(!(!a||Z.current)){Z.current=!0,Ye(!0),G(null);try{const o=await Bn(a.id);J.current=null,Ve(!1),Ne(o)}catch(o){G(o instanceof Error?o.message:String(o))}finally{Z.current=!1,Ye(!1)}}},[Ne]),kn=async()=>{if(!y||Z.current||J.current)return;const e=Ce.current;Z.current=!0,Ye(!0),G(null);try{const a=await Kn(y);e&&!x.current&&hi(a.id,e),a.status==="recording"||a.status==="starting"||a.status==="stopping"?(J.current=a,Ve(!0),ar(Math.max(0,Date.now()-a.startedAt))):Ne(a)}catch(a){G(a instanceof Error?a.message:String(a))}finally{Z.current=!1,Ye(!1)}},Y=!!p&&!p.android?.some(e=>e.serial===y&&e.access==="control");c.useEffect(()=>{let e=!1,a=!1;J.current=null,Ve(!1);const o=async()=>{if(!(!y||a||Z.current)){a=!0;try{const{recordings:f}=await Wn(y);if(e||Z.current)return;const m=f.find(v=>["starting","recording","stopping"].includes(v.status));J.current=m??null,Ve(!!m);for(const v of f)Ne(v)}catch{}finally{a=!1}}};o();const u=window.setInterval(()=>{o()},2e3);return kt.current=window.setInterval(()=>{J.current&&ar(Math.max(0,Date.now()-J.current.startedAt))},500),()=>{e=!0,window.clearInterval(u),kt.current!==null&&window.clearInterval(kt.current)}},[y,Ne]),c.useEffect(()=>{if(!he)return;const e=()=>ee(!1),a=u=>{const f=u.target;f instanceof Node&&(Rt.current?.contains(f)||dr.current?.contains(f)||e())},o=u=>{u.key==="Escape"&&(u.preventDefault(),u.stopPropagation(),e())};return document.addEventListener("pointerdown",a,!0),document.addEventListener("keydown",o,!0),window.addEventListener("resize",e),()=>{document.removeEventListener("pointerdown",a,!0),document.removeEventListener("keydown",o,!0),window.removeEventListener("resize",e)}},[he]),c.useEffect(()=>()=>{ue.current!==null&&window.clearTimeout(ue.current)},[]);const R=P==="streaming",S=U,oe=S?"inline-flex h-5 w-5 shrink-0 items-center justify-center rounded hover:bg-surface-2 disabled:opacity-40":"rounded p-1.5 hover:bg-surface-2 disabled:opacity-40",Cn=ae?(ae.model||ae.serial)+Yr(ae,l):ie.length?l("android.selectDevice"):l("android.noDevices"),Nn=(I?V.find(e=>e.id===I):null)?.name??(Q==="auto"?`${l("android.qualityAuto")} · ${qt/1e6} Mbps`:l(Ut[Q])),Sr=S?"relative flex h-5 min-w-0 items-center rounded bg-surface-2 focus-within:ring-1 focus-within:ring-primary/50":"relative flex h-7 min-w-0 items-center rounded bg-surface-2 focus-within:ring-1 focus-within:ring-primary/50",Er=S?"pointer-events-none block min-w-0 truncate px-1 text-[10px] leading-none text-foreground":"pointer-events-none block min-w-0 truncate px-2 text-[11px] leading-none text-foreground",kr="absolute inset-0 h-full w-full cursor-pointer opacity-0",Rn=()=>{const e=Rt.current?.getBoundingClientRect();e&&dn({left:Math.max(8,Math.min(e.right-Lt,window.innerWidth-Lt-8)),top:Math.min(e.bottom+4,Math.max(8,window.innerHeight-pi-8))}),ee(!0)},Mn=()=>{if(U){At(De,null),D({docked:null});return}if(!Mt)return;const e={sessionId:Mt,side:"right"};At(De,e),D({docked:e})},An=qe||U||E!=="off",et=r.jsxs("div",{className:"android-mirror-panel flex h-full min-h-0 min-w-0 flex-col bg-surface text-foreground","data-sidebar-gesture-ignore":"true",onKeyDown:wn,tabIndex:-1,children:[r.jsxs("div",{"data-panel-drag-title":U?"true":void 0,className:S?"flex h-6 min-h-6 shrink-0 flex-nowrap items-center gap-1 overflow-hidden border-b border-border/15 bg-[var(--chrome-bg)] px-1.5 cursor-grab select-none active:cursor-grabbing":"flex flex-wrap items-center gap-1.5 border-b border-border px-2 py-2",children:[U&&r.jsx("span",{"data-panel-drag-title":"true",role:"button","aria-label":l("android.splitDrag"),title:l("android.splitDrag"),className:"flex h-4 w-4 shrink-0 cursor-grab items-center justify-center rounded text-muted-foreground hover:text-foreground active:cursor-grabbing",children:r.jsx(cs,{size:12})}),r.jsx(Fn,{size:S?12:14,className:"shrink-0 text-muted-foreground"}),r.jsxs("div",{className:`${Sr} flex-1`,children:[r.jsx("span",{"aria-hidden":"true",className:`${Er} w-full`,children:Cn}),r.jsxs("select",{value:y,onChange:e=>{const a=e.target.value;Ue(a),Pe.current=a,a&&D({deviceSerial:a})},className:kr,"aria-label":l("android.device"),children:[r.jsx("option",{value:"",children:ie.length?l("android.selectDevice"):l("android.noDevices")}),ie.map(e=>r.jsx("option",{value:e.serial,children:(e.model||e.serial)+Yr(e,l)},e.serial))]})]}),r.jsxs("div",{className:`${Sr} max-w-[45%] shrink-0`,children:[r.jsx("span",{"aria-hidden":"true",className:Er,children:Nn}),r.jsxs("select",{value:I?`user:${I}`:Q,onChange:e=>pn(e.target.value),className:kr,title:l(Q==="auto"?"android.qualityAutoHint":"android.quality"),"aria-label":l("android.quality"),children:[r.jsxs("option",{value:"auto",children:[l("android.qualityAuto"),Q==="auto"?` · ${qt/1e6} Mbps`:""]}),Cr.map(e=>r.jsx("option",{value:e.id,children:l(Ut[e.id])},e.id)),V.map(e=>r.jsx("option",{value:`user:${e.id}`,children:e.name},e.id)),r.jsx("option",{value:"custom",children:l(Ut.custom)})]})]}),r.jsx("button",{type:"button",onClick:()=>{We()},className:`${oe} text-muted-foreground`,title:l("android.refresh"),children:rn?r.jsx(Re,{size:13,className:"animate-spin"}):r.jsx($n,{size:13})}),R?r.jsx("button",{type:"button",onClick:hn,className:`${oe} text-destructive`,title:l("android.disconnect"),children:r.jsx(Zn,{size:13})}):r.jsx("button",{type:"button",onClick:()=>y&&_(y),disabled:!y,className:`${oe} text-primary`,title:l("android.connect"),children:r.jsx(Ns,{size:13})}),(R||L)&&r.jsx("button",{type:"button",onClick:e=>{En(e.currentTarget)},disabled:!s||ke,className:`${oe} text-muted-foreground`,title:l(s?"android.screenshot":"android.captureUnavailable"),"aria-label":l("android.screenshot"),children:ke?r.jsx(Re,{size:S?12:13,className:"animate-spin"}):r.jsx(is,{size:S?12:13})}),(R||L)&&r.jsx("button",{type:"button",onClick:()=>{L?wr("manual"):kn()},disabled:or||!L&&!d,className:`${oe} ${L?"text-destructive":"text-muted-foreground"}`,title:l(L?"android.recordingStop":d?"android.recordingStart":"android.captureUnavailable"),"aria-label":l(L?"android.recordingStop":"android.recordingStart"),children:or?r.jsx(Re,{className:"animate-spin",size:13}):L?r.jsx(Kr,{size:S?10:11,fill:"currentColor"}):r.jsx(qn,{size:S?12:13})}),r.jsx("button",{ref:Rt,type:"button",onClick:()=>he?ee(!1):Rn(),"aria-haspopup":"menu","aria-expanded":he,className:`${oe} ${An?"text-primary":"text-muted-foreground"}`,title:l("android.more"),"aria-label":l("android.more"),disabled:!!p,children:r.jsx(Vn,{size:S?13:14})}),h&&!t&&r.jsx("button",{type:"button",onClick:()=>{ee(!1),w("off"),h()},className:`${oe} text-muted-foreground hover:bg-destructive/20 hover:text-destructive`,title:l("android.closeTab"),"aria-label":l("android.closeTab"),children:r.jsx(Nr,{size:14})})]}),!p&&he&&Nt&&nt.createPortal(r.jsxs("div",{ref:dr,role:"menu","aria-label":l("android.more"),style:{left:Nt.left,top:Nt.top,width:Lt},className:"fixed z-popover overflow-hidden rounded-md border border-border bg-surface-elevated py-1 text-[11px] shadow-lg",children:[r.jsx(ot,{icon:r.jsx(Rr,{size:13}),label:l("android.addDevice"),active:qe,onSelect:()=>{Jt(e=>!e),ee(!1)}}),r.jsx(ot,{icon:U?r.jsx(Nr,{size:13}):r.jsx(Mr,{size:13}),label:l(U?"android.splitClose":"android.splitOpen"),active:U,disabled:!U&&!Mt,onSelect:()=>{Mn(),ee(!1)}}),r.jsx(ot,{icon:E==="window"?r.jsx(gs,{size:13}):r.jsx(ps,{size:13}),label:l(E==="window"?"android.exitFullscreen":"android.fullscreen"),active:E==="window",onSelect:()=>{w(E==="window"?"off":"window"),ee(!1)}}),!t&&r.jsx(ot,{icon:E==="sidebar"?r.jsx(Ss,{size:13}):r.jsx(ks,{size:13}),label:l(E==="sidebar"?"android.exitFullscreen":"android.fillSidebar"),active:E==="sidebar",onSelect:()=>{w(E==="sidebar"?"off":"sidebar"),ee(!1)}}),yt&&r.jsxs("div",{className:"mt-1 border-t border-border px-3 py-2 text-[10px] leading-4 tabular-nums text-muted-foreground",children:[r.jsx("div",{className:"truncate",children:`${se.fps} fps · ${se.kbps} kbps`}),r.jsx("div",{className:"truncate",children:`${se.width}×${se.height}`})]})]}),document.body),(Q==="custom"||I)&&r.jsxs("div",{className:"border-b border-border bg-surface-2/40 px-2 py-2 text-[11px]",children:[r.jsxs("button",{type:"button",onClick:()=>pt(e=>!e),"aria-expanded":ft,className:"flex w-full items-center gap-1 rounded text-muted-foreground hover:text-foreground",children:[r.jsx(Rr,{size:12,className:`transition-transform ${ft?"":"-rotate-90"}`}),r.jsxs("span",{children:[l("android.quality"),I?` · ${V.find(e=>e.id===I)?.name??""}`:""]})]}),ft&&r.jsxs("div",{className:"mt-2 grid gap-2",children:[r.jsx(qr,{label:l("android.qualityResolution"),display:`${C.maxSize}px`,min:360,max:2160,step:8,value:C.maxSize,onChange:e=>ne(a=>({...a,maxSize:e}))}),r.jsx(qr,{label:l("android.qualityBitRate"),display:`${(C.bitRate/1e6).toFixed(1)} Mbps`,min:.5,max:20,step:.5,value:C.bitRate/1e6,onChange:e=>ne(a=>({...a,bitRate:Math.round(e*1e6)}))}),r.jsxs("div",{className:"flex items-center gap-2",children:[r.jsx("span",{className:"w-14 shrink-0 text-muted-foreground",children:l("android.qualityFrameRate")}),r.jsxs("div",{className:"flex gap-1",children:[[15,30,60].map(e=>r.jsx("button",{type:"button",onClick:()=>ne(a=>({...a,maxFps:e})),className:`rounded px-2 py-0.5 ${C.maxFps===e?"bg-surface-elevated text-primary":"text-muted-foreground hover:bg-surface-2"}`,children:e},e)),r.jsx("button",{type:"button",onClick:()=>ne(e=>({...e,maxFps:0})),className:`rounded px-2 py-0.5 ${C.maxFps===0?"bg-surface-elevated text-primary":"text-muted-foreground hover:bg-surface-2"}`,children:l("android.qualityAuto")})]}),r.jsx("button",{type:"button",onClick:mn,disabled:!y,className:"ml-auto rounded bg-primary/15 px-2 py-1 text-primary disabled:opacity-40",children:l("android.qualityApply")})]}),r.jsxs("div",{className:"flex items-center gap-2",children:[r.jsx("input",{value:ze,onChange:e=>Wt(e.target.value),onKeyDown:e=>{e.key==="Enter"&&!e.nativeEvent.isComposing&&hr()},placeholder:l("android.presetNamePlaceholder"),maxLength:40,className:"min-w-0 flex-1 rounded bg-surface-2 px-2 py-1 text-[11px] outline-none placeholder:text-muted-foreground"}),r.jsx("button",{type:"button",onClick:hr,disabled:!ze.trim(),className:"shrink-0 rounded bg-surface-2 px-2 py-1 text-primary disabled:opacity-40",children:l("android.presetSave")}),I&&r.jsx("button",{type:"button",onClick:xn,className:"shrink-0 rounded px-2 py-1 text-destructive hover:bg-surface-2",children:l("android.presetDelete")})]})]})]}),!p&&qe&&r.jsxs("div",{className:"flex items-center gap-1.5 border-b border-border px-2 py-2",children:[r.jsx("input",{value:Zt,onChange:e=>er(e.target.value),onKeyDown:e=>{e.key==="Enter"&&yr()},placeholder:l("android.addressPlaceholder"),className:"min-w-0 flex-1 rounded bg-surface-2 px-2 py-1 text-[11px] outline-none placeholder:text-muted-foreground"}),r.jsx("button",{type:"button",onClick:()=>{yr()},disabled:tr,className:"rounded bg-surface-2 px-2 py-1 text-[11px] text-primary disabled:opacity-40",children:tr?r.jsx(Re,{size:12,className:"animate-spin"}):l("android.connect")})]}),Ke&&r.jsxs("div",{className:"flex items-start gap-2 border-b border-border bg-surface-2 px-2 py-1.5 text-[11px] text-destructive",children:[r.jsx("span",{className:"min-w-0 flex-1",children:l("android.adbUnavailable")}),r.jsx(Fr,{label:l("android.insertFixPrompt"),onClick:e=>vr($r("adb",xe??""),e),enabled:!!n})]}),!Ke&&ur&&r.jsxs("div",{className:"flex items-start gap-2 border-b border-border bg-surface-2 px-2 py-1.5 text-[11px] text-warning",children:[r.jsx("span",{className:"min-w-0 flex-1",children:l("android.scrcpyUnavailable")}),r.jsx(Fr,{label:l("android.insertFixPrompt"),onClick:e=>vr($r("scrcpy",""),e),enabled:!!n})]}),ae&&ae.state!=="device"&&r.jsx("div",{className:"border-b border-border bg-surface-2 px-2 py-1.5 text-[11px] text-warning",children:Si(ae,l)}),xe&&!Ke&&r.jsx("div",{className:"border-b border-border bg-surface-2 px-2 py-1.5 text-[11px] text-destructive",children:rt(xe)}),X&&r.jsxs("details",{className:"border-b border-border bg-surface-2 px-2 py-1.5 text-[11px] text-warning",children:[r.jsxs("summary",{className:"cursor-pointer",children:[l("android.qualityAutoUnavailable")," ",l(X.startsWith("SCRCPY_VERSION")?"android.qualityAutoVersionError":X.startsWith("SCRCPY_BUILD")?"android.qualityAutoBuildError":/EXTENSION|SERVER_READ|PUSH/.test(X.split(":")[0])?"android.qualityAutoExtensionError":/TIMEOUT/.test(X.split(":")[0])?"android.qualityAutoTimeoutError":/ENCODER_REJECTED/.test(X.split(":")[0])?"android.qualityAutoEncoderError":/CHANNEL|TUNNEL|LISTEN|PROTOCOL|CONNECTION/.test(X.split(":")[0])?"android.qualityAutoChannelError":"android.qualityAutoUnknownError")]}),r.jsx("pre",{className:"mt-1 select-text whitespace-pre-wrap break-all text-[10px]",children:X})]}),Qt&&r.jsx("div",{className:"border-b border-border bg-surface-2 px-2 py-1.5 text-[11px] text-warning",children:Qt}),ir&&r.jsx("div",{role:"alert",className:"border-b border-border bg-surface-2 px-2 py-1.5 text-[11px] text-destructive",children:ir}),r.jsxs("div",{className:"relative flex min-h-0 min-w-0 flex-1 touch-none items-center justify-center overflow-hidden bg-[var(--chrome-bg)] p-1",children:[r.jsx("canvas",{ref:b,className:"max-h-full max-w-full touch-none select-none rounded",style:{display:R||yt?"block":"none",transformOrigin:"center",transition:"none"},onPointerDown:gn,onPointerMove:bn,onPointerUp:vn,onPointerCancel:()=>A(),onLostPointerCapture:e=>{N.current.has(e.pointerId)&&A()},onPointerLeave:e=>{N.current.has(e.pointerId)&&!e.currentTarget.hasPointerCapture?.(e.pointerId)&&A()},onContextMenu:e=>e.preventDefault()}),ge&&r.jsx("span",{"aria-hidden":"true",className:"pointer-events-none absolute h-3.5 w-3.5 -translate-x-1/2 -translate-y-1/2 rounded-full border border-primary/80 bg-primary/35",style:{left:ge.left,top:ge.top}}),$e.length>1&&r.jsx("svg",{"aria-hidden":"true",className:"pointer-events-none absolute inset-0 h-full w-full",style:{opacity:an?1:0,transition:"opacity 160ms linear"},children:$e.slice(1).map((e,a)=>{const o=$e[a],u=(a+1)/($e.length-1);return r.jsx("line",{x1:o.x,y1:o.y,x2:e.x,y2:e.y,stroke:"var(--primary)",strokeWidth:1+1.6*u,strokeLinecap:"round",opacity:.06+.45*u},a)})}),sn.map(e=>r.jsx("span",{"aria-hidden":"true",className:"termdock-tap-fade pointer-events-none absolute h-4 w-4 rounded-full bg-primary",style:{left:e.left,top:e.top}},e.id)),!R&&r.jsxs("div",{className:"absolute inset-0 flex flex-col items-center justify-center gap-2 text-center text-[11px] text-muted-foreground",children:[P==="connecting"&&r.jsxs(r.Fragment,{children:[r.jsx(Re,{size:18,className:"animate-spin"}),r.jsx("span",{children:l("android.connecting")})]}),P==="error"&&r.jsxs(r.Fragment,{children:[r.jsx(ts,{size:14,className:"text-destructive"}),r.jsx("span",{className:"max-w-[80%] text-destructive",children:bt?l("android.retrySchedule",{attempt:bt.attempt,seconds:bt.delayMs/1e3}):rt(mt||"")}),y&&r.jsx("button",{type:"button",onClick:()=>{le.current=0,_(y)},className:"rounded bg-surface-2 px-2 py-1 text-foreground",children:l("android.retry")})]}),ye&&(P==="error"||P==="connecting")&&r.jsxs("div",{className:"max-h-[40%] w-[90%] shrink-0 select-text overflow-auto rounded bg-surface-2 px-3 py-2 text-left",role:"status",children:[r.jsx("span",{className:"text-muted-foreground",children:l("android.lastError")}),rt(ye)!==ye&&r.jsx("p",{className:"mt-1 whitespace-pre-wrap break-words",children:rt(ye)}),r.jsx("pre",{className:"mt-1 whitespace-pre-wrap break-words font-mono text-[10px] text-foreground",children:ye})]}),P==="idle"&&!Ke&&!ur&&r.jsxs(r.Fragment,{children:[r.jsx(vs,{size:22,className:"opacity-60"}),r.jsx("span",{children:ie.length?l("android.idleHint"):l("android.noDevicesHint")})]})]})]}),r.jsxs("div",{className:`flex flex-wrap items-center gap-1 border-t border-border ${S?"px-1.5 py-0.5":"px-2 py-1.5"}`,children:[r.jsx(z,{compact:S,label:l("android.back"),onClick:()=>g.current?.back(),disabled:!R||Y,children:r.jsx(Yn,{size:14})}),r.jsx(z,{compact:S,label:l("android.home"),onClick:()=>g.current?.home(),disabled:!R||Y,children:r.jsx(ds,{size:14})}),r.jsx(z,{compact:S,label:l("android.recents"),onClick:()=>g.current?.recents(),disabled:!R||Y,children:r.jsx(hs,{size:14})}),r.jsx(z,{compact:S,label:l("android.notifications"),onClick:()=>g.current?.expandNotifications(),disabled:!R||Y,children:r.jsx(ns,{size:14})}),r.jsx(z,{compact:S,label:l("android.rotate"),onClick:()=>g.current?.rotate(),disabled:!R||Y,children:r.jsx(Ds,{size:14})}),r.jsx(z,{compact:S,label:l("android.volumeDown"),onClick:()=>g.current?.volumeDown(),disabled:!R||Y,children:r.jsx(Is,{size:14})}),r.jsx(z,{compact:S,label:l("android.volumeUp"),onClick:()=>g.current?.volumeUp(),disabled:!R||Y,children:r.jsx(Ls,{size:14})}),r.jsx(z,{compact:S,label:l("android.power"),onClick:()=>g.current?.power(),disabled:!R||Y,children:r.jsx(Ms,{size:14})}),r.jsx(z,{compact:S,label:l("android.inputText"),active:wt,onClick:()=>cn(e=>!e),disabled:!R||Y,children:r.jsx(es,{size:14})}),r.jsx(z,{compact:S,label:l("android.zoomIn"),onClick:()=>br("in"),disabled:!R||dt>=lt-.01,children:r.jsx(Hn,{size:14})}),r.jsx(z,{compact:S,label:l("android.zoomOut"),onClick:()=>br("out"),disabled:!R||dt<=H+.01,children:r.jsx(xs,{size:14})}),r.jsxs("div",{className:"relative ml-auto h-5 w-24 min-w-0 max-w-full shrink-0","data-mirror-capture-status":!0,children:[r.jsx("span",{"aria-hidden":L||!!Et||ke,className:`block truncate text-right text-[10px] leading-5 tabular-nums text-muted-foreground ${L||Et||ke?"invisible":""}`,children:yt?r.jsx(r.Fragment,{children:r.jsx("span",{ref:Yt})}):""}),r.jsx("div",{className:"absolute inset-0 flex items-center justify-end overflow-hidden",children:r.jsx(bi,{recording:L,elapsed:ln,status:ke?l("android.captureInserting"):Et,stopLabel:l("android.recordingStop"),onStop:()=>{wr("manual")}})})]})]}),wt&&r.jsxs("div",{className:"flex items-center gap-1.5 border-t border-border px-2 py-1.5",children:[r.jsx("input",{value:St,onChange:e=>nr(e.target.value),onKeyDown:e=>{e.key==="Enter"&&!e.nativeEvent.isComposing&&(e.preventDefault(),gr())},placeholder:l("android.inputPlaceholder"),className:"min-w-0 flex-1 rounded bg-surface-2 px-2 py-1 text-[11px] outline-none placeholder:text-muted-foreground",autoFocus:!0}),r.jsx("button",{type:"button",onClick:gr,disabled:!St,className:"rounded bg-surface-2 p-1.5 text-primary disabled:opacity-40",title:l("android.send"),children:r.jsx(Ts,{size:13})})]})]});return E==="window"?nt.createPortal(r.jsx("div",{className:"fixed inset-0 z-modal-panel flex flex-col bg-[var(--chrome-bg)]",style:{paddingTop:"var(--safe-top-inset, env(safe-area-inset-top, 0px))",paddingBottom:"var(--safe-bottom-inset, env(safe-area-inset-bottom, 0px))"},children:et}),document.body):t?U&&He?nt.createPortal(et,He):null:U&&He?r.jsxs(r.Fragment,{children:[nt.createPortal(et,He),r.jsxs("div",{className:"flex h-full flex-col items-center justify-center gap-2 p-4 text-center text-[11px] text-muted-foreground",children:[r.jsx(Mr,{size:18,className:"opacity-60"}),r.jsx("span",{children:l("android.splitDockedHint")}),r.jsx("button",{type:"button",onClick:()=>{At(De,null),D({docked:null})},className:"rounded bg-surface-2 px-2 py-1 text-foreground",children:l("android.splitClose")})]})]}):et}function ot({icon:i,label:t,active:n=!1,disabled:s=!1,onSelect:d}){return r.jsxs("button",{type:"button",role:"menuitem",disabled:s,onClick:d,className:`flex w-full items-center gap-2 px-2.5 py-1.5 text-left transition hover:bg-surface-2 disabled:opacity-40 disabled:hover:bg-transparent ${n?"text-primary":"text-foreground"}`,children:[r.jsx("span",{"aria-hidden":"true",className:"shrink-0",children:i}),r.jsx("span",{className:"min-w-0 flex-1 truncate",children:t}),n&&r.jsx(Qn,{size:12,className:"shrink-0"})]})}function bi({recording:i,elapsed:t,status:n,stopLabel:s,onStop:d}){return i?r.jsxs("span",{role:"status","aria-live":"polite",className:"ml-auto inline-flex shrink-0 items-center gap-1 whitespace-nowrap rounded bg-destructive/15 px-1.5 py-0.5 text-[10px] tabular-nums text-destructive",children:[r.jsx("span",{"aria-hidden":"true",className:"h-1.5 w-1.5 shrink-0 animate-pulse rounded-full bg-destructive"}),Ir(t),r.jsx("button",{type:"button",onClick:d,title:s,"aria-label":`${s} · ${Ir(t)}`,className:"ml-0.5 inline-flex h-4 w-4 items-center justify-center rounded hover:bg-destructive/25",children:r.jsx(Kr,{size:8,fill:"currentColor"})})]}):n?r.jsx("span",{role:"status","aria-live":"polite",title:n,className:"ml-auto truncate text-[10px] text-primary",children:n}):null}function vi({sessionId:i}){const t=ce(w=>w.docks[pe]),n=!!t,s=t?.sessionId??i??null,h=Pt(w=>w.pending)[0],p=c.useCallback(async(w,b)=>{const g=Wr(b);if(!s)throw new Error("没有可接收截图的终端");const W=(await On("/tmp",[w])).files[0]?.path;if(!W)throw new Error("截图上传未返回文件路径");if(!g())throw new Error("截图尚未插入,请返回原投屏面板重试");await Lr(W,s,b)},[s]),x=c.useCallback(w=>{Pt.getState().enqueue(w,s)},[s]),l=ce(w=>!!w.hosts[pe]),E=c.useRef(!1);return c.useEffect(()=>{E.current||(E.current=!0,Hr().then(w=>{const b=w.androidPanel?.docked;b&&(ce.getState().docks[pe]||ce.getState().setDock(pe,b))}).catch(()=>{}))},[]),r.jsxs(r.Fragment,{children:[n&&l&&r.jsx(en,{sessionId:s,dockOnly:!0,onInsertFile:s?p:void 0,onInsertPrompt:s?(w,b)=>Jr(w,s,b):void 0,onRecordingComplete:x}),h&&r.jsx(Jn,{file:h.file,initialPath:h.initialPath,onInsert:(w,b)=>h.insert?h.insert(w,b):Lr(w,h.sessionId,b),onDone:()=>Pt.getState().remove(h.file.id)},h.file.id)]})}function Fr({label:i,onClick:t,enabled:n}){return n?r.jsx("button",{type:"button",onClick:s=>t(s.currentTarget),className:"shrink-0 rounded bg-surface px-1.5 py-0.5 text-[10px] text-foreground hover:bg-surface-elevated",children:i}):null}function $r(i,t){return[`Termdock 的“设备投屏”在当前服务端不可用:未找到 ${i==="adb"?"adb(Android platform-tools)":"scrcpy / scrcpy-server"}${t?`(错误:${t})`:""}。`,"请在本机安装并让 Termdock 恢复可用:","1) 安装依赖:"," - macOS: brew install android-platform-tools scrcpy"," - Ubuntu/Debian: sudo apt install adb scrcpy"," - Windows: winget install Google.PlatformTools && winget install Genymobile.scrcpy","2) 若不在 PATH,请在 ~/.termdock/.env 指定 TERMDOCK_ADB_BIN / TERMDOCK_SCRCPY_BIN / TERMDOCK_SCRCPY_SERVER。","3) 完成后重启 Termdock 服务,并用 adb version、scrcpy --version 验证。","边界:只做本机环境安装与配置,不要改动 Termdock 仓库代码。"].join(`
|
|
3
|
-
`)}function qr({label:i,display:t,min:n,max:s,step:d,value:h,onChange:p}){return r.jsxs("div",{className:"flex items-center gap-2",children:[r.jsx("span",{className:"w-14 shrink-0 text-muted-foreground",children:i}),r.jsx("input",{type:"range",min:n,max:s,step:d,value:h,onChange:x=>p(Number(x.target.value)),className:"h-1 min-w-0 flex-1 accent-primary","aria-label":i}),r.jsx("span",{className:"w-16 shrink-0 text-right tabular-nums text-muted-foreground",children:t})]})}function z({label:i,onClick:t,disabled:n,active:s,compact:d,children:h}){return r.jsx("button",{type:"button",onClick:t,disabled:n,title:i,"aria-label":i,className:`${d?"inline-flex h-5 w-5 items-center justify-center":"p-1.5"} rounded transition active:scale-95 disabled:opacity-30 ${s?"bg-surface-elevated text-primary":"text-muted-foreground hover:bg-surface-2"}`,children:h})}function Vr(i,t,n){const s=i.parentElement;if(!s)return null;const d=i.getBoundingClientRect(),h=s.getBoundingClientRect();return{left:d.left-h.left+(t-d.left),top:d.top-h.top+(n-d.top)}}function ct(i,t,n){const s=i.getBoundingClientRect(),d=i.width||s.width,h=i.height||s.height,p=s.width?(t-s.left)/s.width*d:0,x=s.height?(n-s.top)/s.height*h:0;return{x:Math.max(0,Math.min(d,p)),y:Math.max(0,Math.min(h,x))}}function wi(i){return!(/ADB_NOT_FOUND|SCRCPY_NOT_FOUND|SCRCPY_SERVER_NOT_FOUND|SCRCPY_VERSION_UNKNOWN|SCRCPY_UNSUPPORTED_CODEC|VIDEO_DECODER_UNSUPPORTED/i.test(i)||/INVALID_SERIAL|INVALID_ADDRESS|API_NOT_ALLOWED|AUTHORIZATION_DENIED/i.test(i))}function Yr(i,t){return i.state==="device"?i.androidVersion?` · Android ${i.androidVersion}`:"":i.state==="unauthorized"?` · ${t("android.stateUnauthorized")}`:i.state==="offline"?` · ${t("android.stateOffline")}`:` · ${t("android.stateUnknown")}`}function Si(i,t){return i.state==="unauthorized"?t("android.unauthorizedHint"):i.state==="offline"?t("android.offlineHint"):t("android.stateUnknown")}const Di=Object.freeze(Object.defineProperty({__proto__:null,ANDROID_DOCK_GROUP:pe,AndroidMirrorDock:vi,AndroidMirrorView:en},Symbol.toStringTag,{value:"Module"}));export{pe as A,ns as B,Mr as C,cs as G,ds as H,hs as L,ps as M,Ds as R,Ts as S,Ls as V,vi as a,en as b,Di as c,gs as d,xs as e,Pt as f,Lr as i,Ar as u};
|
|
Binary file
|
|
Binary file
|