@quenty/studio-bridge 0.7.1 → 0.9.0

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 (689) hide show
  1. package/CHANGELOG.md +14 -42
  2. package/README.md +166 -115
  3. package/dist/src/bridge/bridge-connection-remote.test.d.ts +7 -0
  4. package/dist/src/bridge/bridge-connection-remote.test.d.ts.map +1 -0
  5. package/dist/src/bridge/bridge-connection-remote.test.js +144 -0
  6. package/dist/src/bridge/bridge-connection-remote.test.js.map +1 -0
  7. package/dist/src/bridge/bridge-connection.d.ts +112 -0
  8. package/dist/src/bridge/bridge-connection.d.ts.map +1 -0
  9. package/dist/src/bridge/bridge-connection.js +528 -0
  10. package/dist/src/bridge/bridge-connection.js.map +1 -0
  11. package/dist/src/bridge/bridge-connection.test.d.ts +6 -0
  12. package/dist/src/bridge/bridge-connection.test.d.ts.map +1 -0
  13. package/dist/src/bridge/bridge-connection.test.js +773 -0
  14. package/dist/src/bridge/bridge-connection.test.js.map +1 -0
  15. package/dist/src/bridge/bridge-session.d.ts +38 -0
  16. package/dist/src/bridge/bridge-session.d.ts.map +1 -0
  17. package/dist/src/bridge/bridge-session.js +259 -0
  18. package/dist/src/bridge/bridge-session.js.map +1 -0
  19. package/dist/src/bridge/bridge-session.test.d.ts +6 -0
  20. package/dist/src/bridge/bridge-session.test.d.ts.map +1 -0
  21. package/dist/src/bridge/bridge-session.test.js +264 -0
  22. package/dist/src/bridge/bridge-session.test.js.map +1 -0
  23. package/dist/src/bridge/index.d.ts +13 -0
  24. package/dist/src/bridge/index.d.ts.map +1 -0
  25. package/dist/src/bridge/index.js +13 -0
  26. package/dist/src/bridge/index.js.map +1 -0
  27. package/dist/src/bridge/internal/__tests__/failover-crash.test.d.ts +9 -0
  28. package/dist/src/bridge/internal/__tests__/failover-crash.test.d.ts.map +1 -0
  29. package/dist/src/bridge/internal/__tests__/failover-crash.test.js +159 -0
  30. package/dist/src/bridge/internal/__tests__/failover-crash.test.js.map +1 -0
  31. package/dist/src/bridge/internal/__tests__/failover-graceful.test.d.ts +9 -0
  32. package/dist/src/bridge/internal/__tests__/failover-graceful.test.d.ts.map +1 -0
  33. package/dist/src/bridge/internal/__tests__/failover-graceful.test.js +218 -0
  34. package/dist/src/bridge/internal/__tests__/failover-graceful.test.js.map +1 -0
  35. package/dist/src/bridge/internal/__tests__/failover-inflight.test.d.ts +9 -0
  36. package/dist/src/bridge/internal/__tests__/failover-inflight.test.d.ts.map +1 -0
  37. package/dist/src/bridge/internal/__tests__/failover-inflight.test.js +246 -0
  38. package/dist/src/bridge/internal/__tests__/failover-inflight.test.js.map +1 -0
  39. package/dist/src/bridge/internal/__tests__/host-client-integration.test.d.ts +10 -0
  40. package/dist/src/bridge/internal/__tests__/host-client-integration.test.d.ts.map +1 -0
  41. package/dist/src/bridge/internal/__tests__/host-client-integration.test.js +298 -0
  42. package/dist/src/bridge/internal/__tests__/host-client-integration.test.js.map +1 -0
  43. package/dist/src/bridge/internal/bridge-client.d.ts +70 -0
  44. package/dist/src/bridge/internal/bridge-client.d.ts.map +1 -0
  45. package/dist/src/bridge/internal/bridge-client.js +344 -0
  46. package/dist/src/bridge/internal/bridge-client.js.map +1 -0
  47. package/dist/src/bridge/internal/bridge-client.test.d.ts +7 -0
  48. package/dist/src/bridge/internal/bridge-client.test.d.ts.map +1 -0
  49. package/dist/src/bridge/internal/bridge-client.test.js +301 -0
  50. package/dist/src/bridge/internal/bridge-client.test.js.map +1 -0
  51. package/dist/src/bridge/internal/bridge-host.d.ts +78 -0
  52. package/dist/src/bridge/internal/bridge-host.d.ts.map +1 -0
  53. package/dist/src/bridge/internal/bridge-host.js +383 -0
  54. package/dist/src/bridge/internal/bridge-host.js.map +1 -0
  55. package/dist/src/bridge/internal/bridge-host.test.d.ts +7 -0
  56. package/dist/src/bridge/internal/bridge-host.test.d.ts.map +1 -0
  57. package/dist/src/bridge/internal/bridge-host.test.js +377 -0
  58. package/dist/src/bridge/internal/bridge-host.test.js.map +1 -0
  59. package/dist/src/bridge/internal/environment-detection.d.ts +44 -0
  60. package/dist/src/bridge/internal/environment-detection.d.ts.map +1 -0
  61. package/dist/src/bridge/internal/environment-detection.js +91 -0
  62. package/dist/src/bridge/internal/environment-detection.js.map +1 -0
  63. package/dist/src/bridge/internal/environment-detection.test.d.ts +7 -0
  64. package/dist/src/bridge/internal/environment-detection.test.d.ts.map +1 -0
  65. package/dist/src/bridge/internal/environment-detection.test.js +150 -0
  66. package/dist/src/bridge/internal/environment-detection.test.js.map +1 -0
  67. package/dist/src/bridge/internal/hand-off.d.ts +69 -0
  68. package/dist/src/bridge/internal/hand-off.d.ts.map +1 -0
  69. package/dist/src/bridge/internal/hand-off.js +178 -0
  70. package/dist/src/bridge/internal/hand-off.js.map +1 -0
  71. package/dist/src/bridge/internal/hand-off.test.d.ts +7 -0
  72. package/dist/src/bridge/internal/hand-off.test.d.ts.map +1 -0
  73. package/dist/src/bridge/internal/hand-off.test.js +325 -0
  74. package/dist/src/bridge/internal/hand-off.test.js.map +1 -0
  75. package/dist/src/bridge/internal/health-endpoint.d.ts +32 -0
  76. package/dist/src/bridge/internal/health-endpoint.d.ts.map +1 -0
  77. package/dist/src/bridge/internal/health-endpoint.js +73 -0
  78. package/dist/src/bridge/internal/health-endpoint.js.map +1 -0
  79. package/dist/src/bridge/internal/health-endpoint.test.d.ts +6 -0
  80. package/dist/src/bridge/internal/health-endpoint.test.d.ts.map +1 -0
  81. package/dist/src/bridge/internal/health-endpoint.test.js +122 -0
  82. package/dist/src/bridge/internal/health-endpoint.test.js.map +1 -0
  83. package/dist/src/bridge/internal/host-protocol.d.ts +60 -0
  84. package/dist/src/bridge/internal/host-protocol.d.ts.map +1 -0
  85. package/dist/src/bridge/internal/host-protocol.js +184 -0
  86. package/dist/src/bridge/internal/host-protocol.js.map +1 -0
  87. package/dist/src/bridge/internal/host-protocol.test.d.ts +6 -0
  88. package/dist/src/bridge/internal/host-protocol.test.d.ts.map +1 -0
  89. package/dist/src/bridge/internal/host-protocol.test.js +307 -0
  90. package/dist/src/bridge/internal/host-protocol.test.js.map +1 -0
  91. package/dist/src/bridge/internal/session-tracker.d.ts +67 -0
  92. package/dist/src/bridge/internal/session-tracker.d.ts.map +1 -0
  93. package/dist/src/bridge/internal/session-tracker.js +138 -0
  94. package/dist/src/bridge/internal/session-tracker.js.map +1 -0
  95. package/dist/src/bridge/internal/session-tracker.test.d.ts +6 -0
  96. package/dist/src/bridge/internal/session-tracker.test.d.ts.map +1 -0
  97. package/dist/src/bridge/internal/session-tracker.test.js +342 -0
  98. package/dist/src/bridge/internal/session-tracker.test.js.map +1 -0
  99. package/dist/src/bridge/internal/transport-client.d.ts +43 -0
  100. package/dist/src/bridge/internal/transport-client.d.ts.map +1 -0
  101. package/dist/src/bridge/internal/transport-client.js +146 -0
  102. package/dist/src/bridge/internal/transport-client.js.map +1 -0
  103. package/dist/src/bridge/internal/transport-client.test.d.ts +6 -0
  104. package/dist/src/bridge/internal/transport-client.test.d.ts.map +1 -0
  105. package/dist/src/bridge/internal/transport-client.test.js +176 -0
  106. package/dist/src/bridge/internal/transport-client.test.js.map +1 -0
  107. package/dist/src/bridge/internal/transport-server.d.ts +59 -0
  108. package/dist/src/bridge/internal/transport-server.d.ts.map +1 -0
  109. package/dist/src/bridge/internal/transport-server.js +189 -0
  110. package/dist/src/bridge/internal/transport-server.js.map +1 -0
  111. package/dist/src/bridge/internal/transport-server.test.d.ts +6 -0
  112. package/dist/src/bridge/internal/transport-server.test.d.ts.map +1 -0
  113. package/dist/src/bridge/internal/transport-server.test.js +171 -0
  114. package/dist/src/bridge/internal/transport-server.test.js.map +1 -0
  115. package/dist/src/bridge/types.d.ts +117 -0
  116. package/dist/src/bridge/types.d.ts.map +1 -0
  117. package/dist/src/bridge/types.js +68 -0
  118. package/dist/src/bridge/types.js.map +1 -0
  119. package/dist/src/cli/adapters/cli-command-adapter-handler.test.d.ts +6 -0
  120. package/dist/src/cli/adapters/cli-command-adapter-handler.test.d.ts.map +1 -0
  121. package/dist/src/cli/adapters/cli-command-adapter-handler.test.js +260 -0
  122. package/dist/src/cli/adapters/cli-command-adapter-handler.test.js.map +1 -0
  123. package/dist/src/cli/adapters/cli-command-adapter.d.ts +39 -0
  124. package/dist/src/cli/adapters/cli-command-adapter.d.ts.map +1 -0
  125. package/dist/src/cli/adapters/cli-command-adapter.js +241 -0
  126. package/dist/src/cli/adapters/cli-command-adapter.js.map +1 -0
  127. package/dist/src/cli/adapters/cli-command-adapter.test.d.ts +5 -0
  128. package/dist/src/cli/adapters/cli-command-adapter.test.d.ts.map +1 -0
  129. package/dist/src/cli/adapters/cli-command-adapter.test.js +188 -0
  130. package/dist/src/cli/adapters/cli-command-adapter.test.js.map +1 -0
  131. package/dist/src/cli/adapters/group-builder.d.ts +29 -0
  132. package/dist/src/cli/adapters/group-builder.d.ts.map +1 -0
  133. package/dist/src/cli/adapters/group-builder.js +54 -0
  134. package/dist/src/cli/adapters/group-builder.js.map +1 -0
  135. package/dist/src/cli/adapters/group-builder.test.d.ts +5 -0
  136. package/dist/src/cli/adapters/group-builder.test.d.ts.map +1 -0
  137. package/dist/src/cli/adapters/group-builder.test.js +108 -0
  138. package/dist/src/cli/adapters/group-builder.test.js.map +1 -0
  139. package/dist/src/cli/adapters/help-formatter.d.ts +11 -0
  140. package/dist/src/cli/adapters/help-formatter.d.ts.map +1 -0
  141. package/dist/src/cli/adapters/help-formatter.js +78 -0
  142. package/dist/src/cli/adapters/help-formatter.js.map +1 -0
  143. package/dist/src/cli/adapters/help-formatter.test.d.ts +5 -0
  144. package/dist/src/cli/adapters/help-formatter.test.d.ts.map +1 -0
  145. package/dist/src/cli/adapters/help-formatter.test.js +79 -0
  146. package/dist/src/cli/adapters/help-formatter.test.js.map +1 -0
  147. package/dist/src/cli/adapters/target-resolver.d.ts +54 -0
  148. package/dist/src/cli/adapters/target-resolver.d.ts.map +1 -0
  149. package/dist/src/cli/adapters/target-resolver.js +90 -0
  150. package/dist/src/cli/adapters/target-resolver.js.map +1 -0
  151. package/dist/src/cli/adapters/target-resolver.test.d.ts +5 -0
  152. package/dist/src/cli/adapters/target-resolver.test.d.ts.map +1 -0
  153. package/dist/src/cli/adapters/target-resolver.test.js +169 -0
  154. package/dist/src/cli/adapters/target-resolver.test.js.map +1 -0
  155. package/dist/src/cli/args/global-args.d.ts +2 -0
  156. package/dist/src/cli/args/global-args.d.ts.map +1 -1
  157. package/dist/src/cli/cli.d.ts +6 -3
  158. package/dist/src/cli/cli.d.ts.map +1 -1
  159. package/dist/src/cli/cli.js +82 -20
  160. package/dist/src/cli/cli.js.map +1 -1
  161. package/dist/src/cli/resolve-script-content.d.ts +19 -0
  162. package/dist/src/cli/resolve-script-content.d.ts.map +1 -0
  163. package/dist/src/cli/resolve-script-content.js +22 -0
  164. package/dist/src/cli/resolve-script-content.js.map +1 -0
  165. package/dist/src/cli/resolve-session.d.ts +21 -0
  166. package/dist/src/cli/resolve-session.d.ts.map +1 -0
  167. package/dist/src/cli/resolve-session.js +40 -0
  168. package/dist/src/cli/resolve-session.js.map +1 -0
  169. package/dist/src/cli/resolve-session.test.d.ts +5 -0
  170. package/dist/src/cli/resolve-session.test.d.ts.map +1 -0
  171. package/dist/src/cli/resolve-session.test.js +112 -0
  172. package/dist/src/cli/resolve-session.test.js.map +1 -0
  173. package/dist/src/cli/script-executor.d.ts +1 -0
  174. package/dist/src/cli/script-executor.d.ts.map +1 -1
  175. package/dist/src/cli/script-executor.js +7 -1
  176. package/dist/src/cli/script-executor.js.map +1 -1
  177. package/dist/src/cli/types.d.ts +11 -0
  178. package/dist/src/cli/types.d.ts.map +1 -0
  179. package/dist/src/cli/types.js +5 -0
  180. package/dist/src/cli/types.js.map +1 -0
  181. package/dist/src/commands/connect.d.ts +16 -0
  182. package/dist/src/commands/connect.d.ts.map +1 -0
  183. package/dist/src/commands/connect.js +15 -0
  184. package/dist/src/commands/connect.js.map +1 -0
  185. package/dist/src/commands/connect.test.d.ts +5 -0
  186. package/dist/src/commands/connect.test.d.ts.map +1 -0
  187. package/dist/src/commands/connect.test.js +46 -0
  188. package/dist/src/commands/connect.test.js.map +1 -0
  189. package/dist/src/commands/console/exec/exec.d.ts +43 -0
  190. package/dist/src/commands/console/exec/exec.d.ts.map +1 -0
  191. package/dist/src/commands/console/exec/exec.js +79 -0
  192. package/dist/src/commands/console/exec/exec.js.map +1 -0
  193. package/dist/src/commands/console/exec/exec.test.d.ts +5 -0
  194. package/dist/src/commands/console/exec/exec.test.d.ts.map +1 -0
  195. package/dist/src/commands/console/exec/exec.test.js +191 -0
  196. package/dist/src/commands/console/exec/exec.test.js.map +1 -0
  197. package/dist/src/commands/console/logs/logs.d.ts +23 -0
  198. package/dist/src/commands/console/logs/logs.d.ts.map +1 -0
  199. package/dist/src/commands/console/logs/logs.js +80 -0
  200. package/dist/src/commands/console/logs/logs.js.map +1 -0
  201. package/dist/src/commands/console/logs/logs.test.d.ts +5 -0
  202. package/dist/src/commands/console/logs/logs.test.d.ts.map +1 -0
  203. package/dist/src/commands/console/logs/logs.test.js +111 -0
  204. package/dist/src/commands/console/logs/logs.test.js.map +1 -0
  205. package/dist/src/commands/disconnect.d.ts +9 -0
  206. package/dist/src/commands/disconnect.d.ts.map +1 -0
  207. package/dist/src/commands/disconnect.js +8 -0
  208. package/dist/src/commands/disconnect.js.map +1 -0
  209. package/dist/src/commands/disconnect.test.d.ts +5 -0
  210. package/dist/src/commands/disconnect.test.d.ts.map +1 -0
  211. package/dist/src/commands/disconnect.test.js +17 -0
  212. package/dist/src/commands/disconnect.test.js.map +1 -0
  213. package/dist/src/commands/explorer/query/query.d.ts +31 -0
  214. package/dist/src/commands/explorer/query/query.d.ts.map +1 -0
  215. package/dist/src/commands/explorer/query/query.js +106 -0
  216. package/dist/src/commands/explorer/query/query.js.map +1 -0
  217. package/dist/src/commands/explorer/query/query.test.d.ts +5 -0
  218. package/dist/src/commands/explorer/query/query.test.d.ts.map +1 -0
  219. package/dist/src/commands/explorer/query/query.test.js +228 -0
  220. package/dist/src/commands/explorer/query/query.test.js.map +1 -0
  221. package/dist/src/commands/formatters.test.d.ts +6 -0
  222. package/dist/src/commands/formatters.test.d.ts.map +1 -0
  223. package/dist/src/commands/formatters.test.js +211 -0
  224. package/dist/src/commands/formatters.test.js.map +1 -0
  225. package/dist/src/commands/framework/action-loader.d.ts +25 -0
  226. package/dist/src/commands/framework/action-loader.d.ts.map +1 -0
  227. package/dist/src/commands/framework/action-loader.js +46 -0
  228. package/dist/src/commands/framework/action-loader.js.map +1 -0
  229. package/dist/src/commands/framework/action-loader.test.d.ts +5 -0
  230. package/dist/src/commands/framework/action-loader.test.d.ts.map +1 -0
  231. package/dist/src/commands/framework/action-loader.test.js +89 -0
  232. package/dist/src/commands/framework/action-loader.test.js.map +1 -0
  233. package/dist/src/commands/framework/arg-builder.d.ts +92 -0
  234. package/dist/src/commands/framework/arg-builder.d.ts.map +1 -0
  235. package/dist/src/commands/framework/arg-builder.js +137 -0
  236. package/dist/src/commands/framework/arg-builder.js.map +1 -0
  237. package/dist/src/commands/framework/arg-builder.test.d.ts +5 -0
  238. package/dist/src/commands/framework/arg-builder.test.d.ts.map +1 -0
  239. package/dist/src/commands/framework/arg-builder.test.js +246 -0
  240. package/dist/src/commands/framework/arg-builder.test.js.map +1 -0
  241. package/dist/src/commands/framework/command-registry.d.ts +23 -0
  242. package/dist/src/commands/framework/command-registry.d.ts.map +1 -0
  243. package/dist/src/commands/framework/command-registry.js +42 -0
  244. package/dist/src/commands/framework/command-registry.js.map +1 -0
  245. package/dist/src/commands/framework/command-registry.test.d.ts +5 -0
  246. package/dist/src/commands/framework/command-registry.test.d.ts.map +1 -0
  247. package/dist/src/commands/framework/command-registry.test.js +158 -0
  248. package/dist/src/commands/framework/command-registry.test.js.map +1 -0
  249. package/dist/src/commands/framework/define-command.d.ts +76 -0
  250. package/dist/src/commands/framework/define-command.d.ts.map +1 -0
  251. package/dist/src/commands/framework/define-command.js +28 -0
  252. package/dist/src/commands/framework/define-command.js.map +1 -0
  253. package/dist/src/commands/framework/define-command.test.d.ts +5 -0
  254. package/dist/src/commands/framework/define-command.test.d.ts.map +1 -0
  255. package/dist/src/commands/framework/define-command.test.js +135 -0
  256. package/dist/src/commands/framework/define-command.test.js.map +1 -0
  257. package/dist/src/commands/framework/index.d.ts +8 -0
  258. package/dist/src/commands/framework/index.d.ts.map +1 -0
  259. package/dist/src/commands/framework/index.js +8 -0
  260. package/dist/src/commands/framework/index.js.map +1 -0
  261. package/dist/src/commands/index.d.ts +20 -0
  262. package/dist/src/commands/index.d.ts.map +1 -0
  263. package/dist/src/commands/index.js +20 -0
  264. package/dist/src/commands/index.js.map +1 -0
  265. package/dist/src/commands/linux/inject-credentials/inject-credentials.d.ts +15 -0
  266. package/dist/src/commands/linux/inject-credentials/inject-credentials.d.ts.map +1 -0
  267. package/dist/src/commands/linux/inject-credentials/inject-credentials.js +88 -0
  268. package/dist/src/commands/linux/inject-credentials/inject-credentials.js.map +1 -0
  269. package/dist/src/commands/linux/setup/setup.d.ts +19 -0
  270. package/dist/src/commands/linux/setup/setup.d.ts.map +1 -0
  271. package/dist/src/commands/linux/setup/setup.js +107 -0
  272. package/dist/src/commands/linux/setup/setup.js.map +1 -0
  273. package/dist/src/commands/linux/status/status.d.ts +34 -0
  274. package/dist/src/commands/linux/status/status.d.ts.map +1 -0
  275. package/dist/src/commands/linux/status/status.js +134 -0
  276. package/dist/src/commands/linux/status/status.js.map +1 -0
  277. package/dist/src/commands/plugin/install/install.d.ts +10 -0
  278. package/dist/src/commands/plugin/install/install.d.ts.map +1 -0
  279. package/dist/src/commands/plugin/install/install.js +23 -0
  280. package/dist/src/commands/plugin/install/install.js.map +1 -0
  281. package/dist/src/commands/plugin/uninstall/uninstall.d.ts +9 -0
  282. package/dist/src/commands/plugin/uninstall/uninstall.d.ts.map +1 -0
  283. package/dist/src/commands/plugin/uninstall/uninstall.js +41 -0
  284. package/dist/src/commands/plugin/uninstall/uninstall.js.map +1 -0
  285. package/dist/src/commands/process/close/close.d.ts +22 -0
  286. package/dist/src/commands/process/close/close.d.ts.map +1 -0
  287. package/dist/src/commands/process/close/close.js +34 -0
  288. package/dist/src/commands/process/close/close.js.map +1 -0
  289. package/dist/src/commands/process/format-state.d.ts +7 -0
  290. package/dist/src/commands/process/format-state.d.ts.map +1 -0
  291. package/dist/src/commands/process/format-state.js +19 -0
  292. package/dist/src/commands/process/format-state.js.map +1 -0
  293. package/dist/src/commands/process/info/info.d.ts +17 -0
  294. package/dist/src/commands/process/info/info.d.ts.map +1 -0
  295. package/dist/src/commands/process/info/info.js +38 -0
  296. package/dist/src/commands/process/info/info.js.map +1 -0
  297. package/dist/src/commands/process/info/info.test.d.ts +5 -0
  298. package/dist/src/commands/process/info/info.test.d.ts.map +1 -0
  299. package/dist/src/commands/process/info/info.test.js +58 -0
  300. package/dist/src/commands/process/info/info.test.js.map +1 -0
  301. package/dist/src/commands/process/launch/launch.d.ts +17 -0
  302. package/dist/src/commands/process/launch/launch.d.ts.map +1 -0
  303. package/dist/src/commands/process/launch/launch.js +26 -0
  304. package/dist/src/commands/process/launch/launch.js.map +1 -0
  305. package/dist/src/commands/process/launch/launch.test.d.ts +5 -0
  306. package/dist/src/commands/process/launch/launch.test.d.ts.map +1 -0
  307. package/dist/src/commands/process/launch/launch.test.js +49 -0
  308. package/dist/src/commands/process/launch/launch.test.js.map +1 -0
  309. package/dist/src/commands/process/list/list.d.ts +16 -0
  310. package/dist/src/commands/process/list/list.d.ts.map +1 -0
  311. package/dist/src/commands/process/list/list.js +56 -0
  312. package/dist/src/commands/process/list/list.js.map +1 -0
  313. package/dist/src/commands/process/list/list.test.d.ts +5 -0
  314. package/dist/src/commands/process/list/list.test.d.ts.map +1 -0
  315. package/dist/src/commands/process/list/list.test.js +71 -0
  316. package/dist/src/commands/process/list/list.test.js.map +1 -0
  317. package/dist/src/commands/process/run/run.d.ts +31 -0
  318. package/dist/src/commands/process/run/run.d.ts.map +1 -0
  319. package/dist/src/commands/process/run/run.js +63 -0
  320. package/dist/src/commands/process/run/run.js.map +1 -0
  321. package/dist/src/commands/rgba-to-png.d.ts +17 -0
  322. package/dist/src/commands/rgba-to-png.d.ts.map +1 -0
  323. package/dist/src/commands/rgba-to-png.js +85 -0
  324. package/dist/src/commands/rgba-to-png.js.map +1 -0
  325. package/dist/src/commands/serve/serve.d.ts +17 -0
  326. package/dist/src/commands/serve/serve.d.ts.map +1 -0
  327. package/dist/src/commands/serve/serve.js +128 -0
  328. package/dist/src/commands/serve/serve.js.map +1 -0
  329. package/dist/src/commands/serve/serve.test.d.ts +5 -0
  330. package/dist/src/commands/serve/serve.test.d.ts.map +1 -0
  331. package/dist/src/commands/serve/serve.test.js +100 -0
  332. package/dist/src/commands/serve/serve.test.js.map +1 -0
  333. package/dist/src/commands/viewport/screenshot/screenshot.d.ts +17 -0
  334. package/dist/src/commands/viewport/screenshot/screenshot.d.ts.map +1 -0
  335. package/dist/src/commands/viewport/screenshot/screenshot.js +45 -0
  336. package/dist/src/commands/viewport/screenshot/screenshot.js.map +1 -0
  337. package/dist/src/commands/viewport/screenshot/screenshot.test.d.ts +5 -0
  338. package/dist/src/commands/viewport/screenshot/screenshot.test.d.ts.map +1 -0
  339. package/dist/src/commands/viewport/screenshot/screenshot.test.js +143 -0
  340. package/dist/src/commands/viewport/screenshot/screenshot.test.js.map +1 -0
  341. package/dist/src/docker/docker-delegator.d.ts +30 -0
  342. package/dist/src/docker/docker-delegator.d.ts.map +1 -0
  343. package/dist/src/docker/docker-delegator.js +201 -0
  344. package/dist/src/docker/docker-delegator.js.map +1 -0
  345. package/dist/src/docker/docker-delegator.test.d.ts +2 -0
  346. package/dist/src/docker/docker-delegator.test.d.ts.map +1 -0
  347. package/dist/src/docker/docker-delegator.test.js +132 -0
  348. package/dist/src/docker/docker-delegator.test.js.map +1 -0
  349. package/dist/src/index.d.ts +9 -2
  350. package/dist/src/index.d.ts.map +1 -1
  351. package/dist/src/index.js +6 -1
  352. package/dist/src/index.js.map +1 -1
  353. package/dist/src/index.test.d.ts +2 -0
  354. package/dist/src/index.test.d.ts.map +1 -0
  355. package/dist/src/index.test.js +51 -0
  356. package/dist/src/index.test.js.map +1 -0
  357. package/dist/src/linux/index.d.ts +12 -0
  358. package/dist/src/linux/index.d.ts.map +1 -0
  359. package/dist/src/linux/index.js +11 -0
  360. package/dist/src/linux/index.js.map +1 -0
  361. package/dist/src/linux/linux-config.d.ts +37 -0
  362. package/dist/src/linux/linux-config.d.ts.map +1 -0
  363. package/dist/src/linux/linux-config.js +70 -0
  364. package/dist/src/linux/linux-config.js.map +1 -0
  365. package/dist/src/linux/linux-config.test.d.ts +2 -0
  366. package/dist/src/linux/linux-config.test.d.ts.map +1 -0
  367. package/dist/src/linux/linux-config.test.js +54 -0
  368. package/dist/src/linux/linux-config.test.js.map +1 -0
  369. package/dist/src/linux/linux-credential-writer.d.ts +35 -0
  370. package/dist/src/linux/linux-credential-writer.d.ts.map +1 -0
  371. package/dist/src/linux/linux-credential-writer.js +300 -0
  372. package/dist/src/linux/linux-credential-writer.js.map +1 -0
  373. package/dist/src/linux/linux-display-manager.d.ts +24 -0
  374. package/dist/src/linux/linux-display-manager.d.ts.map +1 -0
  375. package/dist/src/linux/linux-display-manager.js +92 -0
  376. package/dist/src/linux/linux-display-manager.js.map +1 -0
  377. package/dist/src/linux/linux-env-guard.d.ts +13 -0
  378. package/dist/src/linux/linux-env-guard.d.ts.map +1 -0
  379. package/dist/src/linux/linux-env-guard.js +31 -0
  380. package/dist/src/linux/linux-env-guard.js.map +1 -0
  381. package/dist/src/linux/linux-env-guard.test.d.ts +2 -0
  382. package/dist/src/linux/linux-env-guard.test.d.ts.map +1 -0
  383. package/dist/src/linux/linux-env-guard.test.js +48 -0
  384. package/dist/src/linux/linux-env-guard.test.js.map +1 -0
  385. package/dist/src/linux/linux-fflags.d.ts +17 -0
  386. package/dist/src/linux/linux-fflags.d.ts.map +1 -0
  387. package/dist/src/linux/linux-fflags.js +33 -0
  388. package/dist/src/linux/linux-fflags.js.map +1 -0
  389. package/dist/src/linux/linux-fflags.test.d.ts +2 -0
  390. package/dist/src/linux/linux-fflags.test.d.ts.map +1 -0
  391. package/dist/src/linux/linux-fflags.test.js +55 -0
  392. package/dist/src/linux/linux-fflags.test.js.map +1 -0
  393. package/dist/src/linux/linux-prerequisites.d.ts +24 -0
  394. package/dist/src/linux/linux-prerequisites.d.ts.map +1 -0
  395. package/dist/src/linux/linux-prerequisites.js +118 -0
  396. package/dist/src/linux/linux-prerequisites.js.map +1 -0
  397. package/dist/src/linux/linux-shader-patcher.d.ts +17 -0
  398. package/dist/src/linux/linux-shader-patcher.d.ts.map +1 -0
  399. package/dist/src/linux/linux-shader-patcher.js +48 -0
  400. package/dist/src/linux/linux-shader-patcher.js.map +1 -0
  401. package/dist/src/linux/linux-shader-patcher.test.d.ts +2 -0
  402. package/dist/src/linux/linux-shader-patcher.test.d.ts.map +1 -0
  403. package/dist/src/linux/linux-shader-patcher.test.js +55 -0
  404. package/dist/src/linux/linux-shader-patcher.test.js.map +1 -0
  405. package/dist/src/linux/linux-studio-installer.d.ts +10 -0
  406. package/dist/src/linux/linux-studio-installer.d.ts.map +1 -0
  407. package/dist/src/linux/linux-studio-installer.js +79 -0
  408. package/dist/src/linux/linux-studio-installer.js.map +1 -0
  409. package/dist/src/linux/linux-studio-launcher.d.ts +10 -0
  410. package/dist/src/linux/linux-studio-launcher.d.ts.map +1 -0
  411. package/dist/src/linux/linux-studio-launcher.js +73 -0
  412. package/dist/src/linux/linux-studio-launcher.js.map +1 -0
  413. package/dist/src/linux/linux-version-resolver.d.ts +18 -0
  414. package/dist/src/linux/linux-version-resolver.d.ts.map +1 -0
  415. package/dist/src/linux/linux-version-resolver.js +49 -0
  416. package/dist/src/linux/linux-version-resolver.js.map +1 -0
  417. package/dist/src/linux/linux-wine-env.d.ts +11 -0
  418. package/dist/src/linux/linux-wine-env.d.ts.map +1 -0
  419. package/dist/src/linux/linux-wine-env.js +33 -0
  420. package/dist/src/linux/linux-wine-env.js.map +1 -0
  421. package/dist/src/linux/linux-wine-env.test.d.ts +2 -0
  422. package/dist/src/linux/linux-wine-env.test.d.ts.map +1 -0
  423. package/dist/src/linux/linux-wine-env.test.js +47 -0
  424. package/dist/src/linux/linux-wine-env.test.js.map +1 -0
  425. package/dist/src/plugin/persistent-plugin-installer.d.ts +21 -0
  426. package/dist/src/plugin/persistent-plugin-installer.d.ts.map +1 -0
  427. package/dist/src/plugin/persistent-plugin-installer.js +69 -0
  428. package/dist/src/plugin/persistent-plugin-installer.js.map +1 -0
  429. package/dist/src/plugin/persistent-plugin-installer.test.d.ts +5 -0
  430. package/dist/src/plugin/persistent-plugin-installer.test.d.ts.map +1 -0
  431. package/dist/src/plugin/persistent-plugin-installer.test.js +119 -0
  432. package/dist/src/plugin/persistent-plugin-installer.test.js.map +1 -0
  433. package/dist/src/plugin/plugin-discovery.d.ts +7 -0
  434. package/dist/src/plugin/plugin-discovery.d.ts.map +1 -0
  435. package/dist/src/plugin/plugin-discovery.js +18 -0
  436. package/dist/src/plugin/plugin-discovery.js.map +1 -0
  437. package/dist/src/plugin/plugin-discovery.test.d.ts +5 -0
  438. package/dist/src/plugin/plugin-discovery.test.d.ts.map +1 -0
  439. package/dist/src/plugin/plugin-discovery.test.js +55 -0
  440. package/dist/src/plugin/plugin-discovery.test.js.map +1 -0
  441. package/dist/src/plugin/plugin-injector.js +1 -1
  442. package/dist/src/plugin/plugin-injector.js.map +1 -1
  443. package/dist/src/process/studio-process-manager.d.ts +7 -3
  444. package/dist/src/process/studio-process-manager.d.ts.map +1 -1
  445. package/dist/src/process/studio-process-manager.js +40 -11
  446. package/dist/src/process/studio-process-manager.js.map +1 -1
  447. package/dist/src/process/studio-process-manager.test.js +18 -1
  448. package/dist/src/process/studio-process-manager.test.js.map +1 -1
  449. package/dist/src/server/action-dispatcher.d.ts +35 -0
  450. package/dist/src/server/action-dispatcher.d.ts.map +1 -0
  451. package/dist/src/server/action-dispatcher.js +67 -0
  452. package/dist/src/server/action-dispatcher.js.map +1 -0
  453. package/dist/src/server/action-dispatcher.test.d.ts +6 -0
  454. package/dist/src/server/action-dispatcher.test.d.ts.map +1 -0
  455. package/dist/src/server/action-dispatcher.test.js +173 -0
  456. package/dist/src/server/action-dispatcher.test.js.map +1 -0
  457. package/dist/src/server/index.d.ts +1 -1
  458. package/dist/src/server/index.d.ts.map +1 -1
  459. package/dist/src/server/pending-request-map.d.ts +33 -0
  460. package/dist/src/server/pending-request-map.d.ts.map +1 -0
  461. package/dist/src/server/pending-request-map.js +69 -0
  462. package/dist/src/server/pending-request-map.js.map +1 -0
  463. package/dist/src/server/pending-request-map.test.d.ts +2 -0
  464. package/dist/src/server/pending-request-map.test.d.ts.map +1 -0
  465. package/dist/src/server/pending-request-map.test.js +192 -0
  466. package/dist/src/server/pending-request-map.test.js.map +1 -0
  467. package/dist/src/server/plugin-detection.test.d.ts +7 -0
  468. package/dist/src/server/plugin-detection.test.d.ts.map +1 -0
  469. package/dist/src/server/plugin-detection.test.js +154 -0
  470. package/dist/src/server/plugin-detection.test.js.map +1 -0
  471. package/dist/src/server/studio-bridge-server.d.ts +44 -7
  472. package/dist/src/server/studio-bridge-server.d.ts.map +1 -1
  473. package/dist/src/server/studio-bridge-server.js +341 -91
  474. package/dist/src/server/studio-bridge-server.js.map +1 -1
  475. package/dist/src/server/studio-bridge-server.test.js +231 -207
  476. package/dist/src/server/studio-bridge-server.test.js.map +1 -1
  477. package/dist/src/server/web-socket-protocol-basic.test.d.ts +2 -0
  478. package/dist/src/server/web-socket-protocol-basic.test.d.ts.map +1 -0
  479. package/dist/src/server/web-socket-protocol-basic.test.js +98 -0
  480. package/dist/src/server/web-socket-protocol-basic.test.js.map +1 -0
  481. package/dist/src/server/web-socket-protocol.d.ts +218 -20
  482. package/dist/src/server/web-socket-protocol.d.ts.map +1 -1
  483. package/dist/src/server/web-socket-protocol.js +346 -20
  484. package/dist/src/server/web-socket-protocol.js.map +1 -1
  485. package/dist/src/server/web-socket-protocol.test.js +572 -146
  486. package/dist/src/server/web-socket-protocol.test.js.map +1 -1
  487. package/dist/src/test/e2e/hand-off.test.d.ts +9 -0
  488. package/dist/src/test/e2e/hand-off.test.d.ts.map +1 -0
  489. package/dist/src/test/e2e/hand-off.test.js +274 -0
  490. package/dist/src/test/e2e/hand-off.test.js.map +1 -0
  491. package/dist/src/test/e2e/persistent-session.test.d.ts +11 -0
  492. package/dist/src/test/e2e/persistent-session.test.d.ts.map +1 -0
  493. package/dist/src/test/e2e/persistent-session.test.js +367 -0
  494. package/dist/src/test/e2e/persistent-session.test.js.map +1 -0
  495. package/dist/src/test/e2e/split-server.test.d.ts +14 -0
  496. package/dist/src/test/e2e/split-server.test.d.ts.map +1 -0
  497. package/dist/src/test/e2e/split-server.test.js +230 -0
  498. package/dist/src/test/e2e/split-server.test.js.map +1 -0
  499. package/dist/src/test/helpers/mock-plugin-client.d.ts +69 -0
  500. package/dist/src/test/helpers/mock-plugin-client.d.ts.map +1 -0
  501. package/dist/src/test/helpers/mock-plugin-client.js +213 -0
  502. package/dist/src/test/helpers/mock-plugin-client.js.map +1 -0
  503. package/dist/tsconfig.tsbuildinfo +1 -1
  504. package/docker/.dockerignore +2 -0
  505. package/docker/Dockerfile +113 -0
  506. package/docker/docker-compose.yml +20 -0
  507. package/docker/entrypoint.sh +19 -0
  508. package/package.json +8 -6
  509. package/src/bridge/bridge-connection-remote.test.ts +189 -0
  510. package/src/bridge/bridge-connection.test.ts +1076 -0
  511. package/src/bridge/bridge-connection.ts +718 -0
  512. package/src/bridge/bridge-session.test.ts +336 -0
  513. package/src/bridge/bridge-session.ts +365 -0
  514. package/src/bridge/index.ts +42 -0
  515. package/src/bridge/internal/__tests__/failover-crash.test.ts +191 -0
  516. package/src/bridge/internal/__tests__/failover-graceful.test.ts +268 -0
  517. package/src/bridge/internal/__tests__/failover-inflight.test.ts +329 -0
  518. package/src/bridge/internal/__tests__/host-client-integration.test.ts +387 -0
  519. package/src/bridge/internal/bridge-client.test.ts +399 -0
  520. package/src/bridge/internal/bridge-client.ts +434 -0
  521. package/src/bridge/internal/bridge-host.test.ts +501 -0
  522. package/src/bridge/internal/bridge-host.ts +531 -0
  523. package/src/bridge/internal/environment-detection.test.ts +180 -0
  524. package/src/bridge/internal/environment-detection.ts +119 -0
  525. package/src/bridge/internal/hand-off.test.ts +408 -0
  526. package/src/bridge/internal/hand-off.ts +275 -0
  527. package/src/bridge/internal/health-endpoint.test.ts +147 -0
  528. package/src/bridge/internal/health-endpoint.ts +100 -0
  529. package/src/bridge/internal/host-protocol.test.ts +415 -0
  530. package/src/bridge/internal/host-protocol.ts +255 -0
  531. package/src/bridge/internal/session-tracker.test.ts +535 -0
  532. package/src/bridge/internal/session-tracker.ts +198 -0
  533. package/src/bridge/internal/transport-client.test.ts +241 -0
  534. package/src/bridge/internal/transport-client.ts +194 -0
  535. package/src/bridge/internal/transport-server.test.ts +220 -0
  536. package/src/bridge/internal/transport-server.ts +242 -0
  537. package/src/bridge/types.ts +161 -0
  538. package/src/cli/adapters/cli-command-adapter-handler.test.ts +318 -0
  539. package/src/cli/adapters/cli-command-adapter.test.ts +221 -0
  540. package/src/cli/adapters/cli-command-adapter.ts +342 -0
  541. package/src/cli/adapters/group-builder.test.ts +146 -0
  542. package/src/cli/adapters/group-builder.ts +81 -0
  543. package/src/cli/adapters/help-formatter.test.ts +97 -0
  544. package/src/cli/adapters/help-formatter.ts +86 -0
  545. package/src/cli/adapters/target-resolver.test.ts +222 -0
  546. package/src/cli/adapters/target-resolver.ts +144 -0
  547. package/src/cli/args/global-args.ts +2 -0
  548. package/src/cli/cli.ts +100 -21
  549. package/src/cli/resolve-script-content.ts +36 -0
  550. package/src/cli/resolve-session.test.ts +141 -0
  551. package/src/cli/resolve-session.ts +66 -0
  552. package/src/cli/script-executor.ts +22 -4
  553. package/src/cli/types.ts +11 -0
  554. package/src/commands/connect.test.ts +61 -0
  555. package/src/commands/connect.ts +32 -0
  556. package/src/commands/console/exec/exec.test.ts +258 -0
  557. package/src/commands/console/exec/exec.ts +130 -0
  558. package/src/commands/console/exec/execute.luau +202 -0
  559. package/src/commands/console/logs/logs.test.ts +138 -0
  560. package/src/commands/console/logs/logs.ts +115 -0
  561. package/src/commands/console/logs/query-logs.luau +76 -0
  562. package/src/commands/disconnect.test.ts +21 -0
  563. package/src/commands/disconnect.ts +12 -0
  564. package/src/commands/explorer/query/query-data-model.luau +206 -0
  565. package/src/commands/explorer/query/query.test.ts +297 -0
  566. package/src/commands/explorer/query/query.ts +157 -0
  567. package/src/commands/formatters.test.ts +237 -0
  568. package/src/commands/framework/action-loader.test.ts +118 -0
  569. package/src/commands/framework/action-loader.ts +65 -0
  570. package/src/commands/framework/arg-builder.test.ts +298 -0
  571. package/src/commands/framework/arg-builder.ts +203 -0
  572. package/src/commands/framework/command-registry.test.ts +204 -0
  573. package/src/commands/framework/command-registry.ts +51 -0
  574. package/src/commands/framework/define-command.test.ts +161 -0
  575. package/src/commands/framework/define-command.ts +114 -0
  576. package/src/commands/framework/index.ts +33 -0
  577. package/src/commands/index.ts +72 -0
  578. package/src/commands/linux/inject-credentials/inject-credentials.ts +118 -0
  579. package/src/commands/linux/setup/setup.ts +145 -0
  580. package/src/commands/linux/status/status.ts +180 -0
  581. package/src/commands/plugin/install/install.ts +31 -0
  582. package/src/commands/plugin/uninstall/uninstall.ts +54 -0
  583. package/src/commands/process/close/close.ts +52 -0
  584. package/src/commands/process/format-state.ts +21 -0
  585. package/src/commands/process/info/info.test.ts +76 -0
  586. package/src/commands/process/info/info.ts +54 -0
  587. package/src/commands/process/info/query-state.luau +48 -0
  588. package/src/commands/process/launch/launch.test.ts +65 -0
  589. package/src/commands/process/launch/launch.ts +45 -0
  590. package/src/commands/process/list/list.test.ts +82 -0
  591. package/src/commands/process/list/list.ts +75 -0
  592. package/src/commands/process/run/run.ts +98 -0
  593. package/src/commands/rgba-to-png.ts +98 -0
  594. package/src/commands/serve/serve.test.ts +139 -0
  595. package/src/commands/serve/serve.ts +161 -0
  596. package/src/commands/viewport/screenshot/capture-screenshot.luau +247 -0
  597. package/src/commands/viewport/screenshot/screenshot.test.ts +181 -0
  598. package/src/commands/viewport/screenshot/screenshot.ts +71 -0
  599. package/src/docker/docker-delegator.test.ts +159 -0
  600. package/src/docker/docker-delegator.ts +240 -0
  601. package/src/index.test.ts +58 -0
  602. package/src/index.ts +104 -3
  603. package/src/linux/README.md +130 -0
  604. package/src/linux/index.ts +25 -0
  605. package/src/linux/linux-config.test.ts +66 -0
  606. package/src/linux/linux-config.ts +102 -0
  607. package/src/linux/linux-credential-writer.ts +421 -0
  608. package/src/linux/linux-display-manager.ts +106 -0
  609. package/src/linux/linux-env-guard.test.ts +62 -0
  610. package/src/linux/linux-env-guard.ts +38 -0
  611. package/src/linux/linux-fflags.test.ts +78 -0
  612. package/src/linux/linux-fflags.ts +48 -0
  613. package/src/linux/linux-prerequisites.ts +152 -0
  614. package/src/linux/linux-shader-patcher.test.ts +76 -0
  615. package/src/linux/linux-shader-patcher.ts +56 -0
  616. package/src/linux/linux-studio-installer.ts +113 -0
  617. package/src/linux/linux-studio-launcher.ts +90 -0
  618. package/src/linux/linux-version-resolver.ts +74 -0
  619. package/src/linux/linux-wine-env.test.ts +56 -0
  620. package/src/linux/linux-wine-env.ts +38 -0
  621. package/src/linux/write-cred.c +48 -0
  622. package/src/plugin/persistent-plugin-installer.test.ts +171 -0
  623. package/src/plugin/persistent-plugin-installer.ts +90 -0
  624. package/src/plugin/plugin-discovery.test.ts +70 -0
  625. package/src/plugin/plugin-discovery.ts +21 -0
  626. package/src/plugin/plugin-injector.ts +1 -1
  627. package/src/process/studio-process-manager.test.ts +22 -1
  628. package/src/process/studio-process-manager.ts +59 -18
  629. package/src/server/action-dispatcher.test.ts +240 -0
  630. package/src/server/action-dispatcher.ts +89 -0
  631. package/src/server/index.ts +0 -3
  632. package/src/server/pending-request-map.test.ts +261 -0
  633. package/src/server/pending-request-map.ts +87 -0
  634. package/src/server/plugin-detection.test.ts +195 -0
  635. package/src/server/studio-bridge-server.test.ts +321 -283
  636. package/src/server/studio-bridge-server.ts +469 -111
  637. package/src/server/web-socket-protocol-basic.test.ts +131 -0
  638. package/src/server/web-socket-protocol.test.ts +658 -159
  639. package/src/server/web-socket-protocol.ts +668 -58
  640. package/src/test/e2e/hand-off.test.ts +338 -0
  641. package/src/test/e2e/persistent-session.test.ts +442 -0
  642. package/src/test/e2e/split-server.test.ts +290 -0
  643. package/src/test/helpers/mock-plugin-client.ts +276 -0
  644. package/templates/studio-bridge-plugin/src/Shared/ActionRouter.luau +245 -0
  645. package/templates/studio-bridge-plugin/src/Shared/DiscoveryStateMachine.luau +203 -0
  646. package/templates/studio-bridge-plugin/src/Shared/MessageBuffer.luau +144 -0
  647. package/templates/studio-bridge-plugin/src/Shared/Protocol.luau +132 -0
  648. package/templates/studio-bridge-plugin/src/StudioBridgePlugin.server.lua +364 -133
  649. package/templates/studio-bridge-plugin/src/Vendor/png.luau +1247 -0
  650. package/templates/studio-bridge-plugin-test/test/actions.test.luau +580 -0
  651. package/templates/studio-bridge-plugin-test/test/discovery.test.luau +622 -0
  652. package/templates/studio-bridge-plugin-test/test/execute-handler.test.luau +406 -0
  653. package/templates/studio-bridge-plugin-test/test/hash-lifecycle.test.luau +814 -0
  654. package/templates/studio-bridge-plugin-test/test/integration.test.luau +1020 -0
  655. package/templates/studio-bridge-plugin-test/test/new-actions.test.luau +339 -0
  656. package/templates/studio-bridge-plugin-test/test/plugin-entry.test.luau +493 -0
  657. package/templates/studio-bridge-plugin-test/test/protocol.test.luau +506 -0
  658. package/templates/studio-bridge-plugin-test/test/roblox-mocks.luau +108 -0
  659. package/templates/studio-bridge-plugin-test/test/test-runner.luau +112 -0
  660. package/dist/src/cli/commands/exec-command.d.ts +0 -15
  661. package/dist/src/cli/commands/exec-command.d.ts.map +0 -1
  662. package/dist/src/cli/commands/exec-command.js +0 -35
  663. package/dist/src/cli/commands/exec-command.js.map +0 -1
  664. package/dist/src/cli/commands/run-command.d.ts +0 -15
  665. package/dist/src/cli/commands/run-command.d.ts.map +0 -1
  666. package/dist/src/cli/commands/run-command.js +0 -47
  667. package/dist/src/cli/commands/run-command.js.map +0 -1
  668. package/dist/src/cli/commands/terminal/terminal-command.d.ts +0 -17
  669. package/dist/src/cli/commands/terminal/terminal-command.d.ts.map +0 -1
  670. package/dist/src/cli/commands/terminal/terminal-command.js +0 -41
  671. package/dist/src/cli/commands/terminal/terminal-command.js.map +0 -1
  672. package/dist/src/cli/commands/terminal/terminal-editor.d.ts +0 -43
  673. package/dist/src/cli/commands/terminal/terminal-editor.d.ts.map +0 -1
  674. package/dist/src/cli/commands/terminal/terminal-editor.js +0 -430
  675. package/dist/src/cli/commands/terminal/terminal-editor.js.map +0 -1
  676. package/dist/src/cli/commands/terminal/terminal-mode.d.ts +0 -13
  677. package/dist/src/cli/commands/terminal/terminal-mode.d.ts.map +0 -1
  678. package/dist/src/cli/commands/terminal/terminal-mode.js +0 -141
  679. package/dist/src/cli/commands/terminal/terminal-mode.js.map +0 -1
  680. package/dist/src/server/web-socket-protocol.smoke.test.d.ts +0 -6
  681. package/dist/src/server/web-socket-protocol.smoke.test.d.ts.map +0 -1
  682. package/dist/src/server/web-socket-protocol.smoke.test.js +0 -196
  683. package/dist/src/server/web-socket-protocol.smoke.test.js.map +0 -1
  684. package/src/cli/commands/exec-command.ts +0 -48
  685. package/src/cli/commands/run-command.ts +0 -63
  686. package/src/cli/commands/terminal/terminal-command.ts +0 -54
  687. package/src/cli/commands/terminal/terminal-editor.ts +0 -500
  688. package/src/cli/commands/terminal/terminal-mode.ts +0 -184
  689. package/src/server/web-socket-protocol.smoke.test.ts +0 -255
@@ -0,0 +1,329 @@
1
+ /**
2
+ * Integration tests for inflight request handling during failover. Verifies
3
+ * that pending requests are properly rejected when the client is disconnected,
4
+ * and that old sessions throw SessionDisconnectedError after failover.
5
+ *
6
+ * Uses real BridgeClient connected to a mock host (WebSocketServer).
7
+ */
8
+
9
+ import { describe, it, expect, afterEach, vi } from 'vitest';
10
+ import { WebSocketServer, WebSocket } from 'ws';
11
+ import { BridgeClient } from '../bridge-client.js';
12
+
13
+ // Mock loadActionSourcesAsync so _ensureActionsAsync is a no-op in tests
14
+ vi.mock('../../../commands/framework/action-loader.js', () => ({
15
+ loadActionSourcesAsync: vi.fn(async () => []),
16
+ }));
17
+ import {
18
+ encodeHostMessage,
19
+ decodeHostMessage,
20
+ type HostProtocolMessage,
21
+ } from '../host-protocol.js';
22
+ import { SessionDisconnectedError } from '../../types.js';
23
+ import type { SessionInfo } from '../../types.js';
24
+
25
+ function createSessionInfo(overrides: Partial<SessionInfo> = {}): SessionInfo {
26
+ return {
27
+ sessionId: 'session-1',
28
+ placeName: 'TestPlace',
29
+ state: 'Edit',
30
+ pluginVersion: '1.0.0',
31
+ capabilities: ['execute', 'queryState'],
32
+ connectedAt: new Date('2024-01-01'),
33
+ origin: 'user',
34
+ context: 'edit',
35
+ instanceId: 'inst-1',
36
+ placeId: 100,
37
+ gameId: 200,
38
+ ...overrides,
39
+ };
40
+ }
41
+
42
+ interface MockHost {
43
+ wss: WebSocketServer;
44
+ port: number;
45
+ clients: WebSocket[];
46
+ receivedMessages: HostProtocolMessage[];
47
+ }
48
+
49
+ async function createMockHostWithSessions(
50
+ sessions: SessionInfo[]
51
+ ): Promise<MockHost> {
52
+ const clients: WebSocket[] = [];
53
+ const receivedMessages: HostProtocolMessage[] = [];
54
+
55
+ const wss = new WebSocketServer({ port: 0, path: '/client' });
56
+
57
+ const port = await new Promise<number>((resolve) => {
58
+ wss.on('listening', () => {
59
+ const addr = wss.address();
60
+ if (typeof addr === 'object' && addr !== null) {
61
+ resolve(addr.port);
62
+ }
63
+ });
64
+ });
65
+
66
+ wss.on('connection', (ws) => {
67
+ clients.push(ws);
68
+
69
+ ws.on('message', (raw) => {
70
+ const data = typeof raw === 'string' ? raw : raw.toString('utf-8');
71
+ const msg = decodeHostMessage(data);
72
+ if (msg) {
73
+ receivedMessages.push(msg);
74
+
75
+ if (msg.type === 'list-sessions') {
76
+ ws.send(
77
+ encodeHostMessage({
78
+ type: 'list-sessions-response',
79
+ requestId: msg.requestId,
80
+ sessions,
81
+ })
82
+ );
83
+ }
84
+ // Do NOT respond to host-envelope — leave them pending
85
+ }
86
+ });
87
+ });
88
+
89
+ return { wss, port, clients, receivedMessages };
90
+ }
91
+
92
+ async function closeHost(host: MockHost): Promise<void> {
93
+ for (const client of host.wss.clients) {
94
+ client.terminate();
95
+ }
96
+ await new Promise<void>((resolve) => {
97
+ host.wss.close(() => resolve());
98
+ });
99
+ }
100
+
101
+ function delay(ms: number): Promise<void> {
102
+ return new Promise<void>((resolve) => setTimeout(resolve, ms));
103
+ }
104
+
105
+ describe('Inflight request handling during failover', () => {
106
+ let host: MockHost | undefined;
107
+ let client: BridgeClient | undefined;
108
+
109
+ afterEach(async () => {
110
+ if (client) {
111
+ try {
112
+ await client.disconnectAsync();
113
+ } catch {
114
+ /* ignore */
115
+ }
116
+ client = undefined;
117
+ }
118
+ if (host) {
119
+ try {
120
+ await closeHost(host);
121
+ } catch {
122
+ /* ignore */
123
+ }
124
+ host = undefined;
125
+ }
126
+ });
127
+
128
+ it('pending request rejects with error when client disconnects', async () => {
129
+ const sessions = [createSessionInfo({ sessionId: 'session-1' })];
130
+ host = await createMockHostWithSessions(sessions);
131
+
132
+ client = new BridgeClient();
133
+ await client.connectAsync(host.port);
134
+
135
+ const session = client.getSession('session-1');
136
+ expect(session).toBeDefined();
137
+
138
+ // Send an action that will never get a response (mock host doesn't
139
+ // respond to host-envelope messages)
140
+ const execPromise = session!.execAsync('print("hello")', 30_000);
141
+
142
+ // Wait for the envelope to be sent
143
+ await delay(50);
144
+
145
+ // Simulate failover cleanup by explicitly disconnecting
146
+ await client.disconnectAsync();
147
+ client = undefined;
148
+
149
+ // The pending request should reject with 'Client disconnected'
150
+ await expect(execPromise).rejects.toThrow('Client disconnected');
151
+ });
152
+
153
+ it('ALL pending requests are rejected, not just the first', async () => {
154
+ const sessions = [createSessionInfo({ sessionId: 'session-1' })];
155
+ host = await createMockHostWithSessions(sessions);
156
+
157
+ client = new BridgeClient();
158
+ await client.connectAsync(host.port);
159
+
160
+ const session = client.getSession('session-1');
161
+ expect(session).toBeDefined();
162
+
163
+ // Send multiple actions that will never get responses
164
+ const promises = [
165
+ session!.execAsync('print("a")', 30_000),
166
+ session!.execAsync('print("b")', 30_000),
167
+ session!.execAsync('print("c")', 30_000),
168
+ ];
169
+
170
+ // Wait for envelopes to be sent
171
+ await delay(50);
172
+
173
+ // Simulate failover cleanup
174
+ await client.disconnectAsync();
175
+ client = undefined;
176
+
177
+ // ALL promises should reject
178
+ const results = await Promise.allSettled(promises);
179
+ for (const result of results) {
180
+ expect(result.status).toBe('rejected');
181
+ }
182
+ // All should reject with 'Client disconnected'
183
+ for (const result of results) {
184
+ if (result.status === 'rejected') {
185
+ expect(result.reason.message).toContain('Client disconnected');
186
+ }
187
+ }
188
+ });
189
+
190
+ it('requests reject before takeover would complete', async () => {
191
+ const sessions = [createSessionInfo({ sessionId: 'session-1' })];
192
+ host = await createMockHostWithSessions(sessions);
193
+
194
+ client = new BridgeClient();
195
+ await client.connectAsync(host.port);
196
+
197
+ const session = client.getSession('session-1');
198
+ expect(session).toBeDefined();
199
+
200
+ // Track ordering
201
+ const events: string[] = [];
202
+
203
+ // Start a pending request
204
+ const execPromise = session!
205
+ .execAsync('print("hello")', 30_000)
206
+ .catch((err) => {
207
+ events.push('request-rejected');
208
+ throw err;
209
+ });
210
+
211
+ await delay(50);
212
+
213
+ // Disconnect (which immediately rejects pending requests)
214
+ await client.disconnectAsync();
215
+ client = undefined;
216
+
217
+ // Verify the promise rejected
218
+ await expect(execPromise).rejects.toThrow();
219
+
220
+ // Request rejection should have been recorded
221
+ expect(events).toContain('request-rejected');
222
+ });
223
+
224
+ it('after failover, old BridgeSession throws SessionDisconnectedError', async () => {
225
+ const sessions = [createSessionInfo({ sessionId: 'session-1' })];
226
+ host = await createMockHostWithSessions(sessions);
227
+
228
+ client = new BridgeClient();
229
+ await client.connectAsync(host.port);
230
+
231
+ const session = client.getSession('session-1');
232
+ expect(session).toBeDefined();
233
+
234
+ // Disconnect the client (simulates failover cleanup)
235
+ await client.disconnectAsync();
236
+ client = undefined;
237
+
238
+ // The old session should now throw SessionDisconnectedError
239
+ expect(session!.isConnected).toBe(false);
240
+ await expect(session!.execAsync('print("hello")')).rejects.toThrow(
241
+ SessionDisconnectedError
242
+ );
243
+ await expect(session!.queryStateAsync()).rejects.toThrow(
244
+ SessionDisconnectedError
245
+ );
246
+ await expect(session!.captureScreenshotAsync()).rejects.toThrow(
247
+ SessionDisconnectedError
248
+ );
249
+ await expect(session!.queryLogsAsync()).rejects.toThrow(
250
+ SessionDisconnectedError
251
+ );
252
+ await expect(
253
+ session!.queryDataModelAsync({ path: 'game' })
254
+ ).rejects.toThrow(SessionDisconnectedError);
255
+ });
256
+
257
+ it('client emits disconnected event when host dies', async () => {
258
+ host = await createMockHostWithSessions([]);
259
+
260
+ client = new BridgeClient();
261
+ await client.connectAsync(host.port);
262
+
263
+ const disconnectedPromise = new Promise<void>((resolve) => {
264
+ client!.on('disconnected', resolve);
265
+ });
266
+
267
+ // Kill the host (force close)
268
+ await closeHost(host);
269
+ host = undefined;
270
+
271
+ // Should emit disconnected
272
+ await disconnectedPromise;
273
+ expect(client.isConnected).toBe(false);
274
+ });
275
+
276
+ it('multiple pending requests from different sessions all reject', async () => {
277
+ const sessions = [
278
+ createSessionInfo({ sessionId: 'session-a', instanceId: 'inst-a' }),
279
+ createSessionInfo({ sessionId: 'session-b', instanceId: 'inst-b' }),
280
+ ];
281
+ host = await createMockHostWithSessions(sessions);
282
+
283
+ client = new BridgeClient();
284
+ await client.connectAsync(host.port);
285
+
286
+ const sessionA = client.getSession('session-a');
287
+ const sessionB = client.getSession('session-b');
288
+ expect(sessionA).toBeDefined();
289
+ expect(sessionB).toBeDefined();
290
+
291
+ // Send actions on both sessions
292
+ const promiseA = sessionA!.execAsync('print("a")', 30_000);
293
+ const promiseB = sessionB!.execAsync('print("b")', 30_000);
294
+
295
+ await delay(50);
296
+
297
+ // Disconnect (simulating failover cleanup)
298
+ await client.disconnectAsync();
299
+ client = undefined;
300
+
301
+ // Both should reject
302
+ const results = await Promise.allSettled([promiseA, promiseB]);
303
+ expect(results[0].status).toBe('rejected');
304
+ expect(results[1].status).toBe('rejected');
305
+ });
306
+
307
+ it('session disconnected event fires when handles are marked disconnected', async () => {
308
+ const sessions = [createSessionInfo({ sessionId: 'session-1' })];
309
+ host = await createMockHostWithSessions(sessions);
310
+
311
+ client = new BridgeClient();
312
+ await client.connectAsync(host.port);
313
+
314
+ const session = client.getSession('session-1');
315
+ expect(session).toBeDefined();
316
+
317
+ const disconnectedPromise = new Promise<void>((resolve) => {
318
+ session!.on('disconnected', resolve);
319
+ });
320
+
321
+ // Disconnect the client
322
+ await client.disconnectAsync();
323
+ client = undefined;
324
+
325
+ // Session should have emitted disconnected
326
+ await disconnectedPromise;
327
+ expect(session!.isConnected).toBe(false);
328
+ });
329
+ });
@@ -0,0 +1,387 @@
1
+ /**
2
+ * Integration tests for host<->client protocol. Verifies that a real
3
+ * BridgeHost correctly processes client WebSocket messages (list-sessions,
4
+ * list-instances) and broadcasts session events when plugins connect or
5
+ * disconnect. This covers Bug 1: host never processed client messages.
6
+ *
7
+ * Uses real BridgeHost and WebSocket connections — no mocks for the host side.
8
+ */
9
+
10
+ import { describe, it, expect, afterEach } from 'vitest';
11
+ import { EventEmitter } from 'events';
12
+ import { WebSocket } from 'ws';
13
+ import { BridgeHost } from '../bridge-host.js';
14
+ import { SessionTracker } from '../session-tracker.js';
15
+ import {
16
+ encodeHostMessage,
17
+ decodeHostMessage,
18
+ type HostProtocolMessage,
19
+ type ListSessionsRequest,
20
+ type ListInstancesRequest,
21
+ } from '../host-protocol.js';
22
+ import type { Capability } from '../../../server/web-socket-protocol.js';
23
+ import type { SessionInfo, SessionContext } from '../../types.js';
24
+
25
+ class StubTransportHandle extends EventEmitter {
26
+ get isConnected(): boolean {
27
+ return true;
28
+ }
29
+
30
+ async sendActionAsync(): Promise<never> {
31
+ throw new Error('stub');
32
+ }
33
+
34
+ sendMessage(): void {
35
+ // no-op
36
+ }
37
+ }
38
+
39
+ function connectClientWsAsync(port: number): Promise<WebSocket> {
40
+ return new Promise<WebSocket>((resolve, reject) => {
41
+ const ws = new WebSocket(`ws://localhost:${port}/client`);
42
+ ws.on('open', () => resolve(ws));
43
+ ws.on('error', reject);
44
+ });
45
+ }
46
+
47
+ function connectPluginWsAsync(port: number): Promise<WebSocket> {
48
+ return new Promise<WebSocket>((resolve, reject) => {
49
+ const ws = new WebSocket(`ws://localhost:${port}/plugin`);
50
+ ws.on('open', () => resolve(ws));
51
+ ws.on('error', reject);
52
+ });
53
+ }
54
+
55
+ async function waitForMessageAsync(
56
+ ws: WebSocket,
57
+ timeoutMs = 2_000
58
+ ): Promise<HostProtocolMessage> {
59
+ return new Promise<HostProtocolMessage>((resolve, reject) => {
60
+ const timer = setTimeout(() => {
61
+ reject(new Error(`Timed out waiting for message (${timeoutMs}ms)`));
62
+ }, timeoutMs);
63
+
64
+ ws.once('message', (raw) => {
65
+ clearTimeout(timer);
66
+ const data = typeof raw === 'string' ? raw : raw.toString('utf-8');
67
+ const msg = decodeHostMessage(data);
68
+ if (!msg) {
69
+ reject(new Error(`Failed to decode host message: ${data}`));
70
+ return;
71
+ }
72
+ resolve(msg);
73
+ });
74
+ });
75
+ }
76
+
77
+ function deriveContext(state: string): SessionContext {
78
+ if (state === 'Server') return 'server';
79
+ if (state === 'Client') return 'client';
80
+ return 'edit';
81
+ }
82
+
83
+ /**
84
+ * Wire BridgeHost events to a SessionTracker, mirroring the pattern from
85
+ * BridgeConnection._initHostAsync. Returns the tracker for querying.
86
+ */
87
+ function wireHostAndTracker(host: BridgeHost): SessionTracker {
88
+ const tracker = new SessionTracker();
89
+
90
+ // plugin-connected -> tracker.addSession
91
+ host.on('plugin-connected', (info) => {
92
+ const state = info.state ?? 'Edit';
93
+ const context = deriveContext(state);
94
+
95
+ const sessionInfo: SessionInfo = {
96
+ sessionId: info.sessionId,
97
+ placeName: info.placeName ?? '',
98
+ placeFile: info.placeFile,
99
+ state: state as SessionInfo['state'],
100
+ pluginVersion: info.pluginVersion ?? '',
101
+ capabilities: info.capabilities,
102
+ connectedAt: new Date(),
103
+ origin: 'user',
104
+ context,
105
+ instanceId: info.instanceId ?? info.sessionId,
106
+ placeId: 0,
107
+ gameId: 0,
108
+ };
109
+
110
+ const handle = new StubTransportHandle();
111
+ tracker.addSession(info.sessionId, sessionInfo, handle);
112
+ });
113
+
114
+ // plugin-disconnected -> tracker.removeSession
115
+ host.on('plugin-disconnected', (sessionId: string) => {
116
+ tracker.removeSession(sessionId);
117
+ });
118
+
119
+ // client-message -> respond to list-sessions, list-instances
120
+ host.on(
121
+ 'client-message',
122
+ (msg: HostProtocolMessage, reply: (m: HostProtocolMessage) => void) => {
123
+ if (msg.type === 'list-sessions') {
124
+ const req = msg as ListSessionsRequest;
125
+ reply({
126
+ type: 'list-sessions-response',
127
+ requestId: req.requestId,
128
+ sessions: tracker.listSessions(),
129
+ });
130
+ } else if (msg.type === 'list-instances') {
131
+ const req = msg as ListInstancesRequest;
132
+ reply({
133
+ type: 'list-instances-response',
134
+ requestId: req.requestId,
135
+ instances: tracker.listInstances(),
136
+ });
137
+ }
138
+ }
139
+ );
140
+
141
+ // session-added -> broadcast session-event connected
142
+ tracker.on('session-added', (tracked: { info: SessionInfo }) => {
143
+ host.broadcastToClients({
144
+ type: 'session-event',
145
+ event: 'connected',
146
+ sessionId: tracked.info.sessionId,
147
+ session: tracked.info,
148
+ context: tracked.info.context,
149
+ instanceId: tracked.info.instanceId,
150
+ });
151
+ });
152
+
153
+ // session-removed -> broadcast session-event disconnected
154
+ tracker.on('session-removed', (sessionId: string) => {
155
+ host.broadcastToClients({
156
+ type: 'session-event',
157
+ event: 'disconnected',
158
+ sessionId,
159
+ context: 'edit',
160
+ instanceId: sessionId,
161
+ });
162
+ });
163
+
164
+ return tracker;
165
+ }
166
+
167
+ /**
168
+ * Send a register message on a plugin WebSocket.
169
+ */
170
+ async function registerPluginAsync(
171
+ pluginWs: WebSocket,
172
+ options: {
173
+ sessionId: string;
174
+ instanceId: string;
175
+ placeName?: string;
176
+ pluginVersion?: string;
177
+ state?: string;
178
+ capabilities?: Capability[];
179
+ }
180
+ ): Promise<void> {
181
+ pluginWs.send(
182
+ JSON.stringify({
183
+ type: 'register',
184
+ sessionId: options.sessionId,
185
+ payload: {
186
+ pluginVersion: options.pluginVersion ?? '0.7.0',
187
+ instanceId: options.instanceId,
188
+ placeName: options.placeName ?? 'TestPlace',
189
+ state: options.state ?? 'Edit',
190
+ capabilities: options.capabilities ?? ['execute'],
191
+ },
192
+ })
193
+ );
194
+
195
+ // Yield to let the host process the register
196
+ await new Promise((r) => setTimeout(r, 20));
197
+ }
198
+
199
+ describe('Host-client integration', { timeout: 10_000 }, () => {
200
+ let host: BridgeHost | undefined;
201
+ const openSockets: WebSocket[] = [];
202
+
203
+ afterEach(async () => {
204
+ for (const ws of openSockets) {
205
+ if (
206
+ ws.readyState === WebSocket.OPEN ||
207
+ ws.readyState === WebSocket.CONNECTING
208
+ ) {
209
+ ws.terminate();
210
+ }
211
+ }
212
+ openSockets.length = 0;
213
+
214
+ if (host) {
215
+ try {
216
+ await host.stopAsync();
217
+ } catch {
218
+ /* ignore */
219
+ }
220
+ host = undefined;
221
+ }
222
+ });
223
+
224
+ it('host responds to list-sessions request from client WebSocket', async () => {
225
+ host = new BridgeHost();
226
+ const port = await host.startAsync({ port: 0 });
227
+ wireHostAndTracker(host);
228
+
229
+ const clientWs = await connectClientWsAsync(port);
230
+ openSockets.push(clientWs);
231
+
232
+ // Send list-sessions request
233
+ const responsePromise = waitForMessageAsync(clientWs);
234
+ clientWs.send(
235
+ encodeHostMessage({
236
+ type: 'list-sessions',
237
+ requestId: 'req-1',
238
+ })
239
+ );
240
+
241
+ const response = await responsePromise;
242
+
243
+ expect(response.type).toBe('list-sessions-response');
244
+ expect(response).toHaveProperty('requestId', 'req-1');
245
+ expect(response).toHaveProperty('sessions');
246
+ expect((response as { sessions: unknown[] }).sessions).toEqual([]);
247
+ });
248
+
249
+ it('host responds to list-instances request from client WebSocket', async () => {
250
+ host = new BridgeHost();
251
+ const port = await host.startAsync({ port: 0 });
252
+ wireHostAndTracker(host);
253
+
254
+ const clientWs = await connectClientWsAsync(port);
255
+ openSockets.push(clientWs);
256
+
257
+ // Send list-instances request
258
+ const responsePromise = waitForMessageAsync(clientWs);
259
+ clientWs.send(
260
+ encodeHostMessage({
261
+ type: 'list-instances',
262
+ requestId: 'req-2',
263
+ })
264
+ );
265
+
266
+ const response = await responsePromise;
267
+
268
+ expect(response.type).toBe('list-instances-response');
269
+ expect(response).toHaveProperty('requestId', 'req-2');
270
+ expect(response).toHaveProperty('instances');
271
+ expect((response as { instances: unknown[] }).instances).toEqual([]);
272
+ });
273
+
274
+ it('client WebSocket receives session-event when plugin connects', async () => {
275
+ host = new BridgeHost();
276
+ const port = await host.startAsync({ port: 0 });
277
+ wireHostAndTracker(host);
278
+
279
+ // Connect a client first so it can receive the broadcast
280
+ const clientWs = await connectClientWsAsync(port);
281
+ openSockets.push(clientWs);
282
+
283
+ // Set up listener before plugin connects
284
+ const eventPromise = waitForMessageAsync(clientWs);
285
+
286
+ // Connect a plugin and register
287
+ const pluginWs = await connectPluginWsAsync(port);
288
+ openSockets.push(pluginWs);
289
+
290
+ await registerPluginAsync(pluginWs, {
291
+ sessionId: 'test-session-1',
292
+ instanceId: 'game-123',
293
+ placeName: 'TestPlace',
294
+ pluginVersion: '0.7.0',
295
+ state: 'Edit',
296
+ capabilities: ['execute'],
297
+ });
298
+
299
+ const event = await eventPromise;
300
+
301
+ expect(event.type).toBe('session-event');
302
+ expect(event).toHaveProperty('event', 'connected');
303
+ expect(event).toHaveProperty('sessionId', 'test-session-1');
304
+ });
305
+
306
+ it('client WebSocket receives session-event when plugin disconnects', async () => {
307
+ host = new BridgeHost();
308
+ const port = await host.startAsync({ port: 0 });
309
+ wireHostAndTracker(host);
310
+
311
+ const clientWs = await connectClientWsAsync(port);
312
+ openSockets.push(clientWs);
313
+
314
+ // Connect and register a plugin
315
+ const pluginWs = await connectPluginWsAsync(port);
316
+ openSockets.push(pluginWs);
317
+
318
+ // Wait for the connected event first
319
+ const connectedPromise = waitForMessageAsync(clientWs);
320
+
321
+ await registerPluginAsync(pluginWs, {
322
+ sessionId: 'test-session-1',
323
+ instanceId: 'game-123',
324
+ });
325
+
326
+ await connectedPromise;
327
+
328
+ // Now set up listener for the disconnected event
329
+ const disconnectPromise = waitForMessageAsync(clientWs);
330
+
331
+ // Close the plugin WebSocket
332
+ pluginWs.close();
333
+
334
+ const event = await disconnectPromise;
335
+
336
+ expect(event.type).toBe('session-event');
337
+ expect(event).toHaveProperty('event', 'disconnected');
338
+ expect(event).toHaveProperty('sessionId', 'test-session-1');
339
+ });
340
+
341
+ it('list-sessions returns connected plugin after register', async () => {
342
+ host = new BridgeHost();
343
+ const port = await host.startAsync({ port: 0 });
344
+ wireHostAndTracker(host);
345
+
346
+ const clientWs = await connectClientWsAsync(port);
347
+ openSockets.push(clientWs);
348
+
349
+ // Connect and register a plugin
350
+ const pluginWs = await connectPluginWsAsync(port);
351
+ openSockets.push(pluginWs);
352
+
353
+ // Wait for the connected session-event so we know the tracker has the session
354
+ const connectedPromise = waitForMessageAsync(clientWs);
355
+
356
+ await registerPluginAsync(pluginWs, {
357
+ sessionId: 'test-session-1',
358
+ instanceId: 'game-123',
359
+ placeName: 'TestPlace',
360
+ pluginVersion: '0.7.0',
361
+ state: 'Edit',
362
+ capabilities: ['execute'],
363
+ });
364
+
365
+ await connectedPromise;
366
+
367
+ // Now send list-sessions
368
+ const responsePromise = waitForMessageAsync(clientWs);
369
+ clientWs.send(
370
+ encodeHostMessage({
371
+ type: 'list-sessions',
372
+ requestId: 'req-ls-1',
373
+ })
374
+ );
375
+
376
+ const response = await responsePromise;
377
+
378
+ expect(response.type).toBe('list-sessions-response');
379
+ expect(response).toHaveProperty('requestId', 'req-ls-1');
380
+
381
+ const sessions = (response as { sessions: SessionInfo[] }).sessions;
382
+ expect(sessions).toHaveLength(1);
383
+ expect(sessions[0].sessionId).toBe('test-session-1');
384
+ expect(sessions[0].instanceId).toBe('game-123');
385
+ expect(sessions[0].placeName).toBe('TestPlace');
386
+ });
387
+ });