termdock 1.4.267 → 1.4.269
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-BqE8LI-u.js → App--r7RuswE.js} +29 -29
- package/dist/client/assets/App--r7RuswE.js.br +0 -0
- package/dist/client/assets/App--r7RuswE.js.gz +0 -0
- package/dist/client/assets/{ChangeWalkthroughPanel-DQ9OebFq.js → ChangeWalkthroughPanel-Df7-QnOp.js} +1 -1
- package/dist/client/assets/ChangeWalkthroughPanel-Df7-QnOp.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-Df7-QnOp.js.gz +0 -0
- package/dist/client/assets/{DagPlayground-DeV5N-IP.js → DagPlayground-DqCvsG34.js} +1 -1
- package/dist/client/assets/DagPlayground-DqCvsG34.js.br +0 -0
- package/dist/client/assets/DagPlayground-DqCvsG34.js.gz +0 -0
- package/dist/client/assets/{DiffLab-O24yUnne.js → DiffLab-6zvF9Nax.js} +1 -1
- package/dist/client/assets/DiffLab-6zvF9Nax.js.br +0 -0
- package/dist/client/assets/DiffLab-6zvF9Nax.js.gz +0 -0
- package/dist/client/assets/DiffReview-gvOLe661.js +1 -0
- package/dist/client/assets/DiffReview-gvOLe661.js.br +0 -0
- package/dist/client/assets/DiffReview-gvOLe661.js.gz +0 -0
- package/dist/client/assets/{DiffReviewLab-CQC9aCyy.js → DiffReviewLab-BUAtsrSJ.js} +1 -1
- package/dist/client/assets/DiffReviewLab-BUAtsrSJ.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-BUAtsrSJ.js.gz +0 -0
- package/dist/client/assets/DiffViewer-CSIpMRDj.js +37 -0
- package/dist/client/assets/DiffViewer-CSIpMRDj.js.br +0 -0
- package/dist/client/assets/DiffViewer-CSIpMRDj.js.gz +0 -0
- package/dist/client/assets/{ModelPreview-iqwfAi-Q.js → ModelPreview-BzJVoE_R.js} +1 -1
- package/dist/client/assets/ModelPreview-BzJVoE_R.js.br +0 -0
- package/dist/client/assets/ModelPreview-BzJVoE_R.js.gz +0 -0
- package/dist/client/assets/{RightSidebar-CJ5Ro_lE.js → RightSidebar-BaBLmdFY.js} +4 -4
- package/dist/client/assets/RightSidebar-BaBLmdFY.js.br +0 -0
- package/dist/client/assets/RightSidebar-BaBLmdFY.js.gz +0 -0
- package/dist/client/assets/{abnfDiagram-VCTEODGH-CPSz-oKS.js → abnfDiagram-VCTEODGH-BbT6N4wQ.js} +1 -1
- package/dist/client/assets/abnfDiagram-VCTEODGH-BbT6N4wQ.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-BbT6N4wQ.js.gz +0 -0
- package/dist/client/assets/{app-CG4wRJiV.js → app-DCC2Pki1.js} +4 -4
- package/dist/client/assets/app-DCC2Pki1.js.br +0 -0
- package/dist/client/assets/app-DCC2Pki1.js.gz +0 -0
- package/dist/client/assets/{arc-DEku29dO.js → arc-D2SgTEaJ.js} +1 -1
- package/dist/client/assets/arc-D2SgTEaJ.js.br +0 -0
- package/dist/client/assets/arc-D2SgTEaJ.js.gz +0 -0
- package/dist/client/assets/{architectureDiagram-5GKGNRK7-D-mHitIB.js → architectureDiagram-5GKGNRK7-K88NXr0C.js} +1 -1
- package/dist/client/assets/architectureDiagram-5GKGNRK7-K88NXr0C.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-K88NXr0C.js.gz +0 -0
- package/dist/client/assets/{blockDiagram-I7D4REHJ-CrNXWWMo.js → blockDiagram-I7D4REHJ-DlVHOb6O.js} +1 -1
- package/dist/client/assets/blockDiagram-I7D4REHJ-DlVHOb6O.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-DlVHOb6O.js.gz +0 -0
- package/dist/client/assets/{c4Diagram-7LVT6UL2-Aabqu3DW.js → c4Diagram-7LVT6UL2-DKqMikT-.js} +1 -1
- package/dist/client/assets/c4Diagram-7LVT6UL2-DKqMikT-.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-DKqMikT-.js.gz +0 -0
- package/dist/client/assets/channel-Uyb4U6IY.js +1 -0
- package/dist/client/assets/{chunk-2Q5K7J3B-CtS0wd2P.js → chunk-2Q5K7J3B-DEVqpD5d.js} +1 -1
- package/dist/client/assets/{chunk-5VM5RSS4-BmRWnayq.js → chunk-5VM5RSS4-LRLeMiUW.js} +1 -1
- package/dist/client/assets/{chunk-F27PBJKO-B1Xs_Obp.js → chunk-F27PBJKO-DaPxcSH5.js} +1 -1
- package/dist/client/assets/chunk-F27PBJKO-DaPxcSH5.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-DaPxcSH5.js.gz +0 -0
- package/dist/client/assets/{chunk-IMKFNOWR-DGBc6K0o.js → chunk-IMKFNOWR-CKvFYp0b.js} +1 -1
- package/dist/client/assets/chunk-IMKFNOWR-CKvFYp0b.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-CKvFYp0b.js.gz +0 -0
- package/dist/client/assets/{chunk-JWPE2WC7-ZSQlXy77.js → chunk-JWPE2WC7-CTT8841x.js} +1 -1
- package/dist/client/assets/{chunk-POPQ4Y6H-lOdiBcDa.js → chunk-POPQ4Y6H-BntrWhUu.js} +1 -1
- package/dist/client/assets/{chunk-SVP7TREG-BEAii929.js → chunk-SVP7TREG-Dku7-lW7.js} +1 -1
- package/dist/client/assets/chunk-SVP7TREG-Dku7-lW7.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-Dku7-lW7.js.gz +0 -0
- package/dist/client/assets/{chunk-TICWLB2K-DYDwgjz6.js → chunk-TICWLB2K-CRKGdIuN.js} +1 -1
- package/dist/client/assets/chunk-TICWLB2K-CRKGdIuN.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-CRKGdIuN.js.gz +0 -0
- package/dist/client/assets/{chunk-XXDRQBXY-DTyJgD5V.js → chunk-XXDRQBXY-DCuScH2W.js} +1 -1
- package/dist/client/assets/classDiagram-ZZMXUADV-DgGaiyJi.js +1 -0
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-DgGaiyJi.js +1 -0
- package/dist/client/assets/{cose-bilkent-JH36ORCC-B_LczeML.js → cose-bilkent-JH36ORCC-D4bCAhgH.js} +1 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-D4bCAhgH.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-D4bCAhgH.js.gz +0 -0
- package/dist/client/assets/{cynefin-OW5HDTMX-iUNCJhXp.js → cynefin-OW5HDTMX-BXxrTkIn.js} +1 -1
- package/dist/client/assets/cynefin-OW5HDTMX-BXxrTkIn.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-BXxrTkIn.js.gz +0 -0
- package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-D0qz1YON.js → cynefinDiagram-5FMLGOSQ-DH-JBXRO.js} +1 -1
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-DH-JBXRO.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-DH-JBXRO.js.gz +0 -0
- package/dist/client/assets/{dagre-GXQ25YYZ-DoNbof8W.js → dagre-GXQ25YYZ-CKnImtBM.js} +1 -1
- package/dist/client/assets/dagre-GXQ25YYZ-CKnImtBM.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-CKnImtBM.js.gz +0 -0
- package/dist/client/assets/{diagram-S7CK7UJ4-CjmclMId.js → diagram-S7CK7UJ4-DInUTNtP.js} +1 -1
- package/dist/client/assets/diagram-S7CK7UJ4-DInUTNtP.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-DInUTNtP.js.gz +0 -0
- package/dist/client/assets/{diagram-UQ7AKVKN-CL9cPDna.js → diagram-UQ7AKVKN-BzfdOyaG.js} +1 -1
- package/dist/client/assets/diagram-UQ7AKVKN-BzfdOyaG.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-BzfdOyaG.js.gz +0 -0
- package/dist/client/assets/{diagram-VSXAHHWV-BuSsBHdW.js → diagram-VSXAHHWV-bVosICmB.js} +1 -1
- package/dist/client/assets/diagram-VSXAHHWV-bVosICmB.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-bVosICmB.js.gz +0 -0
- package/dist/client/assets/{diagram-VX7I27RA-83S-m6VI.js → diagram-VX7I27RA-BUaLNFYz.js} +1 -1
- package/dist/client/assets/diagram-VX7I27RA-BUaLNFYz.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-BUaLNFYz.js.gz +0 -0
- package/dist/client/assets/{diagram-Z3DM3KII-DVBe23Hs.js → diagram-Z3DM3KII-DAUkkL9_.js} +1 -1
- package/dist/client/assets/diagram-Z3DM3KII-DAUkkL9_.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-DAUkkL9_.js.gz +0 -0
- package/dist/client/assets/{ebnfDiagram-PWID7BFC-Dg-KWuTD.js → ebnfDiagram-PWID7BFC-C-se8H0Y.js} +1 -1
- package/dist/client/assets/ebnfDiagram-PWID7BFC-C-se8H0Y.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-C-se8H0Y.js.gz +0 -0
- package/dist/client/assets/{erDiagram-RLTQ6QDP-DSSWaahL.js → erDiagram-RLTQ6QDP-CG6x1OqJ.js} +1 -1
- package/dist/client/assets/erDiagram-RLTQ6QDP-CG6x1OqJ.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-CG6x1OqJ.js.gz +0 -0
- package/dist/client/assets/{flowDiagram-HODETNUW-BdLuB2iN.js → flowDiagram-HODETNUW-CiTMZP2n.js} +1 -1
- package/dist/client/assets/flowDiagram-HODETNUW-CiTMZP2n.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-CiTMZP2n.js.gz +0 -0
- package/dist/client/assets/{ganttDiagram-EL5Y4UJY-Chs1ygCY.js → ganttDiagram-EL5Y4UJY-BpM-Xxm8.js} +1 -1
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-BpM-Xxm8.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-BpM-Xxm8.js.gz +0 -0
- package/dist/client/assets/{gestureArbiter-CRTAj9c5.js → gestureArbiter-Du2umsFD.js} +1 -1
- package/dist/client/assets/gestureArbiter-Du2umsFD.js.br +0 -0
- package/dist/client/assets/gestureArbiter-Du2umsFD.js.gz +0 -0
- package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-BAo61MYb.js → gitGraphDiagram-WWUBYQGX-D4UhrsZS.js} +1 -1
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-D4UhrsZS.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-D4UhrsZS.js.gz +0 -0
- package/dist/client/assets/{infoDiagram-27XIBGKW-D_VLCYHJ.js → infoDiagram-27XIBGKW-B_64artu.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-5VMMS53U-CbDv2mvs.js → ishikawaDiagram-5VMMS53U-BXl8es4M.js} +1 -1
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-BXl8es4M.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-BXl8es4M.js.gz +0 -0
- package/dist/client/assets/{journeyDiagram-3NMN7TZE-CV_iBuZn.js → journeyDiagram-3NMN7TZE-BDmGKZs3.js} +1 -1
- package/dist/client/assets/journeyDiagram-3NMN7TZE-BDmGKZs3.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-BDmGKZs3.js.gz +0 -0
- package/dist/client/assets/{kanban-definition-UXKFOSKX-C7O4Bh1q.js → kanban-definition-UXKFOSKX-BKjheeYf.js} +1 -1
- package/dist/client/assets/kanban-definition-UXKFOSKX-BKjheeYf.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-BKjheeYf.js.gz +0 -0
- package/dist/client/assets/{layout-klNTG6uR.js → layout-B7t1dEXe.js} +1 -1
- package/dist/client/assets/layout-B7t1dEXe.js.br +0 -0
- package/dist/client/assets/layout-B7t1dEXe.js.gz +0 -0
- package/dist/client/assets/{linear-BGNAzPTT.js → linear-DEmcfJwb.js} +1 -1
- package/dist/client/assets/linear-DEmcfJwb.js.br +0 -0
- package/dist/client/assets/linear-DEmcfJwb.js.gz +0 -0
- package/dist/client/assets/{mermaid.core-BSzAHLGl.js → mermaid.core-cr3MFg62.js} +5 -5
- package/dist/client/assets/mermaid.core-cr3MFg62.js.br +0 -0
- package/dist/client/assets/mermaid.core-cr3MFg62.js.gz +0 -0
- package/dist/client/assets/{mindmap-definition-YA3MSWOX-p44N-fmd.js → mindmap-definition-YA3MSWOX-Pqk3YsZA.js} +1 -1
- package/dist/client/assets/mindmap-definition-YA3MSWOX-Pqk3YsZA.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-Pqk3YsZA.js.gz +0 -0
- package/dist/client/assets/{passwordBootstrap-FAUekDm3.js → passwordBootstrap-zDAux6sN.js} +1 -1
- package/dist/client/assets/passwordBootstrap-zDAux6sN.js.br +0 -0
- package/dist/client/assets/passwordBootstrap-zDAux6sN.js.gz +0 -0
- package/dist/client/assets/{pegDiagram-XKGWAZYB-D_9s0OO_.js → pegDiagram-XKGWAZYB-BoII79ja.js} +1 -1
- package/dist/client/assets/pegDiagram-XKGWAZYB-BoII79ja.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-BoII79ja.js.gz +0 -0
- package/dist/client/assets/{pieDiagram-E7YTZNPT-B7EbdgJt.js → pieDiagram-E7YTZNPT-CLP3akcm.js} +1 -1
- package/dist/client/assets/pieDiagram-E7YTZNPT-CLP3akcm.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-CLP3akcm.js.gz +0 -0
- package/dist/client/assets/{quadrantDiagram-AXDQQJYC-BY028AbD.js → quadrantDiagram-AXDQQJYC-BQjxA6xd.js} +1 -1
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-BQjxA6xd.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-BQjxA6xd.js.gz +0 -0
- package/dist/client/assets/{railroadDiagram-O6MQD6OU-C_SqJJH4.js → railroadDiagram-O6MQD6OU-CvOBB6Kz.js} +1 -1
- package/dist/client/assets/railroadDiagram-O6MQD6OU-CvOBB6Kz.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-CvOBB6Kz.js.gz +0 -0
- package/dist/client/assets/{referenceLongPress-zPADrRaZ.js → referenceLongPress-DhvF4-YJ.js} +1 -1
- package/dist/client/assets/referenceLongPress-DhvF4-YJ.js.br +0 -0
- package/dist/client/assets/referenceLongPress-DhvF4-YJ.js.gz +0 -0
- package/dist/client/assets/{requirementDiagram-BXWQKSXE-CROJTpxc.js → requirementDiagram-BXWQKSXE-BfnQwXw8.js} +1 -1
- package/dist/client/assets/{requirementDiagram-BXWQKSXE-CROJTpxc.js.br → requirementDiagram-BXWQKSXE-BfnQwXw8.js.br} +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-BfnQwXw8.js.gz +0 -0
- package/dist/client/assets/{sankeyDiagram-P5KCCOFB-CiWfwd5j.js → sankeyDiagram-P5KCCOFB-rj4XdP2T.js} +1 -1
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-rj4XdP2T.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-rj4XdP2T.js.gz +0 -0
- package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-Bv-q4vX3.js → sequenceDiagram-WJ2MYXX4-BFtfWTMp.js} +1 -1
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-BFtfWTMp.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-BFtfWTMp.js.gz +0 -0
- package/dist/client/assets/{sizeCapture-INFHLROL-TQt_I2TN.js → sizeCapture-INFHLROL-BbzC5eVk.js} +1 -1
- package/dist/client/assets/sizeCapture-INFHLROL-BbzC5eVk.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-BbzC5eVk.js.gz +0 -0
- package/dist/client/assets/{sparkles-Cm5WG6yy.js → sparkles-B8gtfPrQ.js} +1 -1
- package/dist/client/assets/{stateDiagram-D77RDMKH-CxWjp4b2.js → stateDiagram-D77RDMKH-CF9cUXyi.js} +1 -1
- package/dist/client/assets/stateDiagram-D77RDMKH-CF9cUXyi.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-CF9cUXyi.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-CZVJAwnv.js +1 -0
- package/dist/client/assets/{swimlanes-42K2YHIH-gPs5aEkb.js → swimlanes-42K2YHIH-BB2FN27h.js} +1 -1
- package/dist/client/assets/swimlanes-42K2YHIH-BB2FN27h.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH-BB2FN27h.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-yKb8MUvL.js +8 -0
- package/dist/client/assets/{timeline-definition-24CTP7MA-CSCxdiQd.js → timeline-definition-24CTP7MA-Cy5znMl0.js} +1 -1
- package/dist/client/assets/timeline-definition-24CTP7MA-Cy5znMl0.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-Cy5znMl0.js.gz +0 -0
- package/dist/client/assets/{triangle-alert-CgKcVAti.js → triangle-alert-C7GRge3t.js} +1 -1
- package/dist/client/assets/{vennDiagram-4TSXK5OY-BY2UkIDT.js → vennDiagram-4TSXK5OY-BxbDCMXP.js} +1 -1
- package/dist/client/assets/vennDiagram-4TSXK5OY-BxbDCMXP.js.br +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-BxbDCMXP.js.gz +0 -0
- package/dist/client/assets/{wardleyDiagram-VM6X3IG4-D8yK4oK5.js → wardleyDiagram-VM6X3IG4-D_ApxRrj.js} +1 -1
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-D_ApxRrj.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-D_ApxRrj.js.gz +0 -0
- package/dist/client/assets/{xychartDiagram-S5SC5T6Z-C4MnXqQN.js → xychartDiagram-S5SC5T6Z-DYpLzNya.js} +1 -1
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-DYpLzNya.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-DYpLzNya.js.gz +0 -0
- package/dist/client/index.html +1 -1
- package/dist/client/index.html.br +0 -0
- package/dist/client/index.html.gz +0 -0
- package/dist/client/sw.js +1 -1
- package/dist/client/sw.js.br +0 -0
- package/dist/client/sw.js.gz +0 -0
- package/dist/server/android/liveBitrate.js +78 -18
- package/dist/server/android/scrcpy.js +20 -6
- package/dist/server/routes/android.js +3 -2
- package/dist/server/routes/filesystem.js +29 -15
- package/package.json +1 -1
- package/runtime-manifest.json +3 -3
- package/scripts/android-bitrate/CaptureReset.java +17 -7
- package/scripts/android-bitrate/README.md +18 -6
- package/scripts/android-bitrate/bitrate.jar +0 -0
- package/scripts/android-bitrate/fetch-server.sh +12 -0
- package/scripts/android-bitrate/scrcpy-server-v3.3.4 +0 -0
- package/dist/client/assets/App-BqE8LI-u.js.br +0 -0
- package/dist/client/assets/App-BqE8LI-u.js.gz +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-DQ9OebFq.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-DQ9OebFq.js.gz +0 -0
- package/dist/client/assets/DagPlayground-DeV5N-IP.js.br +0 -0
- package/dist/client/assets/DagPlayground-DeV5N-IP.js.gz +0 -0
- package/dist/client/assets/DiffLab-O24yUnne.js.br +0 -0
- package/dist/client/assets/DiffLab-O24yUnne.js.gz +0 -0
- package/dist/client/assets/DiffReview-D4QwNQmG.js +0 -1
- package/dist/client/assets/DiffReview-D4QwNQmG.js.br +0 -0
- package/dist/client/assets/DiffReview-D4QwNQmG.js.gz +0 -0
- package/dist/client/assets/DiffReviewLab-CQC9aCyy.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-CQC9aCyy.js.gz +0 -0
- package/dist/client/assets/DiffViewer-Bw703Keh.js +0 -37
- package/dist/client/assets/DiffViewer-Bw703Keh.js.br +0 -0
- package/dist/client/assets/DiffViewer-Bw703Keh.js.gz +0 -0
- package/dist/client/assets/ModelPreview-iqwfAi-Q.js.br +0 -0
- package/dist/client/assets/ModelPreview-iqwfAi-Q.js.gz +0 -0
- package/dist/client/assets/RightSidebar-CJ5Ro_lE.js.br +0 -0
- package/dist/client/assets/RightSidebar-CJ5Ro_lE.js.gz +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-CPSz-oKS.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-CPSz-oKS.js.gz +0 -0
- package/dist/client/assets/app-CG4wRJiV.js.br +0 -0
- package/dist/client/assets/app-CG4wRJiV.js.gz +0 -0
- package/dist/client/assets/arc-DEku29dO.js.br +0 -0
- package/dist/client/assets/arc-DEku29dO.js.gz +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-D-mHitIB.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-D-mHitIB.js.gz +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-CrNXWWMo.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-CrNXWWMo.js.gz +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-Aabqu3DW.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-Aabqu3DW.js.gz +0 -0
- package/dist/client/assets/channel-C8osiAYX.js +0 -1
- package/dist/client/assets/chunk-F27PBJKO-B1Xs_Obp.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-B1Xs_Obp.js.gz +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-DGBc6K0o.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-DGBc6K0o.js.gz +0 -0
- package/dist/client/assets/chunk-SVP7TREG-BEAii929.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-BEAii929.js.gz +0 -0
- package/dist/client/assets/chunk-TICWLB2K-DYDwgjz6.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-DYDwgjz6.js.gz +0 -0
- package/dist/client/assets/classDiagram-ZZMXUADV-Dym5rIMp.js +0 -1
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-Dym5rIMp.js +0 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-B_LczeML.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-B_LczeML.js.gz +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-iUNCJhXp.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-iUNCJhXp.js.gz +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-D0qz1YON.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-D0qz1YON.js.gz +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-DoNbof8W.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-DoNbof8W.js.gz +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-CjmclMId.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-CjmclMId.js.gz +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-CL9cPDna.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-CL9cPDna.js.gz +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-BuSsBHdW.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-BuSsBHdW.js.gz +0 -0
- package/dist/client/assets/diagram-VX7I27RA-83S-m6VI.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-83S-m6VI.js.gz +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-DVBe23Hs.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-DVBe23Hs.js.gz +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-Dg-KWuTD.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-Dg-KWuTD.js.gz +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-DSSWaahL.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-DSSWaahL.js.gz +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-BdLuB2iN.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-BdLuB2iN.js.gz +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-Chs1ygCY.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-Chs1ygCY.js.gz +0 -0
- package/dist/client/assets/gestureArbiter-CRTAj9c5.js.br +0 -0
- package/dist/client/assets/gestureArbiter-CRTAj9c5.js.gz +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BAo61MYb.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BAo61MYb.js.gz +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-CbDv2mvs.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-CbDv2mvs.js.gz +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-CV_iBuZn.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-CV_iBuZn.js.gz +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-C7O4Bh1q.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-C7O4Bh1q.js.gz +0 -0
- package/dist/client/assets/layout-klNTG6uR.js.br +0 -0
- package/dist/client/assets/layout-klNTG6uR.js.gz +0 -0
- package/dist/client/assets/linear-BGNAzPTT.js.br +0 -0
- package/dist/client/assets/linear-BGNAzPTT.js.gz +0 -0
- package/dist/client/assets/mermaid.core-BSzAHLGl.js.br +0 -0
- package/dist/client/assets/mermaid.core-BSzAHLGl.js.gz +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-p44N-fmd.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-p44N-fmd.js.gz +0 -0
- package/dist/client/assets/passwordBootstrap-FAUekDm3.js.br +0 -0
- package/dist/client/assets/passwordBootstrap-FAUekDm3.js.gz +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-D_9s0OO_.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-D_9s0OO_.js.gz +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-B7EbdgJt.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-B7EbdgJt.js.gz +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-BY028AbD.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-BY028AbD.js.gz +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-C_SqJJH4.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-C_SqJJH4.js.gz +0 -0
- package/dist/client/assets/referenceLongPress-zPADrRaZ.js.br +0 -0
- package/dist/client/assets/referenceLongPress-zPADrRaZ.js.gz +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-CROJTpxc.js.gz +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-CiWfwd5j.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-CiWfwd5j.js.gz +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-Bv-q4vX3.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-Bv-q4vX3.js.gz +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-TQt_I2TN.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-TQt_I2TN.js.gz +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-CxWjp4b2.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-CxWjp4b2.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-DALwTJPG.js +0 -1
- package/dist/client/assets/swimlanes-42K2YHIH-gPs5aEkb.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH-gPs5aEkb.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-DZL57C2F.js +0 -8
- package/dist/client/assets/timeline-definition-24CTP7MA-CSCxdiQd.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-CSCxdiQd.js.gz +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-BY2UkIDT.js.br +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-BY2UkIDT.js.gz +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-D8yK4oK5.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-D8yK4oK5.js.gz +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-C4MnXqQN.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-C4MnXqQN.js.gz +0 -0
|
@@ -4,7 +4,7 @@ import net from 'node:net';
|
|
|
4
4
|
import { delimiter, dirname, join } from 'node:path';
|
|
5
5
|
import { randomInt } from 'node:crypto';
|
|
6
6
|
import { adbSearchPath, resolveAdbBinary } from './adb.js';
|
|
7
|
-
import { LiveBitrateChannel,
|
|
7
|
+
import { LiveBitrateChannel, inspectLiveBitrate, resolveBundledPreviewServer, bitrateOverlayPath, bitrateOverlayRemote } from './liveBitrate.js';
|
|
8
8
|
const DEVICE_NAME_LENGTH = 64;
|
|
9
9
|
const VIDEO_HEADER_LENGTH = 12;
|
|
10
10
|
const FRAME_HEADER_LENGTH = 12;
|
|
@@ -174,7 +174,7 @@ export class ScrcpySession {
|
|
|
174
174
|
return;
|
|
175
175
|
this.started = true;
|
|
176
176
|
try {
|
|
177
|
-
const { serverJar, version } = await resolveScrcpyBinaries();
|
|
177
|
+
const { serverJar, version } = await resolveBundledPreviewServer() ?? await resolveScrcpyBinaries();
|
|
178
178
|
this.protocol = Number.parseInt(version.split('.')[0] ?? '0', 10) >= 4 ? 'session' : 'legacy';
|
|
179
179
|
const remoteJar = remoteJarPath(version);
|
|
180
180
|
await runAdbCapture(['-s', this.serial, 'push', serverJar, remoteJar], 60_000);
|
|
@@ -187,21 +187,34 @@ export class ScrcpySession {
|
|
|
187
187
|
});
|
|
188
188
|
await runAdbCapture(['-s', this.serial, 'reverse', `localabstract:scrcpy_${scidHex(this.scid)}`, `tcp:${this.port}`], 15_000);
|
|
189
189
|
let liveBitrate = false;
|
|
190
|
-
|
|
190
|
+
let bitrateFailure = await inspectLiveBitrate(serverJar, version);
|
|
191
|
+
let bitrateStage = 'BITRATE_LISTEN_FAILED';
|
|
192
|
+
const reportBitrate = (ready, detail) => {
|
|
193
|
+
if (this.stopped)
|
|
194
|
+
return;
|
|
195
|
+
const diagnostic = detail ? `${detail}; scrcpy=${version}; device=${this.serial}` : undefined;
|
|
196
|
+
if (diagnostic)
|
|
197
|
+
console.warn('[android] ' + diagnostic);
|
|
198
|
+
this.events.onBitrateSupport?.(ready, diagnostic);
|
|
199
|
+
};
|
|
200
|
+
if (!bitrateFailure) {
|
|
191
201
|
try {
|
|
192
|
-
this.bitrateChannel = new LiveBitrateChannel(
|
|
202
|
+
this.bitrateChannel = new LiveBitrateChannel(reportBitrate);
|
|
193
203
|
const port = await this.bitrateChannel.listen();
|
|
204
|
+
bitrateStage = 'BITRATE_PUSH_FAILED';
|
|
194
205
|
await runAdbCapture(['-s', this.serial, 'push', bitrateOverlayPath, bitrateOverlayRemote]);
|
|
206
|
+
bitrateStage = 'BITRATE_TUNNEL_FAILED';
|
|
195
207
|
await runAdbCapture(['-s', this.serial, 'reverse', `localabstract:termdock_bitrate_${scidHex(this.scid)}`, `tcp:${port}`]);
|
|
196
208
|
liveBitrate = true;
|
|
197
209
|
}
|
|
198
|
-
catch {
|
|
210
|
+
catch (error) {
|
|
211
|
+
bitrateFailure = `${bitrateStage}: ${String(error)}`;
|
|
199
212
|
this.bitrateChannel?.close();
|
|
200
213
|
this.bitrateChannel = null;
|
|
201
214
|
}
|
|
202
215
|
}
|
|
203
216
|
if (!liveBitrate)
|
|
204
|
-
|
|
217
|
+
reportBitrate(false, bitrateFailure ?? 'BITRATE_UNAVAILABLE');
|
|
205
218
|
if (this.stopped) {
|
|
206
219
|
this.bitrateChannel?.close();
|
|
207
220
|
this.server?.close();
|
|
@@ -399,6 +412,7 @@ export class ScrcpySession {
|
|
|
399
412
|
return false;
|
|
400
413
|
}
|
|
401
414
|
}
|
|
415
|
+
get bitrateFailure() { return this.bitrateChannel?.lastFailure; }
|
|
402
416
|
setBitrate(value) {
|
|
403
417
|
return this.bitrateChannel?.setBitrate(value) ?? Promise.resolve(false);
|
|
404
418
|
}
|
|
@@ -185,7 +185,7 @@ export function handleAndroidWebSocket(socket, serial, _clientId, requested = {}
|
|
|
185
185
|
socket.on('error', () => { closed = true; clearInterval(flowTimer); if (statsTimer)
|
|
186
186
|
clearInterval(statsTimer); void session?.stop(); session = null; });
|
|
187
187
|
session = createScrcpySession(serial, {
|
|
188
|
-
onBitrateSupport: supported => send({ type: 'bitrate-support', supported }),
|
|
188
|
+
onBitrateSupport: (supported, detail) => send({ type: 'bitrate-support', supported, detail }),
|
|
189
189
|
onHeader: header => { send({ type: 'header', ...header }); },
|
|
190
190
|
onFrame: frame => {
|
|
191
191
|
if (closed)
|
|
@@ -233,7 +233,8 @@ export function handleAndroidWebSocket(socket, serial, _clientId, requested = {}
|
|
|
233
233
|
|| message.bitRate < 300_000 || message.bitRate > 30_000_000)
|
|
234
234
|
return;
|
|
235
235
|
const requestId = message.requestId, bitRate = message.bitRate;
|
|
236
|
-
|
|
236
|
+
const current = session;
|
|
237
|
+
void current.setBitrate(bitRate).then(applied => send({ type: 'bitrate-result', requestId, bitRate, applied, detail: current.bitrateFailure }));
|
|
237
238
|
break;
|
|
238
239
|
}
|
|
239
240
|
case 'control': {
|
|
@@ -2289,23 +2289,37 @@ async function getBranchDiffPayload(workspaceRoot, repoRoot, baseBranch, options
|
|
|
2289
2289
|
return { available: false, workspaceRoot, repoRoot, baseBranch: trimmedBase, error: 'Invalid target branch name' };
|
|
2290
2290
|
}
|
|
2291
2291
|
const includeUncommitted = options?.includeUncommitted ?? true;
|
|
2292
|
-
|
|
2293
|
-
|
|
2294
|
-
|
|
2295
|
-
|
|
2296
|
-
|
|
2292
|
+
const remotes = (await execGit(['remote'], repoRoot, signal)).split('\n').filter(Boolean);
|
|
2293
|
+
const remoteBase = trimmedBase.replace(/^refs\/remotes\//, '');
|
|
2294
|
+
// Match configured remotes, not arbitrary slashes in local branch names.
|
|
2295
|
+
const baseRemote = remotes.sort((a, b) => b.length - a.length)
|
|
2296
|
+
.find((remote) => remoteBase.startsWith(`${remote}/`))
|
|
2297
|
+
?? (!trimmedBase.includes('/') && remotes.includes('origin') ? 'origin' : null);
|
|
2298
|
+
let baseRef = trimmedBase;
|
|
2299
|
+
if (baseRemote) {
|
|
2300
|
+
const remoteBranch = remoteBase.startsWith(`${baseRemote}/`)
|
|
2301
|
+
? remoteBase.slice(baseRemote.length + 1)
|
|
2302
|
+
: trimmedBase;
|
|
2303
|
+
baseRef = `${baseRemote}/${remoteBranch}`;
|
|
2304
|
+
const trackingRef = `refs/remotes/${baseRef}`;
|
|
2297
2305
|
try {
|
|
2298
|
-
|
|
2306
|
+
// Explicitly update the selected tracking ref even with a narrow fetch
|
|
2307
|
+
// refspec, and accept a baseline that was force-pushed on the remote.
|
|
2308
|
+
await execGit(['fetch', '--no-tags', '--', baseRemote, `+refs/heads/${remoteBranch}:${trackingRef}`], repoRoot, signal, GIT_ROUTE_TIMEOUT_MS);
|
|
2299
2309
|
}
|
|
2300
2310
|
catch (error) {
|
|
2301
|
-
|
|
2302
|
-
.then(() => trimmedBase)
|
|
2303
|
-
.catch(() => null);
|
|
2304
|
-
if (!localRef)
|
|
2311
|
+
if (signal.aborted)
|
|
2305
2312
|
throw error;
|
|
2306
|
-
|
|
2313
|
+
return {
|
|
2314
|
+
available: false, workspaceRoot, repoRoot, baseBranch: trimmedBase, baseRef,
|
|
2315
|
+
error: `Failed to refresh baseline ${baseRef}. Check remote access and retry. No comparison was generated from a stale local baseline.`,
|
|
2316
|
+
};
|
|
2307
2317
|
}
|
|
2308
2318
|
}
|
|
2319
|
+
// Keep the display/audit key stable, but use the full namespace for Git so
|
|
2320
|
+
// a same-named local branch cannot shadow the refreshed tracking ref.
|
|
2321
|
+
const baseGitRef = baseRemote ? `refs/remotes/${baseRef}` : baseRef;
|
|
2322
|
+
await execGit(['rev-parse', '--verify', '--quiet', `${baseGitRef}^{commit}`], repoRoot, signal);
|
|
2309
2323
|
let compareHead = 'HEAD';
|
|
2310
2324
|
if (hasRequestedHead) {
|
|
2311
2325
|
compareHead = requestedHead.includes('/') ? requestedHead : requestedHead;
|
|
@@ -2317,11 +2331,11 @@ async function getBranchDiffPayload(workspaceRoot, repoRoot, baseBranch, options
|
|
|
2317
2331
|
// instead of two overlapping per-file diffs concatenated together.
|
|
2318
2332
|
// Falls back to the concatenated form when there is no merge base.
|
|
2319
2333
|
const mergeBase = includeWorkingTree
|
|
2320
|
-
? await execGit(['merge-base',
|
|
2334
|
+
? await execGit(['merge-base', baseGitRef, compareHead], repoRoot, signal)
|
|
2321
2335
|
.then((result) => result.trim() || null)
|
|
2322
2336
|
.catch(() => null)
|
|
2323
2337
|
: null;
|
|
2324
|
-
const diffBase = mergeBase ?? `${
|
|
2338
|
+
const diffBase = mergeBase ?? `${baseGitRef}...${compareHead}`;
|
|
2325
2339
|
const fetchSeparateWorktreeDiff = includeWorkingTree && !mergeBase;
|
|
2326
2340
|
const [currentBranch, headRef, statResult, nameResult, workingNameResult, logResult, diffResult, workingDiffResult] = await Promise.all([
|
|
2327
2341
|
execGit(['branch', '--show-current'], repoRoot, signal).catch(emptyOnNonAbortGitError),
|
|
@@ -2329,7 +2343,7 @@ async function getBranchDiffPayload(workspaceRoot, repoRoot, baseBranch, options
|
|
|
2329
2343
|
execGitLimited(['diff', diffBase, '--stat'], repoRoot, MAX_BRANCH_DIFF_STAT_BYTES, false, signal),
|
|
2330
2344
|
execGitLimited(['diff', '--name-only', diffBase], repoRoot, MAX_BRANCH_DIFF_NAME_BYTES, false, signal),
|
|
2331
2345
|
fetchSeparateWorktreeDiff ? execGitLimited(['diff', '--name-only', 'HEAD'], repoRoot, MAX_BRANCH_DIFF_NAME_BYTES, false, signal) : Promise.resolve({ stdout: '', truncated: false }),
|
|
2332
|
-
execGitLimited(['log', `${
|
|
2346
|
+
execGitLimited(['log', `${baseGitRef}..${compareHead}`, '--oneline', '--no-merges'], repoRoot, MAX_BRANCH_DIFF_LOG_BYTES, false, signal),
|
|
2333
2347
|
execGitLimited(['diff', diffBase], repoRoot, MAX_BRANCH_DIFF_BYTES, false, signal),
|
|
2334
2348
|
fetchSeparateWorktreeDiff ? execGitLimited(['diff', 'HEAD'], repoRoot, MAX_BRANCH_DIFF_BYTES, false, signal) : Promise.resolve({ stdout: '', truncated: false }),
|
|
2335
2349
|
]);
|
|
@@ -2347,7 +2361,7 @@ async function getBranchDiffPayload(workspaceRoot, repoRoot, baseBranch, options
|
|
|
2347
2361
|
...workingNameResult.stdout.split('\n').map((line) => line.trim()).filter(Boolean),
|
|
2348
2362
|
...untrackedResult.files,
|
|
2349
2363
|
]));
|
|
2350
|
-
const hunks = await annotateBranchDiffHunks(repoRoot,
|
|
2364
|
+
const hunks = await annotateBranchDiffHunks(repoRoot, baseGitRef, parseBranchDiffHunks(diff), signal);
|
|
2351
2365
|
const commits = logResult.stdout.split('\n').map((line) => line.trim()).filter(Boolean);
|
|
2352
2366
|
const fingerprint = buildChangeAuditFingerprint([
|
|
2353
2367
|
repoRoot,
|
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.269",
|
|
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-5s4aavmMB1RPNhkzWZM9dGKt9Uys6E0bSvz6Qk5lhJc=",
|
|
10
|
+
"clientBundleHash": "sha256-8+G5Glq2MqXSAzFM8BHcxX0cNsVXOl+eCJX42QkbsyQ=",
|
|
11
11
|
"entrypoint": "dist/server/cli.js",
|
|
12
12
|
"clientEntrypoint": "dist/client/index.html"
|
|
13
13
|
}
|
|
@@ -10,6 +10,7 @@ import android.os.Bundle;
|
|
|
10
10
|
import java.io.DataInputStream;
|
|
11
11
|
import java.io.DataOutputStream;
|
|
12
12
|
import java.io.IOException;
|
|
13
|
+
import java.nio.charset.StandardCharsets;
|
|
13
14
|
import java.util.concurrent.atomic.AtomicBoolean;
|
|
14
15
|
|
|
15
16
|
public class CaptureReset implements SurfaceCapture.CaptureListener {
|
|
@@ -41,16 +42,19 @@ public class CaptureReset implements SurfaceCapture.CaptureListener {
|
|
|
41
42
|
}
|
|
42
43
|
}
|
|
43
44
|
|
|
44
|
-
private synchronized
|
|
45
|
-
if (runningMediaCodec == null
|
|
45
|
+
private synchronized String applyBitrate(int value) {
|
|
46
|
+
if (runningMediaCodec == null) return "Encoder temporarily unavailable during reset";
|
|
47
|
+
if (value < 300000 || value > 30000000) return "Bitrate outside supported request range";
|
|
46
48
|
try {
|
|
47
49
|
Bundle params = new Bundle();
|
|
48
50
|
params.putInt(MediaCodec.PARAMETER_KEY_VIDEO_BITRATE, value);
|
|
49
51
|
runningMediaCodec.setParameters(params);
|
|
50
52
|
bitrate = value;
|
|
51
|
-
return
|
|
52
|
-
} catch (IllegalArgumentException | IllegalStateException
|
|
53
|
-
|
|
53
|
+
return null;
|
|
54
|
+
} catch (IllegalArgumentException | IllegalStateException error) {
|
|
55
|
+
String diagnostic = error instanceof MediaCodec.CodecException
|
|
56
|
+
? ((MediaCodec.CodecException) error).getDiagnosticInfo() : error.getClass().getSimpleName();
|
|
57
|
+
return diagnostic + ": " + error.getMessage();
|
|
54
58
|
}
|
|
55
59
|
}
|
|
56
60
|
|
|
@@ -59,11 +63,17 @@ public class CaptureReset implements SurfaceCapture.CaptureListener {
|
|
|
59
63
|
socket.connect(new LocalSocketAddress(name));
|
|
60
64
|
DataInputStream input = new DataInputStream(socket.getInputStream());
|
|
61
65
|
DataOutputStream output = new DataOutputStream(socket.getOutputStream());
|
|
62
|
-
output.writeInt(
|
|
66
|
+
output.writeInt(0x54444232); // TDB2: rejection includes length-prefixed UTF-8 diagnostic
|
|
63
67
|
output.flush();
|
|
64
68
|
while (true) {
|
|
65
69
|
int requested = input.readInt();
|
|
66
|
-
|
|
70
|
+
String failure = applyBitrate(requested);
|
|
71
|
+
output.writeInt(failure == null ? requested : 0);
|
|
72
|
+
if (failure != null) {
|
|
73
|
+
byte[] detail = failure.substring(0, Math.min(512, failure.length())).getBytes(StandardCharsets.UTF_8);
|
|
74
|
+
output.writeInt(detail.length);
|
|
75
|
+
output.write(detail);
|
|
76
|
+
}
|
|
67
77
|
output.flush();
|
|
68
78
|
}
|
|
69
79
|
} catch (IOException ignored) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# scrcpy live bitrate extension
|
|
2
2
|
|
|
3
|
-
Termdock loads this 3 KB Android DEX overlay before the
|
|
4
|
-
for preview sessions only. Recording uses the unmodified scrcpy executable/server.
|
|
3
|
+
Termdock loads this 3 KB Android DEX overlay before the bundled, verified scrcpy 3.3.4 server
|
|
4
|
+
for preview sessions only. The host scrcpy version no longer gates automatic quality. Recording uses the unmodified scrcpy executable/server.
|
|
5
5
|
|
|
6
6
|
CaptureReset.java preserves scrcpy 3.3.4's existing ABI and reset behavior,
|
|
7
7
|
adding a session-scoped ADB reverse socket. The running hardware encoder receives
|
|
@@ -9,17 +9,23 @@ MediaCodec.PARAMETER_KEY_VIDEO_BITRATE via setParameters, under the same lock
|
|
|
9
9
|
used to clear the codec before stop/reset. There is no transcoding, frame polling,
|
|
10
10
|
forced keyframe, video reset, resolution change or new video connection.
|
|
11
11
|
|
|
12
|
-
Wire format is big-endian uint32: device sends
|
|
12
|
+
Wire format is big-endian uint32: device sends TDB2 once ready, host sends target
|
|
13
13
|
bps, device replies with that value after setParameters returns, or zero on
|
|
14
|
-
rejection
|
|
14
|
+
rejection followed by a uint32 byte length and a UTF-8 codec diagnostic. The host
|
|
15
|
+
also accepts TDB1 acknowledgements from old extensions without diagnostics. An ACK confirms API acceptance, not exact vendor output bandwidth.
|
|
15
16
|
One request may be outstanding. Timeout retires only this optional channel;
|
|
16
17
|
video and input keep running.
|
|
17
18
|
|
|
18
19
|
Enabled only for the tested scrcpy 3.3.4 server SHA-256:
|
|
19
20
|
8588238c9a5a00aa542906b6ec7e6d5541d9ffb9b5d0f6e1bc0e365e2303079e
|
|
20
21
|
Both server and overlay hashes are checked in src/server/android/liveBitrate.ts.
|
|
21
|
-
|
|
22
|
-
|
|
22
|
+
The official 89 KB server is included, pinned to the checksum above, so host
|
|
23
|
+
scrcpy versions (including 4.x) do not affect preview compatibility. Reproduce it
|
|
24
|
+
with fetch-server.sh (downloads the official GitHub v3.3.4 release, verifies the
|
|
25
|
+
checksum before writing). Its source is https://github.com/Genymobile/scrcpy/tree/v3.3.4/server .
|
|
26
|
+
An explicit TERMDOCK_SCRCPY_SERVER override is honored. Missing/invalid bundled
|
|
27
|
+
assets fall back to the host server; unverified host builds then retain current
|
|
28
|
+
quality with a diagnostic. Rejections and channel failures also preserve video.
|
|
23
29
|
Extend the allowlist only after verifying the CaptureReset ABI and real-device
|
|
24
30
|
behavior. No global scrcpy installation is modified.
|
|
25
31
|
|
|
@@ -36,3 +42,9 @@ Validation: Mi MIX 2S / Android 13 accepted 1.8 → 6 → 0.9 → 4 Mbps within
|
|
|
36
42
|
one session, continuously producing frames, with one video header and one codec
|
|
37
43
|
configuration packet. Other vendor encoders and macOS/iOS clients require real
|
|
38
44
|
device verification.
|
|
45
|
+
|
|
46
|
+
Diagnostics distinguish version/build, missing/corrupt extension, ADB push/reverse,
|
|
47
|
+
15s handshake timeout, 2.5s device ACK timeout, 4s client confirmation timeout,
|
|
48
|
+
channel/protocol failure and device codec rejection. Detailed reasons travel over
|
|
49
|
+
the existing encrypted stream and appear in an expandable warning. Intentional
|
|
50
|
+
shutdown produces no bitrate failure.
|
|
Binary file
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
root="$(cd "$(dirname "$0")" && pwd)"
|
|
4
|
+
download="$(mktemp)"
|
|
5
|
+
trap 'rm -f "$download"' EXIT
|
|
6
|
+
curl -fL --max-time 60 -o "$download" https://github.com/Genymobile/scrcpy/releases/download/v3.3.4/scrcpy-server-v3.3.4
|
|
7
|
+
python3 - "$download" "$root/scrcpy-server-v3.3.4" <<'PY'
|
|
8
|
+
import hashlib, pathlib, sys
|
|
9
|
+
data = pathlib.Path(sys.argv[1]).read_bytes()
|
|
10
|
+
assert hashlib.sha256(data).hexdigest() == '8588238c9a5a00aa542906b6ec7e6d5541d9ffb9b5d0f6e1bc0e365e2303079e'
|
|
11
|
+
pathlib.Path(sys.argv[2]).write_bytes(data)
|
|
12
|
+
PY
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a5 as Qe,bh as r,d as ut,c as dt,cL as ft,cW as ht,ak as mt,a as pt,cV as xt,bz as gt,X as bt}from"./app-CG4wRJiV.js";import{b as o,r as Ye}from"./dnd-BCFAPC0L.js";import{h as Je,F as vt,b as yt,c as Xe}from"./gestureArbiter-CRTAj9c5.js";import{S as Ze}from"./sparkles-Cm5WG6yy.js";import{D as wt,i as kt}from"./DiffViewer-Bw703Keh.js";const Rt=[["path",{d:"M8 5h13",key:"1pao27"}],["path",{d:"M13 12h8",key:"h98zly"}],["path",{d:"M13 19h8",key:"c3s6r1"}],["path",{d:"M3 10a2 2 0 0 0 2 2h3",key:"1npucw"}],["path",{d:"M3 5v12a2 2 0 0 0 2 2h3",key:"x1gjn2"}]],jt=Qe("list-tree",Rt);const Nt=[["path",{d:"M3 5h.01",key:"18ugdj"}],["path",{d:"M3 12h.01",key:"nlz23k"}],["path",{d:"M3 19h.01",key:"noohij"}],["path",{d:"M8 5h13",key:"1pao27"}],["path",{d:"M8 12h13",key:"1za7za"}],["path",{d:"M8 19h13",key:"m83p4d"}]],Mt=Qe("list",Nt);function et({selected:t,depth:n=0,title:i,leading:p,children:h,trailing:a,role:y,tabIndex:b,ariaExpanded:x,onClick:f,onKeyDown:v,onPointerDown:L,onPointerUp:M,onPointerCancel:C,dataAttributes:$}){return r.jsxs("div",{role:y,tabIndex:b,"aria-expanded":x,title:i,onClick:f,onKeyDown:v,onPointerDown:L,onPointerUp:M,onPointerCancel:C,...$,className:`group flex w-full cursor-pointer items-center gap-1 rounded px-2 py-1.5 text-left text-[13px] transition active:scale-[0.99] ${t?"bg-surface-elevated text-foreground":"text-muted-foreground hover:bg-surface-2 hover:text-foreground"}`,style:{paddingLeft:`${n*14+8}px`},children:[r.jsx("span",{className:"flex min-w-[14px] shrink-0 items-center justify-center text-muted-foreground/80",children:p}),r.jsx("span",{className:"min-w-0 flex-1",children:h}),a]})}function tt(t){return t.path.replace(/^\/+/,"")}function Tt(t){if(t.displayName!==void 0||t.displayDir!==void 0)return{name:t.displayName||t.path,dir:t.displayDir||""};const n=t.path.split("/").filter(Boolean);return{name:n.pop()||t.path,dir:n.join("/")}}function rt(t,n){const i=new Map,p=(a,y,b,x)=>{const f=a.get(y);if(f)return f;const v={path:b,name:y,childCount:0,directories:[],files:[]};return a.set(y,v),x?.directories.push(v),v};for(const a of t){const y=n(a).split("/").filter(Boolean);if(y.length<=1)continue;let b=i,x=null,f="";for(const v of y.slice(0,-1)){f=f?`${f}/${v}`:v;const L=p(b,v,f,x);x=L,b=new Map(L.directories.map(M=>[M.name,M]))}x?.files.push(a)}const h=a=>{const y=a.directories.map(h).sort((x,f)=>x.name.localeCompare(f.name)),b=a.files.sort((x,f)=>x.path.localeCompare(f.path));return{...a,directories:y,files:b,childCount:y.reduce((x,f)=>x+f.childCount,0)+b.length}};return Array.from(i.values()).map(h).sort((a,y)=>a.name.localeCompare(y.name))}function He(t,n,i=0){const p=n.selectedKey===t.key||n.selectedKey===t.path||n.selectedKey===t.absolutePath,h=Tt(t);return r.jsx(et,{selected:p,role:"button",tabIndex:0,title:t.title??t.absolutePath??t.path,onClick:()=>{Je()||n.onSelectFile(t)},onKeyDown:a=>{a.key!=="Enter"&&a.key!==" "||(a.preventDefault(),n.onSelectFile(t))},leading:n.renderLeading(t),depth:i,trailing:n.renderTrailing?.(t),dataAttributes:{"data-diff-selection-path":t.key,"data-diff-file-path":t.path,"data-diff-absolute-path":t.absolutePath??"","data-diff-status":t.status},children:r.jsxs("span",{className:"select-text","data-sidebar-selectable":!0,children:[r.jsx("span",{className:`block truncate leading-snug ${p?"font-medium":""}`,children:h.name}),n.mode!=="tree"&&h.dir&&r.jsx("span",{className:"block truncate text-[10px] text-muted-foreground/75",children:h.dir}),n.renderSubtitle?.(t)]})},t.key)}function nt(t,n,i,p,h){let a=t;const y=[t.name];for(;a.files.length===0&&a.directories.length===1;)a=a.directories[0],y.push(a.name);const b=y.join("/"),x=`${n}:${a.path}`,f=i.collapsedDirectoryKeys.has(x);return r.jsxs("div",{className:"space-y-px",children:[r.jsx(et,{role:"button",tabIndex:0,onClick:()=>{Je()||i.onToggleDirectory(x)},onKeyDown:v=>{v.key!=="Enter"&&v.key!==" "||(v.preventDefault(),i.onToggleDirectory(x))},ariaExpanded:!f,depth:p,title:a.path,leading:f?r.jsx(ut,{size:13}):r.jsx(dt,{size:13}),trailing:r.jsxs("span",{className:"flex shrink-0 items-center gap-1",children:[r.jsx("span",{className:"shrink-0 rounded bg-surface-2 px-1.5 py-0.5 text-[10px] text-muted-foreground/60 transition group-hover:text-muted-foreground",children:a.childCount}),i.renderDirectoryTrailing?.(a.path,h)]}),children:r.jsxs("span",{className:"flex min-w-0 items-center gap-1",children:[r.jsx(vt,{size:14,className:"shrink-0 text-[color:var(--folder)]"}),r.jsx("span",{className:"min-w-0 flex-1 truncate leading-snug select-text","data-sidebar-selectable":!0,children:b})]})}),!f&&r.jsxs("div",{className:"space-y-px",children:[a.directories.map(v=>nt(v,n,i,p+1,h)),a.files.length>0&&r.jsx("div",{className:"space-y-px",children:a.files.map(v=>He(v,i,p+1))})]})]},x)}function Dt(t,n){const i=n.getFileTreePath??tt,p=t.files.filter(a=>i(a).split("/").filter(Boolean).length<=1),h=rt(t.files,i);return r.jsxs("div",{className:"space-y-px",children:[h.map(a=>nt(a,t.key,n,0,t)),p.length>0&&r.jsx("div",{className:"space-y-px",children:p.map(a=>He(a,n))})]})}function St(t,n=tt){const i=[],p=a=>{for(const y of a.directories)p(y);i.push(...a.files)};for(const a of rt(t,n))p(a);const h=new Set(i.map(a=>a.key));return i.push(...t.filter(a=>!h.has(a.key))),i}function It(t){return r.jsx("div",{className:t.mode==="tree"?"space-y-px pt-1":"space-y-2",children:t.groups.map(n=>{const i=!!n.header,p=!!n.collapsed;return r.jsxs("section",{className:i?"overflow-hidden rounded-lg border border-border/15 bg-surface/60":"",children:[n.header,!p&&r.jsx("div",{className:t.mode==="tree"?i?"space-y-px bg-surface/60 p-1":"space-y-px":i?"space-y-px bg-surface/60 p-1.5":"space-y-px",children:t.mode==="tree"?Dt(n,t):n.files.map(h=>He(h,t))})]},n.key)})})}const Ee="termdock:diff-review:list-width:v1",Et=120,Le=320,Ke=220,Ct=560;function Ft(t){return typeof t=="number"&&Number.isFinite(t)}function Oe(t,n){const i=Math.max(Ke,n-360),p=Math.min(Ct,i);return Math.min(p,Math.max(Ke,t))}function _t(){return gt(Ee,Ft)??Le}function At({list:t,detail:n,mobile:i,mobileListHeader:p,mobileDetailHeader:h,desktopListHeader:a,backLabel:y,onMobileSlideChange:b,externalSwiperRef:x,desktopLayout:f="split",onDetailScroll:v,desktopSidePanel:L,desktopListClassName:M,detailOwnsScroll:C=!1}){const{t:$}=ft(),P=o.useRef(null),O=o.useRef(null),F=o.useRef(null),[V,q]=o.useState(_t);o.useEffect(()=>{if(i||f!=="split")return;const m=O.current;m&&q(j=>Oe(j,m.clientWidth))},[f,i]);const se=o.useCallback(m=>{i||f!=="split"||(m.preventDefault(),F.current={startX:m.clientX,startWidth:V,pointerId:m.pointerId},m.currentTarget.setPointerCapture(m.pointerId))},[f,V,i]),le=o.useCallback(m=>{const j=F.current;if(!j||j.pointerId!==m.pointerId)return;const T=O.current?.clientWidth??window.innerWidth,D=Oe(j.startWidth+m.clientX-j.startX,T);q(D),ht(Ee,D,Et)},[]),oe=o.useCallback(m=>{const j=F.current;if(!(!j||j.pointerId!==m.pointerId)){F.current=null,mt(Ee);try{m.currentTarget.releasePointerCapture(m.pointerId)}catch{}}},[]);if(i){const m=()=>{const w=P.current;w&&w.slideTo(1)},j=()=>{const w=P.current;w&&w.slideTo(0)},T=typeof t=="function"?t({slideToDetail:m}):t,D=typeof h=="function"?h({slideToList:j,slideToDetail:m}):h;return r.jsxs(yt,{className:"h-full min-h-0 w-full",slidesPerView:1,resistanceRatio:.45,noSwiping:!0,noSwipingClass:"swiper-no-swiping",noSwipingSelector:".swiper-no-swiping",allowTouchMove:!1,touchAngle:75,touchStartPreventDefault:!1,onSwiper:w=>{P.current=w,x&&(x.current=w)},onSlideChange:w=>{b?.(w.activeIndex)},children:[r.jsx(Xe,{className:"h-full min-h-0",children:r.jsxs("div",{className:"flex h-full min-h-0 flex-col overflow-hidden",children:[p&&r.jsx("div",{className:"shrink-0 border-b border-border/15 px-3 py-2",children:p}),r.jsx("div",{className:"min-h-0 flex-1 overflow-y-auto overscroll-contain",children:T})]})}),r.jsx(Xe,{className:"h-full min-h-0",children:r.jsxs("div",{className:"flex h-full min-h-0 flex-col overflow-hidden bg-surface",children:[r.jsx("div",{className:"shrink-0 border-b border-border/15 px-3 py-2",children:D??r.jsxs("button",{type:"button",onClick:j,className:"inline-flex h-9 shrink-0 items-center gap-1.5 rounded-full bg-surface-2 px-3 text-xs font-semibold text-muted-foreground transition hover:bg-surface-elevated hover:text-foreground active:scale-95",children:[r.jsx(pt,{size:14}),y]})}),r.jsx("div",{className:C?"min-h-0 flex-1 overflow-hidden":"termdock-diff-stream-scroller min-h-0 flex-1 overflow-y-auto overscroll-contain",onScroll:C?void 0:w=>v?.(w.currentTarget),children:n})]})})]})}const G=typeof t=="function"?t({slideToDetail:()=>{}}):t;return f==="stacked"?C?r.jsxs("div",{className:"termdock-native-select min-h-0 flex-1 overflow-hidden px-2 pb-[calc(env(safe-area-inset-bottom)+4.5rem)]",children:[a&&r.jsx("div",{className:"sticky top-0 z-10 border-b border-border/15 bg-surface px-2 py-2",children:a}),G,r.jsx("div",{className:"mt-3 h-[calc(100%-3rem)] min-h-0 overflow-hidden rounded-xl border border-border/15 bg-surface",children:n})]}):r.jsxs("div",{className:"termdock-native-select termdock-diff-stream-scroller min-h-0 flex-1 overflow-y-auto overscroll-contain px-2 pb-[calc(env(safe-area-inset-bottom)+4.5rem)]",onScroll:m=>v?.(m.currentTarget),children:[a&&r.jsx("div",{className:"sticky top-0 z-10 border-b border-border/15 bg-surface px-2 py-2",children:a}),G,r.jsx("div",{className:"mt-3 overflow-hidden rounded-xl border border-border/15 bg-surface",children:n})]}):r.jsxs("div",{ref:O,className:"flex h-full min-h-0 overflow-hidden",children:[L,r.jsxs("div",{className:M??"shrink-0 overflow-y-auto overscroll-contain border-r border-border/15 bg-surface",style:{width:V},children:[a&&r.jsx("div",{className:"sticky top-0 z-10 border-b border-border/15 bg-surface px-2 py-2",children:a}),G]}),r.jsx("div",{role:"separator","aria-orientation":"vertical","aria-label":$("diffViewer.resizeNavigation"),title:$("diffViewer.resizeNavigation"),className:"group relative z-10 w-2 shrink-0 cursor-col-resize touch-none border-r border-border/15 bg-surface",onPointerDown:se,onPointerMove:le,onPointerUp:oe,onPointerCancel:oe,onDoubleClick:()=>{q(Le),xt(Ee,Le)},children:r.jsx("span",{className:"pointer-events-none absolute inset-y-0 left-1/2 w-px -translate-x-1/2 bg-border/30 transition group-hover:bg-primary/60"})}),r.jsx("div",{className:C?"min-w-0 flex-1 overflow-hidden":"termdock-diff-stream-scroller min-w-0 flex-1 overflow-y-auto overscroll-contain",onScroll:C?void 0:m=>v?.(m.currentTarget),children:n})]})}function zt({mode:t,onModeChange:n,showAi:i=!1}){return r.jsxs("div",{className:"inline-flex h-7 shrink-0 overflow-hidden rounded-md bg-surface-2 p-0.5",children:[r.jsx("button",{type:"button",onClick:()=>n("list"),"aria-pressed":t==="list",className:`inline-flex h-6 w-7 items-center justify-center rounded-md transition active:scale-95 ${t==="list"?"bg-surface-elevated text-foreground shadow-sm":"text-muted-foreground hover:text-foreground"}`,children:r.jsx(Mt,{size:13})}),r.jsx("button",{type:"button",onClick:()=>n("tree"),"aria-pressed":t==="tree",className:`inline-flex h-6 w-7 items-center justify-center rounded-md transition active:scale-95 ${t==="tree"?"bg-surface-elevated text-foreground shadow-sm":"text-muted-foreground hover:text-foreground"}`,children:r.jsx(jt,{size:13})}),i&&r.jsx("button",{type:"button",onClick:()=>n("ai"),"aria-pressed":t==="ai",className:`inline-flex h-6 w-7 items-center justify-center rounded-md transition active:scale-95 ${t==="ai"?"bg-surface-elevated text-foreground shadow-sm":"text-muted-foreground hover:text-foreground"}`,children:r.jsx(Ze,{size:13})})]})}function Lt({groups:t,mode:n,onModeChange:i,selectedKey:p,collapsedDirectoryKeys:h,onToggleDirectory:a,onSelectFile:y,renderLeading:b,renderTrailing:x,renderDirectoryTrailing:f,renderSubtitle:v,detail:L,mobile:M,backLabel:C,compact:$=!1,emptyContent:P,listPrefix:O,aiContent:F,listContainerClassName:V="px-2 py-2",detailContainerClassName:q="termdock-native-select termdock-diff-stream-scroller min-h-0",renderListHeader:se,renderMobileDetailHeader:le,externalSwiperRef:oe,onMobileSlideChange:G,slideToDetailOnMobile:m=!0,desktopLayout:j="split",onDetailScroll:T,desktopSidePanel:D,desktopListClassName:w,detailOwnsScroll:J}){const[X,ce]=o.useState(!1);o.useEffect(()=>{if(!X)return;const E=H=>{H.key==="Escape"&&ce(!1)};return document.addEventListener("keydown",E),()=>document.removeEventListener("keydown",E)},[X]);const me=r.jsx(zt,{mode:n,onModeChange:i,showAi:!!F}),pe=n==="tree"?"tree":"list",Z=se?se(me):r.jsx("div",{className:"flex justify-end",children:me}),ee=t.some(E=>E.files.length>0),te=r.jsx(At,{mobile:X?!1:M,backLabel:C,externalSwiperRef:oe,onMobileSlideChange:G,desktopLayout:X?"split":j,onDetailScroll:T,desktopSidePanel:D,desktopListClassName:w,detailOwnsScroll:J,mobileListHeader:M?Z:void 0,desktopListHeader:M?void 0:Z,mobileDetailHeader:le,list:({slideToDetail:E})=>r.jsx("div",{className:V,children:n==="ai"?typeof F=="function"?F({slideToDetail:E,fullscreen:X,toggleFullscreen:()=>ce(H=>!H)}):F??P:r.jsxs(r.Fragment,{children:[O,ee?r.jsx(It,{groups:t,selectedKey:p,mode:pe,mobile:M,compact:$,collapsedDirectoryKeys:h,onToggleDirectory:a,onSelectFile:H=>{y(H),M&&m&&window.requestAnimationFrame(E)},renderLeading:b,renderTrailing:x,renderDirectoryTrailing:f,renderSubtitle:v}):P]})}),detail:r.jsx("div",{className:J?"h-full min-h-0":q,children:L})});return!X||typeof document>"u"?te:Ye.createPortal(r.jsxs("div",{className:"fixed inset-0 z-modal-panel flex min-h-0 flex-col bg-surface text-foreground",children:[r.jsxs("div",{className:"flex h-12 shrink-0 items-center justify-between border-b border-border/15 bg-[var(--chrome-bg)] px-3",children:[r.jsxs("div",{className:"flex min-w-0 items-center gap-2",children:[r.jsx(Ze,{size:15,className:"shrink-0 text-primary"}),r.jsx("span",{className:"truncate text-[12px] font-semibold",children:"DAG Review"}),r.jsx("span",{className:"hidden text-[10px] text-muted-foreground sm:inline",children:"Select a step to inspect its exact change"})]}),r.jsx("button",{type:"button",onClick:()=>ce(!1),className:"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-muted-foreground transition hover:bg-surface-2 hover:text-foreground active:scale-95",title:"Exit full-screen DAG review (Esc)","aria-label":"Exit full-screen DAG review",children:r.jsx(bt,{size:16})})]}),r.jsx("div",{className:"min-h-0 flex-1",children:te})]}),document.body)}const Ht=96,Ae=44;function Pt({file:t,repoRoot:n,selectionPath:i,displayName:p,displayDir:h,selected:a,activePane:y,visible:b,reusableContent:x=!1,estimatedHeight:f,lightweight:v=!1,wrap:L,viewType:M,inlineMode:C,diffOptions:$,reloadKey:P=0,auditRecords:O,diffOverride:F,preparedDiff:V,renderBadge:q,onInsertDiffReference:se,onHunkGitAction:le,onReferenceCopied:oe,insertedReferenceKey:G,copiedReferenceKey:m,onClearAuditRecord:j,onContentReady:T,onHeightChange:D}){const w=o.useRef(null),J=o.useRef(null),X=o.useRef(null),[ce,me]=o.useState(null),pe=o.useRef(64),Z=o.useRef(f??104),ee=o.useRef(null),te=o.useRef(null),E=o.useRef(!1),H=o.useRef(!1),z=o.useRef(null),[K,ue]=o.useState(!1),[ke,Te]=o.useState(!1),Re=t.absolutePath||(n?`${n}/${t.path}`:t.path),ie=o.useCallback(()=>{H.current||(H.current=!0,Te(!0),T?.(i))},[T,i]);o.useLayoutEffect(()=>(E.current=!1,H.current=!1,ee.current=null,te.current=null,z.current!==null&&(window.clearTimeout(z.current),z.current=null),ue(!1),Te(!1),()=>{z.current!==null&&(window.clearTimeout(z.current),z.current=null)}),[F,V,P,x,b]),o.useLayoutEffect(()=>{const I=ee.current;!K||I===null||Math.abs((f??104)-I)>=1||(ee.current=null,ie())},[ie,f,K]),o.useLayoutEffect(()=>{if(!b||!K)return;const I=X.current;if(!I)return;const je=()=>{if(!E.current)return;const xe=I.firstElementChild;if(!xe)return;const W=Math.ceil(Math.max(xe.getBoundingClientRect().height,xe.scrollHeight,64)),fe=pe.current;if(W>0&&fe!==W&&(pe.current=W,me(W)),!w.current)return;const U=J.current?.getBoundingClientRect().height??Ae,S=Math.ceil(U+W+1);S<=0||te.current===S||(te.current=S,z.current!==null&&window.clearTimeout(z.current),z.current=window.setTimeout(()=>{if(z.current=null,!E.current)return;const A=te.current;if(A===null)return;const ae=Z.current;if(H.current){Z.current=A,Math.abs(ae-A)>=1&&D?.(i,ae,A),T?.(i);return}if(ee.current=A,Math.abs(ae-A)<1||!D){Z.current=A,ee.current=null,ie();return}Z.current=A,D(i,ae,A)},Ht))};if(je(),typeof ResizeObserver>"u")return;const de=new ResizeObserver(je);return de.observe(I),I.firstElementChild&&de.observe(I.firstElementChild),J.current&&de.observe(J.current),()=>de.disconnect()},[ie,T,D,i,K,b,L,M,C]);const _=b&&!ke;return r.jsxs("div",{ref:w,"data-diff-stream-item":i,"data-diff-selection-path":i,"data-diff-file-path":t.path,"data-diff-absolute-path":Re,className:`scroll-mt-3 border-b border-border/15 last:border-b-0 ${_||!b?"overflow-hidden":""} ${a?"bg-surface-elevated/35":""}`,style:b?_?{height:f??104}:void 0:{height:f??104},children:[r.jsxs("div",{ref:J,"data-diff-stream-header":!0,className:`sticky top-0 z-10 flex min-w-0 items-center gap-2 border-b border-border/15 px-3 py-2 backdrop-blur ${a?"bg-surface-elevated/95":"bg-surface/95"}`,children:[q(t.status),r.jsxs("div",{className:"min-w-0 flex-1",title:Re,children:[r.jsx("div",{className:"truncate text-xs font-semibold text-foreground",children:p}),h&&r.jsx("div",{className:"truncate text-[10px] text-muted-foreground",children:h})]})]}),r.jsxs("div",{ref:X,className:"relative","data-diff-stream-body":!0,style:b?{minHeight:ke?64:Math.max(ce??64,(f??104)-Ae)}:{height:Math.max(ce??64,(f??104)-Ae)},children:[b?r.jsx(wt,{active:y,repoRoot:n,filePath:t.path,referenceFilePath:Re,changedFile:t,wrap:L,viewType:M,inlineMode:C,diffOptions:$,reloadKey:P,embedded:!0,lightweight:v,auditRecords:O,diffOverride:F,preparedDiff:V,onClearAuditRecord:j,onContentReady:()=>{if(x){E.current=!0,ue(!0),ie();return}E.current||(E.current=!0,ue(!0))},onInsertDiffReference:se,onHunkGitAction:le,onReferenceCopied:oe,insertedReferenceKey:G,copiedReferenceKey:m}):r.jsx("div",{className:"flex h-full min-h-16 items-center justify-center bg-surface px-3 py-4 text-center text-xs text-muted-foreground",children:t.path}),b&&K&&!ke&&r.jsx("div",{"data-diff-measuring-overlay":!0,className:"absolute inset-0 z-20 bg-surface"})]})]})}const qe=8,ze=1600,Ue=104,Wt=1e3,we=new Map;function Bt(t,n){for(we.delete(t),we.set(t,n);we.size>Wt;){const i=we.keys().next().value;if(i===void 0)break;we.delete(i)}}function $t(t,n){return!!(t&&t.diffOverride===n.diffOverride&&t.reloadKey===n.reloadKey&&t.wrap===n.wrap&&t.viewType===n.viewType&&t.inlineMode===n.inlineMode&&t.algorithm===n.algorithm&&t.whitespace===n.whitespace&&t.context===n.context)}const Vt={added:{label:"A",className:"text-[color:var(--diff-insert-strong)]",title:"Added"},modified:{label:"M",className:"text-[color:var(--diff-hunk-accent)]",title:"Modified"},deleted:{label:"D",className:"text-[color:var(--diff-delete-strong)]",title:"Deleted"},renamed:{label:"R",className:"text-muted-foreground",title:"Renamed"},copied:{label:"C",className:"text-[color:var(--diff-insert-strong)]",title:"Copied"},untracked:{label:"U",className:"text-[color:var(--diff-insert-strong)]",title:"Untracked (new file)"},conflicted:{label:"!",className:"text-destructive",title:"Conflicted"},unknown:{label:"?",className:"text-muted-foreground",title:"Unknown"}};function Yt({status:t}){const n=Vt[t]??{label:"?",className:"text-muted-foreground",title:t};return r.jsx("span",{className:`w-4 shrink-0 text-center text-[10px] font-mono font-bold ${n.className}`,title:n.title,children:n.label})}function Jt(t,n){return n?{key:n,nonce:t.nonce+1}:t}function Zt({files:t,groups:n,selectedKey:i,onSelectFile:p,mode:h,onModeChange:a,collapsedDirectoryKeys:y,onToggleDirectory:b,renderLeading:x,renderTrailing:f,renderDirectoryTrailing:v,renderSubtitle:L,renderStreamBadge:M,onInsertDiffReference:C,onHunkGitAction:$,onReferenceCopied:P,insertedReferenceKey:O,copiedReferenceKey:F,onClearAuditRecord:V,mobile:q,backLabel:se,compact:le,desktopLayout:oe,wrap:G,diffViewType:m,inlineMode:j,diffOptions:T,activePane:D,reloadKey:w=0,renderListHeader:J,renderMobileDetailHeader:X,emptyContent:ce,listPrefix:me,aiContent:pe,listContainerClassName:Z,detailContainerClassName:ee,desktopSidePanel:te,desktopListClassName:E,onDetailScroll:H,initialDetailScrollTop:z,scrollToKey:K,scrollToKeyNonce:ue=0,externalSwiperRef:ke,onMobileSlideChange:Te,slideToDetailOnMobile:Re}){const ie=o.useMemo(()=>e=>i===e.key||i===e.path||i===e.absolutePath,[i]),_=o.useMemo(()=>{const e=new Map;for(const c of t)e.set(c.key,c),c.path&&e.set(c.path,c),c.absolutePath&&e.set(c.absolutePath,c);const s=[],l=new Set;for(const c of n){const d=h==="tree"?St(c.files):c.files;for(const g of d){const u=e.get(g.key);!u||l.has(u.key)||(s.push(u),l.add(u.key))}}for(const c of t)l.has(c.key)||s.push(c);return s},[t,n,h]),I=o.useRef(null),je=o.useRef(null),de=o.useRef(null),xe=o.useRef(w),W=o.useRef(0),fe=o.useRef(null),ge=o.useRef(new Map(we)),U=o.useRef({key:null,top:0}),S=o.useRef(new Set),A=o.useRef(new Map),ae=o.useRef(new Map),B=o.useRef(null),Pe=o.useRef(()=>{}),Ne=o.useRef([]),he=o.useRef(new Map),We=o.useRef({tops:[],heights:[],bottom:0}),[De,st]=o.useState(()=>new Set),[ot,ct]=o.useState(0),[Q,be]=o.useState({top:0,height:0}),Se=o.useMemo(()=>_.map(e=>e.key),[_]),Ie=Se.join("");ae.current=new Map(_.map(e=>[e.key,{diffOverride:e.diffOverride,reloadKey:w,wrap:G,viewType:m,inlineMode:j,algorithm:T?.algorithm,whitespace:T?.whitespace,context:T?.context}])),Ne.current=Se,he.current=new Map(Se.map((e,s)=>[e,s]));const k=o.useMemo(()=>{const e=Se.map(c=>ge.current.get(c)??Ue),s=new Array(e.length);for(let c=0;c<e.length;c+=1)s[c]=c===0?0:s[c-1]+e[c-1];const l=e.length>0?s[e.length-1]+e[e.length-1]:0;return{tops:s,heights:e,bottom:l}},[ot,Ie]);We.current=k;const re=o.useMemo(()=>K?_.find(e=>K===e.key||K===e.path||K===e.absolutePath)?.key??null:null,[_,K]),Ce=o.useMemo(()=>i?_.find(e=>i===e.key||i===e.path||i===e.absolutePath)?.key??null:null,[_,i]),Me=o.useMemo(()=>{const e=k.tops.length;if(e===0)return-1;let s=0,l=e;for(;s<l;){const c=Math.floor((s+l)/2);k.tops[c]<=Q.top+1?s=c+1:l=c}return Math.min(e-1,Math.max(0,s-1))},[k.tops,Q.top]),ne=o.useCallback(e=>{S.current=e,st(e)},[]),Be=o.useMemo(()=>{const e=Q.top-ze,s=Q.top+Q.height+ze,l=new Set;let c=0,d=k.tops.length;for(;c<d;){const u=Math.floor((c+d)/2);k.tops[u]<=e?c=u+1:d=u}const g=Math.max(0,c-1);for(let u=g;u<k.tops.length;u+=1){const R=k.tops[u];if(R>s)break;R+k.heights[u]>=e&&R<=s&&l.add(u)}for(let u=Me-1;u<=Me+1;u+=1)u>=0&&u<k.tops.length&&l.add(u);for(const u of De){const R=he.current.get(u);R!==void 0&&l.add(R)}return Array.from(l).sort((u,R)=>u-R)},[k,Q,De,Me]),Fe=o.useCallback(()=>{if(!D||B.current)return;const e=Ne.current;if(e.length===0)return;const s=U.current.key,l=Math.min(e.length-1,(s!==null?he.current.get(s):void 0)??Math.max(0,Me)),c=u=>Math.abs((he.current.get(u)??0)-l),d=[];S.current.has(e[l])||d.push(e[l]);for(let u=1;u<=qe;u+=1){const R=l+u,N=l-u;R<e.length&&!S.current.has(e[R])&&d.push(e[R]),N>=0&&!S.current.has(e[N])&&d.push(e[N])}const g=d[0];if(g){if(S.current.size>=qe){const u=c(g),R=Array.from(S.current).filter(Y=>Y!==B.current).sort((Y,ye)=>c(ye)-c(Y))[0];if(!R||c(R)<=u)return;const N=new Set(S.current);N.delete(R),ne(N)}B.current=g,ne(new Set(S.current).add(g))}},[D,ne,Me]);Pe.current=Fe;const ve=o.useCallback(e=>{if(S.current.has(e))return;const s=B.current;if(s&&s!==e){const l=new Set(S.current);l.delete(s),ne(l),B.current=null}B.current=e,ne(new Set(S.current).add(e))},[ne]),$e=o.useCallback(e=>{if(!S.current.has(e))return;const s=ae.current.get(e);s&&A.current.set(e,s),B.current===e&&(B.current=null),window.requestAnimationFrame(()=>Pe.current())},[]),Ve=o.useCallback((e,s,l)=>{if(Math.abs(l-s)<1)return;const c=ge.current.get(e);c!==void 0&&Math.abs(c-l)<1||(ge.current.set(e,l),Bt(e,l),ct(d=>d+1))},[]);o.useLayoutEffect(()=>{if(xe.current!==w){xe.current=w;for(const e of _){if(e.diffOverride!==void 0)continue;const s=Xt(e.path,e.repoRoot);kt(s,e.repoRoot??void 0,T)}}},[_,T,w]),o.useLayoutEffect(()=>{const e=I.current;if(!e)return;const s=()=>{const c=Math.max(0,Math.ceil(e.clientHeight));if(c===0)return;const d=e.scrollTop;be(g=>g.height===c&&g.top===d?g:{top:d,height:c})};if(s(),typeof ResizeObserver>"u")return;const l=new ResizeObserver(s);return l.observe(e),()=>l.disconnect()},[q]),o.useEffect(()=>{D&&Ce&&ve(Ce)},[D,ve,Ce]),o.useEffect(()=>{const e=new Set(Ne.current);for(const s of Array.from(ge.current.keys()))e.has(s)||ge.current.delete(s);for(const s of Array.from(S.current))if(!e.has(s)){const l=new Set(S.current);l.delete(s),ne(l)}for(const s of Array.from(A.current.keys()))e.has(s)||A.current.delete(s);if(B.current&&!e.has(B.current)&&(B.current=null),_.length===0){B.current=null,A.current.clear(),ne(new Set);return}Fe()},[_.length,Ie,Fe,Be,ne]);const Ge=o.useCallback(e=>{I.current=e;const s=W.current,l=e.scrollTop;W.current=l;const c=d=>{const g=We.current,u=Ne.current;let R=0,N=g.tops.length;for(;R<N;){const _e=Math.floor((R+N)/2);g.tops[_e]<=d+1?R=_e+1:N=_e}const Y=Math.min(u.length-1,Math.max(0,R-1)),ye=u[Y]??null;U.current={key:ye,top:g.tops[Y]??0},ye&&ve(ye)};Math.abs(l-s)>=ze?(Ye.flushSync(()=>{be({top:l,height:e.clientHeight})}),c(l)):fe.current===null&&(fe.current=window.requestAnimationFrame(()=>{fe.current=null;const d=I.current;if(d){const g=d.scrollTop;be({top:g,height:d.clientHeight}),c(g)}})),H?.(e)},[H,ve]);o.useEffect(()=>()=>{fe.current!==null&&window.cancelAnimationFrame(fe.current)},[]),o.useLayoutEffect(()=>{const e=I.current;if(!e)return;const s=U.current;if(s.key===null)return;const l=he.current.get(s.key);if(l===void 0)return;const c=(k.tops[l]??s.top)-s.top;if(Math.abs(c)<1)return;const d=e.scrollTop+c;W.current=d,be(g=>({top:d,height:g.height})),typeof e.scrollTo=="function"?e.scrollTo({top:d,behavior:"instant"}):e.scrollTop=d},[k]),o.useLayoutEffect(()=>{const e=Ne.current,s=k.tops;if(e.length===0){U.current={key:null,top:0};return}const l=W.current,c=l+(I.current?.clientHeight??Q.height),d=U.current;if(d.key!==null){const N=he.current.get(d.key);if(N!==void 0){const Y=s[N]??0;if(Y+(k.heights[N]??Ue)>l&&Y<c){U.current={key:d.key,top:Y};return}}}let g=0,u=s.length;for(;g<u;){const N=Math.floor((g+u)/2);s[N]<=l+1?g=N+1:u=N}const R=Math.min(s.length-1,Math.max(0,g-1));U.current={key:e[R]??null,top:s[R]??0}}),o.useLayoutEffect(()=>{if(!re)return;const e=je.current;if(e?.key===re&&e.nonce===ue)return;const s=he.current.get(re);if(s===void 0)return;ve(re),U.current={key:re,top:k.tops[s]??0};const l=I.current;if(!l||l.clientHeight===0||Q.height!==l.clientHeight)return;je.current={key:re,nonce:ue};const c=k.tops[s]??0;typeof l.scrollTo=="function"?l.scrollTo({top:c,behavior:"instant"}):l.scrollTop=c;const d=l.scrollTop;W.current=d,be({top:d,height:l.clientHeight})},[k,Q.height,ve,re,ue]),o.useLayoutEffect(()=>{if(z===void 0||re)return;const e=Ie;if(de.current===e)return;const s=I.current;if(!s)return;de.current=e;const l=Math.max(0,k.bottom-s.clientHeight),c=Math.min(Math.max(0,z),l);typeof s.scrollTo=="function"?s.scrollTo({top:c,behavior:"instant"}):s.scrollTop=c;const d=s.scrollTop;W.current=d,be({top:d,height:s.clientHeight})},[k.bottom,z,Ie,re]);const it=o.useCallback((e,s)=>{const l=ie(e),c=ae.current.get(e.key),d=c!==void 0&&$t(A.current.get(e.key),c);return r.jsx(Pt,{file:Gt(e),repoRoot:e.repoRoot,selectionPath:e.key,displayName:e.displayName,displayDir:e.displayDir,selected:l,activePane:D,visible:De.has(e.key),reusableContent:d,estimatedHeight:s,lightweight:!1,wrap:G,viewType:m,inlineMode:j,diffOptions:T,reloadKey:w,auditRecords:e.auditRecords,diffOverride:e.diffOverride,renderBadge:g=>M(g,e),onInsertDiffReference:e.onInsertDiffReference??C,onHunkGitAction:e.onHunkGitAction??$,onReferenceCopied:P,insertedReferenceKey:O,copiedReferenceKey:F,onClearAuditRecord:V,onContentReady:$e,onHeightChange:Ve})},[D,F,T,m,$e,Ve,j,O,ie,De,V,$,C,P,w,M,G]),at=r.jsx("div",{"data-diff-stream-content":!0,"data-diff-stream-canvas":!0,className:"termdock-diff-stream relative overflow-clip bg-surface will-change-transform",style:{height:Math.max(k.bottom,(k.tops.at(-1)??0)+Q.height)},children:Be.map(e=>{const s=_[e];return s?r.jsx("div",{"data-diff-canvas-slot":s.key,className:"absolute inset-x-0",style:{top:k.tops[e]},children:it(s,k.heights[e])},s.key):null})}),lt=r.jsx("div",{ref:I,className:"termdock-diff-stream termdock-diff-stream-scroller h-full max-h-full min-h-0 overflow-y-auto overscroll-contain bg-surface [overflow-anchor:none]",onScroll:e=>Ge(e.currentTarget),children:at});return r.jsx(Lt,{groups:n,mode:h,onModeChange:a,selectedKey:i,collapsedDirectoryKeys:y,onToggleDirectory:b,onSelectFile:p,renderLeading:x,renderTrailing:f,renderDirectoryTrailing:v,renderSubtitle:L,detail:lt,mobile:q,backLabel:se,compact:le,emptyContent:ce,listPrefix:me,aiContent:pe,listContainerClassName:Z,detailContainerClassName:ee,renderListHeader:J,renderMobileDetailHeader:X,externalSwiperRef:ke,onMobileSlideChange:Te,slideToDetailOnMobile:Re,desktopLayout:oe,onDetailScroll:Ge,desktopSidePanel:te,desktopListClassName:E,detailOwnsScroll:!0})}function Gt(t){return{path:t.path,absolutePath:t.absolutePath,status:t.status}}function Xt(t,n){if(t)return n&&t.startsWith(`${n}/`)?t.slice(n.length+1):t}export{Yt as C,Zt as D,jt as L,St as f,Jt as n};
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|