@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
@@ -9,7 +9,11 @@
9
9
  * - `standalone` — `(args) => Promise<TResult>`
10
10
  */
11
11
 
12
- import type { BridgeSession, BridgeConnection } from '../../bridge/index.js';
12
+ import type {
13
+ BridgeSession,
14
+ BridgeConnection,
15
+ SessionContext,
16
+ } from '../../bridge/index.js';
13
17
  import type { ArgDefinition } from './arg-builder.js';
14
18
 
15
19
  /**
@@ -48,6 +52,17 @@ interface BaseFields<TArgs, TResult> {
48
52
  description: string;
49
53
  category: CommandCategory;
50
54
  safety: CommandSafety;
55
+ /**
56
+ * Changes the DataModel. Refused on an edit session while a playtest of it
57
+ * runs, since those edits are not what the playtest is running, unless
58
+ * `--allow-edit` is passed.
59
+ */
60
+ changesDataModel?: boolean;
61
+ /**
62
+ * Reports on every session, so without `--target` it is not narrowed to the
63
+ * Studio that has the current folder's `deploy.nevermore.json` place open.
64
+ */
65
+ coversAllSessions?: boolean;
51
66
  args: Record<string, ArgDefinition>;
52
67
  cli?: CliConfig<TResult>;
53
68
  }
@@ -55,13 +70,27 @@ interface BaseFields<TArgs, TResult> {
55
70
  export interface SessionCommandInput<TArgs, TResult>
56
71
  extends BaseFields<TArgs, TResult> {
57
72
  scope: 'session';
58
- handler: (session: BridgeSession, args: TArgs) => Promise<TResult>;
73
+ handler: (
74
+ session: BridgeSession,
75
+ args: TArgs,
76
+ connection: BridgeConnection
77
+ ) => Promise<TResult>;
78
+ }
79
+
80
+ /** The `--target` and `--context` flags, for handlers that resolve sessions themselves. */
81
+ export interface SessionTargeting {
82
+ target?: string;
83
+ context?: SessionContext;
59
84
  }
60
85
 
61
86
  export interface ConnectionCommandInput<TArgs, TResult>
62
87
  extends BaseFields<TArgs, TResult> {
63
88
  scope: 'connection';
64
- handler: (connection: BridgeConnection, args: TArgs) => Promise<TResult>;
89
+ handler: (
90
+ connection: BridgeConnection,
91
+ args: TArgs,
92
+ targeting: SessionTargeting
93
+ ) => Promise<TResult>;
65
94
  }
66
95
 
67
96
  export interface StandaloneCommandInput<TArgs, TResult>
@@ -15,6 +15,7 @@ export {
15
15
  type SessionCommandInput,
16
16
  type ConnectionCommandInput,
17
17
  type StandaloneCommandInput,
18
+ type SessionTargeting,
18
19
  type CliConfig,
19
20
  } from './define-command.js';
20
21
 
@@ -40,6 +40,25 @@ export {
40
40
  type QueryOptions,
41
41
  type DataModelNode,
42
42
  } from './explorer/query/query.js';
43
+ export {
44
+ exportInstancesHandlerAsync,
45
+ type ExportResult,
46
+ } from './explorer/export/export.js';
47
+ export {
48
+ importInstancesHandlerAsync,
49
+ type ImportResult,
50
+ type ImportOptions,
51
+ } from './explorer/import/import.js';
52
+ export {
53
+ findInstancesHandlerAsync,
54
+ type FindResult,
55
+ type FindOptions,
56
+ } from './explorer/find/find.js';
57
+ export {
58
+ grepScriptsHandlerAsync,
59
+ type GrepResult,
60
+ type GrepOptions,
61
+ } from './explorer/grep/grep.js';
43
62
  export {
44
63
  execHandlerAsync,
45
64
  type ExecOptions,
@@ -61,6 +80,37 @@ export {
61
80
  type ConnectResult,
62
81
  } from './connect.js';
63
82
  export { disconnectHandler, type DisconnectResult } from './disconnect.js';
83
+ export {
84
+ playtestStartHandlerAsync,
85
+ type PlaytestStartOptions,
86
+ type PlaytestStartResult,
87
+ } from './playtest/start/start.js';
88
+ export {
89
+ playtestStopHandlerAsync,
90
+ type PlaytestStopOptions,
91
+ type PlaytestStopResult,
92
+ } from './playtest/stop/stop.js';
93
+ export {
94
+ playtestRunHandlerAsync,
95
+ type PlaytestRunOptions,
96
+ type PlaytestRunResult,
97
+ } from './playtest/run/run.js';
98
+ export {
99
+ playtestRestartHandlerAsync,
100
+ type PlaytestRestartOptions,
101
+ } from './playtest/restart/restart.js';
102
+ export {
103
+ playtestPlayerListHandlerAsync,
104
+ type PlaytestPlayerListResult,
105
+ } from './playtest/player/list/list.js';
106
+ export {
107
+ playtestPlayerAddHandlerAsync,
108
+ type PlaytestPlayerAddResult,
109
+ } from './playtest/player/add/add.js';
110
+ export {
111
+ playtestPlayerRemoveHandlerAsync,
112
+ type PlaytestPlayerRemoveResult,
113
+ } from './playtest/player/remove/remove.js';
64
114
  export {
65
115
  processRunHandlerAsync,
66
116
  type ProcessRunOptions,
@@ -36,8 +36,7 @@ export async function injectCredentialsHandlerAsync(
36
36
  try {
37
37
  const envError = await checkLinuxEnvironmentAsync();
38
38
  if (envError) {
39
- OutputHelper.error(envError);
40
- process.exit(1);
39
+ return { success: false, summary: envError };
41
40
  }
42
41
 
43
42
  const linux = await import('../../../linux/index.js');
@@ -92,7 +91,6 @@ export async function injectCredentialsHandlerAsync(
92
91
  };
93
92
  } catch (err) {
94
93
  const message = err instanceof Error ? err.message : String(err);
95
- OutputHelper.error(message);
96
94
  return { success: false, summary: message };
97
95
  }
98
96
  }
@@ -25,8 +25,7 @@ export async function setupHandlerAsync(args: SetupArgs): Promise<SetupResult> {
25
25
  try {
26
26
  const envError = await checkLinuxEnvironmentAsync();
27
27
  if (envError) {
28
- OutputHelper.error(envError);
29
- process.exit(1);
28
+ return { success: false, summary: envError };
30
29
  }
31
30
 
32
31
  const linux = await import('../../../linux/index.js');
@@ -113,7 +112,6 @@ export async function setupHandlerAsync(args: SetupArgs): Promise<SetupResult> {
113
112
  };
114
113
  } catch (err) {
115
114
  const message = err instanceof Error ? err.message : String(err);
116
- OutputHelper.error(message);
117
115
  return { success: false, summary: message };
118
116
  }
119
117
  }
@@ -18,17 +18,26 @@ interface PrerequisiteStatus {
18
18
  hint?: string;
19
19
  }
20
20
 
21
- interface StatusResult {
21
+ export interface StatusResult {
22
+ /** False only when the check could not run; an unhealthy environment still reports. */
23
+ success: boolean;
22
24
  healthy: boolean;
25
+ summary: string;
26
+ error?: string;
23
27
  prerequisites: PrerequisiteStatus[];
24
- display: { xvfb: boolean; openbox: boolean };
28
+ display: { name?: string; xvfb: boolean; openbox: boolean };
25
29
  studio: {
30
+ dir?: string;
26
31
  installed: boolean;
27
32
  version?: string;
28
33
  fflags: boolean;
29
34
  shaders: boolean;
30
35
  };
31
- auth: { writeCredExe: boolean; credentialsInjected: boolean };
36
+ auth: {
37
+ writeCredExe: boolean;
38
+ winePrefix: boolean;
39
+ credentialsInjected: boolean;
40
+ };
32
41
  }
33
42
 
34
43
  async function fileExistsAsync(filePath: string): Promise<boolean> {
@@ -40,133 +49,128 @@ async function fileExistsAsync(filePath: string): Promise<boolean> {
40
49
  }
41
50
  }
42
51
 
52
+ function unhealthy(error: string): StatusResult {
53
+ return {
54
+ success: false,
55
+ healthy: false,
56
+ summary: error,
57
+ error,
58
+ prerequisites: [],
59
+ display: { xvfb: false, openbox: false },
60
+ studio: { installed: false, fflags: false, shaders: false },
61
+ auth: {
62
+ writeCredExe: false,
63
+ winePrefix: false,
64
+ credentialsInjected: false,
65
+ },
66
+ };
67
+ }
68
+
43
69
  export async function statusHandlerAsync(
44
70
  _args: StatusArgs
45
71
  ): Promise<StatusResult> {
46
72
  try {
47
73
  const envError = await checkLinuxEnvironmentAsync();
48
74
  if (envError) {
49
- OutputHelper.error(envError);
50
- process.exit(1);
75
+ return unhealthy(envError);
51
76
  }
52
77
 
53
78
  const linux = await import('../../../linux/index.js');
54
79
  const config = linux.resolveLinuxConfig();
55
- let allOk = true;
56
80
 
57
- // 1. Prerequisites
58
- OutputHelper.info('System prerequisites:');
59
- const prereqs = linux.checkPrerequisites();
60
- for (const p of prereqs) {
61
- const status = p.available
62
- ? ` OK ${p.name}${p.version ? ` (${p.version})` : ''}`
63
- : ` MISSING ${p.name} — ${p.hint}`;
64
- if (p.available) {
65
- OutputHelper.info(status);
66
- } else {
67
- OutputHelper.error(status);
68
- allOk = false;
69
- }
70
- }
81
+ const prerequisites = linux.checkPrerequisites();
71
82
 
72
- // 2. Display
73
83
  const displayNum = config.display.replace(':', '');
74
- const xvfbOk = linux.isXvfbRunning(displayNum);
75
- const openboxOk = linux.isOpenboxRunning();
76
- OutputHelper.info('');
77
- OutputHelper.info('Display:');
78
- OutputHelper.info(
79
- ` Xvfb (${config.display}): ${xvfbOk ? 'running' : 'not running'}`
80
- );
81
- OutputHelper.info(` openbox: ${openboxOk ? 'running' : 'not running'}`);
82
- if (!xvfbOk || !openboxOk) allOk = false;
83
-
84
- // 3. Studio installation
85
- OutputHelper.info('');
86
- OutputHelper.info('Studio installation:');
87
- const studioExists = await fileExistsAsync(config.studioExe);
88
- OutputHelper.info(
89
- ` ${config.studioDir}: ${studioExists ? 'installed' : 'not found'}`
90
- );
91
- if (!studioExists) allOk = false;
84
+ const xvfb = linux.isXvfbRunning(displayNum);
85
+ const openbox = linux.isOpenboxRunning();
92
86
 
87
+ const installed = await fileExistsAsync(config.studioExe);
93
88
  const { readInstalledVersionAsync } = await import(
94
89
  '../../../linux/linux-version-resolver.js'
95
90
  );
96
91
  const version = await readInstalledVersionAsync(config.studioDir);
97
- if (version) {
98
- OutputHelper.info(` Version: ${version}`);
99
- }
100
-
101
- // 4. FFlags
102
- const fflagsExist = await fileExistsAsync(config.clientSettingsPath);
103
- OutputHelper.info(` FFlags: ${fflagsExist ? 'configured' : 'not found'}`);
104
-
105
- // 5. Shaders
106
- const shadersExist = await fileExistsAsync(
92
+ const fflags = await fileExistsAsync(config.clientSettingsPath);
93
+ const shaders = await fileExistsAsync(
107
94
  `${config.shadersDir}/shaders_glsl3.pack`
108
95
  );
109
- OutputHelper.info(` Shaders: ${shadersExist ? 'present' : 'not found'}`);
110
-
111
- // 6. Credentials
112
- OutputHelper.info('');
113
- OutputHelper.info('Authentication:');
114
- const writeCredExists = await fileExistsAsync(config.writeCredExe);
115
- OutputHelper.info(
116
- ` write-cred.exe: ${writeCredExists ? 'compiled' : 'not found'}`
117
- );
118
96
 
119
- // Check Wine registry for credential entries
120
- let credentialsInjected = false;
97
+ const writeCredExe = await fileExistsAsync(config.writeCredExe);
121
98
  const wineRegPath = `${config.winePrefix}/user.reg`;
122
- const wineRegExists = await fileExistsAsync(wineRegPath);
123
- if (wineRegExists) {
124
- const regContent = await fs.readFile(wineRegPath, 'utf-8');
125
- credentialsInjected = regContent.includes('RobloxStudioAuth');
126
- OutputHelper.info(
127
- ` Wine credentials: ${
128
- credentialsInjected ? 'present' : 'not injected'
129
- }`
130
- );
131
- if (!credentialsInjected) allOk = false;
132
- } else {
133
- OutputHelper.info(' Wine prefix: not initialized');
134
- allOk = false;
135
- }
136
-
137
- // Summary
138
- OutputHelper.info('');
139
- if (allOk) {
140
- OutputHelper.info('Environment is ready for Studio.');
141
- } else {
142
- OutputHelper.warn('Environment has issues. See above for details.');
143
- }
99
+ const winePrefix = await fileExistsAsync(wineRegPath);
100
+ const credentialsInjected =
101
+ winePrefix &&
102
+ (await fs.readFile(wineRegPath, 'utf-8')).includes('RobloxStudioAuth');
103
+
104
+ const healthy =
105
+ prerequisites.every((p) => p.available) &&
106
+ xvfb &&
107
+ openbox &&
108
+ installed &&
109
+ credentialsInjected;
144
110
 
145
111
  return {
146
- healthy: allOk,
147
- prerequisites: prereqs,
148
- display: { xvfb: xvfbOk, openbox: openboxOk },
112
+ success: true,
113
+ healthy,
114
+ summary: healthy
115
+ ? 'Environment is ready for Studio.'
116
+ : 'Environment has issues. See above for details.',
117
+ prerequisites,
118
+ display: { name: config.display, xvfb, openbox },
149
119
  studio: {
150
- installed: studioExists,
120
+ dir: config.studioDir,
121
+ installed,
151
122
  version: version ?? undefined,
152
- fflags: fflagsExist,
153
- shaders: shadersExist,
123
+ fflags,
124
+ shaders,
154
125
  },
155
- auth: { writeCredExe: writeCredExists, credentialsInjected },
126
+ auth: { writeCredExe, winePrefix, credentialsInjected },
156
127
  };
157
128
  } catch (err) {
158
- const message = err instanceof Error ? err.message : String(err);
159
- OutputHelper.error(message);
160
- return {
161
- healthy: false,
162
- prerequisites: [],
163
- display: { xvfb: false, openbox: false },
164
- studio: { installed: false, fflags: false, shaders: false },
165
- auth: { writeCredExe: false, credentialsInjected: false },
166
- };
129
+ return unhealthy(err instanceof Error ? err.message : String(err));
167
130
  }
168
131
  }
169
132
 
133
+ export function formatStatusText(result: StatusResult): string {
134
+ if (result.error) return OutputHelper.formatError(result.error);
135
+
136
+ const { prerequisites, display, studio, auth } = result;
137
+ const lines = ['System prerequisites:'];
138
+ for (const p of prerequisites) {
139
+ lines.push(
140
+ p.available
141
+ ? ` OK ${p.name}${p.version ? ` (${p.version})` : ''}`
142
+ : OutputHelper.formatError(` MISSING ${p.name} — ${p.hint}`)
143
+ );
144
+ }
145
+
146
+ lines.push(
147
+ '',
148
+ 'Display:',
149
+ ` Xvfb (${display.name}): ${display.xvfb ? 'running' : 'not running'}`,
150
+ ` openbox: ${display.openbox ? 'running' : 'not running'}`,
151
+ '',
152
+ 'Studio installation:',
153
+ ` ${studio.dir}: ${studio.installed ? 'installed' : 'not found'}`
154
+ );
155
+ if (studio.version) lines.push(` Version: ${studio.version}`);
156
+ lines.push(
157
+ ` FFlags: ${studio.fflags ? 'configured' : 'not found'}`,
158
+ ` Shaders: ${studio.shaders ? 'present' : 'not found'}`,
159
+ '',
160
+ 'Authentication:',
161
+ ` write-cred.exe: ${auth.writeCredExe ? 'compiled' : 'not found'}`,
162
+ auth.winePrefix
163
+ ? ` Wine credentials: ${
164
+ auth.credentialsInjected ? 'present' : 'not injected'
165
+ }`
166
+ : ' Wine prefix: not initialized',
167
+ '',
168
+ result.healthy ? result.summary : OutputHelper.formatWarning(result.summary)
169
+ );
170
+
171
+ return lines.join('\n');
172
+ }
173
+
170
174
  export const linuxStatusCommand = defineCommand<StatusArgs, StatusResult>({
171
175
  group: 'linux',
172
176
  name: 'status',
@@ -176,5 +180,8 @@ export const linuxStatusCommand = defineCommand<StatusArgs, StatusResult>({
176
180
  safety: 'none',
177
181
  scope: 'standalone',
178
182
  args: {},
183
+ cli: {
184
+ format: formatStatusText,
185
+ },
179
186
  handler: async (args) => statusHandlerAsync(args),
180
187
  });
@@ -0,0 +1,85 @@
1
+ /**
2
+ * `playtest player add` — add players to the running multiplayer test.
3
+ */
4
+
5
+ import { defineCommand } from '../../../framework/define-command.js';
6
+ import { arg } from '../../../framework/arg-builder.js';
7
+ import type { BridgeConnection } from '../../../../bridge/index.js';
8
+ import { resolvePlaytestServerSessionAsync } from '../../playtest-sessions.js';
9
+ import {
10
+ addPlaytestPlayersAsync,
11
+ formatPlayersTable,
12
+ type PlaytestPlayer,
13
+ } from '../playtest-players.js';
14
+
15
+ export interface PlaytestPlayerAddResult {
16
+ players: PlaytestPlayer[];
17
+ summary: string;
18
+ }
19
+
20
+ interface PlaytestPlayerAddArgs {
21
+ count?: number;
22
+ }
23
+
24
+ export async function playtestPlayerAddHandlerAsync(
25
+ connection: BridgeConnection,
26
+ count: number,
27
+ target?: string
28
+ ): Promise<PlaytestPlayerAddResult> {
29
+ if (!Number.isInteger(count) || count < 1) {
30
+ throw new Error(`Player count must be a whole number of at least 1`);
31
+ }
32
+
33
+ const serverSession = await resolvePlaytestServerSessionAsync(
34
+ connection,
35
+ target
36
+ );
37
+ const players = await addPlaytestPlayersAsync(
38
+ connection,
39
+ serverSession,
40
+ count
41
+ );
42
+
43
+ return {
44
+ players,
45
+ summary:
46
+ players.length < count
47
+ ? `Added ${players.length} of ${count} player(s); the rest did not join in time`
48
+ : `Added ${players.length} player(s)`,
49
+ };
50
+ }
51
+
52
+ export function formatPlayerAddText(result: PlaytestPlayerAddResult): string {
53
+ return result.players.length === 0
54
+ ? result.summary
55
+ : `${result.summary}\n${formatPlayersTable(result.players)}`;
56
+ }
57
+
58
+ export const playtestPlayerAddCommand = defineCommand<
59
+ PlaytestPlayerAddArgs,
60
+ PlaytestPlayerAddResult
61
+ >({
62
+ group: 'playtest player',
63
+ name: 'add',
64
+ description:
65
+ 'Add players to the running multiplayer test (playtest start --players)',
66
+ category: 'execution',
67
+ safety: 'mutate',
68
+ scope: 'connection',
69
+ args: {
70
+ count: arg.positional({
71
+ description: 'How many players to add',
72
+ type: 'number',
73
+ required: false,
74
+ }),
75
+ },
76
+ cli: {
77
+ format: formatPlayerAddText,
78
+ },
79
+ handler: async (connection, args, targeting) =>
80
+ playtestPlayerAddHandlerAsync(
81
+ connection,
82
+ args.count ?? 1,
83
+ targeting.target
84
+ ),
85
+ });
@@ -0,0 +1,57 @@
1
+ /**
2
+ * `playtest player list` — list the players in the running playtest.
3
+ */
4
+
5
+ import { defineCommand } from '../../../framework/define-command.js';
6
+ import type { BridgeConnection } from '../../../../bridge/index.js';
7
+ import { resolvePlaytestServerSessionAsync } from '../../playtest-sessions.js';
8
+ import {
9
+ formatPlayersTable,
10
+ listPlaytestPlayersAsync,
11
+ type PlaytestPlayer,
12
+ } from '../playtest-players.js';
13
+
14
+ export interface PlaytestPlayerListResult {
15
+ players: PlaytestPlayer[];
16
+ summary: string;
17
+ }
18
+
19
+ export async function playtestPlayerListHandlerAsync(
20
+ connection: BridgeConnection,
21
+ target?: string
22
+ ): Promise<PlaytestPlayerListResult> {
23
+ const serverSession = await resolvePlaytestServerSessionAsync(
24
+ connection,
25
+ target
26
+ );
27
+ const players = await listPlaytestPlayersAsync(connection, serverSession);
28
+
29
+ return {
30
+ players,
31
+ summary: `${players.length} player(s) in the playtest`,
32
+ };
33
+ }
34
+
35
+ export function formatPlayerListText(result: PlaytestPlayerListResult): string {
36
+ return result.players.length === 0
37
+ ? 'No players in the playtest'
38
+ : formatPlayersTable(result.players);
39
+ }
40
+
41
+ export const playtestPlayerListCommand = defineCommand<
42
+ Record<string, never>,
43
+ PlaytestPlayerListResult
44
+ >({
45
+ group: 'playtest player',
46
+ name: 'list',
47
+ description: 'List the players in the running playtest',
48
+ category: 'execution',
49
+ safety: 'read',
50
+ scope: 'connection',
51
+ args: {},
52
+ cli: {
53
+ format: formatPlayerListText,
54
+ },
55
+ handler: async (connection, _args, targeting) =>
56
+ playtestPlayerListHandlerAsync(connection, targeting.target),
57
+ });