termdock 1.4.313 → 1.4.315

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 (355) hide show
  1. package/dist/client/assets/{App-ChS2-lkz.js → App-B2SFV3qg.js} +53 -53
  2. package/dist/client/assets/App-B2SFV3qg.js.br +0 -0
  3. package/dist/client/assets/App-B2SFV3qg.js.gz +0 -0
  4. package/dist/client/assets/{ArchitecturePanel-JtjyyJoW.js → ArchitecturePanel-Cj7za6DZ.js} +6 -6
  5. package/dist/client/assets/ArchitecturePanel-Cj7za6DZ.js.br +0 -0
  6. package/dist/client/assets/ArchitecturePanel-Cj7za6DZ.js.gz +0 -0
  7. package/dist/client/assets/{ChangeWalkthroughPanel-BlQ5-VPp.js → ChangeWalkthroughPanel-BB52iLLC.js} +2 -2
  8. package/dist/client/assets/ChangeWalkthroughPanel-BB52iLLC.js.br +0 -0
  9. package/dist/client/assets/ChangeWalkthroughPanel-BB52iLLC.js.gz +0 -0
  10. package/dist/client/assets/{CollaborationMainWorkspace-aFLAMqDr.js → CollaborationMainWorkspace-D5WKV3rA.js} +1 -1
  11. package/dist/client/assets/CollaborationMainWorkspace-D5WKV3rA.js.br +0 -0
  12. package/dist/client/assets/CollaborationMainWorkspace-D5WKV3rA.js.gz +0 -0
  13. package/dist/client/assets/CollaborationTaskContent-MwUgcmG_.js +2 -0
  14. package/dist/client/assets/ComputerControlView-Dkc4R1IU.js +5 -0
  15. package/dist/client/assets/ComputerControlView-Dkc4R1IU.js.br +0 -0
  16. package/dist/client/assets/ComputerControlView-Dkc4R1IU.js.gz +0 -0
  17. package/dist/client/assets/{DagPlayground-CR4uDFOx.js → DagPlayground-BHY3l8UG.js} +1 -1
  18. package/dist/client/assets/DagPlayground-BHY3l8UG.js.br +0 -0
  19. package/dist/client/assets/DagPlayground-BHY3l8UG.js.gz +0 -0
  20. package/dist/client/assets/{DiffLab-BqeHMDOy.js → DiffLab-BSQiKfBJ.js} +1 -1
  21. package/dist/client/assets/DiffLab-BSQiKfBJ.js.br +0 -0
  22. package/dist/client/assets/DiffLab-BSQiKfBJ.js.gz +0 -0
  23. package/dist/client/assets/{DiffReview-DqrOcRfP.js → DiffReview-CYrBBq0V.js} +1 -1
  24. package/dist/client/assets/DiffReview-CYrBBq0V.js.br +0 -0
  25. package/dist/client/assets/DiffReview-CYrBBq0V.js.gz +0 -0
  26. package/dist/client/assets/{DiffReviewLab-CEYpbrL6.js → DiffReviewLab-VSIbEnxm.js} +1 -1
  27. package/dist/client/assets/DiffReviewLab-VSIbEnxm.js.br +0 -0
  28. package/dist/client/assets/DiffReviewLab-VSIbEnxm.js.gz +0 -0
  29. package/dist/client/assets/{DiffViewer-F-uQSmhG.js → DiffViewer-Cx5fyiMB.js} +8 -8
  30. package/dist/client/assets/DiffViewer-Cx5fyiMB.js.br +0 -0
  31. package/dist/client/assets/DiffViewer-Cx5fyiMB.js.gz +0 -0
  32. package/dist/client/assets/{ModelPreview-KmXFkgij.js → ModelPreview-B22odexG.js} +1 -1
  33. package/dist/client/assets/ModelPreview-B22odexG.js.br +0 -0
  34. package/dist/client/assets/ModelPreview-B22odexG.js.gz +0 -0
  35. package/dist/client/assets/{RightSidebar-VMdXpo4h.js → RightSidebar-DKA0jXPW.js} +3 -3
  36. package/dist/client/assets/RightSidebar-DKA0jXPW.js.br +0 -0
  37. package/dist/client/assets/RightSidebar-DKA0jXPW.js.gz +0 -0
  38. package/dist/client/assets/{abnfDiagram-VCTEODGH-CAMk1C0N.js → abnfDiagram-VCTEODGH-sbUSsiPn.js} +1 -1
  39. package/dist/client/assets/abnfDiagram-VCTEODGH-sbUSsiPn.js.br +0 -0
  40. package/dist/client/assets/abnfDiagram-VCTEODGH-sbUSsiPn.js.gz +0 -0
  41. package/dist/client/assets/app-CYOLJycb.js +35 -0
  42. package/dist/client/assets/app-CYOLJycb.js.br +0 -0
  43. package/dist/client/assets/app-CYOLJycb.js.gz +0 -0
  44. package/dist/client/assets/{arc-CYG_-1vC.js → arc-GhJ9aeQ3.js} +1 -1
  45. package/dist/client/assets/arc-GhJ9aeQ3.js.br +0 -0
  46. package/dist/client/assets/arc-GhJ9aeQ3.js.gz +0 -0
  47. package/dist/client/assets/{architectureDiagram-5GKGNRK7-BqHzezLR.js → architectureDiagram-5GKGNRK7-BYmAIJBx.js} +1 -1
  48. package/dist/client/assets/architectureDiagram-5GKGNRK7-BYmAIJBx.js.br +0 -0
  49. package/dist/client/assets/architectureDiagram-5GKGNRK7-BYmAIJBx.js.gz +0 -0
  50. package/dist/client/assets/{blockDiagram-I7D4REHJ-D6GWRO_Z.js → blockDiagram-I7D4REHJ-CZNZT_ez.js} +1 -1
  51. package/dist/client/assets/blockDiagram-I7D4REHJ-CZNZT_ez.js.br +0 -0
  52. package/dist/client/assets/blockDiagram-I7D4REHJ-CZNZT_ez.js.gz +0 -0
  53. package/dist/client/assets/{c4Diagram-7LVT6UL2-CutmGIGb.js → c4Diagram-7LVT6UL2-6xcSowLn.js} +1 -1
  54. package/dist/client/assets/c4Diagram-7LVT6UL2-6xcSowLn.js.br +0 -0
  55. package/dist/client/assets/c4Diagram-7LVT6UL2-6xcSowLn.js.gz +0 -0
  56. package/dist/client/assets/channel-C1FwyjiU.js +1 -0
  57. package/dist/client/assets/{chunk-2Q5K7J3B-DwiUpGFu.js → chunk-2Q5K7J3B-C06nkhUQ.js} +1 -1
  58. package/dist/client/assets/{chunk-5VM5RSS4-C35gLPSH.js → chunk-5VM5RSS4-BHY43hJO.js} +1 -1
  59. package/dist/client/assets/{chunk-F27PBJKO-CNptP19P.js → chunk-F27PBJKO-Dl8JYcZO.js} +1 -1
  60. package/dist/client/assets/chunk-F27PBJKO-Dl8JYcZO.js.br +0 -0
  61. package/dist/client/assets/chunk-F27PBJKO-Dl8JYcZO.js.gz +0 -0
  62. package/dist/client/assets/{chunk-IMKFNOWR-DHdpB9A0.js → chunk-IMKFNOWR-BALi4Q3g.js} +1 -1
  63. package/dist/client/assets/chunk-IMKFNOWR-BALi4Q3g.js.br +0 -0
  64. package/dist/client/assets/chunk-IMKFNOWR-BALi4Q3g.js.gz +0 -0
  65. package/dist/client/assets/{chunk-JWPE2WC7-CrKSOzdE.js → chunk-JWPE2WC7-BBD2d7j7.js} +1 -1
  66. package/dist/client/assets/{chunk-POPQ4Y6H-CiZGLRSk.js → chunk-POPQ4Y6H-CZN0_ndj.js} +1 -1
  67. package/dist/client/assets/{chunk-SVP7TREG-B70pX8OB.js → chunk-SVP7TREG-CD-Zf9rn.js} +1 -1
  68. package/dist/client/assets/chunk-SVP7TREG-CD-Zf9rn.js.br +0 -0
  69. package/dist/client/assets/chunk-SVP7TREG-CD-Zf9rn.js.gz +0 -0
  70. package/dist/client/assets/{chunk-TICWLB2K-Ba1mI99F.js → chunk-TICWLB2K-Clpg1zwp.js} +1 -1
  71. package/dist/client/assets/chunk-TICWLB2K-Clpg1zwp.js.br +0 -0
  72. package/dist/client/assets/chunk-TICWLB2K-Clpg1zwp.js.gz +0 -0
  73. package/dist/client/assets/{chunk-XXDRQBXY-DmKIl18h.js → chunk-XXDRQBXY-BanPVnIr.js} +1 -1
  74. package/dist/client/assets/classDiagram-ZZMXUADV-FyKDan8T.js +1 -0
  75. package/dist/client/assets/classDiagram-v2-VYDZK3BY-FyKDan8T.js +1 -0
  76. package/dist/client/assets/{cose-bilkent-JH36ORCC-C-NMDUHW.js → cose-bilkent-JH36ORCC-431u7cfU.js} +1 -1
  77. package/dist/client/assets/cose-bilkent-JH36ORCC-431u7cfU.js.br +0 -0
  78. package/dist/client/assets/cose-bilkent-JH36ORCC-431u7cfU.js.gz +0 -0
  79. package/dist/client/assets/{cynefin-OW5HDTMX-CZgEc1ab.js → cynefin-OW5HDTMX-BuLFGx14.js} +1 -1
  80. package/dist/client/assets/cynefin-OW5HDTMX-BuLFGx14.js.br +0 -0
  81. package/dist/client/assets/cynefin-OW5HDTMX-BuLFGx14.js.gz +0 -0
  82. package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-CHQeSNm2.js → cynefinDiagram-5FMLGOSQ-qLzjwMMG.js} +1 -1
  83. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-qLzjwMMG.js.br +0 -0
  84. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-qLzjwMMG.js.gz +0 -0
  85. package/dist/client/assets/{dagre-GXQ25YYZ-B_jkMdPS.js → dagre-GXQ25YYZ-CUdd5M5g.js} +1 -1
  86. package/dist/client/assets/dagre-GXQ25YYZ-CUdd5M5g.js.br +0 -0
  87. package/dist/client/assets/dagre-GXQ25YYZ-CUdd5M5g.js.gz +0 -0
  88. package/dist/client/assets/{diagram-S7CK7UJ4-nv6Lnsrp.js → diagram-S7CK7UJ4-DLQClBzm.js} +1 -1
  89. package/dist/client/assets/diagram-S7CK7UJ4-DLQClBzm.js.br +0 -0
  90. package/dist/client/assets/diagram-S7CK7UJ4-DLQClBzm.js.gz +0 -0
  91. package/dist/client/assets/{diagram-UQ7AKVKN-BZf2fzaA.js → diagram-UQ7AKVKN-1RGASXU_.js} +1 -1
  92. package/dist/client/assets/diagram-UQ7AKVKN-1RGASXU_.js.br +0 -0
  93. package/dist/client/assets/diagram-UQ7AKVKN-1RGASXU_.js.gz +0 -0
  94. package/dist/client/assets/{diagram-VSXAHHWV-CxL0_BH8.js → diagram-VSXAHHWV-DqnCzn2R.js} +1 -1
  95. package/dist/client/assets/diagram-VSXAHHWV-DqnCzn2R.js.br +0 -0
  96. package/dist/client/assets/diagram-VSXAHHWV-DqnCzn2R.js.gz +0 -0
  97. package/dist/client/assets/{diagram-VX7I27RA-Dm9MqpIE.js → diagram-VX7I27RA-CMXsPqTS.js} +1 -1
  98. package/dist/client/assets/diagram-VX7I27RA-CMXsPqTS.js.br +0 -0
  99. package/dist/client/assets/diagram-VX7I27RA-CMXsPqTS.js.gz +0 -0
  100. package/dist/client/assets/{diagram-Z3DM3KII-BIfTa7P5.js → diagram-Z3DM3KII-BM0N1kCR.js} +1 -1
  101. package/dist/client/assets/diagram-Z3DM3KII-BM0N1kCR.js.br +0 -0
  102. package/dist/client/assets/diagram-Z3DM3KII-BM0N1kCR.js.gz +0 -0
  103. package/dist/client/assets/{ebnfDiagram-PWID7BFC-D4XhCDFS.js → ebnfDiagram-PWID7BFC-CvaVo-wh.js} +1 -1
  104. package/dist/client/assets/ebnfDiagram-PWID7BFC-CvaVo-wh.js.br +0 -0
  105. package/dist/client/assets/ebnfDiagram-PWID7BFC-CvaVo-wh.js.gz +0 -0
  106. package/dist/client/assets/{erDiagram-RLTQ6QDP-Dxd48dXC.js → erDiagram-RLTQ6QDP-okw-AY7i.js} +1 -1
  107. package/dist/client/assets/erDiagram-RLTQ6QDP-okw-AY7i.js.br +0 -0
  108. package/dist/client/assets/erDiagram-RLTQ6QDP-okw-AY7i.js.gz +0 -0
  109. package/dist/client/assets/{flowDiagram-HODETNUW-BXBMsEmE.js → flowDiagram-HODETNUW-B_DWtzOe.js} +1 -1
  110. package/dist/client/assets/flowDiagram-HODETNUW-B_DWtzOe.js.br +0 -0
  111. package/dist/client/assets/flowDiagram-HODETNUW-B_DWtzOe.js.gz +0 -0
  112. package/dist/client/assets/{ganttDiagram-EL5Y4UJY-CBfDd-KZ.js → ganttDiagram-EL5Y4UJY-Bm4nYUVg.js} +1 -1
  113. package/dist/client/assets/ganttDiagram-EL5Y4UJY-Bm4nYUVg.js.br +0 -0
  114. package/dist/client/assets/ganttDiagram-EL5Y4UJY-Bm4nYUVg.js.gz +0 -0
  115. package/dist/client/assets/{gestureArbiter-DXLmNGli.js → gestureArbiter-XalN4TaN.js} +1 -1
  116. package/dist/client/assets/gestureArbiter-XalN4TaN.js.br +0 -0
  117. package/dist/client/assets/gestureArbiter-XalN4TaN.js.gz +0 -0
  118. package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-DtLM68fN.js → gitGraphDiagram-WWUBYQGX-B7LAo8S2.js} +1 -1
  119. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-B7LAo8S2.js.br +0 -0
  120. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-B7LAo8S2.js.gz +0 -0
  121. package/dist/client/assets/{index-KuPaZyuZ.css → index-BObjbh2R.css} +1 -1
  122. package/dist/client/assets/index-BObjbh2R.css.br +0 -0
  123. package/dist/client/assets/{index-KuPaZyuZ.css.gz → index-BObjbh2R.css.gz} +0 -0
  124. package/dist/client/assets/{infoDiagram-27XIBGKW-FRhqdJvW.js → infoDiagram-27XIBGKW-DXncUrwz.js} +1 -1
  125. package/dist/client/assets/{ishikawaDiagram-5VMMS53U-DAHBvAZ-.js → ishikawaDiagram-5VMMS53U-Ds28H7pI.js} +1 -1
  126. package/dist/client/assets/{ishikawaDiagram-5VMMS53U-DAHBvAZ-.js.br → ishikawaDiagram-5VMMS53U-Ds28H7pI.js.br} +0 -0
  127. package/dist/client/assets/ishikawaDiagram-5VMMS53U-Ds28H7pI.js.gz +0 -0
  128. package/dist/client/assets/{journeyDiagram-3NMN7TZE-CVuWuL3Z.js → journeyDiagram-3NMN7TZE-WeF_efZ2.js} +1 -1
  129. package/dist/client/assets/journeyDiagram-3NMN7TZE-WeF_efZ2.js.br +0 -0
  130. package/dist/client/assets/journeyDiagram-3NMN7TZE-WeF_efZ2.js.gz +0 -0
  131. package/dist/client/assets/{kanban-definition-UXKFOSKX-ByQSUVJV.js → kanban-definition-UXKFOSKX-CMbZcy6U.js} +1 -1
  132. package/dist/client/assets/kanban-definition-UXKFOSKX-CMbZcy6U.js.br +0 -0
  133. package/dist/client/assets/kanban-definition-UXKFOSKX-CMbZcy6U.js.gz +0 -0
  134. package/dist/client/assets/{layout-Bb3Nb1c4.js → layout-DNapC8T-.js} +1 -1
  135. package/dist/client/assets/layout-DNapC8T-.js.br +0 -0
  136. package/dist/client/assets/layout-DNapC8T-.js.gz +0 -0
  137. package/dist/client/assets/{linear-DHMMQlOo.js → linear-B9AFx-TF.js} +1 -1
  138. package/dist/client/assets/linear-B9AFx-TF.js.br +0 -0
  139. package/dist/client/assets/linear-B9AFx-TF.js.gz +0 -0
  140. package/dist/client/assets/{mermaid.core-BYfniK0H.js → mermaid.core-Ddh1Z0hf.js} +5 -5
  141. package/dist/client/assets/mermaid.core-Ddh1Z0hf.js.br +0 -0
  142. package/dist/client/assets/mermaid.core-Ddh1Z0hf.js.gz +0 -0
  143. package/dist/client/assets/{mindmap-definition-YA3MSWOX-EDLD5AyH.js → mindmap-definition-YA3MSWOX-B0xMGUol.js} +1 -1
  144. package/dist/client/assets/mindmap-definition-YA3MSWOX-B0xMGUol.js.br +0 -0
  145. package/dist/client/assets/mindmap-definition-YA3MSWOX-B0xMGUol.js.gz +0 -0
  146. package/dist/client/assets/{passwordBootstrap-DCrtirwT.js → passwordBootstrap-DQRd5vCF.js} +1 -1
  147. package/dist/client/assets/passwordBootstrap-DQRd5vCF.js.br +0 -0
  148. package/dist/client/assets/{passwordBootstrap-DCrtirwT.js.gz → passwordBootstrap-DQRd5vCF.js.gz} +0 -0
  149. package/dist/client/assets/{pegDiagram-XKGWAZYB-BHYhkqJN.js → pegDiagram-XKGWAZYB-BVZ-3kEF.js} +1 -1
  150. package/dist/client/assets/pegDiagram-XKGWAZYB-BVZ-3kEF.js.br +0 -0
  151. package/dist/client/assets/pegDiagram-XKGWAZYB-BVZ-3kEF.js.gz +0 -0
  152. package/dist/client/assets/{pieDiagram-E7YTZNPT-BUIJlswC.js → pieDiagram-E7YTZNPT-Cim4Hk3I.js} +1 -1
  153. package/dist/client/assets/pieDiagram-E7YTZNPT-Cim4Hk3I.js.br +0 -0
  154. package/dist/client/assets/pieDiagram-E7YTZNPT-Cim4Hk3I.js.gz +0 -0
  155. package/dist/client/assets/{quadrantDiagram-AXDQQJYC-D8Im-7yC.js → quadrantDiagram-AXDQQJYC-CYiEj5sp.js} +1 -1
  156. package/dist/client/assets/quadrantDiagram-AXDQQJYC-CYiEj5sp.js.br +0 -0
  157. package/dist/client/assets/quadrantDiagram-AXDQQJYC-CYiEj5sp.js.gz +0 -0
  158. package/dist/client/assets/{railroadDiagram-O6MQD6OU-D7n6z2G1.js → railroadDiagram-O6MQD6OU-DjNNfYra.js} +1 -1
  159. package/dist/client/assets/railroadDiagram-O6MQD6OU-DjNNfYra.js.br +0 -0
  160. package/dist/client/assets/railroadDiagram-O6MQD6OU-DjNNfYra.js.gz +0 -0
  161. package/dist/client/assets/{rdpSession-DJlNIbVk.js → rdpSession-DEzSQAuN.js} +1 -1
  162. package/dist/client/assets/rdpSession-DEzSQAuN.js.br +0 -0
  163. package/dist/client/assets/rdpSession-DEzSQAuN.js.gz +0 -0
  164. package/dist/client/assets/{referenceLongPress-DFSrssSr.js → referenceLongPress-BjyTtoDY.js} +1 -1
  165. package/dist/client/assets/referenceLongPress-BjyTtoDY.js.br +0 -0
  166. package/dist/client/assets/referenceLongPress-BjyTtoDY.js.gz +0 -0
  167. package/dist/client/assets/{requirementDiagram-BXWQKSXE-Ki0rR-F7.js → requirementDiagram-BXWQKSXE-ZwiKdiI3.js} +1 -1
  168. package/dist/client/assets/requirementDiagram-BXWQKSXE-ZwiKdiI3.js.br +0 -0
  169. package/dist/client/assets/{requirementDiagram-BXWQKSXE-Ki0rR-F7.js.gz → requirementDiagram-BXWQKSXE-ZwiKdiI3.js.gz} +0 -0
  170. package/dist/client/assets/{sankeyDiagram-P5KCCOFB-36NmMqsW.js → sankeyDiagram-P5KCCOFB-BYR7ctps.js} +1 -1
  171. package/dist/client/assets/sankeyDiagram-P5KCCOFB-BYR7ctps.js.br +0 -0
  172. package/dist/client/assets/sankeyDiagram-P5KCCOFB-BYR7ctps.js.gz +0 -0
  173. package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-5vsPuFyO.js → sequenceDiagram-WJ2MYXX4-DxYCvK80.js} +1 -1
  174. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-DxYCvK80.js.br +0 -0
  175. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-DxYCvK80.js.gz +0 -0
  176. package/dist/client/assets/{sizeCapture-INFHLROL-DbAulwBg.js → sizeCapture-INFHLROL-CXruk8Ko.js} +1 -1
  177. package/dist/client/assets/sizeCapture-INFHLROL-CXruk8Ko.js.br +0 -0
  178. package/dist/client/assets/sizeCapture-INFHLROL-CXruk8Ko.js.gz +0 -0
  179. package/dist/client/assets/{sparkles-CapLTKAs.js → sparkles-DRH97PDH.js} +1 -1
  180. package/dist/client/assets/{stateDiagram-D77RDMKH-Bgwe0g5S.js → stateDiagram-D77RDMKH-CENDGrxr.js} +1 -1
  181. package/dist/client/assets/stateDiagram-D77RDMKH-CENDGrxr.js.br +0 -0
  182. package/dist/client/assets/stateDiagram-D77RDMKH-CENDGrxr.js.gz +0 -0
  183. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-De-tGy_n.js +1 -0
  184. package/dist/client/assets/{swimlanes-42K2YHIH-COGAWe-g.js → swimlanes-42K2YHIH-BZQeVFeA.js} +1 -1
  185. package/dist/client/assets/swimlanes-42K2YHIH-BZQeVFeA.js.br +0 -0
  186. package/dist/client/assets/swimlanes-42K2YHIH-BZQeVFeA.js.gz +0 -0
  187. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-D1YMLrIO.js +8 -0
  188. package/dist/client/assets/{timeline-definition-24CTP7MA-C4gt5z68.js → timeline-definition-24CTP7MA-DiJ9i33g.js} +1 -1
  189. package/dist/client/assets/timeline-definition-24CTP7MA-DiJ9i33g.js.br +0 -0
  190. package/dist/client/assets/{timeline-definition-24CTP7MA-C4gt5z68.js.gz → timeline-definition-24CTP7MA-DiJ9i33g.js.gz} +0 -0
  191. package/dist/client/assets/{triangle-alert-xPHw25jD.js → triangle-alert-DECoBoOV.js} +1 -1
  192. package/dist/client/assets/{vennDiagram-4TSXK5OY-CIEXh9oD.js → vennDiagram-4TSXK5OY-DBiEJQ9Y.js} +1 -1
  193. package/dist/client/assets/vennDiagram-4TSXK5OY-DBiEJQ9Y.js.br +0 -0
  194. package/dist/client/assets/vennDiagram-4TSXK5OY-DBiEJQ9Y.js.gz +0 -0
  195. package/dist/client/assets/{videoCompression-CUkCS2-q.js → videoCompression-8r1jOza9.js} +1 -1
  196. package/dist/client/assets/videoCompression-8r1jOza9.js.br +0 -0
  197. package/dist/client/assets/videoCompression-8r1jOza9.js.gz +0 -0
  198. package/dist/client/assets/{wardleyDiagram-VM6X3IG4-gQhcW1vd.js → wardleyDiagram-VM6X3IG4-B6wCSfya.js} +1 -1
  199. package/dist/client/assets/wardleyDiagram-VM6X3IG4-B6wCSfya.js.br +0 -0
  200. package/dist/client/assets/wardleyDiagram-VM6X3IG4-B6wCSfya.js.gz +0 -0
  201. package/dist/client/assets/{xychartDiagram-S5SC5T6Z-BmIcdejz.js → xychartDiagram-S5SC5T6Z-DlNQayU5.js} +1 -1
  202. package/dist/client/assets/xychartDiagram-S5SC5T6Z-DlNQayU5.js.br +0 -0
  203. package/dist/client/assets/xychartDiagram-S5SC5T6Z-DlNQayU5.js.gz +0 -0
  204. package/dist/client/index.html +3 -2
  205. package/dist/client/index.html.br +0 -0
  206. package/dist/client/index.html.gz +0 -0
  207. package/dist/client/ipad-status-bar.js +12 -0
  208. package/dist/client/sw.js +1 -1
  209. package/dist/client/sw.js.br +0 -0
  210. package/dist/client/sw.js.gz +0 -0
  211. package/dist/server/agent/collaborationCli.js +30 -8
  212. package/dist/server/agent/collaborationStore.js +25 -2
  213. package/dist/server/agent/collaborationTmuxDelivery.js +11 -3
  214. package/dist/server/agent/integrationCli.js +15 -3
  215. package/dist/server/agent/integrationServer.js +16 -1
  216. package/dist/server/agent/integrationSessions.js +342 -14
  217. package/dist/server/agent/integrationStore.js +1 -1
  218. package/dist/server/agent/promptDelivery.js +7 -1
  219. package/dist/server/agent/sessionLaunchDiagnostics.js +26 -0
  220. package/dist/server/agent/sessionLifecycle.js +4 -0
  221. package/dist/server/agent/sessionManagement.js +87 -0
  222. package/dist/server/agent/terminalInput.js +9 -1
  223. package/dist/server/routes/terminal.js +172 -21
  224. package/docs/integrations.md +208 -0
  225. package/package.json +1 -1
  226. package/runtime-manifest.json +3 -3
  227. package/dist/client/assets/App-ChS2-lkz.js.br +0 -0
  228. package/dist/client/assets/App-ChS2-lkz.js.gz +0 -0
  229. package/dist/client/assets/ArchitecturePanel-JtjyyJoW.js.br +0 -0
  230. package/dist/client/assets/ArchitecturePanel-JtjyyJoW.js.gz +0 -0
  231. package/dist/client/assets/ChangeWalkthroughPanel-BlQ5-VPp.js.br +0 -0
  232. package/dist/client/assets/ChangeWalkthroughPanel-BlQ5-VPp.js.gz +0 -0
  233. package/dist/client/assets/CollaborationMainWorkspace-aFLAMqDr.js.br +0 -0
  234. package/dist/client/assets/CollaborationMainWorkspace-aFLAMqDr.js.gz +0 -0
  235. package/dist/client/assets/CollaborationTaskContent-BDQMRhU9.js +0 -2
  236. package/dist/client/assets/ComputerControlView-TAKDbBUl.js +0 -5
  237. package/dist/client/assets/ComputerControlView-TAKDbBUl.js.br +0 -0
  238. package/dist/client/assets/ComputerControlView-TAKDbBUl.js.gz +0 -0
  239. package/dist/client/assets/DagPlayground-CR4uDFOx.js.br +0 -0
  240. package/dist/client/assets/DagPlayground-CR4uDFOx.js.gz +0 -0
  241. package/dist/client/assets/DiffLab-BqeHMDOy.js.br +0 -0
  242. package/dist/client/assets/DiffLab-BqeHMDOy.js.gz +0 -0
  243. package/dist/client/assets/DiffReview-DqrOcRfP.js.br +0 -0
  244. package/dist/client/assets/DiffReview-DqrOcRfP.js.gz +0 -0
  245. package/dist/client/assets/DiffReviewLab-CEYpbrL6.js.br +0 -0
  246. package/dist/client/assets/DiffReviewLab-CEYpbrL6.js.gz +0 -0
  247. package/dist/client/assets/DiffViewer-F-uQSmhG.js.br +0 -0
  248. package/dist/client/assets/DiffViewer-F-uQSmhG.js.gz +0 -0
  249. package/dist/client/assets/ModelPreview-KmXFkgij.js.br +0 -0
  250. package/dist/client/assets/ModelPreview-KmXFkgij.js.gz +0 -0
  251. package/dist/client/assets/RightSidebar-VMdXpo4h.js.br +0 -0
  252. package/dist/client/assets/RightSidebar-VMdXpo4h.js.gz +0 -0
  253. package/dist/client/assets/abnfDiagram-VCTEODGH-CAMk1C0N.js.br +0 -0
  254. package/dist/client/assets/abnfDiagram-VCTEODGH-CAMk1C0N.js.gz +0 -0
  255. package/dist/client/assets/app-CHxLSuGQ.js +0 -35
  256. package/dist/client/assets/app-CHxLSuGQ.js.br +0 -0
  257. package/dist/client/assets/app-CHxLSuGQ.js.gz +0 -0
  258. package/dist/client/assets/arc-CYG_-1vC.js.br +0 -0
  259. package/dist/client/assets/arc-CYG_-1vC.js.gz +0 -0
  260. package/dist/client/assets/architectureDiagram-5GKGNRK7-BqHzezLR.js.br +0 -0
  261. package/dist/client/assets/architectureDiagram-5GKGNRK7-BqHzezLR.js.gz +0 -0
  262. package/dist/client/assets/blockDiagram-I7D4REHJ-D6GWRO_Z.js.br +0 -0
  263. package/dist/client/assets/blockDiagram-I7D4REHJ-D6GWRO_Z.js.gz +0 -0
  264. package/dist/client/assets/c4Diagram-7LVT6UL2-CutmGIGb.js.br +0 -0
  265. package/dist/client/assets/c4Diagram-7LVT6UL2-CutmGIGb.js.gz +0 -0
  266. package/dist/client/assets/channel-B3BKM2gg.js +0 -1
  267. package/dist/client/assets/chunk-F27PBJKO-CNptP19P.js.br +0 -0
  268. package/dist/client/assets/chunk-F27PBJKO-CNptP19P.js.gz +0 -0
  269. package/dist/client/assets/chunk-IMKFNOWR-DHdpB9A0.js.br +0 -0
  270. package/dist/client/assets/chunk-IMKFNOWR-DHdpB9A0.js.gz +0 -0
  271. package/dist/client/assets/chunk-SVP7TREG-B70pX8OB.js.br +0 -0
  272. package/dist/client/assets/chunk-SVP7TREG-B70pX8OB.js.gz +0 -0
  273. package/dist/client/assets/chunk-TICWLB2K-Ba1mI99F.js.br +0 -0
  274. package/dist/client/assets/chunk-TICWLB2K-Ba1mI99F.js.gz +0 -0
  275. package/dist/client/assets/classDiagram-ZZMXUADV-CS4V_MQS.js +0 -1
  276. package/dist/client/assets/classDiagram-v2-VYDZK3BY-CS4V_MQS.js +0 -1
  277. package/dist/client/assets/cose-bilkent-JH36ORCC-C-NMDUHW.js.br +0 -0
  278. package/dist/client/assets/cose-bilkent-JH36ORCC-C-NMDUHW.js.gz +0 -0
  279. package/dist/client/assets/cynefin-OW5HDTMX-CZgEc1ab.js.br +0 -0
  280. package/dist/client/assets/cynefin-OW5HDTMX-CZgEc1ab.js.gz +0 -0
  281. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CHQeSNm2.js.br +0 -0
  282. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CHQeSNm2.js.gz +0 -0
  283. package/dist/client/assets/dagre-GXQ25YYZ-B_jkMdPS.js.br +0 -0
  284. package/dist/client/assets/dagre-GXQ25YYZ-B_jkMdPS.js.gz +0 -0
  285. package/dist/client/assets/diagram-S7CK7UJ4-nv6Lnsrp.js.br +0 -0
  286. package/dist/client/assets/diagram-S7CK7UJ4-nv6Lnsrp.js.gz +0 -0
  287. package/dist/client/assets/diagram-UQ7AKVKN-BZf2fzaA.js.br +0 -0
  288. package/dist/client/assets/diagram-UQ7AKVKN-BZf2fzaA.js.gz +0 -0
  289. package/dist/client/assets/diagram-VSXAHHWV-CxL0_BH8.js.br +0 -0
  290. package/dist/client/assets/diagram-VSXAHHWV-CxL0_BH8.js.gz +0 -0
  291. package/dist/client/assets/diagram-VX7I27RA-Dm9MqpIE.js.br +0 -0
  292. package/dist/client/assets/diagram-VX7I27RA-Dm9MqpIE.js.gz +0 -0
  293. package/dist/client/assets/diagram-Z3DM3KII-BIfTa7P5.js.br +0 -0
  294. package/dist/client/assets/diagram-Z3DM3KII-BIfTa7P5.js.gz +0 -0
  295. package/dist/client/assets/ebnfDiagram-PWID7BFC-D4XhCDFS.js.br +0 -0
  296. package/dist/client/assets/ebnfDiagram-PWID7BFC-D4XhCDFS.js.gz +0 -0
  297. package/dist/client/assets/erDiagram-RLTQ6QDP-Dxd48dXC.js.br +0 -0
  298. package/dist/client/assets/erDiagram-RLTQ6QDP-Dxd48dXC.js.gz +0 -0
  299. package/dist/client/assets/flowDiagram-HODETNUW-BXBMsEmE.js.br +0 -0
  300. package/dist/client/assets/flowDiagram-HODETNUW-BXBMsEmE.js.gz +0 -0
  301. package/dist/client/assets/ganttDiagram-EL5Y4UJY-CBfDd-KZ.js.br +0 -0
  302. package/dist/client/assets/ganttDiagram-EL5Y4UJY-CBfDd-KZ.js.gz +0 -0
  303. package/dist/client/assets/gestureArbiter-DXLmNGli.js.br +0 -0
  304. package/dist/client/assets/gestureArbiter-DXLmNGli.js.gz +0 -0
  305. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DtLM68fN.js.br +0 -0
  306. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DtLM68fN.js.gz +0 -0
  307. package/dist/client/assets/index-KuPaZyuZ.css.br +0 -0
  308. package/dist/client/assets/ishikawaDiagram-5VMMS53U-DAHBvAZ-.js.gz +0 -0
  309. package/dist/client/assets/journeyDiagram-3NMN7TZE-CVuWuL3Z.js.br +0 -0
  310. package/dist/client/assets/journeyDiagram-3NMN7TZE-CVuWuL3Z.js.gz +0 -0
  311. package/dist/client/assets/kanban-definition-UXKFOSKX-ByQSUVJV.js.br +0 -0
  312. package/dist/client/assets/kanban-definition-UXKFOSKX-ByQSUVJV.js.gz +0 -0
  313. package/dist/client/assets/layout-Bb3Nb1c4.js.br +0 -0
  314. package/dist/client/assets/layout-Bb3Nb1c4.js.gz +0 -0
  315. package/dist/client/assets/linear-DHMMQlOo.js.br +0 -0
  316. package/dist/client/assets/linear-DHMMQlOo.js.gz +0 -0
  317. package/dist/client/assets/mermaid.core-BYfniK0H.js.br +0 -0
  318. package/dist/client/assets/mermaid.core-BYfniK0H.js.gz +0 -0
  319. package/dist/client/assets/mindmap-definition-YA3MSWOX-EDLD5AyH.js.br +0 -0
  320. package/dist/client/assets/mindmap-definition-YA3MSWOX-EDLD5AyH.js.gz +0 -0
  321. package/dist/client/assets/passwordBootstrap-DCrtirwT.js.br +0 -0
  322. package/dist/client/assets/pegDiagram-XKGWAZYB-BHYhkqJN.js.br +0 -0
  323. package/dist/client/assets/pegDiagram-XKGWAZYB-BHYhkqJN.js.gz +0 -0
  324. package/dist/client/assets/pieDiagram-E7YTZNPT-BUIJlswC.js.br +0 -0
  325. package/dist/client/assets/pieDiagram-E7YTZNPT-BUIJlswC.js.gz +0 -0
  326. package/dist/client/assets/quadrantDiagram-AXDQQJYC-D8Im-7yC.js.br +0 -0
  327. package/dist/client/assets/quadrantDiagram-AXDQQJYC-D8Im-7yC.js.gz +0 -0
  328. package/dist/client/assets/railroadDiagram-O6MQD6OU-D7n6z2G1.js.br +0 -0
  329. package/dist/client/assets/railroadDiagram-O6MQD6OU-D7n6z2G1.js.gz +0 -0
  330. package/dist/client/assets/rdpSession-DJlNIbVk.js.br +0 -0
  331. package/dist/client/assets/rdpSession-DJlNIbVk.js.gz +0 -0
  332. package/dist/client/assets/referenceLongPress-DFSrssSr.js.br +0 -0
  333. package/dist/client/assets/referenceLongPress-DFSrssSr.js.gz +0 -0
  334. package/dist/client/assets/requirementDiagram-BXWQKSXE-Ki0rR-F7.js.br +0 -0
  335. package/dist/client/assets/sankeyDiagram-P5KCCOFB-36NmMqsW.js.br +0 -0
  336. package/dist/client/assets/sankeyDiagram-P5KCCOFB-36NmMqsW.js.gz +0 -0
  337. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-5vsPuFyO.js.br +0 -0
  338. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-5vsPuFyO.js.gz +0 -0
  339. package/dist/client/assets/sizeCapture-INFHLROL-DbAulwBg.js.br +0 -0
  340. package/dist/client/assets/sizeCapture-INFHLROL-DbAulwBg.js.gz +0 -0
  341. package/dist/client/assets/stateDiagram-D77RDMKH-Bgwe0g5S.js.br +0 -0
  342. package/dist/client/assets/stateDiagram-D77RDMKH-Bgwe0g5S.js.gz +0 -0
  343. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-Bg6S3Zm0.js +0 -1
  344. package/dist/client/assets/swimlanes-42K2YHIH-COGAWe-g.js.br +0 -0
  345. package/dist/client/assets/swimlanes-42K2YHIH-COGAWe-g.js.gz +0 -0
  346. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-DwBBOocG.js +0 -8
  347. package/dist/client/assets/timeline-definition-24CTP7MA-C4gt5z68.js.br +0 -0
  348. package/dist/client/assets/vennDiagram-4TSXK5OY-CIEXh9oD.js.br +0 -0
  349. package/dist/client/assets/vennDiagram-4TSXK5OY-CIEXh9oD.js.gz +0 -0
  350. package/dist/client/assets/videoCompression-CUkCS2-q.js.br +0 -0
  351. package/dist/client/assets/videoCompression-CUkCS2-q.js.gz +0 -0
  352. package/dist/client/assets/wardleyDiagram-VM6X3IG4-gQhcW1vd.js.br +0 -0
  353. package/dist/client/assets/wardleyDiagram-VM6X3IG4-gQhcW1vd.js.gz +0 -0
  354. package/dist/client/assets/xychartDiagram-S5SC5T6Z-BmIcdejz.js.br +0 -0
  355. package/dist/client/assets/xychartDiagram-S5SC5T6Z-BmIcdejz.js.gz +0 -0
@@ -1,5 +1,7 @@
1
1
  # TD 通用外部接入(协议 1)
2
2
 
3
+ principal 改名/显式关闭要求 **CLI / 实际服务均至少 1.4.315**(见文末契约)。
4
+
3
5
  最低 CLI / 运行服务版本:**termdock 1.4.300**,两者都必须升级并重启服务。
4
6
  启动输入条件与保留凭据的策略更新要求 **CLI / 实际运行服务均至少 1.4.301**;协议仍为 1。
5
7
  插件原生 ID 的前台 argv 回读及服务重启后的运行中 restore 核验修复要求
@@ -785,6 +787,104 @@ no-op restore 不创建新检查。报告跟随会话保存并可在服务重启
785
787
  - 启动/恢复:`SESSION_CREATE_OUTCOME_UNKNOWN`, `SESSION_OPERATION_IN_PROGRESS`, `SESSION_BINDING_TIMEOUT`, `EXACT_RESUME_UNSUPPORTED`, `NATIVE_SESSION_ALREADY_RUNNING`, `NATIVE_SESSION_OWNER_UNCONFIRMED`, `AGENT_NOT_RUNNING`。
786
788
  - 未分类异常:`SESSION_LAUNCH_FAILED`, `SESSION_OBSERVATION_FAILED`;错误不包含包装器输出、密钥或原始堆栈。
787
789
 
790
+ ## 1.4.314:启动诊断与显式冷启动重试
791
+
792
+ 最低 CLI 和实际运行服务均为 **1.4.314**,协议仍为 1。先回读两者版本及实际服务
793
+ `session_launch_diagnostics=true`、`session_cold_retry=true`;对应
794
+ `*_min_version` 均为 `1.4.314`。CLI 遇到不支持重试的服务返回
795
+ `SESSION_COLD_RETRY_UNSUPPORTED`,不发出重试请求。
796
+
797
+ 管理员沿用 `td integration diagnostics <TD-session-id>`,同一响应新增
798
+ `launch_diagnostics`(可为 null)与 `launch_diagnostics_history`(最多 16 个此前实际
799
+ 启动操作)。旧 `diagnostics` 原生所有者报告字段保持兼容;该入口仅回读持久记录,
800
+ 不重新扫描进程、不挂接终端、不发送输入。313 及更早启动没有新增报告,不能从升级
801
+ 反推旧失败原因。已有失败会话可以在满足下述检查后显式重试,产生新的诊断。
802
+
803
+ 启动报告字段:
804
+
805
+ | 字段 | 含义 |
806
+ | --- | --- |
807
+ | `operation_id / generation / kind` | 此次操作和承载代次;kind 为 `cold_start / cold_retry / native_restore` |
808
+ | `phase / updated_at / steps` | 最后持久阶段和时间;steps 最多最近 24 个阶段,时间是 TD 记录时间 |
809
+ | `error_code / reason_code` | 公开失败码及已分类原因;无法分类为 `UNCLASSIFIED_LAUNCH_ERROR`,不保存原始错误文本 |
810
+ | `paste / submit` | 各自为 `not_attempted / attempted / write_returned`;attempted 在调用输入前持久保存,write_returned 表示调用返回 |
811
+ | `runtime_exists` | 最后观察是否存在原承载;没有观察时为 null,不代表读取时的实时进程 |
812
+ | `target_change` | 仅发生承载 fencing 冲突时可有:期望/当前 backend ID、期望/当前 launch ID、backend 实例是否相同 |
813
+
814
+ 阶段清单:`configuration`、`runtime_prepare`、`binding_persist`、
815
+ `native_owner_check`(精确恢复)、`runtime_verify`、`launch_intent`、
816
+ `queue_wait`、`queue_acquired`、`paste_attempted`、`paste_written`、
817
+ `submit_attempted`、`submit_written`、`binding_observe`;中断冷重试回读到原 shell 时
818
+ 另记 `reconciled_shell`。阶段只表示 TD 实际到达的步骤,不推断私有 CLI 根因。
819
+ 崩溃在输入调用附近时,attempted 不能证明写入发生或未发生,不能据此补键。
820
+ write_returned 不证明原生程序消费、提交、成功执行或最终结果。正文仍按原机制
821
+ 粘贴一次、等待至少 50ms、发送一次 CR;没有新的屏幕识别、启动 sleep 或额外 Enter。
822
+
823
+ 完整报告仅管理员可读;principal 与主动 session 事件只返回
824
+ `launch_diagnostics_available=true`,不返回阶段、其他候选或结构证据。报告不保存
825
+ argv、命令正文、stdout/stderr、环境变量或凭据。报告历史受上述条数及原描述总存储
826
+ 预算约束,不是无限保留的排查日志。
827
+
828
+ 正式冷重试命令:
829
+
830
+ ```sh
831
+ td collab --principal <id> session get <TD-session-id>
832
+ td integration diagnostics <TD-session-id>
833
+ td collab --principal <id> session retry-cold <TD-session-id> \
834
+ --generation <get返回的generation> --idempotency-key <本次操作唯一键>
835
+ ```
836
+
837
+ 权限沿用 **session.create**,并核对记录所属 principal/本机组、原 profile 当前仍被授权、
838
+ 原 cwd 同时符合旧快照和当前目录授权。使用原启动配置快照,不接受新 argv/cwd/profile
839
+ 参数。它保留逻辑 TD ID、消息关联和旧操作证据;实际尝试递增 generation、建立新
840
+ operation_id,状态为 starting,可能随后 binding_pending/ready/failed。返回的操作
841
+ 快照不是实时状态;用 session get 查询最新状态。
842
+
843
+ 只允许 failed、尚未绑定 native UUID、无 TD 消息历史/待投递且没有进行中或未确认操作
844
+ 的记录;还需核实原绑定的唯一承载仍存在、原前台 Agent 已退出、回到合格 shell。
845
+ TD 会在生命周期锁及 worker 承载变更屏障内复核,不终止 Agent,不删除旧记录,不重建
846
+ 消失或身份不明的终端。shell 检查不声称可读取用户未提交的任意草稿,调用方仍须拥有
847
+ 输入操作权限并避免其他手工输入。TD 消息入队前设置持久、单调的历史标记;即使稍后
848
+ 入队失败也保守拒绝冷重试。314 起消息裁剪保留双方历史标记;升级前已裁剪且没有 sender 标记的
849
+ 历史无法证明完整,没有已知消息也返回未确认。旧格式或不可读存储同样拒绝;此缺口
850
+ 持久保留,不因一次正常写入而被误判已修复。
851
+
852
+ 必须有可信的原 launcher/plugin 恢复语义指纹且当前仍匹配;缺少指纹时管理员沿用
853
+ resume-configuration / confirm-resume 明确核对确认,不能把路径相同当内容相同。
854
+ 指纹只覆盖 TD 已记录的 launcher 文件、原配置和插件恢复语义,不声称验证包装器依赖
855
+ 或私有 Agent 二进制全部内容。
856
+
857
+ **cold retry 不是 native restore。** 无已知 UUID 时不能保证延续之前未知的原生历史,
858
+ 也不证明旧程序未创建过原生历史;重试可能创建新 UUID。已有 UUID 必须使用原
859
+ session restore 与原生身份/重复所有者保护。原 session create 同幂等键继续回读已有
860
+ 记录,不会自动冷重试。
861
+
862
+ 同键同参数回读原操作结果,不再次启动;同键不同参数返回 IDEMPOTENCY_CONFLICT。
863
+ 同会话不同操作键不能并发启动。重试意图和新代次在输入前持久保存,重试期间 send/reply
864
+ 拒绝且不入队。服务重启后不会自动再启动:session get 核实原程序与 UUID 后可以转为
865
+ ready;回读精确原 shell 则为 failed/SESSION_COLD_RETRY_INTERRUPTED,明确结束未确认
866
+ 状态,后续需新键显式重试;承载消失或仍不能确认时保留 cold_retry_pending=true 并拒绝
867
+ 发送/重试。旧操作结果未提交且出现后续代次时,同旧键返回 OPERATION_OUTCOME_UNCONFIRMED,
868
+ 不能把当前代次伪装为旧操作结果。
869
+
870
+ | 拒绝码(HTTP 409,另有注明时除外) | 含义 |
871
+ | --- | --- |
872
+ | `INVALID_SESSION_GENERATION / SESSION_GENERATION_MISMATCH` | 未传有效数值代次 / 代次已变 |
873
+ | `SESSION_COLD_RETRY_UNSUPPORTED` | CLI 或运行服务/adapter 不支持 |
874
+ | `SESSION_COLD_RETRY_NATIVE_BOUND` | 已有 UUID,应走精确 restore |
875
+ | `SESSION_COLD_RETRY_NOT_FAILED` | 当前不是 failed 冷启动 |
876
+ | `SESSION_MESSAGE_HISTORY_PRESENT / SESSION_MESSAGE_HISTORY_UNCONFIRMED` | 有消息/入队尝试 / 无法可靠核实历史 |
877
+ | `SESSION_COLD_RETRY_RUNTIME_UNCONFIRMED` | 无法核实原承载和退出 shell |
878
+ | `SESSION_OPERATION_IN_PROGRESS / OPERATION_OUTCOME_UNCONFIRMED` | 操作在进行 / 前次结果须对账 |
879
+ | `RESUME_CONFIGURATION_UNCONFIRMED / RESUME_CONFIGURATION_CHANGED` | 指纹缺失 / launcher 或恢复语义变化 |
880
+ | `SESSION_SCOPE_CONFLICT / SESSION_IDENTITY_MISMATCH` | 跨组承载或逻辑所有权冲突 |
881
+ | `LAUNCH_PROFILE_DENIED / SESSION_CWD_DENIED`(403) | 原 profile 或 cwd 当前不再授权 |
882
+
883
+ 其他启动错误仍沿用前述准确码;fencing 冲突可为
884
+ `TERMINAL_INPUT_TARGET_CHANGED`,观察失败为 `SESSION_OBSERVATION_FAILED`,未知启动异常
885
+ 为 `SESSION_LAUNCH_FAILED`,原 shell 检查失败可为 `SESSION_TARGET_NOT_SHELL`。
886
+ 新能力并未确认 DevBox 私有 TraeX 的间歇启动原因,也不代替业务明确回复验收。
887
+
788
888
  ## 验收边界
789
889
 
790
890
  本版维护机验证:共享释放协议、真实 Unix socket 权限/生命周期事件、零入队拒绝、
@@ -818,3 +918,111 @@ PID/start_id、实际 FD/inode 与内核 flock 一致的私有原生所有权证
818
918
  并验证 Agent 真正加载原对话。
819
919
  先完成测试环境的创建→追问→关联答复,再验重复键、追加咨询、断线重投和精确恢复。
820
920
  业务定时器或正式群接入由使用方明确启用,TD 发版不会启用这些业务流程。
921
+
922
+ ## 1.4.315:后台身份改名与显式关闭
923
+
924
+ 最低 **CLI 与实际运行服务均为 1.4.315**;协议仍为 1。回读能力
925
+ `session_rename=true / session_rename_min_version=1.4.315`、
926
+ `session_close=true / session_close_min_version=1.4.315`。CLI 对缺少对应能力的服务返回
927
+ `SESSION_RENAME_UNSUPPORTED / SESSION_CLOSE_UNSUPPORTED`,不降级借用终端身份。
928
+
929
+ 管理员在原完整策略中按需追加独立权限 `session.rename`、`session.close`,通过
930
+ `td integration update --file <policy.json>` 更新;旧身份不会自动获得这两个权限。
931
+ 同一凭据、组、profile 和其他权限保留。后台 principal 不需要绑定终端,已有未删除的
932
+ 本机授权组允许零活动成员;创建、恢复也不要求额外保留空管理成员。组的首次创建与
933
+ 授权仍由管理员完成。普通手动创建的管理终端不属于 principal,不纳入这两个权限。
934
+
935
+ ```sh
936
+ td collab --principal <id> session get <sid>
937
+ td collab --principal <id> session rename <sid> \
938
+ --generation <session-get-generation> --name 'Fast model' --idempotency-key <key>
939
+ td collab --principal <id> session close <sid> \
940
+ --generation <session-get-generation> --idempotency-key <key>
941
+ # 每次新操作前回读当前generation;同一请求重试保持相同参数与key。
942
+ ```
943
+
944
+ 对应本机 integration Unix socket 路由为 `POST /sessions/:id/rename`(JSON
945
+ `{generation,name,idempotency_key}`)和 `POST /sessions/:id/close`(JSON
946
+ `{generation,idempotency_key}`)。凭据仍只通过私有 credential file 注入,不能放 argv、
947
+ 消息或日志。授权必须同时命中持久记录 `principal_id + group_id + session_id`,
948
+ 不能修改同组其他 principal 或手动创建的成员;越界返回 `INTEGRATION_SESSION_NOT_FOUND`。
949
+
950
+ ### 名称与代次
951
+
952
+ rename 复用已有名称清洗规则:控制字符/空白折叠、去首尾空白,截取最多 80 个字符;
953
+ 清洗后为空返回 `INVALID_NAME`。名称保存为逻辑记录的 `name`,同步活动终端登记、
954
+ 网页清单和 tmux 友好名称,释放后仍保留,下一次 restore 使用该名称。
955
+ released/closed 可以仅改审计名称,不重建运行承载、不启动 Agent、不写终端正文。
956
+
957
+ 每次实际 rename 递增 generation,**保留原 launch `operation_id`、native UUID、
958
+ argv/profile/cwd/配置指纹及启动诊断**。`name_updated_at / name_generation /
959
+ name_operation_id` 记录本次改名对应的时间、代次和原操作;不把改名当作一次新启动。
960
+ 新 `session.renamed` 事件包含 `{session_id,name,generation,operation_id}`,
961
+ 沿用既有 event_id 去重、持久 inbox/ACK/重放契约。
962
+
963
+ 先持久保存名称意图,再同步显示。`rename_pending=true` 表示名称已落盘,但显示同步
964
+ 尚未收口;`session get` 或服务重启会重试显示同步,不重新递增、不创建终端。
965
+ 进行中的启动/恢复/释放/关闭或不确定结果拒绝改名;待同步名称必须先通过 get 对账。
966
+ 操作返回仍为 `{session: ...}`;不要把返回同键的历史快照当作最新状态。
967
+
968
+ ### close 与 release 的区别
969
+
970
+ | 操作 | 运行承载 | 逻辑记录 | 后续恢复 |
971
+ |---|---|---|---|
972
+ | release | 只回收已退出 Agent 的精确原 shell | 保留原生恢复描述及消息关联 | 显式 restore 原 UUID |
973
+ | close | 明确结束精确自有运行 Agent,或原失败冷启动 shell | 保留审计、诊断及仍在保留期的消息 | closed 终态,首版不提供 reopen/restore |
974
+
975
+ close 不依据快照文字、忙闲、结果或验收推断是否可以终止。调用者负责业务授权与关闭
976
+ 时机;TD 负责机械范围和承载核验。开始关闭会生成独立 `operation_id`、generation+1,
977
+ **先持久 `closing` 意图与精确目标实例,再进入既有 worker 屏障**,避免与自动终端写入
978
+ 交叉。原 launch 诊断保留,其 operation_id 仍属于原启动,不随 close 改写。
979
+
980
+ 必须无 pending 消息、无进行中/不确定启动或生命周期操作。scope 必须唯一:拒绝跨组
981
+ 共有运行承载、其他逻辑所有者、链接到其他会话的 pane、分屏/其他 pane、原 tmux/pane 绑定变化。运行 Agent
982
+ 需要当前 tmux server 实例与前台进程 PID/start identity、正确 Agent 与可验证的精确原 native UUID;
983
+ 未绑定 UUID 的失败冷启动仅可关闭已证明的原 foreground shell,不能杀未确认的 Agent。
984
+ Linux 用当前 `/proc` starttime;macOS 用当前 `ps lstart` 与前台关系,不采用历史 PID。
985
+ 不可观测平台/权限或缺失身份失败关闭。这里只做运行身份验证,不表示应用输入就绪。
986
+
987
+ 终止前再次回读并比对原进程实例,按精确 tmux **session ID** 终止自有会话,不对
988
+ 进程组执行批量 kill,不删除 native 历史、工作目录、credential、授权组或其他业务。
989
+ 终止后最多观察 2 秒确认原实例与 tmux 消失,不重复终止。确认之后才移除活动 PTY、
990
+ 侧栏登记和组成员并提交 `closed`、`runtime_present=false`、`terminal_binding=null`。
991
+ TD 生命周期锁不排他控制外部 tmux 命令/手工进程替换,最终核验与系统操作之间仍存在
992
+ 外部竞争窗口;不承诺对未受 TD 控制的外部操作提供原子事务或阻止所有派生后台进程。
993
+
994
+ ### 失败、幂等与重启
995
+
996
+ 同一逻辑会话复用生命周期协调器;同参数同键合并/回读原操作,不重复终止。不同键
997
+ 并发返回 `SESSION_OPERATION_IN_PROGRESS`;旧代次返回 `SESSION_GENERATION_MISMATCH`。
998
+ 同键的已保存失败或 pending 结果也保持原快照,最新事实须另外 get。
999
+
1000
+ 关闭意图未落盘时不终止承载。终止/清理/结果落盘失败时保留意图,报告 failed 与
1001
+ `operation_uncertain=true / close_pending=true / runtime_present=null`,不宣称 closed。
1002
+ 重启及 get **只对账,不再发送终止**:确认原进程和 tmux 已不存在后,可以清理残留
1003
+ 登记并收口 closed;仍存活、被替换或身份不明则保持拒绝,不自动杀可能的新进程。
1004
+ 显式关闭过的记录即使出现异常新运行承载,也不会回到 ready。
1005
+
1006
+ `closed` 上新 send/reply/restore/retry-cold/release 返回 `SESSION_CLOSED`,不入队,
1007
+ 不隐式新建 native UUID。尚未收口的 close 拒绝新投递及其他生命周期操作,先 get 对账。
1008
+ 已保存的幂等操作结果可以回读,但不会执行新副作用。主动事件继续推送
1009
+ `session.closing / session.closed / session.failed`,payload 为公开 `{session}`;
1010
+ 公开记录不暴露精确 close 进程目标,仅提供 `close_pending` 等状态。
1011
+
1012
+ | 错误 | 含义与处理 |
1013
+ |---|---|
1014
+ | INTEGRATION_PERMISSION_DENIED | 没有独立授权,不能借用成员身份绕过 |
1015
+ | INTEGRATION_SESSION_NOT_FOUND | 记录不属于当前 principal/本机组或不存在 |
1016
+ | INVALID_NAME / INVALID_SESSION_GENERATION / INVALID_IDEMPOTENCY_KEY | 修正参数后按正式契约调用 |
1017
+ | SESSION_GENERATION_MISMATCH / IDEMPOTENCY_CONFLICT | 代次或同键参数不同,回读状态;不要自动改参数重试 |
1018
+ | SESSION_OPERATION_IN_PROGRESS / SESSION_RENAME_SYNC_PENDING | 进行中或显示意图未收口,先 get |
1019
+ | SESSION_PENDING_MESSAGES | 存在待投递消息,业务先明确处理,TD不自动丢弃 |
1020
+ | SESSION_SCOPE_CONFLICT / SESSION_IDENTITY_MISMATCH | 共享归属、pane或原生身份冲突,管理员核对 |
1021
+ | SESSION_CLOSE_TARGET_UNCONFIRMED / SESSION_CLOSE_TARGET_CHANGED | 当前前台实例无法证明或意图后已变化,不终止未知进程 |
1022
+ | SESSION_CLOSE_FAILED / OPERATION_OUTCOME_UNCONFIRMED | 关闭/对账结果未确认,保留证据且不自动再次终止 |
1023
+ | SESSION_CLOSED | 审计终态,不能当 released 恢复 |
1024
+
1025
+ 关闭不是消息送达、消费或业务完成证明;历史保留额度/事件保留缺口仍按原契约,不是
1026
+ 永久审计存储。close 不增加 task、看板或 accepted。真实私有 TraeX 与 DevBox
1027
+ 共享升级/业务适配由接入方后续验收;维护侧验证仅覆盖隔离测试的真实 tmux/Linux
1028
+ 进程退出与源码回归。macOS 真实 close 路径尚未实机验收。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "termdock",
3
- "version": "1.4.313",
3
+ "version": "1.4.315",
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.313",
4
+ "version": "1.4.315",
5
5
  "runtimeProtocolVersion": 1,
6
6
  "minimumDesktopVersion": "1.4.46",
7
7
  "nodeMajor": 22,
8
8
  "dependencyHash": "sha256-oaGYi/P5ob8sd6VnNBOwshKozjhdV+hYiCmLAsn5x00=",
9
- "serverBundleHash": "sha256-LRpuy83bfoSabTOSe76Yykebdslf8gyq1O1oiR4+Z0c=",
10
- "clientBundleHash": "sha256-rSq/8EDPH8i6WLa9SUHpZCeR4b5vZUPiTUusapoxjBs=",
9
+ "serverBundleHash": "sha256-OcNFq1R90TyiGPlv/P8NiTYtCVsDIju/bXyESGY8kWI=",
10
+ "clientBundleHash": "sha256-tDdrBKrEm8DvNTZxh9nrfPrDrkgyyGJcKHHOtcL6TEo=",
11
11
  "entrypoint": "dist/server/cli.js",
12
12
  "clientEntrypoint": "dist/client/index.html"
13
13
  }
@@ -1,2 +0,0 @@
1
- import{bx as r}from"./app-CHxLSuGQ.js";import{b as m}from"./dnd-BCFAPC0L.js";import{b as n}from"./RightSidebar-VMdXpo4h.js";import"./react-XDCjal2T.js";import"./terminal-C7X98Amf.js";import"./App-ChS2-lkz.js";import"./gestureArbiter-DXLmNGli.js";import"./triangle-alert-xPHw25jD.js";import"./referenceLongPress-DFSrssSr.js";import"./DiffReview-DqrOcRfP.js";import"./sparkles-CapLTKAs.js";import"./DiffViewer-F-uQSmhG.js";import"./ChangeWalkthroughPanel-BlQ5-VPp.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,5 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/rdpSession-DJlNIbVk.js","assets/app-CHxLSuGQ.js","assets/react-XDCjal2T.js","assets/dnd-BCFAPC0L.js","assets/terminal-C7X98Amf.js","assets/index-KuPaZyuZ.css","assets/ChangeWalkthroughPanel-BlQ5-VPp.js","assets/sparkles-CapLTKAs.js","assets/triangle-alert-xPHw25jD.js","assets/RightSidebar-VMdXpo4h.js","assets/App-ChS2-lkz.js","assets/gestureArbiter-DXLmNGli.js","assets/gestureArbiter-C2J0D0kV.css","assets/referenceLongPress-DFSrssSr.js","assets/DiffReview-DqrOcRfP.js","assets/DiffViewer-F-uQSmhG.js","assets/DiffViewer-T3uj2-aP.css","assets/RightSidebar-DW-JEgm2.css"])))=>i.map(i=>d[i]);
2
- import{af as Me,cw as lt,d9 as et,bx as t,ct as Ce,bw as _e,W as Xe,o as We,l as ut,X as dt,_ as qe}from"./app-CHxLSuGQ.js";import{b as o,r as mt}from"./dnd-BCFAPC0L.js";import{a as pt}from"./ChangeWalkthroughPanel-BlQ5-VPp.js";import{L as Ge}from"./RightSidebar-VMdXpo4h.js";import{X as Je,K as ft,j as ht}from"./App-ChS2-lkz.js";import{M as xt}from"./triangle-alert-xPHw25jD.js";const gt=[["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"}]],Qe=Me("mouse-pointer-2",gt);const bt=[["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"}]],yt=Me("settings-2",bt);const vt=[["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=Me("zoom-in",vt);function Ie(e){const s=e==="darwin"?"mac":e==="win32"?"windows":"linux",m={host:"127.0.0.1",platform:s,protocol:s==="mac"?"vnc":"rdp",port:"3389",username:"",domain:"",ignoreCert:!1,rememberLogin:!0};return{target:"local",local:m,remote:{...m,host:""},viewOnly:!1,fit:!0,autoConnect:!0}}function Ze(e,s){const m=Ie(s);if(!e||typeof e!="object")return m;const i=e,h=(c,x)=>{const l=c&&typeof c=="object"?c:{},R=(d,V)=>typeof l[d]=="string"&&l[d].length<=V&&!/[\x00-\x1f]/.test(l[d])?l[d]:x[d];return{host:R("host",253),username:R("username",255),domain:R("domain",255),platform:["mac","linux","windows"].includes(String(l.platform))?l.platform:x.platform,protocol:l.protocol==="rdp"||l.protocol==="vnc"?l.protocol:x.protocol,port:typeof l.port=="string"&&/^\d{0,5}$/.test(l.port)&&Number(l.port)<=65535?l.port:x.port,ignoreCert:l.ignoreCert===!0,rememberLogin:l.rememberLogin!==!1}};return{target:i.target==="remote"?"remote":"local",local:{...h(i.local,m.local),host:"127.0.0.1"},remote:h(i.remote,m.remote),viewOnly:i.viewOnly===!0,fit:i.fit!==!1,autoConnect:i.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 Ct(e){const[s,m]=o.useState(Ie),[i,h]=o.useState(!1),[c,x]=o.useState("loading"),[l,R]=o.useState(0),[d,V]=o.useState([]),[H,D]=o.useState("idle"),P=o.useRef(s),z=o.useRef(0),w=o.useRef(0),U=o.useRef(""),C=o.useRef(null),j=o.useRef(new Set),Y=o.useCallback(y=>{P.current=y(P.current),z.current++,m(P.current),x("saving")},[]);o.useEffect(()=>{const y=++w.current;z.current=0,U.current="",C.current=null,P.current=Ie(),m(P.current),h(!1),x("loading"),V([]),D("idle");const N=new AbortController;return fetch("/api/computer/preferences",{signal:N.signal}).then(async p=>{if(!p.ok)throw new Error("PREFERENCES_LOAD_FAILED");return await p.json()}).then(p=>{if(y!==w.current||N.signal.aborted)return;let E=Ze(p.preferences);const I=z.current>0;if(!p.configured&&!I)try{const L=localStorage.getItem(`termdock:computer-host:${e}`);if(L){const B=/^(127\.0\.0\.1|localhost|::1|\[::1\])$/i.test(L)?"local":"remote";E=Ze({...E,target:B,[B]:{...E[B],host:L,platform:localStorage.getItem(`termdock:computer-platform:${e}`)||E[B].platform,protocol:localStorage.getItem(`termdock:computer-protocol:${e}`)||"vnc",port:localStorage.getItem(`termdock:computer-rdp-port:${e}`)||"3389"}}),z.current++}}catch{}I||(P.current=E),U.current=p.configured?JSON.stringify(E):"",m(P.current),h(!0),x(p.configured?"saved":"saving"),V(Array.isArray(p.credentialKeys)?p.credentialKeys.filter(L=>typeof L=="string"):[]),D(p.credentialError?"error":"idle")}).catch(()=>{!N.signal.aborted&&y===w.current&&x("error")}),()=>{++w.current,N.abort();for(const p of j.current)p.abort();j.current.clear()}},[e,l]);const O=o.useCallback(()=>{if(C.current)return C.current;if(!i)return Promise.resolve(!1);const y=w.current,N=(async()=>{for(;U.current!==JSON.stringify(P.current);){const p=JSON.stringify(P.current),E=new AbortController;j.current.add(E),x("saving");try{if(!(await fetch("/api/computer/preferences",{method:"PUT",headers:{"Content-Type":"application/json"},body:p,signal:E.signal})).ok)throw new Error("PREFERENCES_SAVE_FAILED");if(y!==w.current)return!1;U.current=p}catch{return y===w.current&&x("error"),!1}finally{j.current.delete(E)}}return y===w.current&&x("saved"),!0})();return C.current=N,N.finally(()=>{C.current===N&&(C.current=null)}),N},[i]);o.useEffect(()=>{if(!i||U.current===JSON.stringify(s))return;const y=setTimeout(()=>{O()},300);return()=>clearTimeout(y)},[i,s,O]);const ee=o.useCallback(async(y,N,p)=>{const E=w.current,I=new AbortController;y!=="use"&&D("saving");try{if(!await O()||E!==w.current)throw new Error("COMPUTER_CREDENTIALS_FAILED");j.current.add(I);const L=await fetch(`/api/computer/credentials/${y}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({profile:N,...y==="save"?{password:p}:{}}),signal:I.signal});if(E!==w.current)throw new Error("COMPUTER_CREDENTIALS_FAILED");if(!L.ok)throw new Error(y==="use"&&L.status===404?"COMPUTER_CREDENTIALS_MISSING":"COMPUTER_CREDENTIALS_FAILED");const X=await L.json();if(E!==w.current)throw new Error("COMPUTER_CREDENTIALS_FAILED");const B=tt(N);if(y==="save"&&V(ne=>[...new Set([...ne,B])]),y==="forget"&&V(ne=>ne.filter(xe=>xe!==B)),y==="use"&&(typeof X.password!="string"||!X.password))throw new Error("COMPUTER_CREDENTIALS_MISSING");return D("idle"),X.password}catch(L){throw E===w.current&&!I.signal.aborted&&D("error"),L}finally{j.current.delete(I)}},[O]);return{preferences:s,change:Y,loaded:i,saveState:c,flush:O,credentialKeys:d,loginState:H,credentialRequest:ee,retry:()=>i?void O():R(y=>y+1)}}class jt{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(s,m){this.socket=lt(`/api/computer/ws?host=${encodeURIComponent(s)}`),this.socket.onopen=i=>this.onopen?.(i),this.socket.onerror=i=>this.onerror?.(i),this.socket.onclose=i=>{(i.code!==1e3||i.reason)&&m(i.reason||"COMPUTER_DISCONNECTED"),this.onclose?.(i)},this.socket.onmessage=i=>{try{const h=JSON.parse(i.data);if(h.type!=="data"||typeof h.data!="string"||!Number.isSafeInteger(h.seq))throw new Error("Invalid VNC record");const c=Uint8Array.from(atob(h.data),x=>x.charCodeAt(0));this.onmessage?.(new MessageEvent("message",{data:c.buffer})),this.socket.readyState===1&&this.socket.send(JSON.stringify({type:"ack",seq:h.seq}))}catch{m("COMPUTER_INVALID_MESSAGE"),this.close(),this.onclose?.(new CloseEvent("close",{code:4400}))}}}send(s){const m=ArrayBuffer.isView(s)?new Uint8Array(s.buffer,s.byteOffset,s.byteLength):new Uint8Array(s);for(let i=0;i<m.length;i+=32*1024){const h=m.subarray(i,i+32768);let c="";for(const x of h)c+=String.fromCharCode(x);this.socket.send(JSON.stringify({type:"data",data:btoa(c)}))}}close(){this.socket.close()}}function Nt(e){return e==="mac"||e==="linux"||e==="windows"}function Et(e){const s=e==="mac"?[65513,"MetaLeft"]:[65507,"ControlLeft"],m=e==="mac"?s:[65515,"MetaLeft"];return{escape:[[65307,"Escape"]],enter:[[65293,"Enter"]],backspace:[[65288,"Backspace"]],tab:[e==="mac"?s:[65513,"AltLeft"],[65289,"Tab"]],search:e==="mac"?[m,[32,"Space"]]:[m],copy:[s,[99,"KeyC"]],paste:[s,[118,"KeyV"]],up:[[65362,"ArrowUp"]],down:[[65364,"ArrowDown"]],left:[[65361,"ArrowLeft"]],right:[[65363,"ArrowRight"]]}}function kt(e){const s=e;return{size:()=>({width:s._fbWidth,height:s._fbHeight}),surface:()=>s._canvas,send:(m,i,h)=>{const c=s._display.scale,x=(m-s._display.absX(0))*c,l=(i-s._display.absY(0))*c;s._mousePos={x,y:l},s._mouseMoveTimer!==null&&clearTimeout(s._mouseMoveTimer),s._mouseMoveTimer=null,s._mouseButtonMask=h,s._mouseLastMoveTime=Date.now(),s._sendMouse(x,l,h)}}}const rt="termdock:computer-touch-mode:v1";function St(){try{const e=localStorage.getItem(rt);if(e==="trackpad"||e==="direct")return e}catch{}return navigator.maxTouchPoints>0&&window.matchMedia("(any-pointer: coarse)").matches?"trackpad":"direct"}function Lt(e){try{localStorage.setItem(rt,e)}catch{}}const Tt=8,At=300,_t=450,Re=18,je=(e,s)=>Math.max(0,Math.min(e,Math.max(0,s-1)));function Rt(e,s,m,i){const h=new AbortController,c=new Map;let x=0,l=0,R=!1,d=!1,V=!1,H=0,D=0,P,z=!1,w=!0,U=!0,C,j=!1;const Y=()=>{const n=s.size(),a=i.current??={x:n.width/2,y:n.height/2};return a.x=je(a.x,n.width),a.y=je(a.y,n.height),a};let O;const ee=()=>{const n=s.size();if((!O||O.width!==n.width||O.height!==n.height)&&(U=!0),!U&&O)return O;const a=s.surface(),g=e.getBoundingClientRect(),k=a.getBoundingClientRect(),b=[];for(let f=a.parentElement;f&&f!==e;f=f.parentElement){const K=getComputedStyle(f),T=/auto|scroll/.test(K.overflowX)?Math.max(0,f.scrollWidth-f.clientWidth):0,te=/auto|scroll/.test(K.overflowY)?Math.max(0,f.scrollHeight-f.clientHeight):0;if(!T&&!te)continue;const v=f.getBoundingClientRect();b.push({element:f,left:v.left-g.left,top:v.top-g.top,right:v.right-g.left,bottom:v.bottom-g.top,maxX:T,maxY:te})}return O={...n,left:k.left-g.left,top:k.top-g.top,scaleX:n.width&&k.width?k.width/n.width:1,scaleY:n.height&&k.height?k.height/n.height:1,viewportWidth:g.width,viewportHeight:g.height,clientLeft:g.left,clientTop:g.top,scrollers:b},U=!1,O},y=()=>{const n=ee(),a=Y();if(!n.width||!n.height||!w){m.hidden=!0;return}let g=n.left+a.x*n.scaleX,k=n.top+a.y*n.scaleY;for(const b of n.scrollers){if(b.maxX){const f=b.element.scrollLeft,K=g<b.left+20?g-b.left-20:g>b.right-20?g-b.right+20:0,T=Math.max(0,Math.min(b.maxX,f+K));f!==T&&(b.element.scrollLeft=T,g-=T-f,n.left-=T-f)}if(b.maxY){const f=b.element.scrollTop,K=k<b.top+20?k-b.top-20:k>b.bottom-20?k-b.bottom+20:0,T=Math.max(0,Math.min(b.maxY,f+K));f!==T&&(b.element.scrollTop=T,k-=T-f,n.top-=T-f)}}m.hidden=g<0||k<0||g>=n.viewportWidth||k>=n.viewportHeight,m.style.transform=`translate3d(${g}px, ${k}px, 0)`},N=(n=D)=>{const a=Y();s.send(Math.round(a.x),Math.round(a.y),n)},p=()=>{P=void 0,y(),z&&(z=!1,N());let n=0;for(;Math.abs(H)>=Re&&n++<8;){const a=H>0?16:8;N(a),N(0),H-=Math.sign(H)*Re}},E=()=>{j||(P??=requestAnimationFrame(p))},I=()=>{P!==void 0&&(cancelAnimationFrame(P),p())},L=()=>{clearTimeout(C),I(),D&&(D=0,N())},X=n=>{n.cancelable&&n.preventDefault(),n.stopImmediatePropagation()},B=()=>[...c.values()].reduce((n,a)=>n+a.y,0)/c.size,ne=n=>{if(!(n.pointerType!=="touch"&&n.pointerType!=="pen")){X(n),w=!0,E(),c.size||(x=performance.now(),l=0,R=!1,d=!1,V=!1,H=0),c.set(n.pointerId,{x:n.clientX,y:n.clientY,startX:n.clientX,startY:n.clientY}),l=Math.max(l,c.size);try{e.setPointerCapture(n.pointerId)}catch{}clearTimeout(C),c.size===1&&l===1?C=setTimeout(()=>{!j&&c.size===1&&!R&&!d&&(D=1,N())},_t):(L(),V=!0)}},xe=n=>{if(n.pointerType==="mouse"){const f=ee();i.current={x:je((n.clientX-f.clientLeft-f.left)/f.scaleX,f.width),y:je((n.clientY-f.clientTop-f.top)/f.scaleY,f.height)},w=!1,m.hidden=!0;return}const a=c.get(n.pointerId);if(!a)return;X(n);const g=B(),k=n.clientX-a.x,b=n.clientY-a.y;if(a.x=n.clientX,a.y=n.clientY,Math.hypot(a.x-a.startX,a.y-a.startY)>Tt&&(R=!0,clearTimeout(C)),c.size===2&&!d)H+=g-B(),Math.abs(H)>=Re&&(R=!0,E());else if(c.size===1&&!V&&!d){const f=Y(),K=O??ee();f.x+=k/K.scaleX,f.y+=b/K.scaleY,Y(),z=!0,E()}},me=n=>{if(!c.has(n.pointerId))return;X(n);const a=D!==0;n.type!=="pointerup"&&(d=!0),L(),c.delete(n.pointerId);try{e.hasPointerCapture(n.pointerId)&&e.releasePointerCapture(n.pointerId)}catch{}c.size||(H=0,!d&&!a&&!R&&l<=2&&performance.now()-x<=At&&(N(l===2?4:1),N(0)))},pe=()=>{d=!0,L();const n=[...c.keys()];c.clear(),H=0;for(const a of n)try{e.hasPointerCapture(a)&&e.releasePointerCapture(a)}catch{}},W={capture:!0,passive:!1,signal:h.signal};e.addEventListener("pointerdown",ne,W),e.addEventListener("pointermove",xe,W),e.addEventListener("pointerup",me,W),e.addEventListener("pointercancel",me,W),e.addEventListener("lostpointercapture",me,W);for(const n of["touchstart","touchmove","touchend","touchcancel","contextmenu"])e.addEventListener(n,X,W);const oe=()=>{U=!0,E()};e.addEventListener("scroll",oe,{capture:!0,signal:h.signal}),window.addEventListener("blur",pe,{signal:h.signal});const ge=()=>{document.hidden&&pe()};document.addEventListener("visibilitychange",ge,{signal:h.signal});const q=new ResizeObserver(oe);return q.observe(e),q.observe(s.surface()),y(),()=>{j||(j=!0,h.abort(),pe(),q.disconnect(),m.hidden=!0)}}function It(e,s){e=Math.max(1,e||1280),s=Math.max(1,s||800);const m=Math.max(1,640/e,480/s);return{width:Math.max(640,Math.min(2560,Math.round(e*m))),height:Math.max(480,Math.min(1600,Math.round(s*m)))}}function Mt({sendText:e,sendKey:s}){const{t:m}=et(),i=o.useRef(null),h=o.useRef(!1),c=o.useRef(null),[x,l]=o.useState(""),R=()=>{const d=i.current?.value||"";d&&e(d),i.current&&(i.current.value=""),l("")};return o.useEffect(()=>(i.current?.focus({preventScroll:!0}),()=>{c.current!==null&&cancelAnimationFrame(c.current)}),[]),t.jsx("input",{ref:i,tabIndex:-1,className:"pointer-events-none absolute left-0 top-0 h-px w-px border-0 p-0 text-base opacity-0","aria-label":m("computer.keyboardInput"),autoCapitalize:"none",autoCorrect:"off",autoComplete:"off",spellCheck:!1,maxLength:1024,value:x,onChange:d=>{l(d.target.value),!h.current&&c.current===null&&R()},onCompositionStart:()=>{h.current=!0},onCompositionEnd:()=>{h.current=!1,c.current!==null&&cancelAnimationFrame(c.current),c.current=requestAnimationFrame(()=>{c.current=null,R()})},onKeyDown:d=>{h.current||d.nativeEvent.isComposing||c.current!==null||(d.key==="Enter"||d.key==="Backspace"&&!d.currentTarget.value)&&(d.preventDefault(),s(d.key==="Enter"?"enter":"backspace"))}})}function Pt(e){let s=[],m=null;const i=new Map,h=()=>{m=null,s.splice(0,32).forEach(c=>{e(c),c[2]?i.set(c[0],c):i.delete(c[0])}),s.length&&(m=requestAnimationFrame(h))};return{send(c){s.push(...c),m===null&&h()},clear(){m!==null&&cancelAnimationFrame(m),m=null,s=[];const c=[...i.values()].reverse();i.clear();for(const[x,l]of c)try{e([x,l,!1])}catch{}}}}const ae="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",ie="min-h-11 w-full rounded-md border border-border bg-background px-2 text-sm outline-none focus:border-primary";function Ne(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 Dt(){const{t:e}=et(),[s,m]=o.useState(()=>Ce()?.targetPeerId??""),[i,h]=o.useState(null),{preferences:c,change:x,loaded:l,saveState:R,flush:d,retry:V,credentialKeys:H,loginState:D,credentialRequest:P}=Ct(s),z=c.target==="local",w=c[c.target],{host:U,platform:C,protocol:j,port:Y,domain:O,ignoreCert:ee,username:y}=w,N=j==="rdp"&&i?.rdpAvailable===!1,{viewOnly:p,fit:E}=c,I=w.rememberLogin&&H.includes(tt(w)),L=r=>x(u=>({...u,[u.target]:{...u[u.target],...r}})),X=r=>L({username:r}),B=r=>L({domain:r}),ne=r=>{L({ignoreCert:r}),d()},xe=r=>L({port:r}),me=r=>{r&&(le.current(),ye.clear(),G(null)),x(u=>({...u,viewOnly:r})),d()},[pe,W]=o.useState(!1),oe=Et(C),ge=C==="mac"?"⌘V":"Ctrl+V",[q,n]=o.useState(""),[a,g]=o.useState("idle"),[k,b]=o.useState(null),[f,K]=o.useState(""),[T,te]=o.useState(!1),[v,G]=o.useState(null),Ee=o.useRef(null),[we,Pe]=o.useState(""),[nt,be]=o.useState(!1),[ot,st]=o.useState(!1),[J,ct]=o.useState(St),De=o.useRef(null),Oe=o.useRef(null),le=o.useRef(()=>{}),[ze,at]=o.useState(_e),fe=o.useRef(!1),se=o.useRef(""),Fe=o.useRef(()=>{}),Ue=o.useRef(null),ke=o.useRef(null),ue=o.useMemo(()=>{const r=document.createElement("div");return r.className="h-full w-full min-h-0 overflow-hidden",r},[]),_=o.useRef(null),ye=o.useMemo(()=>Pt(([r,u,S])=>_.current?.sendKey(r,u,S)),[]),Se=o.useRef(null),re=o.useRef(0),Le=o.useRef(void 0),Q=o.useCallback(()=>{le.current(),ye.clear(),Oe.current=null,re.current++,clearTimeout(Le.current);const r=_.current;_.current=null,r?.disconnect(),Se.current?.close(),Se.current=null,ue.replaceChildren()},[ue,ye]);o.useLayoutEffect(()=>(ke.current?.appendChild(ue),()=>{ue.remove()}),[ue,T]),o.useEffect(()=>()=>Q(),[Q]),o.useEffect(()=>{const r=()=>{const u=_e();at(u),!u&&(fe.current=!1,se.current="",Q(),g("idle"),n(""),te(!1),G(null))};return window.addEventListener(Xe,r),()=>window.removeEventListener(Xe,r)},[Q]),o.useEffect(()=>{const r=()=>m(Ce()?.targetPeerId??"");return window.addEventListener(We,r),()=>window.removeEventListener(We,r)},[]),o.useEffect(()=>{Q(),fe.current=!1,se.current="",g("idle"),b(null),n(""),h(null),te(!1),G(null),W(!1),K(""),Pe(""),be(!1);const r=new AbortController;return fetch("/api/computer/status",{signal:r.signal}).then(async u=>{if(!u.ok)throw new Error(u.status===403?"API_NOT_ALLOWED":"COMPUTER_FAILED");return await u.json()}).then(u=>{r.signal.aborted||h(u)}).catch(u=>{r.signal.aborted||b(Ne(String(u)))}),()=>{r.abort(),Q()}},[s,Q]),o.useEffect(()=>{_.current&&(_.current.viewOnly=p)},[p]),o.useEffect(()=>{_.current&&(_.current.scaleViewport=E)},[E]),o.useEffect(()=>{_.current&&"pauseResize"in _.current&&(_.current.pauseResize=!!v)},[v]),o.useEffect(()=>{_.current&&"keyboardActive"in _.current&&(_.current.keyboardActive=v==="keyboard")},[v]);const $e=r=>{r===z||$||!l||(n(""),b(null),x(u=>({...u,target:r?"local":"remote"})),d())},Ve=()=>{fe.current=!0,se.current="",Q(),g("idle"),n(""),te(!1),G(null),be(!1)},He=async r=>{if(r?.preventDefault(),N)return;if(fe.current=!0,a==="credentials"&&_.current&&"sendCredentials"in _.current){se.current=q,_.current.sendCredentials({username:y,password:q}),g("connecting");return}if(!_e()||!l||!q&&!I)return;d(),Q(),b(null),K(""),g("connecting"),be(!1);const u=re.current,S=A=>{u===re.current&&(Q(),g("error"),b(A),G(null),se.current="",(A==="computer.authFailed"||A==="computer.permission"||A==="computer.loginExpired")&&n(""),I&&(A==="computer.authFailed"||A==="computer.loginExpired")&&P("forget",w).catch(()=>{}))};Le.current=setTimeout(()=>S("computer.timeout"),6e4);try{let A=q||await P("use",w);if(u!==re.current)return;se.current=A||"";let F;if(j==="rdp"){const{RdpSession:Z}=await qe(async()=>{const{RdpSession:Ae}=await import("./rdpSession-DJlNIbVk.js");return{RdpSession:Ae}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]));if(u!==re.current)return;const de=window.innerWidth<=640,ce=Ee.current?.getBoundingClientRect(),ve=It(de?window.innerWidth:ce?.width||1280,Math.max(1,(de?window.innerHeight:ce?.height||800)-100));F=new Z(ue,{host:U.trim(),port:Number(Y),username:y.trim(),password:A||"",domain:O.trim(),ignoreCert:ee,...ve},Ae=>S(Ne(Ae)))}else{const{default:Z}=await qe(async()=>{const{default:ve}=await import("./rfb-CxsXsMUX.js");return{default:ve}},[]);if(u!==re.current)return;const de=new jt(U.trim(),ve=>S(Ne(ve)));Se.current=de;const ce=new Z(ue,de,{shared:!0,credentials:{username:y.trim()||void 0,password:A}});ce.background="var(--chrome-bg)",ce.resizeSession=!1,ce.qualityLevel=6,ce.compressionLevel=2,F=ce}A=void 0,_.current=F,F.scaleViewport=E,F.viewOnly=p,F.addEventListener("connect",()=>{if(u!==re.current)return;clearTimeout(Le.current),g("connected"),n(""),window.innerWidth<=640&&(document.activeElement?.blur?.(),te(!0));const Z=se.current;se.current="",w.rememberLogin&&Z&&P("save",w,Z).catch(()=>{})}),F.addEventListener("credentialsrequired",Z=>{if(u!==re.current)return;const de=Z.detail.types;st(de.includes("username")),g("credentials")}),F.addEventListener("securityfailure",()=>S("computer.authFailed")),F.addEventListener("disconnect",()=>S("computer.disconnected")),F.addEventListener("desktopname",Z=>{u===re.current&&K(Z.detail.name)})}catch(A){S(Ne(String(A)))}},he=r=>{!_.current||a!=="connected"||p||ye.send([...r.map(([S,A])=>[S,A,!0]),...[...r].reverse().map(([S,A])=>[S,A,!1])])},M=a==="connected",$=a==="connecting"||a==="credentials";o.useEffect(()=>{const r=_.current,u=ke.current,S=De.current;if(!M||p||v&&v!=="keyboard"||J!=="trackpad"||!r||!u||!S)return;const A="pointerTarget"in r?r.pointerTarget:kt(r),F=Rt(u,A,S,Oe);return le.current=F,()=>{F(),le.current===F&&(le.current=()=>{})}},[M,p,J,T,v]);const Ye=r=>{r!==J&&(le.current(),ct(r),Lt(r))};Fe.current=()=>{He()},o.useEffect(()=>{ze&&l&&i&&!N&&c.autoConnect&&I&&a==="idle"&&!fe.current&&Fe.current()},[ze,l,i,N,c.autoConnect,I,a]);const Ke=()=>{fe.current=!0,P("forget",w).catch(()=>{})},Te=r=>{le.current(),G(u=>u===r?null:r)},it=r=>{if(!_.current||p)return;const u=[];for(const S of r){const A=S.codePointAt(0),F=S===`
3
- `?65293:S===" "?65289:A<256?A:16777216|A;u.push([F,null,!0],[F,null,!1])}ye.send(u)};o.useEffect(()=>{if(!M||v!=="keyboard"&&v!=="clipboard"||!T||!window.visualViewport)return;const r=window.visualViewport,u=Ee.current,S=()=>{u&&r.height>=160&&(u.style.height=`${r.height}px`,u.style.top=`${r.offsetTop}px`)};return S(),r.addEventListener("resize",S),r.addEventListener("scroll",S),()=>{r.removeEventListener("resize",S),r.removeEventListener("scroll",S),u&&(u.style.height="",u.style.top="")}},[M,v,T]);const Be=t.jsxs("div",{ref:Ee,className:`flex min-h-0 flex-col bg-surface text-foreground ${T?"fixed inset-0 z-modal-panel h-dvh pb-[env(safe-area-inset-bottom)] pt-[env(safe-area-inset-top)]":"relative h-full"}`,role:T?"dialog":void 0,"aria-modal":T||void 0,"aria-label":e("computer.title"),onKeyDown:r=>{r.stopPropagation(),r.key==="Escape"&&!r.nativeEvent.isComposing&&v&&(r.preventDefault(),G(null))},onKeyUp:r=>r.stopPropagation(),children:[t.jsxs("div",{className:"relative z-30 flex min-h-12 shrink-0 items-center gap-2 border-b border-border bg-surface px-3",children:[T&&t.jsx("button",{type:"button",className:"flex min-h-11 min-w-11 items-center justify-center",onClick:()=>{te(!1),G(null)},"aria-label":e("computer.exitFullscreen"),children:t.jsx(pt,{size:20})}),t.jsx(ut,{size:16,className:"shrink-0 text-muted-foreground"}),t.jsx("span",{className:"min-w-0 flex-1 truncate text-xs font-medium",children:M&&(f||(z?i?.hostname||Ce()?.serviceName:U))||e("computer.title")}),M&&t.jsx("span",{className:"text-[11px] text-primary",children:e("computer.connected")}),M&&D==="error"&&t.jsx("span",{role:"alert",className:"text-[11px] text-destructive",children:e("computer.loginSaveFailed")}),M&&R==="saving"&&t.jsx("span",{role:"status","aria-label":e("computer.settingsSaving"),title:e("computer.settingsSaving"),children:t.jsx(Ge,{size:12,className:"animate-spin text-muted-foreground"})}),M&&R==="error"&&t.jsxs("button",{type:"button",className:ae,title:e("computer.settingsSaveFailed"),"aria-label":e("computer.settingsSaveFailed"),onClick:V,children:["! ",e("computer.retry")]}),$&&t.jsxs("button",{type:"button",className:ae,onClick:Ve,children:[t.jsx(Je,{size:14}),e("computer.cancel")]}),M&&!T&&t.jsxs("button",{type:"button",className:"flex min-h-11 min-w-11 items-center justify-center gap-1 text-xs",onClick:()=>te(!0),"aria-label":e("computer.fullscreen"),children:[t.jsx(xt,{size:16}),e("computer.expand")]}),M&&t.jsx("button",{type:"button",className:"flex min-h-11 min-w-11 items-center justify-center",onClick:()=>Te("tools"),"aria-label":e("computer.tools"),"aria-expanded":v==="tools",children:t.jsx(yt,{size:18})})]}),!M&&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=>{He(r)},"aria-busy":a==="connecting",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 ${z?"bg-surface-2 text-foreground":"text-muted-foreground hover:bg-surface"}`,"aria-pressed":z,disabled:$||!i||!l,onClick:()=>$e(!0),children:e("computer.thisComputer")}),t.jsx("button",{type:"button",className:`min-h-11 rounded-md px-3 text-sm font-medium ${z?"text-muted-foreground hover:bg-surface":"bg-surface-2 text-foreground"}`,"aria-pressed":!z,disabled:$||!l,onClick:()=>$e(!1),children:e("computer.otherComputer")})]}),z?t.jsx("p",{className:"text-xs leading-relaxed text-muted-foreground",role:"status",children:i?e("computer.localService",{name:Ce()?.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:ie,value:U,disabled:$||!l,onChange:r=>{L({host:r.target.value,domain:"",ignoreCert:!1}),n(""),b(null)},placeholder:e("computer.hostPlaceholder"),onBlur:()=>{d()},autoCapitalize:"none",autoCorrect:"off",spellCheck:!1,required:!0,maxLength:253})]}),t.jsxs("p",{className:"text-xs text-muted-foreground",children:[C==="mac"?"macOS":C==="linux"?"Ubuntu / Linux":"Windows"," · ",j.toUpperCase()," · ",j==="rdp"?Y||"3389":"5900",p?` · ${e("computer.viewOnly")}`:""]}),t.jsxs("label",{className:"block space-y-1 text-xs",children:[t.jsx("span",{children:e(j==="rdp"?"computer.rdpUsername":"computer.username")}),t.jsx("input",{className:ie,value:y,disabled:a==="connecting"||!l,onChange:r=>X(r.target.value),onBlur:()=>{d()},autoCapitalize:"none",autoCorrect:"off",autoComplete:"off",required:j==="rdp"||a==="credentials"&&ot,maxLength:255})]}),t.jsxs("label",{className:"block space-y-1 text-xs",children:[t.jsx("span",{children:e("computer.password")}),t.jsx("input",{className:ie,type:"password",value:q,disabled:a==="connecting"||!l,onChange:r=>n(r.target.value),placeholder:I&&a!=="credentials"?e("computer.savedPassword"):void 0,autoComplete:"new-password",required:!I||a==="credentials",maxLength:1024})]}),t.jsx("p",{className:"text-[11px] leading-relaxed text-muted-foreground",children:e(j==="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:w.rememberLogin,disabled:$||!l||D==="saving",onChange:r=>{const u=r.target.checked;L({rememberLogin:u}),!u&&I?P("forget",{...w,rememberLogin:u}).catch(()=>{}):d()}}),e("computer.rememberLogin")]}),I&&t.jsx("button",{type:"button",className:"min-h-11 text-muted-foreground underline",disabled:$||D==="saving",onClick:Ke,children:e("computer.forgetLogin")})]}),D==="error"&&!k&&t.jsx("p",{role:"alert",className:"text-xs text-destructive",children:e("computer.loginSaveFailed")}),N&&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")})]}),a==="credentials"&&t.jsx("p",{className:"text-xs text-primary",children:e("computer.credentials")}),k&&t.jsxs("div",{role:"alert",className:"rounded-md bg-surface-2 p-3 text-xs leading-relaxed text-destructive",children:[e(k),k==="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:ee,onChange:r=>ne(r.target.checked)}),e("computer.trustCertificateHere")]}),a==="error"&&k!=="computer.rdpCertificate"&&t.jsx("button",{type:"button",className:"mt-1 block min-h-9 text-foreground underline",onClick:()=>{W(!0),requestAnimationFrame(()=>Ue.current?.scrollIntoView?.({block:"nearest",behavior:"smooth"}))},children:e("computer.checkSettings")})]}),t.jsxs("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:!l||N||a==="connecting"||D==="saving"||z&&!i||!U.trim()||!q&&(!I||a==="credentials")||j==="rdp"&&(!y.trim()||!Number.isInteger(Number(Y))||Number(Y)<1||Number(Y)>65535),children:[a==="connecting"&&t.jsx(Ge,{size:16,className:"animate-spin"}),e(a==="connecting"?"computer.connecting":a==="credentials"?"computer.authenticate":a==="error"?"computer.retryConnect":"computer.connect")]}),t.jsxs("details",{ref:Ue,className:"border-b border-border text-xs",open:pe,onToggle:r=>W(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:pe?"−":"+"})]}),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:ie,value:C,disabled:$||!l,onChange:r=>{Nt(r.target.value)&&L({platform:r.target.value,protocol:r.target.value==="mac"?"vnc":"rdp",ignoreCert:!1}),n(""),d()},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:ie,value:j,disabled:$||!l,onChange:r=>{L({protocol:r.target.value==="rdp"?"rdp":"vnc"}),n(""),b(null),d()},children:[t.jsx("option",{value:"rdp",children:"RDP"}),t.jsx("option",{value:"vnc",children:"VNC"})]})]})]}),j==="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:ie,type:"number",min:1,max:65535,step:1,value:Y,disabled:$||!l,onBlur:()=>{d()},onChange:r=>xe(r.target.value)})]}),t.jsxs("label",{className:"block space-y-1",children:[t.jsx("span",{children:e("computer.domain")}),t.jsx("input",{className:ie,value:O,disabled:$||!l,onBlur:()=>{d()},onChange:r=>B(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:ee,disabled:$||!l,onChange:r=>ne(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:p,disabled:$||!l,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:c.autoConnect,disabled:$||!l,onChange:r=>{x(u=>({...u,autoConnect:r.target.checked})),d()}}),e("computer.autoConnect")]})]})]})]}),t.jsxs("p",{role:"status",className:"mt-2 text-[11px] leading-relaxed text-muted-foreground",children:[e(R==="saved"?"computer.settingsSaved":R==="error"?l?"computer.settingsSaveFailed":"computer.settingsLoadFailed":R==="loading"?"computer.settingsLoading":"computer.settingsSaving"),R==="error"&&t.jsx("button",{type:"button",className:"ml-2 min-h-9 text-primary underline",onClick:V,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(j==="rdp"?C==="linux"?"computer.rdpLinuxStep1":"computer.rdpStep1":C==="mac"?"computer.step1":C==="linux"?"computer.linuxStep1":"computer.windowsStep1")}),t.jsx("li",{children:e(j==="rdp"?"computer.rdpStep2":C==="mac"?"computer.step2":C==="linux"?"computer.linuxStep2":"computer.windowsStep2")}),t.jsx("li",{children:e("computer.step3")})]}),j==="vnc"&&C==="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
4
- x11vnc -storepasswd
5
- 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(j==="rdp"?"computer.rdpNetworkHint":"computer.networkHint")})]})]})}),M&&v==="tools"&&t.jsx("button",{type:"button",className:"absolute inset-x-0 bottom-14 top-12 z-20 bg-background/40","aria-label":e("computer.returnToDesktop"),onClick:()=>G(null)}),M&&t.jsxs("div",{hidden:v!=="tools",className:`${v==="tools"?"flex":"hidden"} absolute inset-x-3 top-14 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:()=>G(null),children:t.jsx(dt,{size:18})})]}),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 ${J===r?"bg-surface-2 text-foreground":"text-muted-foreground hover:bg-surface"}`,"aria-pressed":J===r,onClick:()=>Ye(r),children:e(r==="trackpad"?"computer.trackpadMode":"computer.directTouchMode")},r))})}),t.jsxs("label",{className:"flex min-h-9 items-center gap-1.5",children:[t.jsx("input",{type:"checkbox",checked:p,onChange:r=>me(r.target.checked)}),e("computer.viewOnly")]}),t.jsx("button",{type:"button",className:ae,onClick:()=>{x(r=>({...r,fit:!r.fit})),d()},children:e(E?"computer.actualSize":"computer.fit")}),t.jsxs("select",{className:`${ae} min-w-0 bg-surface`,"aria-label":e("computer.shortcuts"),value:"",disabled:p,onChange:r=>{he(oe[r.target.value]??[])},children:[t.jsx("option",{value:"",disabled:!0,children:e("computer.shortcuts")}),t.jsxs("option",{value:"tab",children:[C==="mac"?"⌘ Tab":"Alt+Tab"," · ",e("computer.switchApps")]}),t.jsxs("option",{value:"search",children:[C==="mac"?"⌘ Space":"Super / Win"," · ",e(C==="mac"?"computer.spotlight":"computer.systemSearch")]}),t.jsx("option",{value:"copy",children:C==="mac"?"⌘C":"Ctrl+C"}),t.jsx("option",{value:"paste",children:ge}),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:ae,disabled:D==="saving",onClick:Ke,children:e("computer.forgetLogin")}),t.jsxs("button",{type:"button",className:`${ae} ml-auto text-destructive`,onClick:Ve,children:[t.jsx(Je,{size:14}),e("computer.disconnect")]})]})]}),t.jsx("div",{ref:ke,"data-sidebar-gesture-ignore":"",className:`relative z-10 min-h-0 flex-1 overflow-hidden bg-[var(--chrome-bg)] ${M?"":"hidden"}`,style:{touchAction:M&&J==="trackpad"&&!p?"none":void 0},"aria-label":e("computer.remoteTitle"),children:M&&J==="trackpad"&&!p&&t.jsx("div",{ref:De,hidden:!0,"aria-hidden":"true",className:"pointer-events-none absolute left-0 top-0 z-20 h-5 w-5 will-change-transform",children:t.jsx(Qe,{size:20,strokeWidth:2,className:"fill-background text-primary drop-shadow"})})}),t.jsx("div",{hidden:v!=="tools",children:M&&!p&&t.jsx("p",{className:"shrink-0 border-t border-border px-2 py-1 text-[10px] leading-relaxed text-muted-foreground",children:e(J==="trackpad"?"computer.trackpadHint":"computer.directTouchHint")})}),M&&v==="keyboard"&&!p&&t.jsx(Mt,{sendText:it,sendKey:r=>he(oe[r])}),M&&v==="clipboard"&&!p&&t.jsxs("form",{className:"shrink-0 space-y-2 border-t border-border p-3",onSubmit:r=>{if(r.preventDefault(),!(!we||!_.current))try{_.current.clipboardPasteFrom(we),be(!0)}catch{b("computer.clipboardFailed")}},children:[t.jsx("textarea",{className:`${ie} min-w-0 resize-none py-2 text-base`,rows:2,"aria-label":e("computer.clipboard"),placeholder:e("computer.clipboardPlaceholder"),value:we,onChange:r=>{Pe(r.target.value),be(!1)},maxLength:16384}),t.jsxs("div",{className:"flex gap-2",children:[t.jsx("button",{type:"submit",className:`${ae} min-h-11 flex-1`,disabled:!we,children:e("computer.clipboard")}),t.jsx("button",{type:"button",className:`${ae} min-h-11`,onClick:()=>he(oe.paste),children:ge})]}),t.jsx("p",{role:"status",className:"text-[10px] leading-relaxed text-muted-foreground",children:nt?e("computer.clipboardSent"):e("computer.clipboardHint",{shortcut:ge})}),k&&t.jsx("p",{role:"alert",className:"text-xs text-destructive",children:e(k)})]}),M&&t.jsxs("div",{className:`relative z-30 grid shrink-0 ${v==="keyboard"?"grid-cols-5":"grid-cols-4"} border-t border-border bg-surface px-1 py-1 text-[11px]`,children:[t.jsxs("button",{type:"button",className:`flex min-h-11 flex-col items-center justify-center gap-0.5 rounded-md ${v==="keyboard"?"bg-surface-2 text-primary":""}`,disabled:p,onClick:()=>Te("keyboard"),"aria-pressed":v==="keyboard",children:[t.jsx(ft,{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 ${v==="clipboard"?"bg-surface-2 text-primary":""}`,disabled:p,onClick:()=>Te("clipboard"),"aria-pressed":v==="clipboard",children:[t.jsx(ht,{size:18}),e("computer.clipboardTool")]}),v==="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(oe.backspace),children:"⌫"}),t.jsx("button",{type:"button",className:"min-h-11 rounded-md text-lg",onPointerDown:r=>r.preventDefault(),onClick:()=>he(oe.enter),children:"↵"})]}):t.jsxs(t.Fragment,{children:[t.jsxs("button",{type:"button",className:"flex min-h-11 flex-col items-center justify-center gap-0.5 rounded-md",onClick:()=>{x(r=>({...r,fit:!r.fit})),d()},children:[t.jsx(wt,{size:18}),e(E?"computer.zoom":"computer.fit")]}),t.jsxs("button",{type:"button",className:"flex min-h-11 flex-col items-center justify-center gap-0.5 rounded-md",disabled:p,onClick:()=>Ye(J==="trackpad"?"direct":"trackpad"),"aria-label":e("computer.switchTouchMode"),children:[t.jsx(Qe,{size:18}),e(J==="trackpad"?"computer.trackpadMode":"computer.directTouchMode")]})]})]})]});return T?mt.createPortal(Be,document.body):Be}const Ht=Object.freeze(Object.defineProperty({__proto__:null,default:Dt},Symbol.toStringTag,{value:"Module"}));export{Ht as C,It as c};