@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
@@ -13,12 +13,28 @@ export type StudioState =
13
13
  | 'Server'
14
14
  | 'Client';
15
15
 
16
+ export type PluginContext = 'edit' | 'client' | 'server';
17
+
18
+ /**
19
+ * The largest message a bridge socket accepts. The plugin refuses to send a
20
+ * reply over half this with RESULT_TOO_LARGE, so a large result fails its own
21
+ * request instead of closing the socket under every request in flight.
22
+ * Studio itself sends messages of at least 512 MiB.
23
+ */
24
+ export const MAX_MESSAGE_BYTES = 512 * 1024 * 1024;
25
+
16
26
  export type Capability =
17
27
  | 'execute'
18
28
  | 'queryState'
19
29
  | 'captureScreenshot'
20
30
  | 'queryDataModel'
21
31
  | 'queryLogs'
32
+ | 'exportInstances'
33
+ | 'importInstances'
34
+ | 'findInstances'
35
+ | 'grepScripts'
36
+ | 'startPlaytest'
37
+ | 'endPlaytest'
22
38
  | 'heartbeat'
23
39
  | 'registerAction'
24
40
  | 'syncActions';
@@ -31,8 +47,10 @@ export type ErrorCode =
31
47
  | 'INSTANCE_NOT_FOUND'
32
48
  | 'PROPERTY_NOT_FOUND'
33
49
  | 'SCREENSHOT_FAILED'
50
+ | 'RESULT_TOO_LARGE'
34
51
  | 'SCRIPT_LOAD_ERROR'
35
52
  | 'SCRIPT_RUNTIME_ERROR'
53
+ | 'SCRIPT_TIMEOUT'
36
54
  | 'BUSY'
37
55
  | 'SESSION_MISMATCH'
38
56
  | 'INTERNAL_ERROR';
@@ -114,11 +132,13 @@ export interface ScriptCompleteMessage extends BaseMessage {
114
132
  payload: {
115
133
  success: boolean;
116
134
  error?: string;
135
+ /** Where a runtime error was thrown, as `debug.traceback` prints it. */
136
+ traceback?: string;
117
137
  output?: Array<{ level: string; body: string; timestamp: number }>;
118
138
  /**
119
139
  * Everything the script returned, in order, marshalled by the plugin.
120
- * Absent when the plugin never reported a return channel (an older plugin
121
- * build, or a script that failed before returning) — distinct from `[]`,
140
+ * Absent when the plugin never reported a return channel (a script that
141
+ * failed before returning) — distinct from `[]`,
122
142
  * which means the script ran and returned nothing.
123
143
  */
124
144
  returnValues?: SerializedReturnValue[];
@@ -133,7 +153,13 @@ export interface RegisterMessage extends PushMessage {
133
153
  placeName: string;
134
154
  placeFile?: string;
135
155
  state: StudioState;
156
+ /** Which DataModel the plugin runs in. Older plugins leave it out. */
157
+ context?: PluginContext;
136
158
  pid?: number;
159
+ /** Set when `process run` launched this Studio, from the place it opened. */
160
+ launchId?: string;
161
+ /** The player of a multiplayer test client. */
162
+ playerName?: string;
137
163
  capabilities: Capability[];
138
164
  };
139
165
  }
@@ -145,6 +171,10 @@ export interface StateResultMessage extends RequestMessage {
145
171
  placeId: number;
146
172
  placeName: string;
147
173
  gameId: number;
174
+ /** The camera's viewport in pixels. Absent without a camera. */
175
+ viewportSize?: [number, number];
176
+ /** Studio's version, such as `0.744.0.7440803`. Absent from older plugins. */
177
+ studioVersion?: string;
148
178
  };
149
179
  }
150
180
 
@@ -165,6 +195,56 @@ export interface DataModelResultMessage extends RequestMessage {
165
195
  };
166
196
  }
167
197
 
198
+ export interface ExportInstancesResultMessage extends RequestMessage {
199
+ type: 'exportInstancesResult';
200
+ payload: {
201
+ /** The binary model (.rbxm), base64-encoded. */
202
+ data: string;
203
+ paths: string[];
204
+ };
205
+ }
206
+
207
+ export interface ImportInstancesResultMessage extends RequestMessage {
208
+ type: 'importInstancesResult';
209
+ payload: {
210
+ paths: string[];
211
+ };
212
+ }
213
+
214
+ export interface FoundInstance {
215
+ path: string;
216
+ name: string;
217
+ className: string;
218
+ }
219
+
220
+ export interface FindInstancesResultMessage extends RequestMessage {
221
+ type: 'findInstancesResult';
222
+ payload: {
223
+ instances: FoundInstance[];
224
+ /** How many instances were looked at. */
225
+ searched: number;
226
+ /** True when the search stopped at the limit. */
227
+ truncated: boolean;
228
+ };
229
+ }
230
+
231
+ export interface GrepMatch {
232
+ path: string;
233
+ className: string;
234
+ line: number;
235
+ text: string;
236
+ }
237
+
238
+ export interface GrepScriptsResultMessage extends RequestMessage {
239
+ type: 'grepScriptsResult';
240
+ payload: {
241
+ matches: GrepMatch[];
242
+ searched: number;
243
+ /** True when the search stopped at the limit. */
244
+ truncated: boolean;
245
+ };
246
+ }
247
+
168
248
  export interface LogsResultMessage extends RequestMessage {
169
249
  type: 'logsResult';
170
250
  payload: {
@@ -172,6 +252,10 @@ export interface LogsResultMessage extends RequestMessage {
172
252
  level: OutputLevel;
173
253
  body: string;
174
254
  timestamp: number;
255
+ /** With groupRepeats: how many identical entries in a row this stands for. */
256
+ repeats?: number;
257
+ /** With groupRepeats: when the last of the repeats was logged. */
258
+ lastTimestamp?: number;
175
259
  }>;
176
260
  total: number;
177
261
  bufferCapacity: number;
@@ -214,6 +298,28 @@ export interface SyncActionsResultMessage extends RequestMessage {
214
298
  };
215
299
  }
216
300
 
301
+ export type PlaytestMode = 'play' | 'run';
302
+
303
+ export interface PlaytestEndedMessage extends RequestMessage {
304
+ type: 'playtestEnded';
305
+ payload: {
306
+ playtestId: string;
307
+ success: boolean;
308
+ error?: string;
309
+ };
310
+ }
311
+
312
+ export interface EndPlaytestResultMessage extends RequestMessage {
313
+ type: 'endPlaytestResult';
314
+ payload: {
315
+ playtestId?: string;
316
+ /** Absent from plugins older than this field. */
317
+ mode?: PlaytestMode;
318
+ /** How many players a multiplayer test started with. */
319
+ players?: number;
320
+ };
321
+ }
322
+
217
323
  export interface PluginErrorMessage extends BaseMessage {
218
324
  type: 'error';
219
325
  requestId?: string;
@@ -230,11 +336,17 @@ export type PluginMessage =
230
336
  | StateResultMessage
231
337
  | ScreenshotResultMessage
232
338
  | DataModelResultMessage
339
+ | ExportInstancesResultMessage
340
+ | ImportInstancesResultMessage
341
+ | FindInstancesResultMessage
342
+ | GrepScriptsResultMessage
233
343
  | LogsResultMessage
234
344
  | StateChangeMessage
235
345
  | HeartbeatMessage
236
346
  | RegisterActionResultMessage
237
347
  | SyncActionsResultMessage
348
+ | PlaytestEndedMessage
349
+ | EndPlaytestResultMessage
238
350
  | PluginErrorMessage;
239
351
 
240
352
  export interface ExecuteMessage extends BaseMessage {
@@ -242,6 +354,10 @@ export interface ExecuteMessage extends BaseMessage {
242
354
  requestId?: string;
243
355
  payload: {
244
356
  script: string;
357
+ /** The plugin cancels the script once it runs this long. */
358
+ timeoutMs?: number;
359
+ /** Passed to the script as `...`. */
360
+ args?: string[];
245
361
  };
246
362
  }
247
363
 
@@ -262,6 +378,51 @@ export interface CaptureScreenshotMessage extends RequestMessage {
262
378
  };
263
379
  }
264
380
 
381
+ export interface ExportInstancesMessage extends RequestMessage {
382
+ type: 'exportInstances';
383
+ payload: {
384
+ paths: string[];
385
+ };
386
+ }
387
+
388
+ export interface ImportInstancesMessage extends RequestMessage {
389
+ type: 'importInstances';
390
+ payload: {
391
+ /** The binary model (.rbxm), base64-encoded. */
392
+ data: string;
393
+ parentPath: string;
394
+ };
395
+ }
396
+
397
+ export interface FindInstancesMessage extends RequestMessage {
398
+ type: 'findInstances';
399
+ payload: {
400
+ /** Dot-separated path to search under. Defaults to the whole DataModel. */
401
+ root?: string;
402
+ /** Matched case-insensitively anywhere in the name. */
403
+ name?: string;
404
+ /** Match the whole name instead. */
405
+ exactName?: boolean;
406
+ /** Matched with IsA. */
407
+ className?: string;
408
+ tag?: string;
409
+ limit?: number;
410
+ };
411
+ }
412
+
413
+ export interface GrepScriptsMessage extends RequestMessage {
414
+ type: 'grepScripts';
415
+ payload: {
416
+ pattern: string;
417
+ /** Dot-separated path to search under. Defaults to the whole DataModel. */
418
+ root?: string;
419
+ /** Treat `pattern` as a Lua pattern instead of plain text. */
420
+ luaPattern?: boolean;
421
+ caseSensitive?: boolean;
422
+ limit?: number;
423
+ };
424
+ }
425
+
265
426
  export interface QueryDataModelMessage extends RequestMessage {
266
427
  type: 'queryDataModel';
267
428
  payload: {
@@ -281,6 +442,10 @@ export interface QueryLogsMessage extends RequestMessage {
281
442
  direction?: 'head' | 'tail';
282
443
  levels?: OutputLevel[];
283
444
  includeInternal?: boolean;
445
+ /** Only entries logged at or after this time, in epoch seconds. */
446
+ since?: number;
447
+ /** Collapse identical consecutive entries, before `count` applies. */
448
+ groupRepeats?: boolean;
284
449
  };
285
450
  }
286
451
 
@@ -298,6 +463,40 @@ export interface SyncActionsMessage extends RequestMessage {
298
463
  type: 'syncActions';
299
464
  payload: {
300
465
  actions: Record<string, string>;
466
+ verbose?: boolean;
467
+ };
468
+ }
469
+
470
+ export interface StartPlaytestMessage extends RequestMessage {
471
+ type: 'startPlaytest';
472
+ payload: {
473
+ mode: PlaytestMode;
474
+ playtestId: string;
475
+ /** Handed to the playtest's DataModels, which can't discover the bridge themselves. */
476
+ bridgePort: number;
477
+ /** The edit session's instance id, which the playtest's sessions register under. */
478
+ instanceId: string;
479
+ /** Starts a multiplayer test, a server and a client process per player. */
480
+ players?: number;
481
+ };
482
+ }
483
+
484
+ export interface EndPlaytestMessage extends RequestMessage {
485
+ type: 'endPlaytest';
486
+ payload: Record<string, never>;
487
+ }
488
+
489
+ /** Answered with `scriptComplete`, the same reply as `execute`. */
490
+ export interface RunPlaytestScriptMessage extends RequestMessage {
491
+ type: 'runPlaytestScript';
492
+ payload: {
493
+ mode: PlaytestMode;
494
+ script: string;
495
+ /** Planted in the playtest's server to run the script and end the playtest. */
496
+ runnerSource: string;
497
+ timeoutSec: number;
498
+ /** Passed to the script as `...`. */
499
+ args?: string[];
301
500
  };
302
501
  }
303
502
 
@@ -317,15 +516,36 @@ export type ServerMessage =
317
516
  | QueryStateMessage
318
517
  | CaptureScreenshotMessage
319
518
  | QueryDataModelMessage
519
+ | ExportInstancesMessage
520
+ | ImportInstancesMessage
521
+ | FindInstancesMessage
522
+ | GrepScriptsMessage
320
523
  | QueryLogsMessage
321
524
  | RegisterActionMessage
322
525
  | SyncActionsMessage
526
+ | StartPlaytestMessage
527
+ | EndPlaytestMessage
528
+ | RunPlaytestScriptMessage
323
529
  | ServerErrorMessage;
324
530
 
325
531
  export function encodeMessage(msg: ServerMessage): string {
326
532
  return JSON.stringify(msg);
327
533
  }
328
534
 
535
+ function isViewportSize(value: unknown): value is [number, number] {
536
+ return (
537
+ Array.isArray(value) &&
538
+ value.length === 2 &&
539
+ value.every((item) => typeof item === 'number')
540
+ );
541
+ }
542
+
543
+ function isStringArray(value: unknown): value is string[] {
544
+ return (
545
+ Array.isArray(value) && value.every((item) => typeof item === 'string')
546
+ );
547
+ }
548
+
329
549
  export function decodePluginMessage(raw: string): PluginMessage | null {
330
550
  let parsed: unknown;
331
551
  try {
@@ -390,6 +610,10 @@ export function decodePluginMessage(raw: string): PluginMessage | null {
390
610
  success: payload.success,
391
611
  error:
392
612
  typeof payload.error === 'string' ? payload.error : undefined,
613
+ traceback:
614
+ typeof payload.traceback === 'string'
615
+ ? payload.traceback
616
+ : undefined,
393
617
  output,
394
618
  returnValues,
395
619
  },
@@ -420,7 +644,19 @@ export function decodePluginMessage(raw: string): PluginMessage | null {
420
644
  ? payload.placeFile
421
645
  : undefined,
422
646
  state: stateVal as StudioState,
647
+ context:
648
+ payload.context === 'edit' ||
649
+ payload.context === 'client' ||
650
+ payload.context === 'server'
651
+ ? payload.context
652
+ : undefined,
423
653
  pid: typeof payload.pid === 'number' ? payload.pid : undefined,
654
+ launchId:
655
+ typeof payload.launchId === 'string' ? payload.launchId : undefined,
656
+ playerName:
657
+ typeof payload.playerName === 'string'
658
+ ? payload.playerName
659
+ : undefined,
424
660
  capabilities: payload.capabilities as Capability[],
425
661
  },
426
662
  };
@@ -445,6 +681,13 @@ export function decodePluginMessage(raw: string): PluginMessage | null {
445
681
  placeId: payload.placeId,
446
682
  placeName: payload.placeName,
447
683
  gameId: payload.gameId,
684
+ viewportSize: isViewportSize(payload.viewportSize)
685
+ ? payload.viewportSize
686
+ : undefined,
687
+ studioVersion:
688
+ typeof payload.studioVersion === 'string'
689
+ ? payload.studioVersion
690
+ : undefined,
448
691
  },
449
692
  };
450
693
 
@@ -483,6 +726,55 @@ export function decodePluginMessage(raw: string): PluginMessage | null {
483
726
  },
484
727
  };
485
728
 
729
+ case 'exportInstancesResult':
730
+ if (requestId === undefined) return null;
731
+ if (typeof payload.data !== 'string' || !isStringArray(payload.paths))
732
+ return null;
733
+ return {
734
+ type: 'exportInstancesResult',
735
+ sessionId,
736
+ requestId,
737
+ payload: { data: payload.data, paths: payload.paths },
738
+ };
739
+
740
+ case 'importInstancesResult':
741
+ if (requestId === undefined) return null;
742
+ if (!isStringArray(payload.paths)) return null;
743
+ return {
744
+ type: 'importInstancesResult',
745
+ sessionId,
746
+ requestId,
747
+ payload: { paths: payload.paths },
748
+ };
749
+
750
+ case 'findInstancesResult':
751
+ if (requestId === undefined) return null;
752
+ if (!Array.isArray(payload.instances)) return null;
753
+ return {
754
+ type: 'findInstancesResult',
755
+ sessionId,
756
+ requestId,
757
+ payload: {
758
+ instances: payload.instances as FoundInstance[],
759
+ searched: typeof payload.searched === 'number' ? payload.searched : 0,
760
+ truncated: payload.truncated === true,
761
+ },
762
+ };
763
+
764
+ case 'grepScriptsResult':
765
+ if (requestId === undefined) return null;
766
+ if (!Array.isArray(payload.matches)) return null;
767
+ return {
768
+ type: 'grepScriptsResult',
769
+ sessionId,
770
+ requestId,
771
+ payload: {
772
+ matches: payload.matches as GrepMatch[],
773
+ searched: typeof payload.searched === 'number' ? payload.searched : 0,
774
+ truncated: payload.truncated === true,
775
+ },
776
+ };
777
+
486
778
  case 'logsResult':
487
779
  if (requestId === undefined) return null;
488
780
  if (
@@ -497,11 +789,7 @@ export function decodePluginMessage(raw: string): PluginMessage | null {
497
789
  sessionId,
498
790
  requestId,
499
791
  payload: {
500
- entries: payload.entries as Array<{
501
- level: OutputLevel;
502
- body: string;
503
- timestamp: number;
504
- }>,
792
+ entries: payload.entries as LogsResultMessage['payload']['entries'],
505
793
  total: payload.total,
506
794
  bufferCapacity: payload.bufferCapacity,
507
795
  },
@@ -580,6 +868,44 @@ export function decodePluginMessage(raw: string): PluginMessage | null {
580
868
  },
581
869
  };
582
870
 
871
+ case 'playtestEnded':
872
+ if (requestId === undefined) return null;
873
+ if (
874
+ typeof payload.playtestId !== 'string' ||
875
+ typeof payload.success !== 'boolean'
876
+ )
877
+ return null;
878
+ return {
879
+ type: 'playtestEnded',
880
+ sessionId,
881
+ requestId,
882
+ payload: {
883
+ playtestId: payload.playtestId,
884
+ success: payload.success,
885
+ error: typeof payload.error === 'string' ? payload.error : undefined,
886
+ },
887
+ };
888
+
889
+ case 'endPlaytestResult':
890
+ if (requestId === undefined) return null;
891
+ return {
892
+ type: 'endPlaytestResult',
893
+ sessionId,
894
+ requestId,
895
+ payload: {
896
+ playtestId:
897
+ typeof payload.playtestId === 'string'
898
+ ? payload.playtestId
899
+ : undefined,
900
+ mode:
901
+ payload.mode === 'play' || payload.mode === 'run'
902
+ ? payload.mode
903
+ : undefined,
904
+ players:
905
+ typeof payload.players === 'number' ? payload.players : undefined,
906
+ },
907
+ };
908
+
583
909
  case 'error':
584
910
  if (
585
911
  typeof payload.code !== 'string' ||
@@ -642,7 +968,13 @@ export function decodeServerMessage(raw: string): ServerMessage | null {
642
968
  type: 'execute',
643
969
  sessionId,
644
970
  ...(requestId !== undefined ? { requestId } : {}),
645
- payload: { script: payload.script },
971
+ payload: {
972
+ script: payload.script,
973
+ ...(typeof payload.timeoutMs === 'number'
974
+ ? { timeoutMs: payload.timeoutMs }
975
+ : {}),
976
+ ...(isStringArray(payload.args) ? { args: payload.args } : {}),
977
+ },
646
978
  };
647
979
  }
648
980
  return null;
@@ -674,6 +1006,74 @@ export function decodeServerMessage(raw: string): ServerMessage | null {
674
1006
  },
675
1007
  };
676
1008
 
1009
+ case 'exportInstances':
1010
+ if (requestId === undefined) return null;
1011
+ if (!isStringArray(payload.paths)) return null;
1012
+ return {
1013
+ type: 'exportInstances',
1014
+ sessionId,
1015
+ requestId,
1016
+ payload: { paths: payload.paths },
1017
+ };
1018
+
1019
+ case 'importInstances':
1020
+ if (requestId === undefined) return null;
1021
+ if (
1022
+ typeof payload.data !== 'string' ||
1023
+ typeof payload.parentPath !== 'string'
1024
+ )
1025
+ return null;
1026
+ return {
1027
+ type: 'importInstances',
1028
+ sessionId,
1029
+ requestId,
1030
+ payload: { data: payload.data, parentPath: payload.parentPath },
1031
+ };
1032
+
1033
+ case 'findInstances':
1034
+ if (requestId === undefined) return null;
1035
+ return {
1036
+ type: 'findInstances',
1037
+ sessionId,
1038
+ requestId,
1039
+ payload: {
1040
+ root: typeof payload.root === 'string' ? payload.root : undefined,
1041
+ name: typeof payload.name === 'string' ? payload.name : undefined,
1042
+ exactName:
1043
+ typeof payload.exactName === 'boolean'
1044
+ ? payload.exactName
1045
+ : undefined,
1046
+ className:
1047
+ typeof payload.className === 'string'
1048
+ ? payload.className
1049
+ : undefined,
1050
+ tag: typeof payload.tag === 'string' ? payload.tag : undefined,
1051
+ limit: typeof payload.limit === 'number' ? payload.limit : undefined,
1052
+ },
1053
+ };
1054
+
1055
+ case 'grepScripts':
1056
+ if (requestId === undefined) return null;
1057
+ if (typeof payload.pattern !== 'string') return null;
1058
+ return {
1059
+ type: 'grepScripts',
1060
+ sessionId,
1061
+ requestId,
1062
+ payload: {
1063
+ pattern: payload.pattern,
1064
+ root: typeof payload.root === 'string' ? payload.root : undefined,
1065
+ luaPattern:
1066
+ typeof payload.luaPattern === 'boolean'
1067
+ ? payload.luaPattern
1068
+ : undefined,
1069
+ caseSensitive:
1070
+ typeof payload.caseSensitive === 'boolean'
1071
+ ? payload.caseSensitive
1072
+ : undefined,
1073
+ limit: typeof payload.limit === 'number' ? payload.limit : undefined,
1074
+ },
1075
+ };
1076
+
677
1077
  case 'queryDataModel':
678
1078
  if (requestId === undefined) return null;
679
1079
  if (typeof payload.path !== 'string') return null;
@@ -721,6 +1121,11 @@ export function decodeServerMessage(raw: string): ServerMessage | null {
721
1121
  typeof payload.includeInternal === 'boolean'
722
1122
  ? payload.includeInternal
723
1123
  : undefined,
1124
+ since: typeof payload.since === 'number' ? payload.since : undefined,
1125
+ groupRepeats:
1126
+ typeof payload.groupRepeats === 'boolean'
1127
+ ? payload.groupRepeats
1128
+ : undefined,
724
1129
  },
725
1130
  };
726
1131
 
@@ -759,6 +1164,61 @@ export function decodeServerMessage(raw: string): ServerMessage | null {
759
1164
  },
760
1165
  };
761
1166
 
1167
+ case 'startPlaytest':
1168
+ if (requestId === undefined) return null;
1169
+ if (
1170
+ (payload.mode !== 'play' && payload.mode !== 'run') ||
1171
+ typeof payload.playtestId !== 'string' ||
1172
+ typeof payload.bridgePort !== 'number' ||
1173
+ typeof payload.instanceId !== 'string'
1174
+ )
1175
+ return null;
1176
+ return {
1177
+ type: 'startPlaytest',
1178
+ sessionId,
1179
+ requestId,
1180
+ payload: {
1181
+ mode: payload.mode,
1182
+ playtestId: payload.playtestId,
1183
+ bridgePort: payload.bridgePort,
1184
+ instanceId: payload.instanceId,
1185
+ ...(typeof payload.players === 'number'
1186
+ ? { players: payload.players }
1187
+ : {}),
1188
+ },
1189
+ };
1190
+
1191
+ case 'endPlaytest':
1192
+ if (requestId === undefined) return null;
1193
+ return {
1194
+ type: 'endPlaytest',
1195
+ sessionId,
1196
+ requestId,
1197
+ payload: {} as Record<string, never>,
1198
+ };
1199
+
1200
+ case 'runPlaytestScript':
1201
+ if (requestId === undefined) return null;
1202
+ if (
1203
+ (payload.mode !== 'play' && payload.mode !== 'run') ||
1204
+ typeof payload.script !== 'string' ||
1205
+ typeof payload.runnerSource !== 'string' ||
1206
+ typeof payload.timeoutSec !== 'number'
1207
+ )
1208
+ return null;
1209
+ return {
1210
+ type: 'runPlaytestScript',
1211
+ sessionId,
1212
+ requestId,
1213
+ payload: {
1214
+ mode: payload.mode,
1215
+ script: payload.script,
1216
+ runnerSource: payload.runnerSource,
1217
+ timeoutSec: payload.timeoutSec,
1218
+ ...(isStringArray(payload.args) ? { args: payload.args } : {}),
1219
+ },
1220
+ };
1221
+
762
1222
  case 'error':
763
1223
  if (
764
1224
  typeof payload.code !== 'string' ||