@quenty/studio-bridge 0.7.1 → 0.9.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 (689) hide show
  1. package/CHANGELOG.md +14 -42
  2. package/README.md +166 -115
  3. package/dist/src/bridge/bridge-connection-remote.test.d.ts +7 -0
  4. package/dist/src/bridge/bridge-connection-remote.test.d.ts.map +1 -0
  5. package/dist/src/bridge/bridge-connection-remote.test.js +144 -0
  6. package/dist/src/bridge/bridge-connection-remote.test.js.map +1 -0
  7. package/dist/src/bridge/bridge-connection.d.ts +112 -0
  8. package/dist/src/bridge/bridge-connection.d.ts.map +1 -0
  9. package/dist/src/bridge/bridge-connection.js +528 -0
  10. package/dist/src/bridge/bridge-connection.js.map +1 -0
  11. package/dist/src/bridge/bridge-connection.test.d.ts +6 -0
  12. package/dist/src/bridge/bridge-connection.test.d.ts.map +1 -0
  13. package/dist/src/bridge/bridge-connection.test.js +773 -0
  14. package/dist/src/bridge/bridge-connection.test.js.map +1 -0
  15. package/dist/src/bridge/bridge-session.d.ts +38 -0
  16. package/dist/src/bridge/bridge-session.d.ts.map +1 -0
  17. package/dist/src/bridge/bridge-session.js +259 -0
  18. package/dist/src/bridge/bridge-session.js.map +1 -0
  19. package/dist/src/bridge/bridge-session.test.d.ts +6 -0
  20. package/dist/src/bridge/bridge-session.test.d.ts.map +1 -0
  21. package/dist/src/bridge/bridge-session.test.js +264 -0
  22. package/dist/src/bridge/bridge-session.test.js.map +1 -0
  23. package/dist/src/bridge/index.d.ts +13 -0
  24. package/dist/src/bridge/index.d.ts.map +1 -0
  25. package/dist/src/bridge/index.js +13 -0
  26. package/dist/src/bridge/index.js.map +1 -0
  27. package/dist/src/bridge/internal/__tests__/failover-crash.test.d.ts +9 -0
  28. package/dist/src/bridge/internal/__tests__/failover-crash.test.d.ts.map +1 -0
  29. package/dist/src/bridge/internal/__tests__/failover-crash.test.js +159 -0
  30. package/dist/src/bridge/internal/__tests__/failover-crash.test.js.map +1 -0
  31. package/dist/src/bridge/internal/__tests__/failover-graceful.test.d.ts +9 -0
  32. package/dist/src/bridge/internal/__tests__/failover-graceful.test.d.ts.map +1 -0
  33. package/dist/src/bridge/internal/__tests__/failover-graceful.test.js +218 -0
  34. package/dist/src/bridge/internal/__tests__/failover-graceful.test.js.map +1 -0
  35. package/dist/src/bridge/internal/__tests__/failover-inflight.test.d.ts +9 -0
  36. package/dist/src/bridge/internal/__tests__/failover-inflight.test.d.ts.map +1 -0
  37. package/dist/src/bridge/internal/__tests__/failover-inflight.test.js +246 -0
  38. package/dist/src/bridge/internal/__tests__/failover-inflight.test.js.map +1 -0
  39. package/dist/src/bridge/internal/__tests__/host-client-integration.test.d.ts +10 -0
  40. package/dist/src/bridge/internal/__tests__/host-client-integration.test.d.ts.map +1 -0
  41. package/dist/src/bridge/internal/__tests__/host-client-integration.test.js +298 -0
  42. package/dist/src/bridge/internal/__tests__/host-client-integration.test.js.map +1 -0
  43. package/dist/src/bridge/internal/bridge-client.d.ts +70 -0
  44. package/dist/src/bridge/internal/bridge-client.d.ts.map +1 -0
  45. package/dist/src/bridge/internal/bridge-client.js +344 -0
  46. package/dist/src/bridge/internal/bridge-client.js.map +1 -0
  47. package/dist/src/bridge/internal/bridge-client.test.d.ts +7 -0
  48. package/dist/src/bridge/internal/bridge-client.test.d.ts.map +1 -0
  49. package/dist/src/bridge/internal/bridge-client.test.js +301 -0
  50. package/dist/src/bridge/internal/bridge-client.test.js.map +1 -0
  51. package/dist/src/bridge/internal/bridge-host.d.ts +78 -0
  52. package/dist/src/bridge/internal/bridge-host.d.ts.map +1 -0
  53. package/dist/src/bridge/internal/bridge-host.js +383 -0
  54. package/dist/src/bridge/internal/bridge-host.js.map +1 -0
  55. package/dist/src/bridge/internal/bridge-host.test.d.ts +7 -0
  56. package/dist/src/bridge/internal/bridge-host.test.d.ts.map +1 -0
  57. package/dist/src/bridge/internal/bridge-host.test.js +377 -0
  58. package/dist/src/bridge/internal/bridge-host.test.js.map +1 -0
  59. package/dist/src/bridge/internal/environment-detection.d.ts +44 -0
  60. package/dist/src/bridge/internal/environment-detection.d.ts.map +1 -0
  61. package/dist/src/bridge/internal/environment-detection.js +91 -0
  62. package/dist/src/bridge/internal/environment-detection.js.map +1 -0
  63. package/dist/src/bridge/internal/environment-detection.test.d.ts +7 -0
  64. package/dist/src/bridge/internal/environment-detection.test.d.ts.map +1 -0
  65. package/dist/src/bridge/internal/environment-detection.test.js +150 -0
  66. package/dist/src/bridge/internal/environment-detection.test.js.map +1 -0
  67. package/dist/src/bridge/internal/hand-off.d.ts +69 -0
  68. package/dist/src/bridge/internal/hand-off.d.ts.map +1 -0
  69. package/dist/src/bridge/internal/hand-off.js +178 -0
  70. package/dist/src/bridge/internal/hand-off.js.map +1 -0
  71. package/dist/src/bridge/internal/hand-off.test.d.ts +7 -0
  72. package/dist/src/bridge/internal/hand-off.test.d.ts.map +1 -0
  73. package/dist/src/bridge/internal/hand-off.test.js +325 -0
  74. package/dist/src/bridge/internal/hand-off.test.js.map +1 -0
  75. package/dist/src/bridge/internal/health-endpoint.d.ts +32 -0
  76. package/dist/src/bridge/internal/health-endpoint.d.ts.map +1 -0
  77. package/dist/src/bridge/internal/health-endpoint.js +73 -0
  78. package/dist/src/bridge/internal/health-endpoint.js.map +1 -0
  79. package/dist/src/bridge/internal/health-endpoint.test.d.ts +6 -0
  80. package/dist/src/bridge/internal/health-endpoint.test.d.ts.map +1 -0
  81. package/dist/src/bridge/internal/health-endpoint.test.js +122 -0
  82. package/dist/src/bridge/internal/health-endpoint.test.js.map +1 -0
  83. package/dist/src/bridge/internal/host-protocol.d.ts +60 -0
  84. package/dist/src/bridge/internal/host-protocol.d.ts.map +1 -0
  85. package/dist/src/bridge/internal/host-protocol.js +184 -0
  86. package/dist/src/bridge/internal/host-protocol.js.map +1 -0
  87. package/dist/src/bridge/internal/host-protocol.test.d.ts +6 -0
  88. package/dist/src/bridge/internal/host-protocol.test.d.ts.map +1 -0
  89. package/dist/src/bridge/internal/host-protocol.test.js +307 -0
  90. package/dist/src/bridge/internal/host-protocol.test.js.map +1 -0
  91. package/dist/src/bridge/internal/session-tracker.d.ts +67 -0
  92. package/dist/src/bridge/internal/session-tracker.d.ts.map +1 -0
  93. package/dist/src/bridge/internal/session-tracker.js +138 -0
  94. package/dist/src/bridge/internal/session-tracker.js.map +1 -0
  95. package/dist/src/bridge/internal/session-tracker.test.d.ts +6 -0
  96. package/dist/src/bridge/internal/session-tracker.test.d.ts.map +1 -0
  97. package/dist/src/bridge/internal/session-tracker.test.js +342 -0
  98. package/dist/src/bridge/internal/session-tracker.test.js.map +1 -0
  99. package/dist/src/bridge/internal/transport-client.d.ts +43 -0
  100. package/dist/src/bridge/internal/transport-client.d.ts.map +1 -0
  101. package/dist/src/bridge/internal/transport-client.js +146 -0
  102. package/dist/src/bridge/internal/transport-client.js.map +1 -0
  103. package/dist/src/bridge/internal/transport-client.test.d.ts +6 -0
  104. package/dist/src/bridge/internal/transport-client.test.d.ts.map +1 -0
  105. package/dist/src/bridge/internal/transport-client.test.js +176 -0
  106. package/dist/src/bridge/internal/transport-client.test.js.map +1 -0
  107. package/dist/src/bridge/internal/transport-server.d.ts +59 -0
  108. package/dist/src/bridge/internal/transport-server.d.ts.map +1 -0
  109. package/dist/src/bridge/internal/transport-server.js +189 -0
  110. package/dist/src/bridge/internal/transport-server.js.map +1 -0
  111. package/dist/src/bridge/internal/transport-server.test.d.ts +6 -0
  112. package/dist/src/bridge/internal/transport-server.test.d.ts.map +1 -0
  113. package/dist/src/bridge/internal/transport-server.test.js +171 -0
  114. package/dist/src/bridge/internal/transport-server.test.js.map +1 -0
  115. package/dist/src/bridge/types.d.ts +117 -0
  116. package/dist/src/bridge/types.d.ts.map +1 -0
  117. package/dist/src/bridge/types.js +68 -0
  118. package/dist/src/bridge/types.js.map +1 -0
  119. package/dist/src/cli/adapters/cli-command-adapter-handler.test.d.ts +6 -0
  120. package/dist/src/cli/adapters/cli-command-adapter-handler.test.d.ts.map +1 -0
  121. package/dist/src/cli/adapters/cli-command-adapter-handler.test.js +260 -0
  122. package/dist/src/cli/adapters/cli-command-adapter-handler.test.js.map +1 -0
  123. package/dist/src/cli/adapters/cli-command-adapter.d.ts +39 -0
  124. package/dist/src/cli/adapters/cli-command-adapter.d.ts.map +1 -0
  125. package/dist/src/cli/adapters/cli-command-adapter.js +241 -0
  126. package/dist/src/cli/adapters/cli-command-adapter.js.map +1 -0
  127. package/dist/src/cli/adapters/cli-command-adapter.test.d.ts +5 -0
  128. package/dist/src/cli/adapters/cli-command-adapter.test.d.ts.map +1 -0
  129. package/dist/src/cli/adapters/cli-command-adapter.test.js +188 -0
  130. package/dist/src/cli/adapters/cli-command-adapter.test.js.map +1 -0
  131. package/dist/src/cli/adapters/group-builder.d.ts +29 -0
  132. package/dist/src/cli/adapters/group-builder.d.ts.map +1 -0
  133. package/dist/src/cli/adapters/group-builder.js +54 -0
  134. package/dist/src/cli/adapters/group-builder.js.map +1 -0
  135. package/dist/src/cli/adapters/group-builder.test.d.ts +5 -0
  136. package/dist/src/cli/adapters/group-builder.test.d.ts.map +1 -0
  137. package/dist/src/cli/adapters/group-builder.test.js +108 -0
  138. package/dist/src/cli/adapters/group-builder.test.js.map +1 -0
  139. package/dist/src/cli/adapters/help-formatter.d.ts +11 -0
  140. package/dist/src/cli/adapters/help-formatter.d.ts.map +1 -0
  141. package/dist/src/cli/adapters/help-formatter.js +78 -0
  142. package/dist/src/cli/adapters/help-formatter.js.map +1 -0
  143. package/dist/src/cli/adapters/help-formatter.test.d.ts +5 -0
  144. package/dist/src/cli/adapters/help-formatter.test.d.ts.map +1 -0
  145. package/dist/src/cli/adapters/help-formatter.test.js +79 -0
  146. package/dist/src/cli/adapters/help-formatter.test.js.map +1 -0
  147. package/dist/src/cli/adapters/target-resolver.d.ts +54 -0
  148. package/dist/src/cli/adapters/target-resolver.d.ts.map +1 -0
  149. package/dist/src/cli/adapters/target-resolver.js +90 -0
  150. package/dist/src/cli/adapters/target-resolver.js.map +1 -0
  151. package/dist/src/cli/adapters/target-resolver.test.d.ts +5 -0
  152. package/dist/src/cli/adapters/target-resolver.test.d.ts.map +1 -0
  153. package/dist/src/cli/adapters/target-resolver.test.js +169 -0
  154. package/dist/src/cli/adapters/target-resolver.test.js.map +1 -0
  155. package/dist/src/cli/args/global-args.d.ts +2 -0
  156. package/dist/src/cli/args/global-args.d.ts.map +1 -1
  157. package/dist/src/cli/cli.d.ts +6 -3
  158. package/dist/src/cli/cli.d.ts.map +1 -1
  159. package/dist/src/cli/cli.js +82 -20
  160. package/dist/src/cli/cli.js.map +1 -1
  161. package/dist/src/cli/resolve-script-content.d.ts +19 -0
  162. package/dist/src/cli/resolve-script-content.d.ts.map +1 -0
  163. package/dist/src/cli/resolve-script-content.js +22 -0
  164. package/dist/src/cli/resolve-script-content.js.map +1 -0
  165. package/dist/src/cli/resolve-session.d.ts +21 -0
  166. package/dist/src/cli/resolve-session.d.ts.map +1 -0
  167. package/dist/src/cli/resolve-session.js +40 -0
  168. package/dist/src/cli/resolve-session.js.map +1 -0
  169. package/dist/src/cli/resolve-session.test.d.ts +5 -0
  170. package/dist/src/cli/resolve-session.test.d.ts.map +1 -0
  171. package/dist/src/cli/resolve-session.test.js +112 -0
  172. package/dist/src/cli/resolve-session.test.js.map +1 -0
  173. package/dist/src/cli/script-executor.d.ts +1 -0
  174. package/dist/src/cli/script-executor.d.ts.map +1 -1
  175. package/dist/src/cli/script-executor.js +7 -1
  176. package/dist/src/cli/script-executor.js.map +1 -1
  177. package/dist/src/cli/types.d.ts +11 -0
  178. package/dist/src/cli/types.d.ts.map +1 -0
  179. package/dist/src/cli/types.js +5 -0
  180. package/dist/src/cli/types.js.map +1 -0
  181. package/dist/src/commands/connect.d.ts +16 -0
  182. package/dist/src/commands/connect.d.ts.map +1 -0
  183. package/dist/src/commands/connect.js +15 -0
  184. package/dist/src/commands/connect.js.map +1 -0
  185. package/dist/src/commands/connect.test.d.ts +5 -0
  186. package/dist/src/commands/connect.test.d.ts.map +1 -0
  187. package/dist/src/commands/connect.test.js +46 -0
  188. package/dist/src/commands/connect.test.js.map +1 -0
  189. package/dist/src/commands/console/exec/exec.d.ts +43 -0
  190. package/dist/src/commands/console/exec/exec.d.ts.map +1 -0
  191. package/dist/src/commands/console/exec/exec.js +79 -0
  192. package/dist/src/commands/console/exec/exec.js.map +1 -0
  193. package/dist/src/commands/console/exec/exec.test.d.ts +5 -0
  194. package/dist/src/commands/console/exec/exec.test.d.ts.map +1 -0
  195. package/dist/src/commands/console/exec/exec.test.js +191 -0
  196. package/dist/src/commands/console/exec/exec.test.js.map +1 -0
  197. package/dist/src/commands/console/logs/logs.d.ts +23 -0
  198. package/dist/src/commands/console/logs/logs.d.ts.map +1 -0
  199. package/dist/src/commands/console/logs/logs.js +80 -0
  200. package/dist/src/commands/console/logs/logs.js.map +1 -0
  201. package/dist/src/commands/console/logs/logs.test.d.ts +5 -0
  202. package/dist/src/commands/console/logs/logs.test.d.ts.map +1 -0
  203. package/dist/src/commands/console/logs/logs.test.js +111 -0
  204. package/dist/src/commands/console/logs/logs.test.js.map +1 -0
  205. package/dist/src/commands/disconnect.d.ts +9 -0
  206. package/dist/src/commands/disconnect.d.ts.map +1 -0
  207. package/dist/src/commands/disconnect.js +8 -0
  208. package/dist/src/commands/disconnect.js.map +1 -0
  209. package/dist/src/commands/disconnect.test.d.ts +5 -0
  210. package/dist/src/commands/disconnect.test.d.ts.map +1 -0
  211. package/dist/src/commands/disconnect.test.js +17 -0
  212. package/dist/src/commands/disconnect.test.js.map +1 -0
  213. package/dist/src/commands/explorer/query/query.d.ts +31 -0
  214. package/dist/src/commands/explorer/query/query.d.ts.map +1 -0
  215. package/dist/src/commands/explorer/query/query.js +106 -0
  216. package/dist/src/commands/explorer/query/query.js.map +1 -0
  217. package/dist/src/commands/explorer/query/query.test.d.ts +5 -0
  218. package/dist/src/commands/explorer/query/query.test.d.ts.map +1 -0
  219. package/dist/src/commands/explorer/query/query.test.js +228 -0
  220. package/dist/src/commands/explorer/query/query.test.js.map +1 -0
  221. package/dist/src/commands/formatters.test.d.ts +6 -0
  222. package/dist/src/commands/formatters.test.d.ts.map +1 -0
  223. package/dist/src/commands/formatters.test.js +211 -0
  224. package/dist/src/commands/formatters.test.js.map +1 -0
  225. package/dist/src/commands/framework/action-loader.d.ts +25 -0
  226. package/dist/src/commands/framework/action-loader.d.ts.map +1 -0
  227. package/dist/src/commands/framework/action-loader.js +46 -0
  228. package/dist/src/commands/framework/action-loader.js.map +1 -0
  229. package/dist/src/commands/framework/action-loader.test.d.ts +5 -0
  230. package/dist/src/commands/framework/action-loader.test.d.ts.map +1 -0
  231. package/dist/src/commands/framework/action-loader.test.js +89 -0
  232. package/dist/src/commands/framework/action-loader.test.js.map +1 -0
  233. package/dist/src/commands/framework/arg-builder.d.ts +92 -0
  234. package/dist/src/commands/framework/arg-builder.d.ts.map +1 -0
  235. package/dist/src/commands/framework/arg-builder.js +137 -0
  236. package/dist/src/commands/framework/arg-builder.js.map +1 -0
  237. package/dist/src/commands/framework/arg-builder.test.d.ts +5 -0
  238. package/dist/src/commands/framework/arg-builder.test.d.ts.map +1 -0
  239. package/dist/src/commands/framework/arg-builder.test.js +246 -0
  240. package/dist/src/commands/framework/arg-builder.test.js.map +1 -0
  241. package/dist/src/commands/framework/command-registry.d.ts +23 -0
  242. package/dist/src/commands/framework/command-registry.d.ts.map +1 -0
  243. package/dist/src/commands/framework/command-registry.js +42 -0
  244. package/dist/src/commands/framework/command-registry.js.map +1 -0
  245. package/dist/src/commands/framework/command-registry.test.d.ts +5 -0
  246. package/dist/src/commands/framework/command-registry.test.d.ts.map +1 -0
  247. package/dist/src/commands/framework/command-registry.test.js +158 -0
  248. package/dist/src/commands/framework/command-registry.test.js.map +1 -0
  249. package/dist/src/commands/framework/define-command.d.ts +76 -0
  250. package/dist/src/commands/framework/define-command.d.ts.map +1 -0
  251. package/dist/src/commands/framework/define-command.js +28 -0
  252. package/dist/src/commands/framework/define-command.js.map +1 -0
  253. package/dist/src/commands/framework/define-command.test.d.ts +5 -0
  254. package/dist/src/commands/framework/define-command.test.d.ts.map +1 -0
  255. package/dist/src/commands/framework/define-command.test.js +135 -0
  256. package/dist/src/commands/framework/define-command.test.js.map +1 -0
  257. package/dist/src/commands/framework/index.d.ts +8 -0
  258. package/dist/src/commands/framework/index.d.ts.map +1 -0
  259. package/dist/src/commands/framework/index.js +8 -0
  260. package/dist/src/commands/framework/index.js.map +1 -0
  261. package/dist/src/commands/index.d.ts +20 -0
  262. package/dist/src/commands/index.d.ts.map +1 -0
  263. package/dist/src/commands/index.js +20 -0
  264. package/dist/src/commands/index.js.map +1 -0
  265. package/dist/src/commands/linux/inject-credentials/inject-credentials.d.ts +15 -0
  266. package/dist/src/commands/linux/inject-credentials/inject-credentials.d.ts.map +1 -0
  267. package/dist/src/commands/linux/inject-credentials/inject-credentials.js +88 -0
  268. package/dist/src/commands/linux/inject-credentials/inject-credentials.js.map +1 -0
  269. package/dist/src/commands/linux/setup/setup.d.ts +19 -0
  270. package/dist/src/commands/linux/setup/setup.d.ts.map +1 -0
  271. package/dist/src/commands/linux/setup/setup.js +107 -0
  272. package/dist/src/commands/linux/setup/setup.js.map +1 -0
  273. package/dist/src/commands/linux/status/status.d.ts +34 -0
  274. package/dist/src/commands/linux/status/status.d.ts.map +1 -0
  275. package/dist/src/commands/linux/status/status.js +134 -0
  276. package/dist/src/commands/linux/status/status.js.map +1 -0
  277. package/dist/src/commands/plugin/install/install.d.ts +10 -0
  278. package/dist/src/commands/plugin/install/install.d.ts.map +1 -0
  279. package/dist/src/commands/plugin/install/install.js +23 -0
  280. package/dist/src/commands/plugin/install/install.js.map +1 -0
  281. package/dist/src/commands/plugin/uninstall/uninstall.d.ts +9 -0
  282. package/dist/src/commands/plugin/uninstall/uninstall.d.ts.map +1 -0
  283. package/dist/src/commands/plugin/uninstall/uninstall.js +41 -0
  284. package/dist/src/commands/plugin/uninstall/uninstall.js.map +1 -0
  285. package/dist/src/commands/process/close/close.d.ts +22 -0
  286. package/dist/src/commands/process/close/close.d.ts.map +1 -0
  287. package/dist/src/commands/process/close/close.js +34 -0
  288. package/dist/src/commands/process/close/close.js.map +1 -0
  289. package/dist/src/commands/process/format-state.d.ts +7 -0
  290. package/dist/src/commands/process/format-state.d.ts.map +1 -0
  291. package/dist/src/commands/process/format-state.js +19 -0
  292. package/dist/src/commands/process/format-state.js.map +1 -0
  293. package/dist/src/commands/process/info/info.d.ts +17 -0
  294. package/dist/src/commands/process/info/info.d.ts.map +1 -0
  295. package/dist/src/commands/process/info/info.js +38 -0
  296. package/dist/src/commands/process/info/info.js.map +1 -0
  297. package/dist/src/commands/process/info/info.test.d.ts +5 -0
  298. package/dist/src/commands/process/info/info.test.d.ts.map +1 -0
  299. package/dist/src/commands/process/info/info.test.js +58 -0
  300. package/dist/src/commands/process/info/info.test.js.map +1 -0
  301. package/dist/src/commands/process/launch/launch.d.ts +17 -0
  302. package/dist/src/commands/process/launch/launch.d.ts.map +1 -0
  303. package/dist/src/commands/process/launch/launch.js +26 -0
  304. package/dist/src/commands/process/launch/launch.js.map +1 -0
  305. package/dist/src/commands/process/launch/launch.test.d.ts +5 -0
  306. package/dist/src/commands/process/launch/launch.test.d.ts.map +1 -0
  307. package/dist/src/commands/process/launch/launch.test.js +49 -0
  308. package/dist/src/commands/process/launch/launch.test.js.map +1 -0
  309. package/dist/src/commands/process/list/list.d.ts +16 -0
  310. package/dist/src/commands/process/list/list.d.ts.map +1 -0
  311. package/dist/src/commands/process/list/list.js +56 -0
  312. package/dist/src/commands/process/list/list.js.map +1 -0
  313. package/dist/src/commands/process/list/list.test.d.ts +5 -0
  314. package/dist/src/commands/process/list/list.test.d.ts.map +1 -0
  315. package/dist/src/commands/process/list/list.test.js +71 -0
  316. package/dist/src/commands/process/list/list.test.js.map +1 -0
  317. package/dist/src/commands/process/run/run.d.ts +31 -0
  318. package/dist/src/commands/process/run/run.d.ts.map +1 -0
  319. package/dist/src/commands/process/run/run.js +63 -0
  320. package/dist/src/commands/process/run/run.js.map +1 -0
  321. package/dist/src/commands/rgba-to-png.d.ts +17 -0
  322. package/dist/src/commands/rgba-to-png.d.ts.map +1 -0
  323. package/dist/src/commands/rgba-to-png.js +85 -0
  324. package/dist/src/commands/rgba-to-png.js.map +1 -0
  325. package/dist/src/commands/serve/serve.d.ts +17 -0
  326. package/dist/src/commands/serve/serve.d.ts.map +1 -0
  327. package/dist/src/commands/serve/serve.js +128 -0
  328. package/dist/src/commands/serve/serve.js.map +1 -0
  329. package/dist/src/commands/serve/serve.test.d.ts +5 -0
  330. package/dist/src/commands/serve/serve.test.d.ts.map +1 -0
  331. package/dist/src/commands/serve/serve.test.js +100 -0
  332. package/dist/src/commands/serve/serve.test.js.map +1 -0
  333. package/dist/src/commands/viewport/screenshot/screenshot.d.ts +17 -0
  334. package/dist/src/commands/viewport/screenshot/screenshot.d.ts.map +1 -0
  335. package/dist/src/commands/viewport/screenshot/screenshot.js +45 -0
  336. package/dist/src/commands/viewport/screenshot/screenshot.js.map +1 -0
  337. package/dist/src/commands/viewport/screenshot/screenshot.test.d.ts +5 -0
  338. package/dist/src/commands/viewport/screenshot/screenshot.test.d.ts.map +1 -0
  339. package/dist/src/commands/viewport/screenshot/screenshot.test.js +143 -0
  340. package/dist/src/commands/viewport/screenshot/screenshot.test.js.map +1 -0
  341. package/dist/src/docker/docker-delegator.d.ts +30 -0
  342. package/dist/src/docker/docker-delegator.d.ts.map +1 -0
  343. package/dist/src/docker/docker-delegator.js +201 -0
  344. package/dist/src/docker/docker-delegator.js.map +1 -0
  345. package/dist/src/docker/docker-delegator.test.d.ts +2 -0
  346. package/dist/src/docker/docker-delegator.test.d.ts.map +1 -0
  347. package/dist/src/docker/docker-delegator.test.js +132 -0
  348. package/dist/src/docker/docker-delegator.test.js.map +1 -0
  349. package/dist/src/index.d.ts +9 -2
  350. package/dist/src/index.d.ts.map +1 -1
  351. package/dist/src/index.js +6 -1
  352. package/dist/src/index.js.map +1 -1
  353. package/dist/src/index.test.d.ts +2 -0
  354. package/dist/src/index.test.d.ts.map +1 -0
  355. package/dist/src/index.test.js +51 -0
  356. package/dist/src/index.test.js.map +1 -0
  357. package/dist/src/linux/index.d.ts +12 -0
  358. package/dist/src/linux/index.d.ts.map +1 -0
  359. package/dist/src/linux/index.js +11 -0
  360. package/dist/src/linux/index.js.map +1 -0
  361. package/dist/src/linux/linux-config.d.ts +37 -0
  362. package/dist/src/linux/linux-config.d.ts.map +1 -0
  363. package/dist/src/linux/linux-config.js +70 -0
  364. package/dist/src/linux/linux-config.js.map +1 -0
  365. package/dist/src/linux/linux-config.test.d.ts +2 -0
  366. package/dist/src/linux/linux-config.test.d.ts.map +1 -0
  367. package/dist/src/linux/linux-config.test.js +54 -0
  368. package/dist/src/linux/linux-config.test.js.map +1 -0
  369. package/dist/src/linux/linux-credential-writer.d.ts +35 -0
  370. package/dist/src/linux/linux-credential-writer.d.ts.map +1 -0
  371. package/dist/src/linux/linux-credential-writer.js +300 -0
  372. package/dist/src/linux/linux-credential-writer.js.map +1 -0
  373. package/dist/src/linux/linux-display-manager.d.ts +24 -0
  374. package/dist/src/linux/linux-display-manager.d.ts.map +1 -0
  375. package/dist/src/linux/linux-display-manager.js +92 -0
  376. package/dist/src/linux/linux-display-manager.js.map +1 -0
  377. package/dist/src/linux/linux-env-guard.d.ts +13 -0
  378. package/dist/src/linux/linux-env-guard.d.ts.map +1 -0
  379. package/dist/src/linux/linux-env-guard.js +31 -0
  380. package/dist/src/linux/linux-env-guard.js.map +1 -0
  381. package/dist/src/linux/linux-env-guard.test.d.ts +2 -0
  382. package/dist/src/linux/linux-env-guard.test.d.ts.map +1 -0
  383. package/dist/src/linux/linux-env-guard.test.js +48 -0
  384. package/dist/src/linux/linux-env-guard.test.js.map +1 -0
  385. package/dist/src/linux/linux-fflags.d.ts +17 -0
  386. package/dist/src/linux/linux-fflags.d.ts.map +1 -0
  387. package/dist/src/linux/linux-fflags.js +33 -0
  388. package/dist/src/linux/linux-fflags.js.map +1 -0
  389. package/dist/src/linux/linux-fflags.test.d.ts +2 -0
  390. package/dist/src/linux/linux-fflags.test.d.ts.map +1 -0
  391. package/dist/src/linux/linux-fflags.test.js +55 -0
  392. package/dist/src/linux/linux-fflags.test.js.map +1 -0
  393. package/dist/src/linux/linux-prerequisites.d.ts +24 -0
  394. package/dist/src/linux/linux-prerequisites.d.ts.map +1 -0
  395. package/dist/src/linux/linux-prerequisites.js +118 -0
  396. package/dist/src/linux/linux-prerequisites.js.map +1 -0
  397. package/dist/src/linux/linux-shader-patcher.d.ts +17 -0
  398. package/dist/src/linux/linux-shader-patcher.d.ts.map +1 -0
  399. package/dist/src/linux/linux-shader-patcher.js +48 -0
  400. package/dist/src/linux/linux-shader-patcher.js.map +1 -0
  401. package/dist/src/linux/linux-shader-patcher.test.d.ts +2 -0
  402. package/dist/src/linux/linux-shader-patcher.test.d.ts.map +1 -0
  403. package/dist/src/linux/linux-shader-patcher.test.js +55 -0
  404. package/dist/src/linux/linux-shader-patcher.test.js.map +1 -0
  405. package/dist/src/linux/linux-studio-installer.d.ts +10 -0
  406. package/dist/src/linux/linux-studio-installer.d.ts.map +1 -0
  407. package/dist/src/linux/linux-studio-installer.js +79 -0
  408. package/dist/src/linux/linux-studio-installer.js.map +1 -0
  409. package/dist/src/linux/linux-studio-launcher.d.ts +10 -0
  410. package/dist/src/linux/linux-studio-launcher.d.ts.map +1 -0
  411. package/dist/src/linux/linux-studio-launcher.js +73 -0
  412. package/dist/src/linux/linux-studio-launcher.js.map +1 -0
  413. package/dist/src/linux/linux-version-resolver.d.ts +18 -0
  414. package/dist/src/linux/linux-version-resolver.d.ts.map +1 -0
  415. package/dist/src/linux/linux-version-resolver.js +49 -0
  416. package/dist/src/linux/linux-version-resolver.js.map +1 -0
  417. package/dist/src/linux/linux-wine-env.d.ts +11 -0
  418. package/dist/src/linux/linux-wine-env.d.ts.map +1 -0
  419. package/dist/src/linux/linux-wine-env.js +33 -0
  420. package/dist/src/linux/linux-wine-env.js.map +1 -0
  421. package/dist/src/linux/linux-wine-env.test.d.ts +2 -0
  422. package/dist/src/linux/linux-wine-env.test.d.ts.map +1 -0
  423. package/dist/src/linux/linux-wine-env.test.js +47 -0
  424. package/dist/src/linux/linux-wine-env.test.js.map +1 -0
  425. package/dist/src/plugin/persistent-plugin-installer.d.ts +21 -0
  426. package/dist/src/plugin/persistent-plugin-installer.d.ts.map +1 -0
  427. package/dist/src/plugin/persistent-plugin-installer.js +69 -0
  428. package/dist/src/plugin/persistent-plugin-installer.js.map +1 -0
  429. package/dist/src/plugin/persistent-plugin-installer.test.d.ts +5 -0
  430. package/dist/src/plugin/persistent-plugin-installer.test.d.ts.map +1 -0
  431. package/dist/src/plugin/persistent-plugin-installer.test.js +119 -0
  432. package/dist/src/plugin/persistent-plugin-installer.test.js.map +1 -0
  433. package/dist/src/plugin/plugin-discovery.d.ts +7 -0
  434. package/dist/src/plugin/plugin-discovery.d.ts.map +1 -0
  435. package/dist/src/plugin/plugin-discovery.js +18 -0
  436. package/dist/src/plugin/plugin-discovery.js.map +1 -0
  437. package/dist/src/plugin/plugin-discovery.test.d.ts +5 -0
  438. package/dist/src/plugin/plugin-discovery.test.d.ts.map +1 -0
  439. package/dist/src/plugin/plugin-discovery.test.js +55 -0
  440. package/dist/src/plugin/plugin-discovery.test.js.map +1 -0
  441. package/dist/src/plugin/plugin-injector.js +1 -1
  442. package/dist/src/plugin/plugin-injector.js.map +1 -1
  443. package/dist/src/process/studio-process-manager.d.ts +7 -3
  444. package/dist/src/process/studio-process-manager.d.ts.map +1 -1
  445. package/dist/src/process/studio-process-manager.js +40 -11
  446. package/dist/src/process/studio-process-manager.js.map +1 -1
  447. package/dist/src/process/studio-process-manager.test.js +18 -1
  448. package/dist/src/process/studio-process-manager.test.js.map +1 -1
  449. package/dist/src/server/action-dispatcher.d.ts +35 -0
  450. package/dist/src/server/action-dispatcher.d.ts.map +1 -0
  451. package/dist/src/server/action-dispatcher.js +67 -0
  452. package/dist/src/server/action-dispatcher.js.map +1 -0
  453. package/dist/src/server/action-dispatcher.test.d.ts +6 -0
  454. package/dist/src/server/action-dispatcher.test.d.ts.map +1 -0
  455. package/dist/src/server/action-dispatcher.test.js +173 -0
  456. package/dist/src/server/action-dispatcher.test.js.map +1 -0
  457. package/dist/src/server/index.d.ts +1 -1
  458. package/dist/src/server/index.d.ts.map +1 -1
  459. package/dist/src/server/pending-request-map.d.ts +33 -0
  460. package/dist/src/server/pending-request-map.d.ts.map +1 -0
  461. package/dist/src/server/pending-request-map.js +69 -0
  462. package/dist/src/server/pending-request-map.js.map +1 -0
  463. package/dist/src/server/pending-request-map.test.d.ts +2 -0
  464. package/dist/src/server/pending-request-map.test.d.ts.map +1 -0
  465. package/dist/src/server/pending-request-map.test.js +192 -0
  466. package/dist/src/server/pending-request-map.test.js.map +1 -0
  467. package/dist/src/server/plugin-detection.test.d.ts +7 -0
  468. package/dist/src/server/plugin-detection.test.d.ts.map +1 -0
  469. package/dist/src/server/plugin-detection.test.js +154 -0
  470. package/dist/src/server/plugin-detection.test.js.map +1 -0
  471. package/dist/src/server/studio-bridge-server.d.ts +44 -7
  472. package/dist/src/server/studio-bridge-server.d.ts.map +1 -1
  473. package/dist/src/server/studio-bridge-server.js +341 -91
  474. package/dist/src/server/studio-bridge-server.js.map +1 -1
  475. package/dist/src/server/studio-bridge-server.test.js +231 -207
  476. package/dist/src/server/studio-bridge-server.test.js.map +1 -1
  477. package/dist/src/server/web-socket-protocol-basic.test.d.ts +2 -0
  478. package/dist/src/server/web-socket-protocol-basic.test.d.ts.map +1 -0
  479. package/dist/src/server/web-socket-protocol-basic.test.js +98 -0
  480. package/dist/src/server/web-socket-protocol-basic.test.js.map +1 -0
  481. package/dist/src/server/web-socket-protocol.d.ts +218 -20
  482. package/dist/src/server/web-socket-protocol.d.ts.map +1 -1
  483. package/dist/src/server/web-socket-protocol.js +346 -20
  484. package/dist/src/server/web-socket-protocol.js.map +1 -1
  485. package/dist/src/server/web-socket-protocol.test.js +572 -146
  486. package/dist/src/server/web-socket-protocol.test.js.map +1 -1
  487. package/dist/src/test/e2e/hand-off.test.d.ts +9 -0
  488. package/dist/src/test/e2e/hand-off.test.d.ts.map +1 -0
  489. package/dist/src/test/e2e/hand-off.test.js +274 -0
  490. package/dist/src/test/e2e/hand-off.test.js.map +1 -0
  491. package/dist/src/test/e2e/persistent-session.test.d.ts +11 -0
  492. package/dist/src/test/e2e/persistent-session.test.d.ts.map +1 -0
  493. package/dist/src/test/e2e/persistent-session.test.js +367 -0
  494. package/dist/src/test/e2e/persistent-session.test.js.map +1 -0
  495. package/dist/src/test/e2e/split-server.test.d.ts +14 -0
  496. package/dist/src/test/e2e/split-server.test.d.ts.map +1 -0
  497. package/dist/src/test/e2e/split-server.test.js +230 -0
  498. package/dist/src/test/e2e/split-server.test.js.map +1 -0
  499. package/dist/src/test/helpers/mock-plugin-client.d.ts +69 -0
  500. package/dist/src/test/helpers/mock-plugin-client.d.ts.map +1 -0
  501. package/dist/src/test/helpers/mock-plugin-client.js +213 -0
  502. package/dist/src/test/helpers/mock-plugin-client.js.map +1 -0
  503. package/dist/tsconfig.tsbuildinfo +1 -1
  504. package/docker/.dockerignore +2 -0
  505. package/docker/Dockerfile +113 -0
  506. package/docker/docker-compose.yml +20 -0
  507. package/docker/entrypoint.sh +19 -0
  508. package/package.json +8 -6
  509. package/src/bridge/bridge-connection-remote.test.ts +189 -0
  510. package/src/bridge/bridge-connection.test.ts +1076 -0
  511. package/src/bridge/bridge-connection.ts +718 -0
  512. package/src/bridge/bridge-session.test.ts +336 -0
  513. package/src/bridge/bridge-session.ts +365 -0
  514. package/src/bridge/index.ts +42 -0
  515. package/src/bridge/internal/__tests__/failover-crash.test.ts +191 -0
  516. package/src/bridge/internal/__tests__/failover-graceful.test.ts +268 -0
  517. package/src/bridge/internal/__tests__/failover-inflight.test.ts +329 -0
  518. package/src/bridge/internal/__tests__/host-client-integration.test.ts +387 -0
  519. package/src/bridge/internal/bridge-client.test.ts +399 -0
  520. package/src/bridge/internal/bridge-client.ts +434 -0
  521. package/src/bridge/internal/bridge-host.test.ts +501 -0
  522. package/src/bridge/internal/bridge-host.ts +531 -0
  523. package/src/bridge/internal/environment-detection.test.ts +180 -0
  524. package/src/bridge/internal/environment-detection.ts +119 -0
  525. package/src/bridge/internal/hand-off.test.ts +408 -0
  526. package/src/bridge/internal/hand-off.ts +275 -0
  527. package/src/bridge/internal/health-endpoint.test.ts +147 -0
  528. package/src/bridge/internal/health-endpoint.ts +100 -0
  529. package/src/bridge/internal/host-protocol.test.ts +415 -0
  530. package/src/bridge/internal/host-protocol.ts +255 -0
  531. package/src/bridge/internal/session-tracker.test.ts +535 -0
  532. package/src/bridge/internal/session-tracker.ts +198 -0
  533. package/src/bridge/internal/transport-client.test.ts +241 -0
  534. package/src/bridge/internal/transport-client.ts +194 -0
  535. package/src/bridge/internal/transport-server.test.ts +220 -0
  536. package/src/bridge/internal/transport-server.ts +242 -0
  537. package/src/bridge/types.ts +161 -0
  538. package/src/cli/adapters/cli-command-adapter-handler.test.ts +318 -0
  539. package/src/cli/adapters/cli-command-adapter.test.ts +221 -0
  540. package/src/cli/adapters/cli-command-adapter.ts +342 -0
  541. package/src/cli/adapters/group-builder.test.ts +146 -0
  542. package/src/cli/adapters/group-builder.ts +81 -0
  543. package/src/cli/adapters/help-formatter.test.ts +97 -0
  544. package/src/cli/adapters/help-formatter.ts +86 -0
  545. package/src/cli/adapters/target-resolver.test.ts +222 -0
  546. package/src/cli/adapters/target-resolver.ts +144 -0
  547. package/src/cli/args/global-args.ts +2 -0
  548. package/src/cli/cli.ts +100 -21
  549. package/src/cli/resolve-script-content.ts +36 -0
  550. package/src/cli/resolve-session.test.ts +141 -0
  551. package/src/cli/resolve-session.ts +66 -0
  552. package/src/cli/script-executor.ts +22 -4
  553. package/src/cli/types.ts +11 -0
  554. package/src/commands/connect.test.ts +61 -0
  555. package/src/commands/connect.ts +32 -0
  556. package/src/commands/console/exec/exec.test.ts +258 -0
  557. package/src/commands/console/exec/exec.ts +130 -0
  558. package/src/commands/console/exec/execute.luau +202 -0
  559. package/src/commands/console/logs/logs.test.ts +138 -0
  560. package/src/commands/console/logs/logs.ts +115 -0
  561. package/src/commands/console/logs/query-logs.luau +76 -0
  562. package/src/commands/disconnect.test.ts +21 -0
  563. package/src/commands/disconnect.ts +12 -0
  564. package/src/commands/explorer/query/query-data-model.luau +206 -0
  565. package/src/commands/explorer/query/query.test.ts +297 -0
  566. package/src/commands/explorer/query/query.ts +157 -0
  567. package/src/commands/formatters.test.ts +237 -0
  568. package/src/commands/framework/action-loader.test.ts +118 -0
  569. package/src/commands/framework/action-loader.ts +65 -0
  570. package/src/commands/framework/arg-builder.test.ts +298 -0
  571. package/src/commands/framework/arg-builder.ts +203 -0
  572. package/src/commands/framework/command-registry.test.ts +204 -0
  573. package/src/commands/framework/command-registry.ts +51 -0
  574. package/src/commands/framework/define-command.test.ts +161 -0
  575. package/src/commands/framework/define-command.ts +114 -0
  576. package/src/commands/framework/index.ts +33 -0
  577. package/src/commands/index.ts +72 -0
  578. package/src/commands/linux/inject-credentials/inject-credentials.ts +118 -0
  579. package/src/commands/linux/setup/setup.ts +145 -0
  580. package/src/commands/linux/status/status.ts +180 -0
  581. package/src/commands/plugin/install/install.ts +31 -0
  582. package/src/commands/plugin/uninstall/uninstall.ts +54 -0
  583. package/src/commands/process/close/close.ts +52 -0
  584. package/src/commands/process/format-state.ts +21 -0
  585. package/src/commands/process/info/info.test.ts +76 -0
  586. package/src/commands/process/info/info.ts +54 -0
  587. package/src/commands/process/info/query-state.luau +48 -0
  588. package/src/commands/process/launch/launch.test.ts +65 -0
  589. package/src/commands/process/launch/launch.ts +45 -0
  590. package/src/commands/process/list/list.test.ts +82 -0
  591. package/src/commands/process/list/list.ts +75 -0
  592. package/src/commands/process/run/run.ts +98 -0
  593. package/src/commands/rgba-to-png.ts +98 -0
  594. package/src/commands/serve/serve.test.ts +139 -0
  595. package/src/commands/serve/serve.ts +161 -0
  596. package/src/commands/viewport/screenshot/capture-screenshot.luau +247 -0
  597. package/src/commands/viewport/screenshot/screenshot.test.ts +181 -0
  598. package/src/commands/viewport/screenshot/screenshot.ts +71 -0
  599. package/src/docker/docker-delegator.test.ts +159 -0
  600. package/src/docker/docker-delegator.ts +240 -0
  601. package/src/index.test.ts +58 -0
  602. package/src/index.ts +104 -3
  603. package/src/linux/README.md +130 -0
  604. package/src/linux/index.ts +25 -0
  605. package/src/linux/linux-config.test.ts +66 -0
  606. package/src/linux/linux-config.ts +102 -0
  607. package/src/linux/linux-credential-writer.ts +421 -0
  608. package/src/linux/linux-display-manager.ts +106 -0
  609. package/src/linux/linux-env-guard.test.ts +62 -0
  610. package/src/linux/linux-env-guard.ts +38 -0
  611. package/src/linux/linux-fflags.test.ts +78 -0
  612. package/src/linux/linux-fflags.ts +48 -0
  613. package/src/linux/linux-prerequisites.ts +152 -0
  614. package/src/linux/linux-shader-patcher.test.ts +76 -0
  615. package/src/linux/linux-shader-patcher.ts +56 -0
  616. package/src/linux/linux-studio-installer.ts +113 -0
  617. package/src/linux/linux-studio-launcher.ts +90 -0
  618. package/src/linux/linux-version-resolver.ts +74 -0
  619. package/src/linux/linux-wine-env.test.ts +56 -0
  620. package/src/linux/linux-wine-env.ts +38 -0
  621. package/src/linux/write-cred.c +48 -0
  622. package/src/plugin/persistent-plugin-installer.test.ts +171 -0
  623. package/src/plugin/persistent-plugin-installer.ts +90 -0
  624. package/src/plugin/plugin-discovery.test.ts +70 -0
  625. package/src/plugin/plugin-discovery.ts +21 -0
  626. package/src/plugin/plugin-injector.ts +1 -1
  627. package/src/process/studio-process-manager.test.ts +22 -1
  628. package/src/process/studio-process-manager.ts +59 -18
  629. package/src/server/action-dispatcher.test.ts +240 -0
  630. package/src/server/action-dispatcher.ts +89 -0
  631. package/src/server/index.ts +0 -3
  632. package/src/server/pending-request-map.test.ts +261 -0
  633. package/src/server/pending-request-map.ts +87 -0
  634. package/src/server/plugin-detection.test.ts +195 -0
  635. package/src/server/studio-bridge-server.test.ts +321 -283
  636. package/src/server/studio-bridge-server.ts +469 -111
  637. package/src/server/web-socket-protocol-basic.test.ts +131 -0
  638. package/src/server/web-socket-protocol.test.ts +658 -159
  639. package/src/server/web-socket-protocol.ts +668 -58
  640. package/src/test/e2e/hand-off.test.ts +338 -0
  641. package/src/test/e2e/persistent-session.test.ts +442 -0
  642. package/src/test/e2e/split-server.test.ts +290 -0
  643. package/src/test/helpers/mock-plugin-client.ts +276 -0
  644. package/templates/studio-bridge-plugin/src/Shared/ActionRouter.luau +245 -0
  645. package/templates/studio-bridge-plugin/src/Shared/DiscoveryStateMachine.luau +203 -0
  646. package/templates/studio-bridge-plugin/src/Shared/MessageBuffer.luau +144 -0
  647. package/templates/studio-bridge-plugin/src/Shared/Protocol.luau +132 -0
  648. package/templates/studio-bridge-plugin/src/StudioBridgePlugin.server.lua +364 -133
  649. package/templates/studio-bridge-plugin/src/Vendor/png.luau +1247 -0
  650. package/templates/studio-bridge-plugin-test/test/actions.test.luau +580 -0
  651. package/templates/studio-bridge-plugin-test/test/discovery.test.luau +622 -0
  652. package/templates/studio-bridge-plugin-test/test/execute-handler.test.luau +406 -0
  653. package/templates/studio-bridge-plugin-test/test/hash-lifecycle.test.luau +814 -0
  654. package/templates/studio-bridge-plugin-test/test/integration.test.luau +1020 -0
  655. package/templates/studio-bridge-plugin-test/test/new-actions.test.luau +339 -0
  656. package/templates/studio-bridge-plugin-test/test/plugin-entry.test.luau +493 -0
  657. package/templates/studio-bridge-plugin-test/test/protocol.test.luau +506 -0
  658. package/templates/studio-bridge-plugin-test/test/roblox-mocks.luau +108 -0
  659. package/templates/studio-bridge-plugin-test/test/test-runner.luau +112 -0
  660. package/dist/src/cli/commands/exec-command.d.ts +0 -15
  661. package/dist/src/cli/commands/exec-command.d.ts.map +0 -1
  662. package/dist/src/cli/commands/exec-command.js +0 -35
  663. package/dist/src/cli/commands/exec-command.js.map +0 -1
  664. package/dist/src/cli/commands/run-command.d.ts +0 -15
  665. package/dist/src/cli/commands/run-command.d.ts.map +0 -1
  666. package/dist/src/cli/commands/run-command.js +0 -47
  667. package/dist/src/cli/commands/run-command.js.map +0 -1
  668. package/dist/src/cli/commands/terminal/terminal-command.d.ts +0 -17
  669. package/dist/src/cli/commands/terminal/terminal-command.d.ts.map +0 -1
  670. package/dist/src/cli/commands/terminal/terminal-command.js +0 -41
  671. package/dist/src/cli/commands/terminal/terminal-command.js.map +0 -1
  672. package/dist/src/cli/commands/terminal/terminal-editor.d.ts +0 -43
  673. package/dist/src/cli/commands/terminal/terminal-editor.d.ts.map +0 -1
  674. package/dist/src/cli/commands/terminal/terminal-editor.js +0 -430
  675. package/dist/src/cli/commands/terminal/terminal-editor.js.map +0 -1
  676. package/dist/src/cli/commands/terminal/terminal-mode.d.ts +0 -13
  677. package/dist/src/cli/commands/terminal/terminal-mode.d.ts.map +0 -1
  678. package/dist/src/cli/commands/terminal/terminal-mode.js +0 -141
  679. package/dist/src/cli/commands/terminal/terminal-mode.js.map +0 -1
  680. package/dist/src/server/web-socket-protocol.smoke.test.d.ts +0 -6
  681. package/dist/src/server/web-socket-protocol.smoke.test.d.ts.map +0 -1
  682. package/dist/src/server/web-socket-protocol.smoke.test.js +0 -196
  683. package/dist/src/server/web-socket-protocol.smoke.test.js.map +0 -1
  684. package/src/cli/commands/exec-command.ts +0 -48
  685. package/src/cli/commands/run-command.ts +0 -63
  686. package/src/cli/commands/terminal/terminal-command.ts +0 -54
  687. package/src/cli/commands/terminal/terminal-editor.ts +0 -500
  688. package/src/cli/commands/terminal/terminal-mode.ts +0 -184
  689. package/src/server/web-socket-protocol.smoke.test.ts +0 -255
@@ -0,0 +1,247 @@
1
+ --!optimize 2
2
+ --[[
3
+ CaptureScreenshot action handler for the studio-bridge plugin.
4
+
5
+ Captures the Studio viewport using CaptureService, loads the result into
6
+ an EditableImage to read raw RGBA pixels, encodes as PNG via png-luau,
7
+ base64-encodes the PNG via EncodingService, and sends it over the WebSocket.
8
+
9
+ Protocol:
10
+ Request: { type: "captureScreenshot", payload: { format?: "png" } }
11
+ Response: { type: "screenshotResult", payload: { data, format, width, height } }
12
+ ]]
13
+
14
+ -- PNG encoder is injected via router._vendorPng (set by the plugin before
15
+ -- actions are pushed). Falls back gracefully to raw RGBA if unavailable.
16
+ local _png = nil
17
+ local _disposed = false
18
+
19
+ local CaptureScreenshotAction = {}
20
+
21
+ -- ---------------------------------------------------------------------------
22
+ -- Helpers
23
+ -- ---------------------------------------------------------------------------
24
+
25
+ local function buildResponse(sessionId: string, requestId: string?, payload: { [string]: any }): { [string]: any }
26
+ local msg: { [string]: any } = {
27
+ type = "screenshotResult",
28
+ sessionId = sessionId,
29
+ payload = payload,
30
+ }
31
+ if requestId ~= nil and requestId ~= "" then
32
+ msg.requestId = requestId
33
+ end
34
+ return msg
35
+ end
36
+
37
+ local function buildError(sessionId: string, requestId: string?, code: string, message: string): { [string]: any }
38
+ local msg: { [string]: any } = {
39
+ type = "error",
40
+ sessionId = sessionId,
41
+ payload = { code = code, message = message },
42
+ }
43
+ if requestId ~= nil and requestId ~= "" then
44
+ msg.requestId = requestId
45
+ end
46
+ return msg
47
+ end
48
+
49
+ -- ---------------------------------------------------------------------------
50
+ -- Core capture logic (runs in a spawned thread)
51
+ -- ---------------------------------------------------------------------------
52
+
53
+ local function captureAsync(sendMessage: (msg: { [string]: any }) -> (), requestId: string?, sessionId: string)
54
+ -- Resolve services (deferred so the module loads in Lune test context)
55
+ local getServiceOk, captureServiceOrErr, assetServiceOrErr, encodingServiceOrErr = pcall(function()
56
+ return game:GetService("CaptureService"), game:GetService("AssetService"), game:GetService("EncodingService")
57
+ end)
58
+ if not getServiceOk then
59
+ sendMessage(
60
+ buildError(sessionId, requestId, "CAPTURE_FAILED", `Required services not available: {captureServiceOrErr}`)
61
+ )
62
+ return
63
+ end
64
+ local CaptureService = captureServiceOrErr
65
+ local AssetService = assetServiceOrErr
66
+ local EncodingService = encodingServiceOrErr
67
+
68
+ -- Step 1: Capture the viewport via CaptureService
69
+ local callerThread = coroutine.running()
70
+ local contentId: string? = nil
71
+ local captureOk, captureErr = pcall(function()
72
+ CaptureService:CaptureScreenshot(function(id)
73
+ contentId = id
74
+ task.spawn(callerThread)
75
+ end)
76
+ end)
77
+
78
+ if not captureOk then
79
+ sendMessage(buildError(sessionId, requestId, "CAPTURE_FAILED", `CaptureService failed: {captureErr}`))
80
+ return
81
+ end
82
+
83
+ -- Wait for the callback
84
+ coroutine.yield()
85
+
86
+ if _disposed then return end
87
+
88
+ if not contentId or contentId == "" then
89
+ sendMessage(buildError(sessionId, requestId, "CAPTURE_FAILED", "CaptureService returned no content ID"))
90
+ return
91
+ end
92
+
93
+ -- Step 2: Load into an EditableImage to read pixels
94
+ local editableOk, editableImage = pcall(function()
95
+ return AssetService:CreateEditableImageAsync(Content.fromUri(contentId :: string))
96
+ end)
97
+
98
+ if not editableOk or not editableImage then
99
+ sendMessage(
100
+ buildError(
101
+ sessionId,
102
+ requestId,
103
+ "EDITABLE_IMAGE_FAILED",
104
+ `Failed to create EditableImage from capture: {editableImage or "unknown error"}`
105
+ )
106
+ )
107
+ return
108
+ end
109
+
110
+ -- Step 3: Read all pixels as RGBA buffer
111
+ -- ReadPixelsBuffer has a 1024x1024 limit. If the screenshot is larger,
112
+ -- scale it down into a new EditableImage that fits within the limit.
113
+ local MAX_SIZE = 1024
114
+ local srcWidth = editableImage.Size.X
115
+ local srcHeight = editableImage.Size.Y
116
+ local width = srcWidth
117
+ local height = srcHeight
118
+
119
+ local readTarget = editableImage
120
+ local scaledImage = nil
121
+
122
+ if srcWidth > MAX_SIZE or srcHeight > MAX_SIZE then
123
+ local scale = math.min(MAX_SIZE / srcWidth, MAX_SIZE / srcHeight)
124
+ width = math.floor(srcWidth * scale)
125
+ height = math.floor(srcHeight * scale)
126
+
127
+ local scaleOk, scaleResult = pcall(function()
128
+ local scaled = AssetService:CreateEditableImage({ Size = Vector2.new(width, height) })
129
+ scaled:DrawImageTransformed(
130
+ Vector2.new(width / 2, height / 2), -- center position
131
+ Vector2.new(scale, scale), -- scale
132
+ 0, -- rotation
133
+ editableImage
134
+ )
135
+ return scaled
136
+ end)
137
+
138
+ if scaleOk and scaleResult then
139
+ scaledImage = scaleResult
140
+ readTarget = scaleResult
141
+ else
142
+ -- If scaling fails, just read the top-left 1024x1024 corner
143
+ width = math.min(srcWidth, MAX_SIZE)
144
+ height = math.min(srcHeight, MAX_SIZE)
145
+ end
146
+ end
147
+
148
+ local pixelsOk, pixelsBuf = pcall(function()
149
+ return readTarget:ReadPixelsBuffer(Vector2.zero, Vector2.new(width, height))
150
+ end)
151
+
152
+ -- Clean up EditableImages immediately to free memory
153
+ pcall(function()
154
+ editableImage:Destroy()
155
+ end)
156
+ if scaledImage then
157
+ pcall(function()
158
+ scaledImage:Destroy()
159
+ end)
160
+ end
161
+
162
+ if not pixelsOk or not pixelsBuf then
163
+ sendMessage(
164
+ buildError(
165
+ sessionId,
166
+ requestId,
167
+ "PIXEL_READ_FAILED",
168
+ `Failed to read pixels: {pixelsBuf or "unknown error"}`
169
+ )
170
+ )
171
+ return
172
+ end
173
+
174
+ -- Step 4: Encode as PNG (if available) or raw RGBA, then base64
175
+ local dataBuf = pixelsBuf
176
+ local format = "rgba"
177
+
178
+ if _png then
179
+ local pngOk, pngBuf = pcall(_png.encode, pixelsBuf, { width = width, height = height })
180
+ if pngOk and pngBuf then
181
+ dataBuf = pngBuf
182
+ format = "png"
183
+ end
184
+ end
185
+
186
+ local encodeOk, encoded = pcall(function()
187
+ return EncodingService:Base64Encode(dataBuf)
188
+ end)
189
+ if not encodeOk or not encoded then
190
+ sendMessage(
191
+ buildError(
192
+ sessionId,
193
+ requestId,
194
+ "ENCODE_FAILED",
195
+ `Failed to base64 encode data: {encoded or "unknown error"}`
196
+ )
197
+ )
198
+ return
199
+ end
200
+
201
+ -- Step 5: Send the result
202
+ sendMessage(buildResponse(sessionId, requestId, {
203
+ data = encoded,
204
+ format = format,
205
+ width = width,
206
+ height = height,
207
+ }))
208
+ end
209
+
210
+ -- ---------------------------------------------------------------------------
211
+ -- Public API
212
+ -- ---------------------------------------------------------------------------
213
+
214
+ function CaptureScreenshotAction.register(router: any, sendMessage: ((msg: { [string]: any }) -> ())?)
215
+ _disposed = false
216
+ router:setResponseType("captureScreenshot", "screenshotResult")
217
+ -- Capture the PNG encoder from the router's shared deps (set by the plugin)
218
+ _png = router._vendorPng or nil
219
+
220
+ router:register("captureScreenshot", function(_payload: { [string]: any }, requestId: string, sessionId: string): { [string]: any }?
221
+ if not sendMessage then
222
+ return {
223
+ code = "CAPABILITY_NOT_SUPPORTED",
224
+ message = "Screenshot capture requires a sendMessage callback",
225
+ }
226
+ end
227
+
228
+ -- Run asynchronously since CaptureService uses a callback.
229
+ -- pcall guards against Lune test context where task is not available.
230
+ local spawnOk = pcall(function()
231
+ task.spawn(captureAsync, sendMessage, requestId, sessionId)
232
+ end)
233
+ if not spawnOk then
234
+ -- Fallback: call directly (will fail on GetService in Lune)
235
+ captureAsync(sendMessage, requestId, sessionId)
236
+ end
237
+
238
+ -- Return nil so ActionRouter does not generate a wrapped response
239
+ return nil
240
+ end)
241
+ end
242
+
243
+ function CaptureScreenshotAction.teardown()
244
+ _disposed = true
245
+ end
246
+
247
+ return CaptureScreenshotAction
@@ -0,0 +1,181 @@
1
+ /**
2
+ * Unit tests for the screenshot command handler.
3
+ */
4
+
5
+ import { describe, it, expect, vi } from 'vitest';
6
+ import { captureScreenshotHandlerAsync } from './screenshot.js';
7
+ import { rgbaToPng } from '../../rgba-to-png.js';
8
+
9
+ function createMockSession(screenshotResult: {
10
+ data: string;
11
+ format: 'png' | 'rgba';
12
+ width: number;
13
+ height: number;
14
+ }) {
15
+ return {
16
+ captureScreenshotAsync: vi.fn().mockResolvedValue(screenshotResult),
17
+ } as any;
18
+ }
19
+
20
+ describe('rgbaToPng', () => {
21
+ it('produces a valid PNG for a 1x1 red pixel', () => {
22
+ // 1x1 RGBA: red pixel (255, 0, 0, 255)
23
+ const rgba = Buffer.from([255, 0, 0, 255]);
24
+ const png = rgbaToPng(rgba, 1, 1);
25
+
26
+ // Check PNG signature
27
+ expect(png[0]).toBe(137);
28
+ expect(png[1]).toBe(80); // 'P'
29
+ expect(png[2]).toBe(78); // 'N'
30
+ expect(png[3]).toBe(71); // 'G'
31
+ expect(png.length).toBeGreaterThan(8);
32
+ });
33
+
34
+ it('produces a valid PNG for a 2x2 image', () => {
35
+ // 2x2 RGBA: 4 pixels * 4 bytes = 16 bytes
36
+ const rgba = Buffer.alloc(16, 0);
37
+ // Set all pixels to blue (0, 0, 255, 255)
38
+ for (let i = 0; i < 4; i++) {
39
+ rgba[i * 4 + 2] = 255;
40
+ rgba[i * 4 + 3] = 255;
41
+ }
42
+ const png = rgbaToPng(rgba, 2, 2);
43
+
44
+ // Check PNG signature
45
+ expect(png.subarray(0, 4)).toEqual(Buffer.from([137, 80, 78, 71]));
46
+ });
47
+
48
+ it('throws on data length mismatch', () => {
49
+ const rgba = Buffer.alloc(10); // Wrong size for any dimensions
50
+ expect(() => rgbaToPng(rgba, 2, 2)).toThrow('data length mismatch');
51
+ });
52
+
53
+ it('round-trips: PNG starts with signature and ends with IEND', () => {
54
+ const rgba = Buffer.alloc(4 * 4 * 4, 128); // 4x4 gray pixels
55
+ const png = rgbaToPng(rgba, 4, 4);
56
+
57
+ // Signature
58
+ expect(png.subarray(0, 8)).toEqual(
59
+ Buffer.from([137, 80, 78, 71, 13, 10, 26, 10])
60
+ );
61
+
62
+ // IEND chunk at end: length(0) + "IEND" + CRC
63
+ const iendType = png
64
+ .subarray(png.length - 8, png.length - 4)
65
+ .toString('ascii');
66
+ expect(iendType).toBe('IEND');
67
+ });
68
+ });
69
+
70
+ describe('captureScreenshotHandlerAsync', () => {
71
+ it('returns screenshot result with summary (png format)', async () => {
72
+ const session = createMockSession({
73
+ data: 'iVBORw0KGgoAAAANSUhEUg==',
74
+ format: 'png',
75
+ width: 1920,
76
+ height: 1080,
77
+ });
78
+
79
+ const result = await captureScreenshotHandlerAsync(session);
80
+
81
+ expect(result.data).toBe('iVBORw0KGgoAAAANSUhEUg==');
82
+ expect(result.width).toBe(1920);
83
+ expect(result.height).toBe(1080);
84
+ expect(result.summary).toBe('Screenshot captured (1920x1080)');
85
+ });
86
+
87
+ it('converts rgba format to png', async () => {
88
+ // 1x1 red pixel as RGBA
89
+ const rgbaBase64 = Buffer.from([255, 0, 0, 255]).toString('base64');
90
+ const session = createMockSession({
91
+ data: rgbaBase64,
92
+ format: 'rgba',
93
+ width: 1,
94
+ height: 1,
95
+ });
96
+
97
+ const result = await captureScreenshotHandlerAsync(session);
98
+
99
+ // Result should be valid PNG base64
100
+ const pngBuffer = Buffer.from(result.data, 'base64');
101
+ expect(pngBuffer[0]).toBe(137); // PNG signature
102
+ expect(pngBuffer[1]).toBe(80);
103
+ expect(result.width).toBe(1);
104
+ expect(result.height).toBe(1);
105
+ expect(result.summary).toBe('Screenshot captured (1x1)');
106
+ });
107
+
108
+ it('calls session.captureScreenshotAsync', async () => {
109
+ const session = createMockSession({
110
+ data: 'base64data',
111
+ format: 'png',
112
+ width: 800,
113
+ height: 600,
114
+ });
115
+
116
+ await captureScreenshotHandlerAsync(session);
117
+
118
+ expect(session.captureScreenshotAsync).toHaveBeenCalledOnce();
119
+ });
120
+
121
+ it('handles different dimensions', async () => {
122
+ const session = createMockSession({
123
+ data: 'abc',
124
+ format: 'png',
125
+ width: 3840,
126
+ height: 2160,
127
+ });
128
+
129
+ const result = await captureScreenshotHandlerAsync(session);
130
+
131
+ expect(result.width).toBe(3840);
132
+ expect(result.height).toBe(2160);
133
+ expect(result.summary).toContain('3840x2160');
134
+ });
135
+
136
+ it('propagates errors from session', async () => {
137
+ const session = {
138
+ captureScreenshotAsync: vi
139
+ .fn()
140
+ .mockRejectedValue(new Error('Screenshot failed')),
141
+ } as any;
142
+
143
+ await expect(captureScreenshotHandlerAsync(session)).rejects.toThrow(
144
+ 'Screenshot failed'
145
+ );
146
+ });
147
+
148
+ it('handles missing fields gracefully', async () => {
149
+ const session = {
150
+ captureScreenshotAsync: vi.fn().mockResolvedValue({
151
+ data: undefined,
152
+ format: 'png',
153
+ width: undefined,
154
+ height: undefined,
155
+ }),
156
+ } as any;
157
+
158
+ const result = await captureScreenshotHandlerAsync(session);
159
+
160
+ expect(result.data).toBe('');
161
+ expect(result.width).toBe(0);
162
+ expect(result.height).toBe(0);
163
+ expect(result.summary).toBe('Screenshot captured (0x0)');
164
+ });
165
+
166
+ it('passes options without affecting capture', async () => {
167
+ const session = createMockSession({
168
+ data: 'base64data',
169
+ format: 'png',
170
+ width: 1280,
171
+ height: 720,
172
+ });
173
+
174
+ const result = await captureScreenshotHandlerAsync(session, {
175
+ output: '/tmp/screenshot.png',
176
+ });
177
+
178
+ expect(result.data).toBe('base64data');
179
+ expect(session.captureScreenshotAsync).toHaveBeenCalledOnce();
180
+ });
181
+ });
@@ -0,0 +1,71 @@
1
+ /**
2
+ * `viewport screenshot` — capture a viewport screenshot from a
3
+ * connected Studio session.
4
+ */
5
+
6
+ import { defineCommand } from '../../framework/define-command.js';
7
+ import type { BridgeSession } from '../../../bridge/index.js';
8
+ import type { ScreenshotResult as BridgeScreenshotResult } from '../../../bridge/index.js';
9
+ import { rgbaToPng } from '../../rgba-to-png.js';
10
+ import { formatJson } from '@quenty/cli-output-helpers/reporting';
11
+
12
+ export interface ScreenshotResult {
13
+ data: string;
14
+ width: number;
15
+ height: number;
16
+ summary: string;
17
+ }
18
+
19
+ export interface ScreenshotOptions {
20
+ output?: string;
21
+ }
22
+
23
+ export async function captureScreenshotHandlerAsync(
24
+ session: BridgeSession,
25
+ _options: ScreenshotOptions = {}
26
+ ): Promise<ScreenshotResult> {
27
+ const result: BridgeScreenshotResult = await session.captureScreenshotAsync();
28
+
29
+ let pngBase64: string;
30
+ if (result.format === 'rgba') {
31
+ const rgbaBuffer = Buffer.from(result.data, 'base64');
32
+ const pngBuffer = rgbaToPng(rgbaBuffer, result.width, result.height);
33
+ pngBase64 = pngBuffer.toString('base64');
34
+ } else {
35
+ pngBase64 = result.data ?? '';
36
+ }
37
+
38
+ return {
39
+ data: pngBase64,
40
+ width: result.width ?? 0,
41
+ height: result.height ?? 0,
42
+ summary: `Screenshot captured (${result.width ?? 0}x${result.height ?? 0})`,
43
+ };
44
+ }
45
+
46
+ export const screenshotCommand = defineCommand<
47
+ ScreenshotOptions,
48
+ ScreenshotResult
49
+ >({
50
+ group: 'viewport',
51
+ name: 'screenshot',
52
+ description: 'Capture a viewport screenshot from Studio',
53
+ category: 'execution',
54
+ safety: 'read',
55
+ scope: 'session',
56
+ args: {},
57
+ cli: {
58
+ binaryField: 'data',
59
+ format: (result) => result.summary,
60
+ json: (result) =>
61
+ formatJson(
62
+ {
63
+ width: result.width,
64
+ height: result.height,
65
+ summary: result.summary,
66
+ },
67
+ { pretty: process.stdout.isTTY }
68
+ ),
69
+ },
70
+ handler: async (session) => captureScreenshotHandlerAsync(session),
71
+ });
@@ -0,0 +1,159 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+
3
+ // Mock execa and fs before importing the module
4
+ vi.mock('execa', () => ({
5
+ execa: vi.fn(),
6
+ }));
7
+
8
+ vi.mock('fs/promises', () => ({
9
+ writeFile: vi.fn().mockResolvedValue(undefined),
10
+ unlink: vi.fn().mockResolvedValue(undefined),
11
+ }));
12
+
13
+ vi.mock('@quenty/cli-output-helpers', () => ({
14
+ OutputHelper: {
15
+ error: vi.fn(),
16
+ warn: vi.fn(),
17
+ info: vi.fn(),
18
+ verbose: vi.fn(),
19
+ },
20
+ }));
21
+
22
+ import { execa } from 'execa';
23
+ import {
24
+ shouldDelegateToDockerAsync,
25
+ buildDockerRunArgsAsync,
26
+ } from './docker-delegator.js';
27
+ import type { ExecuteScriptOptions } from '../cli/script-executor.js';
28
+
29
+ const mockedExeca = vi.mocked(execa);
30
+
31
+ describe('shouldDelegateToDockerAsync', () => {
32
+ const originalPlatform = process.platform;
33
+
34
+ afterEach(() => {
35
+ vi.restoreAllMocks();
36
+ Object.defineProperty(process, 'platform', { value: originalPlatform });
37
+ });
38
+
39
+ it('returns false on non-Linux platforms', async () => {
40
+ Object.defineProperty(process, 'platform', { value: 'darwin' });
41
+ expect(await shouldDelegateToDockerAsync()).toBe(false);
42
+ });
43
+
44
+ it('returns false when Wine is available on Linux', async () => {
45
+ Object.defineProperty(process, 'platform', { value: 'linux' });
46
+ mockedExeca.mockResolvedValueOnce({ exitCode: 0 } as any);
47
+ expect(await shouldDelegateToDockerAsync()).toBe(false);
48
+ });
49
+
50
+ it('returns true when Wine is missing but Docker is available', async () => {
51
+ Object.defineProperty(process, 'platform', { value: 'linux' });
52
+ mockedExeca.mockRejectedValueOnce(new Error('wine not found'));
53
+ mockedExeca.mockResolvedValueOnce({ exitCode: 0 } as any);
54
+ expect(await shouldDelegateToDockerAsync()).toBe(true);
55
+ });
56
+
57
+ it('returns false when neither Wine nor Docker is available', async () => {
58
+ Object.defineProperty(process, 'platform', { value: 'linux' });
59
+ mockedExeca.mockRejectedValueOnce(new Error('wine not found'));
60
+ mockedExeca.mockRejectedValueOnce(new Error('docker not found'));
61
+ expect(await shouldDelegateToDockerAsync()).toBe(false);
62
+ });
63
+ });
64
+
65
+ describe('buildDockerRunArgsAsync', () => {
66
+ const cwd = '/workspace/project';
67
+ const cookie = 'test-cookie';
68
+
69
+ beforeEach(() => {
70
+ vi.restoreAllMocks();
71
+ });
72
+
73
+ it('builds correct args for inline script', async () => {
74
+ const options: ExecuteScriptOptions = {
75
+ scriptContent: 'print("hello")',
76
+ packageName: 'studio-bridge',
77
+ timeoutMs: 120_000,
78
+ verbose: false,
79
+ showLogs: true,
80
+ };
81
+
82
+ const args = await buildDockerRunArgsAsync(options, cwd, cookie);
83
+
84
+ expect(args).toContain('--rm');
85
+ expect(args).toContain('--init');
86
+ // Cookie value must NOT appear in argv; docker reads it from its own env
87
+ expect(args).toContain('ROBLOSECURITY');
88
+ expect(args).not.toContain(`ROBLOSECURITY=${cookie}`);
89
+ expect(args.every((a) => !a.includes(cookie))).toBe(true);
90
+ expect(args).toContain(`${cwd}:${cwd}`);
91
+ expect(args).toContain(cwd);
92
+ expect(args).toContain('ghcr.io/quenty/nevermore-studio-linux:latest');
93
+ // Inner command should include auth then run
94
+ const bashCmd = args[args.length - 1];
95
+ expect(bashCmd).toContain('studio-bridge linux inject-credentials');
96
+ expect(bashCmd).toContain('studio-bridge process run');
97
+ expect(bashCmd).toContain('--timeout 120000');
98
+ expect(bashCmd).not.toContain('--verbose');
99
+ });
100
+
101
+ it('passes --verbose through to inner command', async () => {
102
+ const options: ExecuteScriptOptions = {
103
+ scriptContent: 'print("hello")',
104
+ packageName: 'studio-bridge',
105
+ timeoutMs: 60_000,
106
+ verbose: true,
107
+ showLogs: true,
108
+ };
109
+
110
+ const args = await buildDockerRunArgsAsync(options, cwd, cookie);
111
+ const bashCmd = args[args.length - 1];
112
+ expect(bashCmd).toContain('--verbose');
113
+ });
114
+
115
+ it('passes --place through when specified', async () => {
116
+ const options: ExecuteScriptOptions = {
117
+ scriptContent: 'print("hello")',
118
+ packageName: 'studio-bridge',
119
+ placePath: '/workspace/project/test.rbxl',
120
+ timeoutMs: 120_000,
121
+ verbose: false,
122
+ showLogs: true,
123
+ };
124
+
125
+ const args = await buildDockerRunArgsAsync(options, cwd, cookie);
126
+ const bashCmd = args[args.length - 1];
127
+ expect(bashCmd).toContain('--place /workspace/project/test.rbxl');
128
+ });
129
+
130
+ it('uses original file path when filePath is set', async () => {
131
+ const options: ExecuteScriptOptions = {
132
+ scriptContent: 'print("hello")',
133
+ packageName: 'studio-bridge',
134
+ timeoutMs: 120_000,
135
+ verbose: false,
136
+ showLogs: true,
137
+ filePath: '/workspace/project/script.lua',
138
+ };
139
+
140
+ const args = await buildDockerRunArgsAsync(options, cwd, cookie);
141
+ const bashCmd = args[args.length - 1];
142
+ expect(bashCmd).toContain('--file /workspace/project/script.lua');
143
+ });
144
+
145
+ it('calculates docker timeout with 60s buffer', async () => {
146
+ const options: ExecuteScriptOptions = {
147
+ scriptContent: 'print("hello")',
148
+ packageName: 'studio-bridge',
149
+ timeoutMs: 120_000,
150
+ verbose: false,
151
+ showLogs: true,
152
+ };
153
+
154
+ const args = await buildDockerRunArgsAsync(options, cwd, cookie);
155
+ const stopIdx = args.indexOf('--stop-timeout');
156
+ expect(stopIdx).toBeGreaterThan(-1);
157
+ expect(args[stopIdx + 1]).toBe('180'); // (120000 + 60000) / 1000
158
+ });
159
+ });