@quenty/studio-bridge 0.21.1 → 0.22.1

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 (482) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/README.md +109 -17
  3. package/build-scripts/transform-add-session-attribute.lua +1 -0
  4. package/deploy.nevermore.json +10 -0
  5. package/dist/src/bridge/bridge-connection.d.ts +26 -2
  6. package/dist/src/bridge/bridge-connection.d.ts.map +1 -1
  7. package/dist/src/bridge/bridge-connection.js +159 -14
  8. package/dist/src/bridge/bridge-connection.js.map +1 -1
  9. package/dist/src/bridge/bridge-connection.test.js +81 -0
  10. package/dist/src/bridge/bridge-connection.test.js.map +1 -1
  11. package/dist/src/bridge/bridge-session.d.ts +35 -2
  12. package/dist/src/bridge/bridge-session.d.ts.map +1 -1
  13. package/dist/src/bridge/bridge-session.js +185 -28
  14. package/dist/src/bridge/bridge-session.js.map +1 -1
  15. package/dist/src/bridge/bridge-session.test.js +6 -4
  16. package/dist/src/bridge/bridge-session.test.js.map +1 -1
  17. package/dist/src/bridge/index.d.ts +1 -1
  18. package/dist/src/bridge/index.d.ts.map +1 -1
  19. package/dist/src/bridge/index.js.map +1 -1
  20. package/dist/src/bridge/internal/bridge-client.d.ts +4 -0
  21. package/dist/src/bridge/internal/bridge-client.d.ts.map +1 -1
  22. package/dist/src/bridge/internal/bridge-client.js +20 -7
  23. package/dist/src/bridge/internal/bridge-client.js.map +1 -1
  24. package/dist/src/bridge/internal/bridge-client.test.js +18 -0
  25. package/dist/src/bridge/internal/bridge-client.test.js.map +1 -1
  26. package/dist/src/bridge/internal/bridge-host.d.ts +13 -1
  27. package/dist/src/bridge/internal/bridge-host.d.ts.map +1 -1
  28. package/dist/src/bridge/internal/bridge-host.js +35 -0
  29. package/dist/src/bridge/internal/bridge-host.js.map +1 -1
  30. package/dist/src/bridge/internal/bridge-host.test.js +31 -0
  31. package/dist/src/bridge/internal/bridge-host.test.js.map +1 -1
  32. package/dist/src/bridge/internal/hand-off.d.ts.map +1 -1
  33. package/dist/src/bridge/internal/hand-off.js +4 -1
  34. package/dist/src/bridge/internal/hand-off.js.map +1 -1
  35. package/dist/src/bridge/internal/host-protocol.d.ts +8 -0
  36. package/dist/src/bridge/internal/host-protocol.d.ts.map +1 -1
  37. package/dist/src/bridge/internal/host-protocol.js +120 -13
  38. package/dist/src/bridge/internal/host-protocol.js.map +1 -1
  39. package/dist/src/bridge/internal/host-protocol.test.js +13 -0
  40. package/dist/src/bridge/internal/host-protocol.test.js.map +1 -1
  41. package/dist/src/bridge/internal/instance-state.d.ts +9 -0
  42. package/dist/src/bridge/internal/instance-state.d.ts.map +1 -0
  43. package/dist/src/bridge/internal/instance-state.js +28 -0
  44. package/dist/src/bridge/internal/instance-state.js.map +1 -0
  45. package/dist/src/bridge/internal/transport-client.d.ts.map +1 -1
  46. package/dist/src/bridge/internal/transport-client.js +2 -1
  47. package/dist/src/bridge/internal/transport-client.js.map +1 -1
  48. package/dist/src/bridge/internal/transport-server.d.ts.map +1 -1
  49. package/dist/src/bridge/internal/transport-server.js +5 -1
  50. package/dist/src/bridge/internal/transport-server.js.map +1 -1
  51. package/dist/src/bridge/types.d.ts +43 -4
  52. package/dist/src/bridge/types.d.ts.map +1 -1
  53. package/dist/src/bridge/types.js.map +1 -1
  54. package/dist/src/cli/adapters/cli-command-adapter-handler.test.js +24 -0
  55. package/dist/src/cli/adapters/cli-command-adapter-handler.test.js.map +1 -1
  56. package/dist/src/cli/adapters/cli-command-adapter.d.ts +6 -0
  57. package/dist/src/cli/adapters/cli-command-adapter.d.ts.map +1 -1
  58. package/dist/src/cli/adapters/cli-command-adapter.js +107 -11
  59. package/dist/src/cli/adapters/cli-command-adapter.js.map +1 -1
  60. package/dist/src/cli/adapters/group-builder.d.ts +3 -0
  61. package/dist/src/cli/adapters/group-builder.d.ts.map +1 -1
  62. package/dist/src/cli/adapters/group-builder.js +34 -15
  63. package/dist/src/cli/adapters/group-builder.js.map +1 -1
  64. package/dist/src/cli/adapters/group-builder.test.js +26 -2
  65. package/dist/src/cli/adapters/group-builder.test.js.map +1 -1
  66. package/dist/src/cli/adapters/help-formatter.d.ts.map +1 -1
  67. package/dist/src/cli/adapters/help-formatter.js +4 -3
  68. package/dist/src/cli/adapters/help-formatter.js.map +1 -1
  69. package/dist/src/cli/adapters/help-formatter.test.js +1 -1
  70. package/dist/src/cli/adapters/help-formatter.test.js.map +1 -1
  71. package/dist/src/cli/adapters/playtest-edit-guard.test.d.ts +2 -0
  72. package/dist/src/cli/adapters/playtest-edit-guard.test.d.ts.map +1 -0
  73. package/dist/src/cli/adapters/playtest-edit-guard.test.js +28 -0
  74. package/dist/src/cli/adapters/playtest-edit-guard.test.js.map +1 -0
  75. package/dist/src/cli/args/global-args.d.ts +1 -1
  76. package/dist/src/cli/args/global-args.d.ts.map +1 -1
  77. package/dist/src/cli/cli-output-context.d.ts +14 -0
  78. package/dist/src/cli/cli-output-context.d.ts.map +1 -0
  79. package/dist/src/cli/cli-output-context.js +39 -0
  80. package/dist/src/cli/cli-output-context.js.map +1 -0
  81. package/dist/src/cli/cli-output-context.test.d.ts +2 -0
  82. package/dist/src/cli/cli-output-context.test.d.ts.map +1 -0
  83. package/dist/src/cli/cli-output-context.test.js +38 -0
  84. package/dist/src/cli/cli-output-context.test.js.map +1 -0
  85. package/dist/src/cli/cli.js +40 -17
  86. package/dist/src/cli/cli.js.map +1 -1
  87. package/dist/src/cli/managed-studio-run.d.ts +21 -0
  88. package/dist/src/cli/managed-studio-run.d.ts.map +1 -0
  89. package/dist/src/cli/managed-studio-run.js +75 -0
  90. package/dist/src/cli/managed-studio-run.js.map +1 -0
  91. package/dist/src/cli/managed-studio-run.test.d.ts +2 -0
  92. package/dist/src/cli/managed-studio-run.test.d.ts.map +1 -0
  93. package/dist/src/cli/managed-studio-run.test.js +52 -0
  94. package/dist/src/cli/managed-studio-run.test.js.map +1 -0
  95. package/dist/src/cli/resolve-session.js +1 -1
  96. package/dist/src/cli/resolve-session.js.map +1 -1
  97. package/dist/src/cli/resolve-session.test.js +1 -1
  98. package/dist/src/cli/resolve-session.test.js.map +1 -1
  99. package/dist/src/cli/script-executor.d.ts +13 -1
  100. package/dist/src/cli/script-executor.d.ts.map +1 -1
  101. package/dist/src/cli/script-executor.js +77 -47
  102. package/dist/src/cli/script-executor.js.map +1 -1
  103. package/dist/src/commands/console/exec/exec.d.ts +17 -0
  104. package/dist/src/commands/console/exec/exec.d.ts.map +1 -1
  105. package/dist/src/commands/console/exec/exec.js +39 -7
  106. package/dist/src/commands/console/exec/exec.js.map +1 -1
  107. package/dist/src/commands/console/exec/exec.test.js +62 -3
  108. package/dist/src/commands/console/exec/exec.test.js.map +1 -1
  109. package/dist/src/commands/console/logs/logs.d.ts +30 -2
  110. package/dist/src/commands/console/logs/logs.d.ts.map +1 -1
  111. package/dist/src/commands/console/logs/logs.js +82 -7
  112. package/dist/src/commands/console/logs/logs.js.map +1 -1
  113. package/dist/src/commands/console/logs/logs.test.js +63 -4
  114. package/dist/src/commands/console/logs/logs.test.js.map +1 -1
  115. package/dist/src/commands/explorer/export/export.d.ts +19 -0
  116. package/dist/src/commands/explorer/export/export.d.ts.map +1 -0
  117. package/dist/src/commands/explorer/export/export.js +37 -0
  118. package/dist/src/commands/explorer/export/export.js.map +1 -0
  119. package/dist/src/commands/explorer/export/export.test.d.ts +2 -0
  120. package/dist/src/commands/explorer/export/export.test.d.ts.map +1 -0
  121. package/dist/src/commands/explorer/export/export.test.js +25 -0
  122. package/dist/src/commands/explorer/export/export.test.js.map +1 -0
  123. package/dist/src/commands/explorer/find/find.d.ts +28 -0
  124. package/dist/src/commands/explorer/find/find.d.ts.map +1 -0
  125. package/dist/src/commands/explorer/find/find.js +75 -0
  126. package/dist/src/commands/explorer/find/find.js.map +1 -0
  127. package/dist/src/commands/explorer/find/find.test.d.ts +2 -0
  128. package/dist/src/commands/explorer/find/find.test.d.ts.map +1 -0
  129. package/dist/src/commands/explorer/find/find.test.js +44 -0
  130. package/dist/src/commands/explorer/find/find.test.js.map +1 -0
  131. package/dist/src/commands/explorer/grep/grep.d.ts +24 -0
  132. package/dist/src/commands/explorer/grep/grep.d.ts.map +1 -0
  133. package/dist/src/commands/explorer/grep/grep.js +63 -0
  134. package/dist/src/commands/explorer/grep/grep.js.map +1 -0
  135. package/dist/src/commands/explorer/grep/grep.test.d.ts +2 -0
  136. package/dist/src/commands/explorer/grep/grep.test.d.ts.map +1 -0
  137. package/dist/src/commands/explorer/grep/grep.test.js +42 -0
  138. package/dist/src/commands/explorer/grep/grep.test.js.map +1 -0
  139. package/dist/src/commands/explorer/import/import.d.ts +21 -0
  140. package/dist/src/commands/explorer/import/import.d.ts.map +1 -0
  141. package/dist/src/commands/explorer/import/import.js +37 -0
  142. package/dist/src/commands/explorer/import/import.js.map +1 -0
  143. package/dist/src/commands/explorer/import/import.test.d.ts +2 -0
  144. package/dist/src/commands/explorer/import/import.test.d.ts.map +1 -0
  145. package/dist/src/commands/explorer/import/import.test.js +45 -0
  146. package/dist/src/commands/explorer/import/import.test.js.map +1 -0
  147. package/dist/src/commands/formatters.test.js +7 -1
  148. package/dist/src/commands/formatters.test.js.map +1 -1
  149. package/dist/src/commands/framework/action-loader.d.ts +5 -1
  150. package/dist/src/commands/framework/action-loader.d.ts.map +1 -1
  151. package/dist/src/commands/framework/action-loader.js +9 -2
  152. package/dist/src/commands/framework/action-loader.js.map +1 -1
  153. package/dist/src/commands/framework/action-loader.test.js +23 -0
  154. package/dist/src/commands/framework/action-loader.test.js.map +1 -1
  155. package/dist/src/commands/framework/arg-builder.d.ts +15 -2
  156. package/dist/src/commands/framework/arg-builder.d.ts.map +1 -1
  157. package/dist/src/commands/framework/arg-builder.js +22 -2
  158. package/dist/src/commands/framework/arg-builder.js.map +1 -1
  159. package/dist/src/commands/framework/define-command.d.ts +19 -3
  160. package/dist/src/commands/framework/define-command.d.ts.map +1 -1
  161. package/dist/src/commands/framework/define-command.js.map +1 -1
  162. package/dist/src/commands/framework/index.d.ts +1 -1
  163. package/dist/src/commands/framework/index.d.ts.map +1 -1
  164. package/dist/src/commands/framework/index.js.map +1 -1
  165. package/dist/src/commands/index.d.ts +11 -0
  166. package/dist/src/commands/index.d.ts.map +1 -1
  167. package/dist/src/commands/index.js +11 -0
  168. package/dist/src/commands/index.js.map +1 -1
  169. package/dist/src/commands/linux/inject-credentials/inject-credentials.d.ts.map +1 -1
  170. package/dist/src/commands/linux/inject-credentials/inject-credentials.js +1 -3
  171. package/dist/src/commands/linux/inject-credentials/inject-credentials.js.map +1 -1
  172. package/dist/src/commands/linux/setup/setup.d.ts.map +1 -1
  173. package/dist/src/commands/linux/setup/setup.js +1 -3
  174. package/dist/src/commands/linux/setup/setup.js.map +1 -1
  175. package/dist/src/commands/linux/status/status.d.ts +9 -1
  176. package/dist/src/commands/linux/status/status.d.ts.map +1 -1
  177. package/dist/src/commands/linux/status/status.js +66 -86
  178. package/dist/src/commands/linux/status/status.js.map +1 -1
  179. package/dist/src/commands/playtest/player/add/add.d.ts +17 -0
  180. package/dist/src/commands/playtest/player/add/add.d.ts.map +1 -0
  181. package/dist/src/commands/playtest/player/add/add.js +45 -0
  182. package/dist/src/commands/playtest/player/add/add.js.map +1 -0
  183. package/dist/src/commands/playtest/player/list/list.d.ts +13 -0
  184. package/dist/src/commands/playtest/player/list/list.d.ts.map +1 -0
  185. package/dist/src/commands/playtest/player/list/list.js +33 -0
  186. package/dist/src/commands/playtest/player/list/list.js.map +1 -0
  187. package/dist/src/commands/playtest/player/playtest-players.d.ts +36 -0
  188. package/dist/src/commands/playtest/player/playtest-players.d.ts.map +1 -0
  189. package/dist/src/commands/playtest/player/playtest-players.js +187 -0
  190. package/dist/src/commands/playtest/player/playtest-players.js.map +1 -0
  191. package/dist/src/commands/playtest/player/playtest-players.test.d.ts +2 -0
  192. package/dist/src/commands/playtest/player/playtest-players.test.d.ts.map +1 -0
  193. package/dist/src/commands/playtest/player/playtest-players.test.js +89 -0
  194. package/dist/src/commands/playtest/player/playtest-players.test.js.map +1 -0
  195. package/dist/src/commands/playtest/player/remove/remove.d.ts +17 -0
  196. package/dist/src/commands/playtest/player/remove/remove.d.ts.map +1 -0
  197. package/dist/src/commands/playtest/player/remove/remove.js +42 -0
  198. package/dist/src/commands/playtest/player/remove/remove.js.map +1 -0
  199. package/dist/src/commands/playtest/playtest-sessions.d.ts +49 -0
  200. package/dist/src/commands/playtest/playtest-sessions.d.ts.map +1 -0
  201. package/dist/src/commands/playtest/playtest-sessions.js +283 -0
  202. package/dist/src/commands/playtest/playtest-sessions.js.map +1 -0
  203. package/dist/src/commands/playtest/playtest-sessions.test.d.ts +2 -0
  204. package/dist/src/commands/playtest/playtest-sessions.test.d.ts.map +1 -0
  205. package/dist/src/commands/playtest/playtest-sessions.test.js +87 -0
  206. package/dist/src/commands/playtest/playtest-sessions.test.js.map +1 -0
  207. package/dist/src/commands/playtest/restart/restart.d.ts +23 -0
  208. package/dist/src/commands/playtest/restart/restart.d.ts.map +1 -0
  209. package/dist/src/commands/playtest/restart/restart.js +105 -0
  210. package/dist/src/commands/playtest/restart/restart.js.map +1 -0
  211. package/dist/src/commands/playtest/run/run.d.ts +47 -0
  212. package/dist/src/commands/playtest/run/run.d.ts.map +1 -0
  213. package/dist/src/commands/playtest/run/run.js +137 -0
  214. package/dist/src/commands/playtest/run/run.js.map +1 -0
  215. package/dist/src/commands/playtest/start/start.d.ts +42 -0
  216. package/dist/src/commands/playtest/start/start.d.ts.map +1 -0
  217. package/dist/src/commands/playtest/start/start.js +70 -0
  218. package/dist/src/commands/playtest/start/start.js.map +1 -0
  219. package/dist/src/commands/playtest/stop/stop.d.ts +15 -0
  220. package/dist/src/commands/playtest/stop/stop.d.ts.map +1 -0
  221. package/dist/src/commands/playtest/stop/stop.js +24 -0
  222. package/dist/src/commands/playtest/stop/stop.js.map +1 -0
  223. package/dist/src/commands/process/close/close.d.ts +19 -10
  224. package/dist/src/commands/process/close/close.d.ts.map +1 -1
  225. package/dist/src/commands/process/close/close.js +118 -15
  226. package/dist/src/commands/process/close/close.js.map +1 -1
  227. package/dist/src/commands/process/close/close.test.d.ts +2 -0
  228. package/dist/src/commands/process/close/close.test.d.ts.map +1 -0
  229. package/dist/src/commands/process/close/close.test.js +190 -0
  230. package/dist/src/commands/process/close/close.test.js.map +1 -0
  231. package/dist/src/commands/process/info/info.d.ts +45 -5
  232. package/dist/src/commands/process/info/info.d.ts.map +1 -1
  233. package/dist/src/commands/process/info/info.js +117 -13
  234. package/dist/src/commands/process/info/info.js.map +1 -1
  235. package/dist/src/commands/process/info/info.test.js +140 -38
  236. package/dist/src/commands/process/info/info.test.js.map +1 -1
  237. package/dist/src/commands/process/launch/launch.d.ts +11 -1
  238. package/dist/src/commands/process/launch/launch.d.ts.map +1 -1
  239. package/dist/src/commands/process/launch/launch.js +37 -7
  240. package/dist/src/commands/process/launch/launch.js.map +1 -1
  241. package/dist/src/commands/process/launch/launch.test.js +99 -20
  242. package/dist/src/commands/process/launch/launch.test.js.map +1 -1
  243. package/dist/src/commands/process/list/list.d.ts +2 -1
  244. package/dist/src/commands/process/list/list.d.ts.map +1 -1
  245. package/dist/src/commands/process/list/list.js +9 -6
  246. package/dist/src/commands/process/list/list.js.map +1 -1
  247. package/dist/src/commands/process/list/list.test.js +1 -0
  248. package/dist/src/commands/process/list/list.test.js.map +1 -1
  249. package/dist/src/commands/process/run/run.d.ts +9 -0
  250. package/dist/src/commands/process/run/run.d.ts.map +1 -1
  251. package/dist/src/commands/process/run/run.js +15 -5
  252. package/dist/src/commands/process/run/run.js.map +1 -1
  253. package/dist/src/commands/serve/serve.d.ts +2 -0
  254. package/dist/src/commands/serve/serve.d.ts.map +1 -1
  255. package/dist/src/commands/serve/serve.js +17 -4
  256. package/dist/src/commands/serve/serve.js.map +1 -1
  257. package/dist/src/commands/serve/serve.test.js +9 -2
  258. package/dist/src/commands/serve/serve.test.js.map +1 -1
  259. package/dist/src/commands/viewport/screenshot/screenshot.d.ts.map +1 -1
  260. package/dist/src/commands/viewport/screenshot/screenshot.js +4 -1
  261. package/dist/src/commands/viewport/screenshot/screenshot.js.map +1 -1
  262. package/dist/src/commands/viewport/screenshot/screenshot.test.js +5 -9
  263. package/dist/src/commands/viewport/screenshot/screenshot.test.js.map +1 -1
  264. package/dist/src/deploy/deploy-places.d.ts +39 -0
  265. package/dist/src/deploy/deploy-places.d.ts.map +1 -0
  266. package/dist/src/deploy/deploy-places.js +162 -0
  267. package/dist/src/deploy/deploy-places.js.map +1 -0
  268. package/dist/src/deploy/deploy-places.test.d.ts +2 -0
  269. package/dist/src/deploy/deploy-places.test.d.ts.map +1 -0
  270. package/dist/src/deploy/deploy-places.test.js +96 -0
  271. package/dist/src/deploy/deploy-places.test.js.map +1 -0
  272. package/dist/src/index.d.ts +2 -2
  273. package/dist/src/index.d.ts.map +1 -1
  274. package/dist/src/index.js +1 -1
  275. package/dist/src/index.js.map +1 -1
  276. package/dist/src/plugin/persistent-plugin-installer.d.ts.map +1 -1
  277. package/dist/src/plugin/persistent-plugin-installer.js +2 -1
  278. package/dist/src/plugin/persistent-plugin-installer.js.map +1 -1
  279. package/dist/src/plugin/persistent-plugin-installer.test.js +3 -0
  280. package/dist/src/plugin/persistent-plugin-installer.test.js.map +1 -1
  281. package/dist/src/plugin/plugin-build-version.d.ts +7 -0
  282. package/dist/src/plugin/plugin-build-version.d.ts.map +1 -0
  283. package/dist/src/plugin/plugin-build-version.js +42 -0
  284. package/dist/src/plugin/plugin-build-version.js.map +1 -0
  285. package/dist/src/plugin/plugin-build-version.test.d.ts +2 -0
  286. package/dist/src/plugin/plugin-build-version.test.d.ts.map +1 -0
  287. package/dist/src/plugin/plugin-build-version.test.js +41 -0
  288. package/dist/src/plugin/plugin-build-version.test.js.map +1 -0
  289. package/dist/src/plugin/plugin-injector.d.ts.map +1 -1
  290. package/dist/src/plugin/plugin-injector.js +7 -1
  291. package/dist/src/plugin/plugin-injector.js.map +1 -1
  292. package/dist/src/process/studio-process-closer.d.ts +35 -0
  293. package/dist/src/process/studio-process-closer.d.ts.map +1 -0
  294. package/dist/src/process/studio-process-closer.js +129 -0
  295. package/dist/src/process/studio-process-closer.js.map +1 -0
  296. package/dist/src/process/studio-process-closer.test.d.ts +2 -0
  297. package/dist/src/process/studio-process-closer.test.d.ts.map +1 -0
  298. package/dist/src/process/studio-process-closer.test.js +80 -0
  299. package/dist/src/process/studio-process-closer.test.js.map +1 -0
  300. package/dist/src/process/studio-settings.d.ts +14 -0
  301. package/dist/src/process/studio-settings.d.ts.map +1 -0
  302. package/dist/src/process/studio-settings.js +50 -0
  303. package/dist/src/process/studio-settings.js.map +1 -0
  304. package/dist/src/process/studio-settings.test.d.ts +2 -0
  305. package/dist/src/process/studio-settings.test.d.ts.map +1 -0
  306. package/dist/src/process/studio-settings.test.js +16 -0
  307. package/dist/src/process/studio-settings.test.js.map +1 -0
  308. package/dist/src/process/studio-window-state.d.ts +13 -0
  309. package/dist/src/process/studio-window-state.d.ts.map +1 -0
  310. package/dist/src/process/studio-window-state.js +48 -0
  311. package/dist/src/process/studio-window-state.js.map +1 -0
  312. package/dist/src/server/studio-bridge-server.d.ts +3 -1
  313. package/dist/src/server/studio-bridge-server.d.ts.map +1 -1
  314. package/dist/src/server/studio-bridge-server.js +12 -4
  315. package/dist/src/server/studio-bridge-server.js.map +1 -1
  316. package/dist/src/server/web-socket-protocol.d.ts +173 -6
  317. package/dist/src/server/web-socket-protocol.d.ts.map +1 -1
  318. package/dist/src/server/web-socket-protocol.js +244 -1
  319. package/dist/src/server/web-socket-protocol.js.map +1 -1
  320. package/dist/src/server/web-socket-protocol.test.js +48 -0
  321. package/dist/src/server/web-socket-protocol.test.js.map +1 -1
  322. package/dist/src/test/e2e/persistent-session.test.js +121 -0
  323. package/dist/src/test/e2e/persistent-session.test.js.map +1 -1
  324. package/dist/src/test/e2e/split-server.test.d.ts +3 -5
  325. package/dist/src/test/e2e/split-server.test.d.ts.map +1 -1
  326. package/dist/src/test/e2e/split-server.test.js +3 -5
  327. package/dist/src/test/e2e/split-server.test.js.map +1 -1
  328. package/dist/tsconfig.tsbuildinfo +1 -1
  329. package/docker/Dockerfile +3 -0
  330. package/package.json +8 -6
  331. package/src/bridge/bridge-connection.test.ts +126 -0
  332. package/src/bridge/bridge-connection.ts +217 -22
  333. package/src/bridge/bridge-session.test.ts +6 -4
  334. package/src/bridge/bridge-session.ts +273 -28
  335. package/src/bridge/index.ts +3 -0
  336. package/src/bridge/internal/bridge-client.test.ts +23 -0
  337. package/src/bridge/internal/bridge-client.ts +25 -7
  338. package/src/bridge/internal/bridge-host.test.ts +38 -0
  339. package/src/bridge/internal/bridge-host.ts +47 -0
  340. package/src/bridge/internal/hand-off.ts +4 -1
  341. package/src/bridge/internal/host-protocol.test.ts +15 -0
  342. package/src/bridge/internal/host-protocol.ts +148 -37
  343. package/src/bridge/internal/instance-state.ts +34 -0
  344. package/src/bridge/internal/transport-client.ts +2 -1
  345. package/src/bridge/internal/transport-server.ts +5 -1
  346. package/src/bridge/types.ts +47 -2
  347. package/src/cli/adapters/cli-command-adapter-handler.test.ts +28 -0
  348. package/src/cli/adapters/cli-command-adapter.ts +150 -18
  349. package/src/cli/adapters/group-builder.test.ts +34 -2
  350. package/src/cli/adapters/group-builder.ts +52 -20
  351. package/src/cli/adapters/help-formatter.test.ts +1 -1
  352. package/src/cli/adapters/help-formatter.ts +4 -3
  353. package/src/cli/adapters/playtest-edit-guard.test.ts +54 -0
  354. package/src/cli/args/global-args.ts +1 -1
  355. package/src/cli/cli-output-context.test.ts +55 -0
  356. package/src/cli/cli-output-context.ts +50 -0
  357. package/src/cli/cli.ts +49 -17
  358. package/src/cli/managed-studio-run.test.ts +71 -0
  359. package/src/cli/managed-studio-run.ts +135 -0
  360. package/src/cli/resolve-session.test.ts +1 -1
  361. package/src/cli/resolve-session.ts +1 -1
  362. package/src/cli/script-executor.ts +99 -51
  363. package/src/commands/console/exec/exec.test.ts +96 -3
  364. package/src/commands/console/exec/exec.ts +59 -6
  365. package/src/commands/console/exec/execute.lua +356 -240
  366. package/src/commands/console/exec/execute.spec.lua +286 -0
  367. package/src/commands/console/logs/logs.test.ts +76 -4
  368. package/src/commands/console/logs/logs.ts +132 -17
  369. package/src/commands/console/logs/query-logs.lua +85 -52
  370. package/src/commands/console/logs/query-logs.spec.lua +132 -0
  371. package/src/commands/explorer/export/export-instances.lua +108 -0
  372. package/src/commands/explorer/export/export-instances.spec.lua +87 -0
  373. package/src/commands/explorer/export/export.test.ts +27 -0
  374. package/src/commands/explorer/export/export.ts +60 -0
  375. package/src/commands/explorer/find/find-instances.lua +174 -0
  376. package/src/commands/explorer/find/find-instances.spec.lua +122 -0
  377. package/src/commands/explorer/find/find.test.ts +53 -0
  378. package/src/commands/explorer/find/find.ts +113 -0
  379. package/src/commands/explorer/grep/grep-scripts.lua +214 -0
  380. package/src/commands/explorer/grep/grep-scripts.spec.lua +130 -0
  381. package/src/commands/explorer/grep/grep.test.ts +45 -0
  382. package/src/commands/explorer/grep/grep.ts +93 -0
  383. package/src/commands/explorer/import/import-instances.lua +106 -0
  384. package/src/commands/explorer/import/import-instances.spec.lua +84 -0
  385. package/src/commands/explorer/import/import.test.ts +60 -0
  386. package/src/commands/explorer/import/import.ts +66 -0
  387. package/src/commands/explorer/query/query-data-model.lua +124 -152
  388. package/src/commands/explorer/query/query-data-model.spec.lua +150 -0
  389. package/src/commands/formatters.test.ts +7 -1
  390. package/src/commands/framework/action-loader.test.ts +28 -0
  391. package/src/commands/framework/action-loader.ts +10 -2
  392. package/src/commands/framework/arg-builder.ts +26 -3
  393. package/src/commands/framework/define-command.ts +32 -3
  394. package/src/commands/framework/index.ts +1 -0
  395. package/src/commands/index.ts +50 -0
  396. package/src/commands/linux/inject-credentials/inject-credentials.ts +1 -3
  397. package/src/commands/linux/setup/setup.ts +1 -3
  398. package/src/commands/linux/status/status.ts +105 -98
  399. package/src/commands/playtest/player/add/add.ts +85 -0
  400. package/src/commands/playtest/player/list/list.ts +57 -0
  401. package/src/commands/playtest/player/playtest-players.test.ts +146 -0
  402. package/src/commands/playtest/player/playtest-players.ts +270 -0
  403. package/src/commands/playtest/player/remove/remove.ts +78 -0
  404. package/src/commands/playtest/playtest-sessions.test.ts +143 -0
  405. package/src/commands/playtest/playtest-sessions.ts +417 -0
  406. package/src/commands/playtest/restart/restart.ts +199 -0
  407. package/src/commands/playtest/run/playtest-runner.luau +264 -0
  408. package/src/commands/playtest/run/playtest-runner.spec.lua +71 -0
  409. package/src/commands/playtest/run/run-playtest-script.lua +139 -0
  410. package/src/commands/playtest/run/run-playtest-script.spec.lua +43 -0
  411. package/src/commands/playtest/run/run.ts +239 -0
  412. package/src/commands/playtest/start/start-playtest.lua +108 -0
  413. package/src/commands/playtest/start/start.ts +138 -0
  414. package/src/commands/playtest/stop/end-playtest.lua +47 -0
  415. package/src/commands/playtest/stop/stop.ts +51 -0
  416. package/src/commands/process/close/close.test.ts +250 -0
  417. package/src/commands/process/close/close.ts +183 -17
  418. package/src/commands/process/info/info.test.ts +198 -44
  419. package/src/commands/process/info/info.ts +204 -15
  420. package/src/commands/process/info/query-state.lua +42 -29
  421. package/src/commands/process/info/query-state.spec.lua +39 -0
  422. package/src/commands/process/launch/launch.test.ts +138 -21
  423. package/src/commands/process/launch/launch.ts +69 -9
  424. package/src/commands/process/list/list.test.ts +1 -0
  425. package/src/commands/process/list/list.ts +14 -6
  426. package/src/commands/process/run/run.ts +26 -5
  427. package/src/commands/serve/serve.test.ts +17 -2
  428. package/src/commands/serve/serve.ts +25 -6
  429. package/src/commands/viewport/screenshot/capture-screenshot.lua +175 -182
  430. package/src/commands/viewport/screenshot/capture-screenshot.spec.lua +129 -0
  431. package/src/commands/viewport/screenshot/screenshot.test.ts +7 -10
  432. package/src/commands/viewport/screenshot/screenshot.ts +6 -1
  433. package/src/deploy/deploy-places.test.ts +127 -0
  434. package/src/deploy/deploy-places.ts +229 -0
  435. package/src/index.ts +11 -0
  436. package/src/plugin/persistent-plugin-installer.test.ts +4 -0
  437. package/src/plugin/persistent-plugin-installer.ts +2 -1
  438. package/src/plugin/plugin-build-version.test.ts +55 -0
  439. package/src/plugin/plugin-build-version.ts +53 -0
  440. package/src/plugin/plugin-injector.ts +7 -1
  441. package/src/process/studio-process-closer.test.ts +107 -0
  442. package/src/process/studio-process-closer.ts +187 -0
  443. package/src/process/studio-settings.test.ts +18 -0
  444. package/src/process/studio-settings.ts +61 -0
  445. package/src/process/studio-window-state.ts +65 -0
  446. package/src/server/studio-bridge-server.ts +15 -4
  447. package/src/server/web-socket-protocol.test.ts +55 -0
  448. package/src/server/web-socket-protocol.ts +468 -8
  449. package/src/test/e2e/persistent-session.test.ts +137 -0
  450. package/src/test/e2e/split-server.test.ts +3 -5
  451. package/templates/studio-bridge-plugin/default.project.json +3 -0
  452. package/templates/studio-bridge-plugin/src/Shared/ActionRouter.lua +208 -159
  453. package/templates/studio-bridge-plugin/src/Shared/ActionRouter.spec.lua +418 -0
  454. package/templates/studio-bridge-plugin/src/Shared/BuiltInActions.lua +94 -0
  455. package/templates/studio-bridge-plugin/src/Shared/BuiltInActions.spec.lua +166 -0
  456. package/templates/studio-bridge-plugin/src/Shared/DiscoveryStateMachine.lua +118 -137
  457. package/templates/studio-bridge-plugin/src/Shared/DiscoveryStateMachine.spec.lua +228 -0
  458. package/templates/studio-bridge-plugin/src/Shared/MessageBuffer.lua +80 -109
  459. package/templates/studio-bridge-plugin/src/Shared/MessageBuffer.spec.lua +116 -0
  460. package/templates/studio-bridge-plugin/src/Shared/StudioBridgeConnection.lua +233 -0
  461. package/templates/studio-bridge-plugin/src/Shared/StudioBridgeConnection.spec.lua +239 -0
  462. package/templates/studio-bridge-plugin/src/Shared/StudioBridgeLogUtils.lua +53 -0
  463. package/templates/studio-bridge-plugin/src/Shared/StudioBridgeLogUtils.spec.lua +27 -0
  464. package/templates/studio-bridge-plugin/src/Shared/StudioBridgeSessionUtils.lua +164 -0
  465. package/templates/studio-bridge-plugin/src/Shared/StudioBridgeSessionUtils.spec.lua +159 -0
  466. package/templates/studio-bridge-plugin/src/StudioBridgePlugin.server.lua +266 -368
  467. package/templates/studio-bridge-plugin/src/Vendor/png.lua +8 -2
  468. package/test/default.project.json +41 -0
  469. package/test/jest.config.lua +3 -0
  470. package/test/scripts/Server/ServerMain.server.lua +10 -0
  471. package/tsconfig.json +1 -0
  472. package/templates/studio-bridge-plugin/src/Shared/Protocol.lua +0 -132
  473. package/templates/studio-bridge-plugin-test/test/actions.test.lua +0 -580
  474. package/templates/studio-bridge-plugin-test/test/discovery.test.lua +0 -622
  475. package/templates/studio-bridge-plugin-test/test/execute-handler.test.lua +0 -517
  476. package/templates/studio-bridge-plugin-test/test/hash-lifecycle.test.lua +0 -814
  477. package/templates/studio-bridge-plugin-test/test/integration.test.lua +0 -1020
  478. package/templates/studio-bridge-plugin-test/test/new-actions.test.lua +0 -339
  479. package/templates/studio-bridge-plugin-test/test/plugin-entry.test.lua +0 -493
  480. package/templates/studio-bridge-plugin-test/test/protocol.test.lua +0 -506
  481. package/templates/studio-bridge-plugin-test/test/roblox-mocks.lua +0 -108
  482. package/templates/studio-bridge-plugin-test/test/test-runner.lua +0 -112
@@ -13,11 +13,18 @@ import type {
13
13
  } from '../../server/web-socket-protocol.js';
14
14
  import type { SessionInfo, SessionContext, InstanceInfo } from '../types.js';
15
15
 
16
+ /**
17
+ * Raised when the host-client protocol changes, so a client can tell it is
18
+ * relaying through an older host. Hosts before this field have none.
19
+ */
20
+ export const HOST_PROTOCOL_VERSION = 2;
21
+
16
22
  export interface HostEnvelope {
17
23
  type: 'host-envelope';
18
24
  requestId: string;
19
25
  targetSessionId: string;
20
26
  action: ServerMessage;
27
+ timeoutMs?: number;
21
28
  }
22
29
 
23
30
  export interface ListSessionsRequest {
@@ -40,6 +47,8 @@ export interface ListSessionsResponse {
40
47
  type: 'list-sessions-response';
41
48
  requestId: string;
42
49
  sessions: SessionInfo[];
50
+ /** Absent from hosts older than HOST_PROTOCOL_VERSION 2. */
51
+ protocolVersion?: number;
43
52
  }
44
53
 
45
54
  export interface ListInstancesResponse {
@@ -76,6 +85,8 @@ export type HostProtocolMessage =
76
85
  // `ServerMessageSchema` is the load-bearing one: it validates the `action`
77
86
  // payload that /client connections forward to plugins. Without it, a buggy
78
87
  // or hostile CLI client could ship malformed actions and crash the plugin.
88
+ // Payloads keep fields they don't list, so a newer client's options reach
89
+ // the plugin through an older host instead of being silently dropped.
79
90
  // Container fields like `result`, `sessions`, `instances`, and `session` are
80
91
  // validated only as objects/arrays — their interior shapes flow through to
81
92
  // callers that already know how to handle the typed contracts.
@@ -90,6 +101,8 @@ const ErrorCodeSchema = z.enum([
90
101
  'SCREENSHOT_FAILED',
91
102
  'SCRIPT_LOAD_ERROR',
92
103
  'SCRIPT_RUNTIME_ERROR',
104
+ 'SCRIPT_TIMEOUT',
105
+ 'RESULT_TOO_LARGE',
93
106
  'BUSY',
94
107
  'SESSION_MISMATCH',
95
108
  'INTERNAL_ERROR',
@@ -102,7 +115,13 @@ const ServerMessageSchema = z.discriminatedUnion('type', [
102
115
  type: z.literal('execute'),
103
116
  sessionId: z.string(),
104
117
  requestId: z.string().optional(),
105
- payload: z.object({ script: z.string() }),
118
+ payload: z
119
+ .object({
120
+ script: z.string(),
121
+ timeoutMs: z.number().optional(),
122
+ args: z.array(z.string()).optional(),
123
+ })
124
+ .loose(),
106
125
  }),
107
126
  z.object({
108
127
  type: z.literal('shutdown'),
@@ -119,67 +138,157 @@ const ServerMessageSchema = z.discriminatedUnion('type', [
119
138
  type: z.literal('captureScreenshot'),
120
139
  sessionId: z.string(),
121
140
  requestId: z.string(),
122
- payload: z.object({
123
- format: z.literal('png').optional(),
124
- }),
141
+ payload: z
142
+ .object({
143
+ format: z.literal('png').optional(),
144
+ })
145
+ .loose(),
125
146
  }),
126
147
  z.object({
127
148
  type: z.literal('queryDataModel'),
128
149
  sessionId: z.string(),
129
150
  requestId: z.string(),
130
- payload: z.object({
131
- path: z.string(),
132
- depth: z.number().optional(),
133
- properties: z.array(z.string()).optional(),
134
- includeAttributes: z.boolean().optional(),
135
- find: z
136
- .object({
137
- name: z.string(),
138
- recursive: z.boolean().optional(),
139
- })
140
- .optional(),
141
- listServices: z.boolean().optional(),
142
- }),
151
+ payload: z
152
+ .object({
153
+ path: z.string(),
154
+ depth: z.number().optional(),
155
+ properties: z.array(z.string()).optional(),
156
+ includeAttributes: z.boolean().optional(),
157
+ find: z
158
+ .object({
159
+ name: z.string(),
160
+ recursive: z.boolean().optional(),
161
+ })
162
+ .optional(),
163
+ listServices: z.boolean().optional(),
164
+ })
165
+ .loose(),
166
+ }),
167
+ z.object({
168
+ type: z.literal('findInstances'),
169
+ sessionId: z.string(),
170
+ requestId: z.string(),
171
+ payload: z
172
+ .object({
173
+ root: z.string().optional(),
174
+ name: z.string().optional(),
175
+ exactName: z.boolean().optional(),
176
+ className: z.string().optional(),
177
+ tag: z.string().optional(),
178
+ limit: z.number().optional(),
179
+ })
180
+ .loose(),
181
+ }),
182
+ z.object({
183
+ type: z.literal('grepScripts'),
184
+ sessionId: z.string(),
185
+ requestId: z.string(),
186
+ payload: z
187
+ .object({
188
+ pattern: z.string(),
189
+ root: z.string().optional(),
190
+ luaPattern: z.boolean().optional(),
191
+ caseSensitive: z.boolean().optional(),
192
+ limit: z.number().optional(),
193
+ })
194
+ .loose(),
195
+ }),
196
+ z.object({
197
+ type: z.literal('exportInstances'),
198
+ sessionId: z.string(),
199
+ requestId: z.string(),
200
+ payload: z.object({ paths: z.array(z.string()) }).loose(),
201
+ }),
202
+ z.object({
203
+ type: z.literal('importInstances'),
204
+ sessionId: z.string(),
205
+ requestId: z.string(),
206
+ payload: z.object({ data: z.string(), parentPath: z.string() }).loose(),
143
207
  }),
144
208
  z.object({
145
209
  type: z.literal('queryLogs'),
146
210
  sessionId: z.string(),
147
211
  requestId: z.string(),
148
- payload: z.object({
149
- count: z.number().optional(),
150
- direction: z.enum(['head', 'tail']).optional(),
151
- levels: z.array(OutputLevelSchema).optional(),
152
- includeInternal: z.boolean().optional(),
153
- }),
212
+ payload: z
213
+ .object({
214
+ count: z.number().optional(),
215
+ direction: z.enum(['head', 'tail']).optional(),
216
+ levels: z.array(OutputLevelSchema).optional(),
217
+ includeInternal: z.boolean().optional(),
218
+ since: z.number().optional(),
219
+ groupRepeats: z.boolean().optional(),
220
+ })
221
+ .loose(),
154
222
  }),
155
223
  z.object({
156
224
  type: z.literal('registerAction'),
157
225
  sessionId: z.string(),
158
226
  requestId: z.string(),
159
- payload: z.object({
160
- name: z.string(),
161
- source: z.string(),
162
- hash: z.string().optional(),
163
- responseType: z.string().optional(),
164
- }),
227
+ payload: z
228
+ .object({
229
+ name: z.string(),
230
+ source: z.string(),
231
+ hash: z.string().optional(),
232
+ responseType: z.string().optional(),
233
+ })
234
+ .loose(),
165
235
  }),
166
236
  z.object({
167
237
  type: z.literal('syncActions'),
168
238
  sessionId: z.string(),
169
239
  requestId: z.string(),
170
- payload: z.object({
171
- actions: z.record(z.string(), z.string()),
172
- }),
240
+ payload: z
241
+ .object({
242
+ actions: z.record(z.string(), z.string()),
243
+ verbose: z.boolean().optional(),
244
+ })
245
+ .loose(),
246
+ }),
247
+ z.object({
248
+ type: z.literal('startPlaytest'),
249
+ sessionId: z.string(),
250
+ requestId: z.string(),
251
+ payload: z
252
+ .object({
253
+ mode: z.enum(['play', 'run']),
254
+ playtestId: z.string(),
255
+ bridgePort: z.number(),
256
+ instanceId: z.string(),
257
+ players: z.number().int().min(1).optional(),
258
+ })
259
+ .loose(),
260
+ }),
261
+ z.object({
262
+ type: z.literal('endPlaytest'),
263
+ sessionId: z.string(),
264
+ requestId: z.string(),
265
+ payload: z.object({}).loose(),
266
+ }),
267
+ z.object({
268
+ type: z.literal('runPlaytestScript'),
269
+ sessionId: z.string(),
270
+ requestId: z.string(),
271
+ payload: z
272
+ .object({
273
+ mode: z.enum(['play', 'run']),
274
+ script: z.string(),
275
+ runnerSource: z.string(),
276
+ timeoutSec: z.number(),
277
+ args: z.array(z.string()).optional(),
278
+ })
279
+ .loose(),
173
280
  }),
174
281
  z.object({
175
282
  type: z.literal('error'),
176
283
  sessionId: z.string(),
177
284
  requestId: z.string().optional(),
178
- payload: z.object({
179
- code: ErrorCodeSchema,
180
- message: z.string(),
181
- details: z.unknown().optional(),
182
- }),
285
+ payload: z
286
+ .object({
287
+ code: ErrorCodeSchema,
288
+ message: z.string(),
289
+ details: z.unknown().optional(),
290
+ })
291
+ .loose(),
183
292
  }),
184
293
  ]);
185
294
 
@@ -191,6 +300,7 @@ const HostProtocolMessageSchema = z.discriminatedUnion('type', [
191
300
  requestId: z.string(),
192
301
  targetSessionId: z.string(),
193
302
  action: ServerMessageSchema,
303
+ timeoutMs: z.number().optional(),
194
304
  }),
195
305
  z.object({
196
306
  type: z.literal('list-sessions'),
@@ -209,6 +319,7 @@ const HostProtocolMessageSchema = z.discriminatedUnion('type', [
209
319
  type: z.literal('list-sessions-response'),
210
320
  requestId: z.string(),
211
321
  sessions: z.array(LooseObjectSchema),
322
+ protocolVersion: z.number().optional(),
212
323
  }),
213
324
  z.object({
214
325
  type: z.literal('list-instances-response'),
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Every plugin registers as `Edit`, since it cannot see a playtest from the
3
+ * edit DataModel. The bridge can: a playtest's server and client connect as
4
+ * sessions of the same instance. Their place is a copy named "Game", so
5
+ * they take the edit session's place name too.
6
+ */
7
+
8
+ import type { SessionInfo, StudioState } from '../types.js';
9
+
10
+ export function annotateInstanceState(sessions: SessionInfo[]): SessionInfo[] {
11
+ const byInstance = new Map<string, SessionInfo[]>();
12
+ for (const session of sessions) {
13
+ const group = byInstance.get(session.instanceId) ?? [];
14
+ group.push(session);
15
+ byInstance.set(session.instanceId, group);
16
+ }
17
+
18
+ return sessions.map((session) => {
19
+ const group = byInstance.get(session.instanceId)!;
20
+ const hasServer = group.some((s) => s.context === 'server');
21
+ const hasClient = group.some((s) => s.context === 'client');
22
+ const edit = group.find((s) => s.context === 'edit');
23
+
24
+ const state: StudioState = hasServer
25
+ ? hasClient
26
+ ? 'Play'
27
+ : 'Run'
28
+ : session.state;
29
+ const placeName =
30
+ session.context !== 'edit' && edit ? edit.placeName : session.placeName;
31
+
32
+ return { ...session, state, placeName };
33
+ });
34
+ }
@@ -6,6 +6,7 @@
6
6
 
7
7
  import { EventEmitter } from 'events';
8
8
  import { WebSocket } from 'ws';
9
+ import { MAX_MESSAGE_BYTES } from '../../server/web-socket-protocol.js';
9
10
 
10
11
  export interface TransportClientOptions {
11
12
  /** Maximum number of reconnection attempts. Default: 10. */
@@ -98,7 +99,7 @@ export class TransportClient extends EventEmitter {
98
99
 
99
100
  private _connectInternalAsync(): Promise<void> {
100
101
  return new Promise<void>((resolve, reject) => {
101
- const ws = new WebSocket(this._url);
102
+ const ws = new WebSocket(this._url, { maxPayload: MAX_MESSAGE_BYTES });
102
103
  this._ws = ws;
103
104
 
104
105
  const onOpen = () => {
@@ -13,6 +13,7 @@ import {
13
13
  } from 'http';
14
14
  import type { Socket } from 'net';
15
15
  import { WebSocketServer, WebSocket } from 'ws';
16
+ import { MAX_MESSAGE_BYTES } from '../../server/web-socket-protocol.js';
16
17
  import { URL } from 'url';
17
18
 
18
19
  export interface TransportServerOptions {
@@ -67,7 +68,10 @@ export class TransportServer {
67
68
  });
68
69
  });
69
70
 
70
- this._wss = new WebSocketServer({ noServer: true });
71
+ this._wss = new WebSocketServer({
72
+ noServer: true,
73
+ maxPayload: MAX_MESSAGE_BYTES,
74
+ });
71
75
 
72
76
  this._httpServer.on('upgrade', (request, socket, head) => {
73
77
  const pathname = this._parsePath(request);
@@ -12,6 +12,7 @@ import type {
12
12
  DataModelInstance,
13
13
  OutputLevel,
14
14
  SerializedReturnValue,
15
+ PlaytestMode,
15
16
  } from '../server/web-socket-protocol.js';
16
17
 
17
18
  // Re-export protocol types used in the public API
@@ -21,6 +22,7 @@ export type {
21
22
  DataModelInstance,
22
23
  OutputLevel,
23
24
  SerializedReturnValue,
25
+ PlaytestMode,
24
26
  };
25
27
 
26
28
  export type SessionContext = 'edit' | 'client' | 'server';
@@ -35,6 +37,10 @@ export interface SessionInfo {
35
37
  capabilities: Capability[];
36
38
  connectedAt: Date;
37
39
  origin: SessionOrigin;
40
+ /** Set on sessions of a Studio that `process run` launched. */
41
+ launchId?: string;
42
+ /** The player of a multiplayer test client session. */
43
+ playerName?: string;
38
44
  context: SessionContext;
39
45
  instanceId: string;
40
46
  placeId: number;
@@ -54,10 +60,11 @@ export interface ExecResult {
54
60
  success: boolean;
55
61
  output: Array<{ level: OutputLevel; body: string }>;
56
62
  error?: string;
63
+ /** Where a runtime error was thrown. */
64
+ traceback?: string;
57
65
  /**
58
66
  * Everything the script returned, in order. Absent when the plugin reported
59
- * no return channel at all (older plugin build, or a run that never reached
60
- * a return) — distinct from `[]`, which means it returned nothing.
67
+ * no return channel at all (a run that never reached a return) — distinct from `[]`, which means it returned nothing.
61
68
  */
62
69
  returnValues?: SerializedReturnValue[];
63
70
  }
@@ -67,6 +74,10 @@ export interface StateResult {
67
74
  placeId: number;
68
75
  placeName: string;
69
76
  gameId: number;
77
+ /** The camera's viewport in pixels. Absent without a camera. */
78
+ viewportSize?: [number, number];
79
+ /** Studio's version. Absent from older plugins. */
80
+ studioVersion?: string;
70
81
  }
71
82
 
72
83
  export interface ScreenshotResult {
@@ -80,6 +91,10 @@ export interface LogEntry {
80
91
  level: OutputLevel;
81
92
  body: string;
82
93
  timestamp: number;
94
+ /** When grouped: how many identical entries in a row this stands for. */
95
+ repeats?: number;
96
+ /** When grouped: when the last of the repeats was logged. */
97
+ lastTimestamp?: number;
83
98
  }
84
99
 
85
100
  export interface LogsResult {
@@ -92,11 +107,25 @@ export interface DataModelResult {
92
107
  instance: DataModelInstance;
93
108
  }
94
109
 
110
+ export interface ExportInstancesResult {
111
+ /** The binary model (.rbxm), base64-encoded. */
112
+ data: string;
113
+ paths: string[];
114
+ }
115
+
116
+ export interface ImportInstancesResult {
117
+ paths: string[];
118
+ }
119
+
95
120
  export interface LogOptions {
96
121
  count?: number;
97
122
  direction?: 'head' | 'tail';
98
123
  levels?: OutputLevel[];
99
124
  includeInternal?: boolean;
125
+ /** Only entries logged at or after this time, in epoch seconds. */
126
+ since?: number;
127
+ /** Collapse identical consecutive entries, before `count` applies. */
128
+ groupRepeats?: boolean;
100
129
  }
101
130
 
102
131
  export interface QueryDataModelOptions {
@@ -108,6 +137,22 @@ export interface QueryDataModelOptions {
108
137
  listServices?: boolean;
109
138
  }
110
139
 
140
+ export interface PlaytestEndResult {
141
+ playtestId: string;
142
+ /** False when StudioTestService refused to start the playtest. */
143
+ success: boolean;
144
+ error?: string;
145
+ }
146
+
147
+ export interface EndPlaytestResult {
148
+ /** Absent when the playtest was not started by studio-bridge. */
149
+ playtestId?: string;
150
+ /** The mode the playtest ran in. Absent from older plugins. */
151
+ mode?: PlaytestMode;
152
+ /** How many players a multiplayer test started with. */
153
+ players?: number;
154
+ }
155
+
111
156
  export interface LogFollowOptions {
112
157
  levels?: OutputLevel[];
113
158
  }
@@ -6,8 +6,14 @@
6
6
  import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
7
7
  import { buildYargsCommand } from './cli-command-adapter.js';
8
8
  import { defineCommand } from '../../commands/framework/define-command.js';
9
+ import { arg } from '../../commands/framework/arg-builder.js';
9
10
  import type { CliLifecycleProvider } from './cli-command-adapter.js';
10
11
 
12
+ vi.mock('../cli-output-context.js', () => ({
13
+ getWarnings: () => [],
14
+ warnIfPluginStaleAsync: vi.fn().mockResolvedValue(undefined),
15
+ }));
16
+
11
17
  vi.mock('fs', async (importOriginal) => {
12
18
  const actual = await importOriginal<typeof import('fs')>();
13
19
  return {
@@ -29,6 +35,7 @@ function createMockConnection() {
29
35
  resolveSessionAsync: vi.fn().mockResolvedValue(session),
30
36
  disconnectAsync: vi.fn().mockResolvedValue(undefined),
31
37
  listSessions: vi.fn().mockReturnValue([]),
38
+ listInstances: vi.fn().mockReturnValue([]),
32
39
  } as any,
33
40
  session,
34
41
  };
@@ -301,6 +308,27 @@ describe('handler — standalone scope', () => {
301
308
  expect(lifecycle.connectAsync).not.toHaveBeenCalled();
302
309
  expect(output[0]).toBe('done');
303
310
  });
311
+
312
+ it('hands everything after -- to a passthrough arg as strings', async () => {
313
+ const handler = vi.fn(async () => ({ summary: 'done' }));
314
+ const cmd = defineCommand({
315
+ group: null,
316
+ name: 'standalone',
317
+ description: 'Standalone test',
318
+ category: 'infrastructure',
319
+ safety: 'none',
320
+ scope: 'standalone',
321
+ args: { scriptArgs: arg.passthrough({ description: 'Script args' }) },
322
+ handler,
323
+ });
324
+ const module = buildYargsCommand(cmd);
325
+
326
+ await captureOutput(async () => {
327
+ await (module.handler as any)({ format: 'text', '--': ['Player1', 3] });
328
+ });
329
+
330
+ expect(handler).toHaveBeenCalledWith({ scriptArgs: ['Player1', '3'] });
331
+ });
304
332
  });
305
333
 
306
334
  describe('handler — connection lifecycle', () => {