windows-development-sandbox 1.17.3 → 1.18.2
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/README.md +1 -1
- package/config.example.json +97 -4
- package/dist/app/features/accounts/accounts.def.d.ts +116 -2
- package/dist/app/features/accounts/accounts.def.js +80 -12
- package/dist/app/features/accounts/accounts.run.d.ts +29 -0
- package/dist/app/features/accounts/accounts.run.js +36 -6
- package/dist/app/features/accounts/index.d.ts +2 -0
- package/dist/app/features/accounts/index.js +4 -1
- package/dist/app/features/accounts/services.def.d.ts +111 -0
- package/dist/app/features/accounts/services.def.js +187 -0
- package/dist/app/features/accounts/services.run.d.ts +65 -0
- package/dist/app/features/accounts/services.run.js +212 -0
- package/dist/app/features/defs.d.ts +112 -1
- package/dist/app/features/defs.js +5 -0
- package/dist/app/features/settings/categories.def.js +21 -4
- package/dist/app/registry.js +5 -1
- package/dist/bin/agent-sandbox.js +2 -2
- package/dist/bin/{chunk-QLGGAG3D.js → chunk-IIHL7W6B.js} +51 -16
- package/dist/bin/{chunk-XYUVIVJT.js → chunk-M4OM632I.js} +1 -1
- package/dist/bin/{chunk-REE3EMHD.js → chunk-MQIA7GNB.js} +3813 -1702
- package/dist/bin/claude-host.js +2 -2
- package/dist/bin/claude-sbx.js +2 -2
- package/dist/bin/codex-sbx.js +2 -2
- package/dist/bin/gemini-sbx.js +2 -2
- package/dist/bin/sandbox.js +2 -2
- package/dist/bin/sbx-hide.js +2 -2
- package/dist/bin/sbx-show.js +2 -2
- package/dist/cli/commands/launch/launch.js +30 -1
- package/dist/cli/manifest.d.ts +93 -65
- package/dist/cli/manifest.js +23 -5
- package/dist/cli/menu/pages/accounts-page.js +31 -16
- package/dist/cli/services/accounts-service.d.ts +14 -4
- package/dist/cli/services/accounts-service.js +19 -6
- package/dist/cli/services/data-collect.js +26 -1
- package/dist/core/config/defaults.js +47 -4
- package/dist/core/detect/toolchains.d.ts +15 -1
- package/dist/core/detect/toolchains.js +45 -12
- package/dist/core/local-config/overrides.js +6 -0
- package/dist/core/schema/accounts.d.ts +27 -0
- package/dist/core/schema/accounts.js +32 -0
- package/dist/core/schema/config.d.ts +239 -0
- package/dist/core/schema/config.js +6 -0
- package/dist/core/schema/pc-installs.d.ts +7 -0
- package/dist/core/schema/pc-installs.js +17 -0
- package/dist/core/schema/toolchains.d.ts +61 -0
- package/dist/core/schema/toolchains.js +106 -0
- package/dist/core/types.d.ts +18 -0
- package/dist/guest/accounts/adapter.d.ts +25 -0
- package/dist/guest/accounts/adapter.js +21 -0
- package/dist/guest/accounts/adapters.d.ts +5 -0
- package/dist/guest/accounts/adapters.js +18 -0
- package/dist/guest/accounts/apply.d.ts +41 -0
- package/dist/guest/accounts/apply.js +47 -0
- package/dist/guest/accounts/kinds/appstore.d.ts +2 -0
- package/dist/guest/accounts/kinds/appstore.js +7 -0
- package/dist/guest/accounts/kinds/cfx.d.ts +2 -0
- package/dist/guest/accounts/kinds/cfx.js +7 -0
- package/dist/guest/accounts/kinds/epic.d.ts +2 -0
- package/dist/guest/accounts/kinds/epic.js +26 -0
- package/dist/guest/accounts/kinds/expo.d.ts +2 -0
- package/dist/guest/accounts/kinds/expo.js +7 -0
- package/dist/guest/accounts/kinds/keystore.d.ts +2 -0
- package/dist/guest/accounts/kinds/keystore.js +7 -0
- package/dist/guest/accounts/kinds/play.d.ts +2 -0
- package/dist/guest/accounts/kinds/play.js +7 -0
- package/dist/guest/accounts/kinds/steam.d.ts +4 -0
- package/dist/guest/accounts/kinds/steam.js +17 -0
- package/dist/guest/accounts/kinds/unity.d.ts +2 -0
- package/dist/guest/accounts/kinds/unity.js +7 -0
- package/dist/guest/accounts/watch.d.ts +28 -0
- package/dist/guest/accounts/watch.js +78 -0
- package/dist/guest/apps/resolvers-gamedev.d.ts +2 -0
- package/dist/guest/apps/resolvers-gamedev.js +1 -0
- package/dist/guest/apps/resolvers-mobile.d.ts +2 -0
- package/dist/guest/apps/resolvers-mobile.js +1 -0
- package/dist/guest/apps/resolvers.js +4 -0
- package/dist/guest/boot/boot.d.ts +5 -0
- package/dist/guest/boot/boot.js +35 -1
- package/dist/guest/daemon/accounts.d.ts +3 -0
- package/dist/guest/daemon/accounts.js +25 -0
- package/dist/guest/daemon/daemon.js +2 -0
- package/dist/guest/daemon/idle-shutdown.js +3 -1
- package/dist/guest/daemon/sessions.js +2 -0
- package/dist/guest/devtools/android.d.ts +2 -0
- package/dist/guest/devtools/android.js +7 -0
- package/dist/guest/devtools/devtool.d.ts +9 -0
- package/dist/guest/devtools/devtool.js +5 -0
- package/dist/guest/devtools/fivem.d.ts +2 -0
- package/dist/guest/devtools/fivem.js +7 -0
- package/dist/guest/devtools/registry.d.ts +6 -0
- package/dist/guest/devtools/registry.js +12 -0
- package/dist/guest/devtools/steam.d.ts +2 -0
- package/dist/guest/devtools/steam.js +228 -0
- package/dist/guest/devtools/unity.d.ts +2 -0
- package/dist/guest/devtools/unity.js +7 -0
- package/dist/guest/entries/daemon.js +2 -0
- package/dist/guest/entries/tool.d.ts +1 -0
- package/dist/guest/entries/tool.js +17 -0
- package/dist/guest/toolchains/engines/godot.d.ts +4 -0
- package/dist/guest/toolchains/engines/godot.js +4 -0
- package/dist/guest/toolchains/engines/unity-release.d.ts +15 -0
- package/dist/guest/toolchains/engines/unity-release.js +6 -0
- package/dist/guest/toolchains/engines/unity.d.ts +4 -0
- package/dist/guest/toolchains/engines/unity.js +4 -0
- package/dist/guest/toolchains/engines/unreal-engines.d.ts +4 -0
- package/dist/guest/toolchains/engines/unreal-engines.js +4 -0
- package/dist/guest/toolchains/fivem/artifacts.d.ts +6 -0
- package/dist/guest/toolchains/fivem/artifacts.js +7 -0
- package/dist/guest/toolchains/fivem/fivem.d.ts +4 -0
- package/dist/guest/toolchains/fivem/fivem.js +4 -0
- package/dist/guest/toolchains/installers.d.ts +12 -0
- package/dist/guest/toolchains/installers.js +39 -0
- package/dist/guest/toolchains/languages/java.js +1 -1
- package/dist/guest/toolchains/languages/kotlin.d.ts +3 -0
- package/dist/guest/toolchains/languages/kotlin.js +6 -0
- package/dist/guest/toolchains/mobile/android-repo.d.ts +11 -0
- package/dist/guest/toolchains/mobile/android-repo.js +10 -0
- package/dist/guest/toolchains/mobile/android.d.ts +17 -0
- package/dist/guest/toolchains/mobile/android.js +16 -0
- package/dist/guest/toolchains/mobile/dart.d.ts +4 -0
- package/dist/guest/toolchains/mobile/dart.js +4 -0
- package/dist/guest/toolchains/mobile/flutter.d.ts +4 -0
- package/dist/guest/toolchains/mobile/flutter.js +4 -0
- package/dist/guest/toolchains/mobile/react-native.d.ts +4 -0
- package/dist/guest/toolchains/mobile/react-native.js +4 -0
- package/dist/guest/toolchains/native/unreal.d.ts +3 -7
- package/dist/guest/toolchains/native/unreal.js +16 -167
- package/dist/guest/toolchains/native/visual-studio.d.ts +15 -0
- package/dist/guest/toolchains/native/visual-studio.js +159 -0
- package/dist/guest/toolchains/native/vs-request.d.ts +19 -0
- package/dist/guest/toolchains/native/vs-request.js +46 -0
- package/dist/guest/toolchains/not-yet.d.ts +2 -0
- package/dist/guest/toolchains/not-yet.js +6 -0
- package/dist/guest/toolchains/persisted.d.ts +48 -0
- package/dist/guest/toolchains/persisted.js +159 -0
- package/dist/guest/toolchains/plan.js +80 -4
- package/dist/guest/toolchains/steam/apps.d.ts +27 -0
- package/dist/guest/toolchains/steam/apps.js +112 -0
- package/dist/guest/toolchains/steam/client.d.ts +5 -0
- package/dist/guest/toolchains/steam/client.js +67 -0
- package/dist/guest/toolchains/steam/commands.d.ts +58 -0
- package/dist/guest/toolchains/steam/commands.js +155 -0
- package/dist/guest/toolchains/steam/steam.d.ts +4 -0
- package/dist/guest/toolchains/steam/steam.js +61 -0
- package/dist/guest/toolchains/steam/steamcmd-install.d.ts +29 -0
- package/dist/guest/toolchains/steam/steamcmd-install.js +177 -0
- package/dist/guest/toolchains/steam/steamcmd.d.ts +6 -0
- package/dist/guest/toolchains/steam/steamcmd.js +23 -0
- package/dist/guest/toolchains/step.d.ts +10 -0
- package/dist/host/accounts/deliver.d.ts +26 -0
- package/dist/host/accounts/deliver.js +80 -0
- package/dist/host/accounts/handoff.d.ts +17 -0
- package/dist/host/accounts/handoff.js +110 -0
- package/dist/host/accounts/index.d.ts +6 -0
- package/dist/host/accounts/index.js +8 -0
- package/dist/host/accounts/kinds/appstore.d.ts +2 -0
- package/dist/host/accounts/kinds/appstore.js +10 -0
- package/dist/host/accounts/kinds/cfx.d.ts +2 -0
- package/dist/host/accounts/kinds/cfx.js +7 -0
- package/dist/host/accounts/kinds/epic.d.ts +2 -0
- package/dist/host/accounts/kinds/epic.js +15 -0
- package/dist/host/accounts/kinds/expo.d.ts +2 -0
- package/dist/host/accounts/kinds/expo.js +7 -0
- package/dist/host/accounts/kinds/keystore.d.ts +2 -0
- package/dist/host/accounts/kinds/keystore.js +7 -0
- package/dist/host/accounts/kinds/play.d.ts +2 -0
- package/dist/host/accounts/kinds/play.js +7 -0
- package/dist/host/accounts/kinds/steam.d.ts +6 -0
- package/dist/host/accounts/kinds/steam.js +31 -0
- package/dist/host/accounts/kinds/unity.d.ts +2 -0
- package/dist/host/accounts/kinds/unity.js +13 -0
- package/dist/host/accounts/leases.d.ts +40 -0
- package/dist/host/accounts/leases.js +62 -0
- package/dist/host/accounts/source.d.ts +21 -0
- package/dist/host/accounts/source.js +15 -0
- package/dist/host/accounts/sources.d.ts +5 -0
- package/dist/host/accounts/sources.js +18 -0
- package/dist/host/accounts/store.d.ts +23 -0
- package/dist/host/accounts/store.js +74 -0
- package/dist/host/audit/log.d.ts +1 -1
- package/dist/host/launch/generate.d.ts +2 -0
- package/dist/host/launch/generate.js +16 -1
- package/dist/host/launch/hints/android.d.ts +3 -0
- package/dist/host/launch/hints/android.js +3 -0
- package/dist/host/launch/hints/engines.d.ts +3 -0
- package/dist/host/launch/hints/engines.js +3 -0
- package/dist/host/launch/hints/fivem.d.ts +3 -0
- package/dist/host/launch/hints/fivem.js +3 -0
- package/dist/host/launch/hints/hint.d.ts +2 -0
- package/dist/host/launch/hints/hint.js +1 -0
- package/dist/host/launch/hints/index.d.ts +5 -0
- package/dist/host/launch/hints/index.js +29 -0
- package/dist/host/launch/hints/mobile.d.ts +3 -0
- package/dist/host/launch/hints/mobile.js +3 -0
- package/dist/host/launch/hints/steam.d.ts +7 -0
- package/dist/host/launch/hints/steam.js +59 -0
- package/dist/host/launch/index.d.ts +2 -2
- package/dist/host/launch/index.js +2 -2
- package/dist/host/launch/mappings.js +2 -0
- package/dist/host/launch/session-file.js +2 -0
- package/dist/host/launch/stage.js +10 -1
- package/dist/host/launch/toolchains.d.ts +7 -0
- package/dist/host/launch/toolchains.js +11 -0
- package/dist/host/pc-installs/discover.d.ts +19 -0
- package/dist/host/pc-installs/discover.js +59 -0
- package/dist/host/pc-installs/epic.d.ts +2 -0
- package/dist/host/pc-installs/epic.js +7 -0
- package/dist/host/pc-installs/index.d.ts +3 -0
- package/dist/host/pc-installs/index.js +2 -0
- package/dist/host/pc-installs/source.d.ts +9 -0
- package/dist/host/pc-installs/source.js +1 -0
- package/dist/host/pc-installs/steam.d.ts +16 -0
- package/dist/host/pc-installs/steam.js +143 -0
- package/dist/host/pc-installs/unity.d.ts +2 -0
- package/dist/host/pc-installs/unity.js +7 -0
- package/dist/host/pc-installs/unreal.d.ts +2 -0
- package/dist/host/pc-installs/unreal.js +7 -0
- package/dist/host/profile/accounts.d.ts +21 -6
- package/dist/host/profile/accounts.js +108 -28
- package/dist/host/profile/claude-login.d.ts +32 -2
- package/dist/host/profile/claude-login.js +101 -8
- package/dist/host/profile/index.d.ts +1 -1
- package/dist/host/profile/index.js +1 -1
- package/dist/host/secrets/launch-secrets.js +1 -0
- package/dist/runtime/agent.js +321 -9
- package/dist/runtime/daemon.js +1987 -604
- package/dist/runtime/db.js +334 -11
- package/dist/runtime/main.js +2519 -723
- package/dist/runtime/netproxy.js +321 -9
- package/dist/runtime/tool.js +28549 -0
- package/dist/runtime/view.js +321 -9
- package/dist/selftest/accounts.test.js +172 -1
- package/dist/selftest/agent-paths.test.js +1 -0
- package/dist/selftest/android.test.d.ts +2 -0
- package/dist/selftest/android.test.js +7 -0
- package/dist/selftest/app.test.js +1 -1
- package/dist/selftest/engines.test.d.ts +2 -0
- package/dist/selftest/engines.test.js +7 -0
- package/dist/selftest/fivem.test.d.ts +2 -0
- package/dist/selftest/fivem.test.js +7 -0
- package/dist/selftest/generate.test.js +1 -1
- package/dist/selftest/index.js +18 -0
- package/dist/selftest/menu-screens.js +1 -0
- package/dist/selftest/menu.test.js +2 -1
- package/dist/selftest/mobile.test.d.ts +2 -0
- package/dist/selftest/mobile.test.js +7 -0
- package/dist/selftest/pc-installs.test.d.ts +2 -0
- package/dist/selftest/pc-installs.test.js +111 -0
- package/dist/selftest/persisted-installs.test.d.ts +2 -0
- package/dist/selftest/persisted-installs.test.js +107 -0
- package/dist/selftest/projects.test.js +6 -4
- package/dist/selftest/service-accounts.test.d.ts +2 -0
- package/dist/selftest/service-accounts.test.js +320 -0
- package/dist/selftest/steam.test.d.ts +2 -0
- package/dist/selftest/steam.test.js +316 -0
- package/dist/selftest/storage-helper.test.js +31 -8
- package/dist/selftest/support/engine-golden.js +3 -0
- package/dist/selftest/support/fixtures.d.ts +87 -0
- package/dist/selftest/support/fixtures.js +4 -3
- package/dist/selftest/support/pc-memory.d.ts +2 -0
- package/dist/selftest/support/pc-memory.js +17 -0
- package/dist/selftest/support/web-preview.js +20 -1
- package/dist/selftest/unity.test.d.ts +2 -0
- package/dist/selftest/unity.test.js +7 -0
- package/dist/shared/accounts/fingerprint.d.ts +1 -0
- package/dist/shared/accounts/fingerprint.js +20 -0
- package/dist/shared/accounts/index.d.ts +5 -0
- package/dist/shared/accounts/index.js +7 -0
- package/dist/shared/accounts/kinds/epic.d.ts +10 -0
- package/dist/shared/accounts/kinds/epic.js +56 -0
- package/dist/shared/accounts/kinds/steam.d.ts +28 -0
- package/dist/shared/accounts/kinds/steam.js +99 -0
- package/dist/shared/accounts/kinds.d.ts +41 -0
- package/dist/shared/accounts/kinds.js +154 -0
- package/dist/shared/accounts/payloads.d.ts +151 -0
- package/dist/shared/accounts/payloads.js +128 -0
- package/dist/shared/apps/catalogue-gamedev.d.ts +2 -0
- package/dist/shared/apps/catalogue-gamedev.js +1 -0
- package/dist/shared/apps/catalogue-mobile.d.ts +2 -0
- package/dist/shared/apps/catalogue-mobile.js +1 -0
- package/dist/shared/apps/catalogue-modding.d.ts +2 -0
- package/dist/shared/apps/catalogue-modding.js +1 -0
- package/dist/shared/apps/catalogue.d.ts +1 -0
- package/dist/shared/apps/catalogue.js +6 -1
- package/dist/shared/channel/schema.d.ts +183 -0
- package/dist/shared/channel/secrets.d.ts +42 -0
- package/dist/shared/channel/secrets.js +3 -0
- package/dist/shared/download/downloader.d.ts +7 -0
- package/dist/shared/download/downloader.js +10 -3
- package/dist/shared/installs.d.ts +19 -0
- package/dist/shared/installs.js +13 -0
- package/dist/shared/io/bounded.d.ts +6 -0
- package/dist/shared/io/bounded.js +38 -0
- package/dist/shared/io/index.d.ts +2 -0
- package/dist/shared/io/index.js +2 -0
- package/dist/shared/io/text.d.ts +9 -0
- package/dist/shared/io/text.js +18 -0
- package/dist/shared/paths/guest-paths.js +1 -1
- package/dist/shared/paths/index.d.ts +1 -0
- package/dist/shared/paths/index.js +1 -0
- package/dist/shared/paths/pc-installs.d.ts +20 -0
- package/dist/shared/paths/pc-installs.js +19 -0
- package/dist/shared/vdf.d.ts +25 -0
- package/dist/shared/vdf.js +151 -0
- package/dist/sync/sync-cycle.js +9 -0
- package/dist/web/index.html +1 -1
- package/dist/web/{main-JTH3FT4O.js → main-CWIF4VQI.js} +63 -61
- package/native/csharp/HcsHost/AssemblyInfo.cs +3 -3
- package/native/csharp/HostTools/AssemblyInfo.cs +3 -3
- package/native/csharp/StorageHelper/AssemblyInfo.cs +3 -3
- package/package.json +1 -1
- package/sandbox/scripts/add-firewall-port.ps1 +13 -0
- package/sandbox/templates/fivem/README.txt +2 -0
- package/schemas/config.schema.json +485 -0
- package/schemas/sandbox-config.schema.json +416 -0
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
// sbx-steam: log in to SteamCMD, download apps and workshop items, upload builds and workshop items, list games, start
|
|
2
|
+
// the Steam client. SteamCMD runs from C:\SteamCMD (set up at boot); it asks for the password and the Steam Guard code
|
|
3
|
+
// itself, and keeps only its login token (never the password or a Steam Guard secret).
|
|
4
|
+
import fs from 'node:fs';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import { spawn } from 'node:child_process';
|
|
7
|
+
import { readSteamAccountFile, steamAccounts, steamConfigFile, STEAM_ACCOUNT_FILE, } from '../../shared/accounts/kinds/steam.js';
|
|
8
|
+
import { spawnAsync } from '../../shared/download/index.js';
|
|
9
|
+
import { readBoundedFile } from '../../shared/io/bounded.js';
|
|
10
|
+
import { session } from '../runtime/session.js';
|
|
11
|
+
import { errMsg } from '../../core/util/errors.js';
|
|
12
|
+
import { appBuildArgs, appUpdateArgs, checkAppId, loginArgs, readScript, scriptKind, steamAppDir, STEAMCMD_DIR, steamClientDir, workshopCache, workshopGetArgs, workshopItemDir, workshopPushArgs, withBuildSettings, } from '../toolchains/steam/commands.js';
|
|
13
|
+
import { assertAppRoom, DEFAULT_APP_NEED_BYTES, folderSize, installedApps, recordApp, } from '../toolchains/steam/apps.js';
|
|
14
|
+
const GB = 1024 ** 3;
|
|
15
|
+
const USAGE = [
|
|
16
|
+
'Usage: sbx-steam <command>',
|
|
17
|
+
' login <account> sign in to SteamCMD (it asks for the password and Steam Guard code)',
|
|
18
|
+
' app <appid> [--beta <branch>] [--dir <folder>] [--validate] [--anonymous] [--need-gb <n>]',
|
|
19
|
+
' download or update a game or dedicated server (tools\\steam-apps\\<appid>)',
|
|
20
|
+
' workshop get <appid> <item>... [--validate] [--anonymous]',
|
|
21
|
+
' download workshop items (cache\\steam-workshop on the data disk)',
|
|
22
|
+
' workshop push <workshop_item.vdf> upload a workshop item',
|
|
23
|
+
' build <app_build.vdf> [--preview] [--desc <text>]',
|
|
24
|
+
' upload a build with ContentBuilder (--preview: check it, upload nothing)',
|
|
25
|
+
" games what is downloaded here and this PC's games mapped read-only",
|
|
26
|
+
' client start the Steam client (toolchains.steam.client)',
|
|
27
|
+
'Options: --user <account> uses another signed-in account.',
|
|
28
|
+
].join('\n');
|
|
29
|
+
const VALUE_FLAGS = new Set(['--beta', '--dir', '--user', '--need-gb', '--desc']);
|
|
30
|
+
const BOOLEAN_FLAGS = new Set(['--validate', '--anonymous', '--preview']);
|
|
31
|
+
function parse(args) {
|
|
32
|
+
const words = [];
|
|
33
|
+
const values = new Map();
|
|
34
|
+
const flags = new Set();
|
|
35
|
+
for (let i = 0; i < args.length; i++) {
|
|
36
|
+
const a = args[i];
|
|
37
|
+
if (VALUE_FLAGS.has(a)) {
|
|
38
|
+
const v = args[++i];
|
|
39
|
+
if (v === undefined)
|
|
40
|
+
throw new Error(a + ' needs a value');
|
|
41
|
+
values.set(a, v);
|
|
42
|
+
}
|
|
43
|
+
else if (BOOLEAN_FLAGS.has(a))
|
|
44
|
+
flags.add(a);
|
|
45
|
+
else if (a.startsWith('--'))
|
|
46
|
+
throw new Error('unknown option ' + a);
|
|
47
|
+
else
|
|
48
|
+
words.push(a);
|
|
49
|
+
}
|
|
50
|
+
return { words, values, flags };
|
|
51
|
+
}
|
|
52
|
+
const steamcmd = () => path.join(STEAMCMD_DIR, 'steamcmd.exe');
|
|
53
|
+
function requireSteamCmd() {
|
|
54
|
+
if (!fs.existsSync(steamcmd()))
|
|
55
|
+
throw new Error('SteamCMD is not set up in this sandbox (toolchains.steam: see the boot log for why)');
|
|
56
|
+
return steamcmd();
|
|
57
|
+
}
|
|
58
|
+
/** The account SteamCMD has a login for here, or null. */
|
|
59
|
+
function knownAccount() {
|
|
60
|
+
const fromFile = readSteamAccountFile(STEAMCMD_DIR);
|
|
61
|
+
if (fromFile)
|
|
62
|
+
return fromFile;
|
|
63
|
+
const bytes = readBoundedFile(steamConfigFile(STEAMCMD_DIR), 256 * 1024);
|
|
64
|
+
return bytes ? (steamAccounts(bytes.toString('utf8'))[0] ?? null) : null;
|
|
65
|
+
}
|
|
66
|
+
function account(p, anonymousOk) {
|
|
67
|
+
if (p.flags.has('--anonymous'))
|
|
68
|
+
return 'anonymous';
|
|
69
|
+
const name = p.values.get('--user') ?? knownAccount();
|
|
70
|
+
if (name)
|
|
71
|
+
return name;
|
|
72
|
+
if (anonymousOk) {
|
|
73
|
+
console.log('Not signed in: using anonymous (enough for dedicated servers and free tools).');
|
|
74
|
+
return 'anonymous';
|
|
75
|
+
}
|
|
76
|
+
throw new Error('not signed in: run sbx-steam login <account> first');
|
|
77
|
+
}
|
|
78
|
+
/** Runs SteamCMD in the terminal (it asks there when it needs to); its exit code. */
|
|
79
|
+
async function steamCmd(args) {
|
|
80
|
+
return spawnAsync(requireSteamCmd(), args, { cwd: STEAMCMD_DIR, stdio: 'inherit', windowsHide: false });
|
|
81
|
+
}
|
|
82
|
+
const gb = (bytes) => (bytes === null ? 'size unknown' : (bytes / GB).toFixed(2) + ' GB');
|
|
83
|
+
async function login(p) {
|
|
84
|
+
const name = p.words[1] ?? p.values.get('--user');
|
|
85
|
+
if (!name)
|
|
86
|
+
throw new Error('Usage: sbx-steam login <account name>');
|
|
87
|
+
const code = await steamCmd(loginArgs(name));
|
|
88
|
+
if (code !== 0)
|
|
89
|
+
return code;
|
|
90
|
+
fs.mkdirSync(path.join(STEAMCMD_DIR, 'config'), { recursive: true });
|
|
91
|
+
fs.writeFileSync(path.join(STEAMCMD_DIR, 'config', STEAM_ACCOUNT_FILE), name, 'utf8');
|
|
92
|
+
console.log('Signed in as ' +
|
|
93
|
+
name +
|
|
94
|
+
'. SteamCMD keeps the login in C:\\SteamCMD\\config (this sandbox only). With accounts.steam.share on, the PC keeps it, encrypted, for the next sandboxes; no password is kept.');
|
|
95
|
+
return 0;
|
|
96
|
+
}
|
|
97
|
+
async function app(p) {
|
|
98
|
+
const appId = checkAppId(p.words[1] ?? '');
|
|
99
|
+
const given = p.values.get('--dir');
|
|
100
|
+
const dir = given ? path.resolve(given) : steamAppDir(appId);
|
|
101
|
+
const needGb = Number(p.values.get('--need-gb') ?? DEFAULT_APP_NEED_BYTES / GB);
|
|
102
|
+
if (!Number.isFinite(needGb) || needGb < 0 || needGb > 10_000)
|
|
103
|
+
throw new Error('--need-gb takes a number of GB');
|
|
104
|
+
assertAppRoom(dir, needGb * GB, 'app ' + appId);
|
|
105
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
106
|
+
const beta = p.values.get('--beta');
|
|
107
|
+
const code = await steamCmd(appUpdateArgs({
|
|
108
|
+
appId,
|
|
109
|
+
dir,
|
|
110
|
+
login: account(p, true),
|
|
111
|
+
...(beta ? { beta } : {}),
|
|
112
|
+
validate: p.flags.has('--validate'),
|
|
113
|
+
}));
|
|
114
|
+
const size = folderSize(dir);
|
|
115
|
+
if (!given)
|
|
116
|
+
recordApp(appId, size);
|
|
117
|
+
console.log('App ' + appId + ' is in ' + dir + ' (' + gb(size) + ').');
|
|
118
|
+
return code;
|
|
119
|
+
}
|
|
120
|
+
async function workshop(p) {
|
|
121
|
+
const verb = p.words[1];
|
|
122
|
+
if (verb === 'get') {
|
|
123
|
+
const appId = checkAppId(p.words[2] ?? '');
|
|
124
|
+
const items = p.words.slice(3);
|
|
125
|
+
const cache = workshopCache();
|
|
126
|
+
assertAppRoom(cache, GB, 'workshop items');
|
|
127
|
+
fs.mkdirSync(cache, { recursive: true });
|
|
128
|
+
const code = await steamCmd(workshopGetArgs({ appId, items, dir: cache, login: account(p, true), validate: p.flags.has('--validate') }));
|
|
129
|
+
for (const item of items) {
|
|
130
|
+
const dir = workshopItemDir(cache, appId, item);
|
|
131
|
+
console.log(item + ': ' + (fs.existsSync(dir) ? dir : 'not downloaded'));
|
|
132
|
+
}
|
|
133
|
+
return code;
|
|
134
|
+
}
|
|
135
|
+
if (verb === 'push') {
|
|
136
|
+
const script = path.resolve(p.words[2] ?? '');
|
|
137
|
+
if (scriptKind(readScript(script)) !== 'workshopitem')
|
|
138
|
+
throw new Error(script + ' is not a workshop_item script (its first block is not "workshopitem")');
|
|
139
|
+
return steamCmd(workshopPushArgs(account(p, false), script));
|
|
140
|
+
}
|
|
141
|
+
throw new Error('Usage: sbx-steam workshop get <appid> <item>... | workshop push <workshop_item.vdf>');
|
|
142
|
+
}
|
|
143
|
+
async function build(p) {
|
|
144
|
+
const script = path.resolve(p.words[1] ?? '');
|
|
145
|
+
const text = readScript(script);
|
|
146
|
+
if (scriptKind(text) !== 'appbuild')
|
|
147
|
+
throw new Error(script + ' is not an app_build script (its first block is not "AppBuild")');
|
|
148
|
+
const login = account(p, false);
|
|
149
|
+
const desc = p.values.get('--desc');
|
|
150
|
+
if (!p.flags.has('--preview') && desc === undefined)
|
|
151
|
+
return steamCmd(appBuildArgs(login, script));
|
|
152
|
+
// A copy beside the script (its relative paths stay right) with Preview / Desc set; removed afterwards.
|
|
153
|
+
const changed = withBuildSettings(text, {
|
|
154
|
+
preview: p.flags.has('--preview'),
|
|
155
|
+
...(desc !== undefined ? { desc } : {}),
|
|
156
|
+
});
|
|
157
|
+
const copy = path.join(path.dirname(script), path.basename(script, '.vdf') + '.sbx-' + process.pid + '.vdf');
|
|
158
|
+
fs.writeFileSync(copy, changed ?? text, 'utf8');
|
|
159
|
+
try {
|
|
160
|
+
return await steamCmd(appBuildArgs(login, copy));
|
|
161
|
+
}
|
|
162
|
+
finally {
|
|
163
|
+
fs.rmSync(copy, { force: true });
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
function games() {
|
|
167
|
+
const apps = installedApps();
|
|
168
|
+
console.log(apps.length ? 'Downloaded here (tools\\steam-apps):' : 'Nothing downloaded with sbx-steam app yet.');
|
|
169
|
+
for (const a of apps)
|
|
170
|
+
console.log(' ' + a.appId + ' ' + a.name + ' ' + gb(a.sizeBytes) + ' ' + a.dir);
|
|
171
|
+
const pc = (session.pcInstalls?.items ?? []).filter((i) => i.kind === 'steam-game' || i.kind === 'steam-library');
|
|
172
|
+
if (pc.length) {
|
|
173
|
+
console.log("This PC's, read-only (pcInstalls.steamGames):");
|
|
174
|
+
for (const i of pc)
|
|
175
|
+
console.log(' ' + i.id + ' ' + i.name + ' ' + i.guest);
|
|
176
|
+
console.log(' Steam cannot update or run a game from a read-only folder: sbx-steam app <appid> makes a copy here.');
|
|
177
|
+
}
|
|
178
|
+
return 0;
|
|
179
|
+
}
|
|
180
|
+
function client() {
|
|
181
|
+
if (!session.toolchains.steam.client) {
|
|
182
|
+
console.error('The Steam client is off: set toolchains.steam.client to true and restart the sandbox.');
|
|
183
|
+
return 1;
|
|
184
|
+
}
|
|
185
|
+
const exe = path.join(steamClientDir(), 'steam.exe');
|
|
186
|
+
if (!fs.existsSync(exe)) {
|
|
187
|
+
console.error('The Steam client is not set up (see the boot log).');
|
|
188
|
+
return 1;
|
|
189
|
+
}
|
|
190
|
+
spawn(exe, [], { cwd: steamClientDir(), detached: true, stdio: 'ignore' }).unref();
|
|
191
|
+
console.log('Starting the Steam client (it updates itself the first time). Sign in to it here: its sign-in is tied to this sandbox and does not carry over to the next one.');
|
|
192
|
+
return 0;
|
|
193
|
+
}
|
|
194
|
+
export const steamTool = {
|
|
195
|
+
name: 'steam',
|
|
196
|
+
summary: 'log in to SteamCMD, download apps and workshop items, upload builds and workshop items',
|
|
197
|
+
async run(args) {
|
|
198
|
+
let p;
|
|
199
|
+
try {
|
|
200
|
+
p = parse(args);
|
|
201
|
+
}
|
|
202
|
+
catch (e) {
|
|
203
|
+
console.error('sbx-steam: ' + errMsg(e) + '\n' + USAGE);
|
|
204
|
+
return 2;
|
|
205
|
+
}
|
|
206
|
+
switch (p.words[0]) {
|
|
207
|
+
case 'login':
|
|
208
|
+
return login(p);
|
|
209
|
+
case 'app':
|
|
210
|
+
return app(p);
|
|
211
|
+
case 'workshop':
|
|
212
|
+
return workshop(p);
|
|
213
|
+
case 'build':
|
|
214
|
+
return build(p);
|
|
215
|
+
case 'games':
|
|
216
|
+
return games();
|
|
217
|
+
case 'client':
|
|
218
|
+
return client();
|
|
219
|
+
case undefined:
|
|
220
|
+
case 'help':
|
|
221
|
+
console.log(USAGE);
|
|
222
|
+
return p.words[0] ? 0 : 2;
|
|
223
|
+
default:
|
|
224
|
+
console.error('sbx-steam: unknown command ' + p.words[0] + '\n' + USAGE);
|
|
225
|
+
return 2;
|
|
226
|
+
}
|
|
227
|
+
},
|
|
228
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// sbx-unity: install editors, list them, build with -executeMethod, the licence status. Not available yet.
|
|
2
|
+
import { notAvailableYet } from './devtool.js';
|
|
3
|
+
export const unityTool = {
|
|
4
|
+
name: 'unity',
|
|
5
|
+
summary: 'install editors, list them, build with -executeMethod, the licence status',
|
|
6
|
+
run: () => notAvailableYet('unity'),
|
|
7
|
+
};
|
|
@@ -12,6 +12,7 @@ import { Daemon } from '../daemon/daemon.js';
|
|
|
12
12
|
import { startLiveFolders } from '../daemon/live.js';
|
|
13
13
|
import { sessions } from '../daemon/sessions.js';
|
|
14
14
|
import { governor } from '../governor/index.js';
|
|
15
|
+
import { startAccountWatch } from '../daemon/accounts.js';
|
|
15
16
|
process.on('uncaughtException', (e) => warn('daemon: unexpected error (continuing): ' + (e.stack ?? errMsg(e))));
|
|
16
17
|
process.on('unhandledRejection', (e) => warn('daemon: unexpected error (continuing): ' + errMsg(e)));
|
|
17
18
|
const liveKey = adoptBootSecrets();
|
|
@@ -22,4 +23,5 @@ safely('audit', () => startProcessCollector(() => sessions.roots()));
|
|
|
22
23
|
safely('leftover processes', () => sessions.sweepLeftovers());
|
|
23
24
|
safely('memory governor', () => governor.start());
|
|
24
25
|
log('Memory governor: ' + governor.describe());
|
|
26
|
+
safely('service sign-ins', startAccountWatch);
|
|
25
27
|
new Daemon().start();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// The sbx-<name> helpers (sbx-steam, sbx-fivem, sbx-unity, sbx-android): `tool.js <name> <args...>` runs that helper.
|
|
2
|
+
import { errMsg } from '../../core/util/errors.js';
|
|
3
|
+
import { DEVTOOLS, devToolByName } from '../devtools/registry.js';
|
|
4
|
+
const [name, ...args] = process.argv.slice(2);
|
|
5
|
+
const tool = name ? devToolByName(name) : undefined;
|
|
6
|
+
if (!tool) {
|
|
7
|
+
console.error('Usage: sbx-<' + DEVTOOLS.map((t) => t.name).join('|') + '> <command> ...');
|
|
8
|
+
process.exitCode = 2;
|
|
9
|
+
}
|
|
10
|
+
else {
|
|
11
|
+
tool.run(args).then((code) => {
|
|
12
|
+
process.exitCode = code;
|
|
13
|
+
}, (e) => {
|
|
14
|
+
console.error('sbx-' + tool.name + ': ' + errMsg(e));
|
|
15
|
+
process.exitCode = 1;
|
|
16
|
+
});
|
|
17
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface UnityDownload {
|
|
2
|
+
/** "editor", or a module id (android, webgl, windows-il2cpp, ios). */
|
|
3
|
+
readonly id: string;
|
|
4
|
+
readonly url: string;
|
|
5
|
+
/** The SRI hash (sha384-... or sha256-...). */
|
|
6
|
+
readonly integrity: string | null;
|
|
7
|
+
readonly sizeBytes: number | null;
|
|
8
|
+
}
|
|
9
|
+
export interface UnityRelease {
|
|
10
|
+
readonly version: string;
|
|
11
|
+
readonly changeset: string | null;
|
|
12
|
+
readonly downloads: readonly UnityDownload[];
|
|
13
|
+
}
|
|
14
|
+
/** The release of one editor version (6000.0.32f1), or null when Unity does not list it. */
|
|
15
|
+
export declare function findUnityRelease(_version: string): Promise<UnityRelease | null>;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// Unity's release API (services.api.unity.com/unity/editor/release/v1/releases): the editor installer and module
|
|
2
|
+
// downloads of one version, each with its SRI integrity hash. Not available yet.
|
|
3
|
+
/** The release of one editor version (6000.0.32f1), or null when Unity does not list it. */
|
|
4
|
+
export async function findUnityRelease(_version) {
|
|
5
|
+
return null;
|
|
6
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// FXServer builds (the Cfx.re artifacts): which build "recommended", "optional", "latest" or a number means, from
|
|
2
|
+
// changelogs-live.fivem.net/api/changelog/versions/win32/server. No checksums are published: the download is refused
|
|
3
|
+
// under downloads.requireChecksum unless FXServer.exe is signed. Not available yet.
|
|
4
|
+
/** The build an artifact setting names, or null when it cannot be told. */
|
|
5
|
+
export async function pickArtifact(_setting) {
|
|
6
|
+
return null;
|
|
7
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Who signs the installers the toolchains run (the subject of the signature). */
|
|
2
|
+
export declare const SIGNERS: {
|
|
3
|
+
readonly microsoft: "CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US";
|
|
4
|
+
readonly valve: RegExp;
|
|
5
|
+
readonly unity: RegExp;
|
|
6
|
+
};
|
|
7
|
+
/** Whether a file's signature is the expected signer's. */
|
|
8
|
+
export declare function signedBy(file: string, signer: string | RegExp): boolean;
|
|
9
|
+
/** A downloader `verify` hook: refuses a file not signed by `signer` (it counts as integrity for requireChecksum). */
|
|
10
|
+
export declare function signatureCheck(signer: string | RegExp, what: string): (file: string) => void;
|
|
11
|
+
/** The installer at `file` (downloaded once from `url`), checked against its signer and, when given, its SHA-256. */
|
|
12
|
+
export declare function signedInstaller(url: string, file: string, what: string, signer: string | RegExp, sha256?: string | null): Promise<string>;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// Real installers and signed downloads: a vendor's installer is kept in tools\ (downloaded once) and run only when its
|
|
2
|
+
// Authenticode signature names the vendor; a file with a bad signature is deleted, and fetched again next boot.
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { downloader } from '../../shared/download/index.js';
|
|
6
|
+
import { exists, mkdirp } from '../runtime/fs.js';
|
|
7
|
+
import { log } from '../runtime/log.js';
|
|
8
|
+
import { MICROSOFT_SIGNER, signerOf } from './native/vcruntime.js';
|
|
9
|
+
/** Who signs the installers the toolchains run (the subject of the signature). */
|
|
10
|
+
export const SIGNERS = {
|
|
11
|
+
microsoft: MICROSOFT_SIGNER,
|
|
12
|
+
valve: /^CN="?Valve(,| Corp)/,
|
|
13
|
+
unity: /^CN="?Unity Technologies/,
|
|
14
|
+
};
|
|
15
|
+
/** Whether a file's signature is the expected signer's. */
|
|
16
|
+
export function signedBy(file, signer) {
|
|
17
|
+
const subject = signerOf(file);
|
|
18
|
+
return typeof signer === 'string' ? subject === signer : signer.test(subject);
|
|
19
|
+
}
|
|
20
|
+
/** A downloader `verify` hook: refuses a file not signed by `signer` (it counts as integrity for requireChecksum). */
|
|
21
|
+
export function signatureCheck(signer, what) {
|
|
22
|
+
return (file) => {
|
|
23
|
+
if (!signedBy(file, signer))
|
|
24
|
+
throw new Error(what + ' is not signed by its vendor');
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/** The installer at `file` (downloaded once from `url`), checked against its signer and, when given, its SHA-256. */
|
|
28
|
+
export async function signedInstaller(url, file, what, signer, sha256 = null) {
|
|
29
|
+
if (!exists(file)) {
|
|
30
|
+
log('Downloading ' + what + ' ...');
|
|
31
|
+
mkdirp(path.dirname(file));
|
|
32
|
+
await downloader.file(url, file, { sha256, verify: signatureCheck(signer, path.basename(file)) });
|
|
33
|
+
}
|
|
34
|
+
if (!signedBy(file, signer)) {
|
|
35
|
+
fs.rmSync(file, { force: true });
|
|
36
|
+
throw new Error(path.basename(file) + ' is not signed by its vendor; deleted it (it is downloaded again next boot)');
|
|
37
|
+
}
|
|
38
|
+
return file;
|
|
39
|
+
}
|
|
@@ -65,7 +65,7 @@ export async function ensureJdk() {
|
|
|
65
65
|
if (installed.length)
|
|
66
66
|
return path.join(root, installed[0]);
|
|
67
67
|
const scratch = emptyEnv();
|
|
68
|
-
await setupJdk(scratch, { enabled: true, version: 'lts', maven: false, gradle: false });
|
|
68
|
+
await setupJdk(scratch, { enabled: true, version: 'lts', maven: false, gradle: false, kotlin: false });
|
|
69
69
|
return scratch.vars.JAVA_HOME;
|
|
70
70
|
}
|
|
71
71
|
const setupMaven = async (env) => {
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// Kotlin (toolchains.java.kotlin): kotlinc from JetBrains' releases (checked against its digest) in tools\kotlin, on
|
|
2
|
+
// PATH. Gradle builds fetch their own Kotlin. Not available yet.
|
|
3
|
+
import { notAvailableYet } from '../not-yet.js';
|
|
4
|
+
export async function setupKotlin(env, _ctx) {
|
|
5
|
+
notAvailableYet(env, 'Kotlin');
|
|
6
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface RepoPackage {
|
|
2
|
+
/** The sdkmanager path: platforms;android-35, build-tools;35.0.0 ... */
|
|
3
|
+
readonly path: string;
|
|
4
|
+
readonly url: string;
|
|
5
|
+
readonly sha1: string;
|
|
6
|
+
readonly sizeBytes: number;
|
|
7
|
+
}
|
|
8
|
+
/** The packages of a repository XML text (bounded); none when it cannot be read. */
|
|
9
|
+
export declare function parseRepository(_xml: string): RepoPackage[];
|
|
10
|
+
/** Why a package is refused, or null when it may be installed. */
|
|
11
|
+
export declare function refusedPackage(path: string): string | null;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// The Android SDK repository (repository2-3.xml): each package's archive for Windows with its SHA-1, and the packages
|
|
2
|
+
// the sandbox refuses (the emulator and system images: Windows Sandbox cannot run them). Not available yet.
|
|
3
|
+
/** The packages of a repository XML text (bounded); none when it cannot be read. */
|
|
4
|
+
export function parseRepository(_xml) {
|
|
5
|
+
return [];
|
|
6
|
+
}
|
|
7
|
+
/** Why a package is refused, or null when it may be installed. */
|
|
8
|
+
export function refusedPackage(path) {
|
|
9
|
+
return /^(emulator|system-images;)/.test(path) ? 'Windows Sandbox cannot run the Android emulator' : null;
|
|
10
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Toolchains } from '../../../core/types.js';
|
|
2
|
+
import type { ToolCtx } from '../step.js';
|
|
3
|
+
import type { ToolEnv } from '../tool-env.js';
|
|
4
|
+
export interface AndroidSdkRequest {
|
|
5
|
+
readonly packages: readonly string[];
|
|
6
|
+
readonly ndk?: string | 'auto' | false;
|
|
7
|
+
}
|
|
8
|
+
export interface AndroidSdk {
|
|
9
|
+
readonly root: string;
|
|
10
|
+
readonly javaHome: string | null;
|
|
11
|
+
readonly installed: readonly string[];
|
|
12
|
+
}
|
|
13
|
+
/** The SDK with these packages installed. */
|
|
14
|
+
export declare function ensureAndroidSdk(_env: ToolEnv, _req: AndroidSdkRequest): Promise<AndroidSdk>;
|
|
15
|
+
/** The variables builds need to find the SDK and its JDK. */
|
|
16
|
+
export declare function androidEnv(sdk: AndroidSdk): Record<string, string>;
|
|
17
|
+
export declare function setupAndroid(env: ToolEnv, _config: Toolchains['android'], _ctx: ToolCtx): Promise<void>;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { notAvailableYet } from '../not-yet.js';
|
|
2
|
+
/** The SDK with these packages installed. */
|
|
3
|
+
export async function ensureAndroidSdk(_env, _req) {
|
|
4
|
+
throw new Error('the Android SDK is not available yet');
|
|
5
|
+
}
|
|
6
|
+
/** The variables builds need to find the SDK and its JDK. */
|
|
7
|
+
export function androidEnv(sdk) {
|
|
8
|
+
return {
|
|
9
|
+
ANDROID_HOME: sdk.root,
|
|
10
|
+
ANDROID_SDK_ROOT: sdk.root,
|
|
11
|
+
...(sdk.javaHome ? { JAVA_HOME: sdk.javaHome } : {}),
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export async function setupAndroid(env, _config, _ctx) {
|
|
15
|
+
notAvailableYet(env, 'Android SDK');
|
|
16
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Toolchains } from '../../../core/types.js';
|
|
2
|
+
import type { ToolCtx } from '../step.js';
|
|
3
|
+
import type { ToolEnv } from '../tool-env.js';
|
|
4
|
+
export declare function setupReactNative(env: ToolEnv, _config: Toolchains['reactNative'], _ctx: ToolCtx): Promise<void>;
|
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
import type { Toolchains } from '../../../core/types.js';
|
|
2
|
+
import type { ToolCtx } from '../step.js';
|
|
2
3
|
import { type ToolEnv } from '../tool-env.js';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
* 10.0.18362 or newer, the C++ profiling tools, the .NET Framework targeting packs some engine tools build against,
|
|
6
|
-
* Visual Studio's Unreal support and the Unreal Engine installer (the Epic Games Launcher).
|
|
7
|
-
*/
|
|
8
|
-
export declare const UNREAL_COMPONENTS: readonly ["Microsoft.VisualStudio.Workload.NativeGame", "Microsoft.VisualStudio.Component.VC.Tools.x86.x64", "Microsoft.VisualStudio.Component.Windows11SDK.22621", "Microsoft.VisualStudio.Component.VC.DiagnosticTools", "Microsoft.Net.Component.4.6.2.TargetingPack", "Microsoft.Net.Component.4.8.SDK", "Component.Unreal.Ide", "Component.Unreal"];
|
|
9
|
-
export declare function setupUnreal(env: ToolEnv, config: Toolchains['unreal']): Promise<void>;
|
|
4
|
+
export { UNREAL_COMPONENTS } from './vs-request.js';
|
|
5
|
+
export declare function setupUnreal(env: ToolEnv, config: Toolchains['unreal'], ctx: ToolCtx): Promise<void>;
|