@quenty/studio-bridge 0.7.0 → 0.8.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.
- package/CHANGELOG.md +15 -39
- package/README.md +166 -115
- package/dist/src/bridge/bridge-connection-remote.test.d.ts +7 -0
- package/dist/src/bridge/bridge-connection-remote.test.d.ts.map +1 -0
- package/dist/src/bridge/bridge-connection-remote.test.js +144 -0
- package/dist/src/bridge/bridge-connection-remote.test.js.map +1 -0
- package/dist/src/bridge/bridge-connection.d.ts +112 -0
- package/dist/src/bridge/bridge-connection.d.ts.map +1 -0
- package/dist/src/bridge/bridge-connection.js +528 -0
- package/dist/src/bridge/bridge-connection.js.map +1 -0
- package/dist/src/bridge/bridge-connection.test.d.ts +6 -0
- package/dist/src/bridge/bridge-connection.test.d.ts.map +1 -0
- package/dist/src/bridge/bridge-connection.test.js +773 -0
- package/dist/src/bridge/bridge-connection.test.js.map +1 -0
- package/dist/src/bridge/bridge-session.d.ts +38 -0
- package/dist/src/bridge/bridge-session.d.ts.map +1 -0
- package/dist/src/bridge/bridge-session.js +259 -0
- package/dist/src/bridge/bridge-session.js.map +1 -0
- package/dist/src/bridge/bridge-session.test.d.ts +6 -0
- package/dist/src/bridge/bridge-session.test.d.ts.map +1 -0
- package/dist/src/bridge/bridge-session.test.js +264 -0
- package/dist/src/bridge/bridge-session.test.js.map +1 -0
- package/dist/src/bridge/index.d.ts +13 -0
- package/dist/src/bridge/index.d.ts.map +1 -0
- package/dist/src/bridge/index.js +13 -0
- package/dist/src/bridge/index.js.map +1 -0
- package/dist/src/bridge/internal/__tests__/failover-crash.test.d.ts +9 -0
- package/dist/src/bridge/internal/__tests__/failover-crash.test.d.ts.map +1 -0
- package/dist/src/bridge/internal/__tests__/failover-crash.test.js +159 -0
- package/dist/src/bridge/internal/__tests__/failover-crash.test.js.map +1 -0
- package/dist/src/bridge/internal/__tests__/failover-graceful.test.d.ts +9 -0
- package/dist/src/bridge/internal/__tests__/failover-graceful.test.d.ts.map +1 -0
- package/dist/src/bridge/internal/__tests__/failover-graceful.test.js +218 -0
- package/dist/src/bridge/internal/__tests__/failover-graceful.test.js.map +1 -0
- package/dist/src/bridge/internal/__tests__/failover-inflight.test.d.ts +9 -0
- package/dist/src/bridge/internal/__tests__/failover-inflight.test.d.ts.map +1 -0
- package/dist/src/bridge/internal/__tests__/failover-inflight.test.js +246 -0
- package/dist/src/bridge/internal/__tests__/failover-inflight.test.js.map +1 -0
- package/dist/src/bridge/internal/__tests__/host-client-integration.test.d.ts +10 -0
- package/dist/src/bridge/internal/__tests__/host-client-integration.test.d.ts.map +1 -0
- package/dist/src/bridge/internal/__tests__/host-client-integration.test.js +298 -0
- package/dist/src/bridge/internal/__tests__/host-client-integration.test.js.map +1 -0
- package/dist/src/bridge/internal/bridge-client.d.ts +70 -0
- package/dist/src/bridge/internal/bridge-client.d.ts.map +1 -0
- package/dist/src/bridge/internal/bridge-client.js +344 -0
- package/dist/src/bridge/internal/bridge-client.js.map +1 -0
- package/dist/src/bridge/internal/bridge-client.test.d.ts +7 -0
- package/dist/src/bridge/internal/bridge-client.test.d.ts.map +1 -0
- package/dist/src/bridge/internal/bridge-client.test.js +301 -0
- package/dist/src/bridge/internal/bridge-client.test.js.map +1 -0
- package/dist/src/bridge/internal/bridge-host.d.ts +78 -0
- package/dist/src/bridge/internal/bridge-host.d.ts.map +1 -0
- package/dist/src/bridge/internal/bridge-host.js +383 -0
- package/dist/src/bridge/internal/bridge-host.js.map +1 -0
- package/dist/src/bridge/internal/bridge-host.test.d.ts +7 -0
- package/dist/src/bridge/internal/bridge-host.test.d.ts.map +1 -0
- package/dist/src/bridge/internal/bridge-host.test.js +377 -0
- package/dist/src/bridge/internal/bridge-host.test.js.map +1 -0
- package/dist/src/bridge/internal/environment-detection.d.ts +44 -0
- package/dist/src/bridge/internal/environment-detection.d.ts.map +1 -0
- package/dist/src/bridge/internal/environment-detection.js +91 -0
- package/dist/src/bridge/internal/environment-detection.js.map +1 -0
- package/dist/src/bridge/internal/environment-detection.test.d.ts +7 -0
- package/dist/src/bridge/internal/environment-detection.test.d.ts.map +1 -0
- package/dist/src/bridge/internal/environment-detection.test.js +150 -0
- package/dist/src/bridge/internal/environment-detection.test.js.map +1 -0
- package/dist/src/bridge/internal/hand-off.d.ts +69 -0
- package/dist/src/bridge/internal/hand-off.d.ts.map +1 -0
- package/dist/src/bridge/internal/hand-off.js +178 -0
- package/dist/src/bridge/internal/hand-off.js.map +1 -0
- package/dist/src/bridge/internal/hand-off.test.d.ts +7 -0
- package/dist/src/bridge/internal/hand-off.test.d.ts.map +1 -0
- package/dist/src/bridge/internal/hand-off.test.js +325 -0
- package/dist/src/bridge/internal/hand-off.test.js.map +1 -0
- package/dist/src/bridge/internal/health-endpoint.d.ts +32 -0
- package/dist/src/bridge/internal/health-endpoint.d.ts.map +1 -0
- package/dist/src/bridge/internal/health-endpoint.js +73 -0
- package/dist/src/bridge/internal/health-endpoint.js.map +1 -0
- package/dist/src/bridge/internal/health-endpoint.test.d.ts +6 -0
- package/dist/src/bridge/internal/health-endpoint.test.d.ts.map +1 -0
- package/dist/src/bridge/internal/health-endpoint.test.js +122 -0
- package/dist/src/bridge/internal/health-endpoint.test.js.map +1 -0
- package/dist/src/bridge/internal/host-protocol.d.ts +60 -0
- package/dist/src/bridge/internal/host-protocol.d.ts.map +1 -0
- package/dist/src/bridge/internal/host-protocol.js +184 -0
- package/dist/src/bridge/internal/host-protocol.js.map +1 -0
- package/dist/src/bridge/internal/host-protocol.test.d.ts +6 -0
- package/dist/src/bridge/internal/host-protocol.test.d.ts.map +1 -0
- package/dist/src/bridge/internal/host-protocol.test.js +307 -0
- package/dist/src/bridge/internal/host-protocol.test.js.map +1 -0
- package/dist/src/bridge/internal/session-tracker.d.ts +67 -0
- package/dist/src/bridge/internal/session-tracker.d.ts.map +1 -0
- package/dist/src/bridge/internal/session-tracker.js +138 -0
- package/dist/src/bridge/internal/session-tracker.js.map +1 -0
- package/dist/src/bridge/internal/session-tracker.test.d.ts +6 -0
- package/dist/src/bridge/internal/session-tracker.test.d.ts.map +1 -0
- package/dist/src/bridge/internal/session-tracker.test.js +342 -0
- package/dist/src/bridge/internal/session-tracker.test.js.map +1 -0
- package/dist/src/bridge/internal/transport-client.d.ts +43 -0
- package/dist/src/bridge/internal/transport-client.d.ts.map +1 -0
- package/dist/src/bridge/internal/transport-client.js +146 -0
- package/dist/src/bridge/internal/transport-client.js.map +1 -0
- package/dist/src/bridge/internal/transport-client.test.d.ts +6 -0
- package/dist/src/bridge/internal/transport-client.test.d.ts.map +1 -0
- package/dist/src/bridge/internal/transport-client.test.js +176 -0
- package/dist/src/bridge/internal/transport-client.test.js.map +1 -0
- package/dist/src/bridge/internal/transport-server.d.ts +59 -0
- package/dist/src/bridge/internal/transport-server.d.ts.map +1 -0
- package/dist/src/bridge/internal/transport-server.js +189 -0
- package/dist/src/bridge/internal/transport-server.js.map +1 -0
- package/dist/src/bridge/internal/transport-server.test.d.ts +6 -0
- package/dist/src/bridge/internal/transport-server.test.d.ts.map +1 -0
- package/dist/src/bridge/internal/transport-server.test.js +171 -0
- package/dist/src/bridge/internal/transport-server.test.js.map +1 -0
- package/dist/src/bridge/types.d.ts +117 -0
- package/dist/src/bridge/types.d.ts.map +1 -0
- package/dist/src/bridge/types.js +68 -0
- package/dist/src/bridge/types.js.map +1 -0
- package/dist/src/cli/adapters/cli-command-adapter-handler.test.d.ts +6 -0
- package/dist/src/cli/adapters/cli-command-adapter-handler.test.d.ts.map +1 -0
- package/dist/src/cli/adapters/cli-command-adapter-handler.test.js +260 -0
- package/dist/src/cli/adapters/cli-command-adapter-handler.test.js.map +1 -0
- package/dist/src/cli/adapters/cli-command-adapter.d.ts +39 -0
- package/dist/src/cli/adapters/cli-command-adapter.d.ts.map +1 -0
- package/dist/src/cli/adapters/cli-command-adapter.js +241 -0
- package/dist/src/cli/adapters/cli-command-adapter.js.map +1 -0
- package/dist/src/cli/adapters/cli-command-adapter.test.d.ts +5 -0
- package/dist/src/cli/adapters/cli-command-adapter.test.d.ts.map +1 -0
- package/dist/src/cli/adapters/cli-command-adapter.test.js +188 -0
- package/dist/src/cli/adapters/cli-command-adapter.test.js.map +1 -0
- package/dist/src/cli/adapters/group-builder.d.ts +29 -0
- package/dist/src/cli/adapters/group-builder.d.ts.map +1 -0
- package/dist/src/cli/adapters/group-builder.js +54 -0
- package/dist/src/cli/adapters/group-builder.js.map +1 -0
- package/dist/src/cli/adapters/group-builder.test.d.ts +5 -0
- package/dist/src/cli/adapters/group-builder.test.d.ts.map +1 -0
- package/dist/src/cli/adapters/group-builder.test.js +108 -0
- package/dist/src/cli/adapters/group-builder.test.js.map +1 -0
- package/dist/src/cli/adapters/help-formatter.d.ts +11 -0
- package/dist/src/cli/adapters/help-formatter.d.ts.map +1 -0
- package/dist/src/cli/adapters/help-formatter.js +78 -0
- package/dist/src/cli/adapters/help-formatter.js.map +1 -0
- package/dist/src/cli/adapters/help-formatter.test.d.ts +5 -0
- package/dist/src/cli/adapters/help-formatter.test.d.ts.map +1 -0
- package/dist/src/cli/adapters/help-formatter.test.js +79 -0
- package/dist/src/cli/adapters/help-formatter.test.js.map +1 -0
- package/dist/src/cli/adapters/target-resolver.d.ts +54 -0
- package/dist/src/cli/adapters/target-resolver.d.ts.map +1 -0
- package/dist/src/cli/adapters/target-resolver.js +90 -0
- package/dist/src/cli/adapters/target-resolver.js.map +1 -0
- package/dist/src/cli/adapters/target-resolver.test.d.ts +5 -0
- package/dist/src/cli/adapters/target-resolver.test.d.ts.map +1 -0
- package/dist/src/cli/adapters/target-resolver.test.js +169 -0
- package/dist/src/cli/adapters/target-resolver.test.js.map +1 -0
- package/dist/src/cli/args/global-args.d.ts +2 -0
- package/dist/src/cli/args/global-args.d.ts.map +1 -1
- package/dist/src/cli/cli.d.ts +6 -3
- package/dist/src/cli/cli.d.ts.map +1 -1
- package/dist/src/cli/cli.js +82 -20
- package/dist/src/cli/cli.js.map +1 -1
- package/dist/src/cli/resolve-script-content.d.ts +19 -0
- package/dist/src/cli/resolve-script-content.d.ts.map +1 -0
- package/dist/src/cli/resolve-script-content.js +22 -0
- package/dist/src/cli/resolve-script-content.js.map +1 -0
- package/dist/src/cli/resolve-session.d.ts +21 -0
- package/dist/src/cli/resolve-session.d.ts.map +1 -0
- package/dist/src/cli/resolve-session.js +40 -0
- package/dist/src/cli/resolve-session.js.map +1 -0
- package/dist/src/cli/resolve-session.test.d.ts +5 -0
- package/dist/src/cli/resolve-session.test.d.ts.map +1 -0
- package/dist/src/cli/resolve-session.test.js +112 -0
- package/dist/src/cli/resolve-session.test.js.map +1 -0
- package/dist/src/cli/script-executor.d.ts +1 -0
- package/dist/src/cli/script-executor.d.ts.map +1 -1
- package/dist/src/cli/script-executor.js +7 -1
- package/dist/src/cli/script-executor.js.map +1 -1
- package/dist/src/cli/types.d.ts +11 -0
- package/dist/src/cli/types.d.ts.map +1 -0
- package/dist/src/cli/types.js +5 -0
- package/dist/src/cli/types.js.map +1 -0
- package/dist/src/commands/connect.d.ts +16 -0
- package/dist/src/commands/connect.d.ts.map +1 -0
- package/dist/src/commands/connect.js +15 -0
- package/dist/src/commands/connect.js.map +1 -0
- package/dist/src/commands/connect.test.d.ts +5 -0
- package/dist/src/commands/connect.test.d.ts.map +1 -0
- package/dist/src/commands/connect.test.js +46 -0
- package/dist/src/commands/connect.test.js.map +1 -0
- package/dist/src/commands/console/exec/exec.d.ts +43 -0
- package/dist/src/commands/console/exec/exec.d.ts.map +1 -0
- package/dist/src/commands/console/exec/exec.js +79 -0
- package/dist/src/commands/console/exec/exec.js.map +1 -0
- package/dist/src/commands/console/exec/exec.test.d.ts +5 -0
- package/dist/src/commands/console/exec/exec.test.d.ts.map +1 -0
- package/dist/src/commands/console/exec/exec.test.js +191 -0
- package/dist/src/commands/console/exec/exec.test.js.map +1 -0
- package/dist/src/commands/console/logs/logs.d.ts +23 -0
- package/dist/src/commands/console/logs/logs.d.ts.map +1 -0
- package/dist/src/commands/console/logs/logs.js +80 -0
- package/dist/src/commands/console/logs/logs.js.map +1 -0
- package/dist/src/commands/console/logs/logs.test.d.ts +5 -0
- package/dist/src/commands/console/logs/logs.test.d.ts.map +1 -0
- package/dist/src/commands/console/logs/logs.test.js +111 -0
- package/dist/src/commands/console/logs/logs.test.js.map +1 -0
- package/dist/src/commands/disconnect.d.ts +9 -0
- package/dist/src/commands/disconnect.d.ts.map +1 -0
- package/dist/src/commands/disconnect.js +8 -0
- package/dist/src/commands/disconnect.js.map +1 -0
- package/dist/src/commands/disconnect.test.d.ts +5 -0
- package/dist/src/commands/disconnect.test.d.ts.map +1 -0
- package/dist/src/commands/disconnect.test.js +17 -0
- package/dist/src/commands/disconnect.test.js.map +1 -0
- package/dist/src/commands/explorer/query/query.d.ts +31 -0
- package/dist/src/commands/explorer/query/query.d.ts.map +1 -0
- package/dist/src/commands/explorer/query/query.js +106 -0
- package/dist/src/commands/explorer/query/query.js.map +1 -0
- package/dist/src/commands/explorer/query/query.test.d.ts +5 -0
- package/dist/src/commands/explorer/query/query.test.d.ts.map +1 -0
- package/dist/src/commands/explorer/query/query.test.js +228 -0
- package/dist/src/commands/explorer/query/query.test.js.map +1 -0
- package/dist/src/commands/formatters.test.d.ts +6 -0
- package/dist/src/commands/formatters.test.d.ts.map +1 -0
- package/dist/src/commands/formatters.test.js +211 -0
- package/dist/src/commands/formatters.test.js.map +1 -0
- package/dist/src/commands/framework/action-loader.d.ts +25 -0
- package/dist/src/commands/framework/action-loader.d.ts.map +1 -0
- package/dist/src/commands/framework/action-loader.js +46 -0
- package/dist/src/commands/framework/action-loader.js.map +1 -0
- package/dist/src/commands/framework/action-loader.test.d.ts +5 -0
- package/dist/src/commands/framework/action-loader.test.d.ts.map +1 -0
- package/dist/src/commands/framework/action-loader.test.js +89 -0
- package/dist/src/commands/framework/action-loader.test.js.map +1 -0
- package/dist/src/commands/framework/arg-builder.d.ts +92 -0
- package/dist/src/commands/framework/arg-builder.d.ts.map +1 -0
- package/dist/src/commands/framework/arg-builder.js +137 -0
- package/dist/src/commands/framework/arg-builder.js.map +1 -0
- package/dist/src/commands/framework/arg-builder.test.d.ts +5 -0
- package/dist/src/commands/framework/arg-builder.test.d.ts.map +1 -0
- package/dist/src/commands/framework/arg-builder.test.js +246 -0
- package/dist/src/commands/framework/arg-builder.test.js.map +1 -0
- package/dist/src/commands/framework/command-registry.d.ts +23 -0
- package/dist/src/commands/framework/command-registry.d.ts.map +1 -0
- package/dist/src/commands/framework/command-registry.js +42 -0
- package/dist/src/commands/framework/command-registry.js.map +1 -0
- package/dist/src/commands/framework/command-registry.test.d.ts +5 -0
- package/dist/src/commands/framework/command-registry.test.d.ts.map +1 -0
- package/dist/src/commands/framework/command-registry.test.js +158 -0
- package/dist/src/commands/framework/command-registry.test.js.map +1 -0
- package/dist/src/commands/framework/define-command.d.ts +76 -0
- package/dist/src/commands/framework/define-command.d.ts.map +1 -0
- package/dist/src/commands/framework/define-command.js +28 -0
- package/dist/src/commands/framework/define-command.js.map +1 -0
- package/dist/src/commands/framework/define-command.test.d.ts +5 -0
- package/dist/src/commands/framework/define-command.test.d.ts.map +1 -0
- package/dist/src/commands/framework/define-command.test.js +135 -0
- package/dist/src/commands/framework/define-command.test.js.map +1 -0
- package/dist/src/commands/framework/index.d.ts +8 -0
- package/dist/src/commands/framework/index.d.ts.map +1 -0
- package/dist/src/commands/framework/index.js +8 -0
- package/dist/src/commands/framework/index.js.map +1 -0
- package/dist/src/commands/index.d.ts +20 -0
- package/dist/src/commands/index.d.ts.map +1 -0
- package/dist/src/commands/index.js +20 -0
- package/dist/src/commands/index.js.map +1 -0
- package/dist/src/commands/linux/inject-credentials/inject-credentials.d.ts +15 -0
- package/dist/src/commands/linux/inject-credentials/inject-credentials.d.ts.map +1 -0
- package/dist/src/commands/linux/inject-credentials/inject-credentials.js +88 -0
- package/dist/src/commands/linux/inject-credentials/inject-credentials.js.map +1 -0
- package/dist/src/commands/linux/setup/setup.d.ts +19 -0
- package/dist/src/commands/linux/setup/setup.d.ts.map +1 -0
- package/dist/src/commands/linux/setup/setup.js +107 -0
- package/dist/src/commands/linux/setup/setup.js.map +1 -0
- package/dist/src/commands/linux/status/status.d.ts +34 -0
- package/dist/src/commands/linux/status/status.d.ts.map +1 -0
- package/dist/src/commands/linux/status/status.js +134 -0
- package/dist/src/commands/linux/status/status.js.map +1 -0
- package/dist/src/commands/plugin/install/install.d.ts +10 -0
- package/dist/src/commands/plugin/install/install.d.ts.map +1 -0
- package/dist/src/commands/plugin/install/install.js +23 -0
- package/dist/src/commands/plugin/install/install.js.map +1 -0
- package/dist/src/commands/plugin/uninstall/uninstall.d.ts +9 -0
- package/dist/src/commands/plugin/uninstall/uninstall.d.ts.map +1 -0
- package/dist/src/commands/plugin/uninstall/uninstall.js +41 -0
- package/dist/src/commands/plugin/uninstall/uninstall.js.map +1 -0
- package/dist/src/commands/process/close/close.d.ts +22 -0
- package/dist/src/commands/process/close/close.d.ts.map +1 -0
- package/dist/src/commands/process/close/close.js +34 -0
- package/dist/src/commands/process/close/close.js.map +1 -0
- package/dist/src/commands/process/format-state.d.ts +7 -0
- package/dist/src/commands/process/format-state.d.ts.map +1 -0
- package/dist/src/commands/process/format-state.js +19 -0
- package/dist/src/commands/process/format-state.js.map +1 -0
- package/dist/src/commands/process/info/info.d.ts +17 -0
- package/dist/src/commands/process/info/info.d.ts.map +1 -0
- package/dist/src/commands/process/info/info.js +38 -0
- package/dist/src/commands/process/info/info.js.map +1 -0
- package/dist/src/commands/process/info/info.test.d.ts +5 -0
- package/dist/src/commands/process/info/info.test.d.ts.map +1 -0
- package/dist/src/commands/process/info/info.test.js +58 -0
- package/dist/src/commands/process/info/info.test.js.map +1 -0
- package/dist/src/commands/process/launch/launch.d.ts +17 -0
- package/dist/src/commands/process/launch/launch.d.ts.map +1 -0
- package/dist/src/commands/process/launch/launch.js +26 -0
- package/dist/src/commands/process/launch/launch.js.map +1 -0
- package/dist/src/commands/process/launch/launch.test.d.ts +5 -0
- package/dist/src/commands/process/launch/launch.test.d.ts.map +1 -0
- package/dist/src/commands/process/launch/launch.test.js +49 -0
- package/dist/src/commands/process/launch/launch.test.js.map +1 -0
- package/dist/src/commands/process/list/list.d.ts +16 -0
- package/dist/src/commands/process/list/list.d.ts.map +1 -0
- package/dist/src/commands/process/list/list.js +56 -0
- package/dist/src/commands/process/list/list.js.map +1 -0
- package/dist/src/commands/process/list/list.test.d.ts +5 -0
- package/dist/src/commands/process/list/list.test.d.ts.map +1 -0
- package/dist/src/commands/process/list/list.test.js +71 -0
- package/dist/src/commands/process/list/list.test.js.map +1 -0
- package/dist/src/commands/process/run/run.d.ts +31 -0
- package/dist/src/commands/process/run/run.d.ts.map +1 -0
- package/dist/src/commands/process/run/run.js +63 -0
- package/dist/src/commands/process/run/run.js.map +1 -0
- package/dist/src/commands/rgba-to-png.d.ts +17 -0
- package/dist/src/commands/rgba-to-png.d.ts.map +1 -0
- package/dist/src/commands/rgba-to-png.js +85 -0
- package/dist/src/commands/rgba-to-png.js.map +1 -0
- package/dist/src/commands/serve/serve.d.ts +17 -0
- package/dist/src/commands/serve/serve.d.ts.map +1 -0
- package/dist/src/commands/serve/serve.js +128 -0
- package/dist/src/commands/serve/serve.js.map +1 -0
- package/dist/src/commands/serve/serve.test.d.ts +5 -0
- package/dist/src/commands/serve/serve.test.d.ts.map +1 -0
- package/dist/src/commands/serve/serve.test.js +100 -0
- package/dist/src/commands/serve/serve.test.js.map +1 -0
- package/dist/src/commands/viewport/screenshot/screenshot.d.ts +17 -0
- package/dist/src/commands/viewport/screenshot/screenshot.d.ts.map +1 -0
- package/dist/src/commands/viewport/screenshot/screenshot.js +45 -0
- package/dist/src/commands/viewport/screenshot/screenshot.js.map +1 -0
- package/dist/src/commands/viewport/screenshot/screenshot.test.d.ts +5 -0
- package/dist/src/commands/viewport/screenshot/screenshot.test.d.ts.map +1 -0
- package/dist/src/commands/viewport/screenshot/screenshot.test.js +143 -0
- package/dist/src/commands/viewport/screenshot/screenshot.test.js.map +1 -0
- package/dist/src/docker/docker-delegator.d.ts +30 -0
- package/dist/src/docker/docker-delegator.d.ts.map +1 -0
- package/dist/src/docker/docker-delegator.js +201 -0
- package/dist/src/docker/docker-delegator.js.map +1 -0
- package/dist/src/docker/docker-delegator.test.d.ts +2 -0
- package/dist/src/docker/docker-delegator.test.d.ts.map +1 -0
- package/dist/src/docker/docker-delegator.test.js +132 -0
- package/dist/src/docker/docker-delegator.test.js.map +1 -0
- package/dist/src/index.d.ts +9 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +6 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/index.test.d.ts +2 -0
- package/dist/src/index.test.d.ts.map +1 -0
- package/dist/src/index.test.js +51 -0
- package/dist/src/index.test.js.map +1 -0
- package/dist/src/linux/index.d.ts +12 -0
- package/dist/src/linux/index.d.ts.map +1 -0
- package/dist/src/linux/index.js +11 -0
- package/dist/src/linux/index.js.map +1 -0
- package/dist/src/linux/linux-config.d.ts +37 -0
- package/dist/src/linux/linux-config.d.ts.map +1 -0
- package/dist/src/linux/linux-config.js +70 -0
- package/dist/src/linux/linux-config.js.map +1 -0
- package/dist/src/linux/linux-config.test.d.ts +2 -0
- package/dist/src/linux/linux-config.test.d.ts.map +1 -0
- package/dist/src/linux/linux-config.test.js +54 -0
- package/dist/src/linux/linux-config.test.js.map +1 -0
- package/dist/src/linux/linux-credential-writer.d.ts +35 -0
- package/dist/src/linux/linux-credential-writer.d.ts.map +1 -0
- package/dist/src/linux/linux-credential-writer.js +300 -0
- package/dist/src/linux/linux-credential-writer.js.map +1 -0
- package/dist/src/linux/linux-display-manager.d.ts +24 -0
- package/dist/src/linux/linux-display-manager.d.ts.map +1 -0
- package/dist/src/linux/linux-display-manager.js +92 -0
- package/dist/src/linux/linux-display-manager.js.map +1 -0
- package/dist/src/linux/linux-env-guard.d.ts +13 -0
- package/dist/src/linux/linux-env-guard.d.ts.map +1 -0
- package/dist/src/linux/linux-env-guard.js +31 -0
- package/dist/src/linux/linux-env-guard.js.map +1 -0
- package/dist/src/linux/linux-env-guard.test.d.ts +2 -0
- package/dist/src/linux/linux-env-guard.test.d.ts.map +1 -0
- package/dist/src/linux/linux-env-guard.test.js +48 -0
- package/dist/src/linux/linux-env-guard.test.js.map +1 -0
- package/dist/src/linux/linux-fflags.d.ts +17 -0
- package/dist/src/linux/linux-fflags.d.ts.map +1 -0
- package/dist/src/linux/linux-fflags.js +33 -0
- package/dist/src/linux/linux-fflags.js.map +1 -0
- package/dist/src/linux/linux-fflags.test.d.ts +2 -0
- package/dist/src/linux/linux-fflags.test.d.ts.map +1 -0
- package/dist/src/linux/linux-fflags.test.js +55 -0
- package/dist/src/linux/linux-fflags.test.js.map +1 -0
- package/dist/src/linux/linux-prerequisites.d.ts +24 -0
- package/dist/src/linux/linux-prerequisites.d.ts.map +1 -0
- package/dist/src/linux/linux-prerequisites.js +118 -0
- package/dist/src/linux/linux-prerequisites.js.map +1 -0
- package/dist/src/linux/linux-shader-patcher.d.ts +17 -0
- package/dist/src/linux/linux-shader-patcher.d.ts.map +1 -0
- package/dist/src/linux/linux-shader-patcher.js +48 -0
- package/dist/src/linux/linux-shader-patcher.js.map +1 -0
- package/dist/src/linux/linux-shader-patcher.test.d.ts +2 -0
- package/dist/src/linux/linux-shader-patcher.test.d.ts.map +1 -0
- package/dist/src/linux/linux-shader-patcher.test.js +55 -0
- package/dist/src/linux/linux-shader-patcher.test.js.map +1 -0
- package/dist/src/linux/linux-studio-installer.d.ts +10 -0
- package/dist/src/linux/linux-studio-installer.d.ts.map +1 -0
- package/dist/src/linux/linux-studio-installer.js +79 -0
- package/dist/src/linux/linux-studio-installer.js.map +1 -0
- package/dist/src/linux/linux-studio-launcher.d.ts +10 -0
- package/dist/src/linux/linux-studio-launcher.d.ts.map +1 -0
- package/dist/src/linux/linux-studio-launcher.js +73 -0
- package/dist/src/linux/linux-studio-launcher.js.map +1 -0
- package/dist/src/linux/linux-version-resolver.d.ts +18 -0
- package/dist/src/linux/linux-version-resolver.d.ts.map +1 -0
- package/dist/src/linux/linux-version-resolver.js +49 -0
- package/dist/src/linux/linux-version-resolver.js.map +1 -0
- package/dist/src/linux/linux-wine-env.d.ts +11 -0
- package/dist/src/linux/linux-wine-env.d.ts.map +1 -0
- package/dist/src/linux/linux-wine-env.js +33 -0
- package/dist/src/linux/linux-wine-env.js.map +1 -0
- package/dist/src/linux/linux-wine-env.test.d.ts +2 -0
- package/dist/src/linux/linux-wine-env.test.d.ts.map +1 -0
- package/dist/src/linux/linux-wine-env.test.js +47 -0
- package/dist/src/linux/linux-wine-env.test.js.map +1 -0
- package/dist/src/plugin/persistent-plugin-installer.d.ts +21 -0
- package/dist/src/plugin/persistent-plugin-installer.d.ts.map +1 -0
- package/dist/src/plugin/persistent-plugin-installer.js +69 -0
- package/dist/src/plugin/persistent-plugin-installer.js.map +1 -0
- package/dist/src/plugin/persistent-plugin-installer.test.d.ts +5 -0
- package/dist/src/plugin/persistent-plugin-installer.test.d.ts.map +1 -0
- package/dist/src/plugin/persistent-plugin-installer.test.js +109 -0
- package/dist/src/plugin/persistent-plugin-installer.test.js.map +1 -0
- package/dist/src/plugin/plugin-discovery.d.ts +7 -0
- package/dist/src/plugin/plugin-discovery.d.ts.map +1 -0
- package/dist/src/plugin/plugin-discovery.js +18 -0
- package/dist/src/plugin/plugin-discovery.js.map +1 -0
- package/dist/src/plugin/plugin-discovery.test.d.ts +5 -0
- package/dist/src/plugin/plugin-discovery.test.d.ts.map +1 -0
- package/dist/src/plugin/plugin-discovery.test.js +55 -0
- package/dist/src/plugin/plugin-discovery.test.js.map +1 -0
- package/dist/src/plugin/plugin-injector.js +1 -1
- package/dist/src/plugin/plugin-injector.js.map +1 -1
- package/dist/src/process/studio-process-manager.d.ts +7 -3
- package/dist/src/process/studio-process-manager.d.ts.map +1 -1
- package/dist/src/process/studio-process-manager.js +38 -11
- package/dist/src/process/studio-process-manager.js.map +1 -1
- package/dist/src/process/studio-process-manager.test.js +18 -1
- package/dist/src/process/studio-process-manager.test.js.map +1 -1
- package/dist/src/server/action-dispatcher.d.ts +35 -0
- package/dist/src/server/action-dispatcher.d.ts.map +1 -0
- package/dist/src/server/action-dispatcher.js +67 -0
- package/dist/src/server/action-dispatcher.js.map +1 -0
- package/dist/src/server/action-dispatcher.test.d.ts +6 -0
- package/dist/src/server/action-dispatcher.test.d.ts.map +1 -0
- package/dist/src/server/action-dispatcher.test.js +173 -0
- package/dist/src/server/action-dispatcher.test.js.map +1 -0
- package/dist/src/server/index.d.ts +1 -1
- package/dist/src/server/index.d.ts.map +1 -1
- package/dist/src/server/pending-request-map.d.ts +33 -0
- package/dist/src/server/pending-request-map.d.ts.map +1 -0
- package/dist/src/server/pending-request-map.js +69 -0
- package/dist/src/server/pending-request-map.js.map +1 -0
- package/dist/src/server/pending-request-map.test.d.ts +2 -0
- package/dist/src/server/pending-request-map.test.d.ts.map +1 -0
- package/dist/src/server/pending-request-map.test.js +192 -0
- package/dist/src/server/pending-request-map.test.js.map +1 -0
- package/dist/src/server/plugin-detection.test.d.ts +7 -0
- package/dist/src/server/plugin-detection.test.d.ts.map +1 -0
- package/dist/src/server/plugin-detection.test.js +154 -0
- package/dist/src/server/plugin-detection.test.js.map +1 -0
- package/dist/src/server/studio-bridge-server.d.ts +44 -7
- package/dist/src/server/studio-bridge-server.d.ts.map +1 -1
- package/dist/src/server/studio-bridge-server.js +341 -91
- package/dist/src/server/studio-bridge-server.js.map +1 -1
- package/dist/src/server/studio-bridge-server.test.js +231 -207
- package/dist/src/server/studio-bridge-server.test.js.map +1 -1
- package/dist/src/server/web-socket-protocol-basic.test.d.ts +2 -0
- package/dist/src/server/web-socket-protocol-basic.test.d.ts.map +1 -0
- package/dist/src/server/web-socket-protocol-basic.test.js +98 -0
- package/dist/src/server/web-socket-protocol-basic.test.js.map +1 -0
- package/dist/src/server/web-socket-protocol.d.ts +218 -20
- package/dist/src/server/web-socket-protocol.d.ts.map +1 -1
- package/dist/src/server/web-socket-protocol.js +346 -20
- package/dist/src/server/web-socket-protocol.js.map +1 -1
- package/dist/src/server/web-socket-protocol.test.js +572 -146
- package/dist/src/server/web-socket-protocol.test.js.map +1 -1
- package/dist/src/test/e2e/hand-off.test.d.ts +9 -0
- package/dist/src/test/e2e/hand-off.test.d.ts.map +1 -0
- package/dist/src/test/e2e/hand-off.test.js +274 -0
- package/dist/src/test/e2e/hand-off.test.js.map +1 -0
- package/dist/src/test/e2e/persistent-session.test.d.ts +11 -0
- package/dist/src/test/e2e/persistent-session.test.d.ts.map +1 -0
- package/dist/src/test/e2e/persistent-session.test.js +367 -0
- package/dist/src/test/e2e/persistent-session.test.js.map +1 -0
- package/dist/src/test/e2e/split-server.test.d.ts +14 -0
- package/dist/src/test/e2e/split-server.test.d.ts.map +1 -0
- package/dist/src/test/e2e/split-server.test.js +230 -0
- package/dist/src/test/e2e/split-server.test.js.map +1 -0
- package/dist/src/test/helpers/mock-plugin-client.d.ts +69 -0
- package/dist/src/test/helpers/mock-plugin-client.d.ts.map +1 -0
- package/dist/src/test/helpers/mock-plugin-client.js +213 -0
- package/dist/src/test/helpers/mock-plugin-client.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/docker/.dockerignore +2 -0
- package/docker/Dockerfile +113 -0
- package/docker/docker-compose.yml +20 -0
- package/docker/entrypoint.sh +19 -0
- package/package.json +8 -6
- package/src/bridge/bridge-connection-remote.test.ts +189 -0
- package/src/bridge/bridge-connection.test.ts +1076 -0
- package/src/bridge/bridge-connection.ts +718 -0
- package/src/bridge/bridge-session.test.ts +336 -0
- package/src/bridge/bridge-session.ts +365 -0
- package/src/bridge/index.ts +42 -0
- package/src/bridge/internal/__tests__/failover-crash.test.ts +191 -0
- package/src/bridge/internal/__tests__/failover-graceful.test.ts +268 -0
- package/src/bridge/internal/__tests__/failover-inflight.test.ts +329 -0
- package/src/bridge/internal/__tests__/host-client-integration.test.ts +387 -0
- package/src/bridge/internal/bridge-client.test.ts +399 -0
- package/src/bridge/internal/bridge-client.ts +434 -0
- package/src/bridge/internal/bridge-host.test.ts +501 -0
- package/src/bridge/internal/bridge-host.ts +531 -0
- package/src/bridge/internal/environment-detection.test.ts +180 -0
- package/src/bridge/internal/environment-detection.ts +119 -0
- package/src/bridge/internal/hand-off.test.ts +408 -0
- package/src/bridge/internal/hand-off.ts +275 -0
- package/src/bridge/internal/health-endpoint.test.ts +147 -0
- package/src/bridge/internal/health-endpoint.ts +100 -0
- package/src/bridge/internal/host-protocol.test.ts +415 -0
- package/src/bridge/internal/host-protocol.ts +255 -0
- package/src/bridge/internal/session-tracker.test.ts +535 -0
- package/src/bridge/internal/session-tracker.ts +198 -0
- package/src/bridge/internal/transport-client.test.ts +241 -0
- package/src/bridge/internal/transport-client.ts +194 -0
- package/src/bridge/internal/transport-server.test.ts +220 -0
- package/src/bridge/internal/transport-server.ts +242 -0
- package/src/bridge/types.ts +161 -0
- package/src/cli/adapters/cli-command-adapter-handler.test.ts +318 -0
- package/src/cli/adapters/cli-command-adapter.test.ts +221 -0
- package/src/cli/adapters/cli-command-adapter.ts +342 -0
- package/src/cli/adapters/group-builder.test.ts +146 -0
- package/src/cli/adapters/group-builder.ts +81 -0
- package/src/cli/adapters/help-formatter.test.ts +97 -0
- package/src/cli/adapters/help-formatter.ts +86 -0
- package/src/cli/adapters/target-resolver.test.ts +222 -0
- package/src/cli/adapters/target-resolver.ts +144 -0
- package/src/cli/args/global-args.ts +2 -0
- package/src/cli/cli.ts +100 -21
- package/src/cli/resolve-script-content.ts +36 -0
- package/src/cli/resolve-session.test.ts +141 -0
- package/src/cli/resolve-session.ts +66 -0
- package/src/cli/script-executor.ts +22 -4
- package/src/cli/types.ts +11 -0
- package/src/commands/connect.test.ts +61 -0
- package/src/commands/connect.ts +32 -0
- package/src/commands/console/exec/exec.test.ts +258 -0
- package/src/commands/console/exec/exec.ts +130 -0
- package/src/commands/console/exec/execute.luau +202 -0
- package/src/commands/console/logs/logs.test.ts +138 -0
- package/src/commands/console/logs/logs.ts +115 -0
- package/src/commands/console/logs/query-logs.luau +76 -0
- package/src/commands/disconnect.test.ts +21 -0
- package/src/commands/disconnect.ts +12 -0
- package/src/commands/explorer/query/query-data-model.luau +206 -0
- package/src/commands/explorer/query/query.test.ts +297 -0
- package/src/commands/explorer/query/query.ts +157 -0
- package/src/commands/formatters.test.ts +237 -0
- package/src/commands/framework/action-loader.test.ts +118 -0
- package/src/commands/framework/action-loader.ts +65 -0
- package/src/commands/framework/arg-builder.test.ts +298 -0
- package/src/commands/framework/arg-builder.ts +203 -0
- package/src/commands/framework/command-registry.test.ts +204 -0
- package/src/commands/framework/command-registry.ts +51 -0
- package/src/commands/framework/define-command.test.ts +161 -0
- package/src/commands/framework/define-command.ts +114 -0
- package/src/commands/framework/index.ts +33 -0
- package/src/commands/index.ts +72 -0
- package/src/commands/linux/inject-credentials/inject-credentials.ts +118 -0
- package/src/commands/linux/setup/setup.ts +145 -0
- package/src/commands/linux/status/status.ts +180 -0
- package/src/commands/plugin/install/install.ts +31 -0
- package/src/commands/plugin/uninstall/uninstall.ts +54 -0
- package/src/commands/process/close/close.ts +52 -0
- package/src/commands/process/format-state.ts +21 -0
- package/src/commands/process/info/info.test.ts +76 -0
- package/src/commands/process/info/info.ts +54 -0
- package/src/commands/process/info/query-state.luau +48 -0
- package/src/commands/process/launch/launch.test.ts +65 -0
- package/src/commands/process/launch/launch.ts +45 -0
- package/src/commands/process/list/list.test.ts +82 -0
- package/src/commands/process/list/list.ts +75 -0
- package/src/commands/process/run/run.ts +98 -0
- package/src/commands/rgba-to-png.ts +98 -0
- package/src/commands/serve/serve.test.ts +139 -0
- package/src/commands/serve/serve.ts +161 -0
- package/src/commands/viewport/screenshot/capture-screenshot.luau +247 -0
- package/src/commands/viewport/screenshot/screenshot.test.ts +181 -0
- package/src/commands/viewport/screenshot/screenshot.ts +71 -0
- package/src/docker/docker-delegator.test.ts +159 -0
- package/src/docker/docker-delegator.ts +240 -0
- package/src/index.test.ts +58 -0
- package/src/index.ts +104 -3
- package/src/linux/README.md +130 -0
- package/src/linux/index.ts +25 -0
- package/src/linux/linux-config.test.ts +66 -0
- package/src/linux/linux-config.ts +102 -0
- package/src/linux/linux-credential-writer.ts +421 -0
- package/src/linux/linux-display-manager.ts +106 -0
- package/src/linux/linux-env-guard.test.ts +62 -0
- package/src/linux/linux-env-guard.ts +38 -0
- package/src/linux/linux-fflags.test.ts +78 -0
- package/src/linux/linux-fflags.ts +48 -0
- package/src/linux/linux-prerequisites.ts +152 -0
- package/src/linux/linux-shader-patcher.test.ts +76 -0
- package/src/linux/linux-shader-patcher.ts +56 -0
- package/src/linux/linux-studio-installer.ts +113 -0
- package/src/linux/linux-studio-launcher.ts +90 -0
- package/src/linux/linux-version-resolver.ts +74 -0
- package/src/linux/linux-wine-env.test.ts +56 -0
- package/src/linux/linux-wine-env.ts +38 -0
- package/src/linux/write-cred.c +48 -0
- package/src/plugin/persistent-plugin-installer.test.ts +168 -0
- package/src/plugin/persistent-plugin-installer.ts +90 -0
- package/src/plugin/plugin-discovery.test.ts +70 -0
- package/src/plugin/plugin-discovery.ts +21 -0
- package/src/plugin/plugin-injector.ts +1 -1
- package/src/process/studio-process-manager.test.ts +22 -1
- package/src/process/studio-process-manager.ts +57 -18
- package/src/server/action-dispatcher.test.ts +240 -0
- package/src/server/action-dispatcher.ts +89 -0
- package/src/server/index.ts +0 -3
- package/src/server/pending-request-map.test.ts +261 -0
- package/src/server/pending-request-map.ts +87 -0
- package/src/server/plugin-detection.test.ts +195 -0
- package/src/server/studio-bridge-server.test.ts +321 -283
- package/src/server/studio-bridge-server.ts +469 -111
- package/src/server/web-socket-protocol-basic.test.ts +131 -0
- package/src/server/web-socket-protocol.test.ts +658 -159
- package/src/server/web-socket-protocol.ts +668 -58
- package/src/test/e2e/hand-off.test.ts +338 -0
- package/src/test/e2e/persistent-session.test.ts +442 -0
- package/src/test/e2e/split-server.test.ts +290 -0
- package/src/test/helpers/mock-plugin-client.ts +276 -0
- package/templates/studio-bridge-plugin/src/Shared/ActionRouter.luau +245 -0
- package/templates/studio-bridge-plugin/src/Shared/DiscoveryStateMachine.luau +203 -0
- package/templates/studio-bridge-plugin/src/Shared/MessageBuffer.luau +144 -0
- package/templates/studio-bridge-plugin/src/Shared/Protocol.luau +132 -0
- package/templates/studio-bridge-plugin/src/StudioBridgePlugin.server.lua +364 -133
- package/templates/studio-bridge-plugin/src/Vendor/png.luau +1247 -0
- package/templates/studio-bridge-plugin-test/test/actions.test.luau +580 -0
- package/templates/studio-bridge-plugin-test/test/discovery.test.luau +622 -0
- package/templates/studio-bridge-plugin-test/test/execute-handler.test.luau +406 -0
- package/templates/studio-bridge-plugin-test/test/hash-lifecycle.test.luau +814 -0
- package/templates/studio-bridge-plugin-test/test/integration.test.luau +1020 -0
- package/templates/studio-bridge-plugin-test/test/new-actions.test.luau +339 -0
- package/templates/studio-bridge-plugin-test/test/plugin-entry.test.luau +493 -0
- package/templates/studio-bridge-plugin-test/test/protocol.test.luau +506 -0
- package/templates/studio-bridge-plugin-test/test/roblox-mocks.luau +108 -0
- package/templates/studio-bridge-plugin-test/test/test-runner.luau +112 -0
- package/dist/src/cli/commands/exec-command.d.ts +0 -15
- package/dist/src/cli/commands/exec-command.d.ts.map +0 -1
- package/dist/src/cli/commands/exec-command.js +0 -35
- package/dist/src/cli/commands/exec-command.js.map +0 -1
- package/dist/src/cli/commands/run-command.d.ts +0 -15
- package/dist/src/cli/commands/run-command.d.ts.map +0 -1
- package/dist/src/cli/commands/run-command.js +0 -47
- package/dist/src/cli/commands/run-command.js.map +0 -1
- package/dist/src/cli/commands/terminal/terminal-command.d.ts +0 -17
- package/dist/src/cli/commands/terminal/terminal-command.d.ts.map +0 -1
- package/dist/src/cli/commands/terminal/terminal-command.js +0 -41
- package/dist/src/cli/commands/terminal/terminal-command.js.map +0 -1
- package/dist/src/cli/commands/terminal/terminal-editor.d.ts +0 -43
- package/dist/src/cli/commands/terminal/terminal-editor.d.ts.map +0 -1
- package/dist/src/cli/commands/terminal/terminal-editor.js +0 -430
- package/dist/src/cli/commands/terminal/terminal-editor.js.map +0 -1
- package/dist/src/cli/commands/terminal/terminal-mode.d.ts +0 -13
- package/dist/src/cli/commands/terminal/terminal-mode.d.ts.map +0 -1
- package/dist/src/cli/commands/terminal/terminal-mode.js +0 -141
- package/dist/src/cli/commands/terminal/terminal-mode.js.map +0 -1
- package/dist/src/server/web-socket-protocol.smoke.test.d.ts +0 -6
- package/dist/src/server/web-socket-protocol.smoke.test.d.ts.map +0 -1
- package/dist/src/server/web-socket-protocol.smoke.test.js +0 -196
- package/dist/src/server/web-socket-protocol.smoke.test.js.map +0 -1
- package/src/cli/commands/exec-command.ts +0 -48
- package/src/cli/commands/run-command.ts +0 -63
- package/src/cli/commands/terminal/terminal-command.ts +0 -54
- package/src/cli/commands/terminal/terminal-editor.ts +0 -500
- package/src/cli/commands/terminal/terminal-mode.ts +0 -184
- 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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"linux-fflags.test.d.ts","sourceRoot":"","sources":["../../../src/linux/linux-fflags.test.ts"],"names":[],"mappings":""}
|