termdock 1.4.248 → 1.4.250

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