@quenty/studio-bridge 0.21.1 → 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 (482) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +109 -17
  3. package/build-scripts/transform-add-session-attribute.lua +1 -0
  4. package/deploy.nevermore.json +10 -0
  5. package/dist/src/bridge/bridge-connection.d.ts +26 -2
  6. package/dist/src/bridge/bridge-connection.d.ts.map +1 -1
  7. package/dist/src/bridge/bridge-connection.js +159 -14
  8. package/dist/src/bridge/bridge-connection.js.map +1 -1
  9. package/dist/src/bridge/bridge-connection.test.js +81 -0
  10. package/dist/src/bridge/bridge-connection.test.js.map +1 -1
  11. package/dist/src/bridge/bridge-session.d.ts +35 -2
  12. package/dist/src/bridge/bridge-session.d.ts.map +1 -1
  13. package/dist/src/bridge/bridge-session.js +185 -28
  14. package/dist/src/bridge/bridge-session.js.map +1 -1
  15. package/dist/src/bridge/bridge-session.test.js +6 -4
  16. package/dist/src/bridge/bridge-session.test.js.map +1 -1
  17. package/dist/src/bridge/index.d.ts +1 -1
  18. package/dist/src/bridge/index.d.ts.map +1 -1
  19. package/dist/src/bridge/index.js.map +1 -1
  20. package/dist/src/bridge/internal/bridge-client.d.ts +4 -0
  21. package/dist/src/bridge/internal/bridge-client.d.ts.map +1 -1
  22. package/dist/src/bridge/internal/bridge-client.js +20 -7
  23. package/dist/src/bridge/internal/bridge-client.js.map +1 -1
  24. package/dist/src/bridge/internal/bridge-client.test.js +18 -0
  25. package/dist/src/bridge/internal/bridge-client.test.js.map +1 -1
  26. package/dist/src/bridge/internal/bridge-host.d.ts +13 -1
  27. package/dist/src/bridge/internal/bridge-host.d.ts.map +1 -1
  28. package/dist/src/bridge/internal/bridge-host.js +35 -0
  29. package/dist/src/bridge/internal/bridge-host.js.map +1 -1
  30. package/dist/src/bridge/internal/bridge-host.test.js +31 -0
  31. package/dist/src/bridge/internal/bridge-host.test.js.map +1 -1
  32. package/dist/src/bridge/internal/hand-off.d.ts.map +1 -1
  33. package/dist/src/bridge/internal/hand-off.js +4 -1
  34. package/dist/src/bridge/internal/hand-off.js.map +1 -1
  35. package/dist/src/bridge/internal/host-protocol.d.ts +8 -0
  36. package/dist/src/bridge/internal/host-protocol.d.ts.map +1 -1
  37. package/dist/src/bridge/internal/host-protocol.js +120 -13
  38. package/dist/src/bridge/internal/host-protocol.js.map +1 -1
  39. package/dist/src/bridge/internal/host-protocol.test.js +13 -0
  40. package/dist/src/bridge/internal/host-protocol.test.js.map +1 -1
  41. package/dist/src/bridge/internal/instance-state.d.ts +9 -0
  42. package/dist/src/bridge/internal/instance-state.d.ts.map +1 -0
  43. package/dist/src/bridge/internal/instance-state.js +28 -0
  44. package/dist/src/bridge/internal/instance-state.js.map +1 -0
  45. package/dist/src/bridge/internal/transport-client.d.ts.map +1 -1
  46. package/dist/src/bridge/internal/transport-client.js +2 -1
  47. package/dist/src/bridge/internal/transport-client.js.map +1 -1
  48. package/dist/src/bridge/internal/transport-server.d.ts.map +1 -1
  49. package/dist/src/bridge/internal/transport-server.js +5 -1
  50. package/dist/src/bridge/internal/transport-server.js.map +1 -1
  51. package/dist/src/bridge/types.d.ts +43 -4
  52. package/dist/src/bridge/types.d.ts.map +1 -1
  53. package/dist/src/bridge/types.js.map +1 -1
  54. package/dist/src/cli/adapters/cli-command-adapter-handler.test.js +24 -0
  55. package/dist/src/cli/adapters/cli-command-adapter-handler.test.js.map +1 -1
  56. package/dist/src/cli/adapters/cli-command-adapter.d.ts +6 -0
  57. package/dist/src/cli/adapters/cli-command-adapter.d.ts.map +1 -1
  58. package/dist/src/cli/adapters/cli-command-adapter.js +107 -11
  59. package/dist/src/cli/adapters/cli-command-adapter.js.map +1 -1
  60. package/dist/src/cli/adapters/group-builder.d.ts +3 -0
  61. package/dist/src/cli/adapters/group-builder.d.ts.map +1 -1
  62. package/dist/src/cli/adapters/group-builder.js +34 -15
  63. package/dist/src/cli/adapters/group-builder.js.map +1 -1
  64. package/dist/src/cli/adapters/group-builder.test.js +26 -2
  65. package/dist/src/cli/adapters/group-builder.test.js.map +1 -1
  66. package/dist/src/cli/adapters/help-formatter.d.ts.map +1 -1
  67. package/dist/src/cli/adapters/help-formatter.js +4 -3
  68. package/dist/src/cli/adapters/help-formatter.js.map +1 -1
  69. package/dist/src/cli/adapters/help-formatter.test.js +1 -1
  70. package/dist/src/cli/adapters/help-formatter.test.js.map +1 -1
  71. package/dist/src/cli/adapters/playtest-edit-guard.test.d.ts +2 -0
  72. package/dist/src/cli/adapters/playtest-edit-guard.test.d.ts.map +1 -0
  73. package/dist/src/cli/adapters/playtest-edit-guard.test.js +28 -0
  74. package/dist/src/cli/adapters/playtest-edit-guard.test.js.map +1 -0
  75. package/dist/src/cli/args/global-args.d.ts +1 -1
  76. package/dist/src/cli/args/global-args.d.ts.map +1 -1
  77. package/dist/src/cli/cli-output-context.d.ts +14 -0
  78. package/dist/src/cli/cli-output-context.d.ts.map +1 -0
  79. package/dist/src/cli/cli-output-context.js +39 -0
  80. package/dist/src/cli/cli-output-context.js.map +1 -0
  81. package/dist/src/cli/cli-output-context.test.d.ts +2 -0
  82. package/dist/src/cli/cli-output-context.test.d.ts.map +1 -0
  83. package/dist/src/cli/cli-output-context.test.js +38 -0
  84. package/dist/src/cli/cli-output-context.test.js.map +1 -0
  85. package/dist/src/cli/cli.js +40 -17
  86. package/dist/src/cli/cli.js.map +1 -1
  87. package/dist/src/cli/managed-studio-run.d.ts +21 -0
  88. package/dist/src/cli/managed-studio-run.d.ts.map +1 -0
  89. package/dist/src/cli/managed-studio-run.js +75 -0
  90. package/dist/src/cli/managed-studio-run.js.map +1 -0
  91. package/dist/src/cli/managed-studio-run.test.d.ts +2 -0
  92. package/dist/src/cli/managed-studio-run.test.d.ts.map +1 -0
  93. package/dist/src/cli/managed-studio-run.test.js +52 -0
  94. package/dist/src/cli/managed-studio-run.test.js.map +1 -0
  95. package/dist/src/cli/resolve-session.js +1 -1
  96. package/dist/src/cli/resolve-session.js.map +1 -1
  97. package/dist/src/cli/resolve-session.test.js +1 -1
  98. package/dist/src/cli/resolve-session.test.js.map +1 -1
  99. package/dist/src/cli/script-executor.d.ts +13 -1
  100. package/dist/src/cli/script-executor.d.ts.map +1 -1
  101. package/dist/src/cli/script-executor.js +77 -47
  102. package/dist/src/cli/script-executor.js.map +1 -1
  103. package/dist/src/commands/console/exec/exec.d.ts +17 -0
  104. package/dist/src/commands/console/exec/exec.d.ts.map +1 -1
  105. package/dist/src/commands/console/exec/exec.js +39 -7
  106. package/dist/src/commands/console/exec/exec.js.map +1 -1
  107. package/dist/src/commands/console/exec/exec.test.js +62 -3
  108. package/dist/src/commands/console/exec/exec.test.js.map +1 -1
  109. package/dist/src/commands/console/logs/logs.d.ts +30 -2
  110. package/dist/src/commands/console/logs/logs.d.ts.map +1 -1
  111. package/dist/src/commands/console/logs/logs.js +82 -7
  112. package/dist/src/commands/console/logs/logs.js.map +1 -1
  113. package/dist/src/commands/console/logs/logs.test.js +63 -4
  114. package/dist/src/commands/console/logs/logs.test.js.map +1 -1
  115. package/dist/src/commands/explorer/export/export.d.ts +19 -0
  116. package/dist/src/commands/explorer/export/export.d.ts.map +1 -0
  117. package/dist/src/commands/explorer/export/export.js +37 -0
  118. package/dist/src/commands/explorer/export/export.js.map +1 -0
  119. package/dist/src/commands/explorer/export/export.test.d.ts +2 -0
  120. package/dist/src/commands/explorer/export/export.test.d.ts.map +1 -0
  121. package/dist/src/commands/explorer/export/export.test.js +25 -0
  122. package/dist/src/commands/explorer/export/export.test.js.map +1 -0
  123. package/dist/src/commands/explorer/find/find.d.ts +28 -0
  124. package/dist/src/commands/explorer/find/find.d.ts.map +1 -0
  125. package/dist/src/commands/explorer/find/find.js +75 -0
  126. package/dist/src/commands/explorer/find/find.js.map +1 -0
  127. package/dist/src/commands/explorer/find/find.test.d.ts +2 -0
  128. package/dist/src/commands/explorer/find/find.test.d.ts.map +1 -0
  129. package/dist/src/commands/explorer/find/find.test.js +44 -0
  130. package/dist/src/commands/explorer/find/find.test.js.map +1 -0
  131. package/dist/src/commands/explorer/grep/grep.d.ts +24 -0
  132. package/dist/src/commands/explorer/grep/grep.d.ts.map +1 -0
  133. package/dist/src/commands/explorer/grep/grep.js +63 -0
  134. package/dist/src/commands/explorer/grep/grep.js.map +1 -0
  135. package/dist/src/commands/explorer/grep/grep.test.d.ts +2 -0
  136. package/dist/src/commands/explorer/grep/grep.test.d.ts.map +1 -0
  137. package/dist/src/commands/explorer/grep/grep.test.js +42 -0
  138. package/dist/src/commands/explorer/grep/grep.test.js.map +1 -0
  139. package/dist/src/commands/explorer/import/import.d.ts +21 -0
  140. package/dist/src/commands/explorer/import/import.d.ts.map +1 -0
  141. package/dist/src/commands/explorer/import/import.js +37 -0
  142. package/dist/src/commands/explorer/import/import.js.map +1 -0
  143. package/dist/src/commands/explorer/import/import.test.d.ts +2 -0
  144. package/dist/src/commands/explorer/import/import.test.d.ts.map +1 -0
  145. package/dist/src/commands/explorer/import/import.test.js +45 -0
  146. package/dist/src/commands/explorer/import/import.test.js.map +1 -0
  147. package/dist/src/commands/formatters.test.js +7 -1
  148. package/dist/src/commands/formatters.test.js.map +1 -1
  149. package/dist/src/commands/framework/action-loader.d.ts +5 -1
  150. package/dist/src/commands/framework/action-loader.d.ts.map +1 -1
  151. package/dist/src/commands/framework/action-loader.js +9 -2
  152. package/dist/src/commands/framework/action-loader.js.map +1 -1
  153. package/dist/src/commands/framework/action-loader.test.js +23 -0
  154. package/dist/src/commands/framework/action-loader.test.js.map +1 -1
  155. package/dist/src/commands/framework/arg-builder.d.ts +15 -2
  156. package/dist/src/commands/framework/arg-builder.d.ts.map +1 -1
  157. package/dist/src/commands/framework/arg-builder.js +22 -2
  158. package/dist/src/commands/framework/arg-builder.js.map +1 -1
  159. package/dist/src/commands/framework/define-command.d.ts +19 -3
  160. package/dist/src/commands/framework/define-command.d.ts.map +1 -1
  161. package/dist/src/commands/framework/define-command.js.map +1 -1
  162. package/dist/src/commands/framework/index.d.ts +1 -1
  163. package/dist/src/commands/framework/index.d.ts.map +1 -1
  164. package/dist/src/commands/framework/index.js.map +1 -1
  165. package/dist/src/commands/index.d.ts +11 -0
  166. package/dist/src/commands/index.d.ts.map +1 -1
  167. package/dist/src/commands/index.js +11 -0
  168. package/dist/src/commands/index.js.map +1 -1
  169. package/dist/src/commands/linux/inject-credentials/inject-credentials.d.ts.map +1 -1
  170. package/dist/src/commands/linux/inject-credentials/inject-credentials.js +1 -3
  171. package/dist/src/commands/linux/inject-credentials/inject-credentials.js.map +1 -1
  172. package/dist/src/commands/linux/setup/setup.d.ts.map +1 -1
  173. package/dist/src/commands/linux/setup/setup.js +1 -3
  174. package/dist/src/commands/linux/setup/setup.js.map +1 -1
  175. package/dist/src/commands/linux/status/status.d.ts +9 -1
  176. package/dist/src/commands/linux/status/status.d.ts.map +1 -1
  177. package/dist/src/commands/linux/status/status.js +66 -86
  178. package/dist/src/commands/linux/status/status.js.map +1 -1
  179. package/dist/src/commands/playtest/player/add/add.d.ts +17 -0
  180. package/dist/src/commands/playtest/player/add/add.d.ts.map +1 -0
  181. package/dist/src/commands/playtest/player/add/add.js +45 -0
  182. package/dist/src/commands/playtest/player/add/add.js.map +1 -0
  183. package/dist/src/commands/playtest/player/list/list.d.ts +13 -0
  184. package/dist/src/commands/playtest/player/list/list.d.ts.map +1 -0
  185. package/dist/src/commands/playtest/player/list/list.js +33 -0
  186. package/dist/src/commands/playtest/player/list/list.js.map +1 -0
  187. package/dist/src/commands/playtest/player/playtest-players.d.ts +36 -0
  188. package/dist/src/commands/playtest/player/playtest-players.d.ts.map +1 -0
  189. package/dist/src/commands/playtest/player/playtest-players.js +187 -0
  190. package/dist/src/commands/playtest/player/playtest-players.js.map +1 -0
  191. package/dist/src/commands/playtest/player/playtest-players.test.d.ts +2 -0
  192. package/dist/src/commands/playtest/player/playtest-players.test.d.ts.map +1 -0
  193. package/dist/src/commands/playtest/player/playtest-players.test.js +89 -0
  194. package/dist/src/commands/playtest/player/playtest-players.test.js.map +1 -0
  195. package/dist/src/commands/playtest/player/remove/remove.d.ts +17 -0
  196. package/dist/src/commands/playtest/player/remove/remove.d.ts.map +1 -0
  197. package/dist/src/commands/playtest/player/remove/remove.js +42 -0
  198. package/dist/src/commands/playtest/player/remove/remove.js.map +1 -0
  199. package/dist/src/commands/playtest/playtest-sessions.d.ts +49 -0
  200. package/dist/src/commands/playtest/playtest-sessions.d.ts.map +1 -0
  201. package/dist/src/commands/playtest/playtest-sessions.js +283 -0
  202. package/dist/src/commands/playtest/playtest-sessions.js.map +1 -0
  203. package/dist/src/commands/playtest/playtest-sessions.test.d.ts +2 -0
  204. package/dist/src/commands/playtest/playtest-sessions.test.d.ts.map +1 -0
  205. package/dist/src/commands/playtest/playtest-sessions.test.js +87 -0
  206. package/dist/src/commands/playtest/playtest-sessions.test.js.map +1 -0
  207. package/dist/src/commands/playtest/restart/restart.d.ts +23 -0
  208. package/dist/src/commands/playtest/restart/restart.d.ts.map +1 -0
  209. package/dist/src/commands/playtest/restart/restart.js +105 -0
  210. package/dist/src/commands/playtest/restart/restart.js.map +1 -0
  211. package/dist/src/commands/playtest/run/run.d.ts +47 -0
  212. package/dist/src/commands/playtest/run/run.d.ts.map +1 -0
  213. package/dist/src/commands/playtest/run/run.js +137 -0
  214. package/dist/src/commands/playtest/run/run.js.map +1 -0
  215. package/dist/src/commands/playtest/start/start.d.ts +42 -0
  216. package/dist/src/commands/playtest/start/start.d.ts.map +1 -0
  217. package/dist/src/commands/playtest/start/start.js +70 -0
  218. package/dist/src/commands/playtest/start/start.js.map +1 -0
  219. package/dist/src/commands/playtest/stop/stop.d.ts +15 -0
  220. package/dist/src/commands/playtest/stop/stop.d.ts.map +1 -0
  221. package/dist/src/commands/playtest/stop/stop.js +24 -0
  222. package/dist/src/commands/playtest/stop/stop.js.map +1 -0
  223. package/dist/src/commands/process/close/close.d.ts +19 -10
  224. package/dist/src/commands/process/close/close.d.ts.map +1 -1
  225. package/dist/src/commands/process/close/close.js +118 -15
  226. package/dist/src/commands/process/close/close.js.map +1 -1
  227. package/dist/src/commands/process/close/close.test.d.ts +2 -0
  228. package/dist/src/commands/process/close/close.test.d.ts.map +1 -0
  229. package/dist/src/commands/process/close/close.test.js +190 -0
  230. package/dist/src/commands/process/close/close.test.js.map +1 -0
  231. package/dist/src/commands/process/info/info.d.ts +45 -5
  232. package/dist/src/commands/process/info/info.d.ts.map +1 -1
  233. package/dist/src/commands/process/info/info.js +117 -13
  234. package/dist/src/commands/process/info/info.js.map +1 -1
  235. package/dist/src/commands/process/info/info.test.js +140 -38
  236. package/dist/src/commands/process/info/info.test.js.map +1 -1
  237. package/dist/src/commands/process/launch/launch.d.ts +11 -1
  238. package/dist/src/commands/process/launch/launch.d.ts.map +1 -1
  239. package/dist/src/commands/process/launch/launch.js +37 -7
  240. package/dist/src/commands/process/launch/launch.js.map +1 -1
  241. package/dist/src/commands/process/launch/launch.test.js +99 -20
  242. package/dist/src/commands/process/launch/launch.test.js.map +1 -1
  243. package/dist/src/commands/process/list/list.d.ts +2 -1
  244. package/dist/src/commands/process/list/list.d.ts.map +1 -1
  245. package/dist/src/commands/process/list/list.js +9 -6
  246. package/dist/src/commands/process/list/list.js.map +1 -1
  247. package/dist/src/commands/process/list/list.test.js +1 -0
  248. package/dist/src/commands/process/list/list.test.js.map +1 -1
  249. package/dist/src/commands/process/run/run.d.ts +9 -0
  250. package/dist/src/commands/process/run/run.d.ts.map +1 -1
  251. package/dist/src/commands/process/run/run.js +15 -5
  252. package/dist/src/commands/process/run/run.js.map +1 -1
  253. package/dist/src/commands/serve/serve.d.ts +2 -0
  254. package/dist/src/commands/serve/serve.d.ts.map +1 -1
  255. package/dist/src/commands/serve/serve.js +17 -4
  256. package/dist/src/commands/serve/serve.js.map +1 -1
  257. package/dist/src/commands/serve/serve.test.js +9 -2
  258. package/dist/src/commands/serve/serve.test.js.map +1 -1
  259. package/dist/src/commands/viewport/screenshot/screenshot.d.ts.map +1 -1
  260. package/dist/src/commands/viewport/screenshot/screenshot.js +4 -1
  261. package/dist/src/commands/viewport/screenshot/screenshot.js.map +1 -1
  262. package/dist/src/commands/viewport/screenshot/screenshot.test.js +5 -9
  263. package/dist/src/commands/viewport/screenshot/screenshot.test.js.map +1 -1
  264. package/dist/src/deploy/deploy-places.d.ts +39 -0
  265. package/dist/src/deploy/deploy-places.d.ts.map +1 -0
  266. package/dist/src/deploy/deploy-places.js +162 -0
  267. package/dist/src/deploy/deploy-places.js.map +1 -0
  268. package/dist/src/deploy/deploy-places.test.d.ts +2 -0
  269. package/dist/src/deploy/deploy-places.test.d.ts.map +1 -0
  270. package/dist/src/deploy/deploy-places.test.js +96 -0
  271. package/dist/src/deploy/deploy-places.test.js.map +1 -0
  272. package/dist/src/index.d.ts +2 -2
  273. package/dist/src/index.d.ts.map +1 -1
  274. package/dist/src/index.js +1 -1
  275. package/dist/src/index.js.map +1 -1
  276. package/dist/src/plugin/persistent-plugin-installer.d.ts.map +1 -1
  277. package/dist/src/plugin/persistent-plugin-installer.js +2 -1
  278. package/dist/src/plugin/persistent-plugin-installer.js.map +1 -1
  279. package/dist/src/plugin/persistent-plugin-installer.test.js +3 -0
  280. package/dist/src/plugin/persistent-plugin-installer.test.js.map +1 -1
  281. package/dist/src/plugin/plugin-build-version.d.ts +7 -0
  282. package/dist/src/plugin/plugin-build-version.d.ts.map +1 -0
  283. package/dist/src/plugin/plugin-build-version.js +42 -0
  284. package/dist/src/plugin/plugin-build-version.js.map +1 -0
  285. package/dist/src/plugin/plugin-build-version.test.d.ts +2 -0
  286. package/dist/src/plugin/plugin-build-version.test.d.ts.map +1 -0
  287. package/dist/src/plugin/plugin-build-version.test.js +41 -0
  288. package/dist/src/plugin/plugin-build-version.test.js.map +1 -0
  289. package/dist/src/plugin/plugin-injector.d.ts.map +1 -1
  290. package/dist/src/plugin/plugin-injector.js +7 -1
  291. package/dist/src/plugin/plugin-injector.js.map +1 -1
  292. package/dist/src/process/studio-process-closer.d.ts +35 -0
  293. package/dist/src/process/studio-process-closer.d.ts.map +1 -0
  294. package/dist/src/process/studio-process-closer.js +129 -0
  295. package/dist/src/process/studio-process-closer.js.map +1 -0
  296. package/dist/src/process/studio-process-closer.test.d.ts +2 -0
  297. package/dist/src/process/studio-process-closer.test.d.ts.map +1 -0
  298. package/dist/src/process/studio-process-closer.test.js +80 -0
  299. package/dist/src/process/studio-process-closer.test.js.map +1 -0
  300. package/dist/src/process/studio-settings.d.ts +14 -0
  301. package/dist/src/process/studio-settings.d.ts.map +1 -0
  302. package/dist/src/process/studio-settings.js +50 -0
  303. package/dist/src/process/studio-settings.js.map +1 -0
  304. package/dist/src/process/studio-settings.test.d.ts +2 -0
  305. package/dist/src/process/studio-settings.test.d.ts.map +1 -0
  306. package/dist/src/process/studio-settings.test.js +16 -0
  307. package/dist/src/process/studio-settings.test.js.map +1 -0
  308. package/dist/src/process/studio-window-state.d.ts +13 -0
  309. package/dist/src/process/studio-window-state.d.ts.map +1 -0
  310. package/dist/src/process/studio-window-state.js +48 -0
  311. package/dist/src/process/studio-window-state.js.map +1 -0
  312. package/dist/src/server/studio-bridge-server.d.ts +3 -1
  313. package/dist/src/server/studio-bridge-server.d.ts.map +1 -1
  314. package/dist/src/server/studio-bridge-server.js +12 -4
  315. package/dist/src/server/studio-bridge-server.js.map +1 -1
  316. package/dist/src/server/web-socket-protocol.d.ts +173 -6
  317. package/dist/src/server/web-socket-protocol.d.ts.map +1 -1
  318. package/dist/src/server/web-socket-protocol.js +244 -1
  319. package/dist/src/server/web-socket-protocol.js.map +1 -1
  320. package/dist/src/server/web-socket-protocol.test.js +48 -0
  321. package/dist/src/server/web-socket-protocol.test.js.map +1 -1
  322. package/dist/src/test/e2e/persistent-session.test.js +121 -0
  323. package/dist/src/test/e2e/persistent-session.test.js.map +1 -1
  324. package/dist/src/test/e2e/split-server.test.d.ts +3 -5
  325. package/dist/src/test/e2e/split-server.test.d.ts.map +1 -1
  326. package/dist/src/test/e2e/split-server.test.js +3 -5
  327. package/dist/src/test/e2e/split-server.test.js.map +1 -1
  328. package/dist/tsconfig.tsbuildinfo +1 -1
  329. package/docker/Dockerfile +3 -0
  330. package/package.json +8 -6
  331. package/src/bridge/bridge-connection.test.ts +126 -0
  332. package/src/bridge/bridge-connection.ts +217 -22
  333. package/src/bridge/bridge-session.test.ts +6 -4
  334. package/src/bridge/bridge-session.ts +273 -28
  335. package/src/bridge/index.ts +3 -0
  336. package/src/bridge/internal/bridge-client.test.ts +23 -0
  337. package/src/bridge/internal/bridge-client.ts +25 -7
  338. package/src/bridge/internal/bridge-host.test.ts +38 -0
  339. package/src/bridge/internal/bridge-host.ts +47 -0
  340. package/src/bridge/internal/hand-off.ts +4 -1
  341. package/src/bridge/internal/host-protocol.test.ts +15 -0
  342. package/src/bridge/internal/host-protocol.ts +148 -37
  343. package/src/bridge/internal/instance-state.ts +34 -0
  344. package/src/bridge/internal/transport-client.ts +2 -1
  345. package/src/bridge/internal/transport-server.ts +5 -1
  346. package/src/bridge/types.ts +47 -2
  347. package/src/cli/adapters/cli-command-adapter-handler.test.ts +28 -0
  348. package/src/cli/adapters/cli-command-adapter.ts +150 -18
  349. package/src/cli/adapters/group-builder.test.ts +34 -2
  350. package/src/cli/adapters/group-builder.ts +52 -20
  351. package/src/cli/adapters/help-formatter.test.ts +1 -1
  352. package/src/cli/adapters/help-formatter.ts +4 -3
  353. package/src/cli/adapters/playtest-edit-guard.test.ts +54 -0
  354. package/src/cli/args/global-args.ts +1 -1
  355. package/src/cli/cli-output-context.test.ts +55 -0
  356. package/src/cli/cli-output-context.ts +50 -0
  357. package/src/cli/cli.ts +49 -17
  358. package/src/cli/managed-studio-run.test.ts +71 -0
  359. package/src/cli/managed-studio-run.ts +135 -0
  360. package/src/cli/resolve-session.test.ts +1 -1
  361. package/src/cli/resolve-session.ts +1 -1
  362. package/src/cli/script-executor.ts +99 -51
  363. package/src/commands/console/exec/exec.test.ts +96 -3
  364. package/src/commands/console/exec/exec.ts +59 -6
  365. package/src/commands/console/exec/execute.lua +356 -240
  366. package/src/commands/console/exec/execute.spec.lua +286 -0
  367. package/src/commands/console/logs/logs.test.ts +76 -4
  368. package/src/commands/console/logs/logs.ts +132 -17
  369. package/src/commands/console/logs/query-logs.lua +85 -52
  370. package/src/commands/console/logs/query-logs.spec.lua +132 -0
  371. package/src/commands/explorer/export/export-instances.lua +108 -0
  372. package/src/commands/explorer/export/export-instances.spec.lua +87 -0
  373. package/src/commands/explorer/export/export.test.ts +27 -0
  374. package/src/commands/explorer/export/export.ts +60 -0
  375. package/src/commands/explorer/find/find-instances.lua +174 -0
  376. package/src/commands/explorer/find/find-instances.spec.lua +122 -0
  377. package/src/commands/explorer/find/find.test.ts +53 -0
  378. package/src/commands/explorer/find/find.ts +113 -0
  379. package/src/commands/explorer/grep/grep-scripts.lua +214 -0
  380. package/src/commands/explorer/grep/grep-scripts.spec.lua +130 -0
  381. package/src/commands/explorer/grep/grep.test.ts +45 -0
  382. package/src/commands/explorer/grep/grep.ts +93 -0
  383. package/src/commands/explorer/import/import-instances.lua +106 -0
  384. package/src/commands/explorer/import/import-instances.spec.lua +84 -0
  385. package/src/commands/explorer/import/import.test.ts +60 -0
  386. package/src/commands/explorer/import/import.ts +66 -0
  387. package/src/commands/explorer/query/query-data-model.lua +124 -152
  388. package/src/commands/explorer/query/query-data-model.spec.lua +150 -0
  389. package/src/commands/formatters.test.ts +7 -1
  390. package/src/commands/framework/action-loader.test.ts +28 -0
  391. package/src/commands/framework/action-loader.ts +10 -2
  392. package/src/commands/framework/arg-builder.ts +26 -3
  393. package/src/commands/framework/define-command.ts +32 -3
  394. package/src/commands/framework/index.ts +1 -0
  395. package/src/commands/index.ts +50 -0
  396. package/src/commands/linux/inject-credentials/inject-credentials.ts +1 -3
  397. package/src/commands/linux/setup/setup.ts +1 -3
  398. package/src/commands/linux/status/status.ts +105 -98
  399. package/src/commands/playtest/player/add/add.ts +85 -0
  400. package/src/commands/playtest/player/list/list.ts +57 -0
  401. package/src/commands/playtest/player/playtest-players.test.ts +146 -0
  402. package/src/commands/playtest/player/playtest-players.ts +270 -0
  403. package/src/commands/playtest/player/remove/remove.ts +78 -0
  404. package/src/commands/playtest/playtest-sessions.test.ts +143 -0
  405. package/src/commands/playtest/playtest-sessions.ts +417 -0
  406. package/src/commands/playtest/restart/restart.ts +199 -0
  407. package/src/commands/playtest/run/playtest-runner.luau +264 -0
  408. package/src/commands/playtest/run/playtest-runner.spec.lua +71 -0
  409. package/src/commands/playtest/run/run-playtest-script.lua +139 -0
  410. package/src/commands/playtest/run/run-playtest-script.spec.lua +43 -0
  411. package/src/commands/playtest/run/run.ts +239 -0
  412. package/src/commands/playtest/start/start-playtest.lua +108 -0
  413. package/src/commands/playtest/start/start.ts +138 -0
  414. package/src/commands/playtest/stop/end-playtest.lua +47 -0
  415. package/src/commands/playtest/stop/stop.ts +51 -0
  416. package/src/commands/process/close/close.test.ts +250 -0
  417. package/src/commands/process/close/close.ts +183 -17
  418. package/src/commands/process/info/info.test.ts +198 -44
  419. package/src/commands/process/info/info.ts +204 -15
  420. package/src/commands/process/info/query-state.lua +42 -29
  421. package/src/commands/process/info/query-state.spec.lua +39 -0
  422. package/src/commands/process/launch/launch.test.ts +138 -21
  423. package/src/commands/process/launch/launch.ts +69 -9
  424. package/src/commands/process/list/list.test.ts +1 -0
  425. package/src/commands/process/list/list.ts +14 -6
  426. package/src/commands/process/run/run.ts +26 -5
  427. package/src/commands/serve/serve.test.ts +17 -2
  428. package/src/commands/serve/serve.ts +25 -6
  429. package/src/commands/viewport/screenshot/capture-screenshot.lua +175 -182
  430. package/src/commands/viewport/screenshot/capture-screenshot.spec.lua +129 -0
  431. package/src/commands/viewport/screenshot/screenshot.test.ts +7 -10
  432. package/src/commands/viewport/screenshot/screenshot.ts +6 -1
  433. package/src/deploy/deploy-places.test.ts +127 -0
  434. package/src/deploy/deploy-places.ts +229 -0
  435. package/src/index.ts +11 -0
  436. package/src/plugin/persistent-plugin-installer.test.ts +4 -0
  437. package/src/plugin/persistent-plugin-installer.ts +2 -1
  438. package/src/plugin/plugin-build-version.test.ts +55 -0
  439. package/src/plugin/plugin-build-version.ts +53 -0
  440. package/src/plugin/plugin-injector.ts +7 -1
  441. package/src/process/studio-process-closer.test.ts +107 -0
  442. package/src/process/studio-process-closer.ts +187 -0
  443. package/src/process/studio-settings.test.ts +18 -0
  444. package/src/process/studio-settings.ts +61 -0
  445. package/src/process/studio-window-state.ts +65 -0
  446. package/src/server/studio-bridge-server.ts +15 -4
  447. package/src/server/web-socket-protocol.test.ts +55 -0
  448. package/src/server/web-socket-protocol.ts +468 -8
  449. package/src/test/e2e/persistent-session.test.ts +137 -0
  450. package/src/test/e2e/split-server.test.ts +3 -5
  451. package/templates/studio-bridge-plugin/default.project.json +3 -0
  452. package/templates/studio-bridge-plugin/src/Shared/ActionRouter.lua +208 -159
  453. package/templates/studio-bridge-plugin/src/Shared/ActionRouter.spec.lua +418 -0
  454. package/templates/studio-bridge-plugin/src/Shared/BuiltInActions.lua +94 -0
  455. package/templates/studio-bridge-plugin/src/Shared/BuiltInActions.spec.lua +166 -0
  456. package/templates/studio-bridge-plugin/src/Shared/DiscoveryStateMachine.lua +118 -137
  457. package/templates/studio-bridge-plugin/src/Shared/DiscoveryStateMachine.spec.lua +228 -0
  458. package/templates/studio-bridge-plugin/src/Shared/MessageBuffer.lua +80 -109
  459. package/templates/studio-bridge-plugin/src/Shared/MessageBuffer.spec.lua +116 -0
  460. package/templates/studio-bridge-plugin/src/Shared/StudioBridgeConnection.lua +233 -0
  461. package/templates/studio-bridge-plugin/src/Shared/StudioBridgeConnection.spec.lua +239 -0
  462. package/templates/studio-bridge-plugin/src/Shared/StudioBridgeLogUtils.lua +53 -0
  463. package/templates/studio-bridge-plugin/src/Shared/StudioBridgeLogUtils.spec.lua +27 -0
  464. package/templates/studio-bridge-plugin/src/Shared/StudioBridgeSessionUtils.lua +164 -0
  465. package/templates/studio-bridge-plugin/src/Shared/StudioBridgeSessionUtils.spec.lua +159 -0
  466. package/templates/studio-bridge-plugin/src/StudioBridgePlugin.server.lua +266 -368
  467. package/templates/studio-bridge-plugin/src/Vendor/png.lua +8 -2
  468. package/test/default.project.json +41 -0
  469. package/test/jest.config.lua +3 -0
  470. package/test/scripts/Server/ServerMain.server.lua +10 -0
  471. package/tsconfig.json +1 -0
  472. package/templates/studio-bridge-plugin/src/Shared/Protocol.lua +0 -132
  473. package/templates/studio-bridge-plugin-test/test/actions.test.lua +0 -580
  474. package/templates/studio-bridge-plugin-test/test/discovery.test.lua +0 -622
  475. package/templates/studio-bridge-plugin-test/test/execute-handler.test.lua +0 -517
  476. package/templates/studio-bridge-plugin-test/test/hash-lifecycle.test.lua +0 -814
  477. package/templates/studio-bridge-plugin-test/test/integration.test.lua +0 -1020
  478. package/templates/studio-bridge-plugin-test/test/new-actions.test.lua +0 -339
  479. package/templates/studio-bridge-plugin-test/test/plugin-entry.test.lua +0 -493
  480. package/templates/studio-bridge-plugin-test/test/protocol.test.lua +0 -506
  481. package/templates/studio-bridge-plugin-test/test/roblox-mocks.lua +0 -108
  482. package/templates/studio-bridge-plugin-test/test/test-runner.lua +0 -112
@@ -0,0 +1,187 @@
1
+ /**
2
+ * Finds running Roblox Studio processes and closes them. The plugin API has
3
+ * no process id, so a bridge session is matched to its process by the place
4
+ * name Studio shows in the window title, or by the place id a cloud place was
5
+ * launched with.
6
+ */
7
+
8
+ import { execa } from 'execa';
9
+
10
+ const WINDOW_TITLE_SUFFIX = ' - Roblox Studio';
11
+ const EXIT_POLL_INTERVAL_MS = 250;
12
+
13
+ export interface RunningStudioProcess {
14
+ pid: number;
15
+ windowTitle: string;
16
+ commandLine?: string;
17
+ }
18
+
19
+ export interface CloseStudioOptions {
20
+ force?: boolean;
21
+ exitTimeoutMs?: number;
22
+ }
23
+
24
+ export async function listStudioProcessesAsync(): Promise<
25
+ RunningStudioProcess[]
26
+ > {
27
+ if (process.platform === 'win32') {
28
+ const { stdout } = await execa(
29
+ 'powershell.exe',
30
+ [
31
+ '-NoProfile',
32
+ '-NonInteractive',
33
+ '-Command',
34
+ '@(Get-CimInstance Win32_Process -Filter "Name=\'RobloxStudioBeta.exe\'" | ForEach-Object { [pscustomobject]@{ Id = $_.ProcessId; MainWindowTitle = (Get-Process -Id $_.ProcessId -ErrorAction SilentlyContinue).MainWindowTitle; CommandLine = $_.CommandLine } }) | ConvertTo-Json -Compress',
35
+ ],
36
+ { reject: false }
37
+ );
38
+ return parseWindowsProcessList(stdout);
39
+ }
40
+
41
+ if (process.platform === 'darwin') {
42
+ const { stdout } = await execa('ps', ['-axo', 'pid=,command='], {
43
+ reject: false,
44
+ });
45
+ return parseMacProcessList(stdout);
46
+ }
47
+
48
+ throw new Error(`Closing Studio is not supported on ${process.platform}`);
49
+ }
50
+
51
+ export function parseWindowsProcessList(
52
+ stdout: string
53
+ ): RunningStudioProcess[] {
54
+ const trimmed = stdout.trim();
55
+ if (!trimmed) return [];
56
+
57
+ type Entry = {
58
+ Id: number;
59
+ MainWindowTitle: string | null;
60
+ CommandLine?: string | null;
61
+ };
62
+ const parsed = JSON.parse(trimmed) as Entry | Entry[];
63
+ const entries = Array.isArray(parsed) ? parsed : [parsed];
64
+
65
+ return entries.map((entry) => ({
66
+ pid: entry.Id,
67
+ windowTitle: entry.MainWindowTitle ?? '',
68
+ commandLine: entry.CommandLine ?? undefined,
69
+ }));
70
+ }
71
+
72
+ export function parseMacProcessList(stdout: string): RunningStudioProcess[] {
73
+ const processes: RunningStudioProcess[] = [];
74
+ for (const line of stdout.split('\n')) {
75
+ const match =
76
+ /^\s*(\d+)\s+(.*RobloxStudio\.app\/Contents\/MacOS\/RobloxStudio.*)$/.exec(
77
+ line
78
+ );
79
+ if (match) {
80
+ processes.push({
81
+ pid: Number(match[1]),
82
+ windowTitle: match[2],
83
+ commandLine: match[2],
84
+ });
85
+ }
86
+ }
87
+ return processes;
88
+ }
89
+
90
+ /**
91
+ * Processes whose window shows the given place. Studio titles a local file
92
+ * by its full path and a cloud place by its name on the website, which the
93
+ * plugin can't see, so with no title match a cloud place is found by the
94
+ * `placeId` Studio was launched with.
95
+ */
96
+ export function matchStudioProcesses(
97
+ processes: RunningStudioProcess[],
98
+ placeName: string,
99
+ placeId?: number
100
+ ): RunningStudioProcess[] {
101
+ const byTitle = processes.filter((proc) => {
102
+ const title = proc.windowTitle.endsWith(WINDOW_TITLE_SUFFIX)
103
+ ? proc.windowTitle.slice(0, -WINDOW_TITLE_SUFFIX.length)
104
+ : proc.windowTitle;
105
+
106
+ return (
107
+ title === placeName ||
108
+ title.endsWith(`\\${placeName}`) ||
109
+ title.endsWith(`/${placeName}`)
110
+ );
111
+ });
112
+ if (byTitle.length > 0 || !placeId) {
113
+ return byTitle;
114
+ }
115
+ return matchStudioProcessesByPlaceId(processes, placeId);
116
+ }
117
+
118
+ /** Processes Studio launched with `placeId`, as `process launch` and the website's "Edit in Studio" do. */
119
+ export function matchStudioProcessesByPlaceId(
120
+ processes: RunningStudioProcess[],
121
+ placeId: number
122
+ ): RunningStudioProcess[] {
123
+ const launchedPlaceId = new RegExp(`placeId:${placeId}(\\D|$)`);
124
+ return processes.filter(
125
+ (proc) => proc.commandLine && launchedPlaceId.test(proc.commandLine)
126
+ );
127
+ }
128
+
129
+ /**
130
+ * Close a Studio process. Without `force` Studio is asked to close its
131
+ * window, which it can refuse by prompting to save. Resolves whether the
132
+ * process exited within the timeout.
133
+ */
134
+ export async function closeStudioProcessAsync(
135
+ pid: number,
136
+ options: CloseStudioOptions = {}
137
+ ): Promise<boolean> {
138
+ const { force = false, exitTimeoutMs = 10_000 } = options;
139
+
140
+ if (process.platform === 'win32') {
141
+ if (force) {
142
+ await execa('taskkill', ['/F', '/T', '/PID', String(pid)], {
143
+ reject: false,
144
+ });
145
+ } else {
146
+ await execa(
147
+ 'powershell.exe',
148
+ [
149
+ '-NoProfile',
150
+ '-NonInteractive',
151
+ '-Command',
152
+ `(Get-Process -Id ${pid} -ErrorAction SilentlyContinue).CloseMainWindow() | Out-Null`,
153
+ ],
154
+ { reject: false }
155
+ );
156
+ }
157
+ } else {
158
+ try {
159
+ process.kill(pid, force ? 'SIGKILL' : 'SIGTERM');
160
+ } catch {
161
+ return !isProcessRunning(pid);
162
+ }
163
+ }
164
+
165
+ return waitForExitAsync(pid, exitTimeoutMs);
166
+ }
167
+
168
+ export function isProcessRunning(pid: number): boolean {
169
+ try {
170
+ process.kill(pid, 0);
171
+ return true;
172
+ } catch (err) {
173
+ return (err as NodeJS.ErrnoException).code === 'EPERM';
174
+ }
175
+ }
176
+
177
+ async function waitForExitAsync(
178
+ pid: number,
179
+ timeoutMs: number
180
+ ): Promise<boolean> {
181
+ const deadline = Date.now() + timeoutMs;
182
+ while (Date.now() < deadline) {
183
+ if (!isProcessRunning(pid)) return true;
184
+ await new Promise((resolve) => setTimeout(resolve, EXIT_POLL_INTERVAL_MS));
185
+ }
186
+ return !isProcessRunning(pid);
187
+ }
@@ -0,0 +1,18 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { parseBoolSetting } from './studio-settings.js';
3
+
4
+ describe('parseBoolSetting', () => {
5
+ const xml = `<Item class="UserSettings"><Properties>
6
+ <bool name="LoadAllBuiltinPluginsInRunModes">true</bool>
7
+ <bool name="LoadUserPluginsInRunModes">false</bool>
8
+ </Properties></Item>`;
9
+
10
+ it('reads the named setting, not one whose name contains it', () => {
11
+ expect(parseBoolSetting(xml, 'LoadUserPluginsInRunModes')).toBe(false);
12
+ expect(parseBoolSetting(xml, 'LoadAllBuiltinPluginsInRunModes')).toBe(true);
13
+ });
14
+
15
+ it('is undefined for a setting the file does not have', () => {
16
+ expect(parseBoolSetting(xml, 'Missing')).toBeUndefined();
17
+ });
18
+ });
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Reads Studio's own settings from the file it saves them to, for settings a
3
+ * plugin can't read.
4
+ */
5
+
6
+ import * as fs from 'fs/promises';
7
+ import * as path from 'path';
8
+ import { findPluginsFolder } from './studio-process-manager.js';
9
+
10
+ /** The XML name of Studio's "Load user plugins on playtest" setting. */
11
+ const LOAD_USER_PLUGINS_ON_PLAYTEST = 'LoadUserPluginsInRunModes';
12
+
13
+ /**
14
+ * Whether Studio's "Load user plugins on playtest" setting is on. Without it,
15
+ * the plugin doesn't load into a playtest's DataModels, so they never connect
16
+ * to the bridge. Undefined when the setting can't be read, e.g. on macOS,
17
+ * whose settings file isn't located here.
18
+ */
19
+ export async function tryReadLoadUserPluginsOnPlaytestAsync(): Promise<
20
+ boolean | undefined
21
+ > {
22
+ const settingsPath = findGlobalSettingsPath();
23
+ if (!settingsPath) {
24
+ return undefined;
25
+ }
26
+
27
+ let xml: string;
28
+ try {
29
+ xml = await fs.readFile(settingsPath, 'utf8');
30
+ } catch {
31
+ return undefined;
32
+ }
33
+ return parseBoolSetting(xml, LOAD_USER_PLUGINS_ON_PLAYTEST);
34
+ }
35
+
36
+ /** Reads `<bool name="...">true|false</bool>` from a Studio settings file. */
37
+ export function parseBoolSetting(
38
+ xml: string,
39
+ name: string
40
+ ): boolean | undefined {
41
+ const match = new RegExp(
42
+ `<bool name="${name}">\\s*(true|false)\\s*</bool>`
43
+ ).exec(xml);
44
+ return match ? match[1] === 'true' : undefined;
45
+ }
46
+
47
+ /** Studio keeps its settings beside the plugins folder on Windows and under Wine. */
48
+ function findGlobalSettingsPath(): string | undefined {
49
+ if (process.platform !== 'win32' && process.platform !== 'linux') {
50
+ return undefined;
51
+ }
52
+ try {
53
+ const robloxDir =
54
+ process.platform === 'linux'
55
+ ? path.posix.dirname(findPluginsFolder())
56
+ : path.dirname(findPluginsFolder());
57
+ return path.join(robloxDir, 'GlobalSettings_13.xml');
58
+ } catch {
59
+ return undefined;
60
+ }
61
+ }
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Reads whether a Studio window is focused or minimized. The plugin API
3
+ * cannot see either, so this asks the OS about the process the session's
4
+ * place is showing in.
5
+ */
6
+
7
+ import { execa } from 'execa';
8
+
9
+ export interface StudioWindowState {
10
+ focused: boolean;
11
+ minimized: boolean;
12
+ }
13
+
14
+ const WINDOW_STATE_SCRIPT = `
15
+ Add-Type -Namespace StudioBridge -Name User32 -MemberDefinition @'
16
+ [DllImport("user32.dll")] public static extern bool IsIconic(IntPtr hWnd);
17
+ [DllImport("user32.dll")] public static extern IntPtr GetForegroundWindow();
18
+ [DllImport("user32.dll")] public static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint processId);
19
+ '@
20
+ $process = Get-Process -Id $args[0] -ErrorAction Stop
21
+ $foregroundPid = [uint32]0
22
+ [void][StudioBridge.User32]::GetWindowThreadProcessId([StudioBridge.User32]::GetForegroundWindow(), [ref]$foregroundPid)
23
+ @{
24
+ minimized = [StudioBridge.User32]::IsIconic($process.MainWindowHandle)
25
+ focused = ($foregroundPid -eq $process.Id)
26
+ } | ConvertTo-Json -Compress
27
+ `;
28
+
29
+ /** Undefined where the OS gives no answer, including outside Windows. */
30
+ export async function tryGetStudioWindowStateAsync(
31
+ pid: number
32
+ ): Promise<StudioWindowState | undefined> {
33
+ if (process.platform !== 'win32') return undefined;
34
+
35
+ const { stdout, failed } = await execa(
36
+ 'powershell.exe',
37
+ [
38
+ '-NoProfile',
39
+ '-NonInteractive',
40
+ '-Command',
41
+ `& { ${WINDOW_STATE_SCRIPT} } ${pid}`,
42
+ ],
43
+ { reject: false }
44
+ );
45
+ if (failed) return undefined;
46
+
47
+ return parseWindowState(stdout);
48
+ }
49
+
50
+ export function parseWindowState(
51
+ stdout: string
52
+ ): StudioWindowState | undefined {
53
+ try {
54
+ const parsed = JSON.parse(stdout.trim()) as Partial<StudioWindowState>;
55
+ if (
56
+ typeof parsed.focused !== 'boolean' ||
57
+ typeof parsed.minimized !== 'boolean'
58
+ ) {
59
+ return undefined;
60
+ }
61
+ return { focused: parsed.focused, minimized: parsed.minimized };
62
+ } catch {
63
+ return undefined;
64
+ }
65
+ }
@@ -29,6 +29,7 @@ import {
29
29
  type SerializedReturnValue,
30
30
  encodeMessage,
31
31
  decodePluginMessage,
32
+ MAX_MESSAGE_BYTES,
32
33
  } from './web-socket-protocol.js';
33
34
  import { ActionDispatcher } from './action-dispatcher.js';
34
35
  import {
@@ -102,6 +103,8 @@ export interface ExecuteOptions {
102
103
  timeoutMs?: number;
103
104
  /** Callback for each output message */
104
105
  onOutput?: (level: OutputLevel, body: string) => void;
106
+ /** Passed to the script as `...`. */
107
+ args?: string[];
105
108
  }
106
109
 
107
110
  export interface StudioBridgeResult {
@@ -110,7 +113,7 @@ export interface StudioBridgeResult {
110
113
  /**
111
114
  * Everything the script returned, in order, marshalled by the plugin.
112
115
  * Absent whenever no `scriptComplete` carrying a return channel arrived —
113
- * a timeout, a disconnect, a plugin error, or an older plugin build — which
116
+ * a timeout, a disconnect, or a plugin error — which
114
117
  * is what separates "we never learned what it returned" from `[]`, "it
115
118
  * returned nothing".
116
119
  */
@@ -320,7 +323,10 @@ export class StudioBridgeServer {
320
323
 
321
324
  // 1. Start HTTP + WebSocket server (unique path rejects wrong connections at upgrade level)
322
325
  this._httpServer = http.createServer();
323
- this._wss = new WebSocketServer({ noServer: true });
326
+ this._wss = new WebSocketServer({
327
+ noServer: true,
328
+ maxPayload: MAX_MESSAGE_BYTES,
329
+ });
324
330
  const port = await startHttpAndWsServerAsync(
325
331
  this._httpServer,
326
332
  this._wss,
@@ -402,7 +408,12 @@ export class StudioBridgeServer {
402
408
  encodeMessage({
403
409
  type: 'execute',
404
410
  sessionId: this._sessionId,
405
- payload: { script: options.scriptContent },
411
+ payload: {
412
+ script: options.scriptContent,
413
+ ...(options.args && options.args.length > 0
414
+ ? { args: options.args }
415
+ : {}),
416
+ },
406
417
  })
407
418
  );
408
419
 
@@ -482,7 +493,7 @@ export class StudioBridgeServer {
482
493
  const syncResult = await this.performActionAsync<PluginMessage>(
483
494
  {
484
495
  type: 'syncActions',
485
- payload: { actions },
496
+ payload: { actions, verbose: OutputHelper.isVerbose() },
486
497
  },
487
498
  10_000
488
499
  );
@@ -325,6 +325,39 @@ describe('decodePluginMessage', () => {
325
325
  });
326
326
  });
327
327
 
328
+ describe('exportInstancesResult / importInstancesResult', () => {
329
+ it('decodes an exported model', () => {
330
+ const msg = {
331
+ type: 'exportInstancesResult',
332
+ sessionId: 'sess-1',
333
+ requestId: 'req-1',
334
+ payload: { data: 'PHJvYmxveCE=', paths: ['Workspace.Map'] },
335
+ };
336
+ expect(roundTripPlugin(msg)).toEqual(msg);
337
+ });
338
+
339
+ it('rejects an export without data', () => {
340
+ expect(
341
+ roundTripPlugin({
342
+ type: 'exportInstancesResult',
343
+ sessionId: 'sess-1',
344
+ requestId: 'req-1',
345
+ payload: { paths: ['Workspace.Map'] },
346
+ })
347
+ ).toBeNull();
348
+ });
349
+
350
+ it('decodes the imported paths', () => {
351
+ const msg = {
352
+ type: 'importInstancesResult',
353
+ sessionId: 'sess-1',
354
+ requestId: 'req-1',
355
+ payload: { paths: ['Workspace.Map'] },
356
+ };
357
+ expect(roundTripPlugin(msg)).toEqual(msg);
358
+ });
359
+ });
360
+
328
361
  describe('logsResult', () => {
329
362
  it('decodes a valid logsResult', () => {
330
363
  const msg = roundTripPlugin({
@@ -660,6 +693,28 @@ describe('encodeMessage / decodeServerMessage', () => {
660
693
  });
661
694
  });
662
695
 
696
+ describe('exportInstances / importInstances', () => {
697
+ it('round-trips exportInstances', () => {
698
+ const msg: ServerMessage = {
699
+ type: 'exportInstances',
700
+ sessionId: 'sess-1',
701
+ requestId: 'req-1',
702
+ payload: { paths: ['Workspace.Map', 'Lighting'] },
703
+ };
704
+ expect(roundTripServer(msg)).toEqual(msg);
705
+ });
706
+
707
+ it('round-trips importInstances', () => {
708
+ const msg: ServerMessage = {
709
+ type: 'importInstances',
710
+ sessionId: 'sess-1',
711
+ requestId: 'req-1',
712
+ payload: { data: 'PHJvYmxveCE=', parentPath: 'Workspace' },
713
+ };
714
+ expect(roundTripServer(msg)).toEqual(msg);
715
+ });
716
+ });
717
+
663
718
  describe('queryLogs', () => {
664
719
  it('round-trips queryLogs with all options', () => {
665
720
  const msg: ServerMessage = {