@quenty/studio-bridge 0.21.0 → 0.22.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 (491) hide show
  1. package/CHANGELOG.md +12 -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/linux/linux-studio-launcher.d.ts.map +1 -1
  277. package/dist/src/linux/linux-studio-launcher.js +10 -0
  278. package/dist/src/linux/linux-studio-launcher.js.map +1 -1
  279. package/dist/src/linux/linux-studio-launcher.test.d.ts +2 -0
  280. package/dist/src/linux/linux-studio-launcher.test.d.ts.map +1 -0
  281. package/dist/src/linux/linux-studio-launcher.test.js +68 -0
  282. package/dist/src/linux/linux-studio-launcher.test.js.map +1 -0
  283. package/dist/src/plugin/persistent-plugin-installer.d.ts.map +1 -1
  284. package/dist/src/plugin/persistent-plugin-installer.js +2 -1
  285. package/dist/src/plugin/persistent-plugin-installer.js.map +1 -1
  286. package/dist/src/plugin/persistent-plugin-installer.test.js +3 -0
  287. package/dist/src/plugin/persistent-plugin-installer.test.js.map +1 -1
  288. package/dist/src/plugin/plugin-build-version.d.ts +7 -0
  289. package/dist/src/plugin/plugin-build-version.d.ts.map +1 -0
  290. package/dist/src/plugin/plugin-build-version.js +42 -0
  291. package/dist/src/plugin/plugin-build-version.js.map +1 -0
  292. package/dist/src/plugin/plugin-build-version.test.d.ts +2 -0
  293. package/dist/src/plugin/plugin-build-version.test.d.ts.map +1 -0
  294. package/dist/src/plugin/plugin-build-version.test.js +41 -0
  295. package/dist/src/plugin/plugin-build-version.test.js.map +1 -0
  296. package/dist/src/plugin/plugin-injector.d.ts.map +1 -1
  297. package/dist/src/plugin/plugin-injector.js +7 -1
  298. package/dist/src/plugin/plugin-injector.js.map +1 -1
  299. package/dist/src/process/studio-process-closer.d.ts +35 -0
  300. package/dist/src/process/studio-process-closer.d.ts.map +1 -0
  301. package/dist/src/process/studio-process-closer.js +129 -0
  302. package/dist/src/process/studio-process-closer.js.map +1 -0
  303. package/dist/src/process/studio-process-closer.test.d.ts +2 -0
  304. package/dist/src/process/studio-process-closer.test.d.ts.map +1 -0
  305. package/dist/src/process/studio-process-closer.test.js +80 -0
  306. package/dist/src/process/studio-process-closer.test.js.map +1 -0
  307. package/dist/src/process/studio-settings.d.ts +14 -0
  308. package/dist/src/process/studio-settings.d.ts.map +1 -0
  309. package/dist/src/process/studio-settings.js +50 -0
  310. package/dist/src/process/studio-settings.js.map +1 -0
  311. package/dist/src/process/studio-settings.test.d.ts +2 -0
  312. package/dist/src/process/studio-settings.test.d.ts.map +1 -0
  313. package/dist/src/process/studio-settings.test.js +16 -0
  314. package/dist/src/process/studio-settings.test.js.map +1 -0
  315. package/dist/src/process/studio-window-state.d.ts +13 -0
  316. package/dist/src/process/studio-window-state.d.ts.map +1 -0
  317. package/dist/src/process/studio-window-state.js +48 -0
  318. package/dist/src/process/studio-window-state.js.map +1 -0
  319. package/dist/src/server/studio-bridge-server.d.ts +3 -1
  320. package/dist/src/server/studio-bridge-server.d.ts.map +1 -1
  321. package/dist/src/server/studio-bridge-server.js +12 -4
  322. package/dist/src/server/studio-bridge-server.js.map +1 -1
  323. package/dist/src/server/web-socket-protocol.d.ts +173 -6
  324. package/dist/src/server/web-socket-protocol.d.ts.map +1 -1
  325. package/dist/src/server/web-socket-protocol.js +244 -1
  326. package/dist/src/server/web-socket-protocol.js.map +1 -1
  327. package/dist/src/server/web-socket-protocol.test.js +48 -0
  328. package/dist/src/server/web-socket-protocol.test.js.map +1 -1
  329. package/dist/src/test/e2e/persistent-session.test.js +121 -0
  330. package/dist/src/test/e2e/persistent-session.test.js.map +1 -1
  331. package/dist/src/test/e2e/split-server.test.d.ts +3 -5
  332. package/dist/src/test/e2e/split-server.test.d.ts.map +1 -1
  333. package/dist/src/test/e2e/split-server.test.js +3 -5
  334. package/dist/src/test/e2e/split-server.test.js.map +1 -1
  335. package/dist/tsconfig.tsbuildinfo +1 -1
  336. package/docker/Dockerfile +3 -0
  337. package/package.json +8 -6
  338. package/src/bridge/bridge-connection.test.ts +126 -0
  339. package/src/bridge/bridge-connection.ts +217 -22
  340. package/src/bridge/bridge-session.test.ts +6 -4
  341. package/src/bridge/bridge-session.ts +273 -28
  342. package/src/bridge/index.ts +3 -0
  343. package/src/bridge/internal/bridge-client.test.ts +23 -0
  344. package/src/bridge/internal/bridge-client.ts +25 -7
  345. package/src/bridge/internal/bridge-host.test.ts +38 -0
  346. package/src/bridge/internal/bridge-host.ts +47 -0
  347. package/src/bridge/internal/hand-off.ts +4 -1
  348. package/src/bridge/internal/host-protocol.test.ts +15 -0
  349. package/src/bridge/internal/host-protocol.ts +148 -37
  350. package/src/bridge/internal/instance-state.ts +34 -0
  351. package/src/bridge/internal/transport-client.ts +2 -1
  352. package/src/bridge/internal/transport-server.ts +5 -1
  353. package/src/bridge/types.ts +47 -2
  354. package/src/cli/adapters/cli-command-adapter-handler.test.ts +28 -0
  355. package/src/cli/adapters/cli-command-adapter.ts +150 -18
  356. package/src/cli/adapters/group-builder.test.ts +34 -2
  357. package/src/cli/adapters/group-builder.ts +52 -20
  358. package/src/cli/adapters/help-formatter.test.ts +1 -1
  359. package/src/cli/adapters/help-formatter.ts +4 -3
  360. package/src/cli/adapters/playtest-edit-guard.test.ts +54 -0
  361. package/src/cli/args/global-args.ts +1 -1
  362. package/src/cli/cli-output-context.test.ts +55 -0
  363. package/src/cli/cli-output-context.ts +50 -0
  364. package/src/cli/cli.ts +49 -17
  365. package/src/cli/managed-studio-run.test.ts +71 -0
  366. package/src/cli/managed-studio-run.ts +135 -0
  367. package/src/cli/resolve-session.test.ts +1 -1
  368. package/src/cli/resolve-session.ts +1 -1
  369. package/src/cli/script-executor.ts +99 -51
  370. package/src/commands/console/exec/exec.test.ts +96 -3
  371. package/src/commands/console/exec/exec.ts +59 -6
  372. package/src/commands/console/exec/execute.lua +356 -240
  373. package/src/commands/console/exec/execute.spec.lua +286 -0
  374. package/src/commands/console/logs/logs.test.ts +76 -4
  375. package/src/commands/console/logs/logs.ts +132 -17
  376. package/src/commands/console/logs/query-logs.lua +85 -52
  377. package/src/commands/console/logs/query-logs.spec.lua +132 -0
  378. package/src/commands/explorer/export/export-instances.lua +108 -0
  379. package/src/commands/explorer/export/export-instances.spec.lua +87 -0
  380. package/src/commands/explorer/export/export.test.ts +27 -0
  381. package/src/commands/explorer/export/export.ts +60 -0
  382. package/src/commands/explorer/find/find-instances.lua +174 -0
  383. package/src/commands/explorer/find/find-instances.spec.lua +122 -0
  384. package/src/commands/explorer/find/find.test.ts +53 -0
  385. package/src/commands/explorer/find/find.ts +113 -0
  386. package/src/commands/explorer/grep/grep-scripts.lua +214 -0
  387. package/src/commands/explorer/grep/grep-scripts.spec.lua +130 -0
  388. package/src/commands/explorer/grep/grep.test.ts +45 -0
  389. package/src/commands/explorer/grep/grep.ts +93 -0
  390. package/src/commands/explorer/import/import-instances.lua +106 -0
  391. package/src/commands/explorer/import/import-instances.spec.lua +84 -0
  392. package/src/commands/explorer/import/import.test.ts +60 -0
  393. package/src/commands/explorer/import/import.ts +66 -0
  394. package/src/commands/explorer/query/query-data-model.lua +124 -152
  395. package/src/commands/explorer/query/query-data-model.spec.lua +150 -0
  396. package/src/commands/formatters.test.ts +7 -1
  397. package/src/commands/framework/action-loader.test.ts +28 -0
  398. package/src/commands/framework/action-loader.ts +10 -2
  399. package/src/commands/framework/arg-builder.ts +26 -3
  400. package/src/commands/framework/define-command.ts +32 -3
  401. package/src/commands/framework/index.ts +1 -0
  402. package/src/commands/index.ts +50 -0
  403. package/src/commands/linux/inject-credentials/inject-credentials.ts +1 -3
  404. package/src/commands/linux/setup/setup.ts +1 -3
  405. package/src/commands/linux/status/status.ts +105 -98
  406. package/src/commands/playtest/player/add/add.ts +85 -0
  407. package/src/commands/playtest/player/list/list.ts +57 -0
  408. package/src/commands/playtest/player/playtest-players.test.ts +146 -0
  409. package/src/commands/playtest/player/playtest-players.ts +270 -0
  410. package/src/commands/playtest/player/remove/remove.ts +78 -0
  411. package/src/commands/playtest/playtest-sessions.test.ts +143 -0
  412. package/src/commands/playtest/playtest-sessions.ts +417 -0
  413. package/src/commands/playtest/restart/restart.ts +199 -0
  414. package/src/commands/playtest/run/playtest-runner.luau +264 -0
  415. package/src/commands/playtest/run/playtest-runner.spec.lua +71 -0
  416. package/src/commands/playtest/run/run-playtest-script.lua +139 -0
  417. package/src/commands/playtest/run/run-playtest-script.spec.lua +43 -0
  418. package/src/commands/playtest/run/run.ts +239 -0
  419. package/src/commands/playtest/start/start-playtest.lua +108 -0
  420. package/src/commands/playtest/start/start.ts +138 -0
  421. package/src/commands/playtest/stop/end-playtest.lua +47 -0
  422. package/src/commands/playtest/stop/stop.ts +51 -0
  423. package/src/commands/process/close/close.test.ts +250 -0
  424. package/src/commands/process/close/close.ts +183 -17
  425. package/src/commands/process/info/info.test.ts +198 -44
  426. package/src/commands/process/info/info.ts +204 -15
  427. package/src/commands/process/info/query-state.lua +42 -29
  428. package/src/commands/process/info/query-state.spec.lua +39 -0
  429. package/src/commands/process/launch/launch.test.ts +138 -21
  430. package/src/commands/process/launch/launch.ts +69 -9
  431. package/src/commands/process/list/list.test.ts +1 -0
  432. package/src/commands/process/list/list.ts +14 -6
  433. package/src/commands/process/run/run.ts +26 -5
  434. package/src/commands/serve/serve.test.ts +17 -2
  435. package/src/commands/serve/serve.ts +25 -6
  436. package/src/commands/viewport/screenshot/capture-screenshot.lua +175 -182
  437. package/src/commands/viewport/screenshot/capture-screenshot.spec.lua +129 -0
  438. package/src/commands/viewport/screenshot/screenshot.test.ts +7 -10
  439. package/src/commands/viewport/screenshot/screenshot.ts +6 -1
  440. package/src/deploy/deploy-places.test.ts +127 -0
  441. package/src/deploy/deploy-places.ts +229 -0
  442. package/src/index.ts +11 -0
  443. package/src/linux/linux-studio-launcher.test.ts +89 -0
  444. package/src/linux/linux-studio-launcher.ts +11 -0
  445. package/src/plugin/persistent-plugin-installer.test.ts +4 -0
  446. package/src/plugin/persistent-plugin-installer.ts +2 -1
  447. package/src/plugin/plugin-build-version.test.ts +55 -0
  448. package/src/plugin/plugin-build-version.ts +53 -0
  449. package/src/plugin/plugin-injector.ts +7 -1
  450. package/src/process/studio-process-closer.test.ts +107 -0
  451. package/src/process/studio-process-closer.ts +187 -0
  452. package/src/process/studio-settings.test.ts +18 -0
  453. package/src/process/studio-settings.ts +61 -0
  454. package/src/process/studio-window-state.ts +65 -0
  455. package/src/server/studio-bridge-server.ts +15 -4
  456. package/src/server/web-socket-protocol.test.ts +55 -0
  457. package/src/server/web-socket-protocol.ts +468 -8
  458. package/src/test/e2e/persistent-session.test.ts +137 -0
  459. package/src/test/e2e/split-server.test.ts +3 -5
  460. package/templates/studio-bridge-plugin/default.project.json +3 -0
  461. package/templates/studio-bridge-plugin/src/Shared/ActionRouter.lua +208 -159
  462. package/templates/studio-bridge-plugin/src/Shared/ActionRouter.spec.lua +418 -0
  463. package/templates/studio-bridge-plugin/src/Shared/BuiltInActions.lua +94 -0
  464. package/templates/studio-bridge-plugin/src/Shared/BuiltInActions.spec.lua +166 -0
  465. package/templates/studio-bridge-plugin/src/Shared/DiscoveryStateMachine.lua +118 -137
  466. package/templates/studio-bridge-plugin/src/Shared/DiscoveryStateMachine.spec.lua +228 -0
  467. package/templates/studio-bridge-plugin/src/Shared/MessageBuffer.lua +80 -109
  468. package/templates/studio-bridge-plugin/src/Shared/MessageBuffer.spec.lua +116 -0
  469. package/templates/studio-bridge-plugin/src/Shared/StudioBridgeConnection.lua +233 -0
  470. package/templates/studio-bridge-plugin/src/Shared/StudioBridgeConnection.spec.lua +239 -0
  471. package/templates/studio-bridge-plugin/src/Shared/StudioBridgeLogUtils.lua +53 -0
  472. package/templates/studio-bridge-plugin/src/Shared/StudioBridgeLogUtils.spec.lua +27 -0
  473. package/templates/studio-bridge-plugin/src/Shared/StudioBridgeSessionUtils.lua +164 -0
  474. package/templates/studio-bridge-plugin/src/Shared/StudioBridgeSessionUtils.spec.lua +159 -0
  475. package/templates/studio-bridge-plugin/src/StudioBridgePlugin.server.lua +266 -368
  476. package/templates/studio-bridge-plugin/src/Vendor/png.lua +8 -2
  477. package/test/default.project.json +41 -0
  478. package/test/jest.config.lua +3 -0
  479. package/test/scripts/Server/ServerMain.server.lua +10 -0
  480. package/tsconfig.json +1 -0
  481. package/templates/studio-bridge-plugin/src/Shared/Protocol.lua +0 -132
  482. package/templates/studio-bridge-plugin-test/test/actions.test.lua +0 -580
  483. package/templates/studio-bridge-plugin-test/test/discovery.test.lua +0 -622
  484. package/templates/studio-bridge-plugin-test/test/execute-handler.test.lua +0 -517
  485. package/templates/studio-bridge-plugin-test/test/hash-lifecycle.test.lua +0 -814
  486. package/templates/studio-bridge-plugin-test/test/integration.test.lua +0 -1020
  487. package/templates/studio-bridge-plugin-test/test/new-actions.test.lua +0 -339
  488. package/templates/studio-bridge-plugin-test/test/plugin-entry.test.lua +0 -493
  489. package/templates/studio-bridge-plugin-test/test/protocol.test.lua +0 -506
  490. package/templates/studio-bridge-plugin-test/test/roblox-mocks.lua +0 -108
  491. package/templates/studio-bridge-plugin-test/test/test-runner.lua +0 -112
@@ -0,0 +1,137 @@
1
+ /**
2
+ * `playtest run` — start a playtest, execute Luau inside it, then stop it.
3
+ *
4
+ * The code runs in the playtest's server by default, or its client with
5
+ * `--context client`. Its output and return values come back the same way as
6
+ * `console exec`.
7
+ *
8
+ * In the server, the edit session plants a runner script in the playtest
9
+ * (playtest-runner.luau), so this works even when Studio does not load user
10
+ * plugins into playtests. The client has no such path: it needs the
11
+ * playtest's client session, so it needs that Studio setting on.
12
+ */
13
+ import * as fs from 'fs/promises';
14
+ import { resolvePackagePath } from '@quenty/nevermore-template-helpers';
15
+ import { defineCommand } from '../../framework/define-command.js';
16
+ import { arg } from '../../framework/arg-builder.js';
17
+ import { resolveScriptContentAsync } from '../../../cli/resolve-script-content.js';
18
+ import { execHandlerAsync, formatExecText, } from '../../console/exec/exec.js';
19
+ import { endPlaytestAsync, getPlaytestContexts, startPlaytestAsync, } from '../playtest-sessions.js';
20
+ /** Matches `console exec`'s default execution timeout. */
21
+ const DEFAULT_TIMEOUT_MS = 120_000;
22
+ export async function playtestRunHandlerAsync(connection, options) {
23
+ if (!getPlaytestContexts(options.mode).includes(options.context)) {
24
+ throw new Error(`A ${options.mode} mode playtest has no ${options.context} session to run code in`);
25
+ }
26
+ const editSession = await connection.resolveSessionAsync(options.target, 'edit');
27
+ if (options.context === 'server') {
28
+ return runWithPlantedRunnerAsync(editSession, options);
29
+ }
30
+ const playtest = await startPlaytestAsync(connection, editSession, options.mode);
31
+ let result;
32
+ try {
33
+ const session = playtest.sessions[options.context];
34
+ if (!session) {
35
+ throw new Error(`Playtest has no ${options.context} session`);
36
+ }
37
+ result = {
38
+ ...(await execHandlerAsync(session, {
39
+ scriptContent: options.scriptContent,
40
+ timeout: options.timeout,
41
+ args: options.args,
42
+ })),
43
+ playtestId: playtest.playtestId,
44
+ };
45
+ }
46
+ catch (err) {
47
+ await tryEndPlaytestAsync(connection, playtest.sessions.server);
48
+ throw err;
49
+ }
50
+ // A playtest left running keeps the script's result worth reporting
51
+ const stopError = await tryEndPlaytestAsync(connection, playtest.sessions.server);
52
+ return stopError ? { ...result, stopError } : result;
53
+ }
54
+ async function runWithPlantedRunnerAsync(editSession, options) {
55
+ const runnerSource = await fs.readFile(resolvePackagePath(import.meta.url, 'src', 'commands', 'playtest', 'run', 'playtest-runner.luau'), 'utf-8');
56
+ const result = await editSession.runPlaytestScriptAsync({
57
+ mode: options.mode,
58
+ script: options.scriptContent,
59
+ runnerSource,
60
+ timeoutSec: (options.timeout ?? DEFAULT_TIMEOUT_MS) / 1000,
61
+ args: options.args,
62
+ });
63
+ return toCommandResult(result);
64
+ }
65
+ /** Shapes a bridge ExecResult the way `console exec` reports it. */
66
+ function toCommandResult(result) {
67
+ return {
68
+ success: result.success,
69
+ output: result.output.map((entry) => entry.body),
70
+ error: result.error,
71
+ returnValues: result.returnValues,
72
+ summary: result.success
73
+ ? 'Script executed successfully'
74
+ : `Script failed: ${result.error}`,
75
+ };
76
+ }
77
+ /** Ends the playtest, returning why it could not instead of throwing. */
78
+ async function tryEndPlaytestAsync(connection, serverSession) {
79
+ // The script may have ended the playtest itself
80
+ if (!serverSession?.isConnected) {
81
+ return undefined;
82
+ }
83
+ try {
84
+ await endPlaytestAsync(connection, serverSession);
85
+ return undefined;
86
+ }
87
+ catch (err) {
88
+ return err instanceof Error ? err.message : String(err);
89
+ }
90
+ }
91
+ export const playtestRunCommand = defineCommand({
92
+ group: 'playtest',
93
+ name: 'run',
94
+ description: 'Start a playtest, execute Luau in it, then stop it (--context picks server or client)',
95
+ category: 'execution',
96
+ safety: 'mutate',
97
+ scope: 'connection',
98
+ args: {
99
+ code: arg.positional({
100
+ description: 'Inline Luau code to execute',
101
+ required: false,
102
+ }),
103
+ file: arg.option({
104
+ description: 'Path to a Luau script file to execute',
105
+ alias: 'f',
106
+ }),
107
+ mode: arg.option({
108
+ description: 'play runs a server and a client with a player, run runs only the server',
109
+ choices: ['play', 'run'],
110
+ default: 'play',
111
+ }),
112
+ timeout: arg.option({
113
+ description: 'Execution timeout in milliseconds',
114
+ type: 'number',
115
+ }),
116
+ scriptArgs: arg.passthrough({
117
+ description: 'Arguments after --, passed to the script as ... (all strings)',
118
+ }),
119
+ },
120
+ cli: {
121
+ format: (result) => result.stopError
122
+ ? `${formatExecText(result)}\nPlaytest is still running: ${result.stopError}`
123
+ : formatExecText(result),
124
+ },
125
+ handler: async (connection, args, targeting) => {
126
+ const { scriptContent } = await resolveScriptContentAsync(args);
127
+ return playtestRunHandlerAsync(connection, {
128
+ scriptContent,
129
+ mode: args.mode ?? 'play',
130
+ context: targeting.context ?? 'server',
131
+ target: targeting.target,
132
+ timeout: args.timeout,
133
+ args: args.scriptArgs,
134
+ });
135
+ },
136
+ });
137
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../../../src/commands/playtest/run/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * `playtest start` — start a StudioTestService playtest and leave it running.
3
+ *
4
+ * Resolves once the playtest's sessions connect, so the next command can
5
+ * target them with `--context server` or `--context client`.
6
+ */
7
+ import type { BridgeConnection, PlaytestMode, SessionContext } from '../../../bridge/index.js';
8
+ import { type StartedPlaytest } from '../playtest-sessions.js';
9
+ export interface PlaytestStartOptions {
10
+ mode: PlaytestMode;
11
+ /** Starts a multiplayer test with this many players. */
12
+ players?: number;
13
+ target?: string;
14
+ }
15
+ export interface PlaytestStartResult {
16
+ playtestId: string;
17
+ mode: PlaytestMode;
18
+ /** How many players a multiplayer test started with. */
19
+ playerCount?: number;
20
+ sessions: Array<{
21
+ sessionId: string;
22
+ context: SessionContext;
23
+ playerName?: string;
24
+ }>;
25
+ summary: string;
26
+ }
27
+ interface PlaytestStartArgs {
28
+ mode?: PlaytestMode;
29
+ players?: number;
30
+ }
31
+ export declare function playtestStartHandlerAsync(connection: BridgeConnection, options: PlaytestStartOptions): Promise<PlaytestStartResult>;
32
+ /** `play mode`, `run mode`, or `3 players` for a multiplayer test. */
33
+ export declare function describePlaytest(playtest: {
34
+ mode: PlaytestMode;
35
+ players?: number;
36
+ }): string;
37
+ /** Report a started playtest and the sessions it opened. */
38
+ export declare function toPlaytestStartResult(playtest: StartedPlaytest, summary: string): PlaytestStartResult;
39
+ export declare function formatPlaytestStartText(result: PlaytestStartResult): string;
40
+ export declare const playtestStartCommand: import("../../framework/define-command.js").CommandDefinition<PlaytestStartArgs, PlaytestStartResult>;
41
+ export {};
42
+ //# sourceMappingURL=start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../../../src/commands/playtest/start/start.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACf,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,YAAY,CAAC;IACnB,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,YAAY,CAAC;IACnB,wDAAwD;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,KAAK,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,cAAc,CAAC;QACxB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;IACH,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,iBAAiB;IACzB,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,yBAAyB,CAC7C,UAAU,EAAE,gBAAgB,EAC5B,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,mBAAmB,CAAC,CAgB9B;AAED,sEAAsE;AACtE,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE;IACzC,IAAI,EAAE,YAAY,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,MAAM,CAIT;AAED,4DAA4D;AAC5D,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,MAAM,GACd,mBAAmB,CAcrB;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,CAO3E;AAED,eAAO,MAAM,oBAAoB,uGAiC/B,CAAC"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * `playtest start` — start a StudioTestService playtest and leave it running.
3
+ *
4
+ * Resolves once the playtest's sessions connect, so the next command can
5
+ * target them with `--context server` or `--context client`.
6
+ */
7
+ import { defineCommand } from '../../framework/define-command.js';
8
+ import { arg } from '../../framework/arg-builder.js';
9
+ import { startPlaytestAsync, } from '../playtest-sessions.js';
10
+ export async function playtestStartHandlerAsync(connection, options) {
11
+ const editSession = await connection.resolveSessionAsync(options.target, 'edit');
12
+ const playtest = await startPlaytestAsync(connection, editSession, options.mode, options.players);
13
+ return toPlaytestStartResult(playtest, `Playtest started (${describePlaytest(playtest)})`);
14
+ }
15
+ /** `play mode`, `run mode`, or `3 players` for a multiplayer test. */
16
+ export function describePlaytest(playtest) {
17
+ return playtest.players !== undefined
18
+ ? `${playtest.players} player${playtest.players === 1 ? '' : 's'}`
19
+ : `${playtest.mode} mode`;
20
+ }
21
+ /** Report a started playtest and the sessions it opened. */
22
+ export function toPlaytestStartResult(playtest, summary) {
23
+ return {
24
+ playtestId: playtest.playtestId,
25
+ mode: playtest.mode,
26
+ playerCount: playtest.players,
27
+ sessions: [playtest.sessions.server, ...playtest.clients]
28
+ .filter((session) => session !== undefined)
29
+ .map((session) => ({
30
+ sessionId: session.info.sessionId,
31
+ context: session.context,
32
+ playerName: session.info.playerName,
33
+ })),
34
+ summary,
35
+ };
36
+ }
37
+ export function formatPlaytestStartText(result) {
38
+ return [
39
+ result.summary,
40
+ ...result.sessions.map((session) => ` ${session.context.padEnd(7)}${session.sessionId}`),
41
+ ].join('\n');
42
+ }
43
+ export const playtestStartCommand = defineCommand({
44
+ group: 'playtest',
45
+ name: 'start',
46
+ description: 'Start a playtest and leave it running (--target picks the edit session)',
47
+ category: 'execution',
48
+ safety: 'mutate',
49
+ scope: 'connection',
50
+ args: {
51
+ mode: arg.option({
52
+ description: 'play runs a server and a client with a player, run runs only the server',
53
+ choices: ['play', 'run'],
54
+ default: 'play',
55
+ }),
56
+ players: arg.option({
57
+ description: 'Start a multiplayer test: a server and a client per player, each in its own Studio window',
58
+ type: 'number',
59
+ }),
60
+ },
61
+ cli: {
62
+ format: formatPlaytestStartText,
63
+ },
64
+ handler: async (connection, args, targeting) => playtestStartHandlerAsync(connection, {
65
+ mode: args.mode ?? 'play',
66
+ players: args.players,
67
+ target: targeting.target,
68
+ }),
69
+ });
70
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../../../../src/commands/playtest/start/start.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * `playtest stop` — end a running playtest from its server session.
3
+ */
4
+ import type { BridgeConnection } from '../../../bridge/index.js';
5
+ export interface PlaytestStopOptions {
6
+ target?: string;
7
+ }
8
+ export interface PlaytestStopResult {
9
+ /** Absent when the playtest was not started by studio-bridge. */
10
+ playtestId?: string;
11
+ summary: string;
12
+ }
13
+ export declare function playtestStopHandlerAsync(connection: BridgeConnection, options?: PlaytestStopOptions): Promise<PlaytestStopResult>;
14
+ export declare const playtestStopCommand: import("../../framework/define-command.js").CommandDefinition<Record<string, never>, PlaytestStopResult>;
15
+ //# sourceMappingURL=stop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../../../../src/commands/playtest/stop/stop.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAMjE,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,wBAAwB,CAC5C,UAAU,EAAE,gBAAgB,EAC5B,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,kBAAkB,CAAC,CAW7B;AAED,eAAO,MAAM,mBAAmB,0GAa9B,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * `playtest stop` — end a running playtest from its server session.
3
+ */
4
+ import { defineCommand } from '../../framework/define-command.js';
5
+ import { endPlaytestAsync, resolvePlaytestServerSessionAsync, } from '../playtest-sessions.js';
6
+ export async function playtestStopHandlerAsync(connection, options = {}) {
7
+ const serverSession = await resolvePlaytestServerSessionAsync(connection, options.target);
8
+ const { playtestId } = await endPlaytestAsync(connection, serverSession);
9
+ return {
10
+ playtestId,
11
+ summary: 'Playtest stopped',
12
+ };
13
+ }
14
+ export const playtestStopCommand = defineCommand({
15
+ group: 'playtest',
16
+ name: 'stop',
17
+ description: 'Stop the running playtest (--target picks its server session)',
18
+ category: 'execution',
19
+ safety: 'mutate',
20
+ scope: 'connection',
21
+ args: {},
22
+ handler: async (connection, _args, targeting) => playtestStopHandlerAsync(connection, { target: targeting.target }),
23
+ });
24
+ //# sourceMappingURL=stop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.js","sourceRoot":"","sources":["../../../../../src/commands/playtest/stop/stop.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAElE,OAAO,EACL,gBAAgB,EAChB,iCAAiC,GAClC,MAAM,yBAAyB,CAAC;AAYjC,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,UAA4B,EAC5B,UAA+B,EAAE;IAEjC,MAAM,aAAa,GAAG,MAAM,iCAAiC,CAC3D,UAAU,EACV,OAAO,CAAC,MAAM,CACf,CAAC;IACF,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,gBAAgB,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAEzE,OAAO;QACL,UAAU;QACV,OAAO,EAAE,kBAAkB;KAC5B,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,aAAa,CAG9C;IACA,KAAK,EAAE,UAAU;IACjB,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,+DAA+D;IAC5E,QAAQ,EAAE,WAAW;IACrB,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,YAAY;IACnB,IAAI,EAAE,EAAE;IACR,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,CAC9C,wBAAwB,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC;CACrE,CAAC,CAAC"}
@@ -1,22 +1,31 @@
1
1
  /**
2
- * `process close` -- kill a Studio process (not yet implemented).
3
- *
4
- * Closing a Studio process requires matching a bridge session to an OS
5
- * process, which is non-trivial: the Roblox plugin API doesn't expose
6
- * the process ID, so the bridge would need to scan and heuristically
7
- * match OS processes. This command is stubbed until that infrastructure
8
- * exists.
2
+ * `process close` — close the Studio process a session belongs to, or the
3
+ * Studio showing a `deploy.nevermore.json` target's place.
9
4
  */
10
- import type { BridgeSession } from '../../../bridge/index.js';
5
+ import type { BridgeConnection, BridgeSession } from '../../../bridge/index.js';
11
6
  export interface ProcessCloseResult {
12
7
  success: boolean;
13
- sessionId: string;
8
+ sessionId?: string;
9
+ /** The `deploy.nevermore.json` target whose Studio was closed, if one was named. */
10
+ deployTarget?: string;
11
+ pid?: number;
14
12
  summary: string;
15
13
  }
14
+ export interface ProcessCloseOptions {
15
+ force?: boolean;
16
+ pid?: number;
17
+ }
16
18
  interface ProcessCloseArgs {
19
+ deployTarget?: string;
17
20
  force?: boolean;
21
+ pid?: number;
18
22
  }
19
- export declare function processCloseHandlerAsync(session: BridgeSession): Promise<ProcessCloseResult>;
23
+ export declare function processCloseHandlerAsync(session: BridgeSession, options?: ProcessCloseOptions, connection?: BridgeConnection): Promise<ProcessCloseResult>;
24
+ /**
25
+ * Close the Studio showing a target's place from the nearest
26
+ * `deploy.nevermore.json`: a connected one, or else one launched with it.
27
+ */
28
+ export declare function closeDeployTargetAsync(connection: BridgeConnection, deployTarget: string, options?: ProcessCloseOptions, cwd?: string): Promise<ProcessCloseResult>;
20
29
  export declare const processCloseCommand: import("../../framework/define-command.js").CommandDefinition<ProcessCloseArgs, ProcessCloseResult>;
21
30
  export {};
22
31
  //# sourceMappingURL=close.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"close.d.ts","sourceRoot":"","sources":["../../../../../src/commands/process/close/close.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,gBAAgB;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,kBAAkB,CAAC,CAM7B;AAED,eAAO,MAAM,mBAAmB,qGAiB9B,CAAC"}
1
+ {"version":3,"file":"close.d.ts","sourceRoot":"","sources":["../../../../../src/commands/process/close/close.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAehF,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oFAAoF;IACpF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,UAAU,gBAAgB;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,aAAa,EACtB,OAAO,GAAE,mBAAwB,EACjC,UAAU,CAAC,EAAE,gBAAgB,GAC5B,OAAO,CAAC,kBAAkB,CAAC,CAkC7B;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,gBAAgB,EAC5B,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE,mBAAwB,EACjC,GAAG,SAAgB,GAClB,OAAO,CAAC,kBAAkB,CAAC,CAsC7B;AAiDD,eAAO,MAAM,mBAAmB,qGAuC9B,CAAC"}
@@ -1,34 +1,137 @@
1
1
  /**
2
- * `process close` -- kill a Studio process (not yet implemented).
3
- *
4
- * Closing a Studio process requires matching a bridge session to an OS
5
- * process, which is non-trivial: the Roblox plugin API doesn't expose
6
- * the process ID, so the bridge would need to scan and heuristically
7
- * match OS processes. This command is stubbed until that infrastructure
8
- * exists.
2
+ * `process close` — close the Studio process a session belongs to, or the
3
+ * Studio showing a `deploy.nevermore.json` target's place.
9
4
  */
10
5
  import { defineCommand } from '../../framework/define-command.js';
11
6
  import { arg } from '../../framework/arg-builder.js';
12
- export async function processCloseHandlerAsync(session) {
13
- return {
7
+ import { closeStudioProcessAsync, listStudioProcessesAsync, matchStudioProcesses, matchStudioProcessesByPlaceId, } from '../../../process/studio-process-closer.js';
8
+ import { findInstancesShowingPlaceAsync, resolveDeployPlaceAsync, } from '../../../deploy/deploy-places.js';
9
+ import { explainMissingPlaytestContextAsync } from '../../playtest/playtest-sessions.js';
10
+ import { describePlaytest } from '../info/info.js';
11
+ export async function processCloseHandlerAsync(session, options = {}, connection) {
12
+ const { sessionId, instanceId, context } = session.info;
13
+ const sessions = connection?.listSessions() ?? [];
14
+ // Listed sessions carry the edit session's place name for a playtest
15
+ const placeName = sessions.find((s) => s.sessionId === sessionId)?.placeName ||
16
+ session.info.placeName;
17
+ const isMultiplayerProcess = context !== 'edit' &&
18
+ describePlaytest(sessions, instanceId)?.playerCount !== undefined;
19
+ if (isMultiplayerProcess && options.pid === undefined) {
20
+ return {
21
+ success: false,
22
+ sessionId,
23
+ summary: `'${sessionId}' runs in its own process of a multiplayer test. End the test with 'studio-bridge playtest stop', remove a player with 'studio-bridge playtest player remove', or pass --pid.`,
24
+ };
25
+ }
26
+ const processes = await listStudioProcessesAsync();
27
+ let candidates = options.pid !== undefined
28
+ ? processes.filter((proc) => proc.pid === options.pid)
29
+ : matchStudioProcesses(processes, placeName);
30
+ if (candidates.length === 0 && options.pid === undefined) {
31
+ // A cloud place loads after the plugin registers, so its registered id can be 0
32
+ const placeId = (await session.queryStateAsync().catch(() => undefined))
33
+ ?.placeId;
34
+ candidates = matchStudioProcesses(processes, placeName, placeId);
35
+ }
36
+ return closeCandidateAsync(candidates, `'${placeName}'`, options, {
37
+ sessionId,
38
+ });
39
+ }
40
+ /**
41
+ * Close the Studio showing a target's place from the nearest
42
+ * `deploy.nevermore.json`: a connected one, or else one launched with it.
43
+ */
44
+ export async function closeDeployTargetAsync(connection, deployTarget, options = {}, cwd = process.cwd()) {
45
+ const deployPlace = await resolveDeployPlaceAsync(cwd, deployTarget);
46
+ if (!deployPlace) {
47
+ throw new Error(`Target '${deployTarget}' not found`);
48
+ }
49
+ const { placeId } = deployPlace.place;
50
+ const showing = `'${deployPlace.selector}' (place ${placeId})`;
51
+ const base = { deployTarget: deployPlace.selector };
52
+ const instanceIds = await findInstancesShowingPlaceAsync(connection, placeId);
53
+ if (instanceIds.length > 1) {
54
+ return {
55
+ ...base,
56
+ success: false,
57
+ summary: `${instanceIds.length} Studios have ${showing} open (${instanceIds.join(', ')}). Pick one with --target.`,
58
+ };
59
+ }
60
+ if (instanceIds.length === 1) {
61
+ const session = await connection.resolveSessionAsync(instanceIds[0], 'edit');
62
+ return {
63
+ ...(await processCloseHandlerAsync(session, options, connection)),
64
+ ...base,
65
+ };
66
+ }
67
+ const processes = await listStudioProcessesAsync();
68
+ const candidates = options.pid !== undefined
69
+ ? processes.filter((proc) => proc.pid === options.pid)
70
+ : matchStudioProcessesByPlaceId(processes, placeId);
71
+ return closeCandidateAsync(candidates, showing, options, base);
72
+ }
73
+ async function closeCandidateAsync(candidates, showing, options, base) {
74
+ const fail = (summary, pid) => ({
75
+ ...base,
14
76
  success: false,
15
- sessionId: session.info.sessionId,
16
- summary: `process close is not yet implemented. Closing a Studio process requires OS process scanning which has not been built yet.`,
77
+ pid,
78
+ summary,
79
+ });
80
+ if (candidates.length === 0) {
81
+ return fail(options.pid !== undefined
82
+ ? `No Studio process with pid ${options.pid}`
83
+ : `No Studio window is showing ${showing}`);
84
+ }
85
+ if (candidates.length > 1) {
86
+ const pids = candidates.map((proc) => proc.pid).join(', ');
87
+ return fail(`${candidates.length} Studio windows are showing ${showing} (pids ${pids}). Pick one with --pid.`);
88
+ }
89
+ const { pid } = candidates[0];
90
+ const exited = await closeStudioProcessAsync(pid, { force: options.force });
91
+ if (!exited) {
92
+ return fail(options.force
93
+ ? `Studio (pid ${pid}) did not exit`
94
+ : `Studio (pid ${pid}) is still open, likely asking to save. Use --force to close without saving.`, pid);
95
+ }
96
+ return {
97
+ ...base,
98
+ success: true,
99
+ pid,
100
+ summary: `Closed Studio (pid ${pid}) showing ${showing}`,
17
101
  };
18
102
  }
19
103
  export const processCloseCommand = defineCommand({
20
104
  group: 'process',
21
105
  name: 'close',
22
- description: 'Kill a Studio process (not yet implemented)',
106
+ description: "Close a Studio: the one a session belongs to, or the one showing a deploy.nevermore.json target's place",
23
107
  category: 'infrastructure',
24
108
  safety: 'mutate',
25
- scope: 'session',
109
+ scope: 'connection',
26
110
  args: {
111
+ deployTarget: arg.positional({
112
+ description: 'deploy.nevermore.json target whose Studio to close, e.g. test or integration.places.hub',
113
+ required: false,
114
+ }),
27
115
  force: arg.flag({
28
- description: 'Force shutdown without confirmation',
116
+ description: 'Kill Studio without letting it prompt to save',
29
117
  alias: 'f',
30
118
  }),
119
+ pid: arg.option({
120
+ description: 'Studio process id, when several windows show the place',
121
+ type: 'number',
122
+ }),
123
+ },
124
+ handler: async (connection, args, targeting) => {
125
+ const options = { force: args.force, pid: args.pid };
126
+ if (args.deployTarget !== undefined) {
127
+ return closeDeployTargetAsync(connection, args.deployTarget, options);
128
+ }
129
+ const session = await connection
130
+ .resolveSessionAsync(targeting.target, targeting.context)
131
+ .catch(async (err) => {
132
+ throw await explainMissingPlaytestContextAsync(connection, err);
133
+ });
134
+ return processCloseHandlerAsync(session, options, connection);
31
135
  },
32
- handler: async (session) => processCloseHandlerAsync(session),
33
136
  });
34
137
  //# sourceMappingURL=close.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"close.js","sourceRoot":"","sources":["../../../../../src/commands/process/close/close.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,EAAE,GAAG,EAAE,MAAM,gCAAgC,CAAC;AAarD,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,OAAsB;IAEtB,OAAO;QACL,OAAO,EAAE,KAAK;QACd,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,SAAS;QACjC,OAAO,EAAE,2HAA2H;KACrI,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,aAAa,CAG9C;IACA,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,OAAO;IACb,WAAW,EAAE,6CAA6C;IAC1D,QAAQ,EAAE,gBAAgB;IAC1B,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE;QACJ,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC;YACd,WAAW,EAAE,qCAAqC;YAClD,KAAK,EAAE,GAAG;SACX,CAAC;KACH;IACD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,wBAAwB,CAAC,OAAO,CAAC;CAC9D,CAAC,CAAC"}
1
+ {"version":3,"file":"close.js","sourceRoot":"","sources":["../../../../../src/commands/process/close/close.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=close.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"close.test.d.ts","sourceRoot":"","sources":["../../../../../src/commands/process/close/close.test.ts"],"names":[],"mappings":""}