@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,300 @@
1
+ /**
2
+ * Inject Roblox authentication credentials into Wine's Credential Manager.
3
+ *
4
+ * Studio expects three entries in Windows Credential Manager:
5
+ * 1. userid: RobloxStudioAuthuserid → numeric user ID
6
+ * 2. cookie name: RobloxStudioAuthCookies → ".ROBLOSECURITY"
7
+ * 3. cookie value: RobloxStudioAuth.ROBLOSECURITY{userId} → the actual cookie
8
+ *
9
+ * Additionally, Studio 0.710+ uses OAuth2 for startup authentication.
10
+ * Without a valid refresh token, Studio blocks on a WebView2 login dialog
11
+ * that doesn't work under Wine. This module obtains a refresh token by
12
+ * calling Roblox's first-party OAuth authorization endpoint with the
13
+ * .ROBLOSECURITY cookie, then injects it into the Credential Manager.
14
+ *
15
+ * This module:
16
+ * - Compiles write-cred.c with MinGW (if not already compiled)
17
+ * - Resolves the user ID from the cookie via Roblox API
18
+ * - Obtains an OAuth2 refresh token via Roblox's authorization endpoint
19
+ * - Runs `wine write-cred.exe` to inject all credential entries
20
+ */
21
+ import * as crypto from 'crypto';
22
+ import * as fs from 'fs/promises';
23
+ import * as path from 'path';
24
+ import { execFileSync } from 'child_process';
25
+ import { execa } from 'execa';
26
+ import { fileURLToPath } from 'url';
27
+ import { OutputHelper } from '@quenty/cli-output-helpers';
28
+ import { ROBLOX_USERS_API } from './linux-config.js';
29
+ import { buildWineEnv } from './linux-wine-env.js';
30
+ import { COOKIE_NAME } from '@quenty/nevermore-cli-helpers';
31
+ /** Studio's first-party OAuth client ID (extracted from the Studio binary) */
32
+ const STUDIO_OAUTH_CLIENT_ID = '7968549422692352298';
33
+ /** Roblox OAuth API base */
34
+ const ROBLOX_OAUTH_API = 'https://apis.roblox.com/oauth/v1';
35
+ /** Roblox Auth API base (for CSRF tokens) */
36
+ const ROBLOX_AUTH_API = 'https://auth.roblox.com';
37
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
38
+ /**
39
+ * Locate write-cred.c source file. Searches several candidate paths
40
+ * relative to __dirname, which at runtime is dist/src/linux/.
41
+ */
42
+ async function findWriteCredSourceAsync() {
43
+ const candidates = [
44
+ // Alongside compiled JS (if .c was copied to dist)
45
+ path.join(__dirname, 'write-cred.c'),
46
+ // Source tree (from dist/src/linux/ → src/linux/)
47
+ path.resolve(__dirname, '../../../src/linux/write-cred.c'),
48
+ // Sibling to package root
49
+ path.resolve(__dirname, '../../linux/write-cred.c'),
50
+ ];
51
+ for (const candidate of candidates) {
52
+ try {
53
+ await fs.access(candidate);
54
+ return candidate;
55
+ }
56
+ catch {
57
+ // Try next
58
+ }
59
+ }
60
+ throw new Error('write-cred.c source not found. Ensure the linux module is properly installed.');
61
+ }
62
+ /**
63
+ * Compile write-cred.exe from bundled C source using MinGW.
64
+ */
65
+ export async function compileWriteCredAsync(config) {
66
+ const { writeCredExe } = config;
67
+ const sourcePath = await findWriteCredSourceAsync();
68
+ OutputHelper.verbose(`Compiling ${sourcePath} → ${writeCredExe}`);
69
+ await fs.mkdir(path.dirname(writeCredExe), { recursive: true });
70
+ try {
71
+ execFileSync('x86_64-w64-mingw32-gcc', ['-o', writeCredExe, sourcePath, '-lcredui', '-ladvapi32'], {
72
+ stdio: ['pipe', 'pipe', 'pipe'],
73
+ timeout: 30000,
74
+ });
75
+ }
76
+ catch (error) {
77
+ throw new Error(`Failed to compile write-cred.exe: ${error instanceof Error ? error.message : error}`);
78
+ }
79
+ OutputHelper.verbose('write-cred.exe compiled successfully.');
80
+ }
81
+ /**
82
+ * Inject all three required credentials into Wine's Credential Manager.
83
+ */
84
+ export async function injectCredentialsAsync(options) {
85
+ const { cookie, config } = options;
86
+ // Always recompile write-cred.exe from source to ensure it matches the
87
+ // current code (e.g. batch-mode support). A stale binary from a Docker
88
+ // image may silently ignore extra arguments.
89
+ await compileWriteCredAsync(config);
90
+ // Resolve user ID from cookie
91
+ const userId = await resolveUserIdAsync(cookie);
92
+ OutputHelper.verbose(`Resolved user ID: ${userId}`);
93
+ const env = buildWineEnv(config);
94
+ const writeCredExe = config.writeCredExe;
95
+ // Initialize or update the Wine prefix. wineboot must run before any wine
96
+ // command to create the prefix on first use, and must also run in containers
97
+ // where the prefix was pre-built at image time — the update pass refreshes
98
+ // stale registry entries and user profile paths for the current environment.
99
+ const prefixExists = await fs
100
+ .access(path.join(config.winePrefix, 'system.reg'))
101
+ .then(() => true, () => false);
102
+ const winebootFlag = prefixExists ? '-u' : '-i';
103
+ OutputHelper.verbose(prefixExists
104
+ ? 'Updating Wine prefix for current environment...'
105
+ : 'Initializing Wine prefix...');
106
+ const bootResult = await execa('wineboot', [winebootFlag], {
107
+ env,
108
+ reject: false,
109
+ timeout: 120000,
110
+ });
111
+ if (bootResult.exitCode !== 0) {
112
+ OutputHelper.warn(`wineboot exited with code ${bootResult.exitCode} (non-fatal)`);
113
+ }
114
+ // Write all three credential entries in a single Wine invocation
115
+ const entries = [
116
+ ['https://www.roblox.com:RobloxStudioAuthuserid', String(userId)],
117
+ ['https://www.roblox.com:RobloxStudioAuthCookies', COOKIE_NAME],
118
+ [`https://www.roblox.com:RobloxStudioAuth${COOKIE_NAME}${userId}`, cookie],
119
+ ];
120
+ OutputHelper.verbose(`Writing ${entries.length} credential entries...`);
121
+ const credArgs = entries.flatMap(([target, value]) => [target, value]);
122
+ const result = await execa('wine', [writeCredExe, ...credArgs], {
123
+ env,
124
+ reject: false,
125
+ timeout: 30000,
126
+ });
127
+ if (result.exitCode !== 0) {
128
+ const stderr = result.stderr || result.stdout || 'unknown error';
129
+ throw new Error(`Failed to write credentials: ${stderr}`);
130
+ }
131
+ // Also write to the Windows Registry path that Studio checks on startup.
132
+ await writeRegistryAuthAsync(cookie, userId, env);
133
+ // Obtain and inject an OAuth2 refresh token. Studio 0.710+ may require this
134
+ // for startup authentication — without it, Studio blocks on a WebView2
135
+ // login dialog that doesn't work under Wine. Non-fatal: cookie-based
136
+ // credentials above are sufficient for many Studio versions.
137
+ try {
138
+ await injectOAuth2RefreshTokenAsync(cookie, userId, writeCredExe, env);
139
+ }
140
+ catch (error) {
141
+ OutputHelper.warn(`OAuth2 refresh token injection failed (non-fatal): ${error instanceof Error ? error.message : error}`);
142
+ }
143
+ OutputHelper.info('Credentials injected into Wine Credential Manager.');
144
+ }
145
+ /**
146
+ * Write auth data to Wine registry entries that Studio checks on startup.
147
+ * This bypasses Studio's WebView2 login dialog (which doesn't work on Wine).
148
+ */
149
+ async function writeRegistryAuthAsync(cookie, userId, env) {
150
+ const regPath = 'HKCU\\Software\\Roblox\\RobloxStudioBrowser\\roblox.com';
151
+ const regEntries = [
152
+ [regPath, COOKIE_NAME, cookie],
153
+ ];
154
+ for (const [keyPath, name, value] of regEntries) {
155
+ OutputHelper.verbose(`Writing registry: ${keyPath}\\${name}`);
156
+ const result = await execa('wine', ['reg', 'add', keyPath, '/v', name, '/t', 'REG_SZ', '/d', value, '/f'], { env, reject: false, timeout: 15000 });
157
+ if (result.exitCode !== 0) {
158
+ OutputHelper.warn(`Failed to write registry entry ${name} (non-fatal): ${result.stderr || result.stdout}`);
159
+ }
160
+ }
161
+ // Also set the user ID so Studio recognizes a configured user
162
+ const userRegPath = 'HKCU\\Software\\Roblox\\RobloxStudioBrowser';
163
+ const userIdResult = await execa('wine', [
164
+ 'reg',
165
+ 'add',
166
+ userRegPath,
167
+ '/v',
168
+ 'UserId',
169
+ '/t',
170
+ 'REG_SZ',
171
+ '/d',
172
+ String(userId),
173
+ '/f',
174
+ ], { env, reject: false, timeout: 15000 });
175
+ if (userIdResult.exitCode !== 0) {
176
+ OutputHelper.warn(`Failed to write UserId registry entry (non-fatal): ${userIdResult.stderr || userIdResult.stdout}`);
177
+ }
178
+ }
179
+ /**
180
+ * Obtain an OAuth2 refresh token from the .ROBLOSECURITY cookie and inject
181
+ * it into Wine's Credential Manager. This completes Studio's first-party
182
+ * OAuth PKCE flow programmatically, bypassing the WebView2 login dialog.
183
+ */
184
+ async function injectOAuth2RefreshTokenAsync(cookie, userId, writeCredExe, env) {
185
+ OutputHelper.verbose('Obtaining OAuth2 refresh token...');
186
+ // Step 1: Get CSRF token (Roblox requires this for mutating API calls)
187
+ const csrfToken = await getCsrfTokenAsync(cookie);
188
+ // Step 2: Generate PKCE code verifier and challenge
189
+ const codeVerifier = crypto
190
+ .randomBytes(32)
191
+ .toString('base64url')
192
+ .slice(0, 43);
193
+ const codeChallenge = crypto
194
+ .createHash('sha256')
195
+ .update(codeVerifier)
196
+ .digest('base64url');
197
+ const state = crypto.randomBytes(16).toString('hex');
198
+ // Step 3: Request authorization code
199
+ const authResponse = await fetch(`${ROBLOX_OAUTH_API}/authorizations`, {
200
+ method: 'POST',
201
+ headers: {
202
+ 'Content-Type': 'application/json',
203
+ 'X-CSRF-TOKEN': csrfToken,
204
+ Cookie: `${COOKIE_NAME}=${cookie}`,
205
+ },
206
+ body: JSON.stringify({
207
+ clientId: STUDIO_OAUTH_CLIENT_ID,
208
+ responseTypes: ['Code'],
209
+ redirectUri: 'roblox-studio-auth:/',
210
+ scopes: [
211
+ { scopeType: 'openid', operations: ['read'] },
212
+ { scopeType: 'credentials', operations: ['read'] },
213
+ { scopeType: 'profile', operations: ['read'] },
214
+ { scopeType: 'age', operations: ['read'] },
215
+ { scopeType: 'roles', operations: ['read'] },
216
+ { scopeType: 'premium', operations: ['read'] },
217
+ ],
218
+ nonce: 'id-roblox',
219
+ codeChallengeMethod: 's256',
220
+ codeChallenge,
221
+ state,
222
+ }),
223
+ });
224
+ if (!authResponse.ok) {
225
+ const body = await authResponse.text();
226
+ throw new Error(`OAuth authorization failed: ${authResponse.status} ${body}`);
227
+ }
228
+ const authData = (await authResponse.json());
229
+ const locationUrl = new URL(authData.location);
230
+ const authCode = locationUrl.searchParams.get('code');
231
+ if (!authCode) {
232
+ throw new Error('OAuth authorization response missing code');
233
+ }
234
+ OutputHelper.verbose('OAuth authorization code obtained.');
235
+ // Step 4: Exchange authorization code for tokens
236
+ const tokenResponse = await fetch(`${ROBLOX_OAUTH_API}/token`, {
237
+ method: 'POST',
238
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
239
+ body: new URLSearchParams({
240
+ grant_type: 'authorization_code',
241
+ code: authCode,
242
+ code_verifier: codeVerifier,
243
+ client_id: STUDIO_OAUTH_CLIENT_ID,
244
+ }).toString(),
245
+ });
246
+ if (!tokenResponse.ok) {
247
+ const body = await tokenResponse.text();
248
+ throw new Error(`OAuth token exchange failed: ${tokenResponse.status} ${body}`);
249
+ }
250
+ const tokenData = (await tokenResponse.json());
251
+ if (!tokenData.refresh_token) {
252
+ throw new Error('OAuth token response missing refresh_token');
253
+ }
254
+ OutputHelper.verbose(`OAuth refresh token obtained (${tokenData.refresh_token.length} chars).`);
255
+ // Step 5: Inject the refresh token into Wine's Credential Manager
256
+ const target = `https://www.roblox.com:RobloxStudioAuthoauth2RefreshToken${userId}`;
257
+ OutputHelper.verbose(`Writing OAuth2 credential: ${target}`);
258
+ const result = await execa('wine', [writeCredExe, target, tokenData.refresh_token], { env, reject: false, timeout: 15000 });
259
+ if (result.exitCode !== 0) {
260
+ const stderr = result.stderr || result.stdout || 'unknown error';
261
+ throw new Error(`Failed to write OAuth2 refresh token credential: ${stderr}`);
262
+ }
263
+ OutputHelper.verbose('OAuth2 refresh token injected into Wine Credential Manager.');
264
+ }
265
+ /**
266
+ * Get a CSRF token from Roblox's auth API. The first request returns 403
267
+ * with the token in the x-csrf-token header.
268
+ */
269
+ async function getCsrfTokenAsync(cookie) {
270
+ const response = await fetch(`${ROBLOX_AUTH_API}/v1/authentication-ticket/`, {
271
+ method: 'POST',
272
+ headers: {
273
+ 'Content-Type': 'application/json',
274
+ Cookie: `${COOKIE_NAME}=${cookie}`,
275
+ Referer: 'https://www.roblox.com/',
276
+ },
277
+ body: '{}',
278
+ });
279
+ const csrfToken = response.headers.get('x-csrf-token');
280
+ if (!csrfToken) {
281
+ throw new Error(`Failed to obtain CSRF token: ${response.status} ${response.statusText}`);
282
+ }
283
+ return csrfToken;
284
+ }
285
+ /**
286
+ * Resolve the authenticated user's numeric ID from a .ROBLOSECURITY cookie.
287
+ */
288
+ async function resolveUserIdAsync(cookie) {
289
+ const response = await fetch(`${ROBLOX_USERS_API}/v1/users/authenticated`, {
290
+ headers: {
291
+ Cookie: `${COOKIE_NAME}=${cookie}`,
292
+ },
293
+ });
294
+ if (!response.ok) {
295
+ throw new Error(`Failed to resolve user ID: ${response.status} ${response.statusText}. Is your cookie valid?`);
296
+ }
297
+ const data = (await response.json());
298
+ return data.id;
299
+ }
300
+ //# sourceMappingURL=linux-credential-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linux-credential-writer.js","sourceRoot":"","sources":["../../../src/linux/linux-credential-writer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Manage the Xvfb virtual framebuffer and openbox window manager
3
+ * required for Studio to render under Wine.
4
+ */
5
+ import type { LinuxStudioConfig } from './linux-config.js';
6
+ /**
7
+ * Ensure Xvfb is running on the configured DISPLAY.
8
+ * If already running, this is a no-op.
9
+ */
10
+ export declare function ensureDisplayAsync(config: LinuxStudioConfig): Promise<void>;
11
+ /**
12
+ * Ensure openbox window manager is running on the display.
13
+ * Required for Studio's modal dialogs to function.
14
+ */
15
+ export declare function ensureWindowManagerAsync(config: LinuxStudioConfig): Promise<void>;
16
+ /**
17
+ * Check if Xvfb is running on a given display.
18
+ */
19
+ export declare function isXvfbRunning(displayNum?: string): boolean;
20
+ /**
21
+ * Check if openbox is running.
22
+ */
23
+ export declare function isOpenboxRunning(): boolean;
24
+ //# sourceMappingURL=linux-display-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linux-display-manager.d.ts","sourceRoot":"","sources":["../../../src/linux/linux-display-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,IAAI,CAAC,CAiBf;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAkB1D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAU1C"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Manage the Xvfb virtual framebuffer and openbox window manager
3
+ * required for Studio to render under Wine.
4
+ */
5
+ import { execSync } from 'child_process';
6
+ import { execa } from 'execa';
7
+ /**
8
+ * Ensure Xvfb is running on the configured DISPLAY.
9
+ * If already running, this is a no-op.
10
+ */
11
+ export async function ensureDisplayAsync(config) {
12
+ const display = config.display;
13
+ const displayNum = display.replace(':', '');
14
+ if (isXvfbRunning(displayNum)) {
15
+ return;
16
+ }
17
+ // Start Xvfb detached with 1024x768 24-bit color
18
+ const xvfb = execa('Xvfb', [display, '-screen', '0', '1024x768x24'], {
19
+ detached: true,
20
+ stdio: 'ignore',
21
+ reject: false,
22
+ env: { ...process.env },
23
+ });
24
+ xvfb.unref?.();
25
+ // Give it a moment to start
26
+ await sleepAsync(500);
27
+ if (!isXvfbRunning(displayNum)) {
28
+ throw new Error(`Failed to start Xvfb on display ${display}`);
29
+ }
30
+ }
31
+ /**
32
+ * Ensure openbox window manager is running on the display.
33
+ * Required for Studio's modal dialogs to function.
34
+ */
35
+ export async function ensureWindowManagerAsync(config) {
36
+ if (isOpenboxRunning()) {
37
+ return;
38
+ }
39
+ const openbox = execa('openbox', [], {
40
+ detached: true,
41
+ stdio: 'ignore',
42
+ reject: false,
43
+ env: {
44
+ ...process.env,
45
+ DISPLAY: config.display,
46
+ },
47
+ });
48
+ openbox.unref?.();
49
+ await sleepAsync(500);
50
+ }
51
+ /**
52
+ * Check if Xvfb is running on a given display.
53
+ */
54
+ export function isXvfbRunning(displayNum) {
55
+ try {
56
+ if (displayNum) {
57
+ const output = execSync(`pgrep -a Xvfb`, {
58
+ encoding: 'utf-8',
59
+ timeout: 3000,
60
+ stdio: ['pipe', 'pipe', 'pipe'],
61
+ });
62
+ return output.includes(`:${displayNum}`);
63
+ }
64
+ execSync('pgrep -x Xvfb', {
65
+ timeout: 3000,
66
+ stdio: ['pipe', 'pipe', 'pipe'],
67
+ });
68
+ return true;
69
+ }
70
+ catch {
71
+ return false;
72
+ }
73
+ }
74
+ /**
75
+ * Check if openbox is running.
76
+ */
77
+ export function isOpenboxRunning() {
78
+ try {
79
+ execSync('pgrep -x openbox', {
80
+ timeout: 3000,
81
+ stdio: ['pipe', 'pipe', 'pipe'],
82
+ });
83
+ return true;
84
+ }
85
+ catch {
86
+ return false;
87
+ }
88
+ }
89
+ function sleepAsync(ms) {
90
+ return new Promise((resolve) => setTimeout(resolve, ms));
91
+ }
92
+ //# sourceMappingURL=linux-display-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linux-display-manager.js","sourceRoot":"","sources":["../../../src/linux/linux-display-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Environment guard for `linux *` subcommands.
3
+ *
4
+ * These commands require Wine and related tools that are only available inside
5
+ * the Docker image or a properly configured Linux box. This guard lets them
6
+ * fail early with a helpful message instead of crashing mid-way.
7
+ */
8
+ /**
9
+ * Checks if the current environment can run linux/* commands.
10
+ * Returns an error message if not, or undefined if OK.
11
+ */
12
+ export declare function checkLinuxEnvironmentAsync(): Promise<string | undefined>;
13
+ //# sourceMappingURL=linux-env-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linux-env-guard.d.ts","sourceRoot":"","sources":["../../../src/linux/linux-env-guard.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH;;;GAGG;AACH,wBAAsB,0BAA0B,IAAI,OAAO,CACzD,MAAM,GAAG,SAAS,CACnB,CAiBA"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Environment guard for `linux *` subcommands.
3
+ *
4
+ * These commands require Wine and related tools that are only available inside
5
+ * the Docker image or a properly configured Linux box. This guard lets them
6
+ * fail early with a helpful message instead of crashing mid-way.
7
+ */
8
+ import * as os from 'os';
9
+ import { execFile } from 'child_process';
10
+ import { promisify } from 'util';
11
+ const execFileAsync = promisify(execFile);
12
+ /**
13
+ * Checks if the current environment can run linux/* commands.
14
+ * Returns an error message if not, or undefined if OK.
15
+ */
16
+ export async function checkLinuxEnvironmentAsync() {
17
+ if (os.platform() !== 'linux') {
18
+ return "linux commands require a Linux environment. On Windows/macOS, Studio runs natively — use 'studio-bridge process run' instead.";
19
+ }
20
+ try {
21
+ await execFileAsync('which', ['wine']);
22
+ }
23
+ catch {
24
+ return ('Wine is not installed. These commands require Wine and related tools.\n\n' +
25
+ "To run scripts, use 'studio-bridge process run' which auto-delegates to Docker.\n" +
26
+ 'To set up a full Wine environment, run inside the Docker image:\n' +
27
+ ' docker run --rm -it ghcr.io/quenty/nevermore-studio-linux:latest bash');
28
+ }
29
+ return undefined;
30
+ }
31
+ //# sourceMappingURL=linux-env-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linux-env-guard.js","sourceRoot":"","sources":["../../../src/linux/linux-env-guard.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B;IAG9C,IAAI,EAAE,CAAC,QAAQ,EAAE,KAAK,OAAO,EAAE,CAAC;QAC9B,OAAO,+HAA+H,CAAC;IACzI,CAAC;IAED,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CACL,2EAA2E;YAC3E,mFAAmF;YACnF,mEAAmE;YACnE,yEAAyE,CAC1E,CAAC;IACJ,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=linux-env-guard.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linux-env-guard.test.d.ts","sourceRoot":"","sources":["../../../src/linux/linux-env-guard.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,48 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ vi.mock('os', () => ({
3
+ platform: vi.fn(),
4
+ }));
5
+ vi.mock('child_process', () => ({
6
+ execFile: vi.fn(),
7
+ }));
8
+ vi.mock('util', () => ({
9
+ promisify: (fn) => fn,
10
+ }));
11
+ import { platform } from 'os';
12
+ import { execFile } from 'child_process';
13
+ import { checkLinuxEnvironmentAsync } from './linux-env-guard.js';
14
+ const mockPlatform = vi.mocked(platform);
15
+ const mockExecFile = vi.mocked(execFile);
16
+ describe('checkLinuxEnvironmentAsync', () => {
17
+ beforeEach(() => {
18
+ vi.resetAllMocks();
19
+ });
20
+ it('returns an error message on non-Linux platforms', async () => {
21
+ mockPlatform.mockReturnValue('win32');
22
+ const result = await checkLinuxEnvironmentAsync();
23
+ expect(result).toBeDefined();
24
+ expect(result).toContain('linux commands require a Linux environment');
25
+ expect(result).toContain('studio-bridge process run');
26
+ expect(mockExecFile).not.toHaveBeenCalled();
27
+ });
28
+ it('returns undefined when on Linux with Wine installed', async () => {
29
+ mockPlatform.mockReturnValue('linux');
30
+ mockExecFile.mockResolvedValue({
31
+ stdout: '/usr/bin/wine\n',
32
+ stderr: '',
33
+ });
34
+ const result = await checkLinuxEnvironmentAsync();
35
+ expect(result).toBeUndefined();
36
+ expect(mockExecFile).toHaveBeenCalledWith('which', ['wine']);
37
+ });
38
+ it('returns an error message on Linux without Wine', async () => {
39
+ mockPlatform.mockReturnValue('linux');
40
+ mockExecFile.mockRejectedValue(new Error('not found'));
41
+ const result = await checkLinuxEnvironmentAsync();
42
+ expect(result).toBeDefined();
43
+ expect(result).toContain('Wine is not installed');
44
+ expect(result).toContain('studio-bridge process run');
45
+ expect(result).toContain('docker run');
46
+ });
47
+ });
48
+ //# sourceMappingURL=linux-env-guard.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linux-env-guard.test.js","sourceRoot":"","sources":["../../../src/linux/linux-env-guard.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAE9D,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IACnB,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE;CAClB,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9B,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE;CAClB,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACrB,SAAS,EAAE,CAAC,EAAO,EAAE,EAAE,CAAC,EAAE;CAC3B,CAAC,CAAC,CAAC;AAEJ,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAElE,MAAM,YAAY,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AACzC,MAAM,YAAY,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAEzC,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,YAAY,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAEtC,MAAM,MAAM,GAAG,MAAM,0BAA0B,EAAE,CAAC;QAElD,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,4CAA4C,CAAC,CAAC;QACvE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;QACtD,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,YAAY,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QACtC,YAAY,CAAC,iBAAiB,CAAC;YAC7B,MAAM,EAAE,iBAAiB;YACzB,MAAM,EAAE,EAAE;SACJ,CAAC,CAAC;QAEV,MAAM,MAAM,GAAG,MAAM,0BAA0B,EAAE,CAAC;QAElD,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,CAAC;QAC/B,MAAM,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,YAAY,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QACtC,YAAY,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;QAEvD,MAAM,MAAM,GAAG,MAAM,0BAA0B,EAAE,CAAC;QAElD,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Write the FFlags required for Studio to render correctly under Wine/Mesa.
3
+ *
4
+ * Key flags:
5
+ * - FFlagDebugGraphicsPreferD3D11: Use D3D11 via WineD3D (avoids Wine's
6
+ * EGL swapchain bug that breaks DockWidgets in OpenGL mode)
7
+ * - FFlagDebugGraphicsDisableVulkan/OpenGL/D3D11FL10: Prevent fallback
8
+ * to renderers that don't work under Wine
9
+ * - FIntStudioLowMemoryThresholdPercentage: Disable OOM warning dialog
10
+ */
11
+ import type { LinuxStudioConfig } from './linux-config.js';
12
+ /**
13
+ * Write ClientAppSettings.json with the FFlags needed for Wine rendering.
14
+ * Merges with any existing flags to avoid clobbering user customizations.
15
+ */
16
+ export declare function writeFflagsAsync(config: LinuxStudioConfig, extraFlags?: Record<string, boolean | number>): Promise<void>;
17
+ //# sourceMappingURL=linux-fflags.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linux-fflags.d.ts","sourceRoot":"","sources":["../../../src/linux/linux-fflags.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAU3D;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,iBAAiB,EACzB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC,GAC5C,OAAO,CAAC,IAAI,CAAC,CAgBf"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Write the FFlags required for Studio to render correctly under Wine/Mesa.
3
+ *
4
+ * Key flags:
5
+ * - FFlagDebugGraphicsPreferD3D11: Use D3D11 via WineD3D (avoids Wine's
6
+ * EGL swapchain bug that breaks DockWidgets in OpenGL mode)
7
+ * - FFlagDebugGraphicsDisableVulkan/OpenGL/D3D11FL10: Prevent fallback
8
+ * to renderers that don't work under Wine
9
+ * - FIntStudioLowMemoryThresholdPercentage: Disable OOM warning dialog
10
+ */
11
+ import * as fs from 'fs/promises';
12
+ import * as path from 'path';
13
+ import { OutputHelper } from '@quenty/cli-output-helpers';
14
+ const DEFAULT_FFLAGS = {
15
+ FFlagDebugGraphicsPreferD3D11: true,
16
+ FFlagDebugGraphicsDisableVulkan: true,
17
+ FFlagDebugGraphicsDisableD3D11FL10: true,
18
+ FFlagDebugGraphicsDisableOpenGL: true,
19
+ FIntStudioLowMemoryThresholdPercentage: 0,
20
+ };
21
+ /**
22
+ * Write ClientAppSettings.json with the FFlags needed for Wine rendering.
23
+ * Merges with any existing flags to avoid clobbering user customizations.
24
+ */
25
+ export async function writeFflagsAsync(config, extraFlags) {
26
+ const settingsDir = path.dirname(config.clientSettingsPath);
27
+ await fs.mkdir(settingsDir, { recursive: true });
28
+ // Merge defaults + extras
29
+ const flags = { ...DEFAULT_FFLAGS, ...extraFlags };
30
+ await fs.writeFile(config.clientSettingsPath, JSON.stringify(flags, null, 2) + '\n', 'utf-8');
31
+ OutputHelper.verbose(`Wrote ${Object.keys(flags).length} FFlags to ${config.clientSettingsPath}`);
32
+ }
33
+ //# sourceMappingURL=linux-fflags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linux-fflags.js","sourceRoot":"","sources":["../../../src/linux/linux-fflags.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAG1D,MAAM,cAAc,GAAqC;IACvD,6BAA6B,EAAE,IAAI;IACnC,+BAA+B,EAAE,IAAI;IACrC,kCAAkC,EAAE,IAAI;IACxC,+BAA+B,EAAE,IAAI;IACrC,sCAAsC,EAAE,CAAC;CAC1C,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAyB,EACzB,UAA6C;IAE7C,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAC5D,MAAM,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEjD,0BAA0B;IAC1B,MAAM,KAAK,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,UAAU,EAAE,CAAC;IAEnD,MAAM,EAAE,CAAC,SAAS,CAChB,MAAM,CAAC,kBAAkB,EACzB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EACrC,OAAO,CACR,CAAC;IAEF,YAAY,CAAC,OAAO,CAClB,SAAS,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,cAAc,MAAM,CAAC,kBAAkB,EAAE,CAC5E,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=linux-fflags.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linux-fflags.test.d.ts","sourceRoot":"","sources":["../../../src/linux/linux-fflags.test.ts"],"names":[],"mappings":""}