termdock 1.4.355 → 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-mAiaX5i8.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-D2NtgMuL.js → ChatRichContent-DjwpmW7d.js} +55 -55
- 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-CbEuQA68.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-PysBkJrJ.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-D6PxvtBY.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-Bp-BLT2f.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-Fa4AXG-N.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-Cl0X7I-U.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-BajyXVpH.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-CbhM5I2d.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-CDKLcS6D.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-Dp27yS0N.js → arrow-down-WyzmLXwQ.js} +1 -1
- package/dist/client/assets/{blockDiagram-I7D4REHJ-CXiIO6_W.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-uZ-i2eKH.js → c4Diagram-7LVT6UL2-BqwmmVmS.js} +1 -1
- package/dist/client/assets/{c4Diagram-7LVT6UL2-uZ-i2eKH.js.br → 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-D8ntyw2S.js → chevron-left-CxeWIsDK.js} +1 -1
- package/dist/client/assets/{chunk-2Q5K7J3B-DVe3dVJR.js → chunk-2Q5K7J3B-esKGR38U.js} +1 -1
- package/dist/client/assets/{chunk-5VM5RSS4-BDBNKGuU.js → chunk-5VM5RSS4-B3InxqDA.js} +1 -1
- package/dist/client/assets/{chunk-F27PBJKO-BP7hTwtm.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-LIGuOtnb.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-C1_iFEvk.js → chunk-JWPE2WC7-CplXNOA7.js} +1 -1
- package/dist/client/assets/{chunk-POPQ4Y6H-CYZsO-QL.js → chunk-POPQ4Y6H-D0JWCGnb.js} +1 -1
- package/dist/client/assets/{chunk-SVP7TREG-FnWYLNCS.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-dcOCcmQq.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-B2H2Yt9G.js → chunk-XXDRQBXY-D7qYRhMH.js} +1 -1
- package/dist/client/assets/{circle-Pldg1yI9.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-tTkMEO1S.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-Bz38mqD8.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-CZAa1A6y.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-BaQnW4VG.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-BdnT61bc.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-BWiF8QNc.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-DLURjCFp.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-DYIcLklz.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-C9vqviXX.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-BJuQxTkw.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-BcbISm-z.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-fhNpRzUG.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-DE8Gj-da.js → external-link-CsydVmO1.js} +1 -1
- package/dist/client/assets/{flowDiagram-HODETNUW-CVDJ_1Zu.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-Dzn-mrfe.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-Ct2eJNs4.js → git-compare-BmKAtQTt.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-Ci-wfvCz.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-npBmeTt7.js → infoDiagram-27XIBGKW-CrLj9y1o.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-5VMMS53U-CCn5Ha25.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-CPl5oPfe.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-Dmia2kLZ.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-B2Kz5M73.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-D2CT7wE3.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-x33s12VI.js → link-34ChBc4F.js} +3 -3
- package/dist/client/assets/link-34ChBc4F.js.br +0 -0
- package/dist/client/assets/link-34ChBc4F.js.gz +0 -0
- package/dist/client/assets/{list-tree-XBmm9il2.js → list-tree-48dzbuUh.js} +1 -1
- package/dist/client/assets/{maximize-2-t-zzENew.js → maximize-2-CbvSsu7O.js} +1 -1
- package/dist/client/assets/{mermaid.core-G9XIcppl.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-D2OX9OkO.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-DkTynZfV.js → passwordBootstrap-Doe50DSa.js} +1 -1
- package/dist/client/assets/passwordBootstrap-Doe50DSa.js.br +0 -0
- package/dist/client/assets/passwordBootstrap-Doe50DSa.js.gz +0 -0
- package/dist/client/assets/{pegDiagram-XKGWAZYB-qNjd6dbd.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-DcCmKDFh.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-BpDzkl9h.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-DeByS04O.js → quote-B5GeKEq1.js} +1 -1
- package/dist/client/assets/{railroadDiagram-O6MQD6OU-DkwV8w7x.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-BRwt5MXl.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-DZ8y_gv3.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-CDJ4fv-q.js → search-CbpNLSpd.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-CJ9lZEsN.js → sequenceDiagram-WJ2MYXX4-BDzn7N2D.js} +1 -1
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-BDzn7N2D.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-BDzn7N2D.js.gz +0 -0
- package/dist/client/assets/{sizeCapture-INFHLROL-Dt9ZzegQ.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-DgeQtV3s.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-CvzpsfHU.js → sun-CMXn_ntS.js} +1 -1
- package/dist/client/assets/{swimlanes-42K2YHIH-DHB6MQ8v.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-EqVVyv-E.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-BNUx6Lmk.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-BBE17-sL.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-B09OiyP5.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-B4gZGXiA.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-BDO5xF5D.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/chatUIPrompt.js +1 -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/invitations.js +5 -1
- 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/routeInvitations.js +5 -1
- 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/ensure-node-pty.cjs +22 -7
- package/scripts/install-utils.cjs +81 -0
- package/scripts/postinstall.mjs +24 -110
- package/dist/client/assets/AndroidMirrorView-BC_6L3mG.js +0 -3
- package/dist/client/assets/AndroidMirrorView-BC_6L3mG.js.br +0 -0
- package/dist/client/assets/AndroidMirrorView-BC_6L3mG.js.gz +0 -0
- package/dist/client/assets/App-BGECv_n_.js +0 -178
- package/dist/client/assets/App-BGECv_n_.js.br +0 -0
- package/dist/client/assets/App-BGECv_n_.js.gz +0 -0
- package/dist/client/assets/ArchitecturePanel-CYdolNzT.js +0 -9
- package/dist/client/assets/ArchitecturePanel-CYdolNzT.js.br +0 -0
- package/dist/client/assets/ArchitecturePanel-CYdolNzT.js.gz +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-mAiaX5i8.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-mAiaX5i8.js.gz +0 -0
- package/dist/client/assets/ChatRichContent-D2NtgMuL.js.br +0 -0
- package/dist/client/assets/ChatRichContent-D2NtgMuL.js.gz +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-CcHsVfXD.js +0 -1
- package/dist/client/assets/CollaborationMainWorkspace-CcHsVfXD.js.br +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-CcHsVfXD.js.gz +0 -0
- package/dist/client/assets/CollaborationTaskContent-FcrGGSr_.js +0 -2
- package/dist/client/assets/ComputerControlView-DU9krDsg.js +0 -6
- package/dist/client/assets/ComputerControlView-DU9krDsg.js.br +0 -0
- package/dist/client/assets/ComputerControlView-DU9krDsg.js.gz +0 -0
- package/dist/client/assets/DagPlayground-CbEuQA68.js.br +0 -0
- package/dist/client/assets/DagPlayground-CbEuQA68.js.gz +0 -0
- package/dist/client/assets/DiffLab-PysBkJrJ.js.br +0 -0
- package/dist/client/assets/DiffLab-PysBkJrJ.js.gz +0 -0
- package/dist/client/assets/DiffReview-Ce3wKMBk.js +0 -1
- package/dist/client/assets/DiffReview-Ce3wKMBk.js.br +0 -0
- package/dist/client/assets/DiffReview-Ce3wKMBk.js.gz +0 -0
- package/dist/client/assets/DiffReviewLab-D6PxvtBY.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-D6PxvtBY.js.gz +0 -0
- package/dist/client/assets/DiffViewer-Bp-BLT2f.js.br +0 -0
- package/dist/client/assets/DiffViewer-Bp-BLT2f.js.gz +0 -0
- package/dist/client/assets/GitLoadingSkeleton-Fa4AXG-N.js.br +0 -0
- package/dist/client/assets/GitLoadingSkeleton-Fa4AXG-N.js.gz +0 -0
- package/dist/client/assets/MarkdownPreview-_Z5UzhLt.js +0 -19
- package/dist/client/assets/MarkdownPreview-_Z5UzhLt.js.br +0 -0
- package/dist/client/assets/MarkdownPreview-_Z5UzhLt.js.gz +0 -0
- package/dist/client/assets/ModelPreview-Cl0X7I-U.js.br +0 -0
- package/dist/client/assets/ModelPreview-Cl0X7I-U.js.gz +0 -0
- package/dist/client/assets/RecordingSaveDialog-Ca2iJsOW.js +0 -1
- package/dist/client/assets/RecordingSaveDialog-Ca2iJsOW.js.br +0 -0
- package/dist/client/assets/RecordingSaveDialog-Ca2iJsOW.js.gz +0 -0
- package/dist/client/assets/RightSidebar-CwXIBpEw.js +0 -1662
- package/dist/client/assets/RightSidebar-CwXIBpEw.js.br +0 -0
- package/dist/client/assets/RightSidebar-CwXIBpEw.js.gz +0 -0
- package/dist/client/assets/SessionChatView-D3sLcYAc.js +0 -13
- package/dist/client/assets/SessionChatView-D3sLcYAc.js.br +0 -0
- package/dist/client/assets/SessionChatView-D3sLcYAc.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-BObKJeA9.js +0 -2
- package/dist/client/assets/SessionResourceSidebar-BObKJeA9.js.br +0 -0
- package/dist/client/assets/SessionResourceSidebar-BObKJeA9.js.gz +0 -0
- package/dist/client/assets/TodoWorkspace-BdesAuz4.js +0 -1
- package/dist/client/assets/TodoWorkspace-BdesAuz4.js.br +0 -0
- package/dist/client/assets/TodoWorkspace-BdesAuz4.js.gz +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-BajyXVpH.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-BajyXVpH.js.gz +0 -0
- package/dist/client/assets/app-C3WX_u_Z.js +0 -37
- package/dist/client/assets/app-C3WX_u_Z.js.br +0 -0
- package/dist/client/assets/app-C3WX_u_Z.js.gz +0 -0
- package/dist/client/assets/arc-CbhM5I2d.js.br +0 -0
- package/dist/client/assets/arc-CbhM5I2d.js.gz +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-CDKLcS6D.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-CDKLcS6D.js.gz +0 -0
- package/dist/client/assets/arrow-up-BEUQcf-s.js +0 -1
- package/dist/client/assets/blockDiagram-I7D4REHJ-CXiIO6_W.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-CXiIO6_W.js.gz +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-uZ-i2eKH.js.gz +0 -0
- package/dist/client/assets/channel-Dg7JKsqi.js +0 -1
- package/dist/client/assets/chunk-F27PBJKO-BP7hTwtm.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-BP7hTwtm.js.gz +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-LIGuOtnb.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-LIGuOtnb.js.gz +0 -0
- package/dist/client/assets/chunk-SVP7TREG-FnWYLNCS.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-FnWYLNCS.js.gz +0 -0
- package/dist/client/assets/chunk-TICWLB2K-dcOCcmQq.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-dcOCcmQq.js.gz +0 -0
- package/dist/client/assets/classDiagram-ZZMXUADV-D6QBd_IP.js +0 -1
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-D6QBd_IP.js +0 -1
- package/dist/client/assets/clipboardText-BapOM7QN.js +0 -1
- package/dist/client/assets/clipboardText-BapOM7QN.js.br +0 -0
- package/dist/client/assets/clipboardText-BapOM7QN.js.gz +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-Bz38mqD8.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-Bz38mqD8.js.gz +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-CZAa1A6y.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-CZAa1A6y.js.gz +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-BaQnW4VG.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-BaQnW4VG.js.gz +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-BdnT61bc.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-BdnT61bc.js.gz +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-BWiF8QNc.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-BWiF8QNc.js.gz +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-DLURjCFp.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-DLURjCFp.js.gz +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-DYIcLklz.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-DYIcLklz.js.gz +0 -0
- package/dist/client/assets/diagram-VX7I27RA-C9vqviXX.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-C9vqviXX.js.gz +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-BJuQxTkw.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-BJuQxTkw.js.gz +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-BcbISm-z.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-BcbISm-z.js.gz +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-fhNpRzUG.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-fhNpRzUG.js.gz +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-CVDJ_1Zu.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-CVDJ_1Zu.js.gz +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-Dzn-mrfe.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-Dzn-mrfe.js.gz +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-Ci-wfvCz.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-Ci-wfvCz.js.gz +0 -0
- package/dist/client/assets/index-DOq3vkFG.css +0 -1
- package/dist/client/assets/index-DOq3vkFG.css.br +0 -0
- package/dist/client/assets/index-DOq3vkFG.css.gz +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-CCn5Ha25.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-CCn5Ha25.js.gz +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-CPl5oPfe.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-CPl5oPfe.js.gz +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-Dmia2kLZ.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-Dmia2kLZ.js.gz +0 -0
- package/dist/client/assets/layout-B2Kz5M73.js.br +0 -0
- package/dist/client/assets/layout-B2Kz5M73.js.gz +0 -0
- package/dist/client/assets/linear-D2CT7wE3.js.br +0 -0
- package/dist/client/assets/linear-D2CT7wE3.js.gz +0 -0
- package/dist/client/assets/link-x33s12VI.js.br +0 -0
- package/dist/client/assets/link-x33s12VI.js.gz +0 -0
- package/dist/client/assets/loader-circle-D_nJKmMD.js +0 -1
- package/dist/client/assets/mermaid.core-G9XIcppl.js.br +0 -0
- package/dist/client/assets/mermaid.core-G9XIcppl.js.gz +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-D2OX9OkO.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-D2OX9OkO.js.gz +0 -0
- package/dist/client/assets/passwordBootstrap-DkTynZfV.js.br +0 -0
- package/dist/client/assets/passwordBootstrap-DkTynZfV.js.gz +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-qNjd6dbd.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-qNjd6dbd.js.gz +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-DcCmKDFh.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-DcCmKDFh.js.gz +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-BpDzkl9h.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-BpDzkl9h.js.gz +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-DkwV8w7x.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-DkwV8w7x.js.gz +0 -0
- package/dist/client/assets/rdpSession-D5NrFTav.js +0 -1
- package/dist/client/assets/rdpSession-D5NrFTav.js.br +0 -0
- package/dist/client/assets/rdpSession-D5NrFTav.js.gz +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-BRwt5MXl.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-BRwt5MXl.js.gz +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-DZ8y_gv3.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-DZ8y_gv3.js.gz +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-CJ9lZEsN.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-CJ9lZEsN.js.gz +0 -0
- package/dist/client/assets/settings-2-DtFz7lgk.js +0 -1
- package/dist/client/assets/sizeCapture-INFHLROL-Dt9ZzegQ.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-Dt9ZzegQ.js.gz +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-DgeQtV3s.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-DgeQtV3s.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-CKS6y2rR.js +0 -1
- package/dist/client/assets/swimlanes-42K2YHIH-DHB6MQ8v.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH-DHB6MQ8v.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-DvUzDKPI.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-DF6Q5phI.js +0 -4
- package/dist/client/assets/syntaxHighlight-DF6Q5phI.js.br +0 -0
- package/dist/client/assets/syntaxHighlight-DF6Q5phI.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-EqVVyv-E.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-EqVVyv-E.js.gz +0 -0
- package/dist/client/assets/triangle-alert--5QOrsVl.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-BBE17-sL.js.br +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-BBE17-sL.js.gz +0 -0
- package/dist/client/assets/videoCompression-B09OiyP5.js.br +0 -0
- package/dist/client/assets/videoCompression-B09OiyP5.js.gz +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-B4gZGXiA.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-B4gZGXiA.js.gz +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-BDO5xF5D.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-BDO5xF5D.js.gz +0 -0
package/README.md
CHANGED
|
@@ -37,7 +37,7 @@ Termdock 是一个可自托管的 Web 终端与 AI Agent 工作区。你可以
|
|
|
37
37
|
| Node.js | **22 或更新版本**,并安装 npm |
|
|
38
38
|
| 持久会话 | `tmux`,需要能从 `PATH` 找到 |
|
|
39
39
|
| 客户端 | 当前版本的 Chrome、Edge、Firefox 或 Safari;手机可通过 HTTPS 安装 PWA |
|
|
40
|
-
| macOS 桌面安装包 |
|
|
40
|
+
| macOS 桌面安装包 | Rust 正式版要求 macOS 14+,当前打包目标为 Apple Silicon(arm64),见 [Releases](https://github.com/Jovines/termdock/releases) |
|
|
41
41
|
|
|
42
42
|
安装过程会检查原生终端模块和 tmux,并尝试修复依赖。手动准备 tmux:
|
|
43
43
|
|
|
@@ -255,7 +255,7 @@ https://<name>.termdock.local:9834
|
|
|
255
255
|
|
|
256
256
|
第一版仍然保留 `:9834` 端口;无端口的 `https://<name>.termdock.local` 需要后续单独引入 443 代理/Helper。
|
|
257
257
|
|
|
258
|
-
|
|
258
|
+
第一次在交互终端运行 `termdock` 时,CLI 会引导你选择 `.termdock.local` 前缀,并询问是否启用 HTTPS。选择启用后会准备 mkcert 并生成证书;选择稍后配置或无界面首次启动时,不会擅自下载工具。已有默认 HTTPS 配置损坏且无法修复时会停止启动,避免退回 HTTP。
|
|
259
259
|
|
|
260
260
|
使用建议:
|
|
261
261
|
|
|
@@ -264,9 +264,13 @@ https://<name>.termdock.local:9834
|
|
|
264
264
|
termdock --set-password
|
|
265
265
|
|
|
266
266
|
# 2. 自动准备本地 HTTPS 证书
|
|
267
|
-
#
|
|
267
|
+
# 优先使用已安装的 mkcert;缺失时将固定版本官方二进制校验后安装到用户目录
|
|
268
|
+
# 支持 Linux x64/ARM64/ARM、macOS Intel/Apple Silicon,无需 Homebrew 或 root
|
|
268
269
|
termdock --setup-local-https
|
|
269
270
|
|
|
271
|
+
# 只生成证书,不修改本机信任库(容器、无 sudo 的服务器或手动管理信任时)
|
|
272
|
+
termdock --setup-local-https --no-install-ca
|
|
273
|
+
|
|
270
274
|
# 3. 正常启动;如果 ~/.termdock/certs/ 下已有证书,会自动启用 HTTPS
|
|
271
275
|
termdock
|
|
272
276
|
|
|
@@ -282,6 +286,15 @@ termdock --status
|
|
|
282
286
|
~/.termdock/certs/rootCA.pem
|
|
283
287
|
```
|
|
284
288
|
|
|
289
|
+
首次自动安装的 mkcert 位于 `~/.termdock/bin/mkcert`。证书在临时目录中生成,
|
|
290
|
+
校验证书与私钥、CA 签名及域名/IP 后才替换现有文件;后台续签保留原 CA。
|
|
291
|
+
不要分发 mkcert CAROOT 中的 `rootCA-key.pem`,客户端只需要公开的 `rootCA.pem`。
|
|
292
|
+
|
|
293
|
+
证书生成和本机信任是两个步骤。交互配置可提示管理员授权;无界面且无 root/
|
|
294
|
+
免密码 sudo 时跳过信任安装并给出补办命令,不等待密码。Linux 浏览器信任通常
|
|
295
|
+
还需要 `certutil`:Debian/Ubuntu 的包名为 `libnss3-tools`,Fedora/RHEL 为
|
|
296
|
+
`nss-tools`,Arch 为 `nss`,openSUSE 为 `mozilla-nss-tools`。其他设备仍需分别安装并信任 CA。
|
|
297
|
+
|
|
285
298
|
也可以手动覆盖证书路径:
|
|
286
299
|
|
|
287
300
|
```bash
|
|
@@ -361,6 +374,10 @@ td plugin-remove my-agent
|
|
|
361
374
|
|
|
362
375
|
`plugin-install/update/remove` 管理完整插件包;`plugin-hooks` 只管理写入 Agent 原生配置文件的 Termdock hook 条目,两者生命周期互相独立。设置界面提供相同操作。
|
|
363
376
|
|
|
377
|
+
插件来源支持公开及自建 Git 服务,包括 HTTPS、HTTP、`ssh://git@git.internal:2222/team/plugin.git` 和 `git@git.internal:team/plugin.git`,也支持嵌套分组路径。拉取和检查更新均由当前连接的 Termdock 服务电脑执行,沿用该用户的 Git credential helper、SSH 配置与 agent、代理和 CA 配置;远程连接时,浏览器所在电脑的密钥不会自动出现在服务电脑上。Git 操作不等待终端密码输入,已有凭证或 SSH agent 必须可用。管理员可用 `TERMDOCK_PLUGIN_GIT_HOSTS` 指定允许的主机列表;未设置时不限制托管域名。
|
|
378
|
+
|
|
379
|
+
安装插件后,用 `td plugin-list --json` 核对注册结果,再按需运行 `td plugin-hooks <slug> install`。Codex 的新 Hook 还须在 `/hooks` 中获准执行;设置页会区分“待授权”和“运行状态未确认”,不会只凭配置文件存在就认为已生效。终端也接受 OSC 7501 程序状态报告,显示运行、等待、完成及错误;该通道不修改 Agent 活动计数或发送 Hook 通知。
|
|
380
|
+
|
|
364
381
|
安全上,安装插件只会注册声明式能力,不会自动安装 hooks,也不会因打开设置页就执行插件的模型探测命令。只有用户启用该插件的自动标题后,才会调用它声明的 CLI。插件 hook 目标必须是用户目录内、不经过符号链接的 JSON 文件;实际 hook 命令由 Termdock 生成,插件不能注入任意 shell。仍应只安装你信任且审查过的仓库。
|
|
365
382
|
|
|
366
383
|
自动标题插件必须区分“始终传入的参数”和“选中模型后才传入的整组参数”。例如 TraeX 使用 `-c model="..."` 时:
|
|
@@ -492,7 +509,8 @@ termdock/
|
|
|
492
509
|
│ ├── routes/ # 终端、文件与其他业务路由
|
|
493
510
|
│ ├── agent/ # Agent 适配、协作与定时任务
|
|
494
511
|
│ └── federation/ # 服务身份、加密传输与中继
|
|
495
|
-
├── desktop/ # Electron
|
|
512
|
+
├── desktop/ # 旧 Electron 兼容客户端与共享桌面 UI
|
|
513
|
+
├── desktop-rust/ # Rust/Tauri macOS 正式客户端
|
|
496
514
|
├── public/ # 图标、字体与 Service Worker
|
|
497
515
|
├── docs/ # 功能与开发文档
|
|
498
516
|
├── scripts/ # 构建与维护脚本
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{a$ as N,c4 as Vn,aW as Gt,dF as Yn,af as Hn,as as Wn,dg as Kn,eu as he,er as Qn,bR as sn,cq as n,eJ as Xn,ez as Gn,cv as Jn,ae as zt,eq as Zn,cF as Kt,A as Pr,D as Qt,dl as Lr,e9 as es,X as ts,x as _e,R as rs,a5 as ns,p as ss,a8 as Ur,g as zr,ad as ct,c as is,O as as,ax as an,cw as os,e8 as cs,C as ls,aS as ds}from"./app-CovJYQoW.js";import{b as c,r as lt}from"./dnd-BCFAPC0L.js";import{v as us}from"./v4-EwEgHOG0.js";import{R as hs,H as fs}from"./RecordingSaveDialog-CoRGi97z.js";import{U as ps,K as ms}from"./unplug-CnZtWzVW.js";import{C as xs}from"./circle-xgKDXpwG.js";const ys=[["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"}]],gs=N("bell",ys);const bs=[["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"}]],vs=N("camera",bs);const ws=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M12 3v18",key:"108xh3"}]],Br=N("columns-2",ws);const Ss=[["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"}]],Es=N("grip-vertical",Ss);const ks=[["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"}]],Cs=N("layers",ks);const Ns=[["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"}]],Rs=N("maximize",Ns);const As=[["path",{d:"M5 12h14",key:"1ays0h"}]],Ds=N("minus",As);const Ms=[["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"}]],js=N("minimize",Ms);const Ts=[["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"}]],Is=N("monitor-smartphone",Ts);const _s=[["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"}]],Os=N("panel-right-close",_s);const Ps=[["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"}]],Ls=N("panel-right-open",Ps);const Us=[["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"}]],zs=N("plug",Us);const Bs=[["path",{d:"M12 2v10",key:"mnfbl"}],["path",{d:"M18.4 6.6a9 9 0 1 1-12.77.04",key:"obofu9"}]],Fs=N("power",Bs);const $s=[["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"}]],qs=N("rotate-cw",$s);const Vs=[["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"}]],Ys=N("send",Vs);const Hs=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}]],on=N("square",Hs);const Ws=[["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"}]],Ks=N("volume-1",Ws);const Qs=[["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"}]],Xs=N("volume-2",Qs);function Gs(i,t){return Vn(i,t).map(r=>r.device)}const Fr=Gt(i=>({overlay:"off",setOverlay:t=>i({overlay:t})}));function Js(i){let t=1,r="terminal";for(;;){let s=!1;for(const u of i.values())if(u.name===r){s=!0;break}if(!s)break;r=`terminal-${t}`,t++}return r}const Zs=Gt((i,t)=>({sessions:new Map,activeSessionId:null,nextSessionNumber:1,createSession:r=>{const s=us(),u=Date.now(),h=t().sessions,p=Js(h),y={id:s,cwd:r,sessionId:null,name:p,customName:!1,createdAt:u,lastActivity:u};return i(d=>{const E=new Map(d.sessions);return E.set(s,y),{sessions:E,activeSessionId:d.activeSessionId??s,nextSessionNumber:d.nextSessionNumber+1}}),s},closeSession:r=>{i(s=>{const u=new Map(s.sessions),h=s.activeSessionId===r;u.delete(r);let p=s.activeSessionId;if(h){const y=Array.from(u.keys());p=y.length>0?y[0]:null}return{sessions:u,activeSessionId:p}})},switchSession:r=>{i(s=>s.sessions.has(r)?{activeSessionId:r}:s)},updateSession:(r,s)=>{i(u=>{const h=u.sessions.get(r);if(!h)return u;const p=new Map(u.sessions);return p.set(r,{...h,...s,lastActivity:Date.now()}),{sessions:p}})},setTerminalSession:(r,s)=>{t().updateSession(r,{sessionId:s.sessionId})},getActiveSession:()=>{const r=t();if(r.activeSessionId)return r.sessions.get(r.activeSessionId)},getSessionCount:()=>t().sessions.size,clearAllSessions:()=>{i({sessions:new Map,activeSessionId:null,nextSessionNumber:1})}})),ei=[7e5,1e6,14e5,18e5,24e5,32e5,4e6,5e6,6e6,8e6,1e7,12e6].map(i=>({id:"auto",maxSize:1600,bitRate:i,maxFps:30}));class ti{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 ei[this.level]}connected(t){this.connectedAt=t,this.badSince=this.goodSince=null,this.lastSample=-1/0}sample(t,r,s=1600){if(r-this.lastSample>2500&&(this.badSince=this.goodSince=null),this.lastSample=r,t.rttMs!==null&&(this.baselineRtt=Math.min(this.baselineRtt,t.rttMs)),r-this.connectedAt<3e3)return null;const u=t.rttMs!==null&&t.rttMs>this.baselineRtt+150,h=t.deliveryDelayMs>250||t.decodeQueue>=4||u&&t.frames>0&&t.deliveryDelayMs>100,p=t.deliveryDelayMs>800||t.decodeQueue>=8,y=t.rttMs!==null&&t.rttMs<this.baselineRtt+100&&t.deliveryDelayMs<80&&t.decodeQueue<=1;this.badSince=h?this.badSince??r:null,this.goodSince=y?this.goodSince??r:null;const d=s<=1080?7:s<=1600?9:11;if(this.badSince!==null&&r-this.badSince>=(p?1e3:2e3)&&r-this.lastChange>=(p?2e3:3e3)&&this.level>0){this.level=Math.max(0,this.level-(p?2:1));const E=r-this.lastUpgrade<2e4;this.failedProbes=E?this.failedProbes+1:0,this.upgradeAfter=r+(E?Math.min(3e4,8e3*2**(this.failedProbes-1)):5e3),this.lastUpgrade=-1/0}else if(this.goodSince!==null&&r-this.goodSince>=3e3&&r-this.lastChange>=4e3&&r>=this.upgradeAfter&&this.level<d)this.level++,this.lastUpgrade=r;else return null;return this.lastChange=r,this.badSince=this.goodSince=null,this.quality}}const ri=0,ni=1,si=2,ii=3,ai=4,oi=5,ci=7,li=10,di=11,ui=16,Bt=17,$r=0,Ft=1,hi=2,qr=3,$t=0,Vr=1,Yr=1,ye=0xffffffffffffffffn,dt=0xfffffffffffffffen,Oe={HOME:3,APP_SWITCH:187,POWER:26,VOLUME_UP:24,VOLUME_DOWN:25};function cn(i,t,r){i.setUint32(t,Math.max(0,Math.round(r.x))&4294967295),i.setUint32(t+4,Math.max(0,Math.round(r.y))&4294967295),i.setUint16(t+8,Math.min(65535,Math.round(r.screenWidth))),i.setUint16(t+10,Math.min(65535,Math.round(r.screenHeight)))}function fi(i,t,r,s,u,h){const p=new Uint8Array(32),y=new DataView(p.buffer);return y.setUint8(0,si),y.setUint8(1,i),y.setBigUint64(2,t),cn(y,10,r),y.setUint16(22,Math.max(0,Math.min(65535,Math.round(s*65536)))),y.setUint32(24,u>>>0),y.setUint32(28,h>>>0),p}function qt(i,t,r=0,s=0){const u=new Uint8Array(14),h=new DataView(u.buffer);return h.setUint8(0,ri),h.setUint8(1,i),h.setUint32(2,t>>>0),h.setUint32(6,r>>>0),h.setUint32(10,s>>>0),u}function pi(i,t,r,s=0){const u=new Uint8Array(21),h=new DataView(u.buffer);h.setUint8(0,ii),cn(h,1,i);const p=y=>Math.max(-32768,Math.min(32767,Math.round(Math.max(-1,Math.min(1,y/16))*32768)));return h.setInt16(13,p(t)),h.setInt16(15,p(r)),h.setUint32(17,s>>>0),u}function mi(i){const t=new TextEncoder().encode(i);if(!t.length)return null;const r=t.subarray(0,300),s=new Uint8Array(5+r.length),u=new DataView(s.buffer);return u.setUint8(0,ni),u.setUint32(1,r.length),s.set(r,5),s}function xi(i){const t=new TextEncoder().encode(i);if(!t.length||t.length>255)return null;const r=new Uint8Array(2+t.length);return r[0]=ui,r[1]=t.length,r.set(t,2),r}function Pe(i){return new Uint8Array([i])}function Hr(i){return new Uint8Array([ai,i])}function yi(i){return new Uint8Array([li,i?1:0])}function gi(i){let t="";for(let r=0;r<i.length;r+=32768)t+=String.fromCharCode(...i.subarray(r,r+32768));return btoa(t)}function bi(i){const t=atob(i),r=new Uint8Array(t.length);for(let s=0;s<t.length;s++)r[s]=t.charCodeAt(s);return r}function Vt(i){return i.toString(16).padStart(2,"0")}function ln(i,t,r){for(let s=0;s+4<i.length;s++){const u=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:u?s+3:-1;if(p<0||p>=i.length)continue;if((r?i[p]>>1&63:i[p]&31)!==t){s=p-1;continue}let d=p+1;for(;d+2<i.length&&!(i[d]===0&&i[d+1]===0&&(i[d+2]===1||i[d+2]===0&&i[d+3]===1));)d++;return i.subarray(p,Math.min(i.length,d))}return null}function vi(i){const t=i?ln(i,7,!1):null;return t&&t.length>=4?`avc1.${Vt(t[1])}${Vt(t[2])}${Vt(t[3])}`:"avc1.42e01e"}function wi(i){const t=i?ln(i,32,!0):null;if(t&&t.length>=13){const r=t[1]>>6&3,s=t[1]&31,u=t[12];return`hev1.${r}.${s}.L${u}.B0`}return"hev1.1.6.L120.B0"}class Si{constructor(t,r){this.canvas=t,this.callbacks=r}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(r=>{const s=++this.bitrateRequestId,u=setTimeout(()=>this.finishBitrate(!1,`BITRATE_CLIENT_TIMEOUT: requested=${t} bps; no server confirmation within 4000ms`),4e3);this.bitratePending={id:s,value:t,resolve:r,timer:u},this.send({type:"bitrate",requestId:s,bitRate:t})})}finishBitrate(t,r){const s=this.bitratePending;s&&(this.bitratePending=null,clearTimeout(s.timer),t||(this.liveBitrate=!1,this.bitrateFailureDetail=r??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,r){this.liveBitrate=!1,this.bitrateFailureDetail=void 0,this.serial=t,this.autoQuality=r?.id==="auto",this.closedByUser=!1,this.failureReason=null,this.callbacks.onState("connecting");let s;try{s=Yn(Hn(t,r))}catch(u){this.reportError(u instanceof Error?u.message:"ANDROID_STREAM_FAILED");return}this.socket=s,s.onopen=()=>{this.lastMessageAt=Date.now()},s.onmessage=u=>{this.closedByUser||this.handleMessage(u.data)},s.onerror=()=>{!this.closedByUser&&!this.failureReason&&this.reportError("SCRCPY_CONNECTION_LOST")},s.onclose=u=>{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=${u.code}${u.reason?`: ${u.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(Pe(Bt)))},2e3),this.statsTimer=setInterval(()=>{const t=Date.now(),r=(t-this.lastSampleAt)/1e3;r<=0||(this.callbacks.onStats({fps:Math.round(this.frameCount/r*10)/10,kbps:Math.round(this.bytesSinceSample*8/r/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]===Bt)||(this.controlsSent++,this.send({type:"control",data:gi(t)}))}ack(){this.send({type:"ack",seq:this.lastSeq})}handleMessage(t){if(typeof t!="string")return;this.lastMessageAt=Date.now();let r;try{r=JSON.parse(t)}catch{return}this.lastType=`${r.type??"?"}${r.config?":cfg":""}${r.key?":key":""}`;try{this.dispatchMessage(r)}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 r=bi(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=r,this.pendingConfig=r,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 u=t.key===!0;if(this.needsKeyframe&&!u){this.ack();return}let h=r;this.pendingConfig&&(h=new Uint8Array(this.pendingConfig.length+r.length),h.set(this.pendingConfig,0),h.set(r,this.pendingConfig.length),this.pendingConfig=null),u&&(this.needsKeyframe=!1),this.decode(h,u,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(Pe(Bt)))}})}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 r={codec:"avc1.42e01e",optimizeForLatency:!0};let s;t==="h264"?(s=[vi(this.configData),"avc1.42e01e","avc1.4d401e","avc1.64001f"].filter((p,y,d)=>d.indexOf(p)===y),r.avc={format:"annexb"}):t==="h265"?(s=[wi(this.configData),"hev1.1.6.L120.B0","hvc1.1.6.L120.B0"],r.hevc={format:"annexb"}):s=["av01.0.04M.08"];const u=[];for(const h of s)try{this.decoder.configure({...r,codec:h}),this.configured=!0,this.needsKeyframe=!0,h!==s[0]&&console.warn("[android] decoder configured with fallback codec",h);return}catch(p){u.push(`${h}: ${p instanceof Error?p.message:String(p)}`),console.warn("[android] decoder configure failed",h,p)}this.callbacks.onWarning(`解码器配置失败(${u.join(";")})`),this.reportError("VIDEO_DECODER_UNSUPPORTED")}decode(t,r,s){if(!(!this.decoder||this.decoder.state!=="configured"))try{this.decoder.decode(new EncodedVideoChunk({type:r?"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(u){this.decodeFailureCount++<3&&(console.warn("[android] decode threw",u),this.callbacks.onWarning(`送入解码器失败:${u instanceof Error?u.message:String(u)}`))}}decoderRecovering=!1;decodeFailureCount=0;lastTimestamp=0;onDecodedFrame(t){if(this.closedByUser){t.close();return}this.frameCount++,this.decodedFrames++;const r=t.displayWidth||t.codedWidth,s=t.displayHeight||t.codedHeight,u=this.canvas;(u.width!==r||u.height!==s)&&(u.width=r,u.height=s,this.header&&(this.header={...this.header,width:r,height:s},this.callbacks.onHeader(this.header)));const h=u.getContext("2d");h&&h.drawImage(t,0,0,u.width,u.height),t.close(),this.decoderRecovering&&(this.decoderRecovering=!1,this.failureReason=null,this.callbacks.onState("streaming"))}pointerPoint(t,r){return{x:t,y:r,screenWidth:this.header?.width??0,screenHeight:this.header?.height??0}}touch(t,r,s,u){const h=t===Ft||t===qr,p=h?0:1,y=u===ye&&!h?Yr:0,d=(t===$r||t===Ft)&&u===ye?Yr:0;this.sendControl(fi(t,u,this.pointerPoint(r,s),p,d,y))}pointerDown(t,r,s){this.touch($r,t,r,s==="mouse"?ye:dt)}pointerMove(t,r,s){this.touch(hi,t,r,s==="mouse"?ye:dt)}pointerUp(t,r,s){this.touch(Ft,t,r,s==="mouse"?ye:dt)}pointerCancel(t,r,s){this.touch(qr,t,r,s==="mouse"?ye:dt)}scroll(t,r,s,u){this.sendControl(pi(this.pointerPoint(t,r),s,u))}key(t,r=$t){this.sendControl(qt(r,t))}tapKey(t){this.sendControl(qt($t,t)),this.sendControl(qt(Vr,t))}back(){this.sendControl(Hr($t)),this.sendControl(Hr(Vr))}home(){this.tapKey(Oe.HOME)}recents(){this.tapKey(Oe.APP_SWITCH)}power(){this.tapKey(Oe.POWER)}volumeUp(){this.tapKey(Oe.VOLUME_UP)}volumeDown(){this.tapKey(Oe.VOLUME_DOWN)}rotate(){this.sendControl(Pe(di))}expandNotifications(){this.sendControl(Pe(oi))}collapsePanels(){this.sendControl(Pe(ci))}setDisplayPower(t){this.sendControl(yi(t))}sendText(t){this.sendControl(mi(t))}startApp(t){this.sendControl(xi(t))}}function Ei(){try{return crypto.randomUUID().slice(0,8)}catch{return Math.random().toString(36).slice(2,10)}}function ki(){return`termdock-mirror-shot-${new Date().toISOString().replace(/[-:T]/g,"").slice(0,14)}-${Ei()}.png`}function Wr(i){const t=Math.max(0,Math.floor(i/1e3)),r=Math.floor(t/60),s=t%60;return`${String(r).padStart(2,"0")}:${String(s).padStart(2,"0")}`}async function Ci(i,t=ki()){const r=i.width,s=i.height;if(!r||!s)throw new Error("投屏画面尚未就绪");const u=document.createElement("canvas");u.width=r,u.height=s;const h=u.getContext("2d");if(!h)throw new Error("无法读取投屏画面");h.drawImage(i,0,0);const p=await new Promise(y=>u.toBlob(y,"image/png"));if(!p||p.size===0)throw new Error("截图失败,请重试");return new File([p],t,{type:"image/png"})}function dn(i,t,r){const s=r.contentWidth*(t-1)/2,u=r.contentHeight*(t-1)/2;return{x:Math.max(-s,Math.min(s,i.x)),y:Math.max(-u,Math.min(u,i.y))}}function Kr(i,t,r,s,u){const h=Math.max(1,Math.min(8,i.zoom*u)),p=h/i.zoom;return{zoom:h,pan:dn({x:s.x-t.cx-(r.x-t.cx-i.pan.x)*p,y:s.y-t.cy-(r.y-t.cy-i.pan.y)*p},h,t)}}async function un(i,t,r){if(!t)throw new Error("没有可接收内容的终端");if(!await Kn(i,t,()=>!0,r))throw new Error("目标终端不可用,内容尚未插入,请连接终端后重试")}function Qr(i,t,r){return un(Wn(i,null),t,r)}const Xt=new Map;function Ni(i,t){Xt.set(i,t)}function Ri(i,t){const r=Xt.get(i.id)??t;r?.(i),r&&Xt.delete(i.id)}const Yt=Gt(i=>({pending:[],enqueue:(t,r,s="/",u)=>i(h=>h.pending.some(p=>p.file.id===t.id)?h:{pending:[...h.pending,{file:t,sessionId:r,initialPath:s,insert:u}]}),remove:t=>i(r=>({pending:r.pending.filter(s=>s.file.id!==t)}))})),ge="android-mirror",Le=ge,hn="termdock:android:quality:v1",Ht=176,Ai=204,X=1,mt=8,Xr=[1,1.25,1.5,2,2.5,3,4,6,8],Di=i=>Math.max(X,Math.min(mt,i));function Mi(i){return`${Number.isInteger(i)?i:i.toFixed(1)}×`}function ut(i){const t=i.parentElement;if(!t)return null;const r=t.getBoundingClientRect(),s=getComputedStyle(t),u=parseFloat(s.paddingLeft)||0,h=parseFloat(s.paddingTop)||0,p=t.clientWidth-u-(parseFloat(s.paddingRight)||0),y=t.clientHeight-h-(parseFloat(s.paddingBottom)||0);return{cx:r.left+t.clientLeft+u+p/2,cy:r.top+t.clientTop+h+y/2,width:p,height:y,contentWidth:i.offsetWidth,contentHeight:i.offsetHeight}}function ji(i,t){try{i.setPointerCapture?.(t)}catch{}}function Gr(i,t){try{i.releasePointerCapture?.(t)}catch{}}const Jr=i=>typeof requestAnimationFrame=="function"?requestAnimationFrame(i):window.setTimeout(i,16),ht=i=>{typeof cancelAnimationFrame=="function"?cancelAnimationFrame(i):window.clearTimeout(i)},Wt={auto:"android.qualityAuto",low:"android.qualityLow",medium:"android.qualityMedium",high:"android.qualityHigh",custom:"android.qualityCustom"},Ti=()=>{try{const i=localStorage.getItem(hn);return i?Kt(JSON.parse(i)):Qt}catch{return Qt}},Ue=i=>{try{localStorage.setItem(hn,JSON.stringify(i))}catch{}};function fn({sessionId:i,dockOnly:t=!1,onInsertPrompt:r,onInsertFile:s,onRecordingComplete:u,onCloseTab:h}){const p=Xn(),y=c.useRef(p);y.current=p;const{t:d}=Gn(),E=Fr(e=>e.overlay),w=Fr(e=>e.setOverlay),b=c.useRef(null),g=c.useRef(null),be=c.useRef(null),k=c.useRef(null),ze=c.useRef(!1),[Be,pn]=c.useState(!!p),ve=c.useMemo(Ti,[]),V=c.useRef(ve),ie=c.useRef(null),Fe=c.useRef(null),[Jt,Zt]=c.useState(4e6),G=c.useRef(null),D=c.useRef(new Map),Y=c.useRef(null),$e=c.useRef(!1),[xt,qe]=c.useState(X),I=c.useRef(xt),H=c.useRef({x:0,y:0}),er=c.useRef(null),W=c.useRef(0),Ve=c.useRef(0),yt=c.useRef(null),fe=c.useRef(0),[P,mn]=c.useState(null),[J,gt]=c.useState(null),[xn,tr]=c.useState(!0),[m,we]=c.useState(""),[Z,pe]=c.useState(ve.id),[K,bt]=c.useState([]),[L,ae]=c.useState(null),[Ye,rr]=c.useState(""),[vt,wt]=c.useState(!0),[R,oe]=c.useState({maxSize:ve.maxSize,bitRate:ve.bitRate,maxFps:ve.maxFps}),[U,nr]=c.useState("idle"),[St,Et]=c.useState(null),[Se,He]=c.useState(null),[kt,Ct]=c.useState(null),[ce,yn]=c.useState({fps:0,kbps:0,width:0,height:0,received:0,decoded:0,controls:0,last:""}),[ee,We]=c.useState(null),[sr,ir]=c.useState(null),[Nt,Rt]=c.useState(null),[gn,ar]=c.useState([]),[Ee,ke]=c.useState(null),[Ke,Ce]=c.useState([]),[bn,Ne]=c.useState(!1),Re=c.useRef(null),vn=c.useRef(0),Ae=c.useRef([]),[Qe,or]=c.useState(!1),[cr,lr]=c.useState(""),[dr,ur]=c.useState(!1),[At,wn]=c.useState(!1),[Dt,hr]=c.useState(""),[Mt,fr]=c.useState(null),[pr,te]=c.useState(null),[z,Xe]=c.useState(!1),[Sn,mr]=c.useState(0),$=c.useRef(null),Ge=c.useRef(null),[xr,Je]=c.useState(!1),re=c.useRef(!1),yr=c.useRef(new Set),jt=c.useRef(null),me=c.useRef(null),Tt=c.useRef(!1),[De,gr]=c.useState(!1),Me=c.useRef(u);Me.current=u;const[xe,ne]=c.useState(!1),[It,En]=c.useState(null),_t=c.useRef(null),br=c.useRef(null),kn=Zs(e=>e.activeSessionId??e.sessions.keys().next().value??null),Ot=i??kn,B=he(e=>!!e.docks[Le]),Ze=he(e=>e.hosts[Le]),Pt=he(e=>e.setDock),je=c.useRef(0);c.useEffect(()=>()=>{je.current++},[]);const se=c.useCallback(async()=>{const e=++je.current;tr(!0);try{const a=await Jn();return e!==je.current?void 0:(mn(a),gt(null),a)}catch(a){e===je.current&>(a instanceof Error?a.message:"ADB_UNAVAILABLE")}finally{e===je.current&&tr(!1)}},[]);c.useEffect(()=>{se()},[se]);const Te=c.useMemo(()=>Gs(P?.devices??[],m),[P?.devices,m]),le=Te.find(e=>e.serial===m)??null,et=!!(J&&/ADB_NOT_FOUND|ADB_UNAVAILABLE/i.test(J)),vr=!!(P?.adbAvailable&&!P.scrcpyVersion),T=c.useCallback(()=>{const e=G.current,a=[...D.current.keys()];G.current=null,D.current.clear(),Y.current=null,$e.current=!1,Re.current=null,ht(W.current),W.current=0,e&&g.current?.pointerCancel(e.x,e.y,e.type);const o=b.current;if(o)for(const l of a)Gr(o,l);ke(null),Ne(!1),Ce([]),qe(I.current)},[]);c.useEffect(()=>{const e=l=>{D.current.has(l.pointerId)&&(l.type==="pointercancel"||l.target!==b.current)&&T()},a=()=>T(),o=()=>{document.hidden&&T()};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),T()}},[T]);const Cn=c.useCallback(()=>{T(),g.current?.disconnect(),g.current=null,nr("idle"),Et(null),He(null),Ct(null)},[T]),_=c.useCallback((e,a=!1)=>{const o=b.current;if(!o||!e)return;T(),g.current?.disconnect(),Et(null),be.current!==e&&(He(null),fe.current=0),!a&&be.current!==e&&Ct(null),be.current=e,ir(null),We(null);const l=new Si(o,{onBitrateSupport:(x,v)=>{g.current!==l||V.current.id!=="auto"||We(x?null:v??"BITRATE_REASON_UNAVAILABLE")},onState:(x,v)=>{g.current===l&&(nr(x),Et(v??null),x==="error"?He(v||"SCRCPY_ERROR"):x==="streaming"&&He(null))},onHeader:x=>{g.current===l&&Ct(x)},onStats:x=>{g.current===l&&yn(x)},onWarning:x=>{g.current===l&&ir(x)}});l.setReadOnly(!!y.current&&zt(y.current.android,e)!=="control"),g.current=l;let f=V.current;f.id==="auto"?(ie.current?.serial!==e&&(ie.current={serial:e,policy:new ti}),ie.current.policy.connected(performance.now()),f=ie.current.policy.quality,Zt(f.bitRate)):ie.current=null,Fe.current=f,l.connect(e,f)},[T]);c.useEffect(()=>{if(Z!=="auto"||V.current.id!=="auto"||U!=="streaming"||!ce.adaptation||document.hidden)return;const e=ie.current,a=g.current;if(!e||e.serial!==m||!a?.canSetBitrate)return;const o=b.current,l=o?Math.max(o.clientWidth,o.clientHeight)*(window.devicePixelRatio||1)*I.current:1600,f=e.policy.sample(ce.adaptation,performance.now(),l||1600);f&&a.setBitrate(f.bitRate).then(x=>{x&&g.current===a&&(Fe.current=f,Zt(f.bitRate))})},[ce,Z,U,m,_]);const j=c.useCallback(e=>{if(y.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}:{},...e.devicePhysicalId!==void 0?{devicePhysicalId:e.devicePhysicalId}:{}};Zn({androidPanel:a}).catch(()=>{})},[]);c.useEffect(()=>{let e=!1;if(!y.current)return sn().then(a=>{if(e)return;const o=a.androidPanel;if(o?.quality){const l=Kt(o.quality);V.current=l,pe(l.id),oe({maxSize:l.maxSize,bitRate:l.bitRate,maxFps:l.maxFps}),Ue(l)}bt(o?.presets??[]),ae(o?.activePresetId??null),o?.deviceSerial&&!ze.current&&(k.current=o.devicePhysicalId||null,yt.current=o.deviceSerial,we(o.deviceSerial))}).catch(()=>{}).finally(()=>{e||pn(!0)}),()=>{e=!0}},[]);const Nn=c.useCallback(e=>{const a=++vn.current;ar(l=>[...l,{id:a,left:e.left,top:e.top}]);const o=window.setTimeout(()=>{ar(l=>l.filter(f=>f.id!==a)),Ae.current=Ae.current.filter(l=>l!==o)},300);Ae.current.push(o)},[]),tt=c.useCallback((e,a)=>{const o=g.current,l=Fe.current;o?.supportsLiveBitrate&&be.current===e&&l&&l.maxSize===a.maxSize&&l.maxFps===a.maxFps?o.setBitrate(a.bitRate).then(f=>{g.current===o&&(f?(Fe.current=a,We(null)):We(o.lastBitrateFailure??"BITRATE_REASON_UNAVAILABLE"))}):_(e)},[_,d]),Rn=c.useCallback(e=>{if(ie.current=null,e.startsWith("user:")){const o=K.find(f=>f.id===e.slice(5));if(!o)return;const l={id:"custom",maxSize:o.maxSize,bitRate:o.bitRate,maxFps:o.maxFps};V.current=l,pe("custom"),ae(o.id),oe({maxSize:o.maxSize,bitRate:o.bitRate,maxFps:o.maxFps}),wt(!0),Ue(l),j({quality:l,activePresetId:o.id}),m&&_(m);return}if(e==="custom"){const o=V.current;pe("custom"),ae(null),oe({maxSize:o.maxSize,bitRate:o.bitRate,maxFps:o.maxFps}),wt(!0);return}const a=e==="auto"?Kt({id:"auto"}):Pr.find(o=>o.id===e)??Qt;V.current=a,pe(a.id),ae(null),Ue(a),j({quality:a,activePresetId:null}),m&&_(m)},[_,m,K,j]),An=c.useCallback(()=>{const e={id:"custom",maxSize:R.maxSize,bitRate:R.bitRate,maxFps:R.maxFps};V.current=e,Ue(e),j({quality:e,activePresetId:null}),pe("custom"),ae(null),m&&tt(m,e)},[tt,m,R,j]),wr=c.useCallback(()=>{const e=Ye.trim();if(!e)return;const a=`p${Date.now().toString(36)}${Math.random().toString(36).slice(2,6)}`,o={id:a,name:e,maxSize:R.maxSize,bitRate:R.bitRate,maxFps:R.maxFps},l=[...K.filter(x=>x.name!==e),o].slice(-12),f={id:"custom",maxSize:R.maxSize,bitRate:R.bitRate,maxFps:R.maxFps};bt(l),rr(""),ae(a),pe("custom"),V.current=f,Ue(f),j({quality:f,activePresetId:a,presets:l}),m&&tt(m,f)},[Ye,R,K,m,tt,j]),Dn=c.useCallback(()=>{if(!L)return;const e=K.filter(a=>a.id!==L);bt(e),ae(null),j({activePresetId:null,presets:e})},[L,K,j]);c.useEffect(()=>()=>{g.current?.disconnect(),g.current=null;for(const e of Ae.current)window.clearTimeout(e);Ae.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(()=>{if(!P||!Be&&!ze.current)return;const e=Lr(P.devices,m,k.current);if(!e){P.devices.some(l=>l.serial===m&&l.physicalId&&k.current&&l.physicalId!==k.current)&&(g.current?.disconnect(),we(""));return}const a=k.current!==(e.physicalId||null);k.current=e.physicalId||null,e.serial!==m&&(yt.current=e.serial,we(e.serial)),(e.serial!==m||a)&&j({deviceSerial:e.serial,devicePhysicalId:e.physicalId||null})},[P,m,Be,j]);const rt=!!P?.devices.some(e=>e.serial===m&&e.state==="device"&&(!k.current||e.physicalId===k.current));c.useEffect(()=>{if(!m||!rt){g.current?.disconnect();return}_(m)},[m,rt,_]),c.useEffect(()=>{if(rt||!Be||!m&&!k.current||J&&/NOT_ALLOWED|DENIED|UNAUTHORIZED|403/i.test(J))return;const e=()=>{document.hidden||se()},a=window.setInterval(e,3e3);return window.addEventListener("online",e),document.addEventListener("visibilitychange",e),()=>{window.clearInterval(a),window.removeEventListener("online",e),document.removeEventListener("visibilitychange",e)}},[rt,m,Be,J,se]),c.useEffect(()=>{if(U==="streaming"&&(fe.current=0),U!=="error"||!m||!Oi(St??"")){Rt(null);return}const e=Math.min(8e3,700*2**fe.current),a=fe.current+1;Rt({attempt:a,delayMs:e});let o=!1;const l=window.setTimeout(()=>{fe.current=a,Rt(null),se().then(f=>{if(o||!f)return;const x=Lr(f.devices,m,k.current);x?.serial===m&&x.state==="device"&&_(m)})},e);return()=>{o=!0,window.clearTimeout(l)}},[U,St,m,_,se]);const Sr=c.useCallback((e,a,o)=>{const l=b.current,f=o??(l?ut(l):null);return!l||!f?{x:0,y:0}:dn(e,a,f)},[]),O=c.useCallback(()=>{const e=b.current;if(!e)return;const{x:a,y:o}=H.current,l=I.current,f=l===X&&a===0&&o===0?"":`translate3d(${a}px, ${o}px, 0) scale(${l})`;e.style.transform!==f&&(e.style.transform=f);const x=er.current;x&&(x.textContent=l>X?Mi(l):"")},[]),nt=c.useCallback((e,a,o=!0)=>{const l=b.current,f=I.current,x=Di(e);if(!l||x===f)return;const v=ut(l);if(!v)return;const C=a??{x:v.cx,y:v.cy},A=Kr({zoom:f,pan:H.current},v,C,C,x/f);I.current=A.zoom,H.current=A.pan,o&&O()},[O]),Lt=c.useCallback(()=>{const e=I.current;qe(a=>a<=X+.01==e<=X+.01&&a>=mt-.01==e>=mt-.01?a:e)},[]);c.useEffect(()=>()=>{ht(W.current),ht(Ve.current)},[]);const Er=()=>{let e=0,a=0;for(const l of D.current.values())e+=l.x,a+=l.y;const o=D.current.size;return o?{x:e/o,y:a/o}:null},kr=()=>{const[e,a]=Array.from(D.current.values());return e&&a?Math.hypot(e.x-a.x,e.y-a.y):0},Cr=()=>{const e=Er(),a=b.current?ut(b.current):null;!e||!a||(Y.current={startCentroid:e,startDistance:kr(),box:a})},st=c.useCallback(()=>{const e=Y.current,a=Er();if(!e||!a)return;const o=kr(),l=e.startDistance>0&&o>0?o/e.startDistance:1,f=Kr({zoom:I.current,pan:H.current},e.box,e.startCentroid,a,l);I.current=f.zoom,H.current=f.pan,e.startCentroid=a,e.startDistance=o},[]),Mn=c.useCallback(()=>{W.current||(W.current=Jr(()=>{W.current=0,st(),O()}))},[st,O]),it=c.useCallback(()=>{W.current&&(ht(W.current),W.current=0,st(),O())},[st,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||Y.current)return;const C=f.deltaMode===1?16:f.deltaMode===2?e.parentElement?.clientHeight||600:1,A=Math.max(-600,Math.min(600,f.deltaY*C));nt(I.current*Math.exp(-A*.002),{x:f.clientX,y:f.clientY},!1),Ve.current||(Ve.current=Jr(()=>{Ve.current=0,O(),Lt()}));return}const x=g.current;if(!x||f.target!==e)return;f.preventDefault();const v=pt(e,f.clientX,f.clientY);x.scroll(v.x,v.y,f.deltaX,f.deltaY)},l=f=>f.preventDefault();return a.addEventListener("wheel",o,{passive:!1}),a.addEventListener("gesturestart",l,{passive:!1}),a.addEventListener("gesturechange",l,{passive:!1}),()=>{a.removeEventListener("wheel",o),a.removeEventListener("gesturestart",l),a.removeEventListener("gesturechange",l)}},[nt,O,Lt]),c.useEffect(()=>{const e=b.current,a=e?.parentElement;if(!e||!a||typeof ResizeObserver>"u")return;const o=new ResizeObserver(()=>{Y.current&&(Y.current.box=ut(e));const l=Sr(H.current,I.current);l.x===H.current.x&&l.y===H.current.y||(H.current=l,O())});return o.observe(e),o.observe(a),()=>o.disconnect()},[Sr,O]),c.useLayoutEffect(()=>{O()});const jn=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(),Lt(),it(),ji(o,e.pointerId),D.current.set(e.pointerId,{x:e.clientX,y:e.clientY});const l=e.pointerType==="mouse"&&e.altKey;if(D.current.size>=2||l){const v=G.current;v&&(a.pointerCancel(v.x,v.y,v.type),G.current=null,Re.current=null,ke(null),Ne(!1),Ce([])),$e.current=!0,Cr();return}if($e.current)return;const f=pt(o,e.clientX,e.clientY);G.current={id:e.pointerId,type:e.pointerType,x:f.x,y:f.y},a.pointerDown(f.x,f.y,e.pointerType);const x=rn(o,e.clientX,e.clientY);x&&(Re.current={left:x.left,top:x.top},Ce([]),Ne(!1),ke(x))},Tn=e=>{const a=g.current,o=b.current;if(!o||!D.current.has(e.pointerId))return;if(e.pointerType==="mouse"){const C=o.getBoundingClientRect(),A=o.parentElement?.getBoundingClientRect()??C;if(!(e.buttons&1)||e.clientX<Math.max(C.left,A.left)||e.clientX>=Math.min(C.right,A.right)||e.clientY<Math.max(C.top,A.top)||e.clientY>=Math.min(C.bottom,A.bottom)){T();return}}if(e.preventDefault(),D.current.set(e.pointerId,{x:e.clientX,y:e.clientY}),Y.current){Mn();return}const l=G.current;if(!a||!l||l.id!==e.pointerId)return;const f=pt(o,e.clientX,e.clientY);l.x=f.x,l.y=f.y,a.pointerMove(f.x,f.y,l.type);const x=rn(o,e.clientX,e.clientY),v=Re.current;!x||!v||(ke(x),Math.hypot(x.left-v.left,x.top-v.top)>=6&&(Ne(!0),Ce(C=>{const A=C[C.length-1];if(A&&Math.hypot(x.left-A.x,x.top-A.y)<4)return C;const ue=[...C,{x:x.left,y:x.top}];return ue.length>12?ue.slice(ue.length-12):ue})))},In=e=>{const a=g.current,o=b.current;if(!o||!D.current.has(e.pointerId))return;if(it(),D.current.delete(e.pointerId),Gr(o,e.pointerId),D.current.size===0&&($e.current=!1),Y.current){D.current.size===0?(Y.current=null,qe(I.current)):Cr();return}const l=G.current;if(!l||l.id!==e.pointerId)return;const f=pt(o,e.clientX,e.clientY);a?.pointerUp(f.x,f.y,l.type),Ee&&Nn(Ee),ke(null),Ne(!1),window.setTimeout(()=>Ce([]),200),G.current=null,Re.current=null},_n=e=>{if(xe||Qe||At)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)))},Nr=async()=>{const e=cr.trim();if(e){ur(!0);try{const a=await ds(e);lr(""),or(!1),await se(),ze.current=!0,k.current=null,we(a.serial)}catch(a){gt(a instanceof Error?a.message:"ADB_CONNECT_FAILED")}finally{ur(!1)}}},Rr=()=>{const e=g.current,a=Dt;!e||!a||(e.sendText(a),hr(""))},at=c.useCallback(e=>{fr(e),me.current!==null&&window.clearTimeout(me.current),me.current=window.setTimeout(()=>{me.current=null,fr(null)},2500)},[]),Ar=c.useCallback(e=>{const a=I.current,o=e==="in"?Xr.find(l=>l>a+.01):[...Xr].reverse().find(l=>l<a-.01);o!==void 0&&(a<=X&&o>X&&at(d("android.zoomPanHint")),it(),nt(o),qe(o))},[nt,it,at,d]),Dr=(e,a)=>{Promise.resolve().then(()=>r?.(e,a)).catch(o=>{te(o instanceof Error?o.message:String(o))})},On=c.useCallback(async(e,a,o)=>{try{if(!s)throw new Error(d("android.captureUnavailable"));if(await s(e,o)===!1)throw new Error(d("android.captureUnavailable"));at(a)}catch(l){te(d("android.captureFailed")+(l instanceof Error?`:${l.message}`:""))}},[s,at,d]),Pn=async e=>{const a=an(e),o=b.current;if(!(!o||Tt.current)){Tt.current=!0,gr(!0),te(null);try{const l=await Ci(o);if(!a())throw new Error(d("android.captureUnavailable"));await On(l,d("android.captureInserted"),e)}catch(l){te(l instanceof Error?l.message:String(l))}finally{Tt.current=!1,gr(!1)}}},Ie=c.useCallback(e=>{(e.status==="ready"||e.status==="error")&&Me.current&&!yr.current.has(e.id)&&(yr.current.add(e.id),y.current?Me.current(e):Ri(e,Me.current))},[]),Mr=c.useCallback(async e=>{const a=$.current;if(!(!a||re.current)){re.current=!0,Je(!0),te(null);try{const o=await es(a.id);$.current=null,Xe(!1),Ie(o)}catch(o){te(o instanceof Error?o.message:String(o))}finally{re.current=!1,Je(!1)}}},[Ie]),Ln=async()=>{if(!m||re.current||$.current)return;const e=Me.current;re.current=!0,Je(!0),te(null);try{const a=await cs(m);e&&!y.current&&Ni(a.id,e),a.status==="recording"||a.status==="starting"||a.status==="stopping"?($.current=a,Ge.current=k.current,Xe(!0),mr(Math.max(0,Date.now()-a.startedAt))):Ie(a)}catch(a){te(a instanceof Error?a.message:String(a))}finally{re.current=!1,Je(!1)}},Q=!!p&&zt(p.android,m)!=="control",jr=JSON.stringify((P?.devices||[]).filter(e=>e.serial===m||k.current&&e.physicalId===k.current).map(e=>e.serial).sort());c.useEffect(()=>{let e=!1,a=!1;const o=$.current,l=o&&Ge.current&&Ge.current===k.current&&(!y.current||zt(y.current.android,o.serial))?o:null;$.current=l,Xe(!!l);const f=new Set(JSON.parse(jr));m&&f.add(m),l&&f.add(l.serial);const x=async()=>{if(!(!m||a||re.current)){a=!0;try{const C=[...f],A=await Promise.allSettled(C.map(q=>os(q)));if(e||re.current||A.every(q=>q.status==="rejected"))return;const ue=A.flatMap(q=>q.status==="fulfilled"?q.value.recordings:[]),Ut=$.current,qn=Ut&&A[C.indexOf(Ut.serial)]?.status==="rejected",Or=ue.find(q=>["starting","recording","stopping"].includes(q.status))??(qn?Ut:null);Ge.current=k.current,$.current=Or??null,Xe(!!Or);for(const q of ue)Ie(q)}catch{}finally{a=!1}}};x();const v=window.setInterval(()=>{x()},2e3);return jt.current=window.setInterval(()=>{$.current&&mr(Math.max(0,Date.now()-$.current.startedAt))},500),()=>{e=!0,window.clearInterval(v),jt.current!==null&&window.clearInterval(jt.current)}},[m,jr,Ie]),c.useEffect(()=>{if(!xe)return;const e=()=>ne(!1),a=l=>{const f=l.target;f instanceof Node&&(_t.current?.contains(f)||br.current?.contains(f)||e())},o=l=>{l.key==="Escape"&&(l.preventDefault(),l.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)}},[xe]),c.useEffect(()=>()=>{me.current!==null&&window.clearTimeout(me.current)},[]);const M=U==="streaming",S=B,de=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",Un=le?(le.model||le.serial)+nn(le,d):Te.length?d("android.selectDevice"):d("android.noDevices"),zn=(L?K.find(e=>e.id===L):null)?.name??(Z==="auto"?`${d("android.qualityAuto")} · ${Jt/1e6} Mbps`:d(Wt[Z])),Tr=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",Ir=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",_r="absolute inset-0 h-full w-full cursor-pointer opacity-0",Bn=()=>{const e=_t.current?.getBoundingClientRect();e&&En({left:Math.max(8,Math.min(e.right-Ht,window.innerWidth-Ht-8)),top:Math.min(e.bottom+4,Math.max(8,window.innerHeight-Ai-8))}),ne(!0)},Fn=()=>{if(B){Pt(Le,null),j({docked:null});return}if(!Ot)return;const e={sessionId:Ot,side:"right"};Pt(Le,e),j({docked:e})},$n=Qe||B||E!=="off",ot=n.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:_n,tabIndex:-1,children:[n.jsxs("div",{"data-panel-drag-title":B?"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:[B&&n.jsx("span",{"data-panel-drag-title":"true",role:"button","aria-label":d("android.splitDrag"),title:d("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:n.jsx(Es,{size:12})}),n.jsx(ts,{size:S?12:14,className:"shrink-0 text-muted-foreground"}),n.jsxs("div",{className:`${Tr} flex-1`,children:[n.jsx("span",{"aria-hidden":"true",className:`${Ir} w-full`,children:Un}),n.jsxs("select",{value:m,onChange:e=>{const a=e.target.value;ze.current=!0,k.current=P?.devices.find(o=>o.serial===a)?.physicalId||null,we(a),yt.current=a,j({deviceSerial:a||null,devicePhysicalId:k.current})},className:_r,"aria-label":d("android.device"),children:[n.jsx("option",{value:"",children:Te.length?d("android.selectDevice"):d("android.noDevices")}),Te.map(e=>n.jsx("option",{value:e.serial,children:(e.model||e.serial)+nn(e,d)},e.serial))]})]}),n.jsxs("div",{className:`${Tr} max-w-[45%] shrink-0`,children:[n.jsx("span",{"aria-hidden":"true",className:Ir,children:zn}),n.jsxs("select",{value:L?`user:${L}`:Z,onChange:e=>Rn(e.target.value),className:_r,title:d(Z==="auto"?"android.qualityAutoHint":"android.quality"),"aria-label":d("android.quality"),children:[n.jsxs("option",{value:"auto",children:[d("android.qualityAuto"),Z==="auto"?` · ${Jt/1e6} Mbps`:""]}),Pr.map(e=>n.jsx("option",{value:e.id,children:d(Wt[e.id])},e.id)),K.map(e=>n.jsx("option",{value:`user:${e.id}`,children:e.name},e.id)),n.jsx("option",{value:"custom",children:d(Wt.custom)})]})]}),n.jsx("button",{type:"button",onClick:()=>{se()},className:`${de} text-muted-foreground`,title:d("android.refresh"),children:xn?n.jsx(_e,{size:13,className:"animate-spin"}):n.jsx(rs,{size:13})}),M?n.jsx("button",{type:"button",onClick:Cn,className:`${de} text-destructive`,title:d("android.disconnect"),children:n.jsx(ps,{size:13})}):n.jsx("button",{type:"button",onClick:()=>m&&_(m),disabled:!m,className:`${de} text-primary`,title:d("android.connect"),children:n.jsx(zs,{size:13})}),(M||z)&&n.jsx("button",{type:"button",onClick:e=>{Pn(e.currentTarget)},disabled:!s||De,className:`${de} text-muted-foreground`,title:d(s?"android.screenshot":"android.captureUnavailable"),"aria-label":d("android.screenshot"),children:De?n.jsx(_e,{size:S?12:13,className:"animate-spin"}):n.jsx(vs,{size:S?12:13})}),(M||z)&&n.jsx("button",{type:"button",onClick:()=>{z?Mr("manual"):Ln()},disabled:xr||!z&&!u,className:`${de} ${z?"text-destructive":"text-muted-foreground"}`,title:d(z?"android.recordingStop":u?"android.recordingStart":"android.captureUnavailable"),"aria-label":d(z?"android.recordingStop":"android.recordingStart"),children:xr?n.jsx(_e,{className:"animate-spin",size:13}):z?n.jsx(on,{size:S?10:11,fill:"currentColor"}):n.jsx(ns,{size:S?12:13})}),n.jsx("button",{ref:_t,type:"button",onClick:()=>xe?ne(!1):Bn(),"aria-haspopup":"menu","aria-expanded":xe,className:`${de} ${$n?"text-primary":"text-muted-foreground"}`,title:d("android.more"),"aria-label":d("android.more"),disabled:!!p,children:n.jsx(ss,{size:S?13:14})}),h&&!t&&n.jsx("button",{type:"button",onClick:()=>{ne(!1),w("off"),h()},className:`${de} text-muted-foreground hover:bg-destructive/20 hover:text-destructive`,title:d("android.closeTab"),"aria-label":d("android.closeTab"),children:n.jsx(Ur,{size:14})})]}),!p&&xe&&It&<.createPortal(n.jsxs("div",{ref:br,role:"menu","aria-label":d("android.more"),style:{left:It.left,top:It.top,width:Ht},className:"fixed z-popover overflow-hidden rounded-md border border-border bg-surface-elevated py-1 text-[11px] shadow-lg",children:[n.jsx(ft,{icon:n.jsx(zr,{size:13}),label:d("android.addDevice"),active:Qe,onSelect:()=>{or(e=>!e),ne(!1)}}),n.jsx(ft,{icon:B?n.jsx(Ur,{size:13}):n.jsx(Br,{size:13}),label:d(B?"android.splitClose":"android.splitOpen"),active:B,disabled:!B&&!Ot,onSelect:()=>{Fn(),ne(!1)}}),n.jsx(ft,{icon:E==="window"?n.jsx(js,{size:13}):n.jsx(Rs,{size:13}),label:d(E==="window"?"android.exitFullscreen":"android.fullscreen"),active:E==="window",onSelect:()=>{w(E==="window"?"off":"window"),ne(!1)}}),!t&&n.jsx(ft,{icon:E==="sidebar"?n.jsx(Os,{size:13}):n.jsx(Ls,{size:13}),label:d(E==="sidebar"?"android.exitFullscreen":"android.fillSidebar"),active:E==="sidebar",onSelect:()=>{w(E==="sidebar"?"off":"sidebar"),ne(!1)}}),kt&&n.jsxs("div",{className:"mt-1 border-t border-border px-3 py-2 text-[10px] leading-4 tabular-nums text-muted-foreground",children:[n.jsx("div",{className:"truncate",children:`${ce.fps} fps · ${ce.kbps} kbps`}),n.jsx("div",{className:"truncate",children:`${ce.width}×${ce.height}`})]})]}),document.body),(Z==="custom"||L)&&n.jsxs("div",{className:"border-b border-border bg-surface-2/40 px-2 py-2 text-[11px]",children:[n.jsxs("button",{type:"button",onClick:()=>wt(e=>!e),"aria-expanded":vt,className:"flex w-full items-center gap-1 rounded text-muted-foreground hover:text-foreground",children:[n.jsx(zr,{size:12,className:`transition-transform ${vt?"":"-rotate-90"}`}),n.jsxs("span",{children:[d("android.quality"),L?` · ${K.find(e=>e.id===L)?.name??""}`:""]})]}),vt&&n.jsxs("div",{className:"mt-2 grid gap-2",children:[n.jsx(tn,{label:d("android.qualityResolution"),display:`${R.maxSize}px`,min:360,max:2160,step:8,value:R.maxSize,onChange:e=>oe(a=>({...a,maxSize:e}))}),n.jsx(tn,{label:d("android.qualityBitRate"),display:`${(R.bitRate/1e6).toFixed(1)} Mbps`,min:.5,max:20,step:.5,value:R.bitRate/1e6,onChange:e=>oe(a=>({...a,bitRate:Math.round(e*1e6)}))}),n.jsxs("div",{className:"flex items-center gap-2",children:[n.jsx("span",{className:"w-14 shrink-0 text-muted-foreground",children:d("android.qualityFrameRate")}),n.jsxs("div",{className:"flex gap-1",children:[[15,30,60].map(e=>n.jsx("button",{type:"button",onClick:()=>oe(a=>({...a,maxFps:e})),className:`rounded px-2 py-0.5 ${R.maxFps===e?"bg-surface-elevated text-primary":"text-muted-foreground hover:bg-surface-2"}`,children:e},e)),n.jsx("button",{type:"button",onClick:()=>oe(e=>({...e,maxFps:0})),className:`rounded px-2 py-0.5 ${R.maxFps===0?"bg-surface-elevated text-primary":"text-muted-foreground hover:bg-surface-2"}`,children:d("android.qualityAuto")})]}),n.jsx("button",{type:"button",onClick:An,disabled:!m,className:"ml-auto rounded bg-primary/15 px-2 py-1 text-primary disabled:opacity-40",children:d("android.qualityApply")})]}),n.jsxs("div",{className:"flex items-center gap-2",children:[n.jsx("input",{value:Ye,onChange:e=>rr(e.target.value),onKeyDown:e=>{e.key==="Enter"&&!e.nativeEvent.isComposing&&wr()},placeholder:d("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"}),n.jsx("button",{type:"button",onClick:wr,disabled:!Ye.trim(),className:"shrink-0 rounded bg-surface-2 px-2 py-1 text-primary disabled:opacity-40",children:d("android.presetSave")}),L&&n.jsx("button",{type:"button",onClick:Dn,className:"shrink-0 rounded px-2 py-1 text-destructive hover:bg-surface-2",children:d("android.presetDelete")})]})]})]}),!p&&Qe&&n.jsxs("div",{className:"flex items-center gap-1.5 border-b border-border px-2 py-2",children:[n.jsx("input",{value:cr,onChange:e=>lr(e.target.value),onKeyDown:e=>{e.key==="Enter"&&Nr()},placeholder:d("android.addressPlaceholder"),className:"min-w-0 flex-1 rounded bg-surface-2 px-2 py-1 text-[11px] outline-none placeholder:text-muted-foreground"}),n.jsx("button",{type:"button",onClick:()=>{Nr()},disabled:dr,className:"rounded bg-surface-2 px-2 py-1 text-[11px] text-primary disabled:opacity-40",children:dr?n.jsx(_e,{size:12,className:"animate-spin"}):d("android.connect")})]}),et&&n.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:[n.jsx("span",{className:"min-w-0 flex-1",children:d("android.adbUnavailable")}),n.jsx(Zr,{label:d("android.insertFixPrompt"),onClick:e=>Dr(en("adb",J??""),e),enabled:!!r})]}),!et&&vr&&n.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:[n.jsx("span",{className:"min-w-0 flex-1",children:d("android.scrcpyUnavailable")}),n.jsx(Zr,{label:d("android.insertFixPrompt"),onClick:e=>Dr(en("scrcpy",""),e),enabled:!!r})]}),le&&le.state!=="device"&&n.jsx("div",{className:"border-b border-border bg-surface-2 px-2 py-1.5 text-[11px] text-warning",children:Pi(le,d)}),J&&!et&&n.jsx("div",{className:"border-b border-border bg-surface-2 px-2 py-1.5 text-[11px] text-destructive",children:ct(J)}),ee&&n.jsxs("details",{className:"border-b border-border bg-surface-2 px-2 py-1.5 text-[11px] text-warning",children:[n.jsxs("summary",{className:"cursor-pointer",children:[d("android.qualityAutoUnavailable")," ",d(ee.startsWith("SCRCPY_VERSION")?"android.qualityAutoVersionError":ee.startsWith("SCRCPY_BUILD")?"android.qualityAutoBuildError":/EXTENSION|SERVER_READ|PUSH/.test(ee.split(":")[0])?"android.qualityAutoExtensionError":/TIMEOUT/.test(ee.split(":")[0])?"android.qualityAutoTimeoutError":/ENCODER_REJECTED/.test(ee.split(":")[0])?"android.qualityAutoEncoderError":/CHANNEL|TUNNEL|LISTEN|PROTOCOL|CONNECTION/.test(ee.split(":")[0])?"android.qualityAutoChannelError":"android.qualityAutoUnknownError")]}),n.jsx("pre",{className:"mt-1 select-text whitespace-pre-wrap break-all text-[10px]",children:ee})]}),sr&&n.jsx("div",{className:"border-b border-border bg-surface-2 px-2 py-1.5 text-[11px] text-warning",children:sr}),pr&&n.jsx("div",{role:"alert",className:"border-b border-border bg-surface-2 px-2 py-1.5 text-[11px] text-destructive",children:pr}),n.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:[n.jsx("canvas",{ref:b,className:"max-h-full max-w-full touch-none select-none rounded",style:{display:M||kt?"block":"none",transformOrigin:"center",transition:"none"},onPointerDown:jn,onPointerMove:Tn,onPointerUp:In,onPointerCancel:()=>T(),onLostPointerCapture:e=>{D.current.has(e.pointerId)&&T()},onPointerLeave:e=>{D.current.has(e.pointerId)&&!e.currentTarget.hasPointerCapture?.(e.pointerId)&&T()},onContextMenu:e=>e.preventDefault()}),Ee&&n.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:Ee.left,top:Ee.top}}),Ke.length>1&&n.jsx("svg",{"aria-hidden":"true",className:"pointer-events-none absolute inset-0 h-full w-full",style:{opacity:bn?1:0,transition:"opacity 160ms linear"},children:Ke.slice(1).map((e,a)=>{const o=Ke[a],l=(a+1)/(Ke.length-1);return n.jsx("line",{x1:o.x,y1:o.y,x2:e.x,y2:e.y,stroke:"var(--primary)",strokeWidth:1+1.6*l,strokeLinecap:"round",opacity:.06+.45*l},a)})}),gn.map(e=>n.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)),!M&&n.jsxs("div",{className:"absolute inset-0 flex flex-col items-center justify-center gap-2 text-center text-[11px] text-muted-foreground",children:[U==="connecting"&&n.jsxs(n.Fragment,{children:[n.jsx(_e,{size:18,className:"animate-spin"}),n.jsx("span",{children:d("android.connecting")})]}),U==="error"&&n.jsxs(n.Fragment,{children:[n.jsx(xs,{size:14,className:"text-destructive"}),n.jsx("span",{className:"max-w-[80%] text-destructive",children:Nt?d("android.retrySchedule",{attempt:Nt.attempt,seconds:Nt.delayMs/1e3}):ct(St||"")}),m&&n.jsx("button",{type:"button",onClick:()=>{fe.current=0,_(m)},className:"rounded bg-surface-2 px-2 py-1 text-foreground",children:d("android.retry")})]}),Se&&(U==="error"||U==="connecting")&&n.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:[n.jsx("span",{className:"text-muted-foreground",children:d("android.lastError")}),ct(Se)!==Se&&n.jsx("p",{className:"mt-1 whitespace-pre-wrap break-words",children:ct(Se)}),n.jsx("pre",{className:"mt-1 whitespace-pre-wrap break-words font-mono text-[10px] text-foreground",children:Se})]}),U==="idle"&&!et&&!vr&&n.jsxs(n.Fragment,{children:[n.jsx(Is,{size:22,className:"opacity-60"}),n.jsx("span",{children:Te.length?d("android.idleHint"):d("android.noDevicesHint")})]})]})]}),n.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:[n.jsx(F,{compact:S,label:d("android.back"),onClick:()=>g.current?.back(),disabled:!M||Q,children:n.jsx(is,{size:14})}),n.jsx(F,{compact:S,label:d("android.home"),onClick:()=>g.current?.home(),disabled:!M||Q,children:n.jsx(fs,{size:14})}),n.jsx(F,{compact:S,label:d("android.recents"),onClick:()=>g.current?.recents(),disabled:!M||Q,children:n.jsx(Cs,{size:14})}),n.jsx(F,{compact:S,label:d("android.notifications"),onClick:()=>g.current?.expandNotifications(),disabled:!M||Q,children:n.jsx(gs,{size:14})}),n.jsx(F,{compact:S,label:d("android.rotate"),onClick:()=>g.current?.rotate(),disabled:!M||Q,children:n.jsx(qs,{size:14})}),n.jsx(F,{compact:S,label:d("android.volumeDown"),onClick:()=>g.current?.volumeDown(),disabled:!M||Q,children:n.jsx(Ks,{size:14})}),n.jsx(F,{compact:S,label:d("android.volumeUp"),onClick:()=>g.current?.volumeUp(),disabled:!M||Q,children:n.jsx(Xs,{size:14})}),n.jsx(F,{compact:S,label:d("android.power"),onClick:()=>g.current?.power(),disabled:!M||Q,children:n.jsx(Fs,{size:14})}),n.jsx(F,{compact:S,label:d("android.inputText"),active:At,onClick:()=>wn(e=>!e),disabled:!M||Q,children:n.jsx(ms,{size:14})}),n.jsx(F,{compact:S,label:d("android.zoomIn"),onClick:()=>Ar("in"),disabled:!M||xt>=mt-.01,children:n.jsx(as,{size:14})}),n.jsx(F,{compact:S,label:d("android.zoomOut"),onClick:()=>Ar("out"),disabled:!M||xt<=X+.01,children:n.jsx(Ds,{size:14})}),n.jsxs("div",{className:"relative ml-auto h-5 w-24 min-w-0 max-w-full shrink-0","data-mirror-capture-status":!0,children:[n.jsx("span",{"aria-hidden":z||!!Mt||De,className:`block truncate text-right text-[10px] leading-5 tabular-nums text-muted-foreground ${z||Mt||De?"invisible":""}`,children:kt?n.jsx(n.Fragment,{children:n.jsx("span",{ref:er})}):""}),n.jsx("div",{className:"absolute inset-0 flex items-center justify-end overflow-hidden",children:n.jsx(Ii,{recording:z,elapsed:Sn,status:De?d("android.captureInserting"):Mt,stopLabel:d("android.recordingStop"),onStop:()=>{Mr("manual")}})})]})]}),At&&n.jsxs("div",{className:"flex items-center gap-1.5 border-t border-border px-2 py-1.5",children:[n.jsx("input",{value:Dt,onChange:e=>hr(e.target.value),onKeyDown:e=>{e.key==="Enter"&&!e.nativeEvent.isComposing&&(e.preventDefault(),Rr())},placeholder:d("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}),n.jsx("button",{type:"button",onClick:Rr,disabled:!Dt,className:"rounded bg-surface-2 p-1.5 text-primary disabled:opacity-40",title:d("android.send"),children:n.jsx(Ys,{size:13})})]})]});return E==="window"?lt.createPortal(n.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:ot}),document.body):t?B&&Ze?lt.createPortal(ot,Ze):null:B&&Ze?n.jsxs(n.Fragment,{children:[lt.createPortal(ot,Ze),n.jsxs("div",{className:"flex h-full flex-col items-center justify-center gap-2 p-4 text-center text-[11px] text-muted-foreground",children:[n.jsx(Br,{size:18,className:"opacity-60"}),n.jsx("span",{children:d("android.splitDockedHint")}),n.jsx("button",{type:"button",onClick:()=>{Pt(Le,null),j({docked:null})},className:"rounded bg-surface-2 px-2 py-1 text-foreground",children:d("android.splitClose")})]})]}):ot}function ft({icon:i,label:t,active:r=!1,disabled:s=!1,onSelect:u}){return n.jsxs("button",{type:"button",role:"menuitem",disabled:s,onClick:u,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 ${r?"text-primary":"text-foreground"}`,children:[n.jsx("span",{"aria-hidden":"true",className:"shrink-0",children:i}),n.jsx("span",{className:"min-w-0 flex-1 truncate",children:t}),r&&n.jsx(ls,{size:12,className:"shrink-0"})]})}function Ii({recording:i,elapsed:t,status:r,stopLabel:s,onStop:u}){return i?n.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:[n.jsx("span",{"aria-hidden":"true",className:"h-1.5 w-1.5 shrink-0 animate-pulse rounded-full bg-destructive"}),Wr(t),n.jsx("button",{type:"button",onClick:u,title:s,"aria-label":`${s} · ${Wr(t)}`,className:"ml-0.5 inline-flex h-4 w-4 items-center justify-center rounded hover:bg-destructive/25",children:n.jsx(on,{size:8,fill:"currentColor"})})]}):r?n.jsx("span",{role:"status","aria-live":"polite",title:r,className:"ml-auto truncate text-[10px] text-primary",children:r}):null}function _i({sessionId:i}){const t=he(w=>w.docks[ge]),r=!!t,s=t?.sessionId??i??null,h=Yt(w=>w.pending)[0],p=c.useCallback(async(w,b)=>{const g=an(b);if(!s)throw new Error("没有可接收截图的终端");const k=(await Qn("/tmp",[w])).files[0]?.path;if(!k)throw new Error("截图上传未返回文件路径");if(!g())throw new Error("截图尚未插入,请返回原投屏面板重试");await Qr(k,s,b)},[s]),y=c.useCallback(w=>{Yt.getState().enqueue(w,s)},[s]),d=he(w=>!!w.hosts[ge]),E=c.useRef(!1);return c.useEffect(()=>{E.current||(E.current=!0,sn().then(w=>{const b=w.androidPanel?.docked;b&&(he.getState().docks[ge]||he.getState().setDock(ge,b))}).catch(()=>{}))},[]),n.jsxs(n.Fragment,{children:[r&&d&&n.jsx(fn,{sessionId:s,dockOnly:!0,onInsertFile:s?p:void 0,onInsertPrompt:s?(w,b)=>un(w,s,b):void 0,onRecordingComplete:y}),h&&n.jsx(hs,{file:h.file,initialPath:h.initialPath,onInsert:(w,b)=>h.insert?h.insert(w,b):Qr(w,h.sessionId,b),onDone:()=>Yt.getState().remove(h.file.id)},h.file.id)]})}function Zr({label:i,onClick:t,enabled:r}){return r?n.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 en(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 tn({label:i,display:t,min:r,max:s,step:u,value:h,onChange:p}){return n.jsxs("div",{className:"flex items-center gap-2",children:[n.jsx("span",{className:"w-14 shrink-0 text-muted-foreground",children:i}),n.jsx("input",{type:"range",min:r,max:s,step:u,value:h,onChange:y=>p(Number(y.target.value)),className:"h-1 min-w-0 flex-1 accent-primary","aria-label":i}),n.jsx("span",{className:"w-16 shrink-0 text-right tabular-nums text-muted-foreground",children:t})]})}function F({label:i,onClick:t,disabled:r,active:s,compact:u,children:h}){return n.jsx("button",{type:"button",onClick:t,disabled:r,title:i,"aria-label":i,className:`${u?"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 rn(i,t,r){const s=i.parentElement;if(!s)return null;const u=i.getBoundingClientRect(),h=s.getBoundingClientRect();return{left:u.left-h.left+(t-u.left),top:u.top-h.top+(r-u.top)}}function pt(i,t,r){const s=i.getBoundingClientRect(),u=i.width||s.width,h=i.height||s.height,p=s.width?(t-s.left)/s.width*u:0,y=s.height?(r-s.top)/s.height*h:0;return{x:Math.max(0,Math.min(u,p)),y:Math.max(0,Math.min(h,y))}}function Oi(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 nn(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 Pi(i,t){return i.state==="unauthorized"?t("android.unauthorizedHint"):i.state==="offline"?t("android.offlineHint"):t("android.stateUnknown")}const Vi=Object.freeze(Object.defineProperty({__proto__:null,ANDROID_DOCK_GROUP:ge,AndroidMirrorDock:_i,AndroidMirrorView:fn},Symbol.toStringTag,{value:"Module"}));export{ge as A,gs as B,Br as C,Es as G,Cs as L,Rs as M,qs as R,Ys as S,Xs as V,_i as a,fn as b,Vi as c,js as d,Ds as e,Yt as f,Qr as i,Fr as u};
|
|
Binary file
|
|
Binary file
|