termdock 1.4.248 → 1.4.250
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/assets/{App-DA7cQLR7.js → App-DUXUkp6M.js} +35 -35
- package/dist/client/assets/App-DUXUkp6M.js.br +0 -0
- package/dist/client/assets/App-DUXUkp6M.js.gz +0 -0
- package/dist/client/assets/{ChangeWalkthroughPanel-vDiLbIdv.js → ChangeWalkthroughPanel-DuftIP_n.js} +2 -2
- package/dist/client/assets/ChangeWalkthroughPanel-DuftIP_n.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-DuftIP_n.js.gz +0 -0
- package/dist/client/assets/{DagPlayground-BvY_KblL.js → DagPlayground-DUStLbuX.js} +1 -1
- package/dist/client/assets/DagPlayground-DUStLbuX.js.br +0 -0
- package/dist/client/assets/DagPlayground-DUStLbuX.js.gz +0 -0
- package/dist/client/assets/{DiffLab-Dra7cEKx.js → DiffLab-r4yGPw3X.js} +1 -1
- package/dist/client/assets/DiffLab-r4yGPw3X.js.br +0 -0
- package/dist/client/assets/DiffLab-r4yGPw3X.js.gz +0 -0
- package/dist/client/assets/{DiffReview-v9_1IS2n.js → DiffReview-Bv30J0_c.js} +1 -1
- package/dist/client/assets/DiffReview-Bv30J0_c.js.br +0 -0
- package/dist/client/assets/DiffReview-Bv30J0_c.js.gz +0 -0
- package/dist/client/assets/{DiffReviewLab-BF8Dada6.js → DiffReviewLab-DNKv08iv.js} +1 -1
- package/dist/client/assets/DiffReviewLab-DNKv08iv.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-DNKv08iv.js.gz +0 -0
- package/dist/client/assets/{DiffViewer-C2s4BXp0.js → DiffViewer-C2CNzWOk.js} +1 -1
- package/dist/client/assets/DiffViewer-C2CNzWOk.js.br +0 -0
- package/dist/client/assets/DiffViewer-C2CNzWOk.js.gz +0 -0
- package/dist/client/assets/{ModelPreview-D9pzW_YD.js → ModelPreview-CKrfGqLc.js} +1 -1
- package/dist/client/assets/ModelPreview-CKrfGqLc.js.br +0 -0
- package/dist/client/assets/ModelPreview-CKrfGqLc.js.gz +0 -0
- package/dist/client/assets/RightSidebar-CghCWdM7.js +1678 -0
- package/dist/client/assets/RightSidebar-CghCWdM7.js.br +0 -0
- package/dist/client/assets/RightSidebar-CghCWdM7.js.gz +0 -0
- package/dist/client/assets/{abnfDiagram-VCTEODGH-DVOxqZDY.js → abnfDiagram-VCTEODGH-DL2nfDNT.js} +1 -1
- package/dist/client/assets/abnfDiagram-VCTEODGH-DL2nfDNT.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-DL2nfDNT.js.gz +0 -0
- package/dist/client/assets/{app-JK4pM9zv.js → app-8tWJbUN-.js} +11 -11
- package/dist/client/assets/app-8tWJbUN-.js.br +0 -0
- package/dist/client/assets/app-8tWJbUN-.js.gz +0 -0
- package/dist/client/assets/{arc-DY_WK1Ln.js → arc-V2GgKn7I.js} +1 -1
- package/dist/client/assets/arc-V2GgKn7I.js.br +0 -0
- package/dist/client/assets/arc-V2GgKn7I.js.gz +0 -0
- package/dist/client/assets/{architectureDiagram-5GKGNRK7-oyhVtQ5E.js → architectureDiagram-5GKGNRK7-Fg90zpOW.js} +1 -1
- package/dist/client/assets/architectureDiagram-5GKGNRK7-Fg90zpOW.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-Fg90zpOW.js.gz +0 -0
- package/dist/client/assets/{blockDiagram-I7D4REHJ-DTMir8MU.js → blockDiagram-I7D4REHJ-BH0MOsEc.js} +1 -1
- package/dist/client/assets/blockDiagram-I7D4REHJ-BH0MOsEc.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-BH0MOsEc.js.gz +0 -0
- package/dist/client/assets/{c4Diagram-7LVT6UL2-DpDHYMUW.js → c4Diagram-7LVT6UL2-BCTc14IT.js} +1 -1
- package/dist/client/assets/c4Diagram-7LVT6UL2-BCTc14IT.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-BCTc14IT.js.gz +0 -0
- package/dist/client/assets/channel-ByAQak-i.js +1 -0
- package/dist/client/assets/{chunk-2Q5K7J3B-CZw9qV1g.js → chunk-2Q5K7J3B-DcJlbXqa.js} +1 -1
- package/dist/client/assets/{chunk-5VM5RSS4-7oLZ2vUy.js → chunk-5VM5RSS4-YadWuzn7.js} +1 -1
- package/dist/client/assets/{chunk-F27PBJKO-8wDqj2MV.js → chunk-F27PBJKO-BTaBHq7k.js} +1 -1
- package/dist/client/assets/chunk-F27PBJKO-BTaBHq7k.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-BTaBHq7k.js.gz +0 -0
- package/dist/client/assets/{chunk-IMKFNOWR-BnRNosQc.js → chunk-IMKFNOWR-BOqgrA6m.js} +1 -1
- package/dist/client/assets/chunk-IMKFNOWR-BOqgrA6m.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-BOqgrA6m.js.gz +0 -0
- package/dist/client/assets/{chunk-JWPE2WC7-DnbB0Lhi.js → chunk-JWPE2WC7-CsX0TZuJ.js} +1 -1
- package/dist/client/assets/{chunk-POPQ4Y6H-TXREax5x.js → chunk-POPQ4Y6H-Bl2l1Ema.js} +1 -1
- package/dist/client/assets/{chunk-SVP7TREG-qPD0Q74z.js → chunk-SVP7TREG-DuL_oy8M.js} +1 -1
- package/dist/client/assets/chunk-SVP7TREG-DuL_oy8M.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-DuL_oy8M.js.gz +0 -0
- package/dist/client/assets/{chunk-TICWLB2K-yzLwt_MH.js → chunk-TICWLB2K-BpNqLBuo.js} +1 -1
- package/dist/client/assets/chunk-TICWLB2K-BpNqLBuo.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-BpNqLBuo.js.gz +0 -0
- package/dist/client/assets/{chunk-XXDRQBXY-Dksq2NzZ.js → chunk-XXDRQBXY-DvOZIuyY.js} +1 -1
- package/dist/client/assets/classDiagram-ZZMXUADV-U0ztcNG4.js +1 -0
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-U0ztcNG4.js +1 -0
- package/dist/client/assets/{cose-bilkent-JH36ORCC-BZyAGO6R.js → cose-bilkent-JH36ORCC-ChxuLhhv.js} +1 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-ChxuLhhv.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-ChxuLhhv.js.gz +0 -0
- package/dist/client/assets/{cynefin-OW5HDTMX-CyrkJWSU.js → cynefin-OW5HDTMX-C071INwn.js} +1 -1
- package/dist/client/assets/cynefin-OW5HDTMX-C071INwn.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-C071INwn.js.gz +0 -0
- package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-BrqS8ZGX.js → cynefinDiagram-5FMLGOSQ-MY_50dMe.js} +1 -1
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-MY_50dMe.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-MY_50dMe.js.gz +0 -0
- package/dist/client/assets/{dagre-GXQ25YYZ-ysmdkSNr.js → dagre-GXQ25YYZ-DELhrgXz.js} +1 -1
- package/dist/client/assets/dagre-GXQ25YYZ-DELhrgXz.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-DELhrgXz.js.gz +0 -0
- package/dist/client/assets/{diagram-S7CK7UJ4-CWSuzX1d.js → diagram-S7CK7UJ4-B-Be7FNM.js} +1 -1
- package/dist/client/assets/diagram-S7CK7UJ4-B-Be7FNM.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-B-Be7FNM.js.gz +0 -0
- package/dist/client/assets/{diagram-UQ7AKVKN-BMxc5NDd.js → diagram-UQ7AKVKN-BljlErc_.js} +1 -1
- package/dist/client/assets/diagram-UQ7AKVKN-BljlErc_.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-BljlErc_.js.gz +0 -0
- package/dist/client/assets/{diagram-VSXAHHWV-Cz5KpnGX.js → diagram-VSXAHHWV-CedNK-uM.js} +1 -1
- package/dist/client/assets/diagram-VSXAHHWV-CedNK-uM.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-CedNK-uM.js.gz +0 -0
- package/dist/client/assets/{diagram-VX7I27RA-CNk1h20b.js → diagram-VX7I27RA-BpF063CL.js} +1 -1
- package/dist/client/assets/diagram-VX7I27RA-BpF063CL.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-BpF063CL.js.gz +0 -0
- package/dist/client/assets/{diagram-Z3DM3KII-C4lcgl6z.js → diagram-Z3DM3KII-DmykUds5.js} +1 -1
- package/dist/client/assets/diagram-Z3DM3KII-DmykUds5.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-DmykUds5.js.gz +0 -0
- package/dist/client/assets/{ebnfDiagram-PWID7BFC-Cwo356mF.js → ebnfDiagram-PWID7BFC-DZkhpsQ7.js} +1 -1
- package/dist/client/assets/ebnfDiagram-PWID7BFC-DZkhpsQ7.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-DZkhpsQ7.js.gz +0 -0
- package/dist/client/assets/{erDiagram-RLTQ6QDP-B4DEocxu.js → erDiagram-RLTQ6QDP-7EOAP4ib.js} +1 -1
- package/dist/client/assets/erDiagram-RLTQ6QDP-7EOAP4ib.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-7EOAP4ib.js.gz +0 -0
- package/dist/client/assets/{flowDiagram-HODETNUW-CWP3R7jz.js → flowDiagram-HODETNUW-Di-NXz6s.js} +1 -1
- package/dist/client/assets/flowDiagram-HODETNUW-Di-NXz6s.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-Di-NXz6s.js.gz +0 -0
- package/dist/client/assets/{ganttDiagram-EL5Y4UJY-DBdMWa6L.js → ganttDiagram-EL5Y4UJY-BXGP48XI.js} +1 -1
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-BXGP48XI.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-BXGP48XI.js.gz +0 -0
- package/dist/client/assets/{gestureArbiter-FNHriuhM.js → gestureArbiter-DfjioB30.js} +1 -1
- package/dist/client/assets/gestureArbiter-DfjioB30.js.br +0 -0
- package/dist/client/assets/gestureArbiter-DfjioB30.js.gz +0 -0
- package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-B6qG6eRT.js → gitGraphDiagram-WWUBYQGX-DMWvrtdU.js} +1 -1
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DMWvrtdU.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DMWvrtdU.js.gz +0 -0
- package/dist/client/assets/{index-fjWWhVQp.css → index-CwuSutCd.css} +1 -1
- package/dist/client/assets/index-CwuSutCd.css.br +0 -0
- package/dist/client/assets/{index-fjWWhVQp.css.gz → index-CwuSutCd.css.gz} +0 -0
- package/dist/client/assets/{infoDiagram-27XIBGKW-DStk0sCn.js → infoDiagram-27XIBGKW-B6A9Pji6.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-5VMMS53U-Cz8OXUK9.js → ishikawaDiagram-5VMMS53U-BjBHrYpy.js} +1 -1
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-BjBHrYpy.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-BjBHrYpy.js.gz +0 -0
- package/dist/client/assets/{journeyDiagram-3NMN7TZE-CD4v2_eb.js → journeyDiagram-3NMN7TZE-B-OK36-I.js} +1 -1
- package/dist/client/assets/journeyDiagram-3NMN7TZE-B-OK36-I.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-B-OK36-I.js.gz +0 -0
- package/dist/client/assets/{kanban-definition-UXKFOSKX-DwLWqTSY.js → kanban-definition-UXKFOSKX-BkR_GpZf.js} +1 -1
- package/dist/client/assets/kanban-definition-UXKFOSKX-BkR_GpZf.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-BkR_GpZf.js.gz +0 -0
- package/dist/client/assets/{layout-C1EhlDX0.js → layout-B1dVqanE.js} +1 -1
- package/dist/client/assets/layout-B1dVqanE.js.br +0 -0
- package/dist/client/assets/layout-B1dVqanE.js.gz +0 -0
- package/dist/client/assets/{linear-DQLRPRnN.js → linear-DbtXwCMs.js} +1 -1
- package/dist/client/assets/linear-DbtXwCMs.js.br +0 -0
- package/dist/client/assets/linear-DbtXwCMs.js.gz +0 -0
- package/dist/client/assets/{mermaid.core-BzEGo4OD.js → mermaid.core-DXBQ8sgL.js} +5 -5
- package/dist/client/assets/mermaid.core-DXBQ8sgL.js.br +0 -0
- package/dist/client/assets/mermaid.core-DXBQ8sgL.js.gz +0 -0
- package/dist/client/assets/{mindmap-definition-YA3MSWOX-Dct8OiDY.js → mindmap-definition-YA3MSWOX-aErXsDjT.js} +1 -1
- package/dist/client/assets/mindmap-definition-YA3MSWOX-aErXsDjT.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-aErXsDjT.js.gz +0 -0
- package/dist/client/assets/{passwordBootstrap-C7Gy7ATG.js → passwordBootstrap-LVbx2WyB.js} +1 -1
- package/dist/client/assets/passwordBootstrap-LVbx2WyB.js.br +0 -0
- package/dist/client/assets/passwordBootstrap-LVbx2WyB.js.gz +0 -0
- package/dist/client/assets/{pegDiagram-XKGWAZYB-fIABDYj-.js → pegDiagram-XKGWAZYB-B7UP1Iyq.js} +1 -1
- package/dist/client/assets/pegDiagram-XKGWAZYB-B7UP1Iyq.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-B7UP1Iyq.js.gz +0 -0
- package/dist/client/assets/{pieDiagram-E7YTZNPT-D2EuLDIj.js → pieDiagram-E7YTZNPT-DDVenGYn.js} +1 -1
- package/dist/client/assets/pieDiagram-E7YTZNPT-DDVenGYn.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-DDVenGYn.js.gz +0 -0
- package/dist/client/assets/{quadrantDiagram-AXDQQJYC-BjF42rwO.js → quadrantDiagram-AXDQQJYC-BfVFS4dx.js} +1 -1
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-BfVFS4dx.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-BfVFS4dx.js.gz +0 -0
- package/dist/client/assets/{railroadDiagram-O6MQD6OU-DjfSTDvw.js → railroadDiagram-O6MQD6OU-DMmkHIlO.js} +1 -1
- package/dist/client/assets/railroadDiagram-O6MQD6OU-DMmkHIlO.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-DMmkHIlO.js.gz +0 -0
- package/dist/client/assets/{referenceLongPress-Cz9no5pI.js → referenceLongPress-CxWG0c2F.js} +1 -1
- package/dist/client/assets/referenceLongPress-CxWG0c2F.js.br +0 -0
- package/dist/client/assets/referenceLongPress-CxWG0c2F.js.gz +0 -0
- package/dist/client/assets/{requirementDiagram-BXWQKSXE-BewZ62Ou.js → requirementDiagram-BXWQKSXE-BAK1hsXp.js} +1 -1
- package/dist/client/assets/requirementDiagram-BXWQKSXE-BAK1hsXp.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-BAK1hsXp.js.gz +0 -0
- package/dist/client/assets/{sankeyDiagram-P5KCCOFB-BhlchAkm.js → sankeyDiagram-P5KCCOFB-BEvnkr6_.js} +1 -1
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-BEvnkr6_.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-BEvnkr6_.js.gz +0 -0
- package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-CFzratAc.js → sequenceDiagram-WJ2MYXX4-Ie1mihcT.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-CFzratAc.js.br → sequenceDiagram-WJ2MYXX4-Ie1mihcT.js.br} +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-Ie1mihcT.js.gz +0 -0
- package/dist/client/assets/{sizeCapture-INFHLROL-DeLB3S5x.js → sizeCapture-INFHLROL-Dxfdgg7e.js} +1 -1
- package/dist/client/assets/sizeCapture-INFHLROL-Dxfdgg7e.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-Dxfdgg7e.js.gz +0 -0
- package/dist/client/assets/{sparkles-BHsBDSo5.js → sparkles-EjjUH4DP.js} +1 -1
- package/dist/client/assets/{stateDiagram-D77RDMKH-smIkttxr.js → stateDiagram-D77RDMKH-D9nsU2MY.js} +1 -1
- package/dist/client/assets/stateDiagram-D77RDMKH-D9nsU2MY.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-D9nsU2MY.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-EDm7-sTV.js +1 -0
- package/dist/client/assets/{swimlanes-42K2YHIH-CVwGuPcK.js → swimlanes-42K2YHIH-C0-l-AhO.js} +1 -1
- package/dist/client/assets/swimlanes-42K2YHIH-C0-l-AhO.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH-C0-l-AhO.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-B2H2z_dX.js +8 -0
- package/dist/client/assets/{timeline-definition-24CTP7MA-Dsn_Rxbd.js → timeline-definition-24CTP7MA-DwOPp-ah.js} +1 -1
- package/dist/client/assets/timeline-definition-24CTP7MA-DwOPp-ah.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-DwOPp-ah.js.gz +0 -0
- package/dist/client/assets/{triangle-alert-DexJX8jR.js → triangle-alert-BXlTfgBy.js} +1 -1
- package/dist/client/assets/{vennDiagram-4TSXK5OY-Dtdth9UN.js → vennDiagram-4TSXK5OY-BYOmQzP3.js} +1 -1
- package/dist/client/assets/vennDiagram-4TSXK5OY-BYOmQzP3.js.br +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-BYOmQzP3.js.gz +0 -0
- package/dist/client/assets/{wardleyDiagram-VM6X3IG4-82oGoyOd.js → wardleyDiagram-VM6X3IG4-B2yYZbOq.js} +1 -1
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-B2yYZbOq.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-B2yYZbOq.js.gz +0 -0
- package/dist/client/assets/{xychartDiagram-S5SC5T6Z-Ygu0NbUo.js → xychartDiagram-S5SC5T6Z-DdqrbuEU.js} +1 -1
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-DdqrbuEU.js.br +0 -0
- package/dist/client/assets/{xychartDiagram-S5SC5T6Z-Ygu0NbUo.js.gz → xychartDiagram-S5SC5T6Z-DdqrbuEU.js.gz} +0 -0
- package/dist/client/index.html +2 -2
- package/dist/client/index.html.br +0 -0
- package/dist/client/index.html.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/android/adb.js +154 -0
- package/dist/server/android/scrcpy.js +421 -0
- package/dist/server/entry.js +9 -1
- package/dist/server/federation/runtime.js +29 -4
- package/dist/server/routes/android.js +205 -0
- package/dist/server/routes/terminal.js +13 -1
- package/dist/server/utils/apiAccess.js +3 -1
- package/dist/server/utils/settings.js +47 -0
- package/package.json +1 -1
- package/runtime-manifest.json +3 -3
- package/dist/client/assets/App-DA7cQLR7.js.br +0 -0
- package/dist/client/assets/App-DA7cQLR7.js.gz +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-vDiLbIdv.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-vDiLbIdv.js.gz +0 -0
- package/dist/client/assets/DagPlayground-BvY_KblL.js.br +0 -0
- package/dist/client/assets/DagPlayground-BvY_KblL.js.gz +0 -0
- package/dist/client/assets/DiffLab-Dra7cEKx.js.br +0 -0
- package/dist/client/assets/DiffLab-Dra7cEKx.js.gz +0 -0
- package/dist/client/assets/DiffReview-v9_1IS2n.js.br +0 -0
- package/dist/client/assets/DiffReview-v9_1IS2n.js.gz +0 -0
- package/dist/client/assets/DiffReviewLab-BF8Dada6.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-BF8Dada6.js.gz +0 -0
- package/dist/client/assets/DiffViewer-C2s4BXp0.js.br +0 -0
- package/dist/client/assets/DiffViewer-C2s4BXp0.js.gz +0 -0
- package/dist/client/assets/ModelPreview-D9pzW_YD.js.br +0 -0
- package/dist/client/assets/ModelPreview-D9pzW_YD.js.gz +0 -0
- package/dist/client/assets/RightSidebar-DL8z6vvJ.js +0 -1678
- package/dist/client/assets/RightSidebar-DL8z6vvJ.js.br +0 -0
- package/dist/client/assets/RightSidebar-DL8z6vvJ.js.gz +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-DVOxqZDY.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-DVOxqZDY.js.gz +0 -0
- package/dist/client/assets/app-JK4pM9zv.js.br +0 -0
- package/dist/client/assets/app-JK4pM9zv.js.gz +0 -0
- package/dist/client/assets/arc-DY_WK1Ln.js.br +0 -0
- package/dist/client/assets/arc-DY_WK1Ln.js.gz +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-oyhVtQ5E.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-oyhVtQ5E.js.gz +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-DTMir8MU.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-DTMir8MU.js.gz +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-DpDHYMUW.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-DpDHYMUW.js.gz +0 -0
- package/dist/client/assets/channel-cexw6K2f.js +0 -1
- package/dist/client/assets/chunk-F27PBJKO-8wDqj2MV.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-8wDqj2MV.js.gz +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-BnRNosQc.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-BnRNosQc.js.gz +0 -0
- package/dist/client/assets/chunk-SVP7TREG-qPD0Q74z.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-qPD0Q74z.js.gz +0 -0
- package/dist/client/assets/chunk-TICWLB2K-yzLwt_MH.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-yzLwt_MH.js.gz +0 -0
- package/dist/client/assets/classDiagram-ZZMXUADV-CpjKakYG.js +0 -1
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-CpjKakYG.js +0 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-BZyAGO6R.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-BZyAGO6R.js.gz +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-CyrkJWSU.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-CyrkJWSU.js.gz +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-BrqS8ZGX.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-BrqS8ZGX.js.gz +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-ysmdkSNr.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-ysmdkSNr.js.gz +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-CWSuzX1d.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-CWSuzX1d.js.gz +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-BMxc5NDd.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-BMxc5NDd.js.gz +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-Cz5KpnGX.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-Cz5KpnGX.js.gz +0 -0
- package/dist/client/assets/diagram-VX7I27RA-CNk1h20b.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-CNk1h20b.js.gz +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-C4lcgl6z.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-C4lcgl6z.js.gz +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-Cwo356mF.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-Cwo356mF.js.gz +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-B4DEocxu.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-B4DEocxu.js.gz +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-CWP3R7jz.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-CWP3R7jz.js.gz +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-DBdMWa6L.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-DBdMWa6L.js.gz +0 -0
- package/dist/client/assets/gestureArbiter-FNHriuhM.js.br +0 -0
- package/dist/client/assets/gestureArbiter-FNHriuhM.js.gz +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-B6qG6eRT.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-B6qG6eRT.js.gz +0 -0
- package/dist/client/assets/index-fjWWhVQp.css.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-Cz8OXUK9.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-Cz8OXUK9.js.gz +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-CD4v2_eb.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-CD4v2_eb.js.gz +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-DwLWqTSY.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-DwLWqTSY.js.gz +0 -0
- package/dist/client/assets/layout-C1EhlDX0.js.br +0 -0
- package/dist/client/assets/layout-C1EhlDX0.js.gz +0 -0
- package/dist/client/assets/linear-DQLRPRnN.js.br +0 -0
- package/dist/client/assets/linear-DQLRPRnN.js.gz +0 -0
- package/dist/client/assets/mermaid.core-BzEGo4OD.js.br +0 -0
- package/dist/client/assets/mermaid.core-BzEGo4OD.js.gz +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-Dct8OiDY.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-Dct8OiDY.js.gz +0 -0
- package/dist/client/assets/passwordBootstrap-C7Gy7ATG.js.br +0 -0
- package/dist/client/assets/passwordBootstrap-C7Gy7ATG.js.gz +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-fIABDYj-.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-fIABDYj-.js.gz +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-D2EuLDIj.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-D2EuLDIj.js.gz +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-BjF42rwO.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-BjF42rwO.js.gz +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-DjfSTDvw.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-DjfSTDvw.js.gz +0 -0
- package/dist/client/assets/referenceLongPress-Cz9no5pI.js.br +0 -0
- package/dist/client/assets/referenceLongPress-Cz9no5pI.js.gz +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-BewZ62Ou.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-BewZ62Ou.js.gz +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-BhlchAkm.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-BhlchAkm.js.gz +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-CFzratAc.js.gz +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-DeLB3S5x.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-DeLB3S5x.js.gz +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-smIkttxr.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-smIkttxr.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-BFDLILuN.js +0 -1
- package/dist/client/assets/swimlanes-42K2YHIH-CVwGuPcK.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH-CVwGuPcK.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-B0Dzvkwg.js +0 -8
- package/dist/client/assets/timeline-definition-24CTP7MA-Dsn_Rxbd.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-Dsn_Rxbd.js.gz +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-Dtdth9UN.js.br +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-Dtdth9UN.js.gz +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-82oGoyOd.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-82oGoyOd.js.gz +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-Ygu0NbUo.js.br +0 -0
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { Router } from 'express';
|
|
2
|
+
import { connectDevice, disconnectDevice, listDevices, resolveAdbBinary } from '../android/adb.js';
|
|
3
|
+
import { createScrcpySession, resolveScrcpyBinaries } from '../android/scrcpy.js';
|
|
4
|
+
const router = Router();
|
|
5
|
+
const SERIAL_PATTERN = /^[0-9a-zA-Z_.:\-]{1,128}$/;
|
|
6
|
+
/** 逐帧/逐控件的诊断日志默认关闭,需要时 TERMDOCK_ANDROID_DEBUG=1 打开。 */
|
|
7
|
+
const DEBUG_ANDROID = process.env.TERMDOCK_ANDROID_DEBUG === '1';
|
|
8
|
+
export function isValidAndroidSerial(serial) {
|
|
9
|
+
return SERIAL_PATTERN.test(serial);
|
|
10
|
+
}
|
|
11
|
+
router.get('/devices', async (_req, res) => {
|
|
12
|
+
try {
|
|
13
|
+
const devices = await listDevices();
|
|
14
|
+
let scrcpyVersion = null;
|
|
15
|
+
const adbAvailable = resolveAdbBinary() !== null;
|
|
16
|
+
try {
|
|
17
|
+
scrcpyVersion = (await resolveScrcpyBinaries()).version;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
scrcpyVersion = null;
|
|
21
|
+
}
|
|
22
|
+
res.json({ adbAvailable, scrcpyVersion, devices });
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
res.status(503).json({ error: error instanceof Error ? error.message : 'ADB_UNAVAILABLE', code: 'ADB_UNAVAILABLE' });
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
router.post('/connect', async (req, res) => {
|
|
29
|
+
const address = typeof req.body?.address === 'string' ? req.body.address : '';
|
|
30
|
+
try {
|
|
31
|
+
const result = await connectDevice(address);
|
|
32
|
+
res.json({ ok: true, serial: result.serial, output: result.output });
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
const message = error instanceof Error ? error.message : 'ADB_CONNECT_FAILED';
|
|
36
|
+
res.status(400).json({ error: message, code: message });
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
router.post('/disconnect', async (req, res) => {
|
|
40
|
+
const address = typeof req.body?.address === 'string' ? req.body.address : '';
|
|
41
|
+
try {
|
|
42
|
+
res.json({ ok: true, output: await disconnectDevice(address) });
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
const message = error instanceof Error ? error.message : 'ADB_DISCONNECT_FAILED';
|
|
46
|
+
res.status(400).json({ error: message, code: message });
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
export default router;
|
|
50
|
+
function clampInt(value, min, max, fallback) {
|
|
51
|
+
if (typeof value !== 'number' || !Number.isFinite(value))
|
|
52
|
+
return fallback;
|
|
53
|
+
return Math.max(min, Math.min(max, Math.round(value)));
|
|
54
|
+
}
|
|
55
|
+
/** 加密隧道打开 `/api/android/:serial/ws` 后的桥接:视频帧下发、控制消息回写。 */
|
|
56
|
+
export function handleAndroidWebSocket(socket, serial, _clientId, requested = {}) {
|
|
57
|
+
if (!isValidAndroidSerial(serial)) {
|
|
58
|
+
socket.close(4400, 'INVALID_SERIAL');
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
// 网络差时客户端可主动降码率/分辨率;这里对入参做边界收敛。
|
|
62
|
+
const quality = {
|
|
63
|
+
maxSize: clampInt(requested.maxSize, 360, 2160, 1600),
|
|
64
|
+
videoBitRate: clampInt(requested.bitRate, 300_000, 30_000_000, 8_000_000),
|
|
65
|
+
maxFps: clampInt(requested.maxFps, 0, 60, 0),
|
|
66
|
+
};
|
|
67
|
+
let closed = false;
|
|
68
|
+
let inflight = 0;
|
|
69
|
+
let seq = 0;
|
|
70
|
+
let sent = 0;
|
|
71
|
+
let acked = 0;
|
|
72
|
+
let controlCount = 0;
|
|
73
|
+
let lastAckAt = 0;
|
|
74
|
+
let lastFrameAt = Date.now();
|
|
75
|
+
let videoPaused = false;
|
|
76
|
+
let androidSendSkipLogged = false;
|
|
77
|
+
let session = null;
|
|
78
|
+
// 客户端 ack 丢失时不能让视频永久暂停:超时视为丢包并恢复。
|
|
79
|
+
const flowTimer = setInterval(() => {
|
|
80
|
+
if (videoPaused && Date.now() - Math.max(lastAckAt, lastFrameAt) > 3000) {
|
|
81
|
+
if (DEBUG_ANDROID)
|
|
82
|
+
console.log(`[android] flow resume after ack timeout serial=${serial} inflight=${inflight} sent=${sent} acked=${acked}`);
|
|
83
|
+
videoPaused = false;
|
|
84
|
+
session?.resumeVideo();
|
|
85
|
+
}
|
|
86
|
+
}, 1000);
|
|
87
|
+
const statsTimer = DEBUG_ANDROID ? setInterval(() => {
|
|
88
|
+
if (sent > 0)
|
|
89
|
+
console.log(`[android] stats serial=${serial} sent=${sent} acked=${acked} inflight=${inflight} controls=${controlCount} paused=${videoPaused}`);
|
|
90
|
+
}, 10_000) : null;
|
|
91
|
+
const FRAME_WINDOW = 3;
|
|
92
|
+
const send = (payload) => {
|
|
93
|
+
if (closed || socket.readyState !== 1) {
|
|
94
|
+
if (!androidSendSkipLogged) {
|
|
95
|
+
androidSendSkipLogged = true;
|
|
96
|
+
console.log(`[android] send skipped serial=${serial} closed=${closed} readyState=${socket.readyState} type=${String(payload.type)}`);
|
|
97
|
+
}
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
try {
|
|
101
|
+
socket.send(JSON.stringify(payload));
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
console.log(`[android] send failed serial=${serial} type=${String(payload.type)} ${error instanceof Error ? error.message : 'unknown'}`);
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
const shutdown = (reason) => {
|
|
108
|
+
if (closed)
|
|
109
|
+
return;
|
|
110
|
+
closed = true;
|
|
111
|
+
clearInterval(flowTimer);
|
|
112
|
+
if (statsTimer)
|
|
113
|
+
clearInterval(statsTimer);
|
|
114
|
+
if (DEBUG_ANDROID)
|
|
115
|
+
console.log(`[android] session end serial=${serial} sent=${sent} acked=${acked} reason=${reason ?? 'ok'}`);
|
|
116
|
+
if (reason)
|
|
117
|
+
send({ type: 'error', message: reason });
|
|
118
|
+
try {
|
|
119
|
+
session?.stop();
|
|
120
|
+
}
|
|
121
|
+
catch { /* ignore */ }
|
|
122
|
+
session = null;
|
|
123
|
+
try {
|
|
124
|
+
socket.close(1000, reason ? 'error' : 'closed');
|
|
125
|
+
}
|
|
126
|
+
catch { /* ignore */ }
|
|
127
|
+
};
|
|
128
|
+
socket.on('close', () => { closed = true; clearInterval(flowTimer); if (statsTimer)
|
|
129
|
+
clearInterval(statsTimer); void session?.stop(); session = null; });
|
|
130
|
+
socket.on('error', () => { closed = true; clearInterval(flowTimer); if (statsTimer)
|
|
131
|
+
clearInterval(statsTimer); void session?.stop(); session = null; });
|
|
132
|
+
session = createScrcpySession(serial, {
|
|
133
|
+
onHeader: header => { send({ type: 'header', ...header }); },
|
|
134
|
+
onFrame: frame => {
|
|
135
|
+
if (closed)
|
|
136
|
+
return;
|
|
137
|
+
// 不丢任何帧:客户端慢时暂停视频 socket,用反压换低延迟。
|
|
138
|
+
inflight++;
|
|
139
|
+
if (DEBUG_ANDROID && (sent < 12 || frame.keyFrame))
|
|
140
|
+
console.log(`[android] send frame #${sent} serial=${serial} config=${frame.config} key=${frame.keyFrame} bytes=${frame.data.length}`);
|
|
141
|
+
sent++;
|
|
142
|
+
lastFrameAt = Date.now();
|
|
143
|
+
send({
|
|
144
|
+
type: 'frame', seq: ++seq, config: frame.config, key: frame.keyFrame,
|
|
145
|
+
pts: frame.pts.toString(), data: frame.data.toString('base64'),
|
|
146
|
+
});
|
|
147
|
+
if (!videoPaused && inflight >= FRAME_WINDOW) {
|
|
148
|
+
videoPaused = true;
|
|
149
|
+
session?.pauseVideo();
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
onError: error => shutdown(error.message || 'SCRCPY_ERROR'),
|
|
153
|
+
onClose: () => { if (!closed) {
|
|
154
|
+
send({ type: 'closed' });
|
|
155
|
+
closed = true;
|
|
156
|
+
try {
|
|
157
|
+
socket.close(1000, 'closed');
|
|
158
|
+
}
|
|
159
|
+
catch { /* ignore */ }
|
|
160
|
+
} },
|
|
161
|
+
}, quality);
|
|
162
|
+
void session.start().catch(error => shutdown(error instanceof Error ? error.message : 'SCRCPY_START_FAILED'));
|
|
163
|
+
socket.on('message', raw => {
|
|
164
|
+
if (closed || !session)
|
|
165
|
+
return;
|
|
166
|
+
let message;
|
|
167
|
+
try {
|
|
168
|
+
message = JSON.parse(typeof raw === 'string' ? raw : raw.toString('utf8'));
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
switch (message.type) {
|
|
174
|
+
case 'control': {
|
|
175
|
+
if (typeof message.data !== 'string' || message.data.length > 64 * 1024)
|
|
176
|
+
return;
|
|
177
|
+
const bytes = Buffer.from(message.data, 'base64');
|
|
178
|
+
const ok = session.sendControl(bytes);
|
|
179
|
+
if (DEBUG_ANDROID && controlCount++ < 8) {
|
|
180
|
+
const detail = bytes[0] === 2 && bytes.length >= 32
|
|
181
|
+
? ` touch action=${bytes[1]} x=${bytes.readUInt32BE(10)} y=${bytes.readUInt32BE(14)} size=${bytes.readUInt16BE(18)}x${bytes.readUInt16BE(20)}`
|
|
182
|
+
: ` type=${bytes[0]}`;
|
|
183
|
+
console.log(`[android] control #${controlCount} serial=${serial} bytes=${bytes.length} written=${ok}${detail}`);
|
|
184
|
+
}
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
187
|
+
case 'ack': {
|
|
188
|
+
if (typeof message.seq === 'number') {
|
|
189
|
+
inflight = Math.max(0, inflight - 1);
|
|
190
|
+
acked++;
|
|
191
|
+
lastAckAt = Date.now();
|
|
192
|
+
if (videoPaused && inflight < FRAME_WINDOW) {
|
|
193
|
+
videoPaused = false;
|
|
194
|
+
session?.resumeVideo();
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
break;
|
|
198
|
+
}
|
|
199
|
+
case 'ping':
|
|
200
|
+
send({ type: 'pong' });
|
|
201
|
+
break;
|
|
202
|
+
default: break;
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
}
|
|
@@ -24,7 +24,7 @@ import { getPtyHostManager } from '../ptyhost/manager.js';
|
|
|
24
24
|
import { pathValidator } from '../utils/pathValidator.js';
|
|
25
25
|
import { TERMINAL, TMUX } from '../config.js';
|
|
26
26
|
import { localAccessManager } from '../utils/localAccess.js';
|
|
27
|
-
import { normalizeLocalAccessName, getLocaleSetting, setLocaleSetting, getContextDraftHeightSetting, setContextDraftHeightSetting, getAutoRenameAgentsSetting, setAutoRenameAgentsSetting, getAutoRenameNamerSetting, setAutoRenameNamerSetting, getAutoRenameModelsSetting, setAutoRenameModelsSetting, getAutoRenameIntervalMinutesSetting, setAutoRenameIntervalMinutesSetting, getAutoRenamePromptPreferenceSetting, setAutoRenamePromptPreferenceSetting, getAutoRenamePromptPayloadCharsSetting, setAutoRenamePromptPayloadCharsSetting, getNewSessionAgentSlugSetting, setNewSessionAgentSlugSetting, getRunningSessionButtonEnabledSetting, getCollaborationPanelsSetting, setCollaborationPanelSetting, getCollaborationFloatingGroupIdSetting, setCollaborationFloatingGroupIdSetting, getServiceSwitcherExpandedSetting, setServiceSwitcherExpandedSetting, setRunningSessionButtonEnabledSetting, getFileSortModesSetting, setFileSortModesSetting, setFileSortModeSetting, getNestedGitScanRootsSetting, setNestedGitScanRootSetting, getPinnedExplorerRootsSetting, setPinnedExplorerRootsSetting, setPinnedExplorerRootSetting, watchPinnedExplorerRootsSetting, } from '../utils/settings.js';
|
|
27
|
+
import { normalizeLocalAccessName, getLocaleSetting, setLocaleSetting, getContextDraftHeightSetting, setContextDraftHeightSetting, getAutoRenameAgentsSetting, setAutoRenameAgentsSetting, getAutoRenameNamerSetting, setAutoRenameNamerSetting, getAutoRenameModelsSetting, setAutoRenameModelsSetting, getAutoRenameIntervalMinutesSetting, setAutoRenameIntervalMinutesSetting, getAutoRenamePromptPreferenceSetting, setAutoRenamePromptPreferenceSetting, getAutoRenamePromptPayloadCharsSetting, setAutoRenamePromptPayloadCharsSetting, getNewSessionAgentSlugSetting, setNewSessionAgentSlugSetting, getRunningSessionButtonEnabledSetting, getCollaborationPanelsSetting, setCollaborationPanelSetting, getAndroidPanelSetting, setAndroidPanelSetting, normalizeAndroidPanel, getCollaborationFloatingGroupIdSetting, setCollaborationFloatingGroupIdSetting, getServiceSwitcherExpandedSetting, setServiceSwitcherExpandedSetting, setRunningSessionButtonEnabledSetting, getFileSortModesSetting, setFileSortModesSetting, setFileSortModeSetting, getNestedGitScanRootsSetting, setNestedGitScanRootSetting, getPinnedExplorerRootsSetting, setPinnedExplorerRootsSetting, setPinnedExplorerRootSetting, watchPinnedExplorerRootsSetting, } from '../utils/settings.js';
|
|
28
28
|
import { loadContextDraft, saveContextDraft } from '../utils/contextDraft.js';
|
|
29
29
|
import { getOnboardingServerUrl } from '../onboardingServer.js';
|
|
30
30
|
import { inspectLinuxInotifyUsage, isWatchResourceExhaustion } from '../utils/fileWatchPolicy.js';
|
|
@@ -6164,6 +6164,7 @@ async function getSettingsPayload() {
|
|
|
6164
6164
|
newSessionAgentSlug: getNewSessionAgentSlugSetting(),
|
|
6165
6165
|
runningSessionButtonEnabled: getRunningSessionButtonEnabledSetting(),
|
|
6166
6166
|
collaborationPanels: getCollaborationPanelsSetting(),
|
|
6167
|
+
androidPanel: getAndroidPanelSetting(),
|
|
6167
6168
|
collaborationFloatingGroupId: getCollaborationFloatingGroupIdSetting(),
|
|
6168
6169
|
serviceSwitcherExpanded: getServiceSwitcherExpandedSetting(),
|
|
6169
6170
|
fileSortModes: getFileSortModesSetting(),
|
|
@@ -6287,6 +6288,17 @@ router.put('/settings', async (req, res) => {
|
|
|
6287
6288
|
}
|
|
6288
6289
|
setNewSessionAgentSlugSetting(slug);
|
|
6289
6290
|
}
|
|
6291
|
+
if (body.androidPanel && typeof body.androidPanel === 'object') {
|
|
6292
|
+
// 与现有设置合并后再校验:允许只更新部分字段(如仅切开关)。
|
|
6293
|
+
const merged = normalizeAndroidPanel({ ...getAndroidPanelSetting(), ...body.androidPanel });
|
|
6294
|
+
setAndroidPanelSetting({
|
|
6295
|
+
enabled: merged.enabled,
|
|
6296
|
+
quality: merged.quality,
|
|
6297
|
+
activePresetId: merged.activePresetId,
|
|
6298
|
+
presets: merged.presets,
|
|
6299
|
+
deviceSerial: merged.deviceSerial,
|
|
6300
|
+
});
|
|
6301
|
+
}
|
|
6290
6302
|
if (body.collaborationPanel && typeof body.collaborationPanel.clientId === 'string') {
|
|
6291
6303
|
setCollaborationPanelSetting(body.collaborationPanel.clientId, body.collaborationPanel.state);
|
|
6292
6304
|
}
|
|
@@ -22,6 +22,8 @@ export function apiAccessGate(localToken) {
|
|
|
22
22
|
// Preview capabilities perform scoped, session-bound authentication themselves.
|
|
23
23
|
if (['GET', 'HEAD'].includes(req.method) && /^\/terminal\/fs\/preview\//.test(path))
|
|
24
24
|
return true;
|
|
25
|
-
|
|
25
|
+
// 本机 CLI/Agent 用 0600 token 直连 /android 与 terminal 同级:都直通本机
|
|
26
|
+
// 进程,且这个 bypass 仅限 loopback 且不带 origin。
|
|
27
|
+
return isTrustedLocalRequest(req, localToken) && (/^\/(?:terminal|local|android)(?:\/|$)/.test(path) || path === '/diagnostics/runtime');
|
|
26
28
|
} });
|
|
27
29
|
}
|
|
@@ -82,6 +82,46 @@ export function normalizeNestedGitScanRoots(value) {
|
|
|
82
82
|
.filter(([rootPath, enabled]) => enabled === true && isAbsoluteFilePath(rootPath))
|
|
83
83
|
.slice(-500));
|
|
84
84
|
}
|
|
85
|
+
function normalizeAndroidQuality(value) {
|
|
86
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
87
|
+
return null;
|
|
88
|
+
const item = value;
|
|
89
|
+
if (item.id !== 'low' && item.id !== 'medium' && item.id !== 'high' && item.id !== 'custom')
|
|
90
|
+
return null;
|
|
91
|
+
const maxSize = typeof item.maxSize === 'number' ? Math.max(360, Math.min(2160, Math.round(item.maxSize))) : 1080;
|
|
92
|
+
const bitRate = typeof item.bitRate === 'number' ? Math.max(300_000, Math.min(30_000_000, Math.round(item.bitRate))) : 4_000_000;
|
|
93
|
+
const maxFps = typeof item.maxFps === 'number' ? Math.max(0, Math.min(60, Math.round(item.maxFps))) : 30;
|
|
94
|
+
return { id: item.id, maxSize, bitRate, maxFps };
|
|
95
|
+
}
|
|
96
|
+
export function normalizeAndroidPanel(value) {
|
|
97
|
+
const raw = value && typeof value === 'object' && !Array.isArray(value) ? value : {};
|
|
98
|
+
const enabled = raw.enabled !== false;
|
|
99
|
+
const quality = normalizeAndroidQuality(raw.quality);
|
|
100
|
+
const presets = [];
|
|
101
|
+
if (Array.isArray(raw.presets)) {
|
|
102
|
+
const seen = new Set();
|
|
103
|
+
for (const entry of raw.presets.slice(0, 12)) {
|
|
104
|
+
if (!entry || typeof entry !== 'object' || Array.isArray(entry))
|
|
105
|
+
continue;
|
|
106
|
+
const item = entry;
|
|
107
|
+
if (typeof item.id !== 'string' || !/^[a-z0-9-]{1,40}$/.test(item.id) || seen.has(item.id))
|
|
108
|
+
continue;
|
|
109
|
+
const name = typeof item.name === 'string' ? item.name.trim().slice(0, 40) : '';
|
|
110
|
+
if (!name)
|
|
111
|
+
continue;
|
|
112
|
+
const values = normalizeAndroidQuality({ ...item, id: 'custom' });
|
|
113
|
+
if (!values)
|
|
114
|
+
continue;
|
|
115
|
+
seen.add(item.id);
|
|
116
|
+
presets.push({ id: item.id, name, maxSize: values.maxSize, bitRate: values.bitRate, maxFps: values.maxFps });
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
const activePresetId = typeof raw.activePresetId === 'string' && presets.some(preset => preset.id === raw.activePresetId)
|
|
120
|
+
? raw.activePresetId
|
|
121
|
+
: null;
|
|
122
|
+
const deviceSerial = typeof raw.deviceSerial === 'string' && /^[0-9a-zA-Z_.:\-]{1,128}$/.test(raw.deviceSerial) ? raw.deviceSerial : null;
|
|
123
|
+
return { enabled, quality, activePresetId, presets, deviceSerial };
|
|
124
|
+
}
|
|
85
125
|
export function normalizePinnedExplorerRoots(value) {
|
|
86
126
|
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
87
127
|
return {};
|
|
@@ -157,6 +197,7 @@ function normalizeSettings(value) {
|
|
|
157
197
|
newSessionAgentSlug: normalizeNewSessionAgentSlug(raw.newSessionAgentSlug),
|
|
158
198
|
runningSessionButtonEnabled: raw.runningSessionButtonEnabled === true,
|
|
159
199
|
collaborationPanels: normalizeCollaborationPanels(raw.collaborationPanels),
|
|
200
|
+
androidPanel: normalizeAndroidPanel(raw.androidPanel),
|
|
160
201
|
collaborationFloatingGroupId: typeof raw.collaborationFloatingGroupId === 'string' && raw.collaborationFloatingGroupId.trim() ? raw.collaborationFloatingGroupId.trim() : null,
|
|
161
202
|
serviceSwitcherExpanded: raw.serviceSwitcherExpanded === true,
|
|
162
203
|
fileSortModes: normalizeFileSortModes(raw.fileSortModes),
|
|
@@ -626,6 +667,12 @@ export function normalizeCollaborationPanels(value, depth = 0) {
|
|
|
626
667
|
}
|
|
627
668
|
return result;
|
|
628
669
|
}
|
|
670
|
+
export function getAndroidPanelSetting() { return loadSettings().androidPanel; }
|
|
671
|
+
export function setAndroidPanelSetting(patch) {
|
|
672
|
+
return updateSettings((settings) => {
|
|
673
|
+
settings.androidPanel = normalizeAndroidPanel({ ...settings.androidPanel, ...patch });
|
|
674
|
+
});
|
|
675
|
+
}
|
|
629
676
|
export function getCollaborationPanelsSetting() { return loadSettings().collaborationPanels; }
|
|
630
677
|
export function setCollaborationPanelSetting(clientId, patch) {
|
|
631
678
|
const normalized = normalizeCollaborationPanels({ [clientId]: patch })[clientId];
|
package/package.json
CHANGED
package/runtime-manifest.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"packageName": "termdock",
|
|
4
|
-
"version": "1.4.
|
|
4
|
+
"version": "1.4.250",
|
|
5
5
|
"runtimeProtocolVersion": 1,
|
|
6
6
|
"minimumDesktopVersion": "1.4.46",
|
|
7
7
|
"nodeMajor": 22,
|
|
8
8
|
"dependencyHash": "sha256-K4KyYJuVoQDpZsBM8ZX1Rw3MddOxAzVdp/cPm0iGZz0=",
|
|
9
|
-
"serverBundleHash": "sha256-
|
|
10
|
-
"clientBundleHash": "sha256-
|
|
9
|
+
"serverBundleHash": "sha256-1E5hCGamv5B/YzX9sMhApO31wShlVXdjYJKwfa6TkMM=",
|
|
10
|
+
"clientBundleHash": "sha256-sht1vCY8isEbGmegij8u2HwDEN/4NxU/UsNLOyKGXqs=",
|
|
11
11
|
"entrypoint": "dist/server/cli.js",
|
|
12
12
|
"clientEntrypoint": "dist/client/index.html"
|
|
13
13
|
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|