termdock 1.4.356 → 1.4.357

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 (489) hide show
  1. package/README.md +22 -4
  2. package/dist/client/assets/AndroidMirrorView-BGagwKtL.js +3 -0
  3. package/dist/client/assets/AndroidMirrorView-BGagwKtL.js.br +0 -0
  4. package/dist/client/assets/AndroidMirrorView-BGagwKtL.js.gz +0 -0
  5. package/dist/client/assets/App-DpMhxwYW.js +178 -0
  6. package/dist/client/assets/App-DpMhxwYW.js.br +0 -0
  7. package/dist/client/assets/App-DpMhxwYW.js.gz +0 -0
  8. package/dist/client/assets/ArchitecturePanel-Bd_l74EC.js +9 -0
  9. package/dist/client/assets/ArchitecturePanel-Bd_l74EC.js.br +0 -0
  10. package/dist/client/assets/ArchitecturePanel-Bd_l74EC.js.gz +0 -0
  11. package/dist/client/assets/{ChangeWalkthroughPanel-DO_zJfZr.js → ChangeWalkthroughPanel-6DN-2BdR.js} +2 -2
  12. package/dist/client/assets/ChangeWalkthroughPanel-6DN-2BdR.js.br +0 -0
  13. package/dist/client/assets/ChangeWalkthroughPanel-6DN-2BdR.js.gz +0 -0
  14. package/dist/client/assets/{ChatRichContent-Cu1E1cJ8.js → ChatRichContent-DjwpmW7d.js} +29 -29
  15. package/dist/client/assets/ChatRichContent-DjwpmW7d.js.br +0 -0
  16. package/dist/client/assets/ChatRichContent-DjwpmW7d.js.gz +0 -0
  17. package/dist/client/assets/CollaborationMainWorkspace-DPTJ9pCt.js +1 -0
  18. package/dist/client/assets/CollaborationMainWorkspace-DPTJ9pCt.js.br +0 -0
  19. package/dist/client/assets/CollaborationMainWorkspace-DPTJ9pCt.js.gz +0 -0
  20. package/dist/client/assets/CollaborationTaskContent-Cbu1Bjl0.js +1 -0
  21. package/dist/client/assets/ComputerControlView-CwB-wQqB.js +6 -0
  22. package/dist/client/assets/ComputerControlView-CwB-wQqB.js.br +0 -0
  23. package/dist/client/assets/ComputerControlView-CwB-wQqB.js.gz +0 -0
  24. package/dist/client/assets/{DagPlayground-CPYwfryM.js → DagPlayground-DMn9Gyrw.js} +1 -1
  25. package/dist/client/assets/DagPlayground-DMn9Gyrw.js.br +0 -0
  26. package/dist/client/assets/DagPlayground-DMn9Gyrw.js.gz +0 -0
  27. package/dist/client/assets/{DiffLab-ptw96Q_4.js → DiffLab-YBWlCU2T.js} +1 -1
  28. package/dist/client/assets/DiffLab-YBWlCU2T.js.br +0 -0
  29. package/dist/client/assets/DiffLab-YBWlCU2T.js.gz +0 -0
  30. package/dist/client/assets/DiffReview-YOPDWqhv.js +1 -0
  31. package/dist/client/assets/DiffReview-YOPDWqhv.js.br +0 -0
  32. package/dist/client/assets/DiffReview-YOPDWqhv.js.gz +0 -0
  33. package/dist/client/assets/{DiffReviewLab-eEi3y-0G.js → DiffReviewLab-SYomq14c.js} +1 -1
  34. package/dist/client/assets/DiffReviewLab-SYomq14c.js.br +0 -0
  35. package/dist/client/assets/DiffReviewLab-SYomq14c.js.gz +0 -0
  36. package/dist/client/assets/{DiffViewer-DqcQxp4Q.js → DiffViewer-mh9cBl5v.js} +1 -1
  37. package/dist/client/assets/DiffViewer-mh9cBl5v.js.br +0 -0
  38. package/dist/client/assets/DiffViewer-mh9cBl5v.js.gz +0 -0
  39. package/dist/client/assets/{GitLoadingSkeleton-DYrDIDF1.js → GitLoadingSkeleton-DKRTc5sz.js} +1 -1
  40. package/dist/client/assets/GitLoadingSkeleton-DKRTc5sz.js.br +0 -0
  41. package/dist/client/assets/GitLoadingSkeleton-DKRTc5sz.js.gz +0 -0
  42. package/dist/client/assets/Markdown-C8OP1j-g.js +23 -0
  43. package/dist/client/assets/Markdown-C8OP1j-g.js.br +0 -0
  44. package/dist/client/assets/Markdown-C8OP1j-g.js.gz +0 -0
  45. package/dist/client/assets/Markdown-DKQhs57e.css +1 -0
  46. package/dist/client/assets/Markdown-DKQhs57e.css.br +0 -0
  47. package/dist/client/assets/Markdown-DKQhs57e.css.gz +0 -0
  48. package/dist/client/assets/{ModelPreview-DjtHLlqP.js → ModelPreview-CsZry3Wd.js} +3 -3
  49. package/dist/client/assets/ModelPreview-CsZry3Wd.js.br +0 -0
  50. package/dist/client/assets/ModelPreview-CsZry3Wd.js.gz +0 -0
  51. package/dist/client/assets/RecordingSaveDialog-CoRGi97z.js +1 -0
  52. package/dist/client/assets/RecordingSaveDialog-CoRGi97z.js.br +0 -0
  53. package/dist/client/assets/RecordingSaveDialog-CoRGi97z.js.gz +0 -0
  54. package/dist/client/assets/RightSidebar-DNY2kC6B.js +1662 -0
  55. package/dist/client/assets/RightSidebar-DNY2kC6B.js.br +0 -0
  56. package/dist/client/assets/RightSidebar-DNY2kC6B.js.gz +0 -0
  57. package/dist/client/assets/SessionChatView-DXNpYUrk.js +13 -0
  58. package/dist/client/assets/SessionChatView-DXNpYUrk.js.br +0 -0
  59. package/dist/client/assets/SessionChatView-DXNpYUrk.js.gz +0 -0
  60. package/dist/client/assets/SessionResourceSidebar-B_379HBJ.js +2 -0
  61. package/dist/client/assets/SessionResourceSidebar-B_379HBJ.js.br +0 -0
  62. package/dist/client/assets/SessionResourceSidebar-B_379HBJ.js.gz +0 -0
  63. package/dist/client/assets/TodoWorkspace-DfwGOAHB.js +1 -0
  64. package/dist/client/assets/TodoWorkspace-DfwGOAHB.js.br +0 -0
  65. package/dist/client/assets/TodoWorkspace-DfwGOAHB.js.gz +0 -0
  66. package/dist/client/assets/{abnfDiagram-VCTEODGH-Cvf_KWZ0.js → abnfDiagram-VCTEODGH-C9M0gnl-.js} +1 -1
  67. package/dist/client/assets/abnfDiagram-VCTEODGH-C9M0gnl-.js.br +0 -0
  68. package/dist/client/assets/abnfDiagram-VCTEODGH-C9M0gnl-.js.gz +0 -0
  69. package/dist/client/assets/app-CovJYQoW.js +37 -0
  70. package/dist/client/assets/app-CovJYQoW.js.br +0 -0
  71. package/dist/client/assets/app-CovJYQoW.js.gz +0 -0
  72. package/dist/client/assets/{arc-UvdowQOf.js → arc-q4wfkQcT.js} +1 -1
  73. package/dist/client/assets/arc-q4wfkQcT.js.br +0 -0
  74. package/dist/client/assets/arc-q4wfkQcT.js.gz +0 -0
  75. package/dist/client/assets/{architectureDiagram-5GKGNRK7-DotsbCCA.js → architectureDiagram-5GKGNRK7-CCuna3ab.js} +1 -1
  76. package/dist/client/assets/architectureDiagram-5GKGNRK7-CCuna3ab.js.br +0 -0
  77. package/dist/client/assets/architectureDiagram-5GKGNRK7-CCuna3ab.js.gz +0 -0
  78. package/dist/client/assets/{arrow-down-FGzRy9D-.js → arrow-down-WyzmLXwQ.js} +1 -1
  79. package/dist/client/assets/{blockDiagram-I7D4REHJ-CoOfSG4k.js → blockDiagram-I7D4REHJ-BXK68Qyt.js} +1 -1
  80. package/dist/client/assets/blockDiagram-I7D4REHJ-BXK68Qyt.js.br +0 -0
  81. package/dist/client/assets/blockDiagram-I7D4REHJ-BXK68Qyt.js.gz +0 -0
  82. package/dist/client/assets/{c4Diagram-7LVT6UL2-BAfjgs8B.js → c4Diagram-7LVT6UL2-BqwmmVmS.js} +1 -1
  83. package/dist/client/assets/c4Diagram-7LVT6UL2-BqwmmVmS.js.br +0 -0
  84. package/dist/client/assets/c4Diagram-7LVT6UL2-BqwmmVmS.js.gz +0 -0
  85. package/dist/client/assets/channel-Dd6WQGB7.js +1 -0
  86. package/dist/client/assets/{chevron-left-xqARwD-7.js → chevron-left-CxeWIsDK.js} +1 -1
  87. package/dist/client/assets/{chunk-2Q5K7J3B-DiiQ7BvG.js → chunk-2Q5K7J3B-esKGR38U.js} +1 -1
  88. package/dist/client/assets/{chunk-5VM5RSS4-CczSK8wW.js → chunk-5VM5RSS4-B3InxqDA.js} +1 -1
  89. package/dist/client/assets/{chunk-F27PBJKO-BI3Di4Ve.js → chunk-F27PBJKO-CjUVyF-E.js} +1 -1
  90. package/dist/client/assets/chunk-F27PBJKO-CjUVyF-E.js.br +0 -0
  91. package/dist/client/assets/chunk-F27PBJKO-CjUVyF-E.js.gz +0 -0
  92. package/dist/client/assets/{chunk-IMKFNOWR-Cvvs1wmn.js → chunk-IMKFNOWR-BR8mmBs7.js} +1 -1
  93. package/dist/client/assets/chunk-IMKFNOWR-BR8mmBs7.js.br +0 -0
  94. package/dist/client/assets/chunk-IMKFNOWR-BR8mmBs7.js.gz +0 -0
  95. package/dist/client/assets/{chunk-JWPE2WC7-lrJRD9WA.js → chunk-JWPE2WC7-CplXNOA7.js} +1 -1
  96. package/dist/client/assets/{chunk-POPQ4Y6H-CnPC9D8B.js → chunk-POPQ4Y6H-D0JWCGnb.js} +1 -1
  97. package/dist/client/assets/{chunk-SVP7TREG-BZfMhm64.js → chunk-SVP7TREG-BdJtJSmy.js} +1 -1
  98. package/dist/client/assets/chunk-SVP7TREG-BdJtJSmy.js.br +0 -0
  99. package/dist/client/assets/chunk-SVP7TREG-BdJtJSmy.js.gz +0 -0
  100. package/dist/client/assets/{chunk-TICWLB2K-DmkEaRK3.js → chunk-TICWLB2K-CoevFj8I.js} +1 -1
  101. package/dist/client/assets/chunk-TICWLB2K-CoevFj8I.js.br +0 -0
  102. package/dist/client/assets/chunk-TICWLB2K-CoevFj8I.js.gz +0 -0
  103. package/dist/client/assets/{chunk-XXDRQBXY-BP9Lccpe.js → chunk-XXDRQBXY-D7qYRhMH.js} +1 -1
  104. package/dist/client/assets/{circle-DGZOpG8V.js → circle-xgKDXpwG.js} +1 -1
  105. package/dist/client/assets/classDiagram-ZZMXUADV-BdIUq_D7.js +1 -0
  106. package/dist/client/assets/classDiagram-v2-VYDZK3BY-BdIUq_D7.js +1 -0
  107. package/dist/client/assets/{clipboard-rLx5CzbY.js → clipboard-DeK6pJD3.js} +1 -1
  108. package/dist/client/assets/clipboardText-BWOwer6N.js +1 -0
  109. package/dist/client/assets/clipboardText-BWOwer6N.js.br +0 -0
  110. package/dist/client/assets/clipboardText-BWOwer6N.js.gz +0 -0
  111. package/dist/client/assets/clipboardText-vX90C7eX.css +1 -0
  112. package/dist/client/assets/clipboardText-vX90C7eX.css.br +0 -0
  113. package/dist/client/assets/clipboardText-vX90C7eX.css.gz +0 -0
  114. package/dist/client/assets/{cose-bilkent-JH36ORCC-0xPYMc2z.js → cose-bilkent-JH36ORCC-CvnsiaWP.js} +1 -1
  115. package/dist/client/assets/cose-bilkent-JH36ORCC-CvnsiaWP.js.br +0 -0
  116. package/dist/client/assets/cose-bilkent-JH36ORCC-CvnsiaWP.js.gz +0 -0
  117. package/dist/client/assets/{cynefin-OW5HDTMX-BQ7-lCHm.js → cynefin-OW5HDTMX-BSGz8Olu.js} +1 -1
  118. package/dist/client/assets/cynefin-OW5HDTMX-BSGz8Olu.js.br +0 -0
  119. package/dist/client/assets/cynefin-OW5HDTMX-BSGz8Olu.js.gz +0 -0
  120. package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-CazHuSj1.js → cynefinDiagram-5FMLGOSQ-DYYT0AHs.js} +1 -1
  121. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-DYYT0AHs.js.br +0 -0
  122. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-DYYT0AHs.js.gz +0 -0
  123. package/dist/client/assets/{dagre-GXQ25YYZ-CJNgsyHQ.js → dagre-GXQ25YYZ-BM883MN7.js} +1 -1
  124. package/dist/client/assets/dagre-GXQ25YYZ-BM883MN7.js.br +0 -0
  125. package/dist/client/assets/dagre-GXQ25YYZ-BM883MN7.js.gz +0 -0
  126. package/dist/client/assets/{diagram-S7CK7UJ4-D4xXIj1P.js → diagram-S7CK7UJ4-CYnxXy7R.js} +1 -1
  127. package/dist/client/assets/diagram-S7CK7UJ4-CYnxXy7R.js.br +0 -0
  128. package/dist/client/assets/diagram-S7CK7UJ4-CYnxXy7R.js.gz +0 -0
  129. package/dist/client/assets/{diagram-UQ7AKVKN-BWhpL-35.js → diagram-UQ7AKVKN-UOIBVxRf.js} +1 -1
  130. package/dist/client/assets/diagram-UQ7AKVKN-UOIBVxRf.js.br +0 -0
  131. package/dist/client/assets/diagram-UQ7AKVKN-UOIBVxRf.js.gz +0 -0
  132. package/dist/client/assets/{diagram-VSXAHHWV-DG9A7EgJ.js → diagram-VSXAHHWV-CqTJzfmm.js} +1 -1
  133. package/dist/client/assets/diagram-VSXAHHWV-CqTJzfmm.js.br +0 -0
  134. package/dist/client/assets/diagram-VSXAHHWV-CqTJzfmm.js.gz +0 -0
  135. package/dist/client/assets/{diagram-VX7I27RA-L5PSvynM.js → diagram-VX7I27RA-T9Y88CFB.js} +1 -1
  136. package/dist/client/assets/diagram-VX7I27RA-T9Y88CFB.js.br +0 -0
  137. package/dist/client/assets/diagram-VX7I27RA-T9Y88CFB.js.gz +0 -0
  138. package/dist/client/assets/{diagram-Z3DM3KII-moBH7ruR.js → diagram-Z3DM3KII-kIQDy7E0.js} +1 -1
  139. package/dist/client/assets/diagram-Z3DM3KII-kIQDy7E0.js.br +0 -0
  140. package/dist/client/assets/diagram-Z3DM3KII-kIQDy7E0.js.gz +0 -0
  141. package/dist/client/assets/{ebnfDiagram-PWID7BFC-DEiGgcRP.js → ebnfDiagram-PWID7BFC-z_VqR_JE.js} +1 -1
  142. package/dist/client/assets/ebnfDiagram-PWID7BFC-z_VqR_JE.js.br +0 -0
  143. package/dist/client/assets/ebnfDiagram-PWID7BFC-z_VqR_JE.js.gz +0 -0
  144. package/dist/client/assets/{erDiagram-RLTQ6QDP-BboIleYi.js → erDiagram-RLTQ6QDP-0q52Z-pm.js} +1 -1
  145. package/dist/client/assets/erDiagram-RLTQ6QDP-0q52Z-pm.js.br +0 -0
  146. package/dist/client/assets/erDiagram-RLTQ6QDP-0q52Z-pm.js.gz +0 -0
  147. package/dist/client/assets/{external-link-AZ3wjUg5.js → external-link-CsydVmO1.js} +1 -1
  148. package/dist/client/assets/{flowDiagram-HODETNUW-COxz7Rda.js → flowDiagram-HODETNUW-BrGqcUWn.js} +1 -1
  149. package/dist/client/assets/flowDiagram-HODETNUW-BrGqcUWn.js.br +0 -0
  150. package/dist/client/assets/flowDiagram-HODETNUW-BrGqcUWn.js.gz +0 -0
  151. package/dist/client/assets/{ganttDiagram-EL5Y4UJY-_XdRvgyZ.js → ganttDiagram-EL5Y4UJY-CHAN6vQv.js} +1 -1
  152. package/dist/client/assets/ganttDiagram-EL5Y4UJY-CHAN6vQv.js.br +0 -0
  153. package/dist/client/assets/ganttDiagram-EL5Y4UJY-CHAN6vQv.js.gz +0 -0
  154. package/dist/client/assets/{git-compare-90v75Jal.js → git-compare-BmKAtQTt.js} +1 -1
  155. package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-CBb9xBNW.js → gitGraphDiagram-WWUBYQGX-C0ZV4FeB.js} +1 -1
  156. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-C0ZV4FeB.js.br +0 -0
  157. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-C0ZV4FeB.js.gz +0 -0
  158. package/dist/client/assets/index-DEAMSl55.css +1 -0
  159. package/dist/client/assets/index-DEAMSl55.css.br +0 -0
  160. package/dist/client/assets/index-DEAMSl55.css.gz +0 -0
  161. package/dist/client/assets/{infoDiagram-27XIBGKW-DjLdeNZi.js → infoDiagram-27XIBGKW-CrLj9y1o.js} +1 -1
  162. package/dist/client/assets/{ishikawaDiagram-5VMMS53U-Bcr-lhIE.js → ishikawaDiagram-5VMMS53U-BxGvUfLX.js} +1 -1
  163. package/dist/client/assets/ishikawaDiagram-5VMMS53U-BxGvUfLX.js.br +0 -0
  164. package/dist/client/assets/ishikawaDiagram-5VMMS53U-BxGvUfLX.js.gz +0 -0
  165. package/dist/client/assets/{journeyDiagram-3NMN7TZE-3vK6s9Pq.js → journeyDiagram-3NMN7TZE-rW9xlQ8G.js} +1 -1
  166. package/dist/client/assets/journeyDiagram-3NMN7TZE-rW9xlQ8G.js.br +0 -0
  167. package/dist/client/assets/journeyDiagram-3NMN7TZE-rW9xlQ8G.js.gz +0 -0
  168. package/dist/client/assets/{kanban-definition-UXKFOSKX-DqDYDca0.js → kanban-definition-UXKFOSKX-CFI5iv9R.js} +1 -1
  169. package/dist/client/assets/kanban-definition-UXKFOSKX-CFI5iv9R.js.br +0 -0
  170. package/dist/client/assets/kanban-definition-UXKFOSKX-CFI5iv9R.js.gz +0 -0
  171. package/dist/client/assets/{layout-C7_WwzCP.js → layout-Ct_an5XT.js} +1 -1
  172. package/dist/client/assets/layout-Ct_an5XT.js.br +0 -0
  173. package/dist/client/assets/layout-Ct_an5XT.js.gz +0 -0
  174. package/dist/client/assets/{linear-BQCRhl6P.js → linear-DpEFOA9l.js} +1 -1
  175. package/dist/client/assets/linear-DpEFOA9l.js.br +0 -0
  176. package/dist/client/assets/linear-DpEFOA9l.js.gz +0 -0
  177. package/dist/client/assets/{link-Cq14tNBm.js → link-34ChBc4F.js} +3 -3
  178. package/dist/client/assets/{link-Cq14tNBm.js.br → link-34ChBc4F.js.br} +0 -0
  179. package/dist/client/assets/link-34ChBc4F.js.gz +0 -0
  180. package/dist/client/assets/{list-tree-C281zrdg.js → list-tree-48dzbuUh.js} +1 -1
  181. package/dist/client/assets/{maximize-2-CovPxWdw.js → maximize-2-CbvSsu7O.js} +1 -1
  182. package/dist/client/assets/{mermaid.core-DGsccxt-.js → mermaid.core-DnVKnMmy.js} +5 -5
  183. package/dist/client/assets/mermaid.core-DnVKnMmy.js.br +0 -0
  184. package/dist/client/assets/mermaid.core-DnVKnMmy.js.gz +0 -0
  185. package/dist/client/assets/{mindmap-definition-YA3MSWOX-l0eF1PQE.js → mindmap-definition-YA3MSWOX-C6shupTY.js} +1 -1
  186. package/dist/client/assets/mindmap-definition-YA3MSWOX-C6shupTY.js.br +0 -0
  187. package/dist/client/assets/mindmap-definition-YA3MSWOX-C6shupTY.js.gz +0 -0
  188. package/dist/client/assets/{passwordBootstrap-B5VzheZz.js → passwordBootstrap-Doe50DSa.js} +1 -1
  189. package/dist/client/assets/{passwordBootstrap-B5VzheZz.js.br → passwordBootstrap-Doe50DSa.js.br} +0 -0
  190. package/dist/client/assets/passwordBootstrap-Doe50DSa.js.gz +0 -0
  191. package/dist/client/assets/{pegDiagram-XKGWAZYB-fRrxGIDM.js → pegDiagram-XKGWAZYB-CDcnrvKX.js} +1 -1
  192. package/dist/client/assets/pegDiagram-XKGWAZYB-CDcnrvKX.js.br +0 -0
  193. package/dist/client/assets/pegDiagram-XKGWAZYB-CDcnrvKX.js.gz +0 -0
  194. package/dist/client/assets/{pieDiagram-E7YTZNPT-B-EBa3qN.js → pieDiagram-E7YTZNPT-CrGc03Tg.js} +1 -1
  195. package/dist/client/assets/pieDiagram-E7YTZNPT-CrGc03Tg.js.br +0 -0
  196. package/dist/client/assets/pieDiagram-E7YTZNPT-CrGc03Tg.js.gz +0 -0
  197. package/dist/client/assets/{quadrantDiagram-AXDQQJYC-Dj4e6f4h.js → quadrantDiagram-AXDQQJYC-3-aldwKj.js} +1 -1
  198. package/dist/client/assets/quadrantDiagram-AXDQQJYC-3-aldwKj.js.br +0 -0
  199. package/dist/client/assets/quadrantDiagram-AXDQQJYC-3-aldwKj.js.gz +0 -0
  200. package/dist/client/assets/{quote-COQfrXhi.js → quote-B5GeKEq1.js} +1 -1
  201. package/dist/client/assets/{railroadDiagram-O6MQD6OU-CEMppxTC.js → railroadDiagram-O6MQD6OU-51uKwR2_.js} +1 -1
  202. package/dist/client/assets/railroadDiagram-O6MQD6OU-51uKwR2_.js.br +0 -0
  203. package/dist/client/assets/railroadDiagram-O6MQD6OU-51uKwR2_.js.gz +0 -0
  204. package/dist/client/assets/rdpSession-ocpkj4XY.js +1 -0
  205. package/dist/client/assets/rdpSession-ocpkj4XY.js.br +0 -0
  206. package/dist/client/assets/rdpSession-ocpkj4XY.js.gz +0 -0
  207. package/dist/client/assets/referenceSelection-fvfRDbgp.js +4 -0
  208. package/dist/client/assets/referenceSelection-fvfRDbgp.js.br +0 -0
  209. package/dist/client/assets/referenceSelection-fvfRDbgp.js.gz +0 -0
  210. package/dist/client/assets/{requirementDiagram-BXWQKSXE-Dri1k4_x.js → requirementDiagram-BXWQKSXE-CY6kp0_Y.js} +1 -1
  211. package/dist/client/assets/requirementDiagram-BXWQKSXE-CY6kp0_Y.js.br +0 -0
  212. package/dist/client/assets/requirementDiagram-BXWQKSXE-CY6kp0_Y.js.gz +0 -0
  213. package/dist/client/assets/{sankeyDiagram-P5KCCOFB-CMsL_tYL.js → sankeyDiagram-P5KCCOFB-BsA0NkHG.js} +1 -1
  214. package/dist/client/assets/sankeyDiagram-P5KCCOFB-BsA0NkHG.js.br +0 -0
  215. package/dist/client/assets/sankeyDiagram-P5KCCOFB-BsA0NkHG.js.gz +0 -0
  216. package/dist/client/assets/{search-Dg6HWygj.js → search-CbpNLSpd.js} +1 -1
  217. package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-4_4hZtOd.js → sequenceDiagram-WJ2MYXX4-BDzn7N2D.js} +1 -1
  218. package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-4_4hZtOd.js.br → sequenceDiagram-WJ2MYXX4-BDzn7N2D.js.br} +0 -0
  219. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-BDzn7N2D.js.gz +0 -0
  220. package/dist/client/assets/{sizeCapture-INFHLROL-3QA6qj2j.js → sizeCapture-INFHLROL-gxtam7nc.js} +1 -1
  221. package/dist/client/assets/sizeCapture-INFHLROL-gxtam7nc.js.br +0 -0
  222. package/dist/client/assets/sizeCapture-INFHLROL-gxtam7nc.js.gz +0 -0
  223. package/dist/client/assets/{stateDiagram-D77RDMKH-90IFPhD9.js → stateDiagram-D77RDMKH-C4XjYLZR.js} +1 -1
  224. package/dist/client/assets/stateDiagram-D77RDMKH-C4XjYLZR.js.br +0 -0
  225. package/dist/client/assets/stateDiagram-D77RDMKH-C4XjYLZR.js.gz +0 -0
  226. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-BfHWFf-I.js +1 -0
  227. package/dist/client/assets/{sun-BAMMjiA8.js → sun-CMXn_ntS.js} +1 -1
  228. package/dist/client/assets/{swimlanes-42K2YHIH-BuHieVWC.js → swimlanes-42K2YHIH--a1wkQO8.js} +1 -1
  229. package/dist/client/assets/swimlanes-42K2YHIH--a1wkQO8.js.br +0 -0
  230. package/dist/client/assets/swimlanes-42K2YHIH--a1wkQO8.js.gz +0 -0
  231. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-DsiDF1XD.js +8 -0
  232. package/dist/client/assets/swiper-CTPycjLq.js +1 -0
  233. package/dist/client/assets/swiper-CTPycjLq.js.br +0 -0
  234. package/dist/client/assets/swiper-CTPycjLq.js.gz +0 -0
  235. package/dist/client/assets/{terminal-Dea8wJF3.js → terminal-DaiFCKy_.js} +7 -7
  236. package/dist/client/assets/terminal-DaiFCKy_.js.br +0 -0
  237. package/dist/client/assets/terminal-DaiFCKy_.js.gz +0 -0
  238. package/dist/client/assets/{timeline-definition-24CTP7MA-C7FpaNwf.js → timeline-definition-24CTP7MA-DFmXXUuU.js} +1 -1
  239. package/dist/client/assets/timeline-definition-24CTP7MA-DFmXXUuU.js.br +0 -0
  240. package/dist/client/assets/timeline-definition-24CTP7MA-DFmXXUuU.js.gz +0 -0
  241. package/dist/client/assets/triangle-alert-DgGU_xB4.js +1 -0
  242. package/dist/client/assets/{unplug-DN2SNXUL.js → unplug-CnZtWzVW.js} +1 -1
  243. package/dist/client/assets/use-gesture-react.esm-DHU0wi7Q.js +1 -0
  244. package/dist/client/assets/use-gesture-react.esm-DHU0wi7Q.js.br +0 -0
  245. package/dist/client/assets/use-gesture-react.esm-DHU0wi7Q.js.gz +0 -0
  246. package/dist/client/assets/{vennDiagram-4TSXK5OY-CxoHHVcs.js → vennDiagram-4TSXK5OY-DgR4zroQ.js} +1 -1
  247. package/dist/client/assets/vennDiagram-4TSXK5OY-DgR4zroQ.js.br +0 -0
  248. package/dist/client/assets/vennDiagram-4TSXK5OY-DgR4zroQ.js.gz +0 -0
  249. package/dist/client/assets/{videoCompression-rr2lu3uy.js → videoCompression-CcffRZdP.js} +1 -1
  250. package/dist/client/assets/videoCompression-CcffRZdP.js.br +0 -0
  251. package/dist/client/assets/videoCompression-CcffRZdP.js.gz +0 -0
  252. package/dist/client/assets/{wardleyDiagram-VM6X3IG4-B4Hsh-Ad.js → wardleyDiagram-VM6X3IG4-CY4SVUkf.js} +1 -1
  253. package/dist/client/assets/wardleyDiagram-VM6X3IG4-CY4SVUkf.js.br +0 -0
  254. package/dist/client/assets/wardleyDiagram-VM6X3IG4-CY4SVUkf.js.gz +0 -0
  255. package/dist/client/assets/{xychartDiagram-S5SC5T6Z-CghzsxQv.js → xychartDiagram-S5SC5T6Z-PblQhR-b.js} +1 -1
  256. package/dist/client/assets/xychartDiagram-S5SC5T6Z-PblQhR-b.js.br +0 -0
  257. package/dist/client/assets/xychartDiagram-S5SC5T6Z-PblQhR-b.js.gz +0 -0
  258. package/dist/client/index.html +3 -3
  259. package/dist/client/index.html.br +0 -0
  260. package/dist/client/index.html.gz +0 -0
  261. package/dist/client/sw-encrypted-background.js +1 -1
  262. package/dist/client/sw-encrypted-background.js.br +0 -0
  263. package/dist/client/sw-encrypted-background.js.gz +0 -0
  264. package/dist/client/sw.js +1 -1
  265. package/dist/client/sw.js.br +0 -0
  266. package/dist/client/sw.js.gz +0 -0
  267. package/dist/server/agent/collaborationPeerTransport.js +14 -69
  268. package/dist/server/agent/collaborationStore.js +5 -0
  269. package/dist/server/agent/installers.js +89 -33
  270. package/dist/server/agent/integrationServer.js +31 -2
  271. package/dist/server/agent/pluginPackages.js +51 -22
  272. package/dist/server/agent/sessionChatRoutes.js +45 -7
  273. package/dist/server/agentHook.js +56 -12
  274. package/dist/server/android/adb.js +24 -31
  275. package/dist/server/cli.js +52 -110
  276. package/dist/server/entry.js +17 -23
  277. package/dist/server/federation/cli.js +13 -47
  278. package/dist/server/federation/connectionErrors.js +37 -0
  279. package/dist/server/federation/connectionModel.js +83 -0
  280. package/dist/server/federation/desktopTargets.js +35 -13
  281. package/dist/server/federation/directRoutes.js +28 -36
  282. package/dist/server/federation/directTargetRegistry.js +106 -0
  283. package/dist/server/federation/httpUploadLimit.js +8 -0
  284. package/dist/server/federation/relay.js +13 -6
  285. package/dist/server/federation/relayTransport.js +147 -0
  286. package/dist/server/federation/routeAccess.js +5 -3
  287. package/dist/server/federation/runtime.js +4 -2
  288. package/dist/server/federation/selfRelay.js +10 -59
  289. package/dist/server/federation/serviceTransport.js +123 -0
  290. package/dist/server/federation/streamLimits.js +3 -0
  291. package/dist/server/federation/trustedCa.js +61 -0
  292. package/dist/server/routes/android.js +5 -7
  293. package/dist/server/routes/terminal.js +149 -111
  294. package/dist/server/shared/androidDevices.js +64 -0
  295. package/dist/server/shared/programStatus.js +174 -0
  296. package/dist/server/shared/shareResources.js +3 -2
  297. package/dist/server/todos/routes.js +36 -0
  298. package/dist/server/todos/store.js +31 -1
  299. package/dist/server/utils/bootCheck.js +41 -271
  300. package/dist/server/utils/localHttpsSetup.js +257 -0
  301. package/dist/server/utils/oscBuffer.js +9 -0
  302. package/dist/server/utils/sessionDisplayName.js +11 -9
  303. package/dist/server/utils/settings.js +6 -3
  304. package/dist/server/utils/tmuxDisplayGeometry.js +54 -0
  305. package/dist/server/utils/tmuxObserverSize.js +26 -0
  306. package/docs/integrations.md +2 -1
  307. package/package.json +5 -1
  308. package/runtime-manifest.json +3 -3
  309. package/scripts/install-utils.cjs +81 -0
  310. package/scripts/postinstall.mjs +19 -106
  311. package/dist/client/assets/AndroidMirrorView-DW9oRr0w.js +0 -3
  312. package/dist/client/assets/AndroidMirrorView-DW9oRr0w.js.br +0 -0
  313. package/dist/client/assets/AndroidMirrorView-DW9oRr0w.js.gz +0 -0
  314. package/dist/client/assets/App-DEZ2i9ZZ.js +0 -178
  315. package/dist/client/assets/App-DEZ2i9ZZ.js.br +0 -0
  316. package/dist/client/assets/App-DEZ2i9ZZ.js.gz +0 -0
  317. package/dist/client/assets/ArchitecturePanel-Bf4b-6An.js +0 -9
  318. package/dist/client/assets/ArchitecturePanel-Bf4b-6An.js.br +0 -0
  319. package/dist/client/assets/ArchitecturePanel-Bf4b-6An.js.gz +0 -0
  320. package/dist/client/assets/ChangeWalkthroughPanel-DO_zJfZr.js.br +0 -0
  321. package/dist/client/assets/ChangeWalkthroughPanel-DO_zJfZr.js.gz +0 -0
  322. package/dist/client/assets/ChatRichContent-Cu1E1cJ8.js.br +0 -0
  323. package/dist/client/assets/ChatRichContent-Cu1E1cJ8.js.gz +0 -0
  324. package/dist/client/assets/CollaborationMainWorkspace-BhmpSEbf.js +0 -1
  325. package/dist/client/assets/CollaborationMainWorkspace-BhmpSEbf.js.br +0 -0
  326. package/dist/client/assets/CollaborationMainWorkspace-BhmpSEbf.js.gz +0 -0
  327. package/dist/client/assets/CollaborationTaskContent-CX0Aqdi2.js +0 -2
  328. package/dist/client/assets/ComputerControlView-DjQLzn10.js +0 -6
  329. package/dist/client/assets/ComputerControlView-DjQLzn10.js.br +0 -0
  330. package/dist/client/assets/ComputerControlView-DjQLzn10.js.gz +0 -0
  331. package/dist/client/assets/DagPlayground-CPYwfryM.js.br +0 -0
  332. package/dist/client/assets/DagPlayground-CPYwfryM.js.gz +0 -0
  333. package/dist/client/assets/DiffLab-ptw96Q_4.js.br +0 -0
  334. package/dist/client/assets/DiffLab-ptw96Q_4.js.gz +0 -0
  335. package/dist/client/assets/DiffReview-12E2zWyL.js +0 -1
  336. package/dist/client/assets/DiffReview-12E2zWyL.js.br +0 -0
  337. package/dist/client/assets/DiffReview-12E2zWyL.js.gz +0 -0
  338. package/dist/client/assets/DiffReviewLab-eEi3y-0G.js.br +0 -0
  339. package/dist/client/assets/DiffReviewLab-eEi3y-0G.js.gz +0 -0
  340. package/dist/client/assets/DiffViewer-DqcQxp4Q.js.br +0 -0
  341. package/dist/client/assets/DiffViewer-DqcQxp4Q.js.gz +0 -0
  342. package/dist/client/assets/GitLoadingSkeleton-DYrDIDF1.js.br +0 -0
  343. package/dist/client/assets/GitLoadingSkeleton-DYrDIDF1.js.gz +0 -0
  344. package/dist/client/assets/MarkdownPreview-CsJGsDRL.js +0 -19
  345. package/dist/client/assets/MarkdownPreview-CsJGsDRL.js.br +0 -0
  346. package/dist/client/assets/MarkdownPreview-CsJGsDRL.js.gz +0 -0
  347. package/dist/client/assets/ModelPreview-DjtHLlqP.js.br +0 -0
  348. package/dist/client/assets/ModelPreview-DjtHLlqP.js.gz +0 -0
  349. package/dist/client/assets/RecordingSaveDialog-DUtwgIME.js +0 -1
  350. package/dist/client/assets/RecordingSaveDialog-DUtwgIME.js.br +0 -0
  351. package/dist/client/assets/RecordingSaveDialog-DUtwgIME.js.gz +0 -0
  352. package/dist/client/assets/RightSidebar-BltjUFwI.js +0 -1662
  353. package/dist/client/assets/RightSidebar-BltjUFwI.js.br +0 -0
  354. package/dist/client/assets/RightSidebar-BltjUFwI.js.gz +0 -0
  355. package/dist/client/assets/SessionChatView-CdKfHRp8.js +0 -13
  356. package/dist/client/assets/SessionChatView-CdKfHRp8.js.br +0 -0
  357. package/dist/client/assets/SessionChatView-CdKfHRp8.js.gz +0 -0
  358. package/dist/client/assets/SessionChatView-D8GoESjb.css +0 -1
  359. package/dist/client/assets/SessionChatView-D8GoESjb.css.br +0 -0
  360. package/dist/client/assets/SessionChatView-D8GoESjb.css.gz +0 -0
  361. package/dist/client/assets/SessionResourceSidebar-DmQOydhf.js +0 -2
  362. package/dist/client/assets/SessionResourceSidebar-DmQOydhf.js.br +0 -0
  363. package/dist/client/assets/SessionResourceSidebar-DmQOydhf.js.gz +0 -0
  364. package/dist/client/assets/TodoWorkspace-Bh1C035B.js +0 -1
  365. package/dist/client/assets/TodoWorkspace-Bh1C035B.js.br +0 -0
  366. package/dist/client/assets/TodoWorkspace-Bh1C035B.js.gz +0 -0
  367. package/dist/client/assets/abnfDiagram-VCTEODGH-Cvf_KWZ0.js.br +0 -0
  368. package/dist/client/assets/abnfDiagram-VCTEODGH-Cvf_KWZ0.js.gz +0 -0
  369. package/dist/client/assets/app-DuUnqxq-.js +0 -37
  370. package/dist/client/assets/app-DuUnqxq-.js.br +0 -0
  371. package/dist/client/assets/app-DuUnqxq-.js.gz +0 -0
  372. package/dist/client/assets/arc-UvdowQOf.js.br +0 -0
  373. package/dist/client/assets/arc-UvdowQOf.js.gz +0 -0
  374. package/dist/client/assets/architectureDiagram-5GKGNRK7-DotsbCCA.js.br +0 -0
  375. package/dist/client/assets/architectureDiagram-5GKGNRK7-DotsbCCA.js.gz +0 -0
  376. package/dist/client/assets/arrow-up-DNkfesW0.js +0 -1
  377. package/dist/client/assets/blockDiagram-I7D4REHJ-CoOfSG4k.js.br +0 -0
  378. package/dist/client/assets/blockDiagram-I7D4REHJ-CoOfSG4k.js.gz +0 -0
  379. package/dist/client/assets/c4Diagram-7LVT6UL2-BAfjgs8B.js.br +0 -0
  380. package/dist/client/assets/c4Diagram-7LVT6UL2-BAfjgs8B.js.gz +0 -0
  381. package/dist/client/assets/channel-BzMU9Wks.js +0 -1
  382. package/dist/client/assets/chunk-F27PBJKO-BI3Di4Ve.js.br +0 -0
  383. package/dist/client/assets/chunk-F27PBJKO-BI3Di4Ve.js.gz +0 -0
  384. package/dist/client/assets/chunk-IMKFNOWR-Cvvs1wmn.js.br +0 -0
  385. package/dist/client/assets/chunk-IMKFNOWR-Cvvs1wmn.js.gz +0 -0
  386. package/dist/client/assets/chunk-SVP7TREG-BZfMhm64.js.br +0 -0
  387. package/dist/client/assets/chunk-SVP7TREG-BZfMhm64.js.gz +0 -0
  388. package/dist/client/assets/chunk-TICWLB2K-DmkEaRK3.js.br +0 -0
  389. package/dist/client/assets/chunk-TICWLB2K-DmkEaRK3.js.gz +0 -0
  390. package/dist/client/assets/classDiagram-ZZMXUADV-DtAtEoWU.js +0 -1
  391. package/dist/client/assets/classDiagram-v2-VYDZK3BY-DtAtEoWU.js +0 -1
  392. package/dist/client/assets/clipboardText-cZXParp1.js +0 -1
  393. package/dist/client/assets/clipboardText-cZXParp1.js.br +0 -0
  394. package/dist/client/assets/clipboardText-cZXParp1.js.gz +0 -0
  395. package/dist/client/assets/cose-bilkent-JH36ORCC-0xPYMc2z.js.br +0 -0
  396. package/dist/client/assets/cose-bilkent-JH36ORCC-0xPYMc2z.js.gz +0 -0
  397. package/dist/client/assets/cynefin-OW5HDTMX-BQ7-lCHm.js.br +0 -0
  398. package/dist/client/assets/cynefin-OW5HDTMX-BQ7-lCHm.js.gz +0 -0
  399. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CazHuSj1.js.br +0 -0
  400. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CazHuSj1.js.gz +0 -0
  401. package/dist/client/assets/dagre-GXQ25YYZ-CJNgsyHQ.js.br +0 -0
  402. package/dist/client/assets/dagre-GXQ25YYZ-CJNgsyHQ.js.gz +0 -0
  403. package/dist/client/assets/diagram-S7CK7UJ4-D4xXIj1P.js.br +0 -0
  404. package/dist/client/assets/diagram-S7CK7UJ4-D4xXIj1P.js.gz +0 -0
  405. package/dist/client/assets/diagram-UQ7AKVKN-BWhpL-35.js.br +0 -0
  406. package/dist/client/assets/diagram-UQ7AKVKN-BWhpL-35.js.gz +0 -0
  407. package/dist/client/assets/diagram-VSXAHHWV-DG9A7EgJ.js.br +0 -0
  408. package/dist/client/assets/diagram-VSXAHHWV-DG9A7EgJ.js.gz +0 -0
  409. package/dist/client/assets/diagram-VX7I27RA-L5PSvynM.js.br +0 -0
  410. package/dist/client/assets/diagram-VX7I27RA-L5PSvynM.js.gz +0 -0
  411. package/dist/client/assets/diagram-Z3DM3KII-moBH7ruR.js.br +0 -0
  412. package/dist/client/assets/diagram-Z3DM3KII-moBH7ruR.js.gz +0 -0
  413. package/dist/client/assets/ebnfDiagram-PWID7BFC-DEiGgcRP.js.br +0 -0
  414. package/dist/client/assets/ebnfDiagram-PWID7BFC-DEiGgcRP.js.gz +0 -0
  415. package/dist/client/assets/erDiagram-RLTQ6QDP-BboIleYi.js.br +0 -0
  416. package/dist/client/assets/erDiagram-RLTQ6QDP-BboIleYi.js.gz +0 -0
  417. package/dist/client/assets/flowDiagram-HODETNUW-COxz7Rda.js.br +0 -0
  418. package/dist/client/assets/flowDiagram-HODETNUW-COxz7Rda.js.gz +0 -0
  419. package/dist/client/assets/ganttDiagram-EL5Y4UJY-_XdRvgyZ.js.br +0 -0
  420. package/dist/client/assets/ganttDiagram-EL5Y4UJY-_XdRvgyZ.js.gz +0 -0
  421. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-CBb9xBNW.js.br +0 -0
  422. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-CBb9xBNW.js.gz +0 -0
  423. package/dist/client/assets/index-nIgxJ6I3.css +0 -1
  424. package/dist/client/assets/index-nIgxJ6I3.css.br +0 -0
  425. package/dist/client/assets/index-nIgxJ6I3.css.gz +0 -0
  426. package/dist/client/assets/ishikawaDiagram-5VMMS53U-Bcr-lhIE.js.br +0 -0
  427. package/dist/client/assets/ishikawaDiagram-5VMMS53U-Bcr-lhIE.js.gz +0 -0
  428. package/dist/client/assets/journeyDiagram-3NMN7TZE-3vK6s9Pq.js.br +0 -0
  429. package/dist/client/assets/journeyDiagram-3NMN7TZE-3vK6s9Pq.js.gz +0 -0
  430. package/dist/client/assets/kanban-definition-UXKFOSKX-DqDYDca0.js.br +0 -0
  431. package/dist/client/assets/kanban-definition-UXKFOSKX-DqDYDca0.js.gz +0 -0
  432. package/dist/client/assets/layout-C7_WwzCP.js.br +0 -0
  433. package/dist/client/assets/layout-C7_WwzCP.js.gz +0 -0
  434. package/dist/client/assets/linear-BQCRhl6P.js.br +0 -0
  435. package/dist/client/assets/linear-BQCRhl6P.js.gz +0 -0
  436. package/dist/client/assets/link-Cq14tNBm.js.gz +0 -0
  437. package/dist/client/assets/loader-circle-Df0zpx5N.js +0 -1
  438. package/dist/client/assets/mermaid.core-DGsccxt-.js.br +0 -0
  439. package/dist/client/assets/mermaid.core-DGsccxt-.js.gz +0 -0
  440. package/dist/client/assets/mindmap-definition-YA3MSWOX-l0eF1PQE.js.br +0 -0
  441. package/dist/client/assets/mindmap-definition-YA3MSWOX-l0eF1PQE.js.gz +0 -0
  442. package/dist/client/assets/passwordBootstrap-B5VzheZz.js.gz +0 -0
  443. package/dist/client/assets/pegDiagram-XKGWAZYB-fRrxGIDM.js.br +0 -0
  444. package/dist/client/assets/pegDiagram-XKGWAZYB-fRrxGIDM.js.gz +0 -0
  445. package/dist/client/assets/pieDiagram-E7YTZNPT-B-EBa3qN.js.br +0 -0
  446. package/dist/client/assets/pieDiagram-E7YTZNPT-B-EBa3qN.js.gz +0 -0
  447. package/dist/client/assets/quadrantDiagram-AXDQQJYC-Dj4e6f4h.js.br +0 -0
  448. package/dist/client/assets/quadrantDiagram-AXDQQJYC-Dj4e6f4h.js.gz +0 -0
  449. package/dist/client/assets/railroadDiagram-O6MQD6OU-CEMppxTC.js.br +0 -0
  450. package/dist/client/assets/railroadDiagram-O6MQD6OU-CEMppxTC.js.gz +0 -0
  451. package/dist/client/assets/rdpSession-C5rS-ImV.js +0 -1
  452. package/dist/client/assets/rdpSession-C5rS-ImV.js.br +0 -0
  453. package/dist/client/assets/rdpSession-C5rS-ImV.js.gz +0 -0
  454. package/dist/client/assets/requirementDiagram-BXWQKSXE-Dri1k4_x.js.br +0 -0
  455. package/dist/client/assets/requirementDiagram-BXWQKSXE-Dri1k4_x.js.gz +0 -0
  456. package/dist/client/assets/sankeyDiagram-P5KCCOFB-CMsL_tYL.js.br +0 -0
  457. package/dist/client/assets/sankeyDiagram-P5KCCOFB-CMsL_tYL.js.gz +0 -0
  458. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-4_4hZtOd.js.gz +0 -0
  459. package/dist/client/assets/settings-2-iGqzPez0.js +0 -1
  460. package/dist/client/assets/sizeCapture-INFHLROL-3QA6qj2j.js.br +0 -0
  461. package/dist/client/assets/sizeCapture-INFHLROL-3QA6qj2j.js.gz +0 -0
  462. package/dist/client/assets/stateDiagram-D77RDMKH-90IFPhD9.js.br +0 -0
  463. package/dist/client/assets/stateDiagram-D77RDMKH-90IFPhD9.js.gz +0 -0
  464. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-CH-yvmL4.js +0 -1
  465. package/dist/client/assets/swimlanes-42K2YHIH-BuHieVWC.js.br +0 -0
  466. package/dist/client/assets/swimlanes-42K2YHIH-BuHieVWC.js.gz +0 -0
  467. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-P_rDqbtg.js +0 -8
  468. package/dist/client/assets/swiper-DJjq1TYT.js +0 -1
  469. package/dist/client/assets/swiper-DJjq1TYT.js.br +0 -0
  470. package/dist/client/assets/swiper-DJjq1TYT.js.gz +0 -0
  471. package/dist/client/assets/syntaxHighlight-Cz6TPDW9.js +0 -4
  472. package/dist/client/assets/syntaxHighlight-Cz6TPDW9.js.br +0 -0
  473. package/dist/client/assets/syntaxHighlight-Cz6TPDW9.js.gz +0 -0
  474. package/dist/client/assets/terminal-Dea8wJF3.js.br +0 -0
  475. package/dist/client/assets/terminal-Dea8wJF3.js.gz +0 -0
  476. package/dist/client/assets/timeline-definition-24CTP7MA-C7FpaNwf.js.br +0 -0
  477. package/dist/client/assets/timeline-definition-24CTP7MA-C7FpaNwf.js.gz +0 -0
  478. package/dist/client/assets/triangle-alert-Oj-OsZDw.js +0 -1
  479. package/dist/client/assets/use-gesture-react.esm-DYpdiE_k.js +0 -1
  480. package/dist/client/assets/use-gesture-react.esm-DYpdiE_k.js.br +0 -0
  481. package/dist/client/assets/use-gesture-react.esm-DYpdiE_k.js.gz +0 -0
  482. package/dist/client/assets/vennDiagram-4TSXK5OY-CxoHHVcs.js.br +0 -0
  483. package/dist/client/assets/vennDiagram-4TSXK5OY-CxoHHVcs.js.gz +0 -0
  484. package/dist/client/assets/videoCompression-rr2lu3uy.js.br +0 -0
  485. package/dist/client/assets/videoCompression-rr2lu3uy.js.gz +0 -0
  486. package/dist/client/assets/wardleyDiagram-VM6X3IG4-B4Hsh-Ad.js.br +0 -0
  487. package/dist/client/assets/wardleyDiagram-VM6X3IG4-B4Hsh-Ad.js.gz +0 -0
  488. package/dist/client/assets/xychartDiagram-S5SC5T6Z-CghzsxQv.js.br +0 -0
  489. package/dist/client/assets/xychartDiagram-S5SC5T6Z-CghzsxQv.js.gz +0 -0
@@ -1,11 +1,13 @@
1
1
  import { sessionViewModeRoutes, SessionViewModeStore } from '../agent/sessionViewModeRoutes.js';
2
+ import { incompleteOscSuffix } from '../utils/oscBuffer.js';
3
+ import { terminalProgramStatus, PROGRAM_STATUS_REPLY } from '../shared/programStatus.js';
2
4
  import { sessionAttachmentRoutes } from '../agent/sessionAttachmentRoutes.js';
3
5
  import { TodoStore, TodoError } from '../todos/store.js';
4
6
  import { TodoRunner, todoRoutes } from '../todos/routes.js';
5
7
  import { TerminalInputQueue } from '../utils/terminalInputQueue.js';
6
8
  import { copyTmuxSelection } from '../utils/tmuxCopySelection.js';
7
9
  import { isConfirmedEmptyTmuxServer } from '../utils/tmuxEmptyServerProbe.js';
8
- import { collaborationSessionDisplayName } from '../utils/sessionDisplayName.js';
10
+ import { getSessionPresentation } from '../utils/sessionDisplayName.js';
9
11
  import { integrationError } from '../agent/integrationStore.js';
10
12
  import { assertNativeResumeAvailable, collectNativeResumeOwnerCandidates } from '../agent/nativeResumeOwner.js';
11
13
  import { nativeIdentityDirectory, readNativeProcessIdentity, resolveProfileNativeIdentity } from '../agent/nativeProcessIdentity.js';
@@ -25,8 +27,9 @@ import { TerminalPasteBuffer } from '../utils/terminalPasteBuffer.js';
25
27
  import { SharedSessionSampler, SharedSnapshotCache } from '../utils/sharedSampling.js';
26
28
  import { batchTmuxOptions, TmuxMetadataWriter } from '../utils/tmuxMetadataWriter.js';
27
29
  import { redrawTmuxClient } from '../utils/tmuxClientRedraw.js';
28
- import { claimTmuxSize } from '../utils/tmuxSizeOwnership.js';
30
+ import { TmuxDisplayGeometry } from '../utils/tmuxDisplayGeometry.js';
29
31
  import { TmuxInitialScreen } from '../utils/tmuxInitialScreen.js';
32
+ import { readTmuxObserverSize } from '../utils/tmuxObserverSize.js';
30
33
  import { TerminalOutputDelivery, resolveTerminalReplayCursor } from '../utils/terminalOutputDelivery.js';
31
34
  import express from 'express';
32
35
  import fs from 'fs';
@@ -44,7 +47,7 @@ import { getPtyHostManager } from '../ptyhost/manager.js';
44
47
  import { pathValidator } from '../utils/pathValidator.js';
45
48
  import { TERMINAL, TMUX } from '../config.js';
46
49
  import { localAccessManager, localAccessInterfaceUrl } from '../utils/localAccess.js';
47
- import { normalizeLocalAccessName, getLocaleSetting, setLocaleSetting, getContextDraftHeightSetting, setContextDraftHeightSetting, getAutoRenameAgentsSetting, setAutoRenameAgentsSetting, getAutoRenameNamerSetting, setAutoRenameNamerSetting, getAutoRenameModelsSetting, setAutoRenameModelsSetting, getAutoRenameIntervalMinutesSetting, setAutoRenameIntervalMinutesSetting, getAutoRenamePromptPreferenceSetting, setAutoRenamePromptPreferenceSetting, getAutoRenamePromptPayloadCharsSetting, setAutoRenamePromptPayloadCharsSetting, getNewSessionAgentSlugSetting, setNewSessionAgentSlugSetting, getRunningSessionButtonEnabledSetting, getAttentionButtonEnabledSetting, getCollaborationPanelsSetting, setCollaborationPanelSetting, getAndroidPanelSetting, setAndroidPanelSetting, getRightSidebarTabsSetting, setRightSidebarTabsSetting, normalizeAndroidPanel, getCollaborationFloatingGroupIdSetting, setCollaborationFloatingGroupIdSetting, getServiceSwitcherExpandedSetting, setServiceSwitcherExpandedSetting, setRunningSessionButtonEnabledSetting, setAttentionButtonEnabledSetting, getFileSortModesSetting, getHideGitIgnoredRootsSetting, getGitIgnoreExceptionsSetting, setGitIgnoreExceptionsSetting, setHideGitIgnoredRootSetting, setFileSortModesSetting, setFileSortModeSetting, getNestedGitScanRootsSetting, setNestedGitScanRootSetting, getPinnedExplorerRootsSetting, setPinnedExplorerRootsSetting, setPinnedExplorerRootSetting, watchPinnedExplorerRootsSetting, getActiveGitReposSetting, setActiveGitRepoSetting, } from '../utils/settings.js';
50
+ import { normalizeLocalAccessName, getLocaleSetting, setLocaleSetting, getContextDraftHeightSetting, setContextDraftHeightSetting, getAutoRenameAgentsSetting, setAutoRenameAgentsSetting, getAutoRenameNamerSetting, setAutoRenameNamerSetting, getAutoRenameModelsSetting, setAutoRenameModelsSetting, getAutoRenameIntervalMinutesSetting, setAutoRenameIntervalMinutesSetting, getAutoRenamePromptPreferenceSetting, setAutoRenamePromptPreferenceSetting, getAutoRenamePromptPayloadCharsSetting, setAutoRenamePromptPayloadCharsSetting, getNewSessionAgentSlugSetting, setNewSessionAgentSlugSetting, getRunningSessionButtonEnabledSetting, getAttentionButtonEnabledSetting, getCollaborationPanelsSetting, setCollaborationPanelSetting, getAndroidPanelSetting, setAndroidPanelSetting, getRightSidebarTabsSetting, setRightSidebarTabsSetting, getCollaborationFloatingGroupIdSetting, setCollaborationFloatingGroupIdSetting, getServiceSwitcherExpandedSetting, setServiceSwitcherExpandedSetting, setRunningSessionButtonEnabledSetting, setAttentionButtonEnabledSetting, getFileSortModesSetting, getHideGitIgnoredRootsSetting, getGitIgnoreExceptionsSetting, setGitIgnoreExceptionsSetting, setHideGitIgnoredRootSetting, setFileSortModesSetting, setFileSortModeSetting, getNestedGitScanRootsSetting, setNestedGitScanRootSetting, getPinnedExplorerRootsSetting, setPinnedExplorerRootsSetting, setPinnedExplorerRootSetting, watchPinnedExplorerRootsSetting, getActiveGitReposSetting, setActiveGitRepoSetting, } from '../utils/settings.js';
48
51
  import { loadContextDraft, saveContextDraft } from '../utils/contextDraft.js';
49
52
  import { getOnboardingServerUrl } from '../onboardingServer.js';
50
53
  import { inspectLinuxInotifyUsage, isWatchResourceExhaustion } from '../utils/fileWatchPolicy.js';
@@ -86,7 +89,7 @@ import { assertDetachedCloseOwnership } from '../agent/integrationCloseOwnership
86
89
  import { readTmuxLayout, readTmuxLayouts } from '../utils/tmuxLayoutReader.js';
87
90
  import { CollaborationDeliveryWorker } from '../agent/collaborationDeliveryWorker.js';
88
91
  import { approveCollaborationDialog, captureTmuxPaneHistory, captureTmuxPaneText, sendTmuxPaneKey, writeCollaborationTmuxPane } from '../agent/collaborationTmuxDelivery.js';
89
- import { listAllHookAgents, refreshStaleHooksAtLaunch, installHooksForSlug, uninstallHooksForSlug, } from '../agent/installers.js';
92
+ import { listAllHookAgents, refreshStaleHooksAtLaunch, installHooksForSlug, runtimeHooksStateForSlug, uninstallHooksForSlug, } from '../agent/installers.js';
90
93
  import { loadPlugins, savePlugin, removePlugin, readPluginIcon, validateManifest, } from '../agent/plugins.js';
91
94
  import { TmuxLifecycleCoordinator } from '../utils/tmuxLifecycle.js';
92
95
  import { buildInteractiveColorEnvironment, buildTmuxColorEnvironmentCommands, ensureTmuxColorCapabilities, resolveTmuxInnerTerm, } from '../utils/terminalColorEnvironment.js';
@@ -1471,6 +1474,11 @@ function orchestrationSessionSnapshot(record) {
1471
1474
  const terminalConnected = Boolean(backend);
1472
1475
  const slug = binding?.pane?.agentSlug ?? binding?.agentSlug ?? record.agentResume?.slug;
1473
1476
  const agent = slug ? agentBySlug(slug) : backend?.agent;
1477
+ const presentation = getSessionPresentation({ ...record,
1478
+ activeProgram: backend?.activeProgram?.command ?? record.activeProgram,
1479
+ shellTitle: backend?.lastOscTitle ?? record.shellTitle, cwd: backend?.cwd ?? record.cwd,
1480
+ promptState: backend?.lastPromptState ?? null, agent,
1481
+ }, shellNamesBackend);
1474
1482
  return {
1475
1483
  ...collaborationStore.sessionFacts(record.sessionId, terminalConnected || route.state === 'ready' || route.state === 'shell'),
1476
1484
  last_terminal_output_at: backend?.lastOutputAt || null,
@@ -1483,12 +1491,8 @@ function orchestrationSessionSnapshot(record) {
1483
1491
  sessionId: record.sessionId,
1484
1492
  agentNativeSessionId: binding?.pane ? binding.pane.nativeSessionId : binding?.nativeSessionId ?? backend?.agentSession?.sessionId ?? record.agentResume?.sessionId ?? null,
1485
1493
  backendSessionId: backendId ?? null,
1486
- name: collaborationSessionDisplayName({ ...record,
1487
- activeProgram: backend?.activeProgram?.command ?? record.activeProgram,
1488
- shellTitle: backend?.lastOscTitle ?? record.shellTitle,
1489
- cwd: backend?.cwd ?? record.cwd,
1490
- agent: agent ? { displayName: agent.displayName } : null,
1491
- }),
1494
+ name: presentation.displayName,
1495
+ ...presentation,
1492
1496
  cwd: backend?.cwd ?? record.cwd ?? '',
1493
1497
  agent: agent ? { slug: agent.slug, displayName: agent.displayName } : null,
1494
1498
  status: route.state === 'unchecked' && terminalConnected ? 'terminal-connected' : route.state,
@@ -1939,20 +1943,22 @@ async function resolveCollaborationRoute(frontendSessionId) {
1939
1943
  return { state: 'detached', reason: 'TMUX_BACKEND_UNAVAILABLE' };
1940
1944
  assertGeneration();
1941
1945
  const assertCurrent = terminalInputGuard(globalSessionState.sessions.find(candidate => candidate.sessionId === frontendSessionId));
1942
- return { state: 'ready', isShell: pane.isShell, capture: async () => captureTmuxPaneText(runTmux, pinned), write: async (messages) => {
1943
- if (!globalSessionState.sessions.some((candidate) => candidate.sessionId === frontendSessionId))
1944
- throw new Error('SESSION_REMOVED');
1945
- if (recoveredNativeIdentity) {
1946
- const current = await inspectCollaborationTmux(binding, null, false, true, true, true);
1947
- const proof = current.candidates?.find(candidate => candidate.serverPid === pinned.serverPid && candidate.sessionId === pinned.sessionId
1948
- && candidate.paneId === pinned.paneId && candidate.panePid === pinned.panePid);
1949
- if (!proof?.nativeIdentityVerified || proof.nativeIdentityFailure || proof.nativeSessionId !== pinned.nativeSessionId
1950
- || proof.agentSlug !== pinned.agentSlug || !routeOwnershipConfirmed(frontendSessionId, binding, [proof]))
1951
- throw new Error('ROUTE_NATIVE_IDENTITY_CHANGED_BEFORE_WRITE');
1952
- }
1953
- await writeCollaborationTmuxPane(runTmux, pinned, formatLocalCollaborationMessages(frontendSessionId, messages), runTmuxStdin, () => { assertGeneration(); assertCurrent(); });
1954
- backend.lastActivity = Date.now();
1955
- } };
1946
+ const writeText = async (prompt) => {
1947
+ if (!globalSessionState.sessions.some((candidate) => candidate.sessionId === frontendSessionId))
1948
+ throw new Error('SESSION_REMOVED');
1949
+ if (recoveredNativeIdentity) {
1950
+ const current = await inspectCollaborationTmux(binding, null, false, true, true, true);
1951
+ const proof = current.candidates?.find(candidate => candidate.serverPid === pinned.serverPid && candidate.sessionId === pinned.sessionId
1952
+ && candidate.paneId === pinned.paneId && candidate.panePid === pinned.panePid);
1953
+ if (!proof?.nativeIdentityVerified || proof.nativeIdentityFailure || proof.nativeSessionId !== pinned.nativeSessionId
1954
+ || proof.agentSlug !== pinned.agentSlug || !routeOwnershipConfirmed(frontendSessionId, binding, [proof]))
1955
+ throw new Error('ROUTE_NATIVE_IDENTITY_CHANGED_BEFORE_WRITE');
1956
+ }
1957
+ await writeCollaborationTmuxPane(runTmux, pinned, prompt, runTmuxStdin, () => { assertGeneration(); assertCurrent(); });
1958
+ backend.lastActivity = Date.now();
1959
+ };
1960
+ return { state: 'ready', isShell: pane.isShell, capture: async () => captureTmuxPaneText(runTmux, pinned), writeText,
1961
+ write: messages => writeText(formatLocalCollaborationMessages(frontendSessionId, messages)) };
1956
1962
  }
1957
1963
  if (!backend || !binding.backendSessionId)
1958
1964
  return { state: 'offline', reason: 'SHELL_BACKEND_NOT_RUNNING' };
@@ -1967,22 +1973,23 @@ async function resolveCollaborationRoute(frontendSessionId) {
1967
1973
  if (launch)
1968
1974
  return launch;
1969
1975
  }
1976
+ const writeText = async (prompt) => {
1977
+ if (!globalSessionState.sessions.some((candidate) => candidate.sessionId === frontendSessionId))
1978
+ throw new Error('SESSION_REMOVED');
1979
+ if (terminalSessions.get(binding.backendSessionId) !== target)
1980
+ throw new Error('SHELL_BACKEND_CHANGED');
1981
+ await writeBracketedPrompt(target.ptyProcess, prompt, () => {
1982
+ assertGeneration();
1983
+ assertCurrent();
1984
+ if (terminalSessions.get(binding.backendSessionId) !== target)
1985
+ throw new Error('TERMINAL_INPUT_TARGET_CHANGED');
1986
+ });
1987
+ target.lastActivity = Date.now();
1988
+ };
1970
1989
  return { state: 'ready',
1971
1990
  isShell: backend.activeProgram?.source !== 'unknown' && shellNamesBackend.has(backend.activeProgram?.command?.toLowerCase() ?? ''),
1972
- capture: async () => target.autoTitleContext,
1973
- write: async (messages) => {
1974
- if (!globalSessionState.sessions.some((candidate) => candidate.sessionId === frontendSessionId))
1975
- throw new Error('SESSION_REMOVED');
1976
- if (terminalSessions.get(binding.backendSessionId) !== target)
1977
- throw new Error('SHELL_BACKEND_CHANGED');
1978
- await writeBracketedPrompt(target.ptyProcess, formatLocalCollaborationMessages(frontendSessionId, messages), () => {
1979
- assertGeneration();
1980
- assertCurrent();
1981
- if (terminalSessions.get(binding.backendSessionId) !== target)
1982
- throw new Error('TERMINAL_INPUT_TARGET_CHANGED');
1983
- });
1984
- target.lastActivity = Date.now();
1985
- } };
1991
+ capture: async () => target.autoTitleContext, writeText,
1992
+ write: messages => writeText(formatLocalCollaborationMessages(frontendSessionId, messages)) };
1986
1993
  }
1987
1994
  async function refreshCollaborationAgentIdentity(backendSessionId, session, freshProcess = false) {
1988
1995
  let activeProgram = null;
@@ -3441,7 +3448,7 @@ async function buildSessionInventory() {
3441
3448
  const tmuxMeta = session.tmuxSessionName ? liveTmuxByName.get(session.tmuxSessionName) : undefined;
3442
3449
  const activeProgram = backend?.activeProgram?.command ?? tmuxMeta?.program ?? session.activeProgram ?? null;
3443
3450
  const cwd = backend?.cwd ?? tmuxMeta?.cwd ?? session.cwd ?? null;
3444
- const shellTitle = tmuxMeta?.shellTitle ?? backend?.lastOscTitle ?? session.shellTitle ?? null;
3451
+ const shellTitle = backend?.lastOscTitle ?? tmuxMeta?.shellTitle ?? session.shellTitle ?? null;
3445
3452
  // Identity is available without opening a terminal stream. Use foreground
3446
3453
  // argv for interpreter/wrapper launches, and resume identity at shell prompts.
3447
3454
  const foregroundAgent = (backend ? detectSessionAgent(backend) : null)
@@ -3467,6 +3474,7 @@ async function buildSessionInventory() {
3467
3474
  cwd,
3468
3475
  shellTitle,
3469
3476
  agent,
3477
+ ...getSessionPresentation({ ...session, activeProgram, cwd, shellTitle, agent, promptState: backend?.lastPromptState ?? null }, shellNamesBackend),
3470
3478
  };
3471
3479
  });
3472
3480
  const clientByTmux = new Map();
@@ -3623,7 +3631,7 @@ function getPtyProcessPid(ptyProcess) {
3623
3631
  return null;
3624
3632
  }
3625
3633
  // ── OSC sniffing for CWD tracking + prompt state + title ──
3626
- const OSC_SNIFF_CAP = 32768; // 32 KB rolling buffer
3634
+ const OSC_SNIFF_CAP = 512 * 1024; // bounded incomplete hook payload (JSON escaping can expand stdin)
3627
3635
  // Match all OSC sequences we care about:
3628
3636
  // OSC 0;... / OSC 2;... → title (may contain cwd or command name)
3629
3637
  // OSC 7;... → cwd report (kitty-shell-cwd://host/path)
@@ -3787,7 +3795,7 @@ function sniffOsc(buf, home) {
3787
3795
  }
3788
3796
  }
3789
3797
  }
3790
- const remaining = buf.slice(lastMatchEnd).slice(-128);
3798
+ const remaining = incompleteOscSuffix(buf, lastMatchEnd, OSC_SNIFF_CAP);
3791
3799
  return { cwd: lastCwd, title: lastTitle, promptState, exitCode, tuiProgress, agentEvents, notification, remaining };
3792
3800
  }
3793
3801
  /** The body of a `notify;<title>;<body>` OSC 777 payload, or null. */
@@ -4111,7 +4119,7 @@ function serializeAgentIdentity(agent) {
4111
4119
  : null;
4112
4120
  }
4113
4121
  let lastAgentStatusSnapshots = new Map();
4114
- function broadcastAgentStatus(sessionId, session, force = false) {
4122
+ function broadcastAgentStatus(sessionId, session, force = false, notify = true) {
4115
4123
  const payload = buildAgentStatusPayload(sessionId, session);
4116
4124
  const snapshot = JSON.stringify(payload);
4117
4125
  const previousSnapshot = lastAgentStatusSnapshots.get(sessionId);
@@ -4123,7 +4131,36 @@ function broadcastAgentStatus(sessionId, session, force = false) {
4123
4131
  const previous = previousSnapshot
4124
4132
  ? JSON.parse(previousSnapshot)
4125
4133
  : null;
4126
- notifyAgentTransition(sessionId, previous, payload);
4134
+ if (notify)
4135
+ notifyAgentTransition(sessionId, previous, payload);
4136
+ }
4137
+ const nativeStatusRecoveryTimers = new WeakMap();
4138
+ function cancelNativeStatusRecovery(session) {
4139
+ const timer = nativeStatusRecoveryTimers.get(session);
4140
+ if (timer)
4141
+ clearTimeout(timer);
4142
+ nativeStatusRecoveryTimers.delete(session);
4143
+ }
4144
+ /** A matching program's explicit terminal completion can recover a missed
4145
+ * Stop/Interrupt hook. Never infer completion from output silence or CPU. */
4146
+ function scheduleNativeStatusRecovery(sessionId, session, endedApps) {
4147
+ const agent = session.agent, state = session.agentSession;
4148
+ if (!agent || state?.status !== 'working' || !endedApps.some(app => agent.slug === app || agent.aliases.includes(app)))
4149
+ return;
4150
+ cancelNativeStatusRecovery(session);
4151
+ const timer = setTimeout(() => {
4152
+ nativeStatusRecoveryTimers.delete(session);
4153
+ if (terminalSessions.get(sessionId) !== session || session.agent !== agent || session.agentSession !== state || state.status !== 'working')
4154
+ return;
4155
+ if (terminalProgramStatus(session).activeApps().some(app => agent.slug === app || agent.aliases.includes(app)))
4156
+ return;
4157
+ state.status = 'idle';
4158
+ state.message = null;
4159
+ state.presentation = null;
4160
+ broadcastAgentStatus(sessionId, session, false, false);
4161
+ }, 3000);
4162
+ timer.unref?.();
4163
+ nativeStatusRecoveryTimers.set(session, timer);
4127
4164
  }
4128
4165
  /** Persist the info needed to resume this pane's agent conversation after the
4129
4166
  * agent exits / the server restarts (last-known semantics, debounced). */
@@ -4252,6 +4289,7 @@ function applyAgentSignals(sessionId, session, events, notification) {
4252
4289
  for (const event of events) {
4253
4290
  if (!agentEventMatchesCurrentAgent(session.agent, event))
4254
4291
  continue;
4292
+ cancelNativeStatusRecovery(session);
4255
4293
  // An event naming an agent brands the pane even when the process poll
4256
4294
  // can't see through a wrapper: identity via protocol.
4257
4295
  if (!session.agent && event.agent) {
@@ -5605,11 +5643,11 @@ function processSessionOutput(sessionId, session, data, opts) {
5605
5643
  // Sniff OSC sequences for CWD tracking + prompt state + title
5606
5644
  try {
5607
5645
  const buf = session.oscSniffBuf + data;
5608
- if (buf.length > OSC_SNIFF_CAP) {
5609
- session.oscSniffBuf = buf.slice(-OSC_SNIFF_CAP / 4); // trim
5610
- }
5611
5646
  const result = sniffOsc(buf, home);
5612
5647
  session.oscSniffBuf = result.remaining;
5648
+ const progress = terminalProgramStatus(session).feed(data);
5649
+ if (progress.query && opts.broadcast)
5650
+ session.ptyProcess.write(PROGRAM_STATUS_REPLY);
5613
5651
  // CWD change
5614
5652
  if (result.cwd && result.cwd !== session.lastOscCwd) {
5615
5653
  session.lastOscCwd = result.cwd;
@@ -5642,8 +5680,8 @@ function processSessionOutput(sessionId, session, data, opts) {
5642
5680
  refreshGitStatus(sessionId, session);
5643
5681
  }
5644
5682
  }
5645
- if (result.tuiProgress !== null) {
5646
- session.tuiProgress = result.tuiProgress.state === 'remove' ? null : result.tuiProgress;
5683
+ if (progress.changed) {
5684
+ session.tuiProgress = progress.progress;
5647
5685
  broadcastJsonWs(sessionId, {
5648
5686
  type: 'tui-progress',
5649
5687
  tuiProgress: session.tuiProgress,
@@ -5654,6 +5692,8 @@ function processSessionOutput(sessionId, session, data, opts) {
5654
5692
  if (result.agentEvents.length > 0 || result.notification) {
5655
5693
  applyAgentSignals(sessionId, session, result.agentEvents, result.notification);
5656
5694
  }
5695
+ if (progress.endedApps.length)
5696
+ scheduleNativeStatusRecovery(sessionId, session, progress.endedApps);
5657
5697
  }
5658
5698
  catch { /* sniff failure should never block data */ }
5659
5699
  appendAutoTitleContext(sessionId, session, data, opts.broadcast);
@@ -5672,6 +5712,11 @@ function setupPtyHandlers(sessionId, session) {
5672
5712
  });
5673
5713
  session.exitDisposable = session.ptyProcess.onExit(({ exitCode, signal }) => {
5674
5714
  console.log(`Terminal session ${sessionId} exited with code ${exitCode}, signal ${signal}`);
5715
+ const progress = terminalProgramStatus(session).exit();
5716
+ if (progress.changed) {
5717
+ session.tuiProgress = progress.progress;
5718
+ broadcastEvent(sessionId, { type: 'tui-progress', tuiProgress: session.tuiProgress });
5719
+ }
5675
5720
  broadcastEvent(sessionId, { type: 'exit', exitCode, signal });
5676
5721
  // User-initiated closes dispose this listener before killing the pty, so
5677
5722
  // reaching here means the process exited on its own. Sessions with a live
@@ -5729,8 +5774,8 @@ async function spawnTerminalSession(req, input) {
5729
5774
  }
5730
5775
  async function spawnTerminalSessionUnlocked(req, input) {
5731
5776
  const cwd = await resolveWorkingDirectory(req, input.cwd);
5732
- const cols = input.cols || 80;
5733
- const rows = input.rows || 24;
5777
+ let cols = input.cols || 80;
5778
+ let rows = input.rows || 24;
5734
5779
  const sessionId = Math.random().toString(36).substring(2, 15) +
5735
5780
  Math.random().toString(36).substring(2, 15);
5736
5781
  let mode = normalizeMode(input.mode);
@@ -5752,6 +5797,7 @@ async function spawnTerminalSessionUnlocked(req, input) {
5752
5797
  }
5753
5798
  else
5754
5799
  await prepareManagedTmuxSession(tmuxSessionName, cwd);
5800
+ ({ cols, rows } = await readTmuxObserverSize(runTmux, input.tmuxAttachTarget ?? `=${tmuxSessionName}`));
5755
5801
  }
5756
5802
  const command = mode === 'tmux'
5757
5803
  ? getTmuxBinary()
@@ -6610,6 +6656,23 @@ router.get('/session-inventory', async (_req, res) => {
6610
6656
  }
6611
6657
  });
6612
6658
  const todoRuntime = {
6659
+ async target(id) {
6660
+ const record = globalSessionState.sessions.find(session => session.sessionId === id);
6661
+ if (!record)
6662
+ throw new TodoError('这个会话已关闭,请重新选择', 409);
6663
+ const route = await resolveCollaborationRoute(id);
6664
+ const facts = orchestrationSessionSnapshot(record);
6665
+ if (route.state !== 'ready' || route.isShell || !facts.agent)
6666
+ throw new TodoError('这个会话暂时无法接收待办,请先在终端启动 Agent', 409);
6667
+ const launcher = (await listDetectedAgentLaunchers()).find(agent => agent.slug === facts.agent.slug);
6668
+ return { name: facts.name, config: { agentSlug: facts.agent.slug, command: launcher?.command ?? facts.agent.slug, cwd: record.cwd ?? '', prompt: '' } };
6669
+ },
6670
+ async deliver(run, prompt) {
6671
+ const route = await resolveCollaborationRoute(run.sessionId);
6672
+ if (route.state !== 'ready' || route.isShell || !route.writeText)
6673
+ throw new TodoError('目标会话状态已变化,请检查终端后重试', 409);
6674
+ await route.writeText(prompt);
6675
+ },
6613
6676
  async validate(config, req) {
6614
6677
  const launcher = (await listDetectedAgentLaunchers()).find(agent => agent.slug === config.agentSlug);
6615
6678
  if (!launcher)
@@ -7815,16 +7878,7 @@ router.put('/settings', async (req, res) => {
7815
7878
  setRightSidebarTabsSetting(body.rightSidebarTabs);
7816
7879
  }
7817
7880
  if (body.androidPanel && typeof body.androidPanel === 'object') {
7818
- // 与现有设置合并后再校验:允许只更新部分字段(如仅切开关)。
7819
- const merged = normalizeAndroidPanel({ ...getAndroidPanelSetting(), ...body.androidPanel });
7820
- setAndroidPanelSetting({
7821
- enabled: merged.enabled,
7822
- quality: merged.quality,
7823
- activePresetId: merged.activePresetId,
7824
- presets: merged.presets,
7825
- docked: merged.docked,
7826
- deviceSerial: merged.deviceSerial,
7827
- });
7881
+ setAndroidPanelSetting(body.androidPanel);
7828
7882
  }
7829
7883
  if (body.collaborationPanel && typeof body.collaborationPanel.clientId === 'string') {
7830
7884
  setCollaborationPanelSetting(body.collaborationPanel.clientId, body.collaborationPanel.state);
@@ -8089,7 +8143,7 @@ router.post('/agent-hooks/:agent/install', async (req, res) => {
8089
8143
  const agent = req.params.agent;
8090
8144
  try {
8091
8145
  const result = await installHooksForSlug(agent);
8092
- res.json({ agent, ...result, state: 'installed' });
8146
+ res.json({ agent, ...result, state: await runtimeHooksStateForSlug(agent) });
8093
8147
  }
8094
8148
  catch (error) {
8095
8149
  res.status(400).json({ error: error.message });
@@ -9065,16 +9119,18 @@ export function handleTerminalWebSocket(ws, sessionId, clientId, options = {}, i
9065
9119
  let clientPaused = false;
9066
9120
  let replayRequest = null;
9067
9121
  let replayRetryTimer = null;
9068
- let clientCols = session.cols;
9069
- let clientRows = session.rows;
9070
- let initialAttachmentResize = true;
9071
9122
  let tmuxSizeOwnershipSupported = false;
9072
9123
  let initialScreen = null;
9073
- if (initialDimensions && options.independentTmux) {
9074
- clientCols = initialDimensions.cols;
9075
- clientRows = initialDimensions.rows;
9076
- }
9077
9124
  const ownTmux = session.mode === 'tmux' && options.independentTmux === true;
9125
+ const displayGeometry = ownTmux ? new TmuxDisplayGeometry(session, runTmux, session.tmuxSessionName, () => {
9126
+ const pids = new Set();
9127
+ for (const client of wsClients.get(sessionId)?.values() ?? []) {
9128
+ const pid = tmuxAttachments.get(client)?.pid;
9129
+ if (pid !== undefined)
9130
+ pids.add(pid);
9131
+ }
9132
+ return pids;
9133
+ }, initialDimensions) : null;
9078
9134
  if (ownTmux)
9079
9135
  independentTmuxClients.add(ws);
9080
9136
  const attachment = ownTmux ? new TerminalClientAttachment(async (cols, rows) => {
@@ -9083,13 +9139,7 @@ export function handleTerminalWebSocket(ws, sessionId, clientId, options = {}, i
9083
9139
  const tmuxBinary = getTmuxBinary();
9084
9140
  const supportsFeatures = await supportsTmuxClientFeatures(tmuxBinary);
9085
9141
  tmuxSizeOwnershipSupported = supportsFeatures;
9086
- // The metadata observer must not choose the pane size while a browser
9087
- // owns an attached client. Resolve by exact PID, never another client.
9088
- const raw = await runTmux(['list-clients', '-t', session.tmuxSessionName, '-F', '#{client_pid} #{client_tty}']);
9089
- const metadata = raw.split('\n').map(line => line.trim().split(/\s+/))
9090
- .find(([pid]) => pid === String(session.ptyProcess.pid));
9091
- if (metadata?.[1] && supportsFeatures)
9092
- await runTmux(['refresh-client', '-t', metadata[1], '-f', 'ignore-size']);
9142
+ await displayGeometry.prepareAttach({ cols, rows }, supportsFeatures);
9093
9143
  const env = buildInteractiveColorEnvironment({ ...process.env, PATH: buildAugmentedPath() });
9094
9144
  delete env.TMUX;
9095
9145
  delete env.TMUX_PANE;
@@ -9134,7 +9184,7 @@ export function handleTerminalWebSocket(ws, sessionId, clientId, options = {}, i
9134
9184
  attachment.close();
9135
9185
  initialScreen?.cancel();
9136
9186
  initialScreen = null;
9137
- initialAttachmentResize = true;
9187
+ displayGeometry.reset();
9138
9188
  delivery.setActive(false); // Discard only this observer's obsolete stream.
9139
9189
  }
9140
9190
  replayRequest = (async () => {
@@ -9175,20 +9225,16 @@ export function handleTerminalWebSocket(ws, sessionId, clientId, options = {}, i
9175
9225
  if (delivery.active) {
9176
9226
  const screen = new TmuxInitialScreen();
9177
9227
  initialScreen = screen;
9178
- if (!await attachment.open(clientCols, clientRows)) {
9228
+ if (!await attachment.open(displayGeometry.size.cols, displayGeometry.size.rows)) {
9179
9229
  screen.cancel();
9180
9230
  return;
9181
9231
  }
9182
9232
  const first = await screen.ready;
9183
- if (initialScreen === screen)
9184
- initialScreen = null;
9185
9233
  if (first.status === 'cancelled' || ws.readyState !== ws.OPEN)
9186
9234
  return;
9187
9235
  if (first.status === 'overflow')
9188
9236
  throw new Error('Initial tmux screen exceeded output budget');
9189
- // Bootstrap with the actual first PTY redraw, not a standalone empty
9190
- // reset followed by the screen in a second client write. Subsequent
9191
- // bytes already wait in delivery and retain their original ordering.
9237
+ initialScreen = null;
9192
9238
  replayChunks = first.data ? [first.data] : ['\x1bc'];
9193
9239
  }
9194
9240
  else {
@@ -9228,8 +9274,8 @@ export function handleTerminalWebSocket(ws, sessionId, clientId, options = {}, i
9228
9274
  streamEpoch: TERMINAL_STREAM_EPOCH,
9229
9275
  outputProtocol: options.flowControl ? 2 : undefined,
9230
9276
  copyModeInput: ownTmux,
9231
- cols: session.cols,
9232
- rows: session.rows,
9277
+ cols: displayGeometry?.size.cols ?? session.cols,
9278
+ rows: displayGeometry?.size.rows ?? session.rows,
9233
9279
  runtime,
9234
9280
  ptyBackend: session.ptyBackend || 'unknown',
9235
9281
  mode: session.mode,
@@ -9280,7 +9326,11 @@ export function handleTerminalWebSocket(ws, sessionId, clientId, options = {}, i
9280
9326
  }
9281
9327
  else if (ws.readyState === ws.OPEN)
9282
9328
  ws.close(1011, 'Replay unavailable');
9283
- }).finally(() => { replayRequest = null; });
9329
+ }).finally(() => {
9330
+ initialScreen?.cancel();
9331
+ initialScreen = null;
9332
+ replayRequest = null;
9333
+ });
9284
9334
  return replayRequest;
9285
9335
  };
9286
9336
  if (attachment)
@@ -9359,38 +9409,19 @@ export function handleTerminalWebSocket(ws, sessionId, clientId, options = {}, i
9359
9409
  if (Number.isFinite(cols) && Number.isFinite(rows) && cols > 0 && rows > 0) {
9360
9410
  if (attachment) {
9361
9411
  await enqueueTmuxIo(session, async () => {
9362
- const cleanCols = Math.floor(cols), cleanRows = Math.floor(rows);
9363
- const displayPids = new Set();
9364
- for (const client of wsClients.get(sessionId)?.values() ?? []) {
9365
- const pid = tmuxAttachments.get(client)?.pid;
9366
- if (pid !== undefined)
9367
- displayPids.add(pid);
9368
- }
9369
- if (tmuxSizeOwnershipSupported) {
9370
- await claimTmuxSize(runTmux, session.tmuxSessionName, attachment.pid, displayPids);
9371
- }
9372
- const sameSize = clientCols === cleanCols && clientRows === cleanRows;
9373
- const ok = sameSize ? attachment.attached : attachment.resize(cleanCols, cleanRows);
9374
- if (ok) {
9375
- // The first resize confirms the grid supplied at attachment.
9376
- // Its PTY is already drawing that grid; forcing refresh-client
9377
- // here repeats the initial clear/full redraw. Later same-size
9378
- // requests remain explicit display recovery requests.
9379
- const needsRedraw = sameSize && !initialAttachmentResize;
9380
- initialAttachmentResize = false;
9381
- clientCols = cleanCols;
9382
- clientRows = cleanRows;
9412
+ const result = await displayGeometry.resize(attachment, { cols, rows }, tmuxSizeOwnershipSupported);
9413
+ if (result.ok) {
9383
9414
  session.lastActivity = Date.now();
9384
9415
  broadcastJsonWs(sessionId, {
9385
- type: 'pty-size', cols: clientCols, rows: clientRows, source: `ws-resize:${clientId}`,
9416
+ type: 'pty-size', cols: result.cols, rows: result.rows, source: `ws-resize:${clientId}`,
9386
9417
  }, clientId);
9387
- if (needsRedraw)
9418
+ if (result.redraw)
9388
9419
  await redrawTmuxClient(runTmux, session.tmuxSessionName, attachment.pid);
9389
9420
  }
9390
9421
  if (ws.readyState === ws.OPEN)
9391
9422
  ws.send(JSON.stringify({
9392
9423
  type: 'resize-ack', seq: typeof msg.seq === 'number' ? msg.seq : undefined,
9393
- ok, cols: clientCols, rows: clientRows, screenSyncPending: false,
9424
+ ok: result.ok, cols: result.cols, rows: result.rows, screenSyncPending: false,
9394
9425
  }));
9395
9426
  });
9396
9427
  break;
@@ -9475,10 +9506,17 @@ export function handleTerminalWebSocket(ws, sessionId, clientId, options = {}, i
9475
9506
  break;
9476
9507
  outputWanted = msg.active;
9477
9508
  const resumed = delivery.setActive(outputWanted);
9478
- if (!delivery.active)
9509
+ if (!delivery.active) {
9479
9510
  attachment?.close();
9511
+ initialScreen?.cancel();
9512
+ }
9480
9513
  if (resumed && delivery.active) {
9481
- void sendReplay(typeof msg.since === 'number' ? msg.since : 0, typeof msg.epoch === 'string' ? msg.epoch : undefined);
9514
+ // A rapid hide/show can resume while the cancelled first redraw
9515
+ // is still unwinding. Start a new attachment after it has settled.
9516
+ await replayRequest;
9517
+ if (ws.readyState === ws.OPEN && outputWanted) {
9518
+ void sendReplay(typeof msg.since === 'number' ? msg.since : 0, typeof msg.epoch === 'string' ? msg.epoch : undefined);
9519
+ }
9482
9520
  }
9483
9521
  break;
9484
9522
  }
@@ -0,0 +1,64 @@
1
+ export function isValidAndroidSerial(serial) {
2
+ if (!serial || serial.length > 128 || !/^(?:[0-9a-zA-Z_.:\-]+|\[[0-9a-fA-F:.]+\]:\d{1,5})$/.test(serial))
3
+ return false;
4
+ return serial.startsWith('[') || /^[^:]+:\d+$/.test(serial) ? normalizeAndroidAddress(serial) !== null : true;
5
+ }
6
+ export function normalizeAndroidAddress(raw) {
7
+ let value = raw.trim();
8
+ const pasted = /^[a-z]+:\/\/([^/]+)/i.exec(value);
9
+ if (pasted)
10
+ value = pasted[1];
11
+ value = value.replace(/^\/+|\/+$/g, '');
12
+ const v6 = /^\[([^\]]+)\](?::(\d{1,5}))?$/.exec(value);
13
+ if (v6) {
14
+ try {
15
+ new URL(`http://[${v6[1]}]`);
16
+ }
17
+ catch {
18
+ return null;
19
+ }
20
+ const port = v6[2] ?? '5555';
21
+ return Number(port) >= 1 && Number(port) <= 65535 ? `[${v6[1]}]:${port}` : null;
22
+ }
23
+ if (!/^[0-9a-zA-Z_.\-]+(?::\d{1,5})?$/.test(value))
24
+ return null;
25
+ const [host, port = '5555'] = value.split(':');
26
+ if (/^\d+\.\d+\.\d+\.\d+$/.test(host) && host.split('.').some(part => Number(part) > 255))
27
+ return null;
28
+ return Number(port) >= 1 && Number(port) <= 65535 ? `${host}:${port}` : null;
29
+ }
30
+ export function androidDeviceKey(device) {
31
+ return device.physicalId ? `physical:${device.physicalId}` : `serial:${device.serial}`;
32
+ }
33
+ export function groupAndroidDevices(devices, selectedSerial = '') {
34
+ const groups = new Map();
35
+ const rank = (device) => (device.state === 'device' ? 0 : 10)
36
+ + (device.serial === selectedSerial ? 0 : !device.isNetwork ? 1 : device.serial.startsWith('[') ? 3 : 2);
37
+ for (const device of devices) {
38
+ const key = androidDeviceKey(device), group = groups.get(key);
39
+ if (!group)
40
+ groups.set(key, { key, device, routes: [device] });
41
+ else {
42
+ group.routes.push(device);
43
+ if (rank(device) < rank(group.device))
44
+ group.device = device;
45
+ }
46
+ }
47
+ return [...groups.values()];
48
+ }
49
+ /** Never switch an explicit selection to an unrelated phone. */
50
+ export function resolveAndroidSelection(devices, serial, physicalId) {
51
+ const groups = groupAndroidDevices(devices, serial);
52
+ const exact = devices.find(device => device.serial === serial);
53
+ const identity = physicalId || exact?.physicalId;
54
+ if (identity)
55
+ return groups.find(group => group.device.physicalId === identity)?.device;
56
+ if (serial)
57
+ return exact;
58
+ const ready = groups.filter(group => group.device.state === 'device');
59
+ return ready.length === 1 ? ready[0].device : undefined;
60
+ }
61
+ export function androidRouteAccess(grants, serial) {
62
+ const matching = grants?.filter(grant => grant.serial === serial) || [];
63
+ return matching.some(grant => grant.access === 'control') ? 'control' : matching.length ? 'view' : undefined;
64
+ }