windows-development-sandbox 1.25.0 → 1.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (287) hide show
  1. package/config.example.json +17 -5
  2. package/dist/app/features/accounts/services.def.d.ts +1 -1
  3. package/dist/app/features/accounts/services.def.js +1 -1
  4. package/dist/app/features/data/data.def.d.ts +4 -4
  5. package/dist/app/features/data/data.run.d.ts +1 -1
  6. package/dist/app/features/defs.d.ts +356 -6
  7. package/dist/app/features/defs.js +15 -0
  8. package/dist/app/features/projects/projects.def.d.ts +1 -1
  9. package/dist/app/features/projects/projects.run.d.ts +1 -1
  10. package/dist/app/features/settings/categories.def.js +1 -0
  11. package/dist/app/features/unity/index.d.ts +2 -0
  12. package/dist/app/features/unity/index.js +3 -0
  13. package/dist/app/features/unity/unity.def.d.ts +294 -0
  14. package/dist/app/features/unity/unity.def.js +471 -0
  15. package/dist/app/features/unity/unity.run.d.ts +142 -0
  16. package/dist/app/features/unity/unity.run.js +363 -0
  17. package/dist/app/features/unreal/index.d.ts +2 -0
  18. package/dist/app/features/unreal/index.js +3 -0
  19. package/dist/app/features/unreal/unreal.def.d.ts +236 -0
  20. package/dist/app/features/unreal/unreal.def.js +379 -0
  21. package/dist/app/features/unreal/unreal.run.d.ts +96 -0
  22. package/dist/app/features/unreal/unreal.run.js +217 -0
  23. package/dist/app/registry.js +11 -0
  24. package/dist/bin/agent-sandbox.js +2 -2
  25. package/dist/bin/{chunk-IZRGTSQ5.js → chunk-6WWMBCT2.js} +4632 -1941
  26. package/dist/bin/{chunk-SUYYVIDW.js → chunk-JXL6ZOO3.js} +126 -6
  27. package/dist/bin/{chunk-KH4MI2U5.js → chunk-ZXCAVVS4.js} +1 -1
  28. package/dist/bin/claude-host.js +2 -2
  29. package/dist/bin/claude-sbx.js +2 -2
  30. package/dist/bin/codex-sbx.js +2 -2
  31. package/dist/bin/gemini-sbx.js +2 -2
  32. package/dist/bin/sandbox.js +2 -2
  33. package/dist/bin/sbx-hide.js +2 -2
  34. package/dist/bin/sbx-show.js +2 -2
  35. package/dist/cli/commands/launch/launch.js +17 -2
  36. package/dist/cli/commands/registry.js +6 -0
  37. package/dist/cli/manifest.d.ts +51 -1
  38. package/dist/cli/manifest.js +58 -1
  39. package/dist/cli/menu/coverage-exempt.js +2 -0
  40. package/dist/cli/menu/pages/sandbox-page.d.ts +6 -0
  41. package/dist/cli/menu/pages/sandbox-page.js +71 -4
  42. package/dist/cli/menu/views.js +4 -0
  43. package/dist/core/config/defaults.js +33 -6
  44. package/dist/core/schema/accounts.d.ts +3 -0
  45. package/dist/core/schema/accounts.js +1 -0
  46. package/dist/core/schema/config.d.ts +32 -14
  47. package/dist/core/schema/github.d.ts +1 -0
  48. package/dist/core/schema/github.js +3 -0
  49. package/dist/core/schema/pc-installs.d.ts +5 -2
  50. package/dist/core/schema/pc-installs.js +16 -2
  51. package/dist/core/schema/toolchains.d.ts +8 -0
  52. package/dist/core/schema/toolchains.js +20 -5
  53. package/dist/guest/accounts/adapters.js +2 -0
  54. package/dist/guest/accounts/apply.d.ts +4 -2
  55. package/dist/guest/accounts/kinds/epic.js +18 -13
  56. package/dist/guest/accounts/kinds/perplexityapp.d.ts +7 -0
  57. package/dist/guest/accounts/kinds/perplexityapp.js +53 -0
  58. package/dist/guest/accounts/kinds/unity.d.ts +27 -0
  59. package/dist/guest/accounts/kinds/unity.js +164 -7
  60. package/dist/guest/apps/after-install.d.ts +1 -1
  61. package/dist/guest/apps/after-install.js +6 -1
  62. package/dist/guest/apps/app-installer.d.ts +1 -0
  63. package/dist/guest/apps/app-installer.js +31 -3
  64. package/dist/guest/apps/comet-unpack.js +3 -2
  65. package/dist/guest/apps/resolvers-gamedev.js +55 -1
  66. package/dist/guest/apps/store-app.d.ts +4 -0
  67. package/dist/guest/apps/store-app.js +19 -0
  68. package/dist/guest/apps/store-check.d.ts +8 -0
  69. package/dist/guest/apps/store-check.js +33 -0
  70. package/dist/guest/boot/boot.js +15 -2
  71. package/dist/guest/boot/guide.js +42 -0
  72. package/dist/guest/browser/comet.d.ts +3 -1
  73. package/dist/guest/browser/comet.js +1 -1
  74. package/dist/guest/browser/perplexity-app.d.ts +12 -0
  75. package/dist/guest/browser/perplexity-app.js +60 -0
  76. package/dist/guest/daemon/daemon.js +5 -0
  77. package/dist/guest/devtools/devtool.d.ts +1 -1
  78. package/dist/guest/devtools/registry.js +1 -2
  79. package/dist/guest/entries/tool.js +1 -1
  80. package/dist/guest/setup/addon-mcp.d.ts +12 -0
  81. package/dist/guest/setup/addon-mcp.js +29 -4
  82. package/dist/guest/setup/browser-gpu.js +14 -11
  83. package/dist/guest/setup/github-token.js +4 -4
  84. package/dist/guest/setup/headroom.js +4 -0
  85. package/dist/guest/setup/unity-agent.d.ts +11 -0
  86. package/dist/guest/setup/unity-agent.js +36 -0
  87. package/dist/guest/toolchains/engines/epic-launcher.d.ts +26 -0
  88. package/dist/guest/toolchains/engines/epic-launcher.js +127 -0
  89. package/dist/guest/toolchains/engines/unity-cli.d.ts +24 -0
  90. package/dist/guest/toolchains/engines/unity-cli.js +74 -0
  91. package/dist/guest/toolchains/engines/unity-hub.d.ts +2 -0
  92. package/dist/guest/toolchains/engines/unity-hub.js +27 -0
  93. package/dist/guest/toolchains/engines/unity-release.d.ts +4 -15
  94. package/dist/guest/toolchains/engines/unity-release.js +17 -5
  95. package/dist/guest/toolchains/engines/unity-status.d.ts +11 -0
  96. package/dist/guest/toolchains/engines/unity-status.js +39 -0
  97. package/dist/guest/toolchains/engines/unity.d.ts +20 -1
  98. package/dist/guest/toolchains/engines/unity.js +250 -3
  99. package/dist/guest/toolchains/engines/unreal-engines.d.ts +21 -1
  100. package/dist/guest/toolchains/engines/unreal-engines.js +163 -3
  101. package/dist/guest/toolchains/engines/unreal-status.d.ts +13 -0
  102. package/dist/guest/toolchains/engines/unreal-status.js +41 -0
  103. package/dist/guest/toolchains/native/debuggers.d.ts +6 -0
  104. package/dist/guest/toolchains/native/debuggers.js +57 -0
  105. package/dist/guest/toolchains/native/mesa.js +15 -8
  106. package/dist/guest/toolchains/native/rust-extras.d.ts +7 -0
  107. package/dist/guest/toolchains/native/rust-extras.js +23 -1
  108. package/dist/guest/toolchains/native/unreal.d.ts +2 -2
  109. package/dist/guest/toolchains/native/unreal.js +96 -18
  110. package/dist/guest/toolchains/plan.js +17 -2
  111. package/dist/guest/toolchains/tools/cli.js +2 -2
  112. package/dist/guest/toolchains/tools/vscode-profile.js +2 -0
  113. package/dist/host/accounts/deliver.js +4 -0
  114. package/dist/host/accounts/kinds/epic.js +11 -5
  115. package/dist/host/accounts/kinds/perplexityapp.d.ts +2 -0
  116. package/dist/host/accounts/kinds/perplexityapp.js +8 -0
  117. package/dist/host/accounts/kinds/unity.d.ts +1 -1
  118. package/dist/host/accounts/kinds/unity.js +60 -8
  119. package/dist/host/accounts/leases.d.ts +2 -1
  120. package/dist/host/accounts/source.d.ts +2 -0
  121. package/dist/host/accounts/source.js +1 -0
  122. package/dist/host/accounts/sources.js +2 -0
  123. package/dist/host/apps/index.d.ts +1 -0
  124. package/dist/host/apps/index.js +2 -0
  125. package/dist/host/apps/store-package.d.ts +51 -0
  126. package/dist/host/apps/store-package.js +209 -0
  127. package/dist/host/github/deliver.d.ts +8 -3
  128. package/dist/host/github/deliver.js +42 -29
  129. package/dist/host/github/index.d.ts +1 -0
  130. package/dist/host/github/index.js +1 -0
  131. package/dist/host/github/pc-login.d.ts +27 -0
  132. package/dist/host/github/pc-login.js +129 -0
  133. package/dist/host/pc-installs/discover.d.ts +6 -0
  134. package/dist/host/pc-installs/discover.js +37 -5
  135. package/dist/host/pc-installs/epic.d.ts +3 -0
  136. package/dist/host/pc-installs/epic.js +33 -2
  137. package/dist/host/pc-installs/source.d.ts +1 -1
  138. package/dist/host/pc-installs/unity-assets.d.ts +5 -0
  139. package/dist/host/pc-installs/unity-assets.js +18 -0
  140. package/dist/host/pc-installs/unity.d.ts +20 -0
  141. package/dist/host/pc-installs/unity.js +135 -2
  142. package/dist/host/pc-installs/unreal-vault.d.ts +11 -0
  143. package/dist/host/pc-installs/unreal-vault.js +78 -0
  144. package/dist/host/pc-installs/unreal.d.ts +36 -0
  145. package/dist/host/pc-installs/unreal.js +145 -2
  146. package/dist/host/profile/claude-profile.d.ts +8 -0
  147. package/dist/host/profile/claude-profile.js +43 -4
  148. package/dist/host/profile/index.d.ts +1 -1
  149. package/dist/host/profile/index.js +1 -1
  150. package/dist/runtime/agent.js +197 -18
  151. package/dist/runtime/daemon.js +3938 -1386
  152. package/dist/runtime/db.js +197 -18
  153. package/dist/runtime/main.js +4336 -1978
  154. package/dist/runtime/netproxy.js +197 -18
  155. package/dist/runtime/tool.js +214 -38
  156. package/dist/runtime/view.js +197 -18
  157. package/dist/selftest/agent-paths.test.js +1 -0
  158. package/dist/selftest/agents-web.test.js +14 -1
  159. package/dist/selftest/engines.test.js +602 -3
  160. package/dist/selftest/github.test.js +64 -1
  161. package/dist/selftest/heavy-load.test.js +3 -1
  162. package/dist/selftest/hostile-input.test.js +11 -1
  163. package/dist/selftest/index.js +12 -0
  164. package/dist/selftest/menu-screens.js +5 -1
  165. package/dist/selftest/mixamo.test.d.ts +2 -0
  166. package/dist/selftest/mixamo.test.js +60 -0
  167. package/dist/selftest/persisted-installs.test.js +1 -1
  168. package/dist/selftest/secrets.test.js +36 -1
  169. package/dist/selftest/service-accounts.test.js +1 -1
  170. package/dist/selftest/store-app.test.d.ts +2 -0
  171. package/dist/selftest/store-app.test.js +162 -0
  172. package/dist/selftest/support/engine-golden.js +10 -0
  173. package/dist/selftest/support/fixtures.d.ts +13 -2
  174. package/dist/selftest/support/unity-sample.d.ts +2 -0
  175. package/dist/selftest/support/unity-sample.js +80 -0
  176. package/dist/selftest/support/unreal-sample.d.ts +2 -0
  177. package/dist/selftest/support/unreal-sample.js +83 -0
  178. package/dist/selftest/toolchains.test.js +32 -2
  179. package/dist/selftest/unity-accounts.test.d.ts +2 -0
  180. package/dist/selftest/unity-accounts.test.js +106 -0
  181. package/dist/selftest/unity-agent.test.d.ts +2 -0
  182. package/dist/selftest/unity-agent.test.js +47 -0
  183. package/dist/selftest/unity-page.test.d.ts +2 -0
  184. package/dist/selftest/unity-page.test.js +177 -0
  185. package/dist/selftest/unity-setup.test.d.ts +2 -0
  186. package/dist/selftest/unity-setup.test.js +49 -0
  187. package/dist/selftest/unity.test.js +238 -3
  188. package/dist/shared/accounts/index.d.ts +2 -1
  189. package/dist/shared/accounts/index.js +2 -1
  190. package/dist/shared/accounts/kinds/epic.d.ts +6 -1
  191. package/dist/shared/accounts/kinds/epic.js +11 -1
  192. package/dist/shared/accounts/kinds/unity.d.ts +28 -0
  193. package/dist/shared/accounts/kinds/unity.js +88 -0
  194. package/dist/shared/accounts/kinds.d.ts +2 -2
  195. package/dist/shared/accounts/kinds.js +23 -1
  196. package/dist/shared/accounts/payloads.d.ts +52 -0
  197. package/dist/shared/accounts/payloads.js +14 -2
  198. package/dist/shared/apps/associations.d.ts +7 -0
  199. package/dist/shared/apps/associations.js +26 -0
  200. package/dist/shared/apps/catalogue-agents-web.d.ts +11 -1
  201. package/dist/shared/apps/catalogue-agents-web.js +28 -2
  202. package/dist/shared/apps/catalogue-gamedev.d.ts +3 -0
  203. package/dist/shared/apps/catalogue-gamedev.js +102 -1
  204. package/dist/shared/apps/catalogue.d.ts +8 -0
  205. package/dist/shared/apps/index.d.ts +5 -2
  206. package/dist/shared/apps/index.js +5 -2
  207. package/dist/shared/apps/preview.d.ts +2 -0
  208. package/dist/shared/apps/preview.js +10 -0
  209. package/dist/shared/apps/selection.d.ts +6 -0
  210. package/dist/shared/apps/selection.js +9 -0
  211. package/dist/shared/apps/store-package.d.ts +31 -0
  212. package/dist/shared/apps/store-package.js +34 -0
  213. package/dist/shared/browser-policy.d.ts +14 -0
  214. package/dist/shared/browser-policy.js +22 -0
  215. package/dist/shared/channel/schema.d.ts +24 -0
  216. package/dist/shared/channel/secrets.d.ts +17 -0
  217. package/dist/shared/io/index.d.ts +1 -0
  218. package/dist/shared/io/index.js +1 -0
  219. package/dist/shared/io/rotate-log.d.ts +2 -0
  220. package/dist/shared/io/rotate-log.js +16 -0
  221. package/dist/shared/memory/policy.d.ts +5 -0
  222. package/dist/shared/memory/policy.js +7 -0
  223. package/dist/shared/paths/pc-installs.d.ts +13 -2
  224. package/dist/shared/paths/pc-installs.js +2 -0
  225. package/dist/shared/readiness.d.ts +2 -3
  226. package/dist/shared/readiness.js +2 -3
  227. package/dist/shared/signer.d.ts +4 -0
  228. package/dist/shared/signer.js +2 -0
  229. package/dist/shared/unity/asset-cache.d.ts +20 -0
  230. package/dist/shared/unity/asset-cache.js +44 -0
  231. package/dist/shared/unity/cli.d.ts +40 -0
  232. package/dist/shared/unity/cli.js +77 -0
  233. package/dist/shared/unity/editors.d.ts +46 -0
  234. package/dist/shared/unity/editors.js +89 -0
  235. package/dist/shared/unity/guide.d.ts +9 -0
  236. package/dist/shared/unity/guide.js +84 -0
  237. package/dist/shared/unity/index.d.ts +9 -0
  238. package/dist/shared/unity/index.js +11 -0
  239. package/dist/shared/unity/manifest.d.ts +10 -0
  240. package/dist/shared/unity/manifest.js +53 -0
  241. package/dist/shared/unity/mcp.d.ts +8 -0
  242. package/dist/shared/unity/mcp.js +12 -0
  243. package/dist/shared/unity/release.d.ts +28 -0
  244. package/dist/shared/unity/release.js +83 -0
  245. package/dist/shared/unity/status.d.ts +59 -0
  246. package/dist/shared/unity/status.js +45 -0
  247. package/dist/shared/unity/version.d.ts +27 -0
  248. package/dist/shared/unity/version.js +75 -0
  249. package/dist/shared/unreal/engines.d.ts +161 -0
  250. package/dist/shared/unreal/engines.js +308 -0
  251. package/dist/shared/unreal/guide.d.ts +19 -0
  252. package/dist/shared/unreal/guide.js +105 -0
  253. package/dist/shared/unreal/index.d.ts +7 -0
  254. package/dist/shared/unreal/index.js +8 -0
  255. package/dist/shared/unreal/launcher-files.d.ts +88 -0
  256. package/dist/shared/unreal/launcher-files.js +292 -0
  257. package/dist/shared/unreal/mixamo.d.ts +5 -0
  258. package/dist/shared/unreal/mixamo.js +16 -0
  259. package/dist/shared/unreal/room.d.ts +17 -0
  260. package/dist/shared/unreal/room.js +34 -0
  261. package/dist/shared/unreal/status.d.ts +54 -0
  262. package/dist/shared/unreal/status.js +57 -0
  263. package/dist/shared/unreal/vault.d.ts +21 -0
  264. package/dist/shared/unreal/vault.js +67 -0
  265. package/dist/shared/unreal/vs-check.d.ts +39 -0
  266. package/dist/shared/unreal/vs-check.js +79 -0
  267. package/dist/web/index.html +1 -1
  268. package/dist/web/{main-CCILLX2M.js → main-VPMYTSUL.js} +87 -87
  269. package/native/csharp/HcsHost/AssemblyInfo.cs +3 -3
  270. package/native/csharp/HostTools/AssemblyInfo.cs +3 -3
  271. package/native/csharp/StorageHelper/AssemblyInfo.cs +3 -3
  272. package/native/scripts/get-store-package.ps1 +58 -0
  273. package/package.json +1 -1
  274. package/sandbox/addons/openupm-cli/package-lock.json +2921 -0
  275. package/sandbox/addons/openupm-cli/package.json +7 -0
  276. package/sandbox/addons/unity-mcp/requirements.in +1 -0
  277. package/sandbox/addons/unity-mcp/requirements.txt +1165 -0
  278. package/sandbox/csharp/AppActivation.cs +38 -0
  279. package/sandbox/csharp/VsSetup.cs +210 -0
  280. package/sandbox/scripts/get-vs-setup.ps1 +93 -0
  281. package/sandbox/scripts/install-store-package.ps1 +28 -0
  282. package/sandbox/scripts/set-registry-values.ps1 +35 -0
  283. package/sandbox/scripts/start-store-app.ps1 +29 -0
  284. package/schemas/config.schema.json +96 -8
  285. package/schemas/sandbox-config.schema.json +46 -6
  286. package/dist/guest/devtools/unity.d.ts +0 -2
  287. package/dist/guest/devtools/unity.js +0 -7
@@ -0,0 +1,217 @@
1
+ // The Unreal area's work: what the sandbox last found (tools\unreal\status.json, written by the guest, so it is read
2
+ // with its schema and its text made safe), what this PC has that the next sandbox maps (its engines, the folders you
3
+ // registered, the launcher's vault cache: bounded reads), registering an engine folder (pcInstalls.unrealEngineFolders)
4
+ // and opening the Epic Games Launcher in the running sandbox (an exec request).
5
+ import path from 'node:path';
6
+ import { humanBytes } from '../../../core/disk.js';
7
+ import { assertNoLinks, errMsg, fail, safeText } from '../../../core/util/index.js';
8
+ import { requireOnPc } from '../../../cli/commands/context.js';
9
+ import { SandboxChannel } from '../../../host/channel/index.js';
10
+ import { isSandboxRunning } from '../../../host/sandbox/index.js';
11
+ import { pcEnv } from '../../../host/accounts/index.js';
12
+ import { findEngineFolders, findUnrealInstalls, pcSourceBuilds, unrealPcFiles, } from '../../../host/pc-installs/unreal.js';
13
+ import { PC_VAULT_FS, vaultDirs } from '../../../host/pc-installs/unreal-vault.js';
14
+ import { readBoundedFile, readValid } from '../../../shared/io/index.js';
15
+ import { RunDir } from '../../../shared/channel/index.js';
16
+ import { ORIGIN_LABELS, parseBuildVersion, UNREAL_STATUS_FILE, UnrealStatusSchema, vaultPacks, versionText, } from '../../../shared/unreal/index.js';
17
+ import { implement } from '../../context.js';
18
+ import { ConfigFile } from '../settings/index.js';
19
+ import { forgetEngineFolder, openEpicLauncher, registerEngineFolder, unrealOverview, } from './unreal.def.js';
20
+ const win = path.win32;
21
+ /** The launcher the sandbox installs (the 64-bit one of launcher 17 and later). */
22
+ const GUEST_LAUNCHER = 'C:\\Program Files (x86)\\Epic Games\\Launcher\\Portal\\Binaries\\Win64\\EpicGamesLauncher.exe';
23
+ const MAX_PACKS_SHOWN = 40;
24
+ const s = (text) => safeText(text);
25
+ const sn = (text) => (text === null ? null : safeText(text));
26
+ export function readStatus(dataPath) {
27
+ const file = path.join(dataPath, 'tools', 'unreal', UNREAL_STATUS_FILE);
28
+ try {
29
+ assertNoLinks(dataPath, file);
30
+ }
31
+ catch {
32
+ return null; // A link under the data folder: never followed.
33
+ }
34
+ return readValid(UnrealStatusSchema, file);
35
+ }
36
+ const settingText = (v) => (Array.isArray(v) ? v.join(', ') || 'none' : String(v));
37
+ /** The overview from the sandbox's status and this PC's own look (no sandbox needed). */
38
+ export function unrealOverviewOf(ctx, status, pcLook) {
39
+ const config = ctx.loaded.config;
40
+ let pc = { engines: [], vault: [] };
41
+ let problem = null;
42
+ try {
43
+ pc = pcLook();
44
+ }
45
+ catch (e) {
46
+ problem = 'Could not look at this PC: ' + errMsg(e);
47
+ }
48
+ const projects = (status?.projects ?? []).map((p) => ({
49
+ project: s(win.basename(p.workspace)),
50
+ engine: p.engine === null ? null : s(status?.engines.find((e) => e.dir === p.engine)?.id ?? p.engine),
51
+ reason: s(p.reason),
52
+ }));
53
+ return {
54
+ setUp: status !== null,
55
+ checkedAt: status ? s(status.updatedAt) : null,
56
+ engines: (status?.engines ?? []).map((e) => ({
57
+ id: s(e.id),
58
+ version: s(e.version),
59
+ dir: s(e.dir),
60
+ where: ORIGIN_LABELS[e.origin],
61
+ writable: e.writable,
62
+ build: e.build,
63
+ sizeBytes: e.sizeBytes,
64
+ projects: (status?.projects ?? [])
65
+ .filter((p) => p.engine?.toLowerCase() === e.dir.toLowerCase())
66
+ .map((p) => s(win.basename(p.workspace))),
67
+ })),
68
+ projects,
69
+ launcher: {
70
+ installed: status?.launcher.installed ?? false,
71
+ installLocation: sn(status?.launcher.installLocation ?? null),
72
+ problem: sn(status?.launcher.problem ?? null),
73
+ free: status?.launcher.freeBytes ? humanBytes(status.launcher.freeBytes) : null,
74
+ },
75
+ visualStudio: {
76
+ version: s(status?.visualStudio.version ?? ''),
77
+ path: s(status?.visualStudio.path ?? ''),
78
+ how: s(status?.visualStudio.how ?? ''),
79
+ check: s(status?.visualStudio.check ?? ''),
80
+ ok: status?.visualStudio.ok ?? false,
81
+ },
82
+ debugger: sn(status?.debugger ?? null),
83
+ ddc: sn(status?.ddc.dir ?? null),
84
+ mcpUrl: sn(status?.mcpUrl ?? null),
85
+ pc: { setting: settingText(config.pcInstalls.unrealEngines), engines: pc.engines, problem },
86
+ vault: { setting: settingText(config.pcInstalls.unrealAssets), folders: pc.vault },
87
+ settings: {
88
+ enabled: settingText(config.toolchains.unreal.enabled),
89
+ acceptLicense: config.toolchains.unreal.acceptLicense,
90
+ persistEngines: config.toolchains.unreal.persistEngines,
91
+ derivedDataCache: config.toolchains.unreal.derivedDataCache,
92
+ visualStudio: config.toolchains.unreal.visualStudio,
93
+ },
94
+ };
95
+ }
96
+ /** What this PC has for the next sandbox: its engines, the registered folders, its vault packs. */
97
+ function lookAtPc(ctx) {
98
+ const config = ctx.loaded.config.pcInstalls;
99
+ const pc = pcEnv();
100
+ const files = unrealPcFiles(pc);
101
+ const folders = findEngineFolders(files, config.unrealEngineFolders);
102
+ const installs = config.unrealEngines === false
103
+ ? []
104
+ : findUnrealInstalls(files, Array.isArray(config.unrealEngines) ? config.unrealEngines : true);
105
+ const engines = [
106
+ ...folders,
107
+ ...installs.filter((i) => !folders.some((f) => f.host.toLowerCase() === i.host.toLowerCase())),
108
+ ].map((e) => ({
109
+ id: e.id,
110
+ name: e.name,
111
+ folder: e.host,
112
+ writable: e.writable === true,
113
+ source: false,
114
+ }));
115
+ const loose = pcSourceBuilds(files)
116
+ .filter((b) => !folders.some((f) => f.host.toLowerCase() === b.host.toLowerCase()))
117
+ .map((b) => ({
118
+ id: '',
119
+ name: 'Unreal Engine ' + b.version + ' (source build)',
120
+ folder: b.host,
121
+ writable: false,
122
+ source: true,
123
+ }));
124
+ const vault = config.unrealAssets === false
125
+ ? []
126
+ : vaultDirs(pc, PC_VAULT_FS.isDir).map((folder) => {
127
+ const packs = vaultPacks(folder, PC_VAULT_FS);
128
+ return {
129
+ folder,
130
+ packs: packs.slice(0, MAX_PACKS_SHOWN).map((p) => ({
131
+ name: p.name,
132
+ size: (p.partial ? 'at least ' : '') + humanBytes(p.sizeBytes),
133
+ kind: p.kind,
134
+ })),
135
+ more: Math.max(0, packs.length - MAX_PACKS_SHOWN),
136
+ };
137
+ });
138
+ return { engines: [...engines, ...loose], vault };
139
+ }
140
+ export const unrealOverviewRun = implement(unrealOverview, (ctx) => unrealOverviewOf(ctx, readStatus(ctx.dataPath), () => lookAtPc(ctx)));
141
+ /** The engine in a folder of this PC, or a failure that says what is wrong. */
142
+ export function engineFolderProblem(folder, read) {
143
+ if (!win.isAbsolute(folder))
144
+ return 'Give the full path of the engine folder (e.g. D:\\UnrealEngine).';
145
+ const bytes = read(win.join(folder, 'Engine', 'Build', 'Build.version'), 64 * 1024);
146
+ if (!bytes)
147
+ return 'No Engine\\Build\\Build.version in ' + folder + ': that is not an Unreal Engine folder.';
148
+ return parseBuildVersion(bytes.toString('utf8')) ? null : folder + '\\Engine\\Build\\Build.version is not readable.';
149
+ }
150
+ export const registerEngineFolderRun = implement(registerEngineFolder, async (ctx, input, io) => {
151
+ requireOnPc('unreal add-engine');
152
+ const folder = input.folder ??
153
+ (await io.path({
154
+ title: 'Which Unreal Engine folder?',
155
+ lines: [
156
+ 'The folder that holds Engine\\Build\\Build.version (a source build, or a copy of an engine).',
157
+ 'The next sandbox maps it writable and registers it.',
158
+ ],
159
+ pathKind: 'dir',
160
+ validate: (v) => engineFolderProblem(win.resolve(v), readBoundedFile) ?? true,
161
+ }));
162
+ if (!folder)
163
+ fail('No folder given.', 'Nothing was changed.');
164
+ const dir = win.resolve(folder);
165
+ const problem = engineFolderProblem(dir, readBoundedFile);
166
+ if (problem)
167
+ fail(problem, 'Pick the folder that has Engine\\Build\\Build.version in it.');
168
+ const file = ConfigFile.user(ctx.loaded.configPath);
169
+ const now = file.userConfig().pcInstalls.unrealEngineFolders;
170
+ if (now.some((f) => win.resolve(f).toLowerCase() === dir.toLowerCase()))
171
+ return { message: dir + ' is registered already.' };
172
+ if (now.length >= 8)
173
+ fail('8 engine folders are registered already.', 'Forget one first.');
174
+ const outcome = file.set(['pcInstalls', 'unrealEngineFolders'], [...now, dir]);
175
+ if (typeof outcome === 'object')
176
+ fail('Could not save the folder: ' + outcome.problems.join('; '));
177
+ const v = parseBuildVersion(readBoundedFile(win.join(dir, 'Engine', 'Build', 'Build.version'), 64 * 1024).toString('utf8'));
178
+ return {
179
+ message: 'Registered Unreal Engine ' +
180
+ versionText(v) +
181
+ ' at ' +
182
+ dir +
183
+ '. The next sandbox maps it writable and registers it' +
184
+ (isSandboxRunning() ? ' (restart the sandbox to get it now).' : '.'),
185
+ };
186
+ });
187
+ export const forgetEngineFolderRun = implement(forgetEngineFolder, (ctx, input) => {
188
+ requireOnPc('unreal forget-engine');
189
+ const file = ConfigFile.user(ctx.loaded.configPath);
190
+ const now = file.userConfig().pcInstalls.unrealEngineFolders;
191
+ const dir = win.resolve(input.folder).toLowerCase();
192
+ const left = now.filter((f) => win.resolve(f).toLowerCase() !== dir);
193
+ if (left.length === now.length)
194
+ return { message: input.folder + ' was not registered.' };
195
+ const outcome = file.set(['pcInstalls', 'unrealEngineFolders'], left);
196
+ if (typeof outcome === 'object')
197
+ fail('Could not save: ' + outcome.problems.join('; '));
198
+ return { message: 'Forgot ' + input.folder + '; the next sandbox does not map it (nothing on this PC was deleted).' };
199
+ });
200
+ export const openEpicLauncherRun = implement(openEpicLauncher, async (ctx, _input, io) => {
201
+ requireOnPc('unreal launcher');
202
+ if (!isSandboxRunning())
203
+ fail('No sandbox is running.', 'Start one for a project with a .uproject; the launcher opens in its window.');
204
+ const status = new RunDir(ctx.dataPath).readSandboxStatus();
205
+ if (status?.phase !== 'ready')
206
+ fail('The sandbox is not ready yet.', 'Try again in a moment.');
207
+ if (!readStatus(ctx.dataPath)?.launcher.installed)
208
+ fail('The Epic Games Launcher is not installed in this sandbox.', 'It is installed when the sandbox is set up for Unreal with the licence accepted (Unreal set-up settings).');
209
+ io.progress('Opening the Epic Games Launcher in the sandbox…');
210
+ const result = await new SandboxChannel(ctx.dataPath).exec(['C:\\Windows\\explorer.exe', GUEST_LAUNCHER], status.guestWorkspace ?? 'C:\\', 30);
211
+ // explorer.exe returns 1 even when it started the program.
212
+ if (!result.ok && result.exitCode !== 1)
213
+ fail('The sandbox could not open it: ' + safeText(result.message));
214
+ return {
215
+ message: 'The Epic Games Launcher opens in the sandbox window. Sign in once; engines install to the data disk.',
216
+ };
217
+ });
@@ -20,6 +20,8 @@ import { agentCommandsOffRun, agentCommandsOnRun, agentCommandsStatusRun } from
20
20
  import { vpnLoginRun, vpnLogoutRun, vpnStatusRun } from './features/vpn/index.js';
21
21
  import { githubLoginRun, githubLogoutRun, githubStatusRun } from './features/github/index.js';
22
22
  import { accessStatusRun, allowDeviceRun, lanOffRun, lanOnRun, revokeAccessRun, revokeAllAccessRun, } from './features/access/index.js';
23
+ import { forgetEngineFolderRun, openEpicLauncherRun, registerEngineFolderRun, unrealOverviewRun, } from './features/unreal/index.js';
24
+ import { addBridgeRun, openUnityHubRun, removeBridgeRun, unityOverviewRun, unitySignInRun, } from './features/unity/index.js';
23
25
  export const IMPLEMENTATIONS = [
24
26
  sandboxStatusRun,
25
27
  showWindowRun,
@@ -109,6 +111,15 @@ export const IMPLEMENTATIONS = [
109
111
  revokeAllAccessRun,
110
112
  lanOnRun,
111
113
  lanOffRun,
114
+ unrealOverviewRun,
115
+ registerEngineFolderRun,
116
+ forgetEngineFolderRun,
117
+ openEpicLauncherRun,
118
+ unityOverviewRun,
119
+ openUnityHubRun,
120
+ unitySignInRun,
121
+ addBridgeRun,
122
+ removeBridgeRun,
112
123
  ];
113
124
  export function implementationOf(id) {
114
125
  return IMPLEMENTATIONS.find((i) => i.def.id === id);
@@ -2,8 +2,8 @@
2
2
  import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
3
3
  import {
4
4
  run
5
- } from "./chunk-SUYYVIDW.js";
6
- import "./chunk-IZRGTSQ5.js";
5
+ } from "./chunk-JXL6ZOO3.js";
6
+ import "./chunk-6WWMBCT2.js";
7
7
 
8
8
  // src/bin/agent-sandbox.ts
9
9
  run(process.argv.slice(2));