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.
Files changed (321) hide show
  1. package/dist/client/assets/{App-BqE8LI-u.js → App--r7RuswE.js} +29 -29
  2. package/dist/client/assets/App--r7RuswE.js.br +0 -0
  3. package/dist/client/assets/App--r7RuswE.js.gz +0 -0
  4. package/dist/client/assets/{ChangeWalkthroughPanel-DQ9OebFq.js → ChangeWalkthroughPanel-Df7-QnOp.js} +1 -1
  5. package/dist/client/assets/ChangeWalkthroughPanel-Df7-QnOp.js.br +0 -0
  6. package/dist/client/assets/ChangeWalkthroughPanel-Df7-QnOp.js.gz +0 -0
  7. package/dist/client/assets/{DagPlayground-DeV5N-IP.js → DagPlayground-DqCvsG34.js} +1 -1
  8. package/dist/client/assets/DagPlayground-DqCvsG34.js.br +0 -0
  9. package/dist/client/assets/DagPlayground-DqCvsG34.js.gz +0 -0
  10. package/dist/client/assets/{DiffLab-O24yUnne.js → DiffLab-6zvF9Nax.js} +1 -1
  11. package/dist/client/assets/DiffLab-6zvF9Nax.js.br +0 -0
  12. package/dist/client/assets/DiffLab-6zvF9Nax.js.gz +0 -0
  13. package/dist/client/assets/DiffReview-gvOLe661.js +1 -0
  14. package/dist/client/assets/DiffReview-gvOLe661.js.br +0 -0
  15. package/dist/client/assets/DiffReview-gvOLe661.js.gz +0 -0
  16. package/dist/client/assets/{DiffReviewLab-CQC9aCyy.js → DiffReviewLab-BUAtsrSJ.js} +1 -1
  17. package/dist/client/assets/DiffReviewLab-BUAtsrSJ.js.br +0 -0
  18. package/dist/client/assets/DiffReviewLab-BUAtsrSJ.js.gz +0 -0
  19. package/dist/client/assets/DiffViewer-CSIpMRDj.js +37 -0
  20. package/dist/client/assets/DiffViewer-CSIpMRDj.js.br +0 -0
  21. package/dist/client/assets/DiffViewer-CSIpMRDj.js.gz +0 -0
  22. package/dist/client/assets/{ModelPreview-iqwfAi-Q.js → ModelPreview-BzJVoE_R.js} +1 -1
  23. package/dist/client/assets/ModelPreview-BzJVoE_R.js.br +0 -0
  24. package/dist/client/assets/ModelPreview-BzJVoE_R.js.gz +0 -0
  25. package/dist/client/assets/{RightSidebar-CJ5Ro_lE.js → RightSidebar-BaBLmdFY.js} +4 -4
  26. package/dist/client/assets/RightSidebar-BaBLmdFY.js.br +0 -0
  27. package/dist/client/assets/RightSidebar-BaBLmdFY.js.gz +0 -0
  28. package/dist/client/assets/{abnfDiagram-VCTEODGH-CPSz-oKS.js → abnfDiagram-VCTEODGH-BbT6N4wQ.js} +1 -1
  29. package/dist/client/assets/abnfDiagram-VCTEODGH-BbT6N4wQ.js.br +0 -0
  30. package/dist/client/assets/abnfDiagram-VCTEODGH-BbT6N4wQ.js.gz +0 -0
  31. package/dist/client/assets/{app-CG4wRJiV.js → app-DCC2Pki1.js} +4 -4
  32. package/dist/client/assets/app-DCC2Pki1.js.br +0 -0
  33. package/dist/client/assets/app-DCC2Pki1.js.gz +0 -0
  34. package/dist/client/assets/{arc-DEku29dO.js → arc-D2SgTEaJ.js} +1 -1
  35. package/dist/client/assets/arc-D2SgTEaJ.js.br +0 -0
  36. package/dist/client/assets/arc-D2SgTEaJ.js.gz +0 -0
  37. package/dist/client/assets/{architectureDiagram-5GKGNRK7-D-mHitIB.js → architectureDiagram-5GKGNRK7-K88NXr0C.js} +1 -1
  38. package/dist/client/assets/architectureDiagram-5GKGNRK7-K88NXr0C.js.br +0 -0
  39. package/dist/client/assets/architectureDiagram-5GKGNRK7-K88NXr0C.js.gz +0 -0
  40. package/dist/client/assets/{blockDiagram-I7D4REHJ-CrNXWWMo.js → blockDiagram-I7D4REHJ-DlVHOb6O.js} +1 -1
  41. package/dist/client/assets/blockDiagram-I7D4REHJ-DlVHOb6O.js.br +0 -0
  42. package/dist/client/assets/blockDiagram-I7D4REHJ-DlVHOb6O.js.gz +0 -0
  43. package/dist/client/assets/{c4Diagram-7LVT6UL2-Aabqu3DW.js → c4Diagram-7LVT6UL2-DKqMikT-.js} +1 -1
  44. package/dist/client/assets/c4Diagram-7LVT6UL2-DKqMikT-.js.br +0 -0
  45. package/dist/client/assets/c4Diagram-7LVT6UL2-DKqMikT-.js.gz +0 -0
  46. package/dist/client/assets/channel-Uyb4U6IY.js +1 -0
  47. package/dist/client/assets/{chunk-2Q5K7J3B-CtS0wd2P.js → chunk-2Q5K7J3B-DEVqpD5d.js} +1 -1
  48. package/dist/client/assets/{chunk-5VM5RSS4-BmRWnayq.js → chunk-5VM5RSS4-LRLeMiUW.js} +1 -1
  49. package/dist/client/assets/{chunk-F27PBJKO-B1Xs_Obp.js → chunk-F27PBJKO-DaPxcSH5.js} +1 -1
  50. package/dist/client/assets/chunk-F27PBJKO-DaPxcSH5.js.br +0 -0
  51. package/dist/client/assets/chunk-F27PBJKO-DaPxcSH5.js.gz +0 -0
  52. package/dist/client/assets/{chunk-IMKFNOWR-DGBc6K0o.js → chunk-IMKFNOWR-CKvFYp0b.js} +1 -1
  53. package/dist/client/assets/chunk-IMKFNOWR-CKvFYp0b.js.br +0 -0
  54. package/dist/client/assets/chunk-IMKFNOWR-CKvFYp0b.js.gz +0 -0
  55. package/dist/client/assets/{chunk-JWPE2WC7-ZSQlXy77.js → chunk-JWPE2WC7-CTT8841x.js} +1 -1
  56. package/dist/client/assets/{chunk-POPQ4Y6H-lOdiBcDa.js → chunk-POPQ4Y6H-BntrWhUu.js} +1 -1
  57. package/dist/client/assets/{chunk-SVP7TREG-BEAii929.js → chunk-SVP7TREG-Dku7-lW7.js} +1 -1
  58. package/dist/client/assets/chunk-SVP7TREG-Dku7-lW7.js.br +0 -0
  59. package/dist/client/assets/chunk-SVP7TREG-Dku7-lW7.js.gz +0 -0
  60. package/dist/client/assets/{chunk-TICWLB2K-DYDwgjz6.js → chunk-TICWLB2K-CRKGdIuN.js} +1 -1
  61. package/dist/client/assets/chunk-TICWLB2K-CRKGdIuN.js.br +0 -0
  62. package/dist/client/assets/chunk-TICWLB2K-CRKGdIuN.js.gz +0 -0
  63. package/dist/client/assets/{chunk-XXDRQBXY-DTyJgD5V.js → chunk-XXDRQBXY-DCuScH2W.js} +1 -1
  64. package/dist/client/assets/classDiagram-ZZMXUADV-DgGaiyJi.js +1 -0
  65. package/dist/client/assets/classDiagram-v2-VYDZK3BY-DgGaiyJi.js +1 -0
  66. package/dist/client/assets/{cose-bilkent-JH36ORCC-B_LczeML.js → cose-bilkent-JH36ORCC-D4bCAhgH.js} +1 -1
  67. package/dist/client/assets/cose-bilkent-JH36ORCC-D4bCAhgH.js.br +0 -0
  68. package/dist/client/assets/cose-bilkent-JH36ORCC-D4bCAhgH.js.gz +0 -0
  69. package/dist/client/assets/{cynefin-OW5HDTMX-iUNCJhXp.js → cynefin-OW5HDTMX-BXxrTkIn.js} +1 -1
  70. package/dist/client/assets/cynefin-OW5HDTMX-BXxrTkIn.js.br +0 -0
  71. package/dist/client/assets/cynefin-OW5HDTMX-BXxrTkIn.js.gz +0 -0
  72. package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-D0qz1YON.js → cynefinDiagram-5FMLGOSQ-DH-JBXRO.js} +1 -1
  73. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-DH-JBXRO.js.br +0 -0
  74. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-DH-JBXRO.js.gz +0 -0
  75. package/dist/client/assets/{dagre-GXQ25YYZ-DoNbof8W.js → dagre-GXQ25YYZ-CKnImtBM.js} +1 -1
  76. package/dist/client/assets/dagre-GXQ25YYZ-CKnImtBM.js.br +0 -0
  77. package/dist/client/assets/dagre-GXQ25YYZ-CKnImtBM.js.gz +0 -0
  78. package/dist/client/assets/{diagram-S7CK7UJ4-CjmclMId.js → diagram-S7CK7UJ4-DInUTNtP.js} +1 -1
  79. package/dist/client/assets/diagram-S7CK7UJ4-DInUTNtP.js.br +0 -0
  80. package/dist/client/assets/diagram-S7CK7UJ4-DInUTNtP.js.gz +0 -0
  81. package/dist/client/assets/{diagram-UQ7AKVKN-CL9cPDna.js → diagram-UQ7AKVKN-BzfdOyaG.js} +1 -1
  82. package/dist/client/assets/diagram-UQ7AKVKN-BzfdOyaG.js.br +0 -0
  83. package/dist/client/assets/diagram-UQ7AKVKN-BzfdOyaG.js.gz +0 -0
  84. package/dist/client/assets/{diagram-VSXAHHWV-BuSsBHdW.js → diagram-VSXAHHWV-bVosICmB.js} +1 -1
  85. package/dist/client/assets/diagram-VSXAHHWV-bVosICmB.js.br +0 -0
  86. package/dist/client/assets/diagram-VSXAHHWV-bVosICmB.js.gz +0 -0
  87. package/dist/client/assets/{diagram-VX7I27RA-83S-m6VI.js → diagram-VX7I27RA-BUaLNFYz.js} +1 -1
  88. package/dist/client/assets/diagram-VX7I27RA-BUaLNFYz.js.br +0 -0
  89. package/dist/client/assets/diagram-VX7I27RA-BUaLNFYz.js.gz +0 -0
  90. package/dist/client/assets/{diagram-Z3DM3KII-DVBe23Hs.js → diagram-Z3DM3KII-DAUkkL9_.js} +1 -1
  91. package/dist/client/assets/diagram-Z3DM3KII-DAUkkL9_.js.br +0 -0
  92. package/dist/client/assets/diagram-Z3DM3KII-DAUkkL9_.js.gz +0 -0
  93. package/dist/client/assets/{ebnfDiagram-PWID7BFC-Dg-KWuTD.js → ebnfDiagram-PWID7BFC-C-se8H0Y.js} +1 -1
  94. package/dist/client/assets/ebnfDiagram-PWID7BFC-C-se8H0Y.js.br +0 -0
  95. package/dist/client/assets/ebnfDiagram-PWID7BFC-C-se8H0Y.js.gz +0 -0
  96. package/dist/client/assets/{erDiagram-RLTQ6QDP-DSSWaahL.js → erDiagram-RLTQ6QDP-CG6x1OqJ.js} +1 -1
  97. package/dist/client/assets/erDiagram-RLTQ6QDP-CG6x1OqJ.js.br +0 -0
  98. package/dist/client/assets/erDiagram-RLTQ6QDP-CG6x1OqJ.js.gz +0 -0
  99. package/dist/client/assets/{flowDiagram-HODETNUW-BdLuB2iN.js → flowDiagram-HODETNUW-CiTMZP2n.js} +1 -1
  100. package/dist/client/assets/flowDiagram-HODETNUW-CiTMZP2n.js.br +0 -0
  101. package/dist/client/assets/flowDiagram-HODETNUW-CiTMZP2n.js.gz +0 -0
  102. package/dist/client/assets/{ganttDiagram-EL5Y4UJY-Chs1ygCY.js → ganttDiagram-EL5Y4UJY-BpM-Xxm8.js} +1 -1
  103. package/dist/client/assets/ganttDiagram-EL5Y4UJY-BpM-Xxm8.js.br +0 -0
  104. package/dist/client/assets/ganttDiagram-EL5Y4UJY-BpM-Xxm8.js.gz +0 -0
  105. package/dist/client/assets/{gestureArbiter-CRTAj9c5.js → gestureArbiter-Du2umsFD.js} +1 -1
  106. package/dist/client/assets/gestureArbiter-Du2umsFD.js.br +0 -0
  107. package/dist/client/assets/gestureArbiter-Du2umsFD.js.gz +0 -0
  108. package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-BAo61MYb.js → gitGraphDiagram-WWUBYQGX-D4UhrsZS.js} +1 -1
  109. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-D4UhrsZS.js.br +0 -0
  110. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-D4UhrsZS.js.gz +0 -0
  111. package/dist/client/assets/{infoDiagram-27XIBGKW-D_VLCYHJ.js → infoDiagram-27XIBGKW-B_64artu.js} +1 -1
  112. package/dist/client/assets/{ishikawaDiagram-5VMMS53U-CbDv2mvs.js → ishikawaDiagram-5VMMS53U-BXl8es4M.js} +1 -1
  113. package/dist/client/assets/ishikawaDiagram-5VMMS53U-BXl8es4M.js.br +0 -0
  114. package/dist/client/assets/ishikawaDiagram-5VMMS53U-BXl8es4M.js.gz +0 -0
  115. package/dist/client/assets/{journeyDiagram-3NMN7TZE-CV_iBuZn.js → journeyDiagram-3NMN7TZE-BDmGKZs3.js} +1 -1
  116. package/dist/client/assets/journeyDiagram-3NMN7TZE-BDmGKZs3.js.br +0 -0
  117. package/dist/client/assets/journeyDiagram-3NMN7TZE-BDmGKZs3.js.gz +0 -0
  118. package/dist/client/assets/{kanban-definition-UXKFOSKX-C7O4Bh1q.js → kanban-definition-UXKFOSKX-BKjheeYf.js} +1 -1
  119. package/dist/client/assets/kanban-definition-UXKFOSKX-BKjheeYf.js.br +0 -0
  120. package/dist/client/assets/kanban-definition-UXKFOSKX-BKjheeYf.js.gz +0 -0
  121. package/dist/client/assets/{layout-klNTG6uR.js → layout-B7t1dEXe.js} +1 -1
  122. package/dist/client/assets/layout-B7t1dEXe.js.br +0 -0
  123. package/dist/client/assets/layout-B7t1dEXe.js.gz +0 -0
  124. package/dist/client/assets/{linear-BGNAzPTT.js → linear-DEmcfJwb.js} +1 -1
  125. package/dist/client/assets/linear-DEmcfJwb.js.br +0 -0
  126. package/dist/client/assets/linear-DEmcfJwb.js.gz +0 -0
  127. package/dist/client/assets/{mermaid.core-BSzAHLGl.js → mermaid.core-cr3MFg62.js} +5 -5
  128. package/dist/client/assets/mermaid.core-cr3MFg62.js.br +0 -0
  129. package/dist/client/assets/mermaid.core-cr3MFg62.js.gz +0 -0
  130. package/dist/client/assets/{mindmap-definition-YA3MSWOX-p44N-fmd.js → mindmap-definition-YA3MSWOX-Pqk3YsZA.js} +1 -1
  131. package/dist/client/assets/mindmap-definition-YA3MSWOX-Pqk3YsZA.js.br +0 -0
  132. package/dist/client/assets/mindmap-definition-YA3MSWOX-Pqk3YsZA.js.gz +0 -0
  133. package/dist/client/assets/{passwordBootstrap-FAUekDm3.js → passwordBootstrap-zDAux6sN.js} +1 -1
  134. package/dist/client/assets/passwordBootstrap-zDAux6sN.js.br +0 -0
  135. package/dist/client/assets/passwordBootstrap-zDAux6sN.js.gz +0 -0
  136. package/dist/client/assets/{pegDiagram-XKGWAZYB-D_9s0OO_.js → pegDiagram-XKGWAZYB-BoII79ja.js} +1 -1
  137. package/dist/client/assets/pegDiagram-XKGWAZYB-BoII79ja.js.br +0 -0
  138. package/dist/client/assets/pegDiagram-XKGWAZYB-BoII79ja.js.gz +0 -0
  139. package/dist/client/assets/{pieDiagram-E7YTZNPT-B7EbdgJt.js → pieDiagram-E7YTZNPT-CLP3akcm.js} +1 -1
  140. package/dist/client/assets/pieDiagram-E7YTZNPT-CLP3akcm.js.br +0 -0
  141. package/dist/client/assets/pieDiagram-E7YTZNPT-CLP3akcm.js.gz +0 -0
  142. package/dist/client/assets/{quadrantDiagram-AXDQQJYC-BY028AbD.js → quadrantDiagram-AXDQQJYC-BQjxA6xd.js} +1 -1
  143. package/dist/client/assets/quadrantDiagram-AXDQQJYC-BQjxA6xd.js.br +0 -0
  144. package/dist/client/assets/quadrantDiagram-AXDQQJYC-BQjxA6xd.js.gz +0 -0
  145. package/dist/client/assets/{railroadDiagram-O6MQD6OU-C_SqJJH4.js → railroadDiagram-O6MQD6OU-CvOBB6Kz.js} +1 -1
  146. package/dist/client/assets/railroadDiagram-O6MQD6OU-CvOBB6Kz.js.br +0 -0
  147. package/dist/client/assets/railroadDiagram-O6MQD6OU-CvOBB6Kz.js.gz +0 -0
  148. package/dist/client/assets/{referenceLongPress-zPADrRaZ.js → referenceLongPress-DhvF4-YJ.js} +1 -1
  149. package/dist/client/assets/referenceLongPress-DhvF4-YJ.js.br +0 -0
  150. package/dist/client/assets/referenceLongPress-DhvF4-YJ.js.gz +0 -0
  151. package/dist/client/assets/{requirementDiagram-BXWQKSXE-CROJTpxc.js → requirementDiagram-BXWQKSXE-BfnQwXw8.js} +1 -1
  152. package/dist/client/assets/{requirementDiagram-BXWQKSXE-CROJTpxc.js.br → requirementDiagram-BXWQKSXE-BfnQwXw8.js.br} +0 -0
  153. package/dist/client/assets/requirementDiagram-BXWQKSXE-BfnQwXw8.js.gz +0 -0
  154. package/dist/client/assets/{sankeyDiagram-P5KCCOFB-CiWfwd5j.js → sankeyDiagram-P5KCCOFB-rj4XdP2T.js} +1 -1
  155. package/dist/client/assets/sankeyDiagram-P5KCCOFB-rj4XdP2T.js.br +0 -0
  156. package/dist/client/assets/sankeyDiagram-P5KCCOFB-rj4XdP2T.js.gz +0 -0
  157. package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-Bv-q4vX3.js → sequenceDiagram-WJ2MYXX4-BFtfWTMp.js} +1 -1
  158. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-BFtfWTMp.js.br +0 -0
  159. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-BFtfWTMp.js.gz +0 -0
  160. package/dist/client/assets/{sizeCapture-INFHLROL-TQt_I2TN.js → sizeCapture-INFHLROL-BbzC5eVk.js} +1 -1
  161. package/dist/client/assets/sizeCapture-INFHLROL-BbzC5eVk.js.br +0 -0
  162. package/dist/client/assets/sizeCapture-INFHLROL-BbzC5eVk.js.gz +0 -0
  163. package/dist/client/assets/{sparkles-Cm5WG6yy.js → sparkles-B8gtfPrQ.js} +1 -1
  164. package/dist/client/assets/{stateDiagram-D77RDMKH-CxWjp4b2.js → stateDiagram-D77RDMKH-CF9cUXyi.js} +1 -1
  165. package/dist/client/assets/stateDiagram-D77RDMKH-CF9cUXyi.js.br +0 -0
  166. package/dist/client/assets/stateDiagram-D77RDMKH-CF9cUXyi.js.gz +0 -0
  167. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-CZVJAwnv.js +1 -0
  168. package/dist/client/assets/{swimlanes-42K2YHIH-gPs5aEkb.js → swimlanes-42K2YHIH-BB2FN27h.js} +1 -1
  169. package/dist/client/assets/swimlanes-42K2YHIH-BB2FN27h.js.br +0 -0
  170. package/dist/client/assets/swimlanes-42K2YHIH-BB2FN27h.js.gz +0 -0
  171. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-yKb8MUvL.js +8 -0
  172. package/dist/client/assets/{timeline-definition-24CTP7MA-CSCxdiQd.js → timeline-definition-24CTP7MA-Cy5znMl0.js} +1 -1
  173. package/dist/client/assets/timeline-definition-24CTP7MA-Cy5znMl0.js.br +0 -0
  174. package/dist/client/assets/timeline-definition-24CTP7MA-Cy5znMl0.js.gz +0 -0
  175. package/dist/client/assets/{triangle-alert-CgKcVAti.js → triangle-alert-C7GRge3t.js} +1 -1
  176. package/dist/client/assets/{vennDiagram-4TSXK5OY-BY2UkIDT.js → vennDiagram-4TSXK5OY-BxbDCMXP.js} +1 -1
  177. package/dist/client/assets/vennDiagram-4TSXK5OY-BxbDCMXP.js.br +0 -0
  178. package/dist/client/assets/vennDiagram-4TSXK5OY-BxbDCMXP.js.gz +0 -0
  179. package/dist/client/assets/{wardleyDiagram-VM6X3IG4-D8yK4oK5.js → wardleyDiagram-VM6X3IG4-D_ApxRrj.js} +1 -1
  180. package/dist/client/assets/wardleyDiagram-VM6X3IG4-D_ApxRrj.js.br +0 -0
  181. package/dist/client/assets/wardleyDiagram-VM6X3IG4-D_ApxRrj.js.gz +0 -0
  182. package/dist/client/assets/{xychartDiagram-S5SC5T6Z-C4MnXqQN.js → xychartDiagram-S5SC5T6Z-DYpLzNya.js} +1 -1
  183. package/dist/client/assets/xychartDiagram-S5SC5T6Z-DYpLzNya.js.br +0 -0
  184. package/dist/client/assets/xychartDiagram-S5SC5T6Z-DYpLzNya.js.gz +0 -0
  185. package/dist/client/index.html +1 -1
  186. package/dist/client/index.html.br +0 -0
  187. package/dist/client/index.html.gz +0 -0
  188. package/dist/client/sw.js +1 -1
  189. package/dist/client/sw.js.br +0 -0
  190. package/dist/client/sw.js.gz +0 -0
  191. package/dist/server/android/liveBitrate.js +78 -18
  192. package/dist/server/android/scrcpy.js +20 -6
  193. package/dist/server/routes/android.js +3 -2
  194. package/dist/server/routes/filesystem.js +29 -15
  195. package/package.json +1 -1
  196. package/runtime-manifest.json +3 -3
  197. package/scripts/android-bitrate/CaptureReset.java +17 -7
  198. package/scripts/android-bitrate/README.md +18 -6
  199. package/scripts/android-bitrate/bitrate.jar +0 -0
  200. package/scripts/android-bitrate/fetch-server.sh +12 -0
  201. package/scripts/android-bitrate/scrcpy-server-v3.3.4 +0 -0
  202. package/dist/client/assets/App-BqE8LI-u.js.br +0 -0
  203. package/dist/client/assets/App-BqE8LI-u.js.gz +0 -0
  204. package/dist/client/assets/ChangeWalkthroughPanel-DQ9OebFq.js.br +0 -0
  205. package/dist/client/assets/ChangeWalkthroughPanel-DQ9OebFq.js.gz +0 -0
  206. package/dist/client/assets/DagPlayground-DeV5N-IP.js.br +0 -0
  207. package/dist/client/assets/DagPlayground-DeV5N-IP.js.gz +0 -0
  208. package/dist/client/assets/DiffLab-O24yUnne.js.br +0 -0
  209. package/dist/client/assets/DiffLab-O24yUnne.js.gz +0 -0
  210. package/dist/client/assets/DiffReview-D4QwNQmG.js +0 -1
  211. package/dist/client/assets/DiffReview-D4QwNQmG.js.br +0 -0
  212. package/dist/client/assets/DiffReview-D4QwNQmG.js.gz +0 -0
  213. package/dist/client/assets/DiffReviewLab-CQC9aCyy.js.br +0 -0
  214. package/dist/client/assets/DiffReviewLab-CQC9aCyy.js.gz +0 -0
  215. package/dist/client/assets/DiffViewer-Bw703Keh.js +0 -37
  216. package/dist/client/assets/DiffViewer-Bw703Keh.js.br +0 -0
  217. package/dist/client/assets/DiffViewer-Bw703Keh.js.gz +0 -0
  218. package/dist/client/assets/ModelPreview-iqwfAi-Q.js.br +0 -0
  219. package/dist/client/assets/ModelPreview-iqwfAi-Q.js.gz +0 -0
  220. package/dist/client/assets/RightSidebar-CJ5Ro_lE.js.br +0 -0
  221. package/dist/client/assets/RightSidebar-CJ5Ro_lE.js.gz +0 -0
  222. package/dist/client/assets/abnfDiagram-VCTEODGH-CPSz-oKS.js.br +0 -0
  223. package/dist/client/assets/abnfDiagram-VCTEODGH-CPSz-oKS.js.gz +0 -0
  224. package/dist/client/assets/app-CG4wRJiV.js.br +0 -0
  225. package/dist/client/assets/app-CG4wRJiV.js.gz +0 -0
  226. package/dist/client/assets/arc-DEku29dO.js.br +0 -0
  227. package/dist/client/assets/arc-DEku29dO.js.gz +0 -0
  228. package/dist/client/assets/architectureDiagram-5GKGNRK7-D-mHitIB.js.br +0 -0
  229. package/dist/client/assets/architectureDiagram-5GKGNRK7-D-mHitIB.js.gz +0 -0
  230. package/dist/client/assets/blockDiagram-I7D4REHJ-CrNXWWMo.js.br +0 -0
  231. package/dist/client/assets/blockDiagram-I7D4REHJ-CrNXWWMo.js.gz +0 -0
  232. package/dist/client/assets/c4Diagram-7LVT6UL2-Aabqu3DW.js.br +0 -0
  233. package/dist/client/assets/c4Diagram-7LVT6UL2-Aabqu3DW.js.gz +0 -0
  234. package/dist/client/assets/channel-C8osiAYX.js +0 -1
  235. package/dist/client/assets/chunk-F27PBJKO-B1Xs_Obp.js.br +0 -0
  236. package/dist/client/assets/chunk-F27PBJKO-B1Xs_Obp.js.gz +0 -0
  237. package/dist/client/assets/chunk-IMKFNOWR-DGBc6K0o.js.br +0 -0
  238. package/dist/client/assets/chunk-IMKFNOWR-DGBc6K0o.js.gz +0 -0
  239. package/dist/client/assets/chunk-SVP7TREG-BEAii929.js.br +0 -0
  240. package/dist/client/assets/chunk-SVP7TREG-BEAii929.js.gz +0 -0
  241. package/dist/client/assets/chunk-TICWLB2K-DYDwgjz6.js.br +0 -0
  242. package/dist/client/assets/chunk-TICWLB2K-DYDwgjz6.js.gz +0 -0
  243. package/dist/client/assets/classDiagram-ZZMXUADV-Dym5rIMp.js +0 -1
  244. package/dist/client/assets/classDiagram-v2-VYDZK3BY-Dym5rIMp.js +0 -1
  245. package/dist/client/assets/cose-bilkent-JH36ORCC-B_LczeML.js.br +0 -0
  246. package/dist/client/assets/cose-bilkent-JH36ORCC-B_LczeML.js.gz +0 -0
  247. package/dist/client/assets/cynefin-OW5HDTMX-iUNCJhXp.js.br +0 -0
  248. package/dist/client/assets/cynefin-OW5HDTMX-iUNCJhXp.js.gz +0 -0
  249. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-D0qz1YON.js.br +0 -0
  250. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-D0qz1YON.js.gz +0 -0
  251. package/dist/client/assets/dagre-GXQ25YYZ-DoNbof8W.js.br +0 -0
  252. package/dist/client/assets/dagre-GXQ25YYZ-DoNbof8W.js.gz +0 -0
  253. package/dist/client/assets/diagram-S7CK7UJ4-CjmclMId.js.br +0 -0
  254. package/dist/client/assets/diagram-S7CK7UJ4-CjmclMId.js.gz +0 -0
  255. package/dist/client/assets/diagram-UQ7AKVKN-CL9cPDna.js.br +0 -0
  256. package/dist/client/assets/diagram-UQ7AKVKN-CL9cPDna.js.gz +0 -0
  257. package/dist/client/assets/diagram-VSXAHHWV-BuSsBHdW.js.br +0 -0
  258. package/dist/client/assets/diagram-VSXAHHWV-BuSsBHdW.js.gz +0 -0
  259. package/dist/client/assets/diagram-VX7I27RA-83S-m6VI.js.br +0 -0
  260. package/dist/client/assets/diagram-VX7I27RA-83S-m6VI.js.gz +0 -0
  261. package/dist/client/assets/diagram-Z3DM3KII-DVBe23Hs.js.br +0 -0
  262. package/dist/client/assets/diagram-Z3DM3KII-DVBe23Hs.js.gz +0 -0
  263. package/dist/client/assets/ebnfDiagram-PWID7BFC-Dg-KWuTD.js.br +0 -0
  264. package/dist/client/assets/ebnfDiagram-PWID7BFC-Dg-KWuTD.js.gz +0 -0
  265. package/dist/client/assets/erDiagram-RLTQ6QDP-DSSWaahL.js.br +0 -0
  266. package/dist/client/assets/erDiagram-RLTQ6QDP-DSSWaahL.js.gz +0 -0
  267. package/dist/client/assets/flowDiagram-HODETNUW-BdLuB2iN.js.br +0 -0
  268. package/dist/client/assets/flowDiagram-HODETNUW-BdLuB2iN.js.gz +0 -0
  269. package/dist/client/assets/ganttDiagram-EL5Y4UJY-Chs1ygCY.js.br +0 -0
  270. package/dist/client/assets/ganttDiagram-EL5Y4UJY-Chs1ygCY.js.gz +0 -0
  271. package/dist/client/assets/gestureArbiter-CRTAj9c5.js.br +0 -0
  272. package/dist/client/assets/gestureArbiter-CRTAj9c5.js.gz +0 -0
  273. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BAo61MYb.js.br +0 -0
  274. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BAo61MYb.js.gz +0 -0
  275. package/dist/client/assets/ishikawaDiagram-5VMMS53U-CbDv2mvs.js.br +0 -0
  276. package/dist/client/assets/ishikawaDiagram-5VMMS53U-CbDv2mvs.js.gz +0 -0
  277. package/dist/client/assets/journeyDiagram-3NMN7TZE-CV_iBuZn.js.br +0 -0
  278. package/dist/client/assets/journeyDiagram-3NMN7TZE-CV_iBuZn.js.gz +0 -0
  279. package/dist/client/assets/kanban-definition-UXKFOSKX-C7O4Bh1q.js.br +0 -0
  280. package/dist/client/assets/kanban-definition-UXKFOSKX-C7O4Bh1q.js.gz +0 -0
  281. package/dist/client/assets/layout-klNTG6uR.js.br +0 -0
  282. package/dist/client/assets/layout-klNTG6uR.js.gz +0 -0
  283. package/dist/client/assets/linear-BGNAzPTT.js.br +0 -0
  284. package/dist/client/assets/linear-BGNAzPTT.js.gz +0 -0
  285. package/dist/client/assets/mermaid.core-BSzAHLGl.js.br +0 -0
  286. package/dist/client/assets/mermaid.core-BSzAHLGl.js.gz +0 -0
  287. package/dist/client/assets/mindmap-definition-YA3MSWOX-p44N-fmd.js.br +0 -0
  288. package/dist/client/assets/mindmap-definition-YA3MSWOX-p44N-fmd.js.gz +0 -0
  289. package/dist/client/assets/passwordBootstrap-FAUekDm3.js.br +0 -0
  290. package/dist/client/assets/passwordBootstrap-FAUekDm3.js.gz +0 -0
  291. package/dist/client/assets/pegDiagram-XKGWAZYB-D_9s0OO_.js.br +0 -0
  292. package/dist/client/assets/pegDiagram-XKGWAZYB-D_9s0OO_.js.gz +0 -0
  293. package/dist/client/assets/pieDiagram-E7YTZNPT-B7EbdgJt.js.br +0 -0
  294. package/dist/client/assets/pieDiagram-E7YTZNPT-B7EbdgJt.js.gz +0 -0
  295. package/dist/client/assets/quadrantDiagram-AXDQQJYC-BY028AbD.js.br +0 -0
  296. package/dist/client/assets/quadrantDiagram-AXDQQJYC-BY028AbD.js.gz +0 -0
  297. package/dist/client/assets/railroadDiagram-O6MQD6OU-C_SqJJH4.js.br +0 -0
  298. package/dist/client/assets/railroadDiagram-O6MQD6OU-C_SqJJH4.js.gz +0 -0
  299. package/dist/client/assets/referenceLongPress-zPADrRaZ.js.br +0 -0
  300. package/dist/client/assets/referenceLongPress-zPADrRaZ.js.gz +0 -0
  301. package/dist/client/assets/requirementDiagram-BXWQKSXE-CROJTpxc.js.gz +0 -0
  302. package/dist/client/assets/sankeyDiagram-P5KCCOFB-CiWfwd5j.js.br +0 -0
  303. package/dist/client/assets/sankeyDiagram-P5KCCOFB-CiWfwd5j.js.gz +0 -0
  304. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-Bv-q4vX3.js.br +0 -0
  305. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-Bv-q4vX3.js.gz +0 -0
  306. package/dist/client/assets/sizeCapture-INFHLROL-TQt_I2TN.js.br +0 -0
  307. package/dist/client/assets/sizeCapture-INFHLROL-TQt_I2TN.js.gz +0 -0
  308. package/dist/client/assets/stateDiagram-D77RDMKH-CxWjp4b2.js.br +0 -0
  309. package/dist/client/assets/stateDiagram-D77RDMKH-CxWjp4b2.js.gz +0 -0
  310. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-DALwTJPG.js +0 -1
  311. package/dist/client/assets/swimlanes-42K2YHIH-gPs5aEkb.js.br +0 -0
  312. package/dist/client/assets/swimlanes-42K2YHIH-gPs5aEkb.js.gz +0 -0
  313. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-DZL57C2F.js +0 -8
  314. package/dist/client/assets/timeline-definition-24CTP7MA-CSCxdiQd.js.br +0 -0
  315. package/dist/client/assets/timeline-definition-24CTP7MA-CSCxdiQd.js.gz +0 -0
  316. package/dist/client/assets/vennDiagram-4TSXK5OY-BY2UkIDT.js.br +0 -0
  317. package/dist/client/assets/vennDiagram-4TSXK5OY-BY2UkIDT.js.gz +0 -0
  318. package/dist/client/assets/wardleyDiagram-VM6X3IG4-D8yK4oK5.js.br +0 -0
  319. package/dist/client/assets/wardleyDiagram-VM6X3IG4-D8yK4oK5.js.gz +0 -0
  320. package/dist/client/assets/xychartDiagram-S5SC5T6Z-C4MnXqQN.js.br +0 -0
  321. 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, supportsLiveBitrate, bitrateOverlayPath, bitrateOverlayRemote } from './liveBitrate.js';
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
- if (await supportsLiveBitrate(serverJar, version)) {
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(ready => this.events.onBitrateSupport?.(ready));
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
- this.events.onBitrateSupport?.(false);
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
- void session.setBitrate(bitRate).then(applied => send({ type: 'bitrate-result', requestId, bitRate, applied }));
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
- let baseRef = trimmedBase.includes('/') ? trimmedBase : `origin/${trimmedBase}`;
2293
- if (trimmedBase.includes('/')) {
2294
- await execGit(['rev-parse', '--verify', '--quiet', baseRef], repoRoot, signal);
2295
- }
2296
- else {
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
- await execGit(['fetch', 'origin', trimmedBase, '--no-tags'], repoRoot, signal, GIT_ROUTE_TIMEOUT_MS);
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
- const localRef = await execGit(['rev-parse', '--verify', '--quiet', trimmedBase], repoRoot, signal)
2302
- .then(() => trimmedBase)
2303
- .catch(() => null);
2304
- if (!localRef)
2311
+ if (signal.aborted)
2305
2312
  throw error;
2306
- baseRef = localRef;
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', baseRef, compareHead], repoRoot, signal)
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 ?? `${baseRef}...${compareHead}`;
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', `${baseRef}..${compareHead}`, '--oneline', '--no-merges'], repoRoot, MAX_BRANCH_DIFF_LOG_BYTES, false, signal),
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, baseRef, parseBranchDiffHunks(diff), signal);
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "termdock",
3
- "version": "1.4.267",
3
+ "version": "1.4.269",
4
4
  "description": "A complete web-based terminal application with modern UI",
5
5
  "type": "module",
6
6
  "main": ".desktop-dist/main.js",
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "packageName": "termdock",
4
- "version": "1.4.267",
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-V1RFgDykQcbwFwXuguqt+02C2XDLyuTE4xkUkvj+uLc=",
10
- "clientBundleHash": "sha256-4qEeyM60W0+Bm7KFYE0ixA728Ln+CzwkQ26HnhAvSiA=",
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 boolean applyBitrate(int value) {
45
- if (runningMediaCodec == null || value < 300000 || value > 30000000) return false;
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 true;
52
- } catch (IllegalArgumentException | IllegalStateException ignored) {
53
- return false;
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(0x54444231); // TDB1: extension ready, codec is running
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
- output.writeInt(applyBitrate(requested) ? requested : 0);
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 installed scrcpy server
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 TDB1 once ready, host sends target
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. An ACK confirms API acceptance, not exact vendor output bandwidth.
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
- Unrecognized builds (including 4.x), missing assets, rejected updates and channel
22
- failures retain existing preview quality, without automatic reconnect fallback.
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
@@ -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};