termdock 1.4.329 → 1.4.331

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 (350) hide show
  1. package/dist/client/assets/{App-D9G1XjRn.js → App-xBkso5In.js} +6 -6
  2. package/dist/client/assets/App-xBkso5In.js.br +0 -0
  3. package/dist/client/assets/App-xBkso5In.js.gz +0 -0
  4. package/dist/client/assets/{ArchitecturePanel-Db0No7hm.js → ArchitecturePanel-DNY0prqs.js} +2 -2
  5. package/dist/client/assets/ArchitecturePanel-DNY0prqs.js.br +0 -0
  6. package/dist/client/assets/ArchitecturePanel-DNY0prqs.js.gz +0 -0
  7. package/dist/client/assets/{ChangeWalkthroughPanel-iNaVjdNU.js → ChangeWalkthroughPanel-xvUzbgKh.js} +1 -1
  8. package/dist/client/assets/ChangeWalkthroughPanel-xvUzbgKh.js.br +0 -0
  9. package/dist/client/assets/ChangeWalkthroughPanel-xvUzbgKh.js.gz +0 -0
  10. package/dist/client/assets/{CollaborationMainWorkspace-Qek-VG70.js → CollaborationMainWorkspace-DsIWXeh0.js} +1 -1
  11. package/dist/client/assets/CollaborationMainWorkspace-DsIWXeh0.js.br +0 -0
  12. package/dist/client/assets/CollaborationMainWorkspace-DsIWXeh0.js.gz +0 -0
  13. package/dist/client/assets/CollaborationTaskContent-DatXl2k_.js +2 -0
  14. package/dist/client/assets/ComputerControlView-D-1UEmtr.js +6 -0
  15. package/dist/client/assets/ComputerControlView-D-1UEmtr.js.br +0 -0
  16. package/dist/client/assets/ComputerControlView-D-1UEmtr.js.gz +0 -0
  17. package/dist/client/assets/{DagPlayground-BfcGoLqt.js → DagPlayground-1KaifMRo.js} +1 -1
  18. package/dist/client/assets/DagPlayground-1KaifMRo.js.br +0 -0
  19. package/dist/client/assets/DagPlayground-1KaifMRo.js.gz +0 -0
  20. package/dist/client/assets/{DiffLab-5lLS4TTe.js → DiffLab-Dh7lMk1W.js} +1 -1
  21. package/dist/client/assets/DiffLab-Dh7lMk1W.js.br +0 -0
  22. package/dist/client/assets/DiffLab-Dh7lMk1W.js.gz +0 -0
  23. package/dist/client/assets/{DiffReview-Bm5VsO_2.js → DiffReview-Bxe6OacV.js} +1 -1
  24. package/dist/client/assets/DiffReview-Bxe6OacV.js.br +0 -0
  25. package/dist/client/assets/DiffReview-Bxe6OacV.js.gz +0 -0
  26. package/dist/client/assets/{DiffReviewLab-CokJ4CU0.js → DiffReviewLab-CwdLf6kM.js} +1 -1
  27. package/dist/client/assets/DiffReviewLab-CwdLf6kM.js.br +0 -0
  28. package/dist/client/assets/DiffReviewLab-CwdLf6kM.js.gz +0 -0
  29. package/dist/client/assets/{DiffViewer-CYl7f8Ni.js → DiffViewer-oGb-V3AK.js} +1 -1
  30. package/dist/client/assets/DiffViewer-oGb-V3AK.js.br +0 -0
  31. package/dist/client/assets/DiffViewer-oGb-V3AK.js.gz +0 -0
  32. package/dist/client/assets/{ModelPreview-GyVcgKyk.js → ModelPreview-BTunplWr.js} +1 -1
  33. package/dist/client/assets/ModelPreview-BTunplWr.js.br +0 -0
  34. package/dist/client/assets/ModelPreview-BTunplWr.js.gz +0 -0
  35. package/dist/client/assets/{RightSidebar-BVTTEpbi.js → RightSidebar-DvYmab8z.js} +35 -35
  36. package/dist/client/assets/RightSidebar-DvYmab8z.js.br +0 -0
  37. package/dist/client/assets/RightSidebar-DvYmab8z.js.gz +0 -0
  38. package/dist/client/assets/{abnfDiagram-VCTEODGH-Bn3DRY7x.js → abnfDiagram-VCTEODGH-D4LxQjpJ.js} +1 -1
  39. package/dist/client/assets/abnfDiagram-VCTEODGH-D4LxQjpJ.js.br +0 -0
  40. package/dist/client/assets/abnfDiagram-VCTEODGH-D4LxQjpJ.js.gz +0 -0
  41. package/dist/client/assets/app-A96wp9Xv.js +35 -0
  42. package/dist/client/assets/app-A96wp9Xv.js.br +0 -0
  43. package/dist/client/assets/app-A96wp9Xv.js.gz +0 -0
  44. package/dist/client/assets/{arc-Du7GNk7G.js → arc-BcCf73Fm.js} +1 -1
  45. package/dist/client/assets/arc-BcCf73Fm.js.br +0 -0
  46. package/dist/client/assets/arc-BcCf73Fm.js.gz +0 -0
  47. package/dist/client/assets/{architectureDiagram-5GKGNRK7-DhxS0QdH.js → architectureDiagram-5GKGNRK7-Dfg95GK6.js} +1 -1
  48. package/dist/client/assets/architectureDiagram-5GKGNRK7-Dfg95GK6.js.br +0 -0
  49. package/dist/client/assets/architectureDiagram-5GKGNRK7-Dfg95GK6.js.gz +0 -0
  50. package/dist/client/assets/{blockDiagram-I7D4REHJ-Wv6QW34G.js → blockDiagram-I7D4REHJ-BwXSp0xK.js} +1 -1
  51. package/dist/client/assets/blockDiagram-I7D4REHJ-BwXSp0xK.js.br +0 -0
  52. package/dist/client/assets/blockDiagram-I7D4REHJ-BwXSp0xK.js.gz +0 -0
  53. package/dist/client/assets/{c4Diagram-7LVT6UL2-BX7uuZf8.js → c4Diagram-7LVT6UL2-D4GfUedH.js} +1 -1
  54. package/dist/client/assets/c4Diagram-7LVT6UL2-D4GfUedH.js.br +0 -0
  55. package/dist/client/assets/c4Diagram-7LVT6UL2-D4GfUedH.js.gz +0 -0
  56. package/dist/client/assets/channel-k5dcS0_z.js +1 -0
  57. package/dist/client/assets/{chunk-2Q5K7J3B-DUyA5Q_x.js → chunk-2Q5K7J3B-BqcmDKjo.js} +1 -1
  58. package/dist/client/assets/{chunk-5VM5RSS4-CsqOe_v4.js → chunk-5VM5RSS4-BBV3_wnk.js} +1 -1
  59. package/dist/client/assets/{chunk-F27PBJKO-CcO_-Kak.js → chunk-F27PBJKO-B-r7e040.js} +1 -1
  60. package/dist/client/assets/chunk-F27PBJKO-B-r7e040.js.br +0 -0
  61. package/dist/client/assets/chunk-F27PBJKO-B-r7e040.js.gz +0 -0
  62. package/dist/client/assets/{chunk-IMKFNOWR-CQJ1dzSN.js → chunk-IMKFNOWR-B83oWEy_.js} +1 -1
  63. package/dist/client/assets/chunk-IMKFNOWR-B83oWEy_.js.br +0 -0
  64. package/dist/client/assets/chunk-IMKFNOWR-B83oWEy_.js.gz +0 -0
  65. package/dist/client/assets/{chunk-JWPE2WC7-oUpFzQDX.js → chunk-JWPE2WC7-C2FW583q.js} +1 -1
  66. package/dist/client/assets/{chunk-POPQ4Y6H-C1YXcY1K.js → chunk-POPQ4Y6H-BWU7oLd-.js} +1 -1
  67. package/dist/client/assets/{chunk-SVP7TREG-BWjHeocC.js → chunk-SVP7TREG-C5OgXymb.js} +1 -1
  68. package/dist/client/assets/chunk-SVP7TREG-C5OgXymb.js.br +0 -0
  69. package/dist/client/assets/chunk-SVP7TREG-C5OgXymb.js.gz +0 -0
  70. package/dist/client/assets/{chunk-TICWLB2K-DQ0mCrXn.js → chunk-TICWLB2K-B1LlRwu4.js} +1 -1
  71. package/dist/client/assets/chunk-TICWLB2K-B1LlRwu4.js.br +0 -0
  72. package/dist/client/assets/chunk-TICWLB2K-B1LlRwu4.js.gz +0 -0
  73. package/dist/client/assets/{chunk-XXDRQBXY-SHYrjdLW.js → chunk-XXDRQBXY-7l9gcG6S.js} +1 -1
  74. package/dist/client/assets/classDiagram-ZZMXUADV-DQzBzWJL.js +1 -0
  75. package/dist/client/assets/classDiagram-v2-VYDZK3BY-DQzBzWJL.js +1 -0
  76. package/dist/client/assets/{cose-bilkent-JH36ORCC-BBhGCaX-.js → cose-bilkent-JH36ORCC-DNBCyqkI.js} +1 -1
  77. package/dist/client/assets/cose-bilkent-JH36ORCC-DNBCyqkI.js.br +0 -0
  78. package/dist/client/assets/cose-bilkent-JH36ORCC-DNBCyqkI.js.gz +0 -0
  79. package/dist/client/assets/{cynefin-OW5HDTMX-7coImPkF.js → cynefin-OW5HDTMX-BiCAbJSv.js} +1 -1
  80. package/dist/client/assets/cynefin-OW5HDTMX-BiCAbJSv.js.br +0 -0
  81. package/dist/client/assets/cynefin-OW5HDTMX-BiCAbJSv.js.gz +0 -0
  82. package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-Cnoxl1HL.js → cynefinDiagram-5FMLGOSQ-CaRucQy9.js} +1 -1
  83. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CaRucQy9.js.br +0 -0
  84. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CaRucQy9.js.gz +0 -0
  85. package/dist/client/assets/{dagre-GXQ25YYZ-B6fpGrH1.js → dagre-GXQ25YYZ-kU4wdq9U.js} +1 -1
  86. package/dist/client/assets/dagre-GXQ25YYZ-kU4wdq9U.js.br +0 -0
  87. package/dist/client/assets/dagre-GXQ25YYZ-kU4wdq9U.js.gz +0 -0
  88. package/dist/client/assets/{diagram-S7CK7UJ4-Sprx3hA_.js → diagram-S7CK7UJ4-BvDFZeQg.js} +1 -1
  89. package/dist/client/assets/diagram-S7CK7UJ4-BvDFZeQg.js.br +0 -0
  90. package/dist/client/assets/diagram-S7CK7UJ4-BvDFZeQg.js.gz +0 -0
  91. package/dist/client/assets/{diagram-UQ7AKVKN-BOXGQUJw.js → diagram-UQ7AKVKN-DYTly1n3.js} +1 -1
  92. package/dist/client/assets/diagram-UQ7AKVKN-DYTly1n3.js.br +0 -0
  93. package/dist/client/assets/diagram-UQ7AKVKN-DYTly1n3.js.gz +0 -0
  94. package/dist/client/assets/{diagram-VSXAHHWV-kPY7jhp2.js → diagram-VSXAHHWV-C0bMSg7N.js} +1 -1
  95. package/dist/client/assets/diagram-VSXAHHWV-C0bMSg7N.js.br +0 -0
  96. package/dist/client/assets/diagram-VSXAHHWV-C0bMSg7N.js.gz +0 -0
  97. package/dist/client/assets/{diagram-VX7I27RA-07j7wunW.js → diagram-VX7I27RA-C9_Uoa7n.js} +1 -1
  98. package/dist/client/assets/diagram-VX7I27RA-C9_Uoa7n.js.br +0 -0
  99. package/dist/client/assets/diagram-VX7I27RA-C9_Uoa7n.js.gz +0 -0
  100. package/dist/client/assets/{diagram-Z3DM3KII-CbWJovUP.js → diagram-Z3DM3KII-CLsF0k3J.js} +1 -1
  101. package/dist/client/assets/diagram-Z3DM3KII-CLsF0k3J.js.br +0 -0
  102. package/dist/client/assets/diagram-Z3DM3KII-CLsF0k3J.js.gz +0 -0
  103. package/dist/client/assets/{ebnfDiagram-PWID7BFC-CqoHnUPd.js → ebnfDiagram-PWID7BFC-Bt6b2Ygi.js} +1 -1
  104. package/dist/client/assets/ebnfDiagram-PWID7BFC-Bt6b2Ygi.js.br +0 -0
  105. package/dist/client/assets/ebnfDiagram-PWID7BFC-Bt6b2Ygi.js.gz +0 -0
  106. package/dist/client/assets/{erDiagram-RLTQ6QDP-eJuQs4se.js → erDiagram-RLTQ6QDP-Bs5jB7E2.js} +1 -1
  107. package/dist/client/assets/erDiagram-RLTQ6QDP-Bs5jB7E2.js.br +0 -0
  108. package/dist/client/assets/erDiagram-RLTQ6QDP-Bs5jB7E2.js.gz +0 -0
  109. package/dist/client/assets/{flowDiagram-HODETNUW-DSgseCP6.js → flowDiagram-HODETNUW-BCSeo8DJ.js} +1 -1
  110. package/dist/client/assets/flowDiagram-HODETNUW-BCSeo8DJ.js.br +0 -0
  111. package/dist/client/assets/flowDiagram-HODETNUW-BCSeo8DJ.js.gz +0 -0
  112. package/dist/client/assets/{ganttDiagram-EL5Y4UJY-Ca5MVluD.js → ganttDiagram-EL5Y4UJY-BnCBe-Ue.js} +1 -1
  113. package/dist/client/assets/ganttDiagram-EL5Y4UJY-BnCBe-Ue.js.br +0 -0
  114. package/dist/client/assets/ganttDiagram-EL5Y4UJY-BnCBe-Ue.js.gz +0 -0
  115. package/dist/client/assets/{gestureArbiter-CGaUInum.js → gestureArbiter-W1Lo4NZw.js} +1 -1
  116. package/dist/client/assets/gestureArbiter-W1Lo4NZw.js.br +0 -0
  117. package/dist/client/assets/gestureArbiter-W1Lo4NZw.js.gz +0 -0
  118. package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-BgAMalup.js → gitGraphDiagram-WWUBYQGX-C7BJXlkD.js} +1 -1
  119. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-C7BJXlkD.js.br +0 -0
  120. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-C7BJXlkD.js.gz +0 -0
  121. package/dist/client/assets/index-e1PkqIqN.css +1 -0
  122. package/dist/client/assets/index-e1PkqIqN.css.br +0 -0
  123. package/dist/client/assets/{index-C6xPtOPw.css.gz → index-e1PkqIqN.css.gz} +0 -0
  124. package/dist/client/assets/{infoDiagram-27XIBGKW-DvrmPX6I.js → infoDiagram-27XIBGKW-CJXzvnav.js} +1 -1
  125. package/dist/client/assets/{ishikawaDiagram-5VMMS53U-BIxEg0pl.js → ishikawaDiagram-5VMMS53U-BoBCZ1Wa.js} +1 -1
  126. package/dist/client/assets/ishikawaDiagram-5VMMS53U-BoBCZ1Wa.js.br +0 -0
  127. package/dist/client/assets/ishikawaDiagram-5VMMS53U-BoBCZ1Wa.js.gz +0 -0
  128. package/dist/client/assets/{journeyDiagram-3NMN7TZE-BI8B1o2v.js → journeyDiagram-3NMN7TZE-C5bywqIt.js} +1 -1
  129. package/dist/client/assets/journeyDiagram-3NMN7TZE-C5bywqIt.js.br +0 -0
  130. package/dist/client/assets/journeyDiagram-3NMN7TZE-C5bywqIt.js.gz +0 -0
  131. package/dist/client/assets/{kanban-definition-UXKFOSKX-tBgvPAXx.js → kanban-definition-UXKFOSKX-ChHpoQyu.js} +1 -1
  132. package/dist/client/assets/kanban-definition-UXKFOSKX-ChHpoQyu.js.br +0 -0
  133. package/dist/client/assets/kanban-definition-UXKFOSKX-ChHpoQyu.js.gz +0 -0
  134. package/dist/client/assets/{layout-F6rDt84Y.js → layout-e7M-xuok.js} +1 -1
  135. package/dist/client/assets/layout-e7M-xuok.js.br +0 -0
  136. package/dist/client/assets/layout-e7M-xuok.js.gz +0 -0
  137. package/dist/client/assets/{linear-QaUhDwi6.js → linear-A5CrihlL.js} +1 -1
  138. package/dist/client/assets/linear-A5CrihlL.js.br +0 -0
  139. package/dist/client/assets/linear-A5CrihlL.js.gz +0 -0
  140. package/dist/client/assets/{mermaid.core-BHNVcgJG.js → mermaid.core-BNac_Y3z.js} +5 -5
  141. package/dist/client/assets/mermaid.core-BNac_Y3z.js.br +0 -0
  142. package/dist/client/assets/mermaid.core-BNac_Y3z.js.gz +0 -0
  143. package/dist/client/assets/{mindmap-definition-YA3MSWOX-CW_qv6SM.js → mindmap-definition-YA3MSWOX-fQoEGcCr.js} +1 -1
  144. package/dist/client/assets/mindmap-definition-YA3MSWOX-fQoEGcCr.js.br +0 -0
  145. package/dist/client/assets/mindmap-definition-YA3MSWOX-fQoEGcCr.js.gz +0 -0
  146. package/dist/client/assets/{passwordBootstrap-xwlVHcmC.js → passwordBootstrap--0YoOXsx.js} +1 -1
  147. package/dist/client/assets/passwordBootstrap--0YoOXsx.js.br +0 -0
  148. package/dist/client/assets/{passwordBootstrap-xwlVHcmC.js.gz → passwordBootstrap--0YoOXsx.js.gz} +0 -0
  149. package/dist/client/assets/{pegDiagram-XKGWAZYB-DN89bpor.js → pegDiagram-XKGWAZYB-CYbfla8A.js} +1 -1
  150. package/dist/client/assets/pegDiagram-XKGWAZYB-CYbfla8A.js.br +0 -0
  151. package/dist/client/assets/pegDiagram-XKGWAZYB-CYbfla8A.js.gz +0 -0
  152. package/dist/client/assets/{pieDiagram-E7YTZNPT-DIxGatjK.js → pieDiagram-E7YTZNPT-B6--ZKXC.js} +1 -1
  153. package/dist/client/assets/pieDiagram-E7YTZNPT-B6--ZKXC.js.br +0 -0
  154. package/dist/client/assets/pieDiagram-E7YTZNPT-B6--ZKXC.js.gz +0 -0
  155. package/dist/client/assets/{quadrantDiagram-AXDQQJYC-hA4Rk-Iv.js → quadrantDiagram-AXDQQJYC-Bau_h7Jl.js} +1 -1
  156. package/dist/client/assets/quadrantDiagram-AXDQQJYC-Bau_h7Jl.js.br +0 -0
  157. package/dist/client/assets/quadrantDiagram-AXDQQJYC-Bau_h7Jl.js.gz +0 -0
  158. package/dist/client/assets/{railroadDiagram-O6MQD6OU-CQft_cg4.js → railroadDiagram-O6MQD6OU-CApEuiEL.js} +1 -1
  159. package/dist/client/assets/railroadDiagram-O6MQD6OU-CApEuiEL.js.br +0 -0
  160. package/dist/client/assets/railroadDiagram-O6MQD6OU-CApEuiEL.js.gz +0 -0
  161. package/dist/client/assets/{rdpSession-_Wi6QGVy.js → rdpSession-CydBq1bk.js} +1 -1
  162. package/dist/client/assets/rdpSession-CydBq1bk.js.br +0 -0
  163. package/dist/client/assets/rdpSession-CydBq1bk.js.gz +0 -0
  164. package/dist/client/assets/{referenceLongPress-CHQPhmmv.js → referenceLongPress-8ExgTbB3.js} +1 -1
  165. package/dist/client/assets/referenceLongPress-8ExgTbB3.js.br +0 -0
  166. package/dist/client/assets/referenceLongPress-8ExgTbB3.js.gz +0 -0
  167. package/dist/client/assets/{requirementDiagram-BXWQKSXE-CAMtoGH8.js → requirementDiagram-BXWQKSXE-Rxe80d7j.js} +1 -1
  168. package/dist/client/assets/requirementDiagram-BXWQKSXE-Rxe80d7j.js.br +0 -0
  169. package/dist/client/assets/requirementDiagram-BXWQKSXE-Rxe80d7j.js.gz +0 -0
  170. package/dist/client/assets/{sankeyDiagram-P5KCCOFB-USLSjs28.js → sankeyDiagram-P5KCCOFB-BaPl8d6E.js} +1 -1
  171. package/dist/client/assets/sankeyDiagram-P5KCCOFB-BaPl8d6E.js.br +0 -0
  172. package/dist/client/assets/sankeyDiagram-P5KCCOFB-BaPl8d6E.js.gz +0 -0
  173. package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-D22gyoMc.js → sequenceDiagram-WJ2MYXX4-Asyx5gWK.js} +1 -1
  174. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-Asyx5gWK.js.br +0 -0
  175. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-Asyx5gWK.js.gz +0 -0
  176. package/dist/client/assets/{sizeCapture-INFHLROL-BAWAxmev.js → sizeCapture-INFHLROL-BQaSglof.js} +1 -1
  177. package/dist/client/assets/sizeCapture-INFHLROL-BQaSglof.js.br +0 -0
  178. package/dist/client/assets/sizeCapture-INFHLROL-BQaSglof.js.gz +0 -0
  179. package/dist/client/assets/{sparkles-BK6dvO4C.js → sparkles-BMR6NziM.js} +1 -1
  180. package/dist/client/assets/{stateDiagram-D77RDMKH-Dd8Kz_3m.js → stateDiagram-D77RDMKH-DycNNggj.js} +1 -1
  181. package/dist/client/assets/stateDiagram-D77RDMKH-DycNNggj.js.br +0 -0
  182. package/dist/client/assets/stateDiagram-D77RDMKH-DycNNggj.js.gz +0 -0
  183. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-CS1AgP_n.js +1 -0
  184. package/dist/client/assets/{swimlanes-42K2YHIH-BjLw9hF1.js → swimlanes-42K2YHIH-2Z5Zd5j6.js} +1 -1
  185. package/dist/client/assets/swimlanes-42K2YHIH-2Z5Zd5j6.js.br +0 -0
  186. package/dist/client/assets/swimlanes-42K2YHIH-2Z5Zd5j6.js.gz +0 -0
  187. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-Cxqp7K9j.js +8 -0
  188. package/dist/client/assets/{timeline-definition-24CTP7MA-DVis9e2K.js → timeline-definition-24CTP7MA-BHiRARcP.js} +1 -1
  189. package/dist/client/assets/timeline-definition-24CTP7MA-BHiRARcP.js.br +0 -0
  190. package/dist/client/assets/timeline-definition-24CTP7MA-BHiRARcP.js.gz +0 -0
  191. package/dist/client/assets/{triangle-alert-CiksAjZK.js → triangle-alert-TsfoVQJR.js} +1 -1
  192. package/dist/client/assets/{vennDiagram-4TSXK5OY-CNwJhMgu.js → vennDiagram-4TSXK5OY-JgKZ8N2y.js} +1 -1
  193. package/dist/client/assets/vennDiagram-4TSXK5OY-JgKZ8N2y.js.br +0 -0
  194. package/dist/client/assets/vennDiagram-4TSXK5OY-JgKZ8N2y.js.gz +0 -0
  195. package/dist/client/assets/{videoCompression-CeWiTlti.js → videoCompression-DGfMcwdq.js} +1 -1
  196. package/dist/client/assets/videoCompression-DGfMcwdq.js.br +0 -0
  197. package/dist/client/assets/videoCompression-DGfMcwdq.js.gz +0 -0
  198. package/dist/client/assets/{wardleyDiagram-VM6X3IG4-COCAMRlj.js → wardleyDiagram-VM6X3IG4-DNmP9dmD.js} +1 -1
  199. package/dist/client/assets/wardleyDiagram-VM6X3IG4-DNmP9dmD.js.br +0 -0
  200. package/dist/client/assets/wardleyDiagram-VM6X3IG4-DNmP9dmD.js.gz +0 -0
  201. package/dist/client/assets/{xychartDiagram-S5SC5T6Z-BUmr1Xe8.js → xychartDiagram-S5SC5T6Z-BBFR9gmo.js} +1 -1
  202. package/dist/client/assets/xychartDiagram-S5SC5T6Z-BBFR9gmo.js.br +0 -0
  203. package/dist/client/assets/xychartDiagram-S5SC5T6Z-BBFR9gmo.js.gz +0 -0
  204. package/dist/client/index.html +2 -2
  205. package/dist/client/index.html.br +0 -0
  206. package/dist/client/index.html.gz +0 -0
  207. package/dist/client/sw-encrypted-background.js +1 -1
  208. package/dist/client/sw-encrypted-background.js.br +0 -0
  209. package/dist/client/sw-encrypted-background.js.gz +0 -0
  210. package/dist/client/sw.js +1 -1
  211. package/dist/client/sw.js.br +0 -0
  212. package/dist/client/sw.js.gz +0 -0
  213. package/dist/server/agent/collaborationPeerTransport.js +2 -1
  214. package/dist/server/federation/relay.js +121 -37
  215. package/dist/server/federation/streamLimits.js +5 -0
  216. package/package.json +1 -1
  217. package/runtime-manifest.json +3 -3
  218. package/dist/client/assets/App-D9G1XjRn.js.br +0 -0
  219. package/dist/client/assets/App-D9G1XjRn.js.gz +0 -0
  220. package/dist/client/assets/ArchitecturePanel-Db0No7hm.js.br +0 -0
  221. package/dist/client/assets/ArchitecturePanel-Db0No7hm.js.gz +0 -0
  222. package/dist/client/assets/ChangeWalkthroughPanel-iNaVjdNU.js.br +0 -0
  223. package/dist/client/assets/ChangeWalkthroughPanel-iNaVjdNU.js.gz +0 -0
  224. package/dist/client/assets/CollaborationMainWorkspace-Qek-VG70.js.br +0 -0
  225. package/dist/client/assets/CollaborationMainWorkspace-Qek-VG70.js.gz +0 -0
  226. package/dist/client/assets/CollaborationTaskContent-BuRZBZGa.js +0 -2
  227. package/dist/client/assets/ComputerControlView-CzooFU9V.js +0 -6
  228. package/dist/client/assets/ComputerControlView-CzooFU9V.js.br +0 -0
  229. package/dist/client/assets/ComputerControlView-CzooFU9V.js.gz +0 -0
  230. package/dist/client/assets/DagPlayground-BfcGoLqt.js.br +0 -0
  231. package/dist/client/assets/DagPlayground-BfcGoLqt.js.gz +0 -0
  232. package/dist/client/assets/DiffLab-5lLS4TTe.js.br +0 -0
  233. package/dist/client/assets/DiffLab-5lLS4TTe.js.gz +0 -0
  234. package/dist/client/assets/DiffReview-Bm5VsO_2.js.br +0 -0
  235. package/dist/client/assets/DiffReview-Bm5VsO_2.js.gz +0 -0
  236. package/dist/client/assets/DiffReviewLab-CokJ4CU0.js.br +0 -0
  237. package/dist/client/assets/DiffReviewLab-CokJ4CU0.js.gz +0 -0
  238. package/dist/client/assets/DiffViewer-CYl7f8Ni.js.br +0 -0
  239. package/dist/client/assets/DiffViewer-CYl7f8Ni.js.gz +0 -0
  240. package/dist/client/assets/ModelPreview-GyVcgKyk.js.br +0 -0
  241. package/dist/client/assets/ModelPreview-GyVcgKyk.js.gz +0 -0
  242. package/dist/client/assets/RightSidebar-BVTTEpbi.js.br +0 -0
  243. package/dist/client/assets/RightSidebar-BVTTEpbi.js.gz +0 -0
  244. package/dist/client/assets/abnfDiagram-VCTEODGH-Bn3DRY7x.js.br +0 -0
  245. package/dist/client/assets/abnfDiagram-VCTEODGH-Bn3DRY7x.js.gz +0 -0
  246. package/dist/client/assets/app-D5VZp8rc.js +0 -35
  247. package/dist/client/assets/app-D5VZp8rc.js.br +0 -0
  248. package/dist/client/assets/app-D5VZp8rc.js.gz +0 -0
  249. package/dist/client/assets/arc-Du7GNk7G.js.br +0 -0
  250. package/dist/client/assets/arc-Du7GNk7G.js.gz +0 -0
  251. package/dist/client/assets/architectureDiagram-5GKGNRK7-DhxS0QdH.js.br +0 -0
  252. package/dist/client/assets/architectureDiagram-5GKGNRK7-DhxS0QdH.js.gz +0 -0
  253. package/dist/client/assets/blockDiagram-I7D4REHJ-Wv6QW34G.js.br +0 -0
  254. package/dist/client/assets/blockDiagram-I7D4REHJ-Wv6QW34G.js.gz +0 -0
  255. package/dist/client/assets/c4Diagram-7LVT6UL2-BX7uuZf8.js.br +0 -0
  256. package/dist/client/assets/c4Diagram-7LVT6UL2-BX7uuZf8.js.gz +0 -0
  257. package/dist/client/assets/channel-DRDG9HMw.js +0 -1
  258. package/dist/client/assets/chunk-F27PBJKO-CcO_-Kak.js.br +0 -0
  259. package/dist/client/assets/chunk-F27PBJKO-CcO_-Kak.js.gz +0 -0
  260. package/dist/client/assets/chunk-IMKFNOWR-CQJ1dzSN.js.br +0 -0
  261. package/dist/client/assets/chunk-IMKFNOWR-CQJ1dzSN.js.gz +0 -0
  262. package/dist/client/assets/chunk-SVP7TREG-BWjHeocC.js.br +0 -0
  263. package/dist/client/assets/chunk-SVP7TREG-BWjHeocC.js.gz +0 -0
  264. package/dist/client/assets/chunk-TICWLB2K-DQ0mCrXn.js.br +0 -0
  265. package/dist/client/assets/chunk-TICWLB2K-DQ0mCrXn.js.gz +0 -0
  266. package/dist/client/assets/classDiagram-ZZMXUADV-CjINloiI.js +0 -1
  267. package/dist/client/assets/classDiagram-v2-VYDZK3BY-CjINloiI.js +0 -1
  268. package/dist/client/assets/cose-bilkent-JH36ORCC-BBhGCaX-.js.br +0 -0
  269. package/dist/client/assets/cose-bilkent-JH36ORCC-BBhGCaX-.js.gz +0 -0
  270. package/dist/client/assets/cynefin-OW5HDTMX-7coImPkF.js.br +0 -0
  271. package/dist/client/assets/cynefin-OW5HDTMX-7coImPkF.js.gz +0 -0
  272. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-Cnoxl1HL.js.br +0 -0
  273. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-Cnoxl1HL.js.gz +0 -0
  274. package/dist/client/assets/dagre-GXQ25YYZ-B6fpGrH1.js.br +0 -0
  275. package/dist/client/assets/dagre-GXQ25YYZ-B6fpGrH1.js.gz +0 -0
  276. package/dist/client/assets/diagram-S7CK7UJ4-Sprx3hA_.js.br +0 -0
  277. package/dist/client/assets/diagram-S7CK7UJ4-Sprx3hA_.js.gz +0 -0
  278. package/dist/client/assets/diagram-UQ7AKVKN-BOXGQUJw.js.br +0 -0
  279. package/dist/client/assets/diagram-UQ7AKVKN-BOXGQUJw.js.gz +0 -0
  280. package/dist/client/assets/diagram-VSXAHHWV-kPY7jhp2.js.br +0 -0
  281. package/dist/client/assets/diagram-VSXAHHWV-kPY7jhp2.js.gz +0 -0
  282. package/dist/client/assets/diagram-VX7I27RA-07j7wunW.js.br +0 -0
  283. package/dist/client/assets/diagram-VX7I27RA-07j7wunW.js.gz +0 -0
  284. package/dist/client/assets/diagram-Z3DM3KII-CbWJovUP.js.br +0 -0
  285. package/dist/client/assets/diagram-Z3DM3KII-CbWJovUP.js.gz +0 -0
  286. package/dist/client/assets/ebnfDiagram-PWID7BFC-CqoHnUPd.js.br +0 -0
  287. package/dist/client/assets/ebnfDiagram-PWID7BFC-CqoHnUPd.js.gz +0 -0
  288. package/dist/client/assets/erDiagram-RLTQ6QDP-eJuQs4se.js.br +0 -0
  289. package/dist/client/assets/erDiagram-RLTQ6QDP-eJuQs4se.js.gz +0 -0
  290. package/dist/client/assets/flowDiagram-HODETNUW-DSgseCP6.js.br +0 -0
  291. package/dist/client/assets/flowDiagram-HODETNUW-DSgseCP6.js.gz +0 -0
  292. package/dist/client/assets/ganttDiagram-EL5Y4UJY-Ca5MVluD.js.br +0 -0
  293. package/dist/client/assets/ganttDiagram-EL5Y4UJY-Ca5MVluD.js.gz +0 -0
  294. package/dist/client/assets/gestureArbiter-CGaUInum.js.br +0 -0
  295. package/dist/client/assets/gestureArbiter-CGaUInum.js.gz +0 -0
  296. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BgAMalup.js.br +0 -0
  297. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BgAMalup.js.gz +0 -0
  298. package/dist/client/assets/index-C6xPtOPw.css +0 -1
  299. package/dist/client/assets/index-C6xPtOPw.css.br +0 -0
  300. package/dist/client/assets/ishikawaDiagram-5VMMS53U-BIxEg0pl.js.br +0 -0
  301. package/dist/client/assets/ishikawaDiagram-5VMMS53U-BIxEg0pl.js.gz +0 -0
  302. package/dist/client/assets/journeyDiagram-3NMN7TZE-BI8B1o2v.js.br +0 -0
  303. package/dist/client/assets/journeyDiagram-3NMN7TZE-BI8B1o2v.js.gz +0 -0
  304. package/dist/client/assets/kanban-definition-UXKFOSKX-tBgvPAXx.js.br +0 -0
  305. package/dist/client/assets/kanban-definition-UXKFOSKX-tBgvPAXx.js.gz +0 -0
  306. package/dist/client/assets/layout-F6rDt84Y.js.br +0 -0
  307. package/dist/client/assets/layout-F6rDt84Y.js.gz +0 -0
  308. package/dist/client/assets/linear-QaUhDwi6.js.br +0 -0
  309. package/dist/client/assets/linear-QaUhDwi6.js.gz +0 -0
  310. package/dist/client/assets/mermaid.core-BHNVcgJG.js.br +0 -0
  311. package/dist/client/assets/mermaid.core-BHNVcgJG.js.gz +0 -0
  312. package/dist/client/assets/mindmap-definition-YA3MSWOX-CW_qv6SM.js.br +0 -0
  313. package/dist/client/assets/mindmap-definition-YA3MSWOX-CW_qv6SM.js.gz +0 -0
  314. package/dist/client/assets/passwordBootstrap-xwlVHcmC.js.br +0 -0
  315. package/dist/client/assets/pegDiagram-XKGWAZYB-DN89bpor.js.br +0 -0
  316. package/dist/client/assets/pegDiagram-XKGWAZYB-DN89bpor.js.gz +0 -0
  317. package/dist/client/assets/pieDiagram-E7YTZNPT-DIxGatjK.js.br +0 -0
  318. package/dist/client/assets/pieDiagram-E7YTZNPT-DIxGatjK.js.gz +0 -0
  319. package/dist/client/assets/quadrantDiagram-AXDQQJYC-hA4Rk-Iv.js.br +0 -0
  320. package/dist/client/assets/quadrantDiagram-AXDQQJYC-hA4Rk-Iv.js.gz +0 -0
  321. package/dist/client/assets/railroadDiagram-O6MQD6OU-CQft_cg4.js.br +0 -0
  322. package/dist/client/assets/railroadDiagram-O6MQD6OU-CQft_cg4.js.gz +0 -0
  323. package/dist/client/assets/rdpSession-_Wi6QGVy.js.br +0 -0
  324. package/dist/client/assets/rdpSession-_Wi6QGVy.js.gz +0 -0
  325. package/dist/client/assets/referenceLongPress-CHQPhmmv.js.br +0 -0
  326. package/dist/client/assets/referenceLongPress-CHQPhmmv.js.gz +0 -0
  327. package/dist/client/assets/requirementDiagram-BXWQKSXE-CAMtoGH8.js.br +0 -0
  328. package/dist/client/assets/requirementDiagram-BXWQKSXE-CAMtoGH8.js.gz +0 -0
  329. package/dist/client/assets/sankeyDiagram-P5KCCOFB-USLSjs28.js.br +0 -0
  330. package/dist/client/assets/sankeyDiagram-P5KCCOFB-USLSjs28.js.gz +0 -0
  331. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-D22gyoMc.js.br +0 -0
  332. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-D22gyoMc.js.gz +0 -0
  333. package/dist/client/assets/sizeCapture-INFHLROL-BAWAxmev.js.br +0 -0
  334. package/dist/client/assets/sizeCapture-INFHLROL-BAWAxmev.js.gz +0 -0
  335. package/dist/client/assets/stateDiagram-D77RDMKH-Dd8Kz_3m.js.br +0 -0
  336. package/dist/client/assets/stateDiagram-D77RDMKH-Dd8Kz_3m.js.gz +0 -0
  337. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-b4HSZCSL.js +0 -1
  338. package/dist/client/assets/swimlanes-42K2YHIH-BjLw9hF1.js.br +0 -0
  339. package/dist/client/assets/swimlanes-42K2YHIH-BjLw9hF1.js.gz +0 -0
  340. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-C2ZVrP3k.js +0 -8
  341. package/dist/client/assets/timeline-definition-24CTP7MA-DVis9e2K.js.br +0 -0
  342. package/dist/client/assets/timeline-definition-24CTP7MA-DVis9e2K.js.gz +0 -0
  343. package/dist/client/assets/vennDiagram-4TSXK5OY-CNwJhMgu.js.br +0 -0
  344. package/dist/client/assets/vennDiagram-4TSXK5OY-CNwJhMgu.js.gz +0 -0
  345. package/dist/client/assets/videoCompression-CeWiTlti.js.br +0 -0
  346. package/dist/client/assets/videoCompression-CeWiTlti.js.gz +0 -0
  347. package/dist/client/assets/wardleyDiagram-VM6X3IG4-COCAMRlj.js.br +0 -0
  348. package/dist/client/assets/wardleyDiagram-VM6X3IG4-COCAMRlj.js.gz +0 -0
  349. package/dist/client/assets/xychartDiagram-S5SC5T6Z-BUmr1Xe8.js.br +0 -0
  350. package/dist/client/assets/xychartDiagram-S5SC5T6Z-BUmr1Xe8.js.gz +0 -0
package/dist/client/sw.js CHANGED
@@ -1 +1 @@
1
- if(!self.define){let e,s={};const n=(n,i)=>(n=new URL(n+".js",i).href,s[n]||new Promise(s=>{if("document"in self){const e=document.createElement("script");e.src=n,e.onload=s,document.head.appendChild(e)}else e=n,importScripts(n),s()}).then(()=>{let e=s[n];if(!e)throw new Error(`Module ${n} didn’t register its module`);return e}));self.define=(i,a)=>{const o=e||("document"in self?document.currentScript.src:"")||location.href;if(s[o])return;let c={};const r=e=>n(e,o),d={module:{uri:o},exports:c,require:r};s[o]=Promise.all(i.map(e=>d[e]||r(e))).then(e=>(a(...e),c))}}define(["./workbox-9845bf53"],function(e){"use strict";importScripts("sw-encrypted-background.js","sw-notifications.js","sw-secure-api.js","sw-downloads.js"),self.addEventListener("message",e=>{e.data&&"SKIP_WAITING"===e.data.type&&self.skipWaiting()}),e.clientsClaim(),e.precacheAndRoute([{url:"index.html",revision:"3eb84fb1f27cf66cb5cb39ed67bb30a0"},{url:"assets/app-D5VZp8rc.js",revision:null},{url:"assets/react-XDCjal2T.js",revision:null},{url:"assets/dnd-BCFAPC0L.js",revision:null},{url:"assets/terminal-C7X98Amf.js",revision:null},{url:"assets/index-C6xPtOPw.css",revision:null},{url:"icons/agents/opencode.svg",revision:"851c2931d95821ba2b39b68587b48976"},{url:"icons/agents/kimi.svg",revision:"5366c710f4f763022fe159a69cf17409"},{url:"icons/agents/grok.svg",revision:"cd745b0b964545bc7a6b4f36021c3298"},{url:"icons/agents/goose.svg",revision:"c79b927278983c19098d77b4b0c11ab3"},{url:"icons/agents/gemini.svg",revision:"7a64f6d6f80a908255e9c0256903882e"},{url:"icons/agents/droid.svg",revision:"f28723b8c5c115e0908ba3c72613e256"},{url:"icons/agents/cursor.svg",revision:"a1528f3d3cda497f75a5db28defb19de"},{url:"icons/agents/copilot.svg",revision:"dd52e96c1eac0b6ec4bedcd0ddd3b52d"},{url:"icons/agents/codex.svg",revision:"608e55babb0b217e1f2da287342b46d3"},{url:"icons/agents/claude.svg",revision:"08af0225b7acdd8e8f573f3247e5e1c3"},{url:"icons/agents/amp.svg",revision:"af12f8b33faa81e4d46ea7b93c7e43f3"},{url:"apple-touch-icon-180x180.png",revision:"628c2e2f28a9b545aa57be1352025643"},{url:"boot-logo.png",revision:"2e3a25efd9b0b8ca1eab53b5f2284556"},{url:"favicon.ico",revision:"2994debfa6f59a0898e24eb0c54d64b5"},{url:"ipad-status-bar.js",revision:"3a8080edb8a5cc658a7908f6ad69537f"},{url:"maskable-icon-512x512.png",revision:"4d489331fd81f0713c400b26426442b9"},{url:"pwa-192x192.png",revision:"4d6f899888cfb8ccd7a1fd3c9e583ad2"},{url:"pwa-512x512.png",revision:"0885dd7ec8932e7f878b013d51a380a4"},{url:"robots.txt",revision:"d9339907142917dee4aac78494ac9cfe"},{url:"sw-downloads.js",revision:"48dab2e78bd93b4eee27fca487eccfde"},{url:"sw-notifications.js",revision:"fde578590ea8b0540d488ef448b48f45"},{url:"sw-secure-api.js",revision:"cf2bdbd03d41d66d60344c0b5a1075de"},{url:"manifest.webmanifest",revision:"83f9a43b74c236012adafb077fb6d774"}],{}),e.cleanupOutdatedCaches(),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("index.html"),{denylist:[/^\/api\//,/^\/__termdock-download\//,/^\/health$/]})),e.registerRoute(/\/assets\/.*\.(?:js|css)$/,new e.CacheFirst({cacheName:"termdock-lazy-assets-v1",plugins:[new e.CacheableResponsePlugin({statuses:[0,200]}),new e.ExpirationPlugin({maxEntries:96,maxAgeSeconds:2592e3})]}),"GET"),e.registerRoute(/\/fonts\/terminal\/[^/]+-[a-f0-9]{12}\.woff2$/,new e.CacheFirst({cacheName:"termdock-fonts-v2",plugins:[new e.CacheableResponsePlugin({statuses:[0,200]}),new e.ExpirationPlugin({maxEntries:384,maxAgeSeconds:2592e3})]}),"GET"),e.registerRoute(/\/fonts\/.*\.(?:woff2|ttf)$/,new e.StaleWhileRevalidate({cacheName:"termdock-fonts-v1",plugins:[new e.ExpirationPlugin({maxEntries:24,maxAgeSeconds:2592e3})]}),"GET")});
1
+ if(!self.define){let e,s={};const n=(n,i)=>(n=new URL(n+".js",i).href,s[n]||new Promise(s=>{if("document"in self){const e=document.createElement("script");e.src=n,e.onload=s,document.head.appendChild(e)}else e=n,importScripts(n),s()}).then(()=>{let e=s[n];if(!e)throw new Error(`Module ${n} didn’t register its module`);return e}));self.define=(i,a)=>{const o=e||("document"in self?document.currentScript.src:"")||location.href;if(s[o])return;let c={};const r=e=>n(e,o),d={module:{uri:o},exports:c,require:r};s[o]=Promise.all(i.map(e=>d[e]||r(e))).then(e=>(a(...e),c))}}define(["./workbox-9845bf53"],function(e){"use strict";importScripts("sw-encrypted-background.js","sw-notifications.js","sw-secure-api.js","sw-downloads.js"),self.addEventListener("message",e=>{e.data&&"SKIP_WAITING"===e.data.type&&self.skipWaiting()}),e.clientsClaim(),e.precacheAndRoute([{url:"index.html",revision:"bc64b8c1fa3ef473a31f37178b747d16"},{url:"assets/app-A96wp9Xv.js",revision:null},{url:"assets/react-XDCjal2T.js",revision:null},{url:"assets/dnd-BCFAPC0L.js",revision:null},{url:"assets/terminal-C7X98Amf.js",revision:null},{url:"assets/index-e1PkqIqN.css",revision:null},{url:"icons/agents/opencode.svg",revision:"851c2931d95821ba2b39b68587b48976"},{url:"icons/agents/kimi.svg",revision:"5366c710f4f763022fe159a69cf17409"},{url:"icons/agents/grok.svg",revision:"cd745b0b964545bc7a6b4f36021c3298"},{url:"icons/agents/goose.svg",revision:"c79b927278983c19098d77b4b0c11ab3"},{url:"icons/agents/gemini.svg",revision:"7a64f6d6f80a908255e9c0256903882e"},{url:"icons/agents/droid.svg",revision:"f28723b8c5c115e0908ba3c72613e256"},{url:"icons/agents/cursor.svg",revision:"a1528f3d3cda497f75a5db28defb19de"},{url:"icons/agents/copilot.svg",revision:"dd52e96c1eac0b6ec4bedcd0ddd3b52d"},{url:"icons/agents/codex.svg",revision:"608e55babb0b217e1f2da287342b46d3"},{url:"icons/agents/claude.svg",revision:"08af0225b7acdd8e8f573f3247e5e1c3"},{url:"icons/agents/amp.svg",revision:"af12f8b33faa81e4d46ea7b93c7e43f3"},{url:"apple-touch-icon-180x180.png",revision:"628c2e2f28a9b545aa57be1352025643"},{url:"boot-logo.png",revision:"2e3a25efd9b0b8ca1eab53b5f2284556"},{url:"favicon.ico",revision:"2994debfa6f59a0898e24eb0c54d64b5"},{url:"ipad-status-bar.js",revision:"3a8080edb8a5cc658a7908f6ad69537f"},{url:"maskable-icon-512x512.png",revision:"4d489331fd81f0713c400b26426442b9"},{url:"pwa-192x192.png",revision:"4d6f899888cfb8ccd7a1fd3c9e583ad2"},{url:"pwa-512x512.png",revision:"0885dd7ec8932e7f878b013d51a380a4"},{url:"robots.txt",revision:"d9339907142917dee4aac78494ac9cfe"},{url:"sw-downloads.js",revision:"48dab2e78bd93b4eee27fca487eccfde"},{url:"sw-notifications.js",revision:"fde578590ea8b0540d488ef448b48f45"},{url:"sw-secure-api.js",revision:"cf2bdbd03d41d66d60344c0b5a1075de"},{url:"manifest.webmanifest",revision:"83f9a43b74c236012adafb077fb6d774"}],{}),e.cleanupOutdatedCaches(),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("index.html"),{denylist:[/^\/api\//,/^\/__termdock-download\//,/^\/health$/]})),e.registerRoute(/\/assets\/.*\.(?:js|css)$/,new e.CacheFirst({cacheName:"termdock-lazy-assets-v1",plugins:[new e.CacheableResponsePlugin({statuses:[0,200]}),new e.ExpirationPlugin({maxEntries:96,maxAgeSeconds:2592e3})]}),"GET"),e.registerRoute(/\/fonts\/terminal\/[^/]+-[a-f0-9]{12}\.woff2$/,new e.CacheFirst({cacheName:"termdock-fonts-v2",plugins:[new e.CacheableResponsePlugin({statuses:[0,200]}),new e.ExpirationPlugin({maxEntries:384,maxAgeSeconds:2592e3})]}),"GET"),e.registerRoute(/\/fonts\/.*\.(?:woff2|ttf)$/,new e.StaleWhileRevalidate({cacheName:"termdock-fonts-v1",plugins:[new e.ExpirationPlugin({maxEntries:24,maxAgeSeconds:2592e3})]}),"GET")});
Binary file
Binary file
@@ -1,3 +1,4 @@
1
+ import { RELAY_CLIENT_CONNECT_TIMEOUT_MS } from '../federation/streamLimits.js';
1
2
  import { encryptedRequestSubject } from '../federation/requestContext.js';
2
3
  import { randomUUID } from 'node:crypto';
3
4
  import { readFileSync, writeFileSync, renameSync, mkdirSync } from 'node:fs';
@@ -164,7 +165,7 @@ function relayDuplex(socket, target) {
164
165
  let readyResolve, readyReject;
165
166
  const ready = new Promise((resolve, reject) => { readyResolve = resolve; readyReject = reject; });
166
167
  void ready.catch(() => { });
167
- const timer = setTimeout(() => fail(new Error('ROUTE_TIMEOUT')), 5000);
168
+ const timer = setTimeout(() => fail(new Error('ROUTE_TIMEOUT')), RELAY_CLIENT_CONNECT_TIMEOUT_MS);
168
169
  const fail = (error) => { clearTimeout(timer); readyReject(error); queue.end(error); socket.close(); };
169
170
  const send = (frame) => {
170
171
  if (socket.readyState !== 1 || socket.bufferedAmount > 1024 * 1024)
@@ -1,7 +1,8 @@
1
+ import { RELAY_PROVIDER_CONNECT_TIMEOUT_MS, RELAY_ROUTE_OPEN_TIMEOUT_MS } from './streamLimits.js';
1
2
  import { randomUUID } from 'node:crypto';
2
3
  import { EventEmitter } from 'node:events';
3
4
  const defaults = { maxFrameBytes: 256 * 1024, maxBufferedBytes: 1024 * 1024,
4
- maxStreams: 128, heartbeatMs: 30_000, maxRouteTtlMs: 90_000, connectTimeoutMs: 10_000 };
5
+ maxStreams: 128, heartbeatMs: 30_000, maxRouteTtlMs: 90_000, connectTimeoutMs: RELAY_PROVIDER_CONNECT_TIMEOUT_MS, routeTimeoutMs: RELAY_ROUTE_OPEN_TIMEOUT_MS };
5
6
  const identifier = (v) => typeof v === 'string' && /^[a-zA-Z0-9_.:-]{1,160}$/.test(v);
6
7
  function parse(raw, limits) {
7
8
  if (Buffer.byteLength(raw instanceof Array ? Buffer.concat(raw) : raw) > limits.maxFrameBytes)
@@ -90,9 +91,11 @@ export class RelayRouter {
90
91
  this.options = options;
91
92
  this.limits = { ...defaults, ...options };
92
93
  this.sweep = setInterval(() => {
93
- for (const [id, route] of this.routes)
94
- if (route.expires <= Date.now() || !this.canRegister(route.peer, id))
95
- this.withdraw(id, route.peer);
94
+ for (const [id, routes] of this.routes)
95
+ for (const [peer, route] of routes) {
96
+ if (route.expires <= Date.now() || peer.ws.readyState !== 1 || !this.canRegister(peer, id))
97
+ this.withdraw(id, peer);
98
+ }
96
99
  for (const peer of this.peers)
97
100
  for (const stream of [...peer.streams.values()]) {
98
101
  if (stream.owner === peer && !this.canRoute(peer, stream.serviceId))
@@ -107,16 +110,22 @@ export class RelayRouter {
107
110
  canRoute(peer, serviceId) {
108
111
  return !this.directPeers.has(peer) && this.options.allowRoute(peer.principal, serviceId);
109
112
  }
113
+ providers(serviceId) {
114
+ return [...(this.routes.get(serviceId) || [])]
115
+ .filter(([peer, route]) => route.expires > Date.now() && peer.ws.readyState === 1 && this.canRegister(peer, serviceId))
116
+ // Recent target failures lower priority but never make the only route disappear.
117
+ .sort((a, b) => Math.max(0, a[1].retryAfter - Date.now()) - Math.max(0, b[1].retryAfter - Date.now()))
118
+ .map(([peer]) => peer);
119
+ }
110
120
  hasRoute(serviceId) {
111
- const route = this.routes.get(serviceId);
112
- return !this.stopped && !!route && route.expires > Date.now() && route.peer.ws.readyState === 1 && this.canRegister(route.peer, serviceId);
121
+ return !this.stopped && this.providers(serviceId).length > 0;
113
122
  }
114
123
  activeRouteIds() {
115
124
  return [...this.routes.keys()].filter(serviceId => this.hasRoute(serviceId));
116
125
  }
117
126
  /** Trusted local configuration only. Clients never supply a target URL or factory. */
118
127
  registerDirect(serviceId, connect) {
119
- if (this.stopped || !identifier(serviceId) || typeof connect !== 'function' || this.hasRoute(serviceId))
128
+ if (this.stopped || !identifier(serviceId) || typeof connect !== 'function' || [...this.peers].some(peer => this.directPeers.get(peer) === serviceId))
120
129
  throw new Error('Invalid or already registered direct target');
121
130
  const [routerWire, clientWire] = memoryPair();
122
131
  // The private WeakMap marks this peer; its placeholder principal is never
@@ -139,6 +148,10 @@ export class RelayRouter {
139
148
  }
140
149
  /** Caller awaits attach before completing its application-level ready handshake. */
141
150
  async attach(ws, context) {
151
+ if (this.stopped) {
152
+ ws.close(1001, 'Router stopped');
153
+ return false;
154
+ }
142
155
  // Reject early application frames rather than buffering untrusted traffic while authenticating.
143
156
  let early = false;
144
157
  const rejectEarly = () => { early = true; ws.close(1008, 'Authentication pending'); };
@@ -151,7 +164,7 @@ export class RelayRouter {
151
164
  principal = null;
152
165
  }
153
166
  ws.off('message', rejectEarly);
154
- if (principal === null || early || ws.readyState !== 1) {
167
+ if (this.stopped || principal === null || early || ws.readyState !== 1) {
155
168
  ws.close(1008, 'Relay authentication required');
156
169
  return false;
157
170
  }
@@ -169,72 +182,131 @@ export class RelayRouter {
169
182
  return true;
170
183
  }
171
184
  withdraw(serviceId, peer) {
172
- if (this.routes.get(serviceId)?.peer === peer)
185
+ const routes = this.routes.get(serviceId);
186
+ routes?.delete(peer);
187
+ if (!routes?.size)
173
188
  this.routes.delete(serviceId);
174
189
  for (const stream of [...peer.streams.values()])
175
190
  if (stream.serviceId === serviceId && stream.provider === peer)
176
- this.closeStream(stream, 'Route unavailable');
191
+ this.providerFailed(stream, 'Route unavailable');
177
192
  }
178
193
  remove(peer) {
179
194
  this.peers.delete(peer);
180
- for (const [id, route] of this.routes)
181
- if (route.peer === peer)
195
+ // Consumers cannot fail over after disconnecting; remove them first.
196
+ for (const stream of [...peer.streams.values()])
197
+ if (stream.owner === peer)
198
+ this.closeStream(stream, 'Relay disconnected');
199
+ for (const [id, routes] of this.routes)
200
+ if (routes.has(peer))
182
201
  this.withdraw(id, peer);
183
202
  for (const stream of [...peer.streams.values()])
184
- this.closeStream(stream, 'Relay disconnected');
203
+ this.providerFailed(stream, 'Relay disconnected');
185
204
  }
186
205
  closeStream(s, reason) {
206
+ if (s.owner.streams.get(s.ownerId) !== s)
207
+ return;
208
+ clearTimeout(s.deadline);
187
209
  s.owner.streams.delete(s.ownerId);
188
- s.provider.streams.delete(s.providerId);
210
+ if (s.provider.streams.get(s.providerId) === s) {
211
+ s.provider.streams.delete(s.providerId);
212
+ send(s.provider.ws, { type: 'close', streamId: s.providerId, reason }, this.limits);
213
+ }
189
214
  send(s.owner.ws, { type: 'close', streamId: s.ownerId, reason }, this.limits);
215
+ }
216
+ providerFailed(s, reason) {
217
+ if (s.owner.streams.get(s.ownerId) !== s)
218
+ return;
219
+ clearTimeout(s.deadline);
220
+ s.provider.streams.delete(s.providerId);
190
221
  send(s.provider.ws, { type: 'close', streamId: s.providerId, reason }, this.limits);
222
+ const route = this.routes.get(s.serviceId)?.get(s.provider);
223
+ if (route)
224
+ route.retryAfter = Date.now() + 5000;
225
+ // Never replay ciphertext (or terminal input) onto a replacement transport.
226
+ if (s.opened || !this.openProvider(s))
227
+ this.closeStream(s, reason);
228
+ }
229
+ openProvider(s) {
230
+ if (this.stopped || Date.now() >= s.expires || s.owner.ws.readyState !== 1 || !this.canRoute(s.owner, s.serviceId))
231
+ return false;
232
+ for (const provider of this.providers(s.serviceId)) {
233
+ if (provider === s.owner || s.attempted.has(provider) || provider.streams.size >= this.limits.maxStreams)
234
+ continue;
235
+ s.attempted.add(provider);
236
+ s.provider = provider;
237
+ s.providerId = randomUUID();
238
+ provider.streams.set(s.providerId, s);
239
+ if (!send(provider.ws, { type: 'open', streamId: s.providerId, serviceId: s.serviceId }, this.limits)) {
240
+ provider.streams.delete(s.providerId);
241
+ continue;
242
+ }
243
+ s.deadline = setTimeout(() => this.providerFailed(s, 'Target timeout'), Math.min(this.limits.connectTimeoutMs, s.expires - Date.now()));
244
+ s.deadline.unref?.();
245
+ return true;
246
+ }
247
+ return false;
191
248
  }
192
249
  receive(peer, f) {
193
250
  if (f.type === 'register') {
194
251
  if (!f.serviceIds.every(id => this.canRegister(peer, id)))
195
252
  throw new Error('Registration denied');
253
+ for (const [id, routes] of this.routes)
254
+ if (routes.has(peer) && !f.serviceIds.includes(id))
255
+ this.withdraw(id, peer);
196
256
  for (const id of f.serviceIds) {
197
- const old = this.routes.get(id);
198
- if (old && old.peer !== peer && old.expires > Date.now())
199
- throw new Error('Route already registered');
257
+ let routes = this.routes.get(id);
258
+ if (!routes) {
259
+ routes = new Map();
260
+ this.routes.set(id, routes);
261
+ }
262
+ routes.set(peer, { expires: Date.now() + Math.min(f.ttlMs, this.limits.maxRouteTtlMs), retryAfter: routes.get(peer)?.retryAfter ?? 0 });
200
263
  }
201
- for (const [id, r] of this.routes)
202
- if (r.peer === peer && !f.serviceIds.includes(id))
203
- this.withdraw(id, peer);
204
- for (const id of f.serviceIds)
205
- this.routes.set(id, { peer, expires: Date.now() + Math.min(f.ttlMs, this.limits.maxRouteTtlMs) });
206
264
  return;
207
265
  }
208
266
  if (f.type === 'open') {
209
- const route = this.routes.get(f.serviceId);
210
267
  if (peer.streams.has(f.streamId))
211
268
  throw new Error('Duplicate stream');
212
- if (!this.canRoute(peer, f.serviceId) || !route || route.expires <= Date.now() || route.peer === peer) {
269
+ if (!this.canRoute(peer, f.serviceId) || !this.hasRoute(f.serviceId)) {
213
270
  send(peer.ws, { type: 'close', streamId: f.streamId, reason: 'Route unavailable or denied' }, this.limits);
214
271
  return;
215
272
  }
216
- if (peer.streams.size >= this.limits.maxStreams || route.peer.streams.size >= this.limits.maxStreams)
273
+ if (peer.streams.size >= this.limits.maxStreams)
217
274
  throw new Error('Stream budget exceeded');
218
- const s = { owner: peer, ownerId: f.streamId, provider: route.peer, providerId: randomUUID(), serviceId: f.serviceId };
275
+ const s = { owner: peer, ownerId: f.streamId, provider: peer, providerId: '', serviceId: f.serviceId, opened: false, expires: Date.now() + this.limits.routeTimeoutMs, attempted: new Set() };
219
276
  peer.streams.set(s.ownerId, s);
220
- route.peer.streams.set(s.providerId, s);
221
- if (!send(route.peer.ws, { ...f, streamId: s.providerId }, this.limits))
222
- this.closeStream(s, 'Relay disconnected');
277
+ if (!this.openProvider(s))
278
+ this.closeStream(s, 'Route unavailable or congested');
223
279
  return;
224
280
  }
225
281
  const s = peer.streams.get(f.streamId);
226
282
  if (!s)
227
283
  return;
228
- if (!this.canRoute(s.owner, s.serviceId) || !this.canRegister(s.provider, s.serviceId)) {
284
+ if (!this.canRoute(s.owner, s.serviceId)) {
229
285
  this.closeStream(s, 'Authorization revoked');
230
286
  return;
231
287
  }
288
+ const registration = this.routes.get(s.serviceId)?.get(s.provider);
289
+ if (!registration || registration.expires <= Date.now() || !this.canRegister(s.provider, s.serviceId)) {
290
+ this.withdraw(s.serviceId, s.provider);
291
+ return;
292
+ }
232
293
  if (f.type === 'close') {
233
- this.closeStream(s, 'Channel closed');
294
+ if (peer === s.provider)
295
+ this.providerFailed(s, 'Channel closed');
296
+ else
297
+ this.closeStream(s, 'Channel closed');
234
298
  return;
235
299
  }
236
300
  if (f.type === 'opened' && peer !== s.provider)
237
301
  throw new Error('Invalid channel direction');
302
+ if (f.type === 'opened') {
303
+ if (s.opened)
304
+ throw new Error('Channel already opened');
305
+ clearTimeout(s.deadline);
306
+ s.opened = true;
307
+ }
308
+ else if (!s.opened)
309
+ throw new Error('Channel not ready');
238
310
  const target = peer === s.owner ? s.provider : s.owner;
239
311
  if (!send(target.ws, { ...f, streamId: peer === s.owner ? s.providerId : s.ownerId }, this.limits))
240
312
  this.closeStream(s, 'Relay congestion');
@@ -251,6 +323,7 @@ export class RelayClient {
251
323
  limits;
252
324
  streams = new Map();
253
325
  renewal;
326
+ pending = new Map();
254
327
  stopped = false;
255
328
  constructor(upstream, options) {
256
329
  this.upstream = upstream;
@@ -265,6 +338,8 @@ export class RelayClient {
265
338
  upstream.on('message', raw => { void this.receive(raw).catch(() => upstream.close(1008, 'Invalid relay frame')); });
266
339
  }
267
340
  drop(id, reason) {
341
+ clearTimeout(this.pending.get(id));
342
+ this.pending.delete(id);
268
343
  const target = this.streams.get(id);
269
344
  this.streams.delete(id);
270
345
  target?.close();
@@ -276,26 +351,35 @@ export class RelayClient {
276
351
  throw new Error('Unexpected registration');
277
352
  if (f.type === 'open') {
278
353
  const connect = this.options.targets.get(f.serviceId);
279
- if (!connect || this.streams.has(f.streamId) || this.streams.size >= this.limits.maxStreams) {
354
+ if (this.streams.has(f.streamId))
355
+ throw new Error('Duplicate stream');
356
+ if (!connect || this.streams.size >= this.limits.maxStreams) {
280
357
  this.drop(f.streamId, 'Target unavailable');
281
358
  return;
282
359
  }
283
360
  this.streams.set(f.streamId, null);
284
- let timedOut = false;
285
- const timer = setTimeout(() => { timedOut = true; this.drop(f.streamId, 'Target timeout'); }, this.limits.connectTimeoutMs);
361
+ const timer = setTimeout(() => { this.drop(f.streamId, 'Target timeout'); }, this.limits.connectTimeoutMs);
286
362
  timer.unref?.();
363
+ this.pending.set(f.streamId, timer);
287
364
  let target;
288
365
  try {
289
366
  target = await connect();
290
367
  }
291
368
  catch {
292
- clearTimeout(timer);
293
- this.drop(f.streamId, 'Target unavailable');
369
+ if (this.pending.get(f.streamId) === timer)
370
+ this.drop(f.streamId, 'Target unavailable');
371
+ return;
372
+ }
373
+ // A canceled attempt may complete after the same ID has been reused.
374
+ if (this.pending.get(f.streamId) !== timer || this.stopped) {
375
+ target.close();
294
376
  return;
295
377
  }
296
378
  clearTimeout(timer);
297
- if (timedOut || this.stopped || !this.streams.has(f.streamId)) {
379
+ this.pending.delete(f.streamId);
380
+ if (target.readyState !== 1) {
298
381
  target.close();
382
+ this.drop(f.streamId, 'Target not ready');
299
383
  return;
300
384
  }
301
385
  this.streams.set(f.streamId, target);
@@ -3,3 +3,8 @@
3
3
  export const MAX_ACTIVE_HTTP_REQUESTS = 8;
4
4
  export const MAX_SERVER_HTTP_REQUESTS = 32;
5
5
  export const MAX_OPEN_SECURE_SOCKETS = 128;
6
+ // Relay selection must finish before foreground/background clients abandon the
7
+ // transport, leaving time for the final pinned Noise handshake.
8
+ export const RELAY_PROVIDER_CONNECT_TIMEOUT_MS = 10_000;
9
+ export const RELAY_ROUTE_OPEN_TIMEOUT_MS = 15_000;
10
+ export const RELAY_CLIENT_CONNECT_TIMEOUT_MS = 20_000;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "termdock",
3
- "version": "1.4.329",
3
+ "version": "1.4.331",
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.329",
4
+ "version": "1.4.331",
5
5
  "runtimeProtocolVersion": 1,
6
6
  "minimumDesktopVersion": "1.4.46",
7
7
  "nodeMajor": 22,
8
8
  "dependencyHash": "sha256-oaGYi/P5ob8sd6VnNBOwshKozjhdV+hYiCmLAsn5x00=",
9
- "serverBundleHash": "sha256-R3DBIQv0z+SBN+LCWHRsFbWHqQ92u8mBkCkfn1MJdok=",
10
- "clientBundleHash": "sha256-GLTHYP07SNJ24my1kl9LAFyEV1xLXDYzMzPHumxvQSo=",
9
+ "serverBundleHash": "sha256-8G1r0kK1SCfOUPNd0nZl3wgoQuslq1dDeS5wpBtmPeI=",
10
+ "clientBundleHash": "sha256-R0LHH5Yo2BX1nGwLCClboWwzkoz/xOgeYTdOEEWULMk=",
11
11
  "entrypoint": "dist/server/cli.js",
12
12
  "clientEntrypoint": "dist/client/index.html"
13
13
  }
@@ -1,2 +0,0 @@
1
- import{bA as r}from"./app-D5VZp8rc.js";import{b as m}from"./dnd-BCFAPC0L.js";import{b as n}from"./RightSidebar-BVTTEpbi.js";import"./react-XDCjal2T.js";import"./terminal-C7X98Amf.js";import"./App-D9G1XjRn.js";import"./gestureArbiter-CGaUInum.js";import"./triangle-alert-CiksAjZK.js";import"./referenceLongPress-CHQPhmmv.js";import"./DiffReview-Bm5VsO_2.js";import"./sparkles-BK6dvO4C.js";import"./DiffViewer-CYl7f8Ni.js";import"./ChangeWalkthroughPanel-iNaVjdNU.js";function g({content:o}){const e=m.useMemo(()=>n(o.split(`
2
- `),null,null),[o]);return r.jsx("div",{className:"min-w-0 space-y-3 break-words text-sm leading-6 text-foreground [&_h1]:text-lg [&_h2]:text-base [&_h3]:text-sm [&_pre]:max-w-full [&_table]:text-xs",children:e.map((t,i)=>r.jsx("div",{className:"min-w-0",children:typeof t.content=="function"?t.content(null):t.content},i))})}export{g as default};
@@ -1,6 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/rdpSession-_Wi6QGVy.js","assets/app-D5VZp8rc.js","assets/react-XDCjal2T.js","assets/dnd-BCFAPC0L.js","assets/terminal-C7X98Amf.js","assets/index-C6xPtOPw.css","assets/ChangeWalkthroughPanel-iNaVjdNU.js","assets/sparkles-BK6dvO4C.js","assets/triangle-alert-CiksAjZK.js","assets/App-D9G1XjRn.js","assets/gestureArbiter-CGaUInum.js","assets/gestureArbiter-C2J0D0kV.css","assets/referenceLongPress-CHQPhmmv.js"])))=>i.map(i=>d[i]);
2
- import{ah as Ve,cz as Ot,df as St,bA as t,a4 as Ft,cw as $e,bz as We,W as yt,o as vt,l as Kt,X as $t,_ as wt}from"./app-D5VZp8rc.js";import{b as s,r as Ze}from"./dnd-BCFAPC0L.js";import{a as Ut}from"./ChangeWalkthroughPanel-iNaVjdNU.js";import{s as Ct,Y as kt,K as Ge,j as jt}from"./App-D9G1XjRn.js";import{M as Bt}from"./triangle-alert-CiksAjZK.js";const Vt=[["path",{d:"M4.037 4.688a.495.495 0 0 1 .651-.651l16 6.5a.5.5 0 0 1-.063.947l-6.124 1.58a2 2 0 0 0-1.438 1.435l-1.579 6.126a.5.5 0 0 1-.947.063z",key:"edeuup"}]],Ht=Ve("mouse-pointer-2",Vt);const Yt=[["path",{d:"M14 17H5",key:"gfn3mx"}],["path",{d:"M19 7h-9",key:"6i9tg"}],["circle",{cx:"17",cy:"17",r:"3",key:"18b49y"}],["circle",{cx:"7",cy:"7",r:"3",key:"dfmy0x"}]],Xt=Ve("settings-2",Yt);const qt=[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["line",{x1:"21",x2:"16.65",y1:"21",y2:"16.65",key:"13gj7c"}],["line",{x1:"11",x2:"11",y1:"8",y2:"14",key:"1vmskp"}],["line",{x1:"8",x2:"14",y1:"11",y2:"11",key:"durymu"}]],Wt=Ve("zoom-in",qt);const Zt=[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["line",{x1:"21",x2:"16.65",y1:"21",y2:"16.65",key:"13gj7c"}],["line",{x1:"8",x2:"14",y1:"11",y2:"11",key:"durymu"}]],Gt=Ve("zoom-out",Zt);function Qe(e){const n=e==="darwin"?"mac":e==="win32"?"windows":"linux",c={host:"127.0.0.1",platform:n,protocol:n==="mac"?"vnc":"rdp",port:"3389",username:"",domain:"",ignoreCert:!1,rememberLogin:!0};return{target:"local",local:c,remote:{...c,host:""},viewOnly:!1,fit:!0,autoConnect:!0}}function Et(e,n){const c=Qe(n);if(!e||typeof e!="object")return c;const a=e,i=(y,u)=>{const l=y&&typeof y=="object"?y:{},g=(f,x)=>typeof l[f]=="string"&&l[f].length<=x&&!/[\x00-\x1f]/.test(l[f])?l[f]:u[f];return{host:g("host",253),username:g("username",255),domain:g("domain",255),platform:["mac","linux","windows"].includes(String(l.platform))?l.platform:u.platform,protocol:l.protocol==="rdp"||l.protocol==="vnc"?l.protocol:u.protocol,port:typeof l.port=="string"&&/^\d{0,5}$/.test(l.port)&&Number(l.port)<=65535?l.port:u.port,ignoreCert:l.ignoreCert===!0,rememberLogin:l.rememberLogin!==!1}};return{target:a.target==="remote"?"remote":"local",local:{...i(a.local,c.local),host:"127.0.0.1"},remote:i(a.remote,c.remote),viewOnly:a.viewOnly===!0,fit:a.fit!==!1,autoConnect:a.autoConnect!==!1}}function Tt(e){return JSON.stringify([e.host.trim().toLowerCase(),e.protocol,e.protocol==="vnc"?5900:Number(e.port),e.username.trim(),e.domain.trim()])}function Jt(e){const[n,c]=s.useState(Qe),[a,i]=s.useState(!1),[y,u]=s.useState("loading"),[l,g]=s.useState(0),[f,x]=s.useState([]),[k,v]=s.useState("idle"),b=s.useRef(n),P=s.useRef(0),E=s.useRef(0),h=s.useRef(""),p=s.useRef(null),j=s.useRef(new Set),N=s.useCallback(S=>{b.current=S(b.current),P.current++,c(b.current),u("saving")},[]);s.useEffect(()=>{const S=++E.current;P.current=0,h.current="",p.current=null,b.current=Qe(),c(b.current),i(!1),u("loading"),x([]),v("idle");const T=new AbortController;return fetch("/api/computer/preferences",{signal:T.signal}).then(async R=>{if(!R.ok)throw new Error("PREFERENCES_LOAD_FAILED");return await R.json()}).then(R=>{if(S!==E.current||T.signal.aborted)return;let w=Et(R.preferences);const V=P.current>0;if(!R.configured&&!V)try{const I=localStorage.getItem(`termdock:computer-host:${e}`);if(I){const J=/^(127\.0\.0\.1|localhost|::1|\[::1\])$/i.test(I)?"local":"remote";w=Et({...w,target:J,[J]:{...w[J],host:I,platform:localStorage.getItem(`termdock:computer-platform:${e}`)||w[J].platform,protocol:localStorage.getItem(`termdock:computer-protocol:${e}`)||"vnc",port:localStorage.getItem(`termdock:computer-rdp-port:${e}`)||"3389"}}),P.current++}}catch{}V||(b.current=w),h.current=R.configured?JSON.stringify(w):"",c(b.current),i(!0),u(R.configured?"saved":"saving"),x(Array.isArray(R.credentialKeys)?R.credentialKeys.filter(I=>typeof I=="string"):[]),v(R.credentialError?"error":"idle")}).catch(()=>{!T.signal.aborted&&S===E.current&&u("error")}),()=>{++E.current,T.abort();for(const R of j.current)R.abort();j.current.clear()}},[e,l]);const _=s.useCallback(()=>{if(p.current)return p.current;if(!a)return Promise.resolve(!1);const S=E.current,T=(async()=>{for(;h.current!==JSON.stringify(b.current);){const R=JSON.stringify(b.current),w=new AbortController;j.current.add(w),u("saving");try{if(!(await fetch("/api/computer/preferences",{method:"PUT",headers:{"Content-Type":"application/json"},body:R,signal:w.signal})).ok)throw new Error("PREFERENCES_SAVE_FAILED");if(S!==E.current)return!1;h.current=R}catch{return S===E.current&&u("error"),!1}finally{j.current.delete(w)}}return S===E.current&&u("saved"),!0})();return p.current=T,T.finally(()=>{p.current===T&&(p.current=null)}),T},[a]);s.useEffect(()=>{if(!a||h.current===JSON.stringify(n))return;const S=setTimeout(()=>{_()},300);return()=>clearTimeout(S)},[a,n,_]);const Y=s.useCallback(async(S,T,R)=>{const w=E.current,V=new AbortController;S!=="use"&&v("saving");try{if(!await _()||w!==E.current)throw new Error("COMPUTER_CREDENTIALS_FAILED");j.current.add(V);const I=await fetch(`/api/computer/credentials/${S}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({profile:T,...S==="save"?{password:R}:{}}),signal:V.signal});if(w!==E.current)throw new Error("COMPUTER_CREDENTIALS_FAILED");if(!I.ok)throw new Error(S==="use"&&I.status===404?"COMPUTER_CREDENTIALS_MISSING":"COMPUTER_CREDENTIALS_FAILED");const K=await I.json();if(w!==E.current)throw new Error("COMPUTER_CREDENTIALS_FAILED");const J=Tt(T);if(S==="save"&&x(ee=>[...new Set([...ee,J])]),S==="forget"&&x(ee=>ee.filter(we=>we!==J)),S==="use"&&(typeof K.password!="string"||!K.password))throw new Error("COMPUTER_CREDENTIALS_MISSING");return v("idle"),K.password}catch(I){throw w===E.current&&!V.signal.aborted&&v("error"),I}finally{j.current.delete(V)}},[_]);return{preferences:n,change:N,loaded:a,saveState:y,flush:_,credentialKeys:f,loginState:k,credentialRequest:Y,retry:()=>a?void _():g(S=>S+1)}}class Qt{binaryType="arraybuffer";protocol="";CONNECTING=0;OPEN=1;CLOSING=2;CLOSED=3;onopen=null;onmessage=null;onerror=null;onclose=null;socket;get readyState(){return this.socket.readyState}constructor(n,c){this.socket=Ot(`/api/computer/ws?host=${encodeURIComponent(n)}`),this.socket.onopen=a=>this.onopen?.(a),this.socket.onerror=a=>this.onerror?.(a),this.socket.onclose=a=>{(a.code!==1e3||a.reason)&&c(a.reason||"COMPUTER_DISCONNECTED"),this.onclose?.(a)},this.socket.onmessage=a=>{try{const i=JSON.parse(a.data);if(i.type!=="data"||typeof i.data!="string"||!Number.isSafeInteger(i.seq))throw new Error("Invalid VNC record");const y=Uint8Array.from(atob(i.data),u=>u.charCodeAt(0));this.onmessage?.(new MessageEvent("message",{data:y.buffer})),this.socket.readyState===1&&this.socket.send(JSON.stringify({type:"ack",seq:i.seq}))}catch{c("COMPUTER_INVALID_MESSAGE"),this.close(),this.onclose?.(new CloseEvent("close",{code:4400}))}}}send(n){const c=ArrayBuffer.isView(n)?new Uint8Array(n.buffer,n.byteOffset,n.byteLength):new Uint8Array(n);for(let a=0;a<c.length;a+=32*1024){const i=c.subarray(a,a+32768);let y="";for(const u of i)y+=String.fromCharCode(u);this.socket.send(JSON.stringify({type:"data",data:btoa(y)}))}}close(){this.socket.close()}}function er(e){return e==="mac"||e==="linux"||e==="windows"}function tr(e){const n=e==="mac"?[65513,"MetaLeft"]:[65507,"ControlLeft"],c=e==="mac"?n:[65515,"MetaLeft"];return{escape:[[65307,"Escape"]],enter:[[65293,"Enter"]],backspace:[[65288,"Backspace"]],tab:[e==="mac"?n:[65513,"AltLeft"],[65289,"Tab"]],search:e==="mac"?[c,[32,"Space"]]:[c],copy:[n,[99,"KeyC"]],paste:[n,[118,"KeyV"]],up:[[65362,"ArrowUp"]],down:[[65364,"ArrowDown"]],left:[[65361,"ArrowLeft"]],right:[[65363,"ArrowRight"]]}}function rr(e){const n=e;return{rendersCursor:!0,position:()=>({x:Number.isFinite(n._mousePos.x)?n._display.absX(n._mousePos.x):n._fbWidth/2,y:Number.isFinite(n._mousePos.y)?n._display.absY(n._mousePos.y):n._fbHeight/2}),size:()=>({width:n._fbWidth,height:n._fbHeight}),surface:()=>n._canvas,send:(c,a,i)=>{const y=n._display.scale,u=(c-n._display.absX(0))*y,l=(a-n._display.absY(0))*y;n._mousePos={x:u,y:l},n._mouseMoveTimer!==null&&clearTimeout(n._mouseMoveTimer),n._mouseMoveTimer=null,n._mouseButtonMask=i,n._mouseLastMoveTime=Date.now(),n._sendMouse(u,l,i);const g=n._canvas.getBoundingClientRect();n._cursor?.move(g.left+u,g.top+l)}}}function nr(e,n,c){const a=new AbortController,i=new Set,y=new Set;let u,l,g=!1,f=performance.now();const x=()=>i.size>0||y.size>0,k=h=>{u=void 0,!(g||!x())&&(performance.now()-f>1e3||(c.record("browser-frame",{time:h,interval:l===void 0?null:h-l,logical:n.position?.(),renderer:n.observeCursor?.()}),l=h,u=requestAnimationFrame(k)))},v=()=>{x()?u===void 0&&(l=void 0,u=requestAnimationFrame(k)):(u!==void 0&&cancelAnimationFrame(u),u=void 0,l=void 0)},b=h=>{if(h.pointerType!=="touch"&&h.pointerType!=="pen")return;f=performance.now(),h.type==="pointerdown"?i.add(h.pointerId):(h.type==="pointerup"||h.type==="pointercancel"||h.type==="lostpointercapture")&&i.delete(h.pointerId);const p=h.getCoalescedEvents?.()??[];c.record("raw-pointer",{type:h.type,time:h.timeStamp,id:h.pointerId,pointerType:h.pointerType,client:[h.clientX,h.clientY],trusted:h.isTrusted,coalesced:p.slice(-16).map(j=>[j.timeStamp,j.clientX,j.clientY])}),v()},P=h=>{f=performance.now(),y.clear();for(const p of Array.from(h.touches))y.add(p.identifier);c.record("raw-touch",{type:h.type,time:h.timeStamp,trusted:h.isTrusted,touches:Array.from(h.touches,p=>[p.identifier,p.clientX,p.clientY]),changed:Array.from(h.changedTouches,p=>[p.identifier,p.clientX,p.clientY])}),v()},E={capture:!0,passive:!0,signal:a.signal};for(const h of["pointerdown","pointermove","pointerup","pointercancel","lostpointercapture"])e.addEventListener(h,b,E);for(const h of["touchstart","touchmove","touchend","touchcancel"])e.addEventListener(h,P,E);return c.record("observation-start",{version:2,pointerEvents:typeof PointerEvent<"u",touchEvents:"ontouchstart"in window}),()=>{g=!0,a.abort(),u!==void 0&&cancelAnimationFrame(u),c.record("observation-stop"),c.flush("observation-stop")}}const Lt="termdock:computer-touch-mode:v1";function or(){try{const e=localStorage.getItem(Lt);if(e==="trackpad"||e==="direct")return e}catch{}return navigator.maxTouchPoints>0&&window.matchMedia("(any-pointer: coarse)").matches?"trackpad":"direct"}function sr(e){try{localStorage.setItem(Lt,e)}catch{}}const Oe=8,ar=300,cr=450,Nt=18,ir=50,Ue=(e,n)=>Math.max(0,Math.min(e,Math.max(0,n-1)));function lr(e,n,c,a,i={}){const y=new AbortController,u=i.trace?nr(e,n,i.trace):void 0,l=new Map;let g=0,f=0,x=!1,k=!1,v=!1,b=!1,P=0,E=1,h="pending",p=[],j={x:0,y:0},N={x:0,y:0},_,Y=0,S=0,T,R=!0,w,V=!1;const I=()=>{const o=n.size(),d=a.current??={x:o.width/2,y:o.height/2};return d.x=Ue(d.x,o.width),d.y=Ue(d.y,o.height),d};let K;const J=()=>{const o=n.size();if((!K||K.width!==o.width||K.height!==o.height)&&(R=!0),!R&&K)return K;const d=n.surface(),C=e.getBoundingClientRect(),$=d.getBoundingClientRect(),D=[];for(let M=d.parentElement;M&&M!==e;M=M.parentElement){const F=getComputedStyle(M),B=/auto|scroll/.test(F.overflowX)?Math.max(0,M.scrollWidth-M.clientWidth):0,oe=/auto|scroll/.test(F.overflowY)?Math.max(0,M.scrollHeight-M.clientHeight):0;if(!B&&!oe)continue;const se=M.getBoundingClientRect();D.push({element:M,left:se.left-C.left,top:se.top-C.top,right:se.right-C.left,bottom:se.bottom-C.top,maxX:B,maxY:oe})}return K={...o,left:$.left-C.left,top:$.top-C.top,scaleX:o.width&&$.width?$.width/o.width:1,scaleY:o.height&&$.height?$.height/o.height:1,viewportWidth:C.width,viewportHeight:C.height,clientLeft:C.left,clientTop:C.top,scrollers:D},R=!1,K},ee=(o,d)=>{if(!i.trace)return;const C=K;i.trace.record(o,{mode:i.mode,pointerType:d?.pointerType,pointerId:d?.pointerId,client:d?[d.clientX,d.clientY]:void 0,inputTime:d?.timeStamp,target:a.current?[a.current.x,a.current.y]:null,actual:n.position?.(),buttons:S,fingers:l.size,moved:x,pinching:b,scrolling:v,zoom:i.zoom?.get(),scale:C?[C.scaleX,C.scaleY]:void 0,surface:C?[C.left,C.top,C.width,C.height]:void 0,viewport:C?[C.clientLeft,C.clientTop,C.viewportWidth,C.viewportHeight]:void 0})};i.trace?.record("touchpad-attached",{mode:i.mode,viewOnly:i.viewOnly}),c.hidden=!0;const we=()=>{const o=J(),d=I();if(!o.width||!o.height||b||i.viewOnly)return;let C=o.left+d.x*o.scaleX,$=o.top+d.y*o.scaleY;for(const D of o.scrollers){if(D.maxX){const M=D.element.scrollLeft,F=C<D.left+20?C-D.left-20:C>D.right-20?C-D.right+20:0,B=Math.max(0,Math.min(D.maxX,M+F));M!==B&&(D.element.scrollLeft=B,C-=B-M,o.left-=B-M)}if(D.maxY){const M=D.element.scrollTop,F=$<D.top+20?$-D.top-20:$>D.bottom-20?$-D.bottom+20:0,B=Math.max(0,Math.min(D.maxY,M+F));M!==B&&(D.element.scrollTop=B,$-=B-M,o.top-=B-M)}}},ne=(o=S)=>{if(i.viewOnly)return;const d=I(),C=n.position?.();n.send(Math.round(d.x),Math.round(d.y),o),i.trace?.record("send",{target:[Math.round(d.x),Math.round(d.y)],buttons:o,before:C,after:n.position?.()})},Me=()=>{T=void 0,we();let o=0;for(;Math.abs(Y)>=Nt&&o++<8;){const d=Y>0?16:8;ne(d),ne(0),Y-=Math.sign(Y)*Nt}},Ce=()=>{V||(T??=requestAnimationFrame(Me))},Pe=()=>{T!==void 0&&(cancelAnimationFrame(T),Me())},W=()=>{T!==void 0&&cancelAnimationFrame(T),T=void 0,Y=0},ke=()=>{clearTimeout(w),Pe(),S&&(S=0,ne())},re=o=>{o.cancelable&&o.preventDefault(),o.stopImmediatePropagation()},Q=()=>{const[o,d]=[...l.values()];return{distance:Math.hypot(o.x-d.x,o.y-d.y),x:(o.x+d.x)/2,y:(o.y+d.y)/2}},U=(o=!1)=>{if(V||k||l.size!==2||f!==2)return;const d=Q();if(h==="pending"){const C=[...l.values()].map((B,oe)=>({x:B.x-p[oe].x,y:B.y-p[oe].y})),$=C.map(B=>Math.hypot(B.x,B.y));if(Math.max(...$)<Oe)return;if(!o&&Math.min(...$)<Oe){_??=setTimeout(()=>{_=void 0,U(!0)},ir);return}clearTimeout(_),_=void 0;const D=Math.abs(d.distance-P),M=C[0].x*C[1].x+C[0].y*C[1].y<0,F=Math.min(...$)>=Oe?M:D>Math.max(Math.abs(d.x-j.x),Math.abs(d.y-j.y));h=i.zoom&&D>=Oe&&F?"pinch":i.mode==="direct"&&i.zoom&&i.zoom.get()>1?"pan":"scroll",b=h==="pinch",x=!0,ee("two-finger-classified")}h==="pinch"&&P>0?(i.zoom?.set(E*d.distance/P,d),i.zoom?.pan(d.x-N.x,d.y-N.y),R=!0):h==="pan"?(i.zoom?.pan(d.x-N.x,d.y-N.y),R=!0):Y+=N.y-d.y,N=d,Ce()},te=o=>{const d=J();a.current={x:Ue((o.clientX-d.clientLeft-d.left)/d.scaleX,d.width),y:Ue((o.clientY-d.clientTop-d.top)/d.scaleY,d.height)}},ue=o=>{if(!(o.pointerType!=="touch"&&o.pointerType!=="pen")){re(o),l.size||(R=!0,clearTimeout(_),_=void 0,g=performance.now(),f=0,x=!1,k=!1,v=!1,b=!1,Y=0,i.mode==="direct"?te(o):n.position&&(a.current={...n.position()},I())),l.set(o.pointerId,{x:o.clientX,y:o.clientY,startX:o.clientX,startY:o.clientY}),f=Math.max(f,l.size),ee("down",o);try{e.setPointerCapture(o.pointerId)}catch{}if(clearTimeout(w),l.size===1&&f===1)w=setTimeout(()=>{!V&&l.size===1&&!x&&!k&&(S=1,ne())},cr);else if(ke(),v=!0,l.size===2&&f===2){const d=Q();P=d.distance,E=i.zoom?.get()??1,j=N=d,h="pending",p=[...l.values()].map(({x:C,y:$})=>({x:C,y:$}))}else k=!0,clearTimeout(_),_=void 0}},de=o=>{if(o.pointerType==="mouse")return;const d=l.get(o.pointerId);if(!d)return;re(o);const C=o.clientX-d.x,$=o.clientY-d.y;if(d.x=o.clientX,d.y=o.clientY,ee("move-input",o),Math.hypot(d.x-d.startX,d.y-d.startY)>Oe&&(x=!0,clearTimeout(w)),l.size===2&&!k)U();else if(l.size===1&&!v&&!k){if(i.mode==="direct"){te(o),x&&(S=1),ne(),Ce();return}const D=I(),M=J();D.x+=C/M.scaleX,D.y+=$/M.scaleY,I(),ne(),Ce()}},Ie=o=>{if(!l.has(o.pointerId))return;re(o),ee(o.type,o),clearTimeout(_),_=void 0;const d=S!==0;o.type!=="pointerup"&&(k=!0,W()),ke(),l.delete(o.pointerId);try{e.hasPointerCapture(o.pointerId)&&e.releasePointerCapture(o.pointerId)}catch{}l.size||(Y=0,!k&&!d&&!x&&f<=2&&performance.now()-g<=ar&&(i.mode!=="direct"||f===1)&&(ne(f===2?4:1),ne(0)),ee("gesture-end",o),i.trace?.flush("gesture-end"))},je=()=>{k=!0,W(),clearTimeout(_),_=void 0,ke();const o=[...l.keys()];l.clear(),Y=0;for(const d of o)try{e.hasPointerCapture(d)&&e.releasePointerCapture(d)}catch{}},X={capture:!0,passive:!1,signal:y.signal};e.addEventListener("pointerdown",ue,X),e.addEventListener("pointermove",de,X),e.addEventListener("pointerup",Ie,X),e.addEventListener("pointercancel",Ie,X),e.addEventListener("lostpointercapture",Ie,X);for(const o of["touchstart","touchmove","touchend","touchcancel","contextmenu"])e.addEventListener(o,re,X);const be=()=>{R=!0,Ce()};e.addEventListener("scroll",be,{capture:!0,signal:y.signal}),window.addEventListener("blur",je,{signal:y.signal});const L=()=>{document.hidden&&je()};document.addEventListener("visibilitychange",L,{signal:y.signal});const q=new ResizeObserver(be);return q.observe(e),q.observe(n.surface()),!a.current&&n.position&&(a.current={...n.position()}),we(),()=>{V||(V=!0,ee("touchpad-detached"),y.abort(),je(),q.disconnect(),c.hidden=!0,u?.(),i.trace?.flush("touchpad-detached"))}}function ur(e,n){e=Math.max(1,e||1280),n=Math.max(1,n||800);const c=Math.max(1,640/e,480/n);return{width:Math.max(640,Math.min(2560,Math.round(e*c))),height:Math.max(480,Math.min(1600,Math.round(n*c)))}}const Je="​",dr={Enter:"enter",Backspace:"backspace",Delete:"delete",Tab:"tab",ArrowUp:"up",ArrowDown:"down",ArrowLeft:"left",ArrowRight:"right"};function pr({sendText:e,sendKey:n,sendChord:c,commandKey:a=[65515,"MetaLeft"],inputRef:i,onFocusChange:y}){const{t:u}=St(),l=s.useRef(null),g=s.useRef(!1),f=s.useRef(null),x=i??l,k=s.useRef({sendText:e,sendKey:n});k.current={sendText:e,sendKey:n};const[v,b]=s.useState(!1),P=()=>{x.current&&(x.current.value=Je,x.current.setSelectionRange(1,1)),b(!1)},E=()=>{const p=(x.current?.value||"").replace(/^\u200b/,"");p&&k.current.sendText(p),P()},h=()=>{f.current!==null&&(cancelAnimationFrame(f.current),f.current=null),E()};return s.useLayoutEffect(()=>{const p=x.current;p.value=Je,p.setSelectionRange(1,1),p.focus({preventScroll:!0});const j=N=>{if(g.current||N.isComposing)return;const _=N.inputType==="deleteContentBackward"?"backspace":N.inputType==="deleteContentForward"?"delete":["insertLineBreak","insertParagraph"].includes(N.inputType)?"enter":null;if(!_)return;N.preventDefault();const Y=_==="enter"&&f.current!==null;h(),Y||k.current.sendKey(_)};return p.addEventListener("beforeinput",j),()=>{if(p.removeEventListener("beforeinput",j),f.current!==null){cancelAnimationFrame(f.current),f.current=null;const N=p.value.replace(/^\u200b/,"");!g.current&&N&&k.current.sendText(N)}}},[]),t.jsxs("div",{className:"relative shrink-0 border-t border-border bg-surface px-3 py-2",children:[!v&&t.jsx("span",{"aria-hidden":"true",className:"pointer-events-none absolute inset-y-2 left-6 flex items-center text-sm text-muted-foreground",children:u("computer.keyboardPlaceholder")}),t.jsx("input",{ref:x,className:"min-h-11 w-full rounded-md border border-border bg-background px-3 text-base outline-none focus:border-primary","aria-label":u("computer.keyboardInput"),autoCapitalize:"none",autoCorrect:"off",autoComplete:"off",spellCheck:!1,inputMode:"text",enterKeyHint:"enter",maxLength:1025,defaultValue:Je,onChange:p=>{if(b(!!p.target.value.replace(/^\u200b/,"")),g.current||p.nativeEvent.isComposing||f.current!==null)return;p.nativeEvent.inputType==="deleteContentBackward"&&!p.target.value?(k.current.sendKey("backspace"),P()):E()},onCompositionStart:()=>{f.current!==null&&h(),g.current=!0},onCompositionEnd:()=>{g.current=!1,f.current!==null&&cancelAnimationFrame(f.current),f.current=requestAnimationFrame(()=>{f.current=null,E()})},onFocus:()=>y?.(!0),onBlur:()=>{!g.current&&f.current!==null&&h(),y?.(!1)},onKeyDown:p=>{if(g.current||p.nativeEvent.isComposing||p.keyCode===229)return;const j=p.ctrlKey||p.altKey||p.metaKey,N=(p.ctrlKey||p.metaKey)&&!p.altKey&&p.key.toLowerCase()==="v";if(c&&!N&&!p.getModifierState("AltGraph")&&(j||p.shiftKey)){const S={Enter:65293,Backspace:65288,Delete:65535,Tab:65289,ArrowUp:65362,ArrowDown:65364,ArrowLeft:65361,ArrowRight:65363,Home:65360,End:65367,PageUp:65365,PageDown:65366}[p.key]??(j&&p.key.length===1?p.key.toLowerCase().codePointAt(0):void 0);if(S!==void 0){p.preventDefault(),h();const T=[];p.ctrlKey&&T.push([65507,"ControlLeft"]),p.altKey&&T.push([65513,"AltLeft"]),p.metaKey&&!T.some(([R])=>R===a[0])&&T.push(a),p.shiftKey&&T.push([65505,"ShiftLeft"]),T.push([S,p.code||p.key]),c(T);return}}const _=dr[p.key];_&&(p.preventDefault(),h(),k.current.sendKey(_))}})]})}function mr(e){let n=[],c=null;const a=new Map,i=()=>{c=null,n.splice(0,32).forEach(y=>{e(y),y[2]?a.set(y[0],y):a.delete(y[0])}),n.length&&(c=requestAnimationFrame(i))};return{send(y){n.push(...y),c===null&&i()},clear(){c!==null&&cancelAnimationFrame(c),c=null,n=[];const y=[...a.values()].reverse();a.clear();for(const[u,l]of y)try{e([u,l,!1])}catch{}}}}const fr=e=>Math.max(1,Math.min(8,Number.isFinite(e)?e:1));function hr(e,n){let c=1;const a="viewportZoom"in e,i=e,y=()=>a?e.pointerTarget.surface():i._canvas,u=()=>a?e.viewportScroller:i._screen,l=a?void 0:i._updateScale;return l&&(i._updateScale=function(){l.call(i),i._display.scale*=c}),{get:()=>c,set(g,f){const x=fr(g),k=y(),v=u(),b=k.getBoundingClientRect(),P=v.getBoundingClientRect(),E=f??{x:P.left+P.width/2,y:P.top+P.height/2},h={x:(E.x-b.left)/(b.width||1),y:(E.y-b.top)/(b.height||1)};c=x,a?e.viewportZoom=c:i._updateScale();const p=k.getBoundingClientRect();v.scrollLeft+=p.left+h.x*p.width-E.x,v.scrollTop+=p.top+h.y*p.height-E.y,c===1&&(v.scrollLeft=0,v.scrollTop=0),n(c)},pan(g,f){const x=u();x.scrollLeft-=g,x.scrollTop-=f},dispose(){l&&(i._updateScale=l)}}}function gr(e,n){const c=e,a=c._keyboard,i=a._target,y=e.focus,u=document.createElement("textarea");u.tabIndex=-1,u.setAttribute("aria-label","Remote desktop keyboard"),u.autocapitalize="off",u.autocomplete="off",u.spellcheck=!1,Object.assign(u.style,{position:"absolute",left:"0",top:"0",width:"1px",height:"1px",fontSize:"16px",opacity:"0",pointerEvents:"none"}),c._screen.append(u);const l=new AbortController;let g=!1,f=null,x=!1;const k=()=>{c._mouseMoveTimer!==null&&clearTimeout(c._mouseMoveTimer),c._mouseMoveTimer=null,c._mouseButtonMask&&(c._mouseButtonMask=0,c._sendMouse(c._mousePos.x,c._mousePos.y,0))};window.addEventListener("blur",k,{signal:l.signal}),document.addEventListener("visibilitychange",()=>{document.hidden&&(a._allKeysUp(),k())},{signal:l.signal});const v=()=>{f!==null&&cancelAnimationFrame(f),f=null;const b=u.value;u.value="",b&&!e.viewOnly&&n(b)};return u.addEventListener("keydown",b=>{(g||b.isComposing||b.keyCode===229)&&b.stopImmediatePropagation()},{capture:!0,signal:l.signal}),u.addEventListener("compositionstart",()=>{f!==null&&v(),g=!0,a._allKeysUp()},{signal:l.signal}),u.addEventListener("compositionend",()=>{g=!1,f!==null&&cancelAnimationFrame(f),f=requestAnimationFrame(v)},{signal:l.signal}),u.addEventListener("input",b=>{!g&&!b.isComposing&&f===null&&v()},{signal:l.signal}),u.addEventListener("blur",()=>{!g&&f!==null&&v(),a._allKeysUp()},{signal:l.signal}),a.ungrab(),a._target=u,e.viewOnly||a.grab(),e.focus=b=>{!x&&!e.viewOnly&&u.focus(b)},document.activeElement===i&&e.focus({preventScroll:!0}),()=>{x||(x=!0,f!==null&&(g?cancelAnimationFrame(f):v()),k(),l.abort(),a.ungrab(),a._target=i,e.viewOnly||a.grab(),e.focus=y,u.remove())}}function*xr(e){for(const n of e.replace(/\r\n?/g,`
3
- `)){const c=n.codePointAt(0);yield n===`
4
- `?65293:n===" "?65289:c<256?c:16777216|c}}const et=1048576;function br(e,n,c){const a=new AbortController;let i=!1,y=-1/0,u=!0;const l=new Set,g=v=>{if(!(v.ctrlKey||v.metaKey)||v.altKey||v.isComposing)return;const b=v.key.toLowerCase();b==="v"?(i=v.shiftKey,l.add(v.code||v.key),v.stopImmediatePropagation()):(b==="c"||b==="x")&&(y=performance.now())},f=v=>{v.preventDefault(),v.stopImmediatePropagation();const b=v.clipboardData;if(!b||!Array.from(b.types).includes("text/plain")){c.failed();return}const P=b.getData("text/plain");if(P.length>et){c.failed();return}try{c.paste(P,i)}catch{c.failed()}i=!1},x=v=>{const b=v.detail?.text;if(typeof b!="string"||b.length>et){c.failed();return}c.receive(b),performance.now()-y<2e3&&(y=-1/0,navigator.clipboard?.writeText?navigator.clipboard.writeText(b).catch(()=>{u&&c.failed()}):c.failed())},k={capture:!0,signal:a.signal};return e.addEventListener("keydown",g,k),e.addEventListener("keyup",v=>{l.delete(v.code||v.key)&&v.stopImmediatePropagation()},k),e.addEventListener("paste",f,k),n.addEventListener("clipboard",x,{signal:a.signal}),n.addEventListener("clipboarderror",c.failed,{signal:a.signal}),window.addEventListener("blur",()=>{l.clear(),i=!1,y=-1/0},{signal:a.signal}),()=>{u=!1,a.abort()}}function yr(){const e=performance.now(),n=e+15*6e4,c=`motion-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;let a=[],i=0,y=0,u=!1,l;const g=f=>{if(clearTimeout(l),l=void 0,!a.length)return;const x=a;a=[];for(let k=0;k<x.length;k+=64)Ft("info","COMPUTER_MOTION_TRACE",{version:2,id:c,sequence:++y,startedAt:performance.timeOrigin+e,reason:f,dropped:k?0:i,samples:x.slice(k,k+64)});i=0};return{record(f,x={}){if(u)return;const k=performance.now()-e;if(performance.now()>=n){g("expired"),u=!0;return}a.length>=8192&&(a.splice(2048,1),i++),a.push([Math.round(k*10)/10,f,x]),clearTimeout(l),l=setTimeout(()=>g("idle"),750)},flush:g,dispose(){u||(u=!0,g("dispose"))}}}const ge="inline-flex min-h-9 items-center justify-center gap-1.5 rounded-md border border-border px-2.5 text-xs hover:bg-surface-2 disabled:opacity-40",xe="min-h-11 w-full rounded-md border border-border bg-background px-2 text-sm outline-none focus:border-primary";function Be(e){return/API_NOT_ALLOWED|AUTHORIZATION|revoked|PAIRING/.test(e)?"computer.permission":e.includes("RDP_BACKEND_UNAVAILABLE")?"computer.rdpBackendUnavailable":e.includes("RDP_CERTIFICATE")?"computer.rdpCertificate":e.includes("CREDENTIALS_MISSING")?"computer.loginExpired":e.includes("CREDENTIALS_FAILED")?"computer.loginSaveFailed":e.includes("AUTH_FAILED")?"computer.authFailed":e.includes("RDP_FAILED")?"computer.rdpFailed":e.includes("SCREEN_SHARING_OFF")?"computer.sharingOff":e.includes("PRIVATE_HOST_ONLY")?"computer.privateOnly":e.includes("INVALID_HOST")?"computer.invalidHost":e.includes("TIMEOUT")?"computer.timeout":e.includes("UNREACHABLE")?"computer.unreachable":e.includes("DISCONNECTED")?"computer.disconnected":"computer.failed"}function vr(){const{t:e}=St(),n=s.useMemo(()=>yr(),[]);s.useEffect(()=>(n.record("panel-open",{viewport:[window.innerWidth,window.innerHeight],dpr:window.devicePixelRatio}),n.flush("panel-open"),()=>n.flush("panel-unmounted")),[n]);const[c,a]=s.useState(()=>$e()?.targetPeerId??""),[i,y]=s.useState(null),{preferences:u,change:l,loaded:g,saveState:f,flush:x,retry:k,credentialKeys:v,loginState:b,credentialRequest:P}=Jt(c),E=u.target==="local",h=u[u.target],{host:p,platform:j,protocol:N,port:_,domain:Y,ignoreCert:S,username:T}=h,R=N==="rdp"&&i?.rdpAvailable===!1,{viewOnly:w,fit:V}=u,I=h.rememberLogin&&v.includes(Tt(h)),K=r=>l(m=>({...m,[m.target]:{...m[m.target],...r}})),J=r=>K({username:r}),ee=r=>K({domain:r}),we=r=>{K({ignoreCert:r}),x()},ne=r=>K({port:r}),Me=r=>{r&&(ye.current(),ze.clear(),q(null)),l(m=>({...m,viewOnly:r})),x()},[Ce,Pe]=s.useState(!1),W=tr(j),ke=j==="mac"?"⌘V":"Ctrl+V",[re,Q]=s.useState(""),[U,te]=s.useState("idle"),[ue,de]=s.useState(null),[Ie,je]=s.useState(""),[X,be]=s.useState(!1),[L,q]=s.useState(null),o=s.useRef(null),[d,C]=s.useState(!1),[$,D]=s.useState(!1),M=s.useRef(0),[F,B]=s.useState(()=>navigator.maxTouchPoints>0||window.innerWidth<=640);s.useEffect(()=>{const r=()=>B(navigator.maxTouchPoints>0||window.innerWidth<=640);return window.addEventListener("resize",r),()=>window.removeEventListener("resize",r)},[]);const oe=L==="keyboard"&&d&&(!F||!window.visualViewport||$),[se,tt]=s.useState(1),ae=s.useRef(null),rt=s.useRef(null),[Ee,nt]=s.useState(""),[At,Ne]=s.useState(!1),[He,ot]=s.useState(null),[_t,ce]=s.useState(!1),[Rt,Ye]=s.useState(!1),[Mt,Pt]=s.useState(!1),[pe,It]=s.useState(or),st=s.useRef(null),at=s.useRef(null),ye=s.useRef(()=>{}),De=s.useRef(()=>{}),[ct,Dt]=s.useState(We),Ae=s.useRef(!1),ve=s.useRef(""),it=s.useRef(()=>{}),lt=s.useRef(null),Fe=s.useRef(null),me=s.useMemo(()=>{const r=document.createElement("div");return r.className="h-full w-full min-h-0 overflow-hidden",r},[]),O=s.useRef(null),ut=s.useRef(!1);ut.current=U==="connected"&&!w;const ze=s.useMemo(()=>mr(([r,m,z])=>O.current?.sendKey(r,m,z)),[]),Xe=s.useRef(null),fe=s.useRef(0),qe=s.useRef(void 0),ie=s.useCallback(()=>{ye.current(),De.current(),ae.current?.dispose(),ae.current=null,ze.clear(),at.current=null,fe.current++,clearTimeout(qe.current);const r=O.current;O.current=null,r?.disconnect(),Xe.current?.close(),Xe.current=null,me.replaceChildren()},[me,ze]);s.useLayoutEffect(()=>(Fe.current?.appendChild(me),()=>{me.remove()}),[me,X]),s.useEffect(()=>()=>ie(),[ie]),s.useEffect(()=>{const r=()=>{const m=We();Dt(m),!m&&(Ae.current=!1,ve.current="",ie(),te("idle"),Q(""),be(!1),q(null))};return window.addEventListener(yt,r),()=>window.removeEventListener(yt,r)},[ie]),s.useEffect(()=>{const r=()=>a($e()?.targetPeerId??"");return window.addEventListener(vt,r),()=>window.removeEventListener(vt,r)},[]),s.useEffect(()=>{ie(),Ae.current=!1,ve.current="",te("idle"),de(null),Q(""),y(null),be(!1),q(null),Pe(!1),je(""),nt(""),Ne(!1);const r=new AbortController;return fetch("/api/computer/status",{signal:r.signal}).then(async m=>{if(!m.ok)throw new Error(m.status===403?"API_NOT_ALLOWED":"COMPUTER_FAILED");return await m.json()}).then(m=>{r.signal.aborted||y(m)}).catch(m=>{r.signal.aborted||de(Be(String(m)))}),()=>{r.abort(),ie()}},[c,ie]),s.useEffect(()=>{w&&De.current(),O.current&&(O.current.viewOnly=w)},[w]),s.useEffect(()=>{O.current&&(O.current.scaleViewport=V)},[V]),s.useEffect(()=>{O.current&&"pauseResize"in O.current&&(O.current.pauseResize=!!L)},[L]),s.useEffect(()=>{const r=O.current;r&&("keyboardActive"in r?r.keyboardActive=L==="keyboard":r.focusOnClick=L!=="keyboard")},[L]);const dt=r=>{r===E||Z||!g||(Q(""),de(null),l(m=>({...m,target:r?"local":"remote"})),x())},pt=()=>{Ae.current=!0,ve.current="",ie(),te("idle"),Q(""),be(!1),q(null),Ne(!1)},mt=async r=>{if(r?.preventDefault(),R)return;if(Ae.current=!0,U==="credentials"&&O.current&&"sendCredentials"in O.current){ve.current=re,O.current.sendCredentials({username:T,password:re}),te("connecting");return}if(!We()||!g||!re&&!I)return;x(),ot(null),ce(!1),Ye(!1),ie(),de(null),je(""),te("connecting"),Ne(!1);const m=fe.current,z=H=>{m===fe.current&&(ie(),te("error"),de(H),q(null),ve.current="",(H==="computer.authFailed"||H==="computer.permission"||H==="computer.loginExpired")&&Q(""),I&&(H==="computer.authFailed"||H==="computer.loginExpired")&&P("forget",h).catch(()=>{}))};qe.current=setTimeout(()=>z("computer.timeout"),6e4);try{let H=re||await P("use",h);if(m!==fe.current)return;ve.current=H||"";let G;if(N==="rdp"){const{RdpSession:le}=await wt(async()=>{const{RdpSession:Le}=await import("./rdpSession-_Wi6QGVy.js");return{RdpSession:Le}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12]));if(m!==fe.current)return;document.activeElement?.blur?.(),Ze.flushSync(()=>{te("connecting")});const Se=Fe.current?.getBoundingClientRect(),Te=ur(Se?.width||1280,Se?.height||800);G=new le(me,{host:p.trim(),port:Number(_),username:T.trim(),password:H||"",domain:Y.trim(),ignoreCert:S,...Te},Le=>z(Be(Le)),n)}else{const{default:le}=await wt(async()=>{const{default:Le}=await import("./rfb-CxsXsMUX.js");return{default:Le}},[]);if(m!==fe.current)return;const Se=new Qt(p.trim(),Le=>z(Be(Le)));Xe.current=Se;const Te=new le(me,Se,{shared:!0,credentials:{username:T.trim()||void 0,password:H}});Te.background="var(--chrome-bg)",Te.resizeSession=!1,Te.qualityLevel=6,Te.compressionLevel=2,G=Te}H=void 0,O.current=G,G.scaleViewport=V,G.viewOnly=w,G.addEventListener("connect",()=>{if(m!==fe.current)return;clearTimeout(qe.current),te("connected"),Q(""),window.innerWidth<=640&&document.activeElement?.blur?.();const le=ve.current;ve.current="",h.rememberLogin&&le&&P("save",h,le).catch(()=>{})}),G.addEventListener("credentialsrequired",le=>{if(m!==fe.current)return;const Se=le.detail.types;Pt(Se.includes("username")),te("credentials")}),G.addEventListener("securityfailure",()=>z("computer.authFailed")),G.addEventListener("disconnect",()=>z("computer.disconnected")),G.addEventListener("desktopname",le=>{m===fe.current&&je(le.detail.name)})}catch(H){z(Be(String(H)))}},he=r=>{const m=O.current;!m||U!=="connected"||w||(L==="keyboard"?o.current?.focus({preventScroll:!0}):L!=="clipboard"&&!F&&m.focus?.({preventScroll:!0}),ze.send([...r.map(([z,H])=>[z,H,!0]),...[...r].reverse().map(([z,H])=>[z,H,!1])]))},A=U==="connected",Z=U==="connecting"||U==="credentials",Ke=A||U==="connecting";s.useEffect(()=>{const r=O.current;if(!A||!r||!("viewportZoom"in r)&&!("_display"in r))return;const m=hr(r,tt);return ae.current=m,tt(1),()=>{m.dispose(),ae.current===m&&(ae.current=null)}},[A]),s.useEffect(()=>{const r=O.current,m=Fe.current,z=st.current;if(!A||L&&L!=="keyboard"||pe!=="trackpad"&&!(navigator.maxTouchPoints>0)||!r||!m||!z)return;const H="pointerTarget"in r?r.pointerTarget:rr(r),G=lr(m,H,z,at,{mode:pe,zoom:ae.current??void 0,viewOnly:w,trace:n});return ye.current=G,()=>{G(),ye.current===G&&(ye.current=()=>{})}},[A,w,pe,X,L,n]),s.useEffect(()=>{const r=O.current;if(!(!A||w||!r))return br(me,r,{paste:(m,z)=>{r.clipboardPasteFrom(m),he(z?[...W.paste.slice(0,1),[65505,"ShiftLeft"],...W.paste.slice(1)]:W.paste),Ne(!0),ce(!1)},receive:m=>{ot(m),Ye(!1)},failed:()=>{ce(!0),q("clipboard")}})},[A,w,j,me]),s.useEffect(()=>{const r=O.current;if(!A||w||!r||"pointerTarget"in r||!("_keyboard"in r))return;const m=gr(r,gt);return De.current=m,()=>{m(),De.current===m&&(De.current=()=>{})}},[A,w]);const ft=r=>{r!==pe&&(ye.current(),It(r),sr(r))};it.current=()=>{mt()},s.useEffect(()=>{ct&&g&&i&&!R&&u.autoConnect&&I&&U==="idle"&&!Ae.current&&it.current()},[ct,g,i,R,u.autoConnect,I,U]);const ht=()=>{Ae.current=!0,P("forget",h).catch(()=>{})},_e=r=>{if(r==="keyboard"){if(L==="keyboard"&&!oe){o.current?.blur(),o.current?.focus({preventScroll:!0});return}ye.current(),M.current=window.visualViewport?.height??window.innerHeight,Ze.flushSync(()=>{C(!1),D(!1),q(m=>m===r?null:r)})}else ye.current(),q(m=>m===r?null:r)},zt=()=>{ae.current?.set(1),l(r=>({...r,fit:!0})),x()},gt=r=>{if(!O.current||!ut.current)return;const m=[];for(const z of xr(r))m.push([z,null,!0],[z,null,!1]);ze.send(m)};s.useEffect(()=>{if(!A||L!=="keyboard"&&L!=="clipboard"||!window.visualViewport)return;const r=window.visualViewport,m=rt.current,z=()=>{L==="keyboard"&&D(d&&M.current-r.height>100),X&&m&&r.height>=160&&(m.style.height=`${r.height}px`,m.style.top=`${r.offsetTop}px`)};return z(),r.addEventListener("resize",z),r.addEventListener("scroll",z),()=>{r.removeEventListener("resize",z),r.removeEventListener("scroll",z),m&&(m.style.height="",m.style.top="")}},[A,L,X,d]);const xt=t.jsxs("div",{className:"flex shrink-0 items-center text-xs",role:"group","aria-label":e("computer.desktopZoom"),title:F?e("computer.pinchHint"):void 0,children:[t.jsx("button",{type:"button",className:"flex min-h-11 min-w-11 items-center justify-center","aria-label":e("computer.zoomOut"),disabled:!A||se<=1,onPointerDown:r=>r.preventDefault(),onClick:()=>ae.current?.set(se/1.25),children:t.jsx(Gt,{size:16})}),t.jsxs("button",{type:"button",className:"min-h-11 min-w-11","aria-label":e("computer.resetZoom"),disabled:!A,onPointerDown:r=>r.preventDefault(),onClick:zt,children:[Math.round(se*100),"%"]}),t.jsx("button",{type:"button",className:"flex min-h-11 min-w-11 items-center justify-center","aria-label":e("computer.zoomIn"),disabled:!A||se>=8,onPointerDown:r=>r.preventDefault(),onClick:()=>ae.current?.set(se*1.25),children:t.jsx(Wt,{size:16})}),F&&t.jsx("span",{className:"hidden pr-2 text-[10px] text-muted-foreground sm:inline",children:e("computer.pinchHint")})]}),Re=`flex shrink-0 items-center justify-center rounded-md hover:bg-surface-2 focus-visible:outline focus-visible:outline-2 focus-visible:outline-primary ${F?"min-h-11 min-w-11":"h-8 min-w-8"}`,bt=t.jsxs("div",{ref:rt,className:`flex min-h-0 flex-col bg-surface text-foreground ${X?"fixed inset-0 z-modal-panel h-dvh pb-[env(safe-area-inset-bottom)] pt-[env(safe-area-inset-top)]":"relative h-full"}`,role:X?"dialog":void 0,"aria-modal":X||void 0,"aria-label":e("computer.title"),onKeyDown:r=>{r.stopPropagation(),r.key==="Escape"&&!r.nativeEvent.isComposing&&L&&(r.preventDefault(),q(null))},onKeyUp:r=>r.stopPropagation(),children:[t.jsxs("div",{className:`relative z-30 flex shrink-0 items-center gap-2 border-b border-border bg-surface px-2 ${F?"min-h-12":"min-h-8"}`,children:[X&&t.jsx("button",{type:"button",className:Re,onClick:()=>{be(!1),q(null)},"aria-label":e("computer.exitFullscreen"),children:t.jsx(Ut,{size:20})}),t.jsx(Kt,{size:16,className:"shrink-0 text-muted-foreground"}),t.jsx("span",{className:"min-w-0 flex-1 truncate text-xs font-medium",children:A&&(Ie||(E?i?.hostname||$e()?.serviceName:p))||e("computer.title")}),A&&t.jsx("span",{className:"text-[11px] text-primary",children:e("computer.connected")}),A&&b==="error"&&t.jsx("span",{role:"alert",className:"text-[11px] text-destructive",children:e("computer.loginSaveFailed")}),A&&f==="saving"&&t.jsx("span",{role:"status","aria-label":e("computer.settingsSaving"),title:e("computer.settingsSaving"),children:t.jsx(Ct,{size:12,className:"animate-spin text-muted-foreground"})}),A&&f==="error"&&t.jsxs("button",{type:"button",className:ge,title:e("computer.settingsSaveFailed"),"aria-label":e("computer.settingsSaveFailed"),onClick:k,children:["! ",e("computer.retry")]}),Z&&t.jsxs("button",{type:"button",className:`${Re} gap-1 px-1 text-xs`,onClick:pt,children:[t.jsx(kt,{size:14}),e("computer.cancel")]}),A&&!F&&L==="keyboard"&&t.jsx("button",{type:"button",className:Re,onClick:()=>_e("keyboard"),"aria-label":e("computer.keyboard"),"aria-pressed":oe,children:t.jsx(Ge,{size:18})}),A&&!F&&t.jsx("button",{type:"button",className:`${Re} ${L==="clipboard"?"bg-surface-2 text-primary":""}`,disabled:w,onClick:()=>_e("clipboard"),"aria-label":e("computer.clipboardTool"),title:e("computer.clipboardTool"),"aria-pressed":L==="clipboard",children:t.jsx(jt,{size:18})}),A&&!X&&t.jsxs("button",{type:"button",className:`${Re} gap-1 px-1 text-xs`,onClick:()=>be(!0),"aria-label":e("computer.fullscreen"),children:[t.jsx(Bt,{size:16}),e("computer.expand")]}),A&&t.jsx("button",{type:"button",className:Re,onClick:()=>_e("tools"),"aria-label":e("computer.tools"),"aria-expanded":L==="tools",children:t.jsx(Xt,{size:18})})]}),!Ke&&t.jsx("div",{className:"min-h-0 flex-1 overflow-y-auto p-4 sm:p-6",children:t.jsxs("div",{className:"mx-auto w-full max-w-md",children:[t.jsxs("form",{className:"space-y-3",onSubmit:r=>{mt(r)},children:[t.jsxs("div",{className:"grid grid-cols-2 gap-1 rounded-lg bg-background p-1",role:"group","aria-label":e("computer.target"),children:[t.jsx("button",{type:"button",className:`min-h-11 rounded-md px-3 text-sm font-medium ${E?"bg-surface-2 text-foreground":"text-muted-foreground hover:bg-surface"}`,"aria-pressed":E,disabled:Z||!i||!g,onClick:()=>dt(!0),children:e("computer.thisComputer")}),t.jsx("button",{type:"button",className:`min-h-11 rounded-md px-3 text-sm font-medium ${E?"text-muted-foreground hover:bg-surface":"bg-surface-2 text-foreground"}`,"aria-pressed":!E,disabled:Z||!g,onClick:()=>dt(!1),children:e("computer.otherComputer")})]}),E?t.jsx("p",{className:"text-xs leading-relaxed text-muted-foreground",role:"status",children:i?e("computer.localService",{name:$e()?.serviceName||i.hostname}):e("computer.loading")}):t.jsxs("label",{className:"block space-y-1 text-xs",children:[t.jsx("span",{children:e("computer.host")}),t.jsx("input",{className:xe,value:p,disabled:Z||!g,onChange:r=>{K({host:r.target.value,domain:"",ignoreCert:!1}),Q(""),de(null)},placeholder:e("computer.hostPlaceholder"),onBlur:()=>{x()},autoCapitalize:"none",autoCorrect:"off",spellCheck:!1,required:!0,maxLength:253})]}),t.jsxs("p",{className:"text-xs text-muted-foreground",children:[j==="mac"?"macOS":j==="linux"?"Ubuntu / Linux":"Windows"," · ",N.toUpperCase()," · ",N==="rdp"?_||"3389":"5900",w?` · ${e("computer.viewOnly")}`:""]}),t.jsxs("label",{className:"block space-y-1 text-xs",children:[t.jsx("span",{children:e(N==="rdp"?"computer.rdpUsername":"computer.username")}),t.jsx("input",{className:xe,value:T,disabled:!g,onChange:r=>J(r.target.value),onBlur:()=>{x()},autoCapitalize:"none",autoCorrect:"off",autoComplete:"off",required:N==="rdp"||U==="credentials"&&Mt,maxLength:255})]}),t.jsxs("label",{className:"block space-y-1 text-xs",children:[t.jsx("span",{children:e("computer.password")}),t.jsx("input",{className:xe,type:"password",value:re,disabled:!g,onChange:r=>Q(r.target.value),placeholder:I&&U!=="credentials"?e("computer.savedPassword"):void 0,autoComplete:"new-password",required:!I||U==="credentials",maxLength:1024})]}),t.jsx("p",{className:"text-[11px] leading-relaxed text-muted-foreground",children:e(N==="rdp"?"computer.rdpLoginHint":"computer.vncLoginHint")}),t.jsxs("div",{className:"flex min-h-11 items-center justify-between gap-2 text-xs",children:[t.jsxs("label",{className:"flex min-h-11 items-center gap-2",children:[t.jsx("input",{type:"checkbox",checked:h.rememberLogin,disabled:Z||!g||b==="saving",onChange:r=>{const m=r.target.checked;K({rememberLogin:m}),!m&&I?P("forget",{...h,rememberLogin:m}).catch(()=>{}):x()}}),e("computer.rememberLogin")]}),I&&t.jsx("button",{type:"button",className:"min-h-11 text-muted-foreground underline",disabled:Z||b==="saving",onClick:ht,children:e("computer.forgetLogin")})]}),b==="error"&&!ue&&t.jsx("p",{role:"alert",className:"text-xs text-destructive",children:e("computer.loginSaveFailed")}),R&&t.jsxs("div",{role:"status",className:"space-y-1 text-xs leading-relaxed text-muted-foreground",children:[t.jsx("p",{children:e("computer.rdpBackendUnavailable")}),t.jsx("p",{children:e("computer.rdpBackendRecovery")})]}),U==="credentials"&&t.jsx("p",{className:"text-xs text-primary",children:e("computer.credentials")}),ue&&t.jsxs("div",{role:"alert",className:"rounded-md bg-surface-2 p-3 text-xs leading-relaxed text-destructive",children:[e(ue),ue==="computer.rdpCertificate"&&t.jsxs("label",{className:"mt-1 flex min-h-11 items-center gap-2 text-foreground",children:[t.jsx("input",{type:"checkbox",checked:S,onChange:r=>we(r.target.checked)}),e("computer.trustCertificateHere")]}),U==="error"&&ue!=="computer.rdpCertificate"&&t.jsx("button",{type:"button",className:"mt-1 block min-h-9 text-foreground underline",onClick:()=>{Pe(!0),requestAnimationFrame(()=>lt.current?.scrollIntoView?.({block:"nearest",behavior:"smooth"}))},children:e("computer.checkSettings")})]}),t.jsx("button",{type:"submit",className:"inline-flex min-h-11 w-full items-center justify-center gap-2 rounded-md bg-primary px-3 text-sm font-medium text-primary-foreground disabled:opacity-40",disabled:!g||R||b==="saving"||E&&!i||!p.trim()||!re&&(!I||U==="credentials")||N==="rdp"&&(!T.trim()||!Number.isInteger(Number(_))||Number(_)<1||Number(_)>65535),children:e(U==="credentials"?"computer.authenticate":U==="error"?"computer.retryConnect":"computer.connect")}),t.jsxs("details",{ref:lt,className:"border-b border-border text-xs",open:Ce,onToggle:r=>Pe(r.currentTarget.open),children:[t.jsxs("summary",{className:"flex min-h-11 cursor-pointer list-none items-center justify-between text-muted-foreground",children:[t.jsx("span",{children:e("computer.advanced")}),t.jsx("span",{"aria-hidden":"true",children:Ce?"−":"+"})]}),t.jsxs("div",{className:"space-y-3 pb-4",children:[t.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[t.jsxs("label",{className:"block space-y-1",children:[t.jsx("span",{children:e("computer.platform")}),t.jsxs("select",{className:xe,value:j,disabled:Z||!g,onChange:r=>{er(r.target.value)&&K({platform:r.target.value,protocol:r.target.value==="mac"?"vnc":"rdp",ignoreCert:!1}),Q(""),x()},children:[t.jsx("option",{value:"mac",children:"macOS"}),t.jsx("option",{value:"linux",children:"Ubuntu / Linux"}),t.jsx("option",{value:"windows",children:"Windows"})]})]}),t.jsxs("label",{className:"block space-y-1",children:[t.jsx("span",{children:e("computer.protocol")}),t.jsxs("select",{className:xe,value:N,disabled:Z||!g,onChange:r=>{K({protocol:r.target.value==="rdp"?"rdp":"vnc"}),Q(""),de(null),x()},children:[t.jsx("option",{value:"rdp",children:"RDP"}),t.jsx("option",{value:"vnc",children:"VNC"})]})]})]}),N==="rdp"&&t.jsxs(t.Fragment,{children:[t.jsxs("label",{className:"block space-y-1",children:[t.jsx("span",{children:e("computer.port")}),t.jsx("input",{className:xe,type:"number",min:1,max:65535,step:1,value:_,disabled:Z||!g,onBlur:()=>{x()},onChange:r=>ne(r.target.value)})]}),t.jsxs("label",{className:"block space-y-1",children:[t.jsx("span",{children:e("computer.domain")}),t.jsx("input",{className:xe,value:Y,disabled:Z||!g,onBlur:()=>{x()},onChange:r=>ee(r.target.value),autoComplete:"off",maxLength:255})]}),t.jsxs("label",{className:"flex min-h-11 items-center gap-2",children:[t.jsx("input",{type:"checkbox",checked:S,disabled:Z||!g,onChange:r=>we(r.target.checked)}),e("computer.trustCertificate")]})]}),t.jsxs("label",{className:"flex min-h-11 items-center gap-2",children:[t.jsx("input",{type:"checkbox",checked:w,disabled:Z||!g,onChange:r=>Me(r.target.checked)}),e("computer.viewOnly")]}),t.jsxs("label",{className:"flex min-h-11 items-center gap-2",children:[t.jsx("input",{type:"checkbox",checked:u.autoConnect,disabled:Z||!g,onChange:r=>{l(m=>({...m,autoConnect:r.target.checked})),x()}}),e("computer.autoConnect")]})]})]})]}),t.jsxs("p",{role:"status",className:"mt-2 text-[11px] leading-relaxed text-muted-foreground",children:[e(f==="saved"?"computer.settingsSaved":f==="error"?g?"computer.settingsSaveFailed":"computer.settingsLoadFailed":f==="loading"?"computer.settingsLoading":"computer.settingsSaving"),f==="error"&&t.jsx("button",{type:"button",className:"ml-2 min-h-9 text-primary underline",onClick:k,children:e("computer.retry")})]}),t.jsxs("details",{className:"text-xs",children:[t.jsx("summary",{className:"flex min-h-11 cursor-pointer items-center text-muted-foreground",children:e("computer.setup")}),t.jsxs("ol",{className:"ml-4 list-decimal space-y-2 pt-2 leading-relaxed text-muted-foreground",children:[t.jsx("li",{children:e(N==="rdp"?j==="linux"?"computer.rdpLinuxStep1":"computer.rdpStep1":j==="mac"?"computer.step1":j==="linux"?"computer.linuxStep1":"computer.windowsStep1")}),t.jsx("li",{children:e(N==="rdp"?"computer.rdpStep2":j==="mac"?"computer.step2":j==="linux"?"computer.linuxStep2":"computer.windowsStep2")}),t.jsx("li",{children:e("computer.step3")})]}),N==="vnc"&&j==="linux"&&t.jsxs(t.Fragment,{children:[t.jsx("p",{className:"mt-3 leading-relaxed text-muted-foreground",children:e("computer.linuxCommandHint")}),t.jsx("pre",{className:"mt-2 overflow-x-auto rounded-md bg-background p-2 text-[11px]",children:t.jsx("code",{children:`sudo apt install x11vnc
5
- x11vnc -storepasswd
6
- x11vnc -display "$DISPLAY" -auth guess -localhost -usepw -forever -shared -rfbport 5900`})}),t.jsx("p",{className:"mt-2 leading-relaxed text-muted-foreground",children:e("computer.linuxProtocolHint")})]}),t.jsx("p",{className:"mt-3 leading-relaxed text-muted-foreground",children:e(N==="rdp"?"computer.rdpNetworkHint":"computer.networkHint")})]})]})}),A&&L==="tools"&&t.jsx("button",{type:"button",className:`absolute inset-x-0 ${F?"bottom-14 top-12":"bottom-0 top-8"} z-20 bg-background/40`,"aria-label":e("computer.returnToDesktop"),onClick:()=>q(null)}),A&&t.jsxs("div",{hidden:L!=="tools",className:`${L==="tools"?"flex":"hidden"} absolute inset-x-3 ${F?"top-14":"top-10"} z-30 max-h-[calc(100%-7rem)] flex-wrap items-center gap-3 overflow-y-auto rounded-lg border border-border bg-surface px-4 py-3 text-xs shadow-lg [&_button]:min-h-11 [&_select]:min-h-11 [&_label]:min-h-11`,role:"region","aria-label":e("computer.tools"),children:[t.jsxs("div",{className:"flex w-full items-center justify-between",children:[t.jsx("span",{className:"font-medium",children:e("computer.tools")}),t.jsx("button",{type:"button",className:"flex min-w-11 items-center justify-center","aria-label":e("computer.closeTools"),onClick:()=>q(null),children:t.jsx($t,{size:18})})]}),F&&t.jsx("div",{className:"flex w-full items-center gap-2",children:t.jsx("div",{className:"inline-flex rounded-md bg-background p-0.5",role:"group","aria-label":e("computer.touchMode"),children:["trackpad","direct"].map(r=>t.jsx("button",{type:"button",className:`min-h-9 rounded px-3 text-xs ${pe===r?"bg-surface-2 text-foreground":"text-muted-foreground hover:bg-surface"}`,"aria-pressed":pe===r,onClick:()=>ft(r),children:e(r==="trackpad"?"computer.trackpadMode":"computer.directTouchMode")},r))})}),!F&&t.jsxs(t.Fragment,{children:[xt,t.jsxs("button",{type:"button",className:ge,disabled:w,onClick:()=>_e("keyboard"),children:[t.jsx(Ge,{size:14}),e("computer.keyboard")]})]}),t.jsxs("label",{className:"flex min-h-9 items-center gap-1.5",children:[t.jsx("input",{type:"checkbox",checked:w,onChange:r=>Me(r.target.checked)}),e("computer.viewOnly")]}),t.jsx("button",{type:"button",className:ge,onClick:()=>{ae.current?.set(1),l(r=>({...r,fit:!r.fit})),x()},children:e(V?"computer.actualSize":"computer.fit")}),t.jsxs("select",{className:`${ge} min-w-0 bg-surface`,"aria-label":e("computer.shortcuts"),value:"",disabled:w,onChange:r=>{he(W[r.target.value]??[])},children:[t.jsx("option",{value:"",disabled:!0,children:e("computer.shortcuts")}),t.jsxs("option",{value:"tab",children:[j==="mac"?"⌘ Tab":"Alt+Tab"," · ",e("computer.switchApps")]}),t.jsxs("option",{value:"search",children:[j==="mac"?"⌘ Space":"Super / Win"," · ",e(j==="mac"?"computer.spotlight":"computer.systemSearch")]}),t.jsx("option",{value:"copy",children:j==="mac"?"⌘C":"Ctrl+C"}),t.jsx("option",{value:"paste",children:ke}),t.jsx("option",{value:"escape",children:"Esc"}),t.jsx("option",{value:"enter",children:"Enter"}),t.jsx("option",{value:"backspace",children:"⌫"}),t.jsx("option",{value:"up",children:"↑"}),t.jsx("option",{value:"down",children:"↓"}),t.jsx("option",{value:"left",children:"←"}),t.jsx("option",{value:"right",children:"→"})]}),t.jsxs("div",{className:"flex w-full items-center justify-between border-t border-border pt-2",children:[I&&t.jsx("button",{type:"button",className:ge,disabled:b==="saving",onClick:ht,children:e("computer.forgetLogin")}),t.jsxs("button",{type:"button",className:`${ge} ml-auto text-destructive`,onClick:pt,children:[t.jsx(kt,{size:14}),e("computer.disconnect")]})]})]}),t.jsxs("div",{ref:Fe,"data-sidebar-gesture-ignore":"",className:`relative z-10 min-h-0 flex-1 overflow-hidden bg-[var(--chrome-bg)] ${Ke?"":"hidden"}`,onMouseDownCapture:r=>{L==="keyboard"&&r.preventDefault()},style:{touchAction:A?"none":void 0},"aria-label":e("computer.remoteTitle"),children:[!A&&Ke&&t.jsxs("div",{role:"status",className:"absolute inset-0 z-20 flex items-center justify-center gap-2 bg-surface text-xs text-muted-foreground",children:[t.jsx(Ct,{size:16,className:"animate-spin"}),e("computer.connecting")]}),A&&t.jsx("div",{ref:st,hidden:!0,"aria-hidden":"true",className:"pointer-events-none absolute left-0 top-0 z-20 h-5 w-5 will-change-transform"})]}),t.jsx("div",{hidden:L!=="tools",children:A&&F&&!w&&t.jsx("p",{className:"shrink-0 border-t border-border px-2 py-1 text-[10px] leading-relaxed text-muted-foreground",children:e(pe==="trackpad"?"computer.trackpadHint":"computer.directTouchHint")})}),A&&L==="keyboard"&&!w&&t.jsxs(t.Fragment,{children:[t.jsx(pr,{sendChord:he,commandKey:W.copy[0],inputRef:o,onFocusChange:C,sendText:gt,sendKey:r=>he(r==="tab"?[[65289,"Tab"]]:r==="delete"?[[65535,"Delete"]]:W[r])}),t.jsx("div",{className:"grid shrink-0 grid-cols-6 gap-1 bg-surface px-1",role:"group","aria-label":e("computer.keyboardNavigation"),children:["escape","left","down","up","right","selectAll"].map(r=>t.jsx("button",{type:"button",className:"min-h-11 rounded-md text-sm hover:bg-surface-2","aria-label":e(`computer.key${r[0].toUpperCase()}${r.slice(1)}`),onPointerDown:m=>m.preventDefault(),onClick:()=>he(r==="selectAll"?[...W.copy.slice(0,1),[97,"KeyA"]]:W[r]),children:{escape:"Esc",left:"←",down:"↓",up:"↑",right:"→",selectAll:j==="mac"?"⌘A":"Ctrl+A"}[r]},r))})]}),A&&L==="clipboard"&&!w&&t.jsxs("form",{className:"shrink-0 space-y-2 border-t border-border p-3",onSubmit:r=>{if(r.preventDefault(),!(!Ee||!O.current))try{O.current.clipboardPasteFrom(Ee),Ne(!0),ce(!1)}catch{ce(!0)}},children:[t.jsx("textarea",{className:`${xe} min-w-0 resize-none py-2 text-base`,rows:2,"aria-label":e("computer.clipboard"),placeholder:e("computer.clipboardPlaceholder"),value:Ee,onChange:r=>{nt(r.target.value),Ne(!1)},maxLength:et}),t.jsxs("div",{className:"flex gap-2",children:[t.jsx("button",{type:"submit",className:`${ge} min-h-11 flex-1`,disabled:!Ee,children:e("computer.clipboard")}),t.jsx("button",{type:"button",className:`${ge} min-h-11`,onClick:()=>{try{Ee&&O.current?.clipboardPasteFrom(Ee),he(W.paste),ce(!1),Ne(!!Ee)}catch{ce(!0)}},children:ke})]}),t.jsx("p",{role:"status",className:"text-[10px] leading-relaxed text-muted-foreground",children:At?e("computer.clipboardSent"):e("computer.clipboardHint",{shortcut:ke})}),He!==null&&t.jsxs("div",{className:"space-y-1",children:[t.jsx("textarea",{className:`${xe} resize-none py-2 text-base`,rows:2,readOnly:!0,value:He,"aria-label":e("computer.remoteClipboard"),onFocus:r=>r.currentTarget.select()}),t.jsx("button",{type:"button",className:ge,onClick:()=>{if(!navigator.clipboard?.writeText){ce(!0);return}navigator.clipboard.writeText(He).then(()=>{Ye(!0),ce(!1)},()=>ce(!0))},children:e(Rt?"computer.clipboardCopied":"computer.copyToDevice")})]}),_t&&t.jsx("p",{role:"alert",className:"text-xs text-destructive",children:e("computer.clipboardAccessFailed")}),ue&&t.jsx("p",{role:"alert",className:"text-xs text-destructive",children:e(ue)})]}),Ke&&F&&t.jsxs("div",{className:"relative z-30 flex shrink-0 items-center border-t border-border bg-surface px-1 py-1 text-[11px]",children:[t.jsxs("div",{className:`grid min-w-0 flex-1 ${L==="keyboard"?"grid-cols-5":"grid-cols-3"}`,children:[t.jsxs("button",{type:"button",className:`flex min-h-11 flex-col items-center justify-center gap-0.5 rounded-md ${oe?"bg-surface-2 text-primary":""}`,disabled:!A||w,onClick:()=>_e("keyboard"),"aria-pressed":oe,children:[t.jsx(Ge,{size:18}),e("computer.keyboard")]}),t.jsxs("button",{type:"button",className:`flex min-h-11 flex-col items-center justify-center gap-0.5 rounded-md ${L==="clipboard"?"bg-surface-2 text-primary":""}`,disabled:!A||w,onClick:()=>_e("clipboard"),"aria-pressed":L==="clipboard",children:[t.jsx(jt,{size:18}),e("computer.clipboardTool")]}),L==="keyboard"?t.jsxs(t.Fragment,{children:[t.jsx("button",{type:"button",className:"min-h-11 rounded-md text-sm",onPointerDown:r=>r.preventDefault(),onClick:()=>he([[65289,"Tab"]]),children:"Tab"}),t.jsx("button",{type:"button",className:"min-h-11 rounded-md text-lg",onPointerDown:r=>r.preventDefault(),onClick:()=>he(W.backspace),children:"⌫"}),t.jsx("button",{type:"button",className:"min-h-11 rounded-md text-lg",onPointerDown:r=>r.preventDefault(),onClick:()=>he(W.enter),children:"↵"})]}):t.jsx(t.Fragment,{children:t.jsxs("button",{type:"button",className:"flex min-h-11 flex-col items-center justify-center gap-0.5 rounded-md",disabled:!A||w,onClick:()=>ft(pe==="trackpad"?"direct":"trackpad"),"aria-label":e("computer.switchTouchMode"),children:[t.jsx(Ht,{size:18}),e(pe==="trackpad"?"computer.trackpadMode":"computer.directTouchMode")]})})]}),xt]})]});return X?Ze.createPortal(bt,document.body):bt}const Nr=Object.freeze(Object.defineProperty({__proto__:null,default:vr},Symbol.toStringTag,{value:"Module"}));export{et as C,Nr as a,xr as b,ur as c};