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,38 @@
1
+ // Starts an installed Store (packaged) app by its app user model id, with a command line. Loaded by
2
+ // scripts\start-store-app.ps1 (Add-Type). C# 5.
3
+ using System;
4
+ using System.ComponentModel;
5
+ using System.Runtime.InteropServices;
6
+
7
+ public static class SbxAppActivation
8
+ {
9
+ private const int OptionsNone = 0;
10
+
11
+ [ComImport]
12
+ [Guid("2e941141-7f97-4756-ba1d-9decde894a3d")]
13
+ [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
14
+ private interface IApplicationActivationManager
15
+ {
16
+ [PreserveSig]
17
+ int ActivateApplication([MarshalAs(UnmanagedType.LPWStr)] string appUserModelId, [MarshalAs(UnmanagedType.LPWStr)] string arguments, int options, out uint processId);
18
+ }
19
+
20
+ [ComImport]
21
+ [Guid("45BA127D-10A8-46EA-8AB7-56EA9078943C")]
22
+ private class ApplicationActivationManager
23
+ {
24
+ }
25
+
26
+ /// <summary>Starts the app and returns its process id; throws a Win32Exception when Windows refuses.</summary>
27
+ public static uint Start(string appUserModelId, string arguments)
28
+ {
29
+ IApplicationActivationManager manager = (IApplicationActivationManager)new ApplicationActivationManager();
30
+ uint processId;
31
+ int result = manager.ActivateApplication(appUserModelId, arguments, OptionsNone, out processId);
32
+ if (result < 0)
33
+ {
34
+ throw new Win32Exception(result, "ActivateApplication failed for " + appUserModelId);
35
+ }
36
+ return processId;
37
+ }
38
+ }
@@ -0,0 +1,210 @@
1
+ // The Visual Studio Setup Configuration API as UnrealBuildTool calls it (MicrosoftPlatformSDK: SetupConfiguration,
2
+ // ISetupConfiguration2.EnumAllInstances, ISetupInstance2): every instance with its state, version, product, path and
3
+ // packages. Loaded by scripts\get-vs-setup.ps1 (Add-Type), which adds the file checks and writes the JSON. C# 5.
4
+ using System;
5
+ using System.Collections.Generic;
6
+ using System.Runtime.InteropServices;
7
+ using FILETIME = System.Runtime.InteropServices.ComTypes.FILETIME;
8
+
9
+ namespace AgentSandbox
10
+ {
11
+ [ComImport]
12
+ [Guid("42843719-DB4C-46C2-8E7C-64F1816EFD5B")]
13
+ [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
14
+ public interface ISetupConfiguration
15
+ {
16
+ IEnumSetupInstances EnumInstances();
17
+ ISetupInstance GetInstanceForCurrentProcess();
18
+ ISetupInstance GetInstanceForPath([In, MarshalAs(UnmanagedType.LPWStr)] string path);
19
+ }
20
+
21
+ [ComImport]
22
+ [Guid("26AAB78C-4A60-49D6-AF3B-3C35BC93365D")]
23
+ [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
24
+ public interface ISetupConfiguration2 : ISetupConfiguration
25
+ {
26
+ new IEnumSetupInstances EnumInstances();
27
+ new ISetupInstance GetInstanceForCurrentProcess();
28
+ new ISetupInstance GetInstanceForPath([In, MarshalAs(UnmanagedType.LPWStr)] string path);
29
+ IEnumSetupInstances EnumAllInstances();
30
+ }
31
+
32
+ [ComImport]
33
+ [Guid("6380BCFF-41D3-4B2E-8B2E-BF8A6810C848")]
34
+ [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
35
+ public interface IEnumSetupInstances
36
+ {
37
+ void Next(
38
+ [In, MarshalAs(UnmanagedType.U4)] int celt,
39
+ [Out, MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.Interface, SizeParamIndex = 0)]
40
+ ISetupInstance[] rgelt,
41
+ [Out, MarshalAs(UnmanagedType.U4)] out int pceltFetched);
42
+ void Skip([In, MarshalAs(UnmanagedType.U4)] int celt);
43
+ void Reset();
44
+ IEnumSetupInstances Clone();
45
+ }
46
+
47
+ [ComImport]
48
+ [Guid("B41463C3-8866-43B5-BC33-2B0676F7F42E")]
49
+ [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
50
+ public interface ISetupInstance
51
+ {
52
+ [return: MarshalAs(UnmanagedType.BStr)] string GetInstanceId();
53
+ [return: MarshalAs(UnmanagedType.Struct)] FILETIME GetInstallDate();
54
+ [return: MarshalAs(UnmanagedType.BStr)] string GetInstallationName();
55
+ [return: MarshalAs(UnmanagedType.BStr)] string GetInstallationPath();
56
+ [return: MarshalAs(UnmanagedType.BStr)] string GetInstallationVersion();
57
+ [return: MarshalAs(UnmanagedType.BStr)] string GetDisplayName([In, MarshalAs(UnmanagedType.U4)] int lcid);
58
+ [return: MarshalAs(UnmanagedType.BStr)] string GetDescription([In, MarshalAs(UnmanagedType.U4)] int lcid);
59
+ [return: MarshalAs(UnmanagedType.BStr)] string ResolvePath([In, MarshalAs(UnmanagedType.LPWStr)] string path);
60
+ }
61
+
62
+ [ComImport]
63
+ [Guid("89143C9A-05AF-49B0-B717-72E218A2185C")]
64
+ [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
65
+ public interface ISetupInstance2 : ISetupInstance
66
+ {
67
+ [return: MarshalAs(UnmanagedType.BStr)] new string GetInstanceId();
68
+ [return: MarshalAs(UnmanagedType.Struct)] new FILETIME GetInstallDate();
69
+ [return: MarshalAs(UnmanagedType.BStr)] new string GetInstallationName();
70
+ [return: MarshalAs(UnmanagedType.BStr)] new string GetInstallationPath();
71
+ [return: MarshalAs(UnmanagedType.BStr)] new string GetInstallationVersion();
72
+ [return: MarshalAs(UnmanagedType.BStr)] new string GetDisplayName([In, MarshalAs(UnmanagedType.U4)] int lcid);
73
+ [return: MarshalAs(UnmanagedType.BStr)] new string GetDescription([In, MarshalAs(UnmanagedType.U4)] int lcid);
74
+ [return: MarshalAs(UnmanagedType.BStr)] new string ResolvePath([In, MarshalAs(UnmanagedType.LPWStr)] string path);
75
+ [return: MarshalAs(UnmanagedType.U4)] uint GetState();
76
+ [return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_UNKNOWN)]
77
+ ISetupPackageReference[] GetPackages();
78
+ ISetupPackageReference GetProduct();
79
+ [return: MarshalAs(UnmanagedType.BStr)] string GetProductPath();
80
+ [return: MarshalAs(UnmanagedType.IUnknown)] object GetErrors();
81
+ [return: MarshalAs(UnmanagedType.VariantBool)] bool IsLaunchable();
82
+ [return: MarshalAs(UnmanagedType.VariantBool)] bool IsComplete();
83
+ }
84
+
85
+ [ComImport]
86
+ [Guid("DA8D8A16-B2B6-4487-A2F1-594CCCCD6BF5")]
87
+ [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
88
+ public interface ISetupPackageReference
89
+ {
90
+ [return: MarshalAs(UnmanagedType.BStr)] string GetId();
91
+ [return: MarshalAs(UnmanagedType.BStr)] string GetVersion();
92
+ [return: MarshalAs(UnmanagedType.BStr)] string GetChip();
93
+ [return: MarshalAs(UnmanagedType.BStr)] string GetLanguage();
94
+ [return: MarshalAs(UnmanagedType.BStr)] string GetBranch();
95
+ [return: MarshalAs(UnmanagedType.BStr)] string GetType();
96
+ [return: MarshalAs(UnmanagedType.BStr)] string GetUniqueId();
97
+ [return: MarshalAs(UnmanagedType.VariantBool)] bool GetIsExtension();
98
+ }
99
+
100
+ [ComImport]
101
+ [Guid("177F0C4A-1CD3-4DE7-A32C-71DBBB9FA36D")]
102
+ [ClassInterface(ClassInterfaceType.None)]
103
+ public class SetupConfiguration
104
+ {
105
+ }
106
+
107
+ /// <summary>One instance as the Setup API reports it.</summary>
108
+ public class SetupInstanceInfo
109
+ {
110
+ public string InstanceId;
111
+ public string InstallationPath;
112
+ public string InstallationVersion;
113
+ public string ProductId;
114
+ public uint State;
115
+ public bool IsComplete;
116
+ public bool IsLaunchable;
117
+ public string[] Packages;
118
+ }
119
+
120
+ public static class VsSetup
121
+ {
122
+ /// <summary>InstanceState.Local: the instance's files are on this machine (the only ones UnrealBuildTool uses).</summary>
123
+ public const uint StateLocal = 1;
124
+
125
+ /// <summary>Every instance EnumAllInstances lists (complete or not), as UnrealBuildTool enumerates them.</summary>
126
+ public static SetupInstanceInfo[] AllInstances()
127
+ {
128
+ List<SetupInstanceInfo> found = new List<SetupInstanceInfo>();
129
+ ISetupConfiguration2 setup = (ISetupConfiguration2)new SetupConfiguration();
130
+ IEnumSetupInstances instances = null;
131
+ try
132
+ {
133
+ instances = setup.EnumAllInstances();
134
+ ISetupInstance[] one = new ISetupInstance[1];
135
+ while (true)
136
+ {
137
+ int fetched;
138
+ instances.Next(1, one, out fetched);
139
+ if (fetched == 0)
140
+ {
141
+ break;
142
+ }
143
+ ISetupInstance2 instance = (ISetupInstance2)one[0];
144
+ try
145
+ {
146
+ found.Add(Describe(instance));
147
+ }
148
+ finally
149
+ {
150
+ Marshal.ReleaseComObject(instance);
151
+ }
152
+ }
153
+ }
154
+ finally
155
+ {
156
+ if (instances != null)
157
+ {
158
+ Marshal.ReleaseComObject(instances);
159
+ }
160
+ Marshal.ReleaseComObject(setup);
161
+ }
162
+ return found.ToArray();
163
+ }
164
+
165
+ private static SetupInstanceInfo Describe(ISetupInstance2 instance)
166
+ {
167
+ SetupInstanceInfo info = new SetupInstanceInfo();
168
+ info.InstanceId = instance.GetInstanceId();
169
+ info.InstallationPath = instance.GetInstallationPath();
170
+ info.InstallationVersion = instance.GetInstallationVersion();
171
+ info.State = instance.GetState();
172
+ ISetupPackageReference product = instance.GetProduct();
173
+ if (product == null)
174
+ {
175
+ info.ProductId = "";
176
+ }
177
+ else
178
+ {
179
+ try
180
+ {
181
+ info.ProductId = product.GetId();
182
+ }
183
+ finally
184
+ {
185
+ Marshal.ReleaseComObject(product);
186
+ }
187
+ }
188
+ info.IsComplete = instance.IsComplete();
189
+ info.IsLaunchable = instance.IsLaunchable();
190
+ ISetupPackageReference[] packages = instance.GetPackages();
191
+ List<string> ids = new List<string>();
192
+ if (packages != null)
193
+ {
194
+ foreach (ISetupPackageReference package in packages)
195
+ {
196
+ try
197
+ {
198
+ ids.Add(package.GetId());
199
+ }
200
+ finally
201
+ {
202
+ Marshal.ReleaseComObject(package);
203
+ }
204
+ }
205
+ }
206
+ info.Packages = ids.ToArray();
207
+ return info;
208
+ }
209
+ }
210
+ }
@@ -0,0 +1,93 @@
1
+ #Requires -Version 5.1
2
+ # Looks for Visual Studio the way UnrealBuildTool does (guest/toolchains/engines/unreal-engines.ts runs it; the
3
+ # verdict is decided in vs-check.ts): every instance the Setup Configuration API lists (csharp\VsSetup.cs), the MSVC
4
+ # toolchains under each one's VC\Tools\MSVC that have the x64 compiler, and the Windows SDKs under each KitsRoot10 the
5
+ # registry names (HKLM in both views, HKCU) that have windows.h and the x64 kernel32.lib. Writes JSON to -ResultFile.
6
+ param([Parameter(Mandatory = $true)][string]$ResultFile)
7
+ $ErrorActionPreference = 'Stop'
8
+
9
+ Add-Type -Path (Join-Path $PSScriptRoot '..\csharp\VsSetup.cs')
10
+
11
+ $instances = New-Object System.Collections.ArrayList
12
+ $setupError = ''
13
+ try {
14
+ foreach ($i in [AgentSandbox.VsSetup]::AllInstances()) {
15
+ $toolchains = New-Object System.Collections.ArrayList
16
+ $msvc = Join-Path $i.InstallationPath 'VC\Tools\MSVC'
17
+ if (Test-Path -LiteralPath $msvc -PathType Container) {
18
+ foreach ($dir in Get-ChildItem -LiteralPath $msvc -Directory) {
19
+ $cl = Join-Path $dir.FullName 'bin\Hostx64\x64\cl.exe'
20
+ $link = Join-Path $dir.FullName 'bin\Hostx64\x64\link.exe'
21
+ [void]$toolchains.Add([ordered]@{
22
+ version = $dir.Name
23
+ cl = (Test-Path -LiteralPath $cl -PathType Leaf)
24
+ link = (Test-Path -LiteralPath $link -PathType Leaf)
25
+ })
26
+ }
27
+ }
28
+ $wanted = @('Microsoft.VisualStudio.Component.VC.Tools.x86.x64', 'Microsoft.VisualStudio.Workload.NativeGame',
29
+ 'Microsoft.VisualStudio.Workload.VCTools', 'Component.Unreal', 'Component.Unreal.Ide')
30
+ [void]$instances.Add([ordered]@{
31
+ instanceId = $i.InstanceId
32
+ installationPath = $i.InstallationPath
33
+ installationVersion = $i.InstallationVersion
34
+ productId = $i.ProductId
35
+ state = [int64]$i.State
36
+ isComplete = $i.IsComplete
37
+ isLaunchable = $i.IsLaunchable
38
+ packages = @($i.Packages | Where-Object { $wanted -contains $_ })
39
+ packageCount = @($i.Packages).Count
40
+ toolchains = @($toolchains)
41
+ })
42
+ }
43
+ } catch {
44
+ $setupError = $_.Exception.Message
45
+ }
46
+
47
+ $roots = New-Object System.Collections.ArrayList
48
+ $places = @(
49
+ @{ hive = [Microsoft.Win32.RegistryHive]::LocalMachine; view = [Microsoft.Win32.RegistryView]::Registry64; name = 'HKLM (64-bit)' },
50
+ @{ hive = [Microsoft.Win32.RegistryHive]::LocalMachine; view = [Microsoft.Win32.RegistryView]::Registry32; name = 'HKLM (32-bit)' },
51
+ @{ hive = [Microsoft.Win32.RegistryHive]::CurrentUser; view = [Microsoft.Win32.RegistryView]::Registry64; name = 'HKCU' }
52
+ )
53
+ foreach ($place in $places) {
54
+ $base = [Microsoft.Win32.RegistryKey]::OpenBaseKey($place.hive, $place.view)
55
+ try {
56
+ $key = $base.OpenSubKey('SOFTWARE\Microsoft\Windows Kits\Installed Roots')
57
+ if ($key) {
58
+ $value = [string]$key.GetValue('KitsRoot10')
59
+ $key.Close()
60
+ if ($value) { [void]$roots.Add([ordered]@{ where = $place.name; path = $value }) }
61
+ }
62
+ } finally {
63
+ $base.Close()
64
+ }
65
+ }
66
+
67
+ $sdks = New-Object System.Collections.ArrayList
68
+ $seen = @{}
69
+ foreach ($root in $roots) {
70
+ $include = Join-Path $root.path 'Include'
71
+ if ($seen.ContainsKey($include.ToLowerInvariant())) { continue }
72
+ $seen[$include.ToLowerInvariant()] = $true
73
+ if (-not (Test-Path -LiteralPath $include -PathType Container)) { continue }
74
+ foreach ($dir in Get-ChildItem -LiteralPath $include -Directory) {
75
+ if ($dir.Name -notmatch '^10\.\d+\.\d+\.\d+$') { continue }
76
+ [void]$sdks.Add([ordered]@{
77
+ version = $dir.Name
78
+ root = $root.path
79
+ windowsH = (Test-Path -LiteralPath (Join-Path $dir.FullName 'um\windows.h') -PathType Leaf)
80
+ kernel32 = (Test-Path -LiteralPath (Join-Path $root.path ('Lib\' + $dir.Name + '\um\x64\kernel32.lib')) -PathType Leaf)
81
+ ucrt = (Test-Path -LiteralPath (Join-Path $root.path ('Lib\' + $dir.Name + '\ucrt\x64\ucrt.lib')) -PathType Leaf)
82
+ })
83
+ }
84
+ }
85
+
86
+ $result = [ordered]@{
87
+ setupError = $setupError
88
+ instances = @($instances)
89
+ kitsRoots = @($roots)
90
+ sdks = @($sdks)
91
+ }
92
+ $json = ConvertTo-Json -InputObject $result -Depth 6
93
+ [System.IO.File]::WriteAllText($ResultFile, $json, (New-Object System.Text.UTF8Encoding($false)))
@@ -0,0 +1,28 @@
1
+ #Requires -Version 5.1
2
+ # Installs a Microsoft Store app from its package files with Add-AppxPackage (guest/apps/store-app.ts). -ListFile is
3
+ # JSON written by the runtime: { main: "<full path of the app's .msix>", dependencies: ["<full path>", ...] }. The
4
+ # package keeps the publisher's signature (nothing is repacked), so Windows checks it as it would any Store package.
5
+ # The sandbox's Windows is new on every boot: this runs on every boot, from the package kept on the data disk.
6
+ param(
7
+ [Parameter(Mandatory = $true)][string]$ListFile,
8
+ [Parameter(Mandatory = $true)][string]$PackageName
9
+ )
10
+ $ErrorActionPreference = 'Stop'
11
+
12
+ if ($PackageName -notmatch '^[A-Za-z0-9.]{1,100}$') { throw 'That is not a package name.' }
13
+ $list = ConvertFrom-Json -InputObject (Get-Content -LiteralPath $ListFile -Raw -Encoding UTF8)
14
+ $dependencies = @()
15
+ if ($list.dependencies) { $dependencies = @($list.dependencies | ForEach-Object { $_ }) }
16
+
17
+ $existing = Get-AppxPackage -Name $PackageName -ErrorAction SilentlyContinue | Select-Object -First 1
18
+ if (-not $existing) {
19
+ if ($dependencies.Count -gt 0) {
20
+ Add-AppxPackage -Path $list.main -DependencyPath $dependencies
21
+ }
22
+ else {
23
+ Add-AppxPackage -Path $list.main
24
+ }
25
+ $existing = Get-AppxPackage -Name $PackageName -ErrorAction Stop | Select-Object -First 1
26
+ }
27
+ [pscustomobject]@{ name = [string]$existing.Name; version = [string]$existing.Version; family = [string]$existing.PackageFamilyName } |
28
+ ConvertTo-Json -Compress
@@ -0,0 +1,35 @@
1
+ #Requires -Version 5.1
2
+ # Writes string registry values from a plan (guest/toolchains/engines/unreal-engines.ts: the Unreal engines'
3
+ # registration and the .uproject file association; what goes where is decided in shared/unreal/engines.ts). -PlanFile
4
+ # is JSON written by the runtime:
5
+ # values: [{ hive: 'HKLM' | 'HKCU', key, name, value }] 64-bit view, '' = the default value
6
+ # Safe to run again. Exit 0 when every value is set, 2 when one could not be.
7
+ param([Parameter(Mandatory = $true)][string]$PlanFile)
8
+ $ErrorActionPreference = 'Stop'
9
+
10
+ $plan = Get-Content -LiteralPath $PlanFile -Raw -Encoding UTF8 | ConvertFrom-Json
11
+ $failed = New-Object System.Collections.ArrayList
12
+ $set = 0
13
+ foreach ($v in @($plan.values)) {
14
+ $hive = if ($v.hive -eq 'HKLM') { [Microsoft.Win32.RegistryHive]::LocalMachine } else { [Microsoft.Win32.RegistryHive]::CurrentUser }
15
+ $base = [Microsoft.Win32.RegistryKey]::OpenBaseKey($hive, [Microsoft.Win32.RegistryView]::Registry64)
16
+ try {
17
+ $key = $base.CreateSubKey([string]$v.key)
18
+ try {
19
+ $key.SetValue([string]$v.name, [string]$v.value, [Microsoft.Win32.RegistryValueKind]::String)
20
+ $set++
21
+ } finally {
22
+ $key.Close()
23
+ }
24
+ } catch {
25
+ [void]$failed.Add($v.hive + '\' + $v.key + ' ' + $v.name + ' (' + $_.Exception.Message + ')')
26
+ } finally {
27
+ $base.Close()
28
+ }
29
+ }
30
+ if ($failed.Count) {
31
+ Write-Host ('Could not set: ' + ($failed -join '; '))
32
+ exit 2
33
+ }
34
+ Write-Host ('Set ' + $set + ' registry values')
35
+ exit 0
@@ -0,0 +1,29 @@
1
+ #Requires -Version 5.1
2
+ # Starts an installed Microsoft Store app with command-line arguments (a shortcut to shell:AppsFolder cannot pass any).
3
+ # The Perplexity desktop app is started with its own profile folder and its DevTools port, so the sandbox can keep
4
+ # its perplexity.ai sign-in (guest/browser/perplexity-app.ts). -Port 0 picks a free port, written to the profile.
5
+ param(
6
+ [Parameter(Mandatory = $true)][string]$PackageName,
7
+ [string]$UserDataDir = '',
8
+ [int]$Port = -1
9
+ )
10
+ $ErrorActionPreference = 'Stop'
11
+
12
+ if ($PackageName -notmatch '^[A-Za-z0-9.]{1,100}$') { throw 'That is not a package name.' }
13
+ $package = Get-AppxPackage -Name $PackageName -ErrorAction Stop | Select-Object -First 1
14
+ if (-not $package) { throw ($PackageName + ' is not installed.') }
15
+ $manifest = Get-AppxPackageManifest -Package $package
16
+ $application = @($manifest.Package.Applications.Application)[0]
17
+ $aumid = $package.PackageFamilyName + '!' + $application.Id
18
+
19
+ $arguments = ''
20
+ if ($UserDataDir) {
21
+ New-Item -ItemType Directory -Force -Path $UserDataDir | Out-Null
22
+ Remove-Item -LiteralPath (Join-Path $UserDataDir 'DevToolsActivePort') -Force -ErrorAction SilentlyContinue
23
+ $arguments = '--user-data-dir="' + $UserDataDir + '"'
24
+ }
25
+ if ($Port -ge 0) { $arguments = ($arguments + ' --remote-debugging-port=' + $Port).Trim() }
26
+
27
+ Add-Type -Path (Join-Path $PSScriptRoot '..\csharp\AppActivation.cs')
28
+ $processId = [SbxAppActivation]::Start($aumid, $arguments)
29
+ Write-Output $processId
@@ -407,6 +407,10 @@
407
407
  "shareToken": {
408
408
  "type": "boolean",
409
409
  "description": "Give each sandbox the GitHub token you saved in Accounts (best a fine-grained token limited to some repositories and permissions), so gh and https git work there without logging in. Only with provisioning.git.access \"full\". The agent in the sandbox can read the token and use it for whatever it allows. A project file (.sandbox-config.json) cannot turn this on."
410
+ },
411
+ "usePcLogin": {
412
+ "type": "boolean",
413
+ "description": "Give each sandbox the GitHub CLI (gh) login from this PC, when there is one, so gh and https git work there without logging in. Used when no token saved for sandboxes is handed over. Only with provisioning.git.access \"full\". Without a gh login on the PC nothing happens. The login reaches everything your account can, and the agent in the sandbox can read it. A project file (.sandbox-config.json) cannot turn this on."
410
414
  }
411
415
  },
412
416
  "additionalProperties": false
@@ -439,7 +443,7 @@
439
443
  "properties": {
440
444
  "share": {
441
445
  "type": "boolean",
442
- "description": "Hand your saved Unity sign-in to sandboxes that use unity (sign in once in a sandbox, or take this PC's licence from Accounts). Kept encrypted on this PC; The agent in the sandbox can use this sign-in while it is there. It works in one sandbox at a time: a second sandbox starts without it while the first one runs. A Pro seat is handed back when the sandbox stops cleanly; a sandbox closed abruptly may keep it until you return it. Yours only: a project file can only turn it off."
446
+ "description": "Hand your saved Unity sign-in to sandboxes that use unity (sign in once in a sandbox, or take this PC's licence from Accounts). Kept encrypted on this PC; The agent in the sandbox can use this sign-in while it is there. It works in one sandbox at a time: a second sandbox starts without it while the first one runs. Unity Personal is activated by signing in: sign in to Unity once in a sandbox and the licence it makes is kept for the next ones (if Unity refuses it there, sign in again). A Plus or Pro serial is activated in each sandbox and handed back when the sandbox stops cleanly; a sandbox closed abruptly may keep the seat until you remove it at id.unity.com (My Seats). A licence file taken from this PC may not work in a sandbox: Unity ties it to the computer. Yours only: a project file can only turn it off."
443
447
  }
444
448
  },
445
449
  "additionalProperties": false
@@ -513,6 +517,16 @@
513
517
  }
514
518
  },
515
519
  "additionalProperties": false
520
+ },
521
+ "perplexityapp": {
522
+ "type": "object",
523
+ "properties": {
524
+ "share": {
525
+ "type": "boolean",
526
+ "description": "Hand your saved Perplexity desktop app sign-in to sandboxes that use the Perplexity desktop app (sign in to the Perplexity app once in a sandbox: it cannot be taken from this PC). Kept encrypted on this PC; The agent in the sandbox can use this sign-in while it is there. It can act as you in the Perplexity app and spend your Perplexity Computer credits; the app acts on the pages it reads, which can try to steer it. Your sign-in in the Perplexity app can't be copied from this PC: Windows locks it to your PC account. Sign in once inside a sandbox and it is kept for the next ones. Only the perplexity.ai sign-in cookies are kept: never saved passwords, other sites, localStorage or history. Several sandboxes can use it at once: the sign-in the last one hands back is kept. Yours only: a project file can only turn it off."
527
+ }
528
+ },
529
+ "additionalProperties": false
516
530
  }
517
531
  },
518
532
  "additionalProperties": false,
@@ -554,6 +568,10 @@
554
568
  },
555
569
  "unrealEngines": {
556
570
  "anyOf": [
571
+ {
572
+ "type": "string",
573
+ "const": "auto"
574
+ },
557
575
  {
558
576
  "type": "boolean"
559
577
  },
@@ -565,10 +583,36 @@
565
583
  }
566
584
  }
567
585
  ],
568
- "description": "Unreal Engine versions installed with the Epic Games Launcher of this PC, read-only in the sandbox under C:\\PcInstalls: true = all of them, false = none, or a list (e.g. [\"5.4\"]). The agent can read their files."
586
+ "description": "Unreal Engine versions installed on this PC (with the Epic Games Launcher, or source builds it lists), read-only in the sandbox under C:\\PcInstalls\\unreal and registered there, so projects build with them without a download. \"auto\" = all of them whenever the sandbox is set up for Unreal, true = always, false = never, or a list (e.g. [\"5.4\"])."
587
+ },
588
+ "unrealEngineFolders": {
589
+ "maxItems": 8,
590
+ "type": "array",
591
+ "items": {
592
+ "type": "string",
593
+ "minLength": 3,
594
+ "maxLength": 260
595
+ },
596
+ "description": "Unreal Engine folders of this PC to use in the sandbox, writable (a source build, or a copy you build plugins into): each must hold Engine\\Build\\Build.version. Mapped under C:\\PcInstalls\\unreal and registered there."
597
+ },
598
+ "unrealAssets": {
599
+ "anyOf": [
600
+ {
601
+ "type": "string",
602
+ "const": "auto"
603
+ },
604
+ {
605
+ "type": "boolean"
606
+ }
607
+ ],
608
+ "description": "The Epic Games Launcher's vault cache of this PC (the Fab and Marketplace packs you downloaded), read-only in the sandbox at C:\\PcInstalls\\unreal\\Vault: what you download on your PC is there for the agents at once. \"auto\" = whenever the sandbox is set up for Unreal, true = always, false = never."
569
609
  },
570
610
  "unityEditors": {
571
611
  "anyOf": [
612
+ {
613
+ "type": "string",
614
+ "const": "auto"
615
+ },
572
616
  {
573
617
  "type": "boolean"
574
618
  },
@@ -580,7 +624,19 @@
580
624
  }
581
625
  }
582
626
  ],
583
- "description": "Unity editors installed with Unity Hub of this PC, read-only in the sandbox under C:\\PcInstalls: true = all of them, false = none, or a list (e.g. [\"6000.0.32f1\"]). The agent can read their files."
627
+ "description": "Unity editors installed on this PC (with Unity Hub), read-only in the sandbox under C:\\PcInstalls\\unity: a project opens with the PC's editor without a download. \"auto\" = all of them whenever the sandbox is set up for Unity, true = always, false = never, or a list (e.g. [\"6000.0.32f1\"])."
628
+ },
629
+ "unityAssets": {
630
+ "anyOf": [
631
+ {
632
+ "type": "string",
633
+ "const": "auto"
634
+ },
635
+ {
636
+ "type": "boolean"
637
+ }
638
+ ],
639
+ "description": "This PC's Unity Asset Store downloads (.unitypackage files), read-only at C:\\PcInstalls\\unity\\AssetStore: what you download on your PC is there for the agents at once. \"auto\" = whenever the sandbox is set up for Unity, true = always, false = never."
584
640
  }
585
641
  },
586
642
  "additionalProperties": false,
@@ -800,7 +856,7 @@
800
856
  "lld",
801
857
  "gnu"
802
858
  ],
803
- "description": "GNU host: \"lld\" links with Rust's own lld through MinGW's gcc (much less memory than GNU ld), \"gnu\" with GNU ld."
859
+ "description": "\"lld\" (default) links with Rust's own lld: through MinGW's gcc on the GNU host (much less memory than GNU ld), and instead of link.exe on the MSVC host (link.exe writes executables into mapped folders as all zeros: os error 1392). \"gnu\" keeps GNU ld / link.exe."
804
860
  },
805
861
  "linkSlots": {
806
862
  "anyOf": [
@@ -913,7 +969,7 @@
913
969
  "const": "auto"
914
970
  }
915
971
  ],
916
- "description": "Unity: the editor version a project asks for, from Unity's release API (checked against its published hash), installed into tools\\unity\\<version> (6-7 GB each), with the modules you list. true, false, or \"auto\" = only when the project has ProjectSettings/ProjectVersion.txt."
972
+ "description": "Unity: the editor version a project asks for, from Unity's release API (checked against its published hash), installed on the data disk (tools\\unity\\editors\\<version>, 8-13 GB each, kept between sandboxes), with the modules you list. This PC's editors (pcInstalls.unityEditors) are used first. true, false, or \"auto\" = only when the project has ProjectSettings/ProjectVersion.txt."
917
973
  },
918
974
  "acceptLicense": {
919
975
  "type": "boolean",
@@ -922,7 +978,7 @@
922
978
  "version": {
923
979
  "type": "string",
924
980
  "minLength": 1,
925
- "description": "\"project\" = the version in ProjectSettings/ProjectVersion.txt, or an editor version such as \"6000.0.32f1\"."
981
+ "description": "\"project\" = the version in ProjectSettings/ProjectVersion.txt, or an editor version such as \"6000.0.32f1\" for folders without one (a project's own version always wins)."
926
982
  },
927
983
  "modules": {
928
984
  "type": "array",
@@ -934,13 +990,35 @@
934
990
  },
935
991
  "hub": {
936
992
  "type": "boolean",
937
- "description": "Also Unity Hub, with the installed editors listed in it."
993
+ "description": "Also Unity Hub (kept on the data disk), for signing in to Unity Personal and installing editors by hand."
938
994
  },
939
995
  "keepVersions": {
940
996
  "type": "integer",
941
997
  "minimum": 1,
942
998
  "maximum": 20,
943
999
  "description": "How many editor versions to keep in tools\\unity; older ones are removed (the least recently used first)."
1000
+ },
1001
+ "mcp": {
1002
+ "type": "boolean",
1003
+ "description": "The Unity CLI's MCP server (unity mcp) in Claude Code and Codex as sbx-unity: Unity's read-only tools always, the open editor's tools when the project has the Unity Pipeline package (Unity 6 and later). Nothing in your project changes."
1004
+ },
1005
+ "agentSkills": {
1006
+ "type": "boolean",
1007
+ "description": "Unity's skills for Claude Code and Codex, from Unity-Technologies/skills at the commit the Unity CLI pins."
1008
+ },
1009
+ "cliVersion": {
1010
+ "type": "string",
1011
+ "pattern": "^(latest|\\d+\\.\\d+\\.\\d+(-[A-Za-z0-9.]+)?)$",
1012
+ "description": "The Unity CLI version, checked against the SHA-256 Unity publishes: a version such as \"1.0.0-beta.16\", or \"latest\". It never updates itself."
1013
+ },
1014
+ "assetCache": {
1015
+ "type": "string",
1016
+ "enum": [
1017
+ "persisted",
1018
+ "pc",
1019
+ "local"
1020
+ ],
1021
+ "description": "\"persisted\": Asset Store downloads made in the sandbox go to tools\\unity\\asset-store (kept). \"pc\": the sandbox uses this PC's Asset Store downloads (read-only; download new ones on your PC). \"local\": Unity's own place on the sandbox disk (lost when it closes)."
944
1022
  }
945
1023
  },
946
1024
  "additionalProperties": false
@@ -1457,7 +1535,7 @@
1457
1535
  "const": "auto"
1458
1536
  }
1459
1537
  ],
1460
- "description": "GitHub CLI (gh). Only with provisioning.git.access \"full\": gh can push and merge through the GitHub API, past a read-only git. Your PC's gh login is never copied; `gh auth login` inside persists (GH_CONFIG_DIR), unless a token you saved for sandboxes is handed over (github.shareToken). \"auto\" = when the project has a .github folder."
1538
+ "description": "GitHub CLI (gh). Only with provisioning.git.access \"full\": gh can push and merge through the GitHub API, past a read-only git. Your PC's gh login is copied only with github.usePcLogin (or a token you saved for sandboxes with github.shareToken); otherwise `gh auth login` inside persists (GH_CONFIG_DIR). \"auto\" = when the project has a .github folder."
1461
1539
  },
1462
1540
  "zstd": {
1463
1541
  "anyOf": [
@@ -2026,12 +2104,22 @@
2026
2104
  "gitleaks",
2027
2105
  "ast-grep",
2028
2106
  "rust-analyzer",
2107
+ "krita",
2108
+ "inkscape",
2109
+ "audacity",
2110
+ "renderdoc",
2111
+ "f3d",
2112
+ "imagemagick",
2113
+ "nomacs",
2114
+ "unity-mcp",
2115
+ "openupm-cli",
2029
2116
  "lua-language-server",
2030
2117
  "stylua",
2031
2118
  "selene",
2032
2119
  "perplexity-mcp",
2033
2120
  "perplexity-computer-mcp",
2034
2121
  "comet",
2122
+ "perplexity-desktop",
2035
2123
  "comet-mcp",
2036
2124
  "chrome-devtools-mcp",
2037
2125
  "browser-use-mcp"