@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,51 @@
1
+ /**
2
+ * Command registry — collects `CommandDefinition` objects and provides
3
+ * lookup by group, name, category, and scope.
4
+ */
5
+
6
+ import type { CommandDefinition, CommandCategory } from './define-command.js';
7
+
8
+ export class CommandRegistry {
9
+ private _commands: CommandDefinition[] = [];
10
+
11
+ /** Register a command definition. */
12
+ register(def: CommandDefinition): void {
13
+ this._commands.push(def);
14
+ }
15
+
16
+ /** Return all registered commands in insertion order. */
17
+ getAll(): readonly CommandDefinition[] {
18
+ return this._commands;
19
+ }
20
+
21
+ /** Return commands belonging to a specific group. */
22
+ getByGroup(group: string): readonly CommandDefinition[] {
23
+ return this._commands.filter((d) => d.group === group);
24
+ }
25
+
26
+ /** Return unique group names (excluding top-level commands). */
27
+ getGroups(): string[] {
28
+ const groups = new Set<string>();
29
+ for (const cmd of this._commands) {
30
+ if (cmd.group !== null) {
31
+ groups.add(cmd.group);
32
+ }
33
+ }
34
+ return [...groups];
35
+ }
36
+
37
+ /** Return top-level commands (group is `null`). */
38
+ getTopLevel(): readonly CommandDefinition[] {
39
+ return this._commands.filter((d) => d.group === null);
40
+ }
41
+
42
+ /** Return commands in a given category. */
43
+ getByCategory(category: CommandCategory): readonly CommandDefinition[] {
44
+ return this._commands.filter((d) => d.category === category);
45
+ }
46
+
47
+ /** Find a specific command by group and name. */
48
+ get(group: string | null, name: string): CommandDefinition | undefined {
49
+ return this._commands.find((d) => d.group === group && d.name === name);
50
+ }
51
+ }
@@ -0,0 +1,161 @@
1
+ /**
2
+ * Unit tests for the defineCommand factory and isCommandDefinition guard.
3
+ */
4
+
5
+ import { describe, it, expect } from 'vitest';
6
+ import {
7
+ COMMAND_BRAND,
8
+ defineCommand,
9
+ isCommandDefinition,
10
+ } from './define-command.js';
11
+ import { arg } from './arg-builder.js';
12
+
13
+ function sessionCommand() {
14
+ return defineCommand({
15
+ group: 'console',
16
+ name: 'exec',
17
+ description: 'Execute inline Luau code',
18
+ category: 'execution',
19
+ safety: 'mutate',
20
+ scope: 'session',
21
+ args: {
22
+ code: arg.positional({ description: 'Luau source code' }),
23
+ },
24
+ handler: async (_session, _args) => ({ success: true }),
25
+ });
26
+ }
27
+
28
+ function connectionCommand() {
29
+ return defineCommand({
30
+ group: 'process',
31
+ name: 'list',
32
+ description: 'List connected sessions',
33
+ category: 'infrastructure',
34
+ safety: 'read',
35
+ scope: 'connection',
36
+ args: {},
37
+ handler: async (_connection) => ({ sessions: [] }),
38
+ });
39
+ }
40
+
41
+ function standaloneCommand() {
42
+ return defineCommand({
43
+ group: null,
44
+ name: 'serve',
45
+ description: 'Start the bridge server',
46
+ category: 'infrastructure',
47
+ safety: 'none',
48
+ scope: 'standalone',
49
+ args: {},
50
+ handler: async () => ({ port: 38741 }),
51
+ });
52
+ }
53
+
54
+ describe('defineCommand', () => {
55
+ it('stamps brand symbol on session command', () => {
56
+ const cmd = sessionCommand();
57
+ expect(cmd[COMMAND_BRAND]).toBe(true);
58
+ });
59
+
60
+ it('stamps brand symbol on connection command', () => {
61
+ const cmd = connectionCommand();
62
+ expect(cmd[COMMAND_BRAND]).toBe(true);
63
+ });
64
+
65
+ it('stamps brand symbol on standalone command', () => {
66
+ const cmd = standaloneCommand();
67
+ expect(cmd[COMMAND_BRAND]).toBe(true);
68
+ });
69
+
70
+ it('preserves group, name, and description', () => {
71
+ const cmd = sessionCommand();
72
+ expect(cmd.group).toBe('console');
73
+ expect(cmd.name).toBe('exec');
74
+ expect(cmd.description).toBe('Execute inline Luau code');
75
+ });
76
+
77
+ it('preserves category and safety', () => {
78
+ const cmd = sessionCommand();
79
+ expect(cmd.category).toBe('execution');
80
+ expect(cmd.safety).toBe('mutate');
81
+ });
82
+
83
+ it('preserves scope discriminant', () => {
84
+ expect(sessionCommand().scope).toBe('session');
85
+ expect(connectionCommand().scope).toBe('connection');
86
+ expect(standaloneCommand().scope).toBe('standalone');
87
+ });
88
+
89
+ it('preserves args record', () => {
90
+ const cmd = sessionCommand();
91
+ expect(cmd.args).toHaveProperty('code');
92
+ expect(cmd.args.code.kind).toBe('positional');
93
+ });
94
+
95
+ it('preserves handler function', () => {
96
+ const cmd = sessionCommand();
97
+ expect(typeof cmd.handler).toBe('function');
98
+ });
99
+
100
+ it('preserves optional cli config', () => {
101
+ const cmd = defineCommand({
102
+ group: 'console',
103
+ name: 'exec',
104
+ description: 'Execute code',
105
+ category: 'execution',
106
+ safety: 'mutate',
107
+ scope: 'session',
108
+ args: {},
109
+ handler: async () => ({ done: true }),
110
+ cli: {
111
+ format: () => 'formatted',
112
+ },
113
+ });
114
+
115
+ expect(cmd.cli).toBeDefined();
116
+ expect(cmd.cli!.format!({} as any)).toBe('formatted');
117
+ });
118
+
119
+ it('allows null group for top-level commands', () => {
120
+ const cmd = standaloneCommand();
121
+ expect(cmd.group).toBeNull();
122
+ });
123
+ });
124
+
125
+ describe('isCommandDefinition', () => {
126
+ it('returns true for branded definition', () => {
127
+ expect(isCommandDefinition(sessionCommand())).toBe(true);
128
+ });
129
+
130
+ it('returns true for all scope variants', () => {
131
+ expect(isCommandDefinition(connectionCommand())).toBe(true);
132
+ expect(isCommandDefinition(standaloneCommand())).toBe(true);
133
+ });
134
+
135
+ it('returns false for plain object', () => {
136
+ expect(isCommandDefinition({ group: 'console', name: 'exec' })).toBe(false);
137
+ });
138
+
139
+ it('returns false for object with wrong brand value', () => {
140
+ const fake = { [COMMAND_BRAND]: 'yes' };
141
+ expect(isCommandDefinition(fake)).toBe(false);
142
+ });
143
+
144
+ it('returns false for null', () => {
145
+ expect(isCommandDefinition(null)).toBe(false);
146
+ });
147
+
148
+ it('returns false for undefined', () => {
149
+ expect(isCommandDefinition(undefined)).toBe(false);
150
+ });
151
+
152
+ it('returns false for non-object types', () => {
153
+ expect(isCommandDefinition('string')).toBe(false);
154
+ expect(isCommandDefinition(42)).toBe(false);
155
+ expect(isCommandDefinition(true)).toBe(false);
156
+ });
157
+
158
+ it('returns false for function', () => {
159
+ expect(isCommandDefinition(() => {})).toBe(false);
160
+ });
161
+ });
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Core types and `defineCommand()` factory for the declarative command system.
3
+ *
4
+ * A single `CommandDefinition` drives CLI registration. The `scope`
5
+ * discriminant determines the handler signature:
6
+ *
7
+ * - `session` — `(session: BridgeSession, args) => Promise<TResult>`
8
+ * - `connection` — `(connection: BridgeConnection, args) => Promise<TResult>`
9
+ * - `standalone` — `(args) => Promise<TResult>`
10
+ */
11
+
12
+ import type { BridgeSession, BridgeConnection } from '../../bridge/index.js';
13
+ import type { ArgDefinition } from './arg-builder.js';
14
+
15
+ /**
16
+ * Brand symbol used by the registry to identify command definitions when
17
+ * scanning module exports via dynamic `import()`.
18
+ */
19
+ export const COMMAND_BRAND = Symbol.for('studio-bridge:command');
20
+
21
+ /** Safety classification — drives targeting behavior in adapters. */
22
+ export type CommandSafety = 'read' | 'mutate' | 'none';
23
+
24
+ export type CommandScope = 'session' | 'connection' | 'standalone';
25
+
26
+ export type CommandCategory = 'execution' | 'infrastructure';
27
+
28
+ export interface CliConfig<TResult> {
29
+ /**
30
+ * Render the result for human (terminal) output. Used as the default and
31
+ * for `--format=text`. Falls back to `result.summary` then JSON if not set.
32
+ */
33
+ format?: (result: TResult) => string;
34
+ /**
35
+ * Override the default JSON output (which is `formatJson(result)`). Use
36
+ * this when the result has fields that don't belong in machine output —
37
+ * e.g. dropping a base64 binary field.
38
+ */
39
+ json?: (result: TResult) => string;
40
+ /** Field name containing base64 binary data for raw file writes via --output. */
41
+ binaryField?: string;
42
+ }
43
+
44
+ interface BaseFields<TArgs, TResult> {
45
+ /** `null` for top-level commands. */
46
+ group: string | null;
47
+ name: string;
48
+ description: string;
49
+ category: CommandCategory;
50
+ safety: CommandSafety;
51
+ args: Record<string, ArgDefinition>;
52
+ cli?: CliConfig<TResult>;
53
+ }
54
+
55
+ export interface SessionCommandInput<TArgs, TResult>
56
+ extends BaseFields<TArgs, TResult> {
57
+ scope: 'session';
58
+ handler: (session: BridgeSession, args: TArgs) => Promise<TResult>;
59
+ }
60
+
61
+ export interface ConnectionCommandInput<TArgs, TResult>
62
+ extends BaseFields<TArgs, TResult> {
63
+ scope: 'connection';
64
+ handler: (connection: BridgeConnection, args: TArgs) => Promise<TResult>;
65
+ }
66
+
67
+ export interface StandaloneCommandInput<TArgs, TResult>
68
+ extends BaseFields<TArgs, TResult> {
69
+ scope: 'standalone';
70
+ handler: (args: TArgs) => Promise<TResult>;
71
+ }
72
+
73
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
74
+ export type CommandInput<TArgs = any, TResult = any> =
75
+ | SessionCommandInput<TArgs, TResult>
76
+ | ConnectionCommandInput<TArgs, TResult>
77
+ | StandaloneCommandInput<TArgs, TResult>;
78
+
79
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
80
+ export type CommandDefinition<TArgs = any, TResult = any> = CommandInput<
81
+ TArgs,
82
+ TResult
83
+ > & { readonly [COMMAND_BRAND]: true };
84
+
85
+ /**
86
+ * Define a new command. Stamps the brand symbol so the registry can
87
+ * identify it when scanning module exports.
88
+ */
89
+ export function defineCommand<TArgs, TResult>(
90
+ input: SessionCommandInput<TArgs, TResult>
91
+ ): CommandDefinition<TArgs, TResult>;
92
+ export function defineCommand<TArgs, TResult>(
93
+ input: ConnectionCommandInput<TArgs, TResult>
94
+ ): CommandDefinition<TArgs, TResult>;
95
+ export function defineCommand<TArgs, TResult>(
96
+ input: StandaloneCommandInput<TArgs, TResult>
97
+ ): CommandDefinition<TArgs, TResult>;
98
+ export function defineCommand(input: CommandInput): CommandDefinition {
99
+ return { ...input, [COMMAND_BRAND]: true as const };
100
+ }
101
+
102
+ /**
103
+ * Check whether a value is a branded `CommandDefinition`. Used by the
104
+ * registry when scanning module exports via dynamic `import()`.
105
+ */
106
+ export function isCommandDefinition(
107
+ value: unknown
108
+ ): value is CommandDefinition {
109
+ return (
110
+ typeof value === 'object' &&
111
+ value !== null &&
112
+ (value as any)[COMMAND_BRAND] === true
113
+ );
114
+ }
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Declarative command framework. `defineCommand()` creates a single
3
+ * definition that drives the CLI adapter.
4
+ */
5
+
6
+ export {
7
+ COMMAND_BRAND,
8
+ defineCommand,
9
+ isCommandDefinition,
10
+ type CommandSafety,
11
+ type CommandScope,
12
+ type CommandCategory,
13
+ type CommandInput,
14
+ type CommandDefinition,
15
+ type SessionCommandInput,
16
+ type ConnectionCommandInput,
17
+ type StandaloneCommandInput,
18
+ type CliConfig,
19
+ } from './define-command.js';
20
+
21
+ export {
22
+ arg,
23
+ toYargsOptions,
24
+ toJsonSchema,
25
+ type ArgKind,
26
+ type ArgType,
27
+ type ArgDefinition,
28
+ type YargsPositional,
29
+ type YargsArgConfig,
30
+ type JsonSchemaOutput,
31
+ } from './arg-builder.js';
32
+
33
+ export { CommandRegistry } from './command-registry.js';
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Command registry barrel export. Every new command handler adds an
3
+ * export line here. cli.ts imports from this barrel.
4
+ */
5
+
6
+ export {
7
+ listSessionsHandlerAsync,
8
+ type SessionsResult,
9
+ } from './process/list/list.js';
10
+ export {
11
+ serveHandlerAsync,
12
+ type ServeOptions,
13
+ type ServeResult,
14
+ } from './serve/serve.js';
15
+ export {
16
+ installPluginHandlerAsync,
17
+ type InstallPluginResult,
18
+ } from './plugin/install/install.js';
19
+ export {
20
+ uninstallPluginHandlerAsync,
21
+ type UninstallPluginResult,
22
+ } from './plugin/uninstall/uninstall.js';
23
+ export {
24
+ queryStateHandlerAsync,
25
+ type StateResult,
26
+ } from './process/info/info.js';
27
+ export {
28
+ queryLogsHandlerAsync,
29
+ type LogsResult,
30
+ type LogsOptions,
31
+ } from './console/logs/logs.js';
32
+ export {
33
+ captureScreenshotHandlerAsync,
34
+ type ScreenshotResult,
35
+ type ScreenshotOptions,
36
+ } from './viewport/screenshot/screenshot.js';
37
+ export {
38
+ queryDataModelHandlerAsync,
39
+ type QueryResult,
40
+ type QueryOptions,
41
+ type DataModelNode,
42
+ } from './explorer/query/query.js';
43
+ export {
44
+ execHandlerAsync,
45
+ type ExecOptions,
46
+ type ExecResult,
47
+ } from './console/exec/exec.js';
48
+ export {
49
+ runHandlerAsync,
50
+ type RunOptions,
51
+ type RunResult,
52
+ } from './console/exec/exec.js';
53
+ export {
54
+ launchHandlerAsync,
55
+ type LaunchOptions,
56
+ type LaunchResult,
57
+ } from './process/launch/launch.js';
58
+ export {
59
+ connectHandlerAsync,
60
+ type ConnectOptions,
61
+ type ConnectResult,
62
+ } from './connect.js';
63
+ export { disconnectHandler, type DisconnectResult } from './disconnect.js';
64
+ export {
65
+ processRunHandlerAsync,
66
+ type ProcessRunOptions,
67
+ type ProcessRunResult,
68
+ } from './process/run/run.js';
69
+ export {
70
+ processCloseHandlerAsync,
71
+ type ProcessCloseResult,
72
+ } from './process/close/close.js';
@@ -0,0 +1,118 @@
1
+ /**
2
+ * `linux inject-credentials` — inject .ROBLOSECURITY cookie into Wine's
3
+ * Credential Manager so Studio can authenticate.
4
+ */
5
+
6
+ import { defineCommand } from '../../framework/define-command.js';
7
+ import { arg } from '../../framework/arg-builder.js';
8
+ import { OutputHelper } from '@quenty/cli-output-helpers';
9
+ import { getRobloxCookieAsync } from '@quenty/nevermore-cli-helpers';
10
+ import { checkLinuxEnvironmentAsync } from '../../../linux/linux-env-guard.js';
11
+
12
+ interface AuthArgs {
13
+ cookie?: string;
14
+ }
15
+
16
+ interface AuthResult {
17
+ success: boolean;
18
+ summary: string;
19
+ }
20
+
21
+ function readStdinAsync(): Promise<string> {
22
+ return new Promise((resolve, reject) => {
23
+ let data = '';
24
+ process.stdin.setEncoding('utf-8');
25
+ process.stdin.on('data', (chunk) => {
26
+ data += chunk;
27
+ });
28
+ process.stdin.on('end', () => resolve(data));
29
+ process.stdin.on('error', reject);
30
+ });
31
+ }
32
+
33
+ export async function injectCredentialsHandlerAsync(
34
+ args: AuthArgs
35
+ ): Promise<AuthResult> {
36
+ try {
37
+ const envError = await checkLinuxEnvironmentAsync();
38
+ if (envError) {
39
+ OutputHelper.error(envError);
40
+ process.exit(1);
41
+ }
42
+
43
+ const linux = await import('../../../linux/index.js');
44
+ const config = linux.resolveLinuxConfig();
45
+
46
+ // Resolve cookie from explicit arg, stdin, or shared auth
47
+ let cookie: string;
48
+ if (args.cookie === '-') {
49
+ // Read from stdin
50
+ cookie = await readStdinAsync();
51
+ if (!cookie.trim()) {
52
+ throw new Error('No cookie provided on stdin');
53
+ }
54
+ cookie = cookie.trim();
55
+ } else if (args.cookie) {
56
+ cookie = args.cookie;
57
+ } else {
58
+ cookie = await getRobloxCookieAsync();
59
+ }
60
+
61
+ // Validate cookie before attempting Wine injection
62
+ const { validateCookieAsync } = await import(
63
+ '@quenty/nevermore-cli-helpers'
64
+ );
65
+ const validation = await validateCookieAsync(cookie);
66
+ if (!validation.valid) {
67
+ if (validation.reason === 'network_error') {
68
+ OutputHelper.warn(
69
+ 'Could not validate ROBLOSECURITY cookie (network error). Continuing anyway.'
70
+ );
71
+ } else {
72
+ throw new Error(
73
+ `ROBLOSECURITY cookie is invalid or expired (HTTP ${validation.status}). Update the cookie and try again.`
74
+ );
75
+ }
76
+ }
77
+
78
+ // Ensure display is running (Wine needs it for credential write)
79
+ await linux.ensureDisplayAsync(config);
80
+
81
+ // Inject credentials
82
+ await linux.injectCredentialsAsync({ cookie, config });
83
+
84
+ OutputHelper.info('Credentials injected.');
85
+ OutputHelper.hint(
86
+ 'Next: run "studio-bridge process launch" to start Studio'
87
+ );
88
+
89
+ return {
90
+ success: true,
91
+ summary: 'Credentials injected into Wine Credential Manager',
92
+ };
93
+ } catch (err) {
94
+ const message = err instanceof Error ? err.message : String(err);
95
+ OutputHelper.error(message);
96
+ return { success: false, summary: message };
97
+ }
98
+ }
99
+
100
+ export const linuxInjectCredentialsCommand = defineCommand<
101
+ AuthArgs,
102
+ AuthResult
103
+ >({
104
+ group: 'linux',
105
+ name: 'inject-credentials',
106
+ description:
107
+ 'Inject .ROBLOSECURITY cookie into Wine Credential Manager (within Docker image or Linux with Wine)',
108
+ category: 'infrastructure',
109
+ safety: 'none',
110
+ scope: 'standalone',
111
+ args: {
112
+ cookie: arg.option({
113
+ description:
114
+ 'Cookie value (or "-" to read from stdin). Falls back to $ROBLOSECURITY env var or interactive prompt.',
115
+ }),
116
+ },
117
+ handler: async (args) => injectCredentialsHandlerAsync(args),
118
+ });
@@ -0,0 +1,145 @@
1
+ /**
2
+ * `linux setup` — install Wine dependencies and Roblox Studio for headless
3
+ * Linux operation.
4
+ */
5
+
6
+ import { defineCommand } from '../../framework/define-command.js';
7
+ import { arg } from '../../framework/arg-builder.js';
8
+ import { OutputHelper } from '@quenty/cli-output-helpers';
9
+ import { checkLinuxEnvironmentAsync } from '../../../linux/linux-env-guard.js';
10
+
11
+ interface SetupArgs {
12
+ 'install-deps': boolean;
13
+ 'studio-version'?: string;
14
+ 'studio-dir'?: string;
15
+ 'skip-shaders': boolean;
16
+ force: boolean;
17
+ }
18
+
19
+ interface SetupResult {
20
+ success: boolean;
21
+ summary: string;
22
+ }
23
+
24
+ export async function setupHandlerAsync(args: SetupArgs): Promise<SetupResult> {
25
+ try {
26
+ const envError = await checkLinuxEnvironmentAsync();
27
+ if (envError) {
28
+ OutputHelper.error(envError);
29
+ process.exit(1);
30
+ }
31
+
32
+ const linux = await import('../../../linux/index.js');
33
+ const config = linux.resolveLinuxConfig();
34
+
35
+ // Override studioDir if provided
36
+ if (args['studio-dir']) {
37
+ config.studioDir = args['studio-dir'];
38
+ }
39
+
40
+ // Step 1: Install system deps
41
+ if (args['install-deps']) {
42
+ OutputHelper.info('Installing system dependencies...');
43
+ await linux.installDependenciesAsync();
44
+ }
45
+
46
+ // Step 2: Check prerequisites
47
+ OutputHelper.info('Checking prerequisites...');
48
+ const results = linux.checkPrerequisites();
49
+ const missing = results.filter((r) => !r.available);
50
+ if (missing.length > 0) {
51
+ for (const m of missing) {
52
+ OutputHelper.error(`Missing: ${m.name} — ${m.hint}`);
53
+ }
54
+ if (!args['install-deps']) {
55
+ OutputHelper.hint(
56
+ 'Run with --install-deps to install missing dependencies'
57
+ );
58
+ }
59
+ return {
60
+ success: false,
61
+ summary: `Missing prerequisites: ${missing
62
+ .map((m) => m.name)
63
+ .join(', ')}`,
64
+ };
65
+ }
66
+ OutputHelper.info('All prerequisites satisfied.');
67
+
68
+ // Step 3: Resolve version
69
+ const version = await linux.resolveStudioVersionAsync(
70
+ args['studio-version']
71
+ );
72
+ OutputHelper.info(`Studio version: ${version}`);
73
+
74
+ // Step 4: Check if already installed
75
+ const { readInstalledVersionAsync } = await import(
76
+ '../../../linux/linux-version-resolver.js'
77
+ );
78
+ const installed = await readInstalledVersionAsync(config.studioDir);
79
+ if (installed === version && !args.force) {
80
+ OutputHelper.info(
81
+ `Studio ${version} already installed. Use --force to reinstall.`
82
+ );
83
+ } else {
84
+ await linux.installStudioAsync(config, version);
85
+ }
86
+
87
+ // Step 5: Patch shaders
88
+ if (!args['skip-shaders']) {
89
+ await linux.patchShadersAsync(config);
90
+ }
91
+
92
+ // Step 6: Write FFlags
93
+ await linux.writeFflagsAsync(config);
94
+
95
+ // Step 7: Compile write-cred.exe
96
+ const { compileWriteCredAsync } = await import(
97
+ '../../../linux/linux-credential-writer.js'
98
+ );
99
+ await compileWriteCredAsync(config);
100
+
101
+ // Step 8: Start display
102
+ await linux.ensureDisplayAsync(config);
103
+ await linux.ensureWindowManagerAsync(config);
104
+
105
+ OutputHelper.info('Linux setup complete.');
106
+ OutputHelper.hint(
107
+ 'Next: run "studio-bridge linux inject-credentials" to inject credentials'
108
+ );
109
+
110
+ return {
111
+ success: true,
112
+ summary: `Studio ${version} installed and configured`,
113
+ };
114
+ } catch (err) {
115
+ const message = err instanceof Error ? err.message : String(err);
116
+ OutputHelper.error(message);
117
+ return { success: false, summary: message };
118
+ }
119
+ }
120
+
121
+ export const linuxSetupCommand = defineCommand<SetupArgs, SetupResult>({
122
+ group: 'linux',
123
+ name: 'setup',
124
+ description:
125
+ 'Install Wine + Roblox Studio for headless Linux operation (within Docker image or Linux with Wine)',
126
+ category: 'infrastructure',
127
+ safety: 'none',
128
+ scope: 'standalone',
129
+ args: {
130
+ 'install-deps': arg.flag({
131
+ description: 'Install system dependencies via apt-get (requires sudo)',
132
+ }),
133
+ 'studio-version': arg.option({
134
+ description: 'Studio version hash (default: latest from CDN)',
135
+ }),
136
+ 'studio-dir': arg.option({
137
+ description: 'Override Studio installation directory',
138
+ }),
139
+ 'skip-shaders': arg.flag({ description: 'Skip shader patching' }),
140
+ force: arg.flag({
141
+ description: 'Force reinstall even if already installed',
142
+ }),
143
+ },
144
+ handler: async (args) => setupHandlerAsync(args),
145
+ });