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
package/dist/client/sw.js CHANGED
@@ -1 +1 @@
1
- if(!self.define){let e,s={};const n=(n,i)=>(n=new URL(n+".js",i).href,s[n]||new Promise(s=>{if("document"in self){const e=document.createElement("script");e.src=n,e.onload=s,document.head.appendChild(e)}else e=n,importScripts(n),s()}).then(()=>{let e=s[n];if(!e)throw new Error(`Module ${n} didn’t register its module`);return e}));self.define=(i,a)=>{const o=e||("document"in self?document.currentScript.src:"")||location.href;if(s[o])return;let r={};const c=e=>n(e,o),d={module:{uri:o},exports:r,require:c};s[o]=Promise.all(i.map(e=>d[e]||c(e))).then(e=>(a(...e),r))}}define(["./workbox-9845bf53"],function(e){"use strict";importScripts("sw-encrypted-background.js","sw-notifications.js","sw-secure-api.js","sw-downloads.js"),self.addEventListener("message",e=>{e.data&&"SKIP_WAITING"===e.data.type&&self.skipWaiting()}),e.clientsClaim(),e.precacheAndRoute([{url:"index.html",revision:"c28a34f6faa77ba4f2eb081e18d5259f"},{url:"assets/app-DuUnqxq-.js",revision:null},{url:"assets/react-XDCjal2T.js",revision:null},{url:"assets/dnd-BCFAPC0L.js",revision:null},{url:"assets/terminal-Dea8wJF3.js",revision:null},{url:"assets/index-nIgxJ6I3.css",revision:null},{url:"icons/agents/opencode.svg",revision:"851c2931d95821ba2b39b68587b48976"},{url:"icons/agents/kimi.svg",revision:"5366c710f4f763022fe159a69cf17409"},{url:"icons/agents/grok.svg",revision:"cd745b0b964545bc7a6b4f36021c3298"},{url:"icons/agents/goose.svg",revision:"c79b927278983c19098d77b4b0c11ab3"},{url:"icons/agents/gemini.svg",revision:"7a64f6d6f80a908255e9c0256903882e"},{url:"icons/agents/droid.svg",revision:"f28723b8c5c115e0908ba3c72613e256"},{url:"icons/agents/cursor.svg",revision:"a1528f3d3cda497f75a5db28defb19de"},{url:"icons/agents/copilot.svg",revision:"dd52e96c1eac0b6ec4bedcd0ddd3b52d"},{url:"icons/agents/codex.svg",revision:"608e55babb0b217e1f2da287342b46d3"},{url:"icons/agents/claude.svg",revision:"08af0225b7acdd8e8f573f3247e5e1c3"},{url:"icons/agents/amp.svg",revision:"af12f8b33faa81e4d46ea7b93c7e43f3"},{url:"apple-touch-icon-180x180.png",revision:"628c2e2f28a9b545aa57be1352025643"},{url:"boot-logo.png",revision:"2e3a25efd9b0b8ca1eab53b5f2284556"},{url:"favicon.ico",revision:"2994debfa6f59a0898e24eb0c54d64b5"},{url:"ipad-status-bar.js",revision:"3a8080edb8a5cc658a7908f6ad69537f"},{url:"maskable-icon-512x512.png",revision:"4d489331fd81f0713c400b26426442b9"},{url:"pwa-192x192.png",revision:"4d6f899888cfb8ccd7a1fd3c9e583ad2"},{url:"pwa-512x512.png",revision:"0885dd7ec8932e7f878b013d51a380a4"},{url:"robots.txt",revision:"d9339907142917dee4aac78494ac9cfe"},{url:"sw-downloads.js",revision:"48dab2e78bd93b4eee27fca487eccfde"},{url:"sw-notifications.js",revision:"fde578590ea8b0540d488ef448b48f45"},{url:"sw-secure-api.js",revision:"cf2bdbd03d41d66d60344c0b5a1075de"},{url:"manifest.webmanifest",revision:"83f9a43b74c236012adafb077fb6d774"}],{}),e.cleanupOutdatedCaches(),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("index.html"),{denylist:[/^\/api\//,/^\/__termdock-download\//,/^\/health$/]})),e.registerRoute(/\/assets\/.*\.(?:js|css)$/,new e.CacheFirst({cacheName:"termdock-lazy-assets-v1",plugins:[new e.CacheableResponsePlugin({statuses:[0,200]}),new e.ExpirationPlugin({maxEntries:96,maxAgeSeconds:2592e3})]}),"GET"),e.registerRoute(/\/fonts\/terminal\/[^/]+-[a-f0-9]{12}\.woff2$/,new e.CacheFirst({cacheName:"termdock-fonts-v2",plugins:[new e.CacheableResponsePlugin({statuses:[0,200]}),new e.ExpirationPlugin({maxEntries:384,maxAgeSeconds:2592e3})]}),"GET"),e.registerRoute(/\/fonts\/.*\.(?:woff2|ttf)$/,new e.StaleWhileRevalidate({cacheName:"termdock-fonts-v1",plugins:[new e.ExpirationPlugin({maxEntries:24,maxAgeSeconds:2592e3})]}),"GET")});
1
+ if(!self.define){let e,s={};const n=(n,i)=>(n=new URL(n+".js",i).href,s[n]||new Promise(s=>{if("document"in self){const e=document.createElement("script");e.src=n,e.onload=s,document.head.appendChild(e)}else e=n,importScripts(n),s()}).then(()=>{let e=s[n];if(!e)throw new Error(`Module ${n} didn’t register its module`);return e}));self.define=(i,o)=>{const a=e||("document"in self?document.currentScript.src:"")||location.href;if(s[a])return;let r={};const c=e=>n(e,a),d={module:{uri:a},exports:r,require:c};s[a]=Promise.all(i.map(e=>d[e]||c(e))).then(e=>(o(...e),r))}}define(["./workbox-9845bf53"],function(e){"use strict";importScripts("sw-encrypted-background.js","sw-notifications.js","sw-secure-api.js","sw-downloads.js"),self.addEventListener("message",e=>{e.data&&"SKIP_WAITING"===e.data.type&&self.skipWaiting()}),e.clientsClaim(),e.precacheAndRoute([{url:"index.html",revision:"285237b81d8d0f5b17794822bbd5b73f"},{url:"assets/app-CovJYQoW.js",revision:null},{url:"assets/react-XDCjal2T.js",revision:null},{url:"assets/dnd-BCFAPC0L.js",revision:null},{url:"assets/terminal-DaiFCKy_.js",revision:null},{url:"assets/index-DEAMSl55.css",revision:null},{url:"icons/agents/opencode.svg",revision:"851c2931d95821ba2b39b68587b48976"},{url:"icons/agents/kimi.svg",revision:"5366c710f4f763022fe159a69cf17409"},{url:"icons/agents/grok.svg",revision:"cd745b0b964545bc7a6b4f36021c3298"},{url:"icons/agents/goose.svg",revision:"c79b927278983c19098d77b4b0c11ab3"},{url:"icons/agents/gemini.svg",revision:"7a64f6d6f80a908255e9c0256903882e"},{url:"icons/agents/droid.svg",revision:"f28723b8c5c115e0908ba3c72613e256"},{url:"icons/agents/cursor.svg",revision:"a1528f3d3cda497f75a5db28defb19de"},{url:"icons/agents/copilot.svg",revision:"dd52e96c1eac0b6ec4bedcd0ddd3b52d"},{url:"icons/agents/codex.svg",revision:"608e55babb0b217e1f2da287342b46d3"},{url:"icons/agents/claude.svg",revision:"08af0225b7acdd8e8f573f3247e5e1c3"},{url:"icons/agents/amp.svg",revision:"af12f8b33faa81e4d46ea7b93c7e43f3"},{url:"apple-touch-icon-180x180.png",revision:"628c2e2f28a9b545aa57be1352025643"},{url:"boot-logo.png",revision:"2e3a25efd9b0b8ca1eab53b5f2284556"},{url:"favicon.ico",revision:"2994debfa6f59a0898e24eb0c54d64b5"},{url:"ipad-status-bar.js",revision:"3a8080edb8a5cc658a7908f6ad69537f"},{url:"maskable-icon-512x512.png",revision:"4d489331fd81f0713c400b26426442b9"},{url:"pwa-192x192.png",revision:"4d6f899888cfb8ccd7a1fd3c9e583ad2"},{url:"pwa-512x512.png",revision:"0885dd7ec8932e7f878b013d51a380a4"},{url:"robots.txt",revision:"d9339907142917dee4aac78494ac9cfe"},{url:"sw-downloads.js",revision:"48dab2e78bd93b4eee27fca487eccfde"},{url:"sw-notifications.js",revision:"fde578590ea8b0540d488ef448b48f45"},{url:"sw-secure-api.js",revision:"cf2bdbd03d41d66d60344c0b5a1075de"},{url:"manifest.webmanifest",revision:"83f9a43b74c236012adafb077fb6d774"}],{}),e.cleanupOutdatedCaches(),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("index.html"),{denylist:[/^\/api\//,/^\/__termdock-download\//,/^\/health$/]})),e.registerRoute(/\/assets\/.*\.(?:js|css)$/,new e.CacheFirst({cacheName:"termdock-lazy-assets-v1",plugins:[new e.CacheableResponsePlugin({statuses:[0,200]}),new e.ExpirationPlugin({maxEntries:96,maxAgeSeconds:2592e3})]}),"GET"),e.registerRoute(/\/fonts\/terminal\/[^/]+-[a-f0-9]{12}\.woff2$/,new e.CacheFirst({cacheName:"termdock-fonts-v2",plugins:[new e.CacheableResponsePlugin({statuses:[0,200]}),new e.ExpirationPlugin({maxEntries:384,maxAgeSeconds:2592e3})]}),"GET"),e.registerRoute(/\/fonts\/.*\.(?:woff2|ttf)$/,new e.StaleWhileRevalidate({cacheName:"termdock-fonts-v1",plugins:[new e.ExpirationPlugin({maxEntries:24,maxAgeSeconds:2592e3})]}),"GET")});
Binary file
Binary file
@@ -1,13 +1,13 @@
1
- import { RELAY_CLIENT_CONNECT_TIMEOUT_MS } from '../federation/streamLimits.js';
2
1
  import { encryptedRequestSubject } from '../federation/requestContext.js';
3
2
  import { randomUUID } from 'node:crypto';
4
3
  import { readFileSync, writeFileSync, renameSync, mkdirSync } from 'node:fs';
5
4
  import { dirname } from 'node:path';
6
- import WebSocket from 'ws';
7
- import { AsyncQueue, toBase64, fromBase64, PacketChannel } from '../federation/packets.js';
5
+ import { PacketChannel } from '../federation/packets.js';
8
6
  import { secureConnection } from '../federation/secureProtocol.js';
9
7
  import { socketDuplex } from '../federation/socketDuplex.js';
10
- import { readPinnedCertificateAuthority } from '../federation/trustedCa.js';
8
+ import { RelayTransport } from '../federation/relayTransport.js';
9
+ import { createServiceSocket, waitForServiceSocket } from '../federation/serviceTransport.js';
10
+ import { serviceEndpoint } from '../federation/connectionModel.js';
11
11
  import { COLLAB_LIMITS, STATUS_RANK } from './collaborationProtocol.js';
12
12
  import { terminalMessage } from './collaborationStore.js';
13
13
  /** The outer API gate already authenticated local CLI tokens. Browser callers
@@ -123,23 +123,19 @@ export class CollaborationRpc {
123
123
  this.pending.clear();
124
124
  }
125
125
  }
126
- export async function connectCollaborationRpc(identity, peer, endpoint, receive, configuredCa) {
126
+ export async function connectCollaborationRpc(identity, peer, endpoint, receive, configuredCa, certificateFingerprint256, signal) {
127
127
  validateCollaborationNode(peer);
128
- const ca = peer.caFingerprint256 ? await readPinnedCertificateAuthority(peer.origin, peer.caFingerprint256) : configuredCa;
129
- const url = endpoint ?? `${peer.origin.replace(/^https:/, 'wss:')}/api/federation/secure`;
130
- const socket = new WebSocket(url, { ca, rejectUnauthorized: true, followRedirects: false, handshakeTimeout: 3000, maxPayload: 1024 * 1024 });
131
- const relay = endpoint ? relayDuplex(socket, peer.serviceId) : undefined;
132
- const duplex = relay?.duplex ?? socketDuplex(socket);
128
+ const url = endpoint ?? serviceEndpoint(peer.origin).href;
129
+ const socket = await createServiceSocket(url, { ca: configuredCa, caFingerprint256: peer.caFingerprint256, certificateFingerprint256 }, { signal, handshakeTimeout: 3000 });
130
+ const relay = endpoint ? new RelayTransport(url, peer.serviceId, () => socket, { entryUrl: peer.origin }) : undefined;
131
+ const wire = relay || socket;
132
+ const duplex = socketDuplex(wire);
133
133
  try {
134
- await new Promise((resolve, reject) => {
135
- socket.once('open', resolve);
136
- socket.once('error', reject);
137
- socket.once('close', () => reject(new Error('PEER_DISCONNECTED')));
138
- });
139
- if (relay)
140
- await relay.ready;
141
- const secured = await secureConnection({ identity, duplex, initiator: true, targetPinnedPeerId: peer.serviceId, signal: AbortSignal.timeout(5000) });
134
+ await waitForServiceSocket(wire, signal);
135
+ const secured = await secureConnection({ identity, duplex, initiator: true, targetPinnedPeerId: peer.serviceId, signal: signal ? AbortSignal.any([signal, AbortSignal.timeout(5000)]) : AbortSignal.timeout(5000) });
142
136
  const rpc = new CollaborationRpc(new PacketChannel(secured.duplex), receive);
137
+ if (relay)
138
+ relay.addEventListener('close', () => rpc.close(relay.transportFailure), { once: true });
143
139
  if (receive) {
144
140
  try {
145
141
  await rpc.request({ type: 'collaboration-connect' });
@@ -160,57 +156,6 @@ export async function connectCollaborationRpc(identity, peer, endpoint, receive,
160
156
  throw error;
161
157
  }
162
158
  }
163
- function relayDuplex(socket, target) {
164
- const queue = new AsyncQueue(64), streamId = randomUUID();
165
- let readyResolve, readyReject;
166
- const ready = new Promise((resolve, reject) => { readyResolve = resolve; readyReject = reject; });
167
- void ready.catch(() => { });
168
- const timer = setTimeout(() => fail(new Error('ROUTE_TIMEOUT')), RELAY_CLIENT_CONNECT_TIMEOUT_MS);
169
- const fail = (error) => { clearTimeout(timer); readyReject(error); queue.end(error); socket.close(); };
170
- const send = (frame) => {
171
- if (socket.readyState !== 1 || socket.bufferedAmount > 1024 * 1024)
172
- throw new Error('ROUTE_CONGESTED');
173
- socket.send(JSON.stringify(frame));
174
- };
175
- socket.on('error', fail);
176
- socket.on('close', () => fail(new Error('ROUTE_CLOSED')));
177
- socket.on('message', (raw, binary) => {
178
- try {
179
- if (binary || raw.toString().length > 256 * 1024)
180
- throw new Error('INVALID_RELAY_FRAME');
181
- const frame = JSON.parse(raw.toString());
182
- if (frame.type === 'ready') {
183
- send({ type: 'open', streamId, serviceId: target });
184
- return;
185
- }
186
- if (frame.streamId !== streamId)
187
- return;
188
- if (frame.type === 'opened') {
189
- clearTimeout(timer);
190
- readyResolve();
191
- return;
192
- }
193
- if (frame.type !== 'data' || frame.encoding !== 'base64' || typeof frame.payload !== 'string')
194
- throw new Error('ROUTE_CLOSED');
195
- queue.push(fromBase64(frame.payload));
196
- }
197
- catch (error) {
198
- fail(error instanceof Error ? error : new Error('INVALID_RELAY_FRAME'));
199
- }
200
- });
201
- return { ready, duplex: { source: queue, close: () => socket.close(), async sink(source) {
202
- await ready;
203
- for await (const bytes of source)
204
- for (let offset = 0; offset < bytes.length; offset += 65536) {
205
- while (socket.bufferedAmount > 256 * 1024) {
206
- if (socket.readyState !== 1)
207
- throw new Error('ROUTE_CLOSED');
208
- await new Promise(resolve => setTimeout(resolve, 10));
209
- }
210
- send({ type: 'data', streamId, encoding: 'base64', payload: toBase64(bytes.subarray(offset, offset + 65536)) });
211
- }
212
- } } };
213
- }
214
159
  /** Group-scoped, durable server-to-server delivery. A binding is installed only
215
160
  * by an already authorized group administrator, never by the remote peer itself. */
216
161
  export class CollaborationPeerTransport {
@@ -620,6 +620,11 @@ export class CollaborationStore {
620
620
  this.persist(true);
621
621
  return reply;
622
622
  }
623
+ /** References only: callers can select a bounded page before projecting bodies. */
624
+ listGroupMessages(groupId) {
625
+ this.expire();
626
+ return this.document.messages.filter(message => message.groupId === groupId);
627
+ }
623
628
  listMessages(groupId, limit = 200) {
624
629
  return this.document.messages.filter((message) => message.groupId === groupId).slice(-Math.max(1, Math.min(limit, 500)));
625
630
  }
@@ -54,7 +54,7 @@ const OWNED_FILE_STEM_JS = 'termdock.js';
54
54
  function targetPath(agent) {
55
55
  switch (agent) {
56
56
  case 'claude': return claudeSettingsPath();
57
- case 'codex': return path.join(homeDir(), '.codex', 'hooks.json');
57
+ case 'codex': return path.join(process.env.CODEX_HOME?.trim() || path.join(homeDir(), '.codex'), 'hooks.json');
58
58
  case 'copilot': return path.join(homeDir(), '.copilot', 'hooks', OWNED_FILE_STEM_JSON);
59
59
  case 'opencode': return path.join(xdgConfigDir(), 'opencode', 'plugins', OWNED_FILE_STEM_JS);
60
60
  case 'pi': return path.join(homeDir(), '.pi', 'agent', 'extensions', 'termdock', 'index.ts');
@@ -92,7 +92,7 @@ function hookCommand(agent, event) {
92
92
  /** Substring identifying a hook entry / owned file as termdock's. Every
93
93
  * generated command and file embeds `agent-hook <slug>` verbatim. */
94
94
  function marker(agent) {
95
- return `agent-hook ${agent}`;
95
+ return `agent-hook ${agent} `;
96
96
  }
97
97
  /** Best-effort atomic write: tmp file + rename. */
98
98
  function writeAtomic(file, content) {
@@ -116,6 +116,8 @@ function writeAtomic(file, content) {
116
116
  const CLAUDE_HOOK_EVENTS = [
117
117
  ['SessionStart', 'session-start'],
118
118
  ['UserPromptSubmit', 'prompt-submit'],
119
+ ['PermissionRequest', 'permission-request'],
120
+ ['PreToolUse', 'tool-start'],
119
121
  ['Notification', 'notification'],
120
122
  ['PostToolUse', 'tool-complete'],
121
123
  ['Stop', 'stop'],
@@ -126,8 +128,10 @@ const CODEX_HOOK_EVENTS = [
126
128
  ['SessionStart', 'session-start'],
127
129
  ['UserPromptSubmit', 'prompt-submit'],
128
130
  ['PermissionRequest', 'permission-request'],
131
+ ['PreToolUse', 'tool-start'],
129
132
  ['PostToolUse', 'tool-complete'],
130
133
  ['Stop', 'stop'],
134
+ ['Interrupt', 'stop'],
131
135
  ['SessionEnd', 'session-end'],
132
136
  ];
133
137
  /** Shared budget for Termdock status emitters, in seconds. */
@@ -205,6 +209,22 @@ function markerCommand(entry, mark) {
205
209
  }
206
210
  return null;
207
211
  }
212
+ /** Remove only our handlers, including when a user grouped their own
213
+ * command alongside ours. Preserve matcher metadata and unrelated agents. */
214
+ function removeOwnedHookHandlers(list, mark) {
215
+ return list.flatMap((entry) => {
216
+ if (!entry || typeof entry !== 'object' || !Array.isArray(entry.hooks))
217
+ return [entry];
218
+ const group = entry;
219
+ const handlers = group.hooks;
220
+ const kept = handlers.filter(handler => !handler || typeof handler !== 'object'
221
+ || typeof handler.command !== 'string'
222
+ || !handler.command.includes(mark));
223
+ if (kept.length === handlers.length)
224
+ return [entry];
225
+ return kept.length ? [{ ...group, hooks: kept }] : [];
226
+ });
227
+ }
208
228
  function hookMapState(file, agent, events) {
209
229
  const root = readJsonObject(file);
210
230
  if (!root)
@@ -272,7 +292,7 @@ function hookMapInstall(file, agent, events) {
272
292
  if (!Array.isArray(list))
273
293
  continue; // malformed user config; leave it alone
274
294
  // Drop any previous termdock entry (stale exe path), then append ours.
275
- const kept = list.filter((entry) => markerCommand(entry, mark) === null);
295
+ const kept = removeOwnedHookHandlers(list, mark);
276
296
  const handler = { type: 'command', command };
277
297
  handler.timeout = hookTimeout(sentinel);
278
298
  kept.push({ hooks: [handler] });
@@ -295,8 +315,8 @@ function hookMapUninstall(file, agent) {
295
315
  const list = hooks[eventName];
296
316
  if (!Array.isArray(list))
297
317
  continue;
298
- const kept = list.filter((entry) => markerCommand(entry, mark) === null);
299
- removed += list.length - kept.length;
318
+ const kept = removeOwnedHookHandlers(list, mark);
319
+ removed += list.filter(entry => markerCommand(entry, mark) !== null).length;
300
320
  if (kept.length === 0) {
301
321
  delete hooks[eventName];
302
322
  }
@@ -681,13 +701,33 @@ export function hooksState(agent) {
681
701
  return ownedFileState(file, expected, marker(agent));
682
702
  }
683
703
  let codexRuntimeStateCache = null;
704
+ export function codexHookRegistryState(hooks) {
705
+ let approvalNeeded = false;
706
+ for (const [event, sentinel] of CODEX_HOOK_EVENTS) {
707
+ const eventName = event[0].toLowerCase() + event.slice(1);
708
+ const matching = hooks.filter(hook => hook.eventName === eventName && hook.command === hookCommand('codex', sentinel));
709
+ if (!matching.length)
710
+ return 'outdated';
711
+ if (!matching.some(hook => hook.enabled === true && ['trusted', 'managed'].includes(hook.trustStatus ?? '')))
712
+ approvalNeeded = true;
713
+ }
714
+ return approvalNeeded ? 'needs-approval' : 'installed';
715
+ }
684
716
  /** Query Codex's own hook registry: a structurally present hook can still be
685
717
  * quarantined until the user approves its current hash in `/hooks`. */
686
718
  async function codexRuntimeHooksState() {
687
719
  const structural = hooksState('codex');
688
720
  if (structural !== 'installed')
689
721
  return structural;
690
- if (codexRuntimeStateCache && Date.now() - codexRuntimeStateCache.at < 30_000) {
722
+ let stat;
723
+ try {
724
+ stat = fs.statSync(targetPath('codex'));
725
+ }
726
+ catch {
727
+ return 'unverified';
728
+ }
729
+ const key = `${targetPath('codex')}:${stat.mtimeMs}:${stat.size}:${process.cwd()}`;
730
+ if (codexRuntimeStateCache?.key === key && Date.now() - codexRuntimeStateCache.at < 30_000) {
691
731
  return codexRuntimeStateCache.state;
692
732
  }
693
733
  const state = await new Promise((resolve) => {
@@ -705,11 +745,17 @@ async function codexRuntimeHooksState() {
705
745
  child.kill();
706
746
  resolve(value);
707
747
  };
708
- const timer = setTimeout(() => finish(structural), 5_000);
748
+ const timer = setTimeout(() => finish('unverified'), 5_000);
709
749
  timer.unref?.();
710
- child.on('error', () => finish(structural));
750
+ child.on('error', () => finish('unverified'));
751
+ child.on('close', () => finish('unverified'));
752
+ child.stdin.on('error', () => finish('unverified'));
711
753
  child.stdout.on('data', (chunk) => {
712
754
  buffer += chunk.toString();
755
+ if (buffer.length > 1024 * 1024) {
756
+ finish('unverified');
757
+ return;
758
+ }
713
759
  for (;;) {
714
760
  const newline = buffer.indexOf('\n');
715
761
  if (newline < 0)
@@ -725,28 +771,31 @@ async function codexRuntimeHooksState() {
725
771
  catch {
726
772
  continue;
727
773
  }
774
+ if (message.error && (message.id === 1 || message.id === 2)) {
775
+ finish('unverified');
776
+ return;
777
+ }
728
778
  if (message.id === 1) {
729
779
  child.stdin.write(`${JSON.stringify({ method: 'initialized', params: {} })}\n`);
730
780
  child.stdin.write(`${JSON.stringify({ id: 2, method: 'hooks/list', params: { cwds: [process.cwd()] } })}\n`);
731
781
  }
732
782
  else if (message.id === 2) {
733
- const ours = (message.result?.data ?? [])
734
- .flatMap((entry) => entry.hooks ?? [])
735
- .filter((hook) => typeof hook.command === 'string' && hook.command.includes(marker('codex')));
736
- if (ours.length < CODEX_HOOK_EVENTS.length)
737
- finish('outdated');
738
- else if (ours.some((hook) => hook.enabled === false || !['trusted', 'managed'].includes(hook.trustStatus ?? '')))
739
- finish('needs-approval');
740
- else
741
- finish('installed');
783
+ if (!Array.isArray(message.result?.data)) {
784
+ finish('unverified');
785
+ return;
786
+ }
787
+ finish(codexHookRegistryState(message.result.data.flatMap(entry => entry.hooks ?? [])));
742
788
  }
743
789
  }
744
790
  });
745
791
  child.stdin.write(`${JSON.stringify({ id: 1, method: 'initialize', params: { clientInfo: { name: 'termdock', version: '1' } } })}\n`);
746
792
  });
747
- codexRuntimeStateCache = { at: Date.now(), state };
793
+ codexRuntimeStateCache = { at: Date.now(), key, state };
748
794
  return state;
749
795
  }
796
+ export async function runtimeHooksStateForSlug(slug) {
797
+ return slug === 'codex' ? codexRuntimeHooksState() : hooksStateForSlug(slug);
798
+ }
750
799
  export function listHookAgents() {
751
800
  return HOOK_AGENTS.map((slug) => ({
752
801
  slug,
@@ -908,18 +957,17 @@ export function pluginHooksState(slug, file, events) {
908
957
  const list = hooks && typeof hooks === 'object'
909
958
  ? hooks[hookEvent]
910
959
  : null;
911
- const ours = Array.isArray(list)
912
- ? list.find((entry) => markerCommand(entry, mark) !== null)
913
- : undefined;
914
- if (ours !== undefined) {
960
+ const ours = Array.isArray(list) ? list.filter((entry) => markerCommand(entry, mark) !== null) : [];
961
+ if (ours.length) {
915
962
  any = true;
916
- const group = ours && typeof ours === 'object' ? ours : {};
917
- const handler = Array.isArray(group.hooks) && group.hooks[0] && typeof group.hooks[0] === 'object'
918
- ? group.hooks[0]
919
- : {};
920
- if (handler.command !== hookCommandForPlugin(slug, sentinel, status)
921
- || (matcher ?? undefined) !== group.matcher
922
- || (timeout ?? hookTimeout(sentinel)) !== handler.timeout)
963
+ const covered = ours.some((entry) => {
964
+ const group = entry;
965
+ return (matcher ?? undefined) === group.matcher && Array.isArray(group.hooks)
966
+ && group.hooks.some(handler => handler && typeof handler === 'object'
967
+ && handler.command === hookCommandForPlugin(slug, sentinel, status)
968
+ && handler.timeout === (timeout ?? hookTimeout(sentinel)));
969
+ });
970
+ if (!covered)
923
971
  complete = false;
924
972
  }
925
973
  else {
@@ -954,6 +1002,12 @@ export function installPluginHooks(slug, file, events) {
954
1002
  }
955
1003
  const hooks = root.hooks;
956
1004
  const mark = marker(slug);
1005
+ // Clear the previous owned set once, then add every mapping. Clearing on
1006
+ // each mapping loses all but the last matcher sharing a native hook event.
1007
+ for (const [eventName, list] of Object.entries(hooks)) {
1008
+ if (Array.isArray(list))
1009
+ hooks[eventName] = removeOwnedHookHandlers(list, mark);
1010
+ }
957
1011
  for (const [hookEvent, sentinel, matcher, timeout, status] of events) {
958
1012
  const command = hookCommandForPlugin(slug, sentinel, status);
959
1013
  let list = hooks[hookEvent];
@@ -963,7 +1017,7 @@ export function installPluginHooks(slug, file, events) {
963
1017
  }
964
1018
  if (!Array.isArray(list))
965
1019
  continue;
966
- const kept = list.filter((entry) => markerCommand(entry, mark) === null);
1020
+ const kept = [...list];
967
1021
  const handler = { type: 'command', command };
968
1022
  handler.timeout = timeout ?? hookTimeout(sentinel);
969
1023
  const entry = { hooks: [handler] };
@@ -988,8 +1042,8 @@ function uninstallPluginHooks(slug, file) {
988
1042
  const list = hooks[eventName];
989
1043
  if (!Array.isArray(list))
990
1044
  continue;
991
- const kept = list.filter((entry) => markerCommand(entry, mark) === null);
992
- removed += list.length - kept.length;
1045
+ const kept = removeOwnedHookHandlers(list, mark);
1046
+ removed += list.filter(entry => markerCommand(entry, mark) !== null).length;
993
1047
  if (kept.length === 0) {
994
1048
  delete hooks[eventName];
995
1049
  }
@@ -1014,7 +1068,9 @@ export function refreshStaleHooksAtLaunch() {
1014
1068
  if (hooksState(agent) !== 'outdated')
1015
1069
  continue;
1016
1070
  try {
1017
- void installHooks(agent);
1071
+ void installHooks(agent).catch((error) => {
1072
+ console.warn(`[agent-hooks] could not refresh stale ${agent} hooks:`, error.message);
1073
+ });
1018
1074
  refreshed++;
1019
1075
  console.log(`[agent-hooks] refreshed stale ${agent} hooks at ${abbreviateHome(targetPath(agent))}`);
1020
1076
  }
@@ -9,7 +9,16 @@ import { terminalMessage } from './collaborationStore.js';
9
9
  import { IntegrationStore, INTEGRATION_PROTOCOL, INTEGRATION_OPERATIONS, atomicJson, integrationError } from './integrationStore.js';
10
10
  import { IntegrationSessions, publicIntegrationSession } from './integrationSessions.js';
11
11
  import { getTermdockVersion } from '../utils/version.js';
12
- export function integrationSocketPath(port) { return path.join(homedir(), '.termdock', `integration-${port}.sock`); }
12
+ export function integrationSocketPath(port, home = homedir()) {
13
+ const preferred = path.join(home, '.termdock', `integration-${port}.sock`);
14
+ // Darwin's sockaddr_un is shorter than Linux's. Node can truncate a long
15
+ // pathname while binding, leaving chmod and clients looking at another name.
16
+ if (Buffer.byteLength(preferred) < 100)
17
+ return preferred;
18
+ const owner = process.getuid?.() ?? 'user';
19
+ const key = createHash('sha256').update(home).digest('hex').slice(0, 16);
20
+ return path.join('/tmp', `td-integration-${owner}-${key}`, `${port}.sock`);
21
+ }
13
22
  function scopedId(input, ids, type) {
14
23
  if (typeof input !== 'string')
15
24
  integrationError(`INVALID_${type}_ID`, 'A message or member id is required');
@@ -618,6 +627,14 @@ export class IntegrationRuntime {
618
627
  }
619
628
  async listen() {
620
629
  fs.mkdirSync(path.dirname(this.options.socketPath), { recursive: true, mode: 0o700 });
630
+ const directory = path.dirname(this.options.socketPath);
631
+ if (directory.startsWith('/tmp/td-integration-')) {
632
+ const stat = fs.lstatSync(directory);
633
+ if (!stat.isDirectory() || (process.getuid && stat.uid !== process.getuid())) {
634
+ integrationError('INTEGRATION_SOCKET_DIRECTORY_INVALID', 'Socket directory must be private and owned by this user');
635
+ }
636
+ fs.chmodSync(directory, 0o700);
637
+ }
621
638
  // A stale socket may be removed only after proving no listener exists.
622
639
  if (fs.existsSync(this.options.socketPath)) {
623
640
  const { createConnection } = await import('node:net');
@@ -635,7 +652,19 @@ export class IntegrationRuntime {
635
652
  integrationError('INTEGRATION_SOCKET_INVALID', 'Refusing to replace a non-socket file');
636
653
  fs.unlinkSync(this.options.socketPath);
637
654
  }
638
- await new Promise((resolve, reject) => { this.server.once('error', reject); this.server.listen(this.options.socketPath, () => { this.server.removeListener('error', reject); fs.chmodSync(this.options.socketPath, 0o600); resolve(); }); });
655
+ await new Promise((resolve, reject) => {
656
+ this.server.once('error', reject);
657
+ this.server.listen(this.options.socketPath, () => {
658
+ this.server.removeListener('error', reject);
659
+ try {
660
+ fs.chmodSync(this.options.socketPath, 0o600);
661
+ resolve();
662
+ }
663
+ catch (error) {
664
+ reject(error);
665
+ }
666
+ });
667
+ });
639
668
  this.sync();
640
669
  await this.sessions.refreshAll();
641
670
  void this.pumpReleaseBatches();
@@ -11,36 +11,63 @@ const MAX_PACKAGE_BYTES = 16 * 1024 * 1024;
11
11
  const MAX_SINGLE_FILE_BYTES = 8 * 1024 * 1024;
12
12
  const GIT_TIMEOUT_MS = 45_000;
13
13
  const IGNORED_NAMES = new Set(['.git', '.github', 'node_modules', SOURCE_METADATA_FILE]);
14
- const DEFAULT_GIT_HOSTS = new Set(['github.com', 'gitlab.com', 'codeberg.org', 'bitbucket.org']);
15
14
  function hardenedGitEnv() {
16
- return {
15
+ const env = {
17
16
  ...process.env,
18
17
  GIT_TERMINAL_PROMPT: '0',
19
- GIT_CONFIG_COUNT: '0',
20
- GIT_CONFIG_GLOBAL: '/dev/null',
21
- GIT_CONFIG_SYSTEM: '/dev/null',
18
+ GIT_LFS_SKIP_SMUDGE: '1',
22
19
  };
20
+ // Keep the service user's credential helpers, SSH agent/config, CA and
21
+ // proxy settings. Only repository-local context inherited from a caller
22
+ // must not redirect these operations into another working tree.
23
+ for (const key of ['GIT_DIR', 'GIT_WORK_TREE', 'GIT_INDEX_FILE', 'GIT_COMMON_DIR',
24
+ 'GIT_OBJECT_DIRECTORY', 'GIT_ALTERNATE_OBJECT_DIRECTORIES'])
25
+ delete env[key];
26
+ if (!env.GIT_SSH_COMMAND && !env.GIT_SSH)
27
+ env.GIT_SSH_COMMAND = 'ssh -o BatchMode=yes';
28
+ return env;
23
29
  }
24
- function allowedGitHosts() {
30
+ const GIT_OPTIONS = [
31
+ '-c', `core.hooksPath=${os.devNull}`,
32
+ '-c', 'protocol.allow=never',
33
+ '-c', 'protocol.http.allow=always',
34
+ '-c', 'protocol.https.allow=always',
35
+ '-c', 'protocol.ssh.allow=always',
36
+ '-c', 'filter.lfs.smudge=',
37
+ '-c', 'filter.lfs.process=',
38
+ '-c', 'filter.lfs.required=false',
39
+ ];
40
+ function gitHostAllowed(host) {
25
41
  const configured = (process.env.TERMDOCK_PLUGIN_GIT_HOSTS ?? '')
26
42
  .split(',')
27
43
  .map((host) => host.trim().toLowerCase())
28
44
  .filter(Boolean);
29
- return new Set([...DEFAULT_GIT_HOSTS, ...configured]);
45
+ // An explicit administrative allowlist is optional. Self-hosted and
46
+ // private-network hosts work without having to edit service environment.
47
+ return configured.length === 0 || configured.includes(host.toLowerCase());
30
48
  }
31
49
  export function normalizeGitPluginSource(input) {
50
+ const source = input.trim();
51
+ if (!source || source.startsWith('-') || /[\x00-\x20\x7f]/.test(source) || /^[A-Za-z]:[\\/]/.test(source))
52
+ return null;
53
+ if (!source.includes('://')) {
54
+ const scp = /^(?:[A-Za-z0-9_.-]+@)?(\[[0-9a-fA-F:]+\]|[A-Za-z0-9][A-Za-z0-9._-]*):([^?#\\]+)$/.exec(source);
55
+ if (!scp || scp[2].startsWith('-') || !gitHostAllowed(scp[1]))
56
+ return null;
57
+ return source;
58
+ }
32
59
  let url;
33
60
  try {
34
- url = new URL(input.trim());
61
+ url = new URL(source);
35
62
  }
36
63
  catch {
37
64
  return null;
38
65
  }
39
- if (url.protocol !== 'https:' || url.username || url.password || url.search || url.hash)
66
+ if (!['https:', 'http:', 'ssh:'].includes(url.protocol) || url.password || url.search || url.hash)
40
67
  return null;
41
- if (!allowedGitHosts().has(url.hostname.toLowerCase()))
68
+ if (!url.hostname || url.hostname.startsWith('-') || !gitHostAllowed(url.hostname))
42
69
  return null;
43
- if (!/^\/[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+(?:\.git)?\/?$/.test(url.pathname))
70
+ if (url.pathname === '/' || /%0[0-9a-f]|%1[0-9a-f]|%7f/i.test(url.pathname))
44
71
  return null;
45
72
  url.pathname = url.pathname.replace(/\/$/, '');
46
73
  return url.toString();
@@ -157,10 +184,7 @@ export async function preparePluginPackage(sourceInput, expectedSlug) {
157
184
  if (remote) {
158
185
  packageDir = path.join(temporaryRoot, 'repo');
159
186
  await execFileAsync('git', [
160
- '-c', 'credential.helper=',
161
- '-c', 'core.hooksPath=/dev/null',
162
- '-c', 'filter.lfs.smudge=',
163
- '-c', 'filter.lfs.required=false',
187
+ ...GIT_OPTIONS,
164
188
  'clone', '--depth', '1', '--single-branch', '--no-recurse-submodules', '--', remote, packageDir,
165
189
  ], {
166
190
  timeout: GIT_TIMEOUT_MS,
@@ -170,16 +194,20 @@ export async function preparePluginPackage(sourceInput, expectedSlug) {
170
194
  const result = await execFileAsync('git', ['-C', packageDir, 'rev-parse', 'HEAD'], {
171
195
  timeout: 5000,
172
196
  maxBuffer: 128 * 1024,
197
+ env: hardenedGitEnv(),
173
198
  });
174
199
  revision = result.stdout.trim();
175
200
  type = 'git';
176
201
  normalizedSource = remote;
177
202
  }
178
203
  else {
179
- const resolved = path.resolve(source);
204
+ if (source.includes('://') || /^(?:[^/]+@[^/]+:|[^/]+::)/.test(source)) {
205
+ throw new Error('Unsupported Git source: use an HTTPS, HTTP or SSH repository URL, an scp-style Git address, or a local package directory');
206
+ }
207
+ const resolved = path.resolve(source === '~' ? os.homedir() : source.startsWith('~/') ? path.join(os.homedir(), source.slice(2)) : source);
180
208
  const stat = await fs.promises.stat(resolved).catch(() => null);
181
209
  if (!stat)
182
- throw new Error('Plugin source must be an existing local path or an allowed HTTPS Git repository');
210
+ throw new Error('Plugin source must be an existing local path or an accessible HTTPS, HTTP or SSH Git repository');
183
211
  packageDir = stat.isDirectory() ? resolved : path.dirname(resolved);
184
212
  if (!stat.isDirectory() && path.basename(resolved) !== MANIFEST_FILE) {
185
213
  throw new Error('A local plugin file must be named manifest.json');
@@ -224,8 +252,10 @@ export async function preparePluginPackage(sourceInput, expectedSlug) {
224
252
  export async function commitPreparedPlugin(prepared, replace = false) {
225
253
  await fs.promises.mkdir(PLUGINS_DIR, { recursive: true });
226
254
  const target = path.join(PLUGINS_DIR, prepared.manifest.slug);
227
- if (!replace && fs.existsSync(target))
255
+ if (!replace && fs.existsSync(target)) {
256
+ await prepared.cleanup();
228
257
  throw new Error(`Plugin "${prepared.manifest.slug}" already exists`);
258
+ }
229
259
  const stage = path.join(PLUGINS_DIR, `.stage-${prepared.manifest.slug}-${randomUUID()}`);
230
260
  const backup = path.join(PLUGINS_DIR, `.backup-${prepared.manifest.slug}-${randomUUID()}`);
231
261
  try {
@@ -260,11 +290,10 @@ export async function checkPluginPackageUpdate(plugin) {
260
290
  if (metadata.type === 'git') {
261
291
  const remote = normalizeGitPluginSource(metadata.source);
262
292
  if (!remote)
263
- throw new Error('The stored Git source is no longer allowed');
293
+ throw new Error('The stored Git source is invalid or excluded by TERMDOCK_PLUGIN_GIT_HOSTS');
264
294
  const { stdout } = await execFileAsync('git', [
265
- '-c', 'credential.helper=',
266
- '-c', 'core.hooksPath=/dev/null',
267
- 'ls-remote', remote, 'HEAD',
295
+ ...GIT_OPTIONS,
296
+ 'ls-remote', '--', remote, 'HEAD',
268
297
  ], {
269
298
  timeout: 15_000,
270
299
  maxBuffer: 128 * 1024,