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
@@ -19,6 +19,8 @@ import { webView } from '../../app/features/web/index.js';
19
19
  import { vpnView } from '../../app/features/vpn/index.js';
20
20
  import { githubView } from '../../app/features/github/index.js';
21
21
  import { accessView } from '../../app/features/access/index.js';
22
+ import { unrealView } from '../../app/features/unreal/index.js';
23
+ import { unityView } from '../../app/features/unity/index.js';
22
24
  export const MENU_VIEWS = [
23
25
  { view: agentsView, section: 'Agents' },
24
26
  { view: agentEnvView, section: 'Agents' },
@@ -28,6 +30,8 @@ export const MENU_VIEWS = [
28
30
  { view: accountsView, section: 'Accounts' },
29
31
  { view: appsView, section: 'Apps' },
30
32
  { view: projectsView, section: 'Sandbox' },
33
+ { view: unrealView, section: 'Sandbox' },
34
+ { view: unityView, section: 'Sandbox' },
31
35
  { view: healthView, section: 'Maintenance' },
32
36
  { view: dataView, section: 'Maintenance' },
33
37
  { view: storageView, section: 'Maintenance' },
@@ -37,7 +37,7 @@ export const DEFAULTS = {
37
37
  },
38
38
  network: { blockPrivateRanges: true, allowOnly: [], blockHosts: [], forwardPorts: [], dns: [], proxy: '' },
39
39
  vpn: { enabled: false, provider: 'nordvpn', protocol: 'udp', country: '', configFile: '', killSwitch: true },
40
- github: { shareToken: false },
40
+ github: { shareToken: false, usePcLogin: false },
41
41
  codex: {
42
42
  sandboxMode: 'danger-full-access',
43
43
  approvalPolicy: 'never',
@@ -57,8 +57,17 @@ export const DEFAULTS = {
57
57
  appstore: { share: false },
58
58
  perplexity: { share: false },
59
59
  comet: { share: false },
60
+ perplexityapp: { share: false },
61
+ },
62
+ pcInstalls: {
63
+ steamGames: false,
64
+ epicGames: false,
65
+ unrealEngines: 'auto',
66
+ unrealEngineFolders: [],
67
+ unrealAssets: 'auto',
68
+ unityEditors: 'auto',
69
+ unityAssets: 'auto',
60
70
  },
61
- pcInstalls: { steamGames: false, epicGames: false, unrealEngines: false, unityEditors: false },
62
71
  provisioning: {
63
72
  copyFromHost: true,
64
73
  fallbackToInstall: true,
@@ -91,7 +100,18 @@ export const DEFAULTS = {
91
100
  persistEngines: true,
92
101
  derivedDataCache: 'persisted',
93
102
  },
94
- unity: { enabled: 'auto', acceptLicense: false, version: 'project', modules: [], hub: false, keepVersions: 2 },
103
+ unity: {
104
+ enabled: 'auto',
105
+ acceptLicense: false,
106
+ version: 'project',
107
+ modules: [],
108
+ hub: false,
109
+ keepVersions: 2,
110
+ mcp: true,
111
+ agentSkills: true,
112
+ cliVersion: '1.0.0-beta.16',
113
+ assetCache: 'persisted',
114
+ },
95
115
  godot: { enabled: 'auto', version: 'project', dotnet: 'auto', exportTemplates: true, keepVersions: 2 },
96
116
  steam: { enabled: 'auto', client: false, sdkFolder: '' },
97
117
  fivem: {
@@ -196,9 +216,16 @@ export const DEFAULTS = {
196
216
  home: { env: { CODEX_HOME: 'codex' }, loginFiles: ['auth.json', '.credentials.json'], hostDir: '~/.codex' },
197
217
  localState: { CODEX_SQLITE_HOME: 'sqlite' },
198
218
  // Its own command sandbox keeps local users' passwords sealed with DPAPI: unreadable in the next sandbox
199
- // ("CryptUnprotectData" on every command), so it sets that sandbox up again at each boot. tmp\arg0: folders
200
- // Codex cannot remove in a mapped folder (os error 145, a warning at every start); nothing holds them at boot.
201
- bootReset: ['.sandbox-secrets', '.sandbox\\setup_marker.json', '.sandbox\\deny_read_acl_state.json', 'tmp\\arg0'],
219
+ // ("CryptUnprotectData" on every command), so it sets that sandbox up again at each boot. tmp\arg0 and
220
+ // tmp\arg0-windows (newer Codex): folders Codex cannot remove in a mapped folder (os error 145, a warning at
221
+ // every start); nothing holds them at boot.
222
+ bootReset: [
223
+ '.sandbox-secrets',
224
+ '.sandbox\\setup_marker.json',
225
+ '.sandbox\\deny_read_acl_state.json',
226
+ 'tmp\\arg0',
227
+ 'tmp\\arg0-windows',
228
+ ],
202
229
  resumeArguments: ['resume', '--last'],
203
230
  },
204
231
  gemini: {
@@ -30,4 +30,7 @@ export declare const AccountsSchema: z.ZodObject<{
30
30
  comet: z.ZodObject<{
31
31
  share: z.ZodBoolean;
32
32
  }, z.core.$strict>;
33
+ perplexityapp: z.ZodObject<{
34
+ share: z.ZodBoolean;
35
+ }, z.core.$strict>;
33
36
  }, z.core.$strict>;
@@ -30,5 +30,6 @@ export const AccountsSchema = z
30
30
  appstore: share('appstore', 'import the AuthKey.p8 file in Accounts'),
31
31
  perplexity: share('perplexity', 'type the API key in Accounts, or import it from a .env file'),
32
32
  comet: share('comet', 'sign in to Comet once in a sandbox: it cannot be taken from this PC'),
33
+ perplexityapp: share('perplexityapp', 'sign in to the Perplexity app once in a sandbox: it cannot be taken from this PC'),
33
34
  })
34
35
  .describe('Service sign-ins for sandboxes (game stores, engines, app signing, Perplexity). Manage them in Accounts.');
@@ -95,6 +95,7 @@ export declare const ConfigSchema: z.ZodObject<{
95
95
  }, z.core.$strict>;
96
96
  github: z.ZodObject<{
97
97
  shareToken: z.ZodBoolean;
98
+ usePcLogin: z.ZodBoolean;
98
99
  }, z.core.$strict>;
99
100
  accounts: z.ZodObject<{
100
101
  epic: z.ZodObject<{
@@ -127,12 +128,18 @@ export declare const ConfigSchema: z.ZodObject<{
127
128
  comet: z.ZodObject<{
128
129
  share: z.ZodBoolean;
129
130
  }, z.core.$strict>;
131
+ perplexityapp: z.ZodObject<{
132
+ share: z.ZodBoolean;
133
+ }, z.core.$strict>;
130
134
  }, z.core.$strict>;
131
135
  pcInstalls: z.ZodObject<{
132
136
  steamGames: z.ZodUnion<readonly [z.ZodBoolean, z.ZodArray<z.ZodNumber>]>;
133
137
  epicGames: z.ZodUnion<readonly [z.ZodBoolean, z.ZodArray<z.ZodString>]>;
134
- unrealEngines: z.ZodUnion<readonly [z.ZodBoolean, z.ZodArray<z.ZodString>]>;
135
- unityEditors: z.ZodUnion<readonly [z.ZodBoolean, z.ZodArray<z.ZodString>]>;
138
+ unrealEngines: z.ZodUnion<readonly [z.ZodLiteral<"auto">, z.ZodBoolean, z.ZodArray<z.ZodString>]>;
139
+ unrealEngineFolders: z.ZodArray<z.ZodString>;
140
+ unrealAssets: z.ZodUnion<readonly [z.ZodLiteral<"auto">, z.ZodBoolean]>;
141
+ unityEditors: z.ZodUnion<readonly [z.ZodLiteral<"auto">, z.ZodBoolean, z.ZodArray<z.ZodString>]>;
142
+ unityAssets: z.ZodUnion<readonly [z.ZodLiteral<"auto">, z.ZodBoolean]>;
136
143
  }, z.core.$strict>;
137
144
  provisioning: z.ZodObject<{
138
145
  copyFromHost: z.ZodBoolean;
@@ -212,6 +219,14 @@ export declare const ConfigSchema: z.ZodObject<{
212
219
  modules: z.ZodArray<z.ZodString>;
213
220
  hub: z.ZodBoolean;
214
221
  keepVersions: z.ZodNumber;
222
+ mcp: z.ZodBoolean;
223
+ agentSkills: z.ZodBoolean;
224
+ cliVersion: z.ZodString;
225
+ assetCache: z.ZodEnum<{
226
+ pc: "pc";
227
+ persisted: "persisted";
228
+ local: "local";
229
+ }>;
215
230
  }, z.core.$strict>;
216
231
  godot: z.ZodObject<{
217
232
  enabled: z.ZodUnion<readonly [z.ZodBoolean, z.ZodLiteral<"auto">]>;
@@ -577,6 +592,9 @@ export declare const LocalOverridesSchema: z.ZodObject<{
577
592
  comet: z.ZodOptional<z.ZodObject<{
578
593
  share: z.ZodOptional<z.ZodBoolean>;
579
594
  }, z.core.$strict>>;
595
+ perplexityapp: z.ZodOptional<z.ZodObject<{
596
+ share: z.ZodOptional<z.ZodBoolean>;
597
+ }, z.core.$strict>>;
580
598
  }, z.core.$strict>>;
581
599
  provisioning: z.ZodOptional<z.ZodObject<{
582
600
  copyFromHost: z.ZodOptional<z.ZodBoolean>;
@@ -599,7 +617,7 @@ export declare const LocalOverridesSchema: z.ZodObject<{
599
617
  }, z.core.$strict>>;
600
618
  toolchains: z.ZodOptional<z.ZodObject<{
601
619
  environment: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
602
- unity: z.ZodOptional<z.ZodObject<{
620
+ godot: z.ZodOptional<z.ZodObject<{
603
621
  enabled: z.ZodOptional<z.ZodBoolean>;
604
622
  }, z.core.$strict> | z.ZodObject<{
605
623
  version: z.ZodOptional<z.ZodString>;
@@ -614,7 +632,7 @@ export declare const LocalOverridesSchema: z.ZodObject<{
614
632
  zstd: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodLiteral<"auto">]>>;
615
633
  openssl: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodLiteral<"auto">]>>;
616
634
  }, z.core.$strict>>;
617
- godot: z.ZodOptional<z.ZodObject<{
635
+ android: z.ZodOptional<z.ZodObject<{
618
636
  enabled: z.ZodOptional<z.ZodBoolean>;
619
637
  }, z.core.$strict> | z.ZodObject<{
620
638
  version: z.ZodOptional<z.ZodString>;
@@ -629,7 +647,7 @@ export declare const LocalOverridesSchema: z.ZodObject<{
629
647
  zstd: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodLiteral<"auto">]>>;
630
648
  openssl: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodLiteral<"auto">]>>;
631
649
  }, z.core.$strict>>;
632
- android: z.ZodOptional<z.ZodObject<{
650
+ flutter: z.ZodOptional<z.ZodObject<{
633
651
  enabled: z.ZodOptional<z.ZodBoolean>;
634
652
  }, z.core.$strict> | z.ZodObject<{
635
653
  version: z.ZodOptional<z.ZodString>;
@@ -644,7 +662,7 @@ export declare const LocalOverridesSchema: z.ZodObject<{
644
662
  zstd: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodLiteral<"auto">]>>;
645
663
  openssl: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodLiteral<"auto">]>>;
646
664
  }, z.core.$strict>>;
647
- flutter: z.ZodOptional<z.ZodObject<{
665
+ dart: z.ZodOptional<z.ZodObject<{
648
666
  enabled: z.ZodOptional<z.ZodBoolean>;
649
667
  }, z.core.$strict> | z.ZodObject<{
650
668
  version: z.ZodOptional<z.ZodString>;
@@ -659,7 +677,7 @@ export declare const LocalOverridesSchema: z.ZodObject<{
659
677
  zstd: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodLiteral<"auto">]>>;
660
678
  openssl: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodLiteral<"auto">]>>;
661
679
  }, z.core.$strict>>;
662
- dart: z.ZodOptional<z.ZodObject<{
680
+ reactNative: z.ZodOptional<z.ZodObject<{
663
681
  enabled: z.ZodOptional<z.ZodBoolean>;
664
682
  }, z.core.$strict> | z.ZodObject<{
665
683
  version: z.ZodOptional<z.ZodString>;
@@ -674,7 +692,7 @@ export declare const LocalOverridesSchema: z.ZodObject<{
674
692
  zstd: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodLiteral<"auto">]>>;
675
693
  openssl: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodLiteral<"auto">]>>;
676
694
  }, z.core.$strict>>;
677
- reactNative: z.ZodOptional<z.ZodObject<{
695
+ node: z.ZodOptional<z.ZodObject<{
678
696
  enabled: z.ZodOptional<z.ZodBoolean>;
679
697
  }, z.core.$strict> | z.ZodObject<{
680
698
  version: z.ZodOptional<z.ZodString>;
@@ -689,7 +707,7 @@ export declare const LocalOverridesSchema: z.ZodObject<{
689
707
  zstd: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodLiteral<"auto">]>>;
690
708
  openssl: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodLiteral<"auto">]>>;
691
709
  }, z.core.$strict>>;
692
- unreal: z.ZodOptional<z.ZodObject<{
710
+ go: z.ZodOptional<z.ZodObject<{
693
711
  enabled: z.ZodOptional<z.ZodBoolean>;
694
712
  }, z.core.$strict> | z.ZodObject<{
695
713
  version: z.ZodOptional<z.ZodString>;
@@ -704,7 +722,7 @@ export declare const LocalOverridesSchema: z.ZodObject<{
704
722
  zstd: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodLiteral<"auto">]>>;
705
723
  openssl: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodLiteral<"auto">]>>;
706
724
  }, z.core.$strict>>;
707
- node: z.ZodOptional<z.ZodObject<{
725
+ python: z.ZodOptional<z.ZodObject<{
708
726
  enabled: z.ZodOptional<z.ZodBoolean>;
709
727
  }, z.core.$strict> | z.ZodObject<{
710
728
  version: z.ZodOptional<z.ZodString>;
@@ -719,7 +737,7 @@ export declare const LocalOverridesSchema: z.ZodObject<{
719
737
  zstd: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodLiteral<"auto">]>>;
720
738
  openssl: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodLiteral<"auto">]>>;
721
739
  }, z.core.$strict>>;
722
- go: z.ZodOptional<z.ZodObject<{
740
+ rust: z.ZodOptional<z.ZodObject<{
723
741
  enabled: z.ZodOptional<z.ZodBoolean>;
724
742
  }, z.core.$strict> | z.ZodObject<{
725
743
  version: z.ZodOptional<z.ZodString>;
@@ -734,7 +752,7 @@ export declare const LocalOverridesSchema: z.ZodObject<{
734
752
  zstd: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodLiteral<"auto">]>>;
735
753
  openssl: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodLiteral<"auto">]>>;
736
754
  }, z.core.$strict>>;
737
- python: z.ZodOptional<z.ZodObject<{
755
+ msvc: z.ZodOptional<z.ZodObject<{
738
756
  enabled: z.ZodOptional<z.ZodBoolean>;
739
757
  }, z.core.$strict> | z.ZodObject<{
740
758
  version: z.ZodOptional<z.ZodString>;
@@ -749,7 +767,7 @@ export declare const LocalOverridesSchema: z.ZodObject<{
749
767
  zstd: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodLiteral<"auto">]>>;
750
768
  openssl: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodLiteral<"auto">]>>;
751
769
  }, z.core.$strict>>;
752
- rust: z.ZodOptional<z.ZodObject<{
770
+ unreal: z.ZodOptional<z.ZodObject<{
753
771
  enabled: z.ZodOptional<z.ZodBoolean>;
754
772
  }, z.core.$strict> | z.ZodObject<{
755
773
  version: z.ZodOptional<z.ZodString>;
@@ -764,7 +782,7 @@ export declare const LocalOverridesSchema: z.ZodObject<{
764
782
  zstd: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodLiteral<"auto">]>>;
765
783
  openssl: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodLiteral<"auto">]>>;
766
784
  }, z.core.$strict>>;
767
- msvc: z.ZodOptional<z.ZodObject<{
785
+ unity: z.ZodOptional<z.ZodObject<{
768
786
  enabled: z.ZodOptional<z.ZodBoolean>;
769
787
  }, z.core.$strict> | z.ZodObject<{
770
788
  version: z.ZodOptional<z.ZodString>;
@@ -1,4 +1,5 @@
1
1
  import { z } from 'zod';
2
2
  export declare const GithubSchema: z.ZodObject<{
3
3
  shareToken: z.ZodBoolean;
4
+ usePcLogin: z.ZodBoolean;
4
5
  }, z.core.$strict>;
@@ -4,4 +4,7 @@ export const GithubSchema = z.strictObject({
4
4
  shareToken: z
5
5
  .boolean()
6
6
  .describe('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.'),
7
+ usePcLogin: z
8
+ .boolean()
9
+ .describe('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.'),
7
10
  });
@@ -2,6 +2,9 @@ import { z } from 'zod';
2
2
  export declare const PcInstallsSchema: z.ZodObject<{
3
3
  steamGames: z.ZodUnion<readonly [z.ZodBoolean, z.ZodArray<z.ZodNumber>]>;
4
4
  epicGames: z.ZodUnion<readonly [z.ZodBoolean, z.ZodArray<z.ZodString>]>;
5
- unrealEngines: z.ZodUnion<readonly [z.ZodBoolean, z.ZodArray<z.ZodString>]>;
6
- unityEditors: z.ZodUnion<readonly [z.ZodBoolean, z.ZodArray<z.ZodString>]>;
5
+ unrealEngines: z.ZodUnion<readonly [z.ZodLiteral<"auto">, z.ZodBoolean, z.ZodArray<z.ZodString>]>;
6
+ unrealEngineFolders: z.ZodArray<z.ZodString>;
7
+ unrealAssets: z.ZodUnion<readonly [z.ZodLiteral<"auto">, z.ZodBoolean]>;
8
+ unityEditors: z.ZodUnion<readonly [z.ZodLiteral<"auto">, z.ZodBoolean, z.ZodArray<z.ZodString>]>;
9
+ unityAssets: z.ZodUnion<readonly [z.ZodLiteral<"auto">, z.ZodBoolean]>;
7
10
  }, z.core.$strict>;
@@ -11,7 +11,21 @@ export const PcInstallsSchema = z
11
11
  .strictObject({
12
12
  steamGames: pick(z.number().int().positive(), 'Steam games (true maps each library; a list of app IDs maps only those games)', '[480, 730]'),
13
13
  epicGames: pick(z.string().regex(/^[A-Za-z0-9._-]{1,100}$/), 'Epic Games Launcher games (by their app name)', '["Fortnite"]'),
14
- unrealEngines: pick(z.string().regex(/^(UE_)?\d+\.\d+$/), 'Unreal Engine versions installed with the Epic Games Launcher', '["5.4"]'),
15
- unityEditors: pick(z.string().regex(/^\d+\.\d+\.\d+[abfp]\d+$/), 'Unity editors installed with Unity Hub', '["6000.0.32f1"]'),
14
+ unrealEngines: z
15
+ .union([z.literal('auto'), z.boolean(), z.array(z.string().regex(/^(UE_)?\d+\.\d+$/))])
16
+ .describe('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"]).'),
17
+ unrealEngineFolders: z
18
+ .array(z.string().min(3).max(260))
19
+ .max(8)
20
+ .describe('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.'),
21
+ unrealAssets: z
22
+ .union([z.literal('auto'), z.boolean()])
23
+ .describe('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.'),
24
+ unityEditors: z
25
+ .union([z.literal('auto'), z.boolean(), z.array(z.string().regex(/^\d+\.\d+\.\d+[abfp]\d+$/))])
26
+ .describe('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"]).'),
27
+ unityAssets: z
28
+ .union([z.literal('auto'), z.boolean()])
29
+ .describe('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.'),
16
30
  })
17
31
  .describe("Games, engines and editors installed on this PC, mapped read-only into sandboxes (no copy, no room on the sandbox's disk).");
@@ -55,6 +55,14 @@ export declare const ToolchainsSchema: z.ZodObject<{
55
55
  modules: z.ZodArray<z.ZodString>;
56
56
  hub: z.ZodBoolean;
57
57
  keepVersions: z.ZodNumber;
58
+ mcp: z.ZodBoolean;
59
+ agentSkills: z.ZodBoolean;
60
+ cliVersion: z.ZodString;
61
+ assetCache: z.ZodEnum<{
62
+ pc: "pc";
63
+ persisted: "persisted";
64
+ local: "local";
65
+ }>;
58
66
  }, z.core.$strict>;
59
67
  godot: z.ZodObject<{
60
68
  enabled: z.ZodUnion<readonly [z.ZodBoolean, z.ZodLiteral<"auto">]>;
@@ -40,7 +40,7 @@ export const ToolchainsSchema = z.strictObject({
40
40
  .describe('"auto" (default): on the sandbox\'s own disk when C: has 25 GB free at boot, else "separate" (builds then write through the mapped workspace, which can overload this PC\'s disk). "shared": cargo\'s default target\\ (shared with builds on this PC, so builds on either side invalidate the other), "separate": <workspace>\\target\\sandbox (kept, no cross-talk), "local": on the sandbox\'s own disk (fastest, lost every boot), or a guest path.'),
41
41
  linker: z
42
42
  .enum(['lld', 'gnu'])
43
- .describe('GNU host: "lld" links with Rust\'s own lld through MinGW\'s gcc (much less memory than GNU ld), "gnu" with GNU ld.'),
43
+ .describe('"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.'),
44
44
  linkSlots: z
45
45
  .union([z.literal('auto'), z.number().int().min(1).max(32)])
46
46
  .describe('GNU host: how many programs may link at the same time in the whole sandbox (other links wait). "auto" = one per 6 GB of sandbox memory, 1 to 4 (the memory governor slows links down too when memory runs short).'),
@@ -70,24 +70,39 @@ export const ToolchainsSchema = z.strictObject({
70
70
  .describe('"persisted": the engine\'s local derived data cache (compiled shaders, 10-50 GB) in tools\\unreal\\ddc, kept between sandboxes. "local": Unreal\'s own place on the sandbox disk (rebuilt every boot).'),
71
71
  }),
72
72
  unity: z.strictObject({
73
- enabled: enabled("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.", 'ProjectSettings/ProjectVersion.txt'),
73
+ enabled: enabled("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.", 'ProjectSettings/ProjectVersion.txt'),
74
74
  acceptLicense: z
75
75
  .boolean()
76
76
  .describe('Required to install: you accept the Unity terms of service (https://unity.com/legal/terms-of-service), and the editor needs a Unity licence (Personal is free). A project file cannot accept it for you.'),
77
77
  version: z
78
78
  .string()
79
79
  .min(1)
80
- .describe('"project" = the version in ProjectSettings/ProjectVersion.txt, or an editor version such as "6000.0.32f1".'),
80
+ .describe('"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).'),
81
81
  modules: z
82
82
  .array(z.string().regex(/^[a-z0-9-]+$/))
83
83
  .describe('Editor modules to add: "android" (4-5 GB, also the Android SDK), "webgl" (1.5 GB), "windows-il2cpp" (adds Visual Studio\'s C++ parts), "ios" (Xcode project export only: iOS builds need a Mac).'),
84
- hub: z.boolean().describe('Also Unity Hub, with the installed editors listed in it.'),
84
+ hub: z
85
+ .boolean()
86
+ .describe('Also Unity Hub (kept on the data disk), for signing in to Unity Personal and installing editors by hand.'),
85
87
  keepVersions: z
86
88
  .number()
87
89
  .int()
88
90
  .min(1)
89
91
  .max(20)
90
92
  .describe('How many editor versions to keep in tools\\unity; older ones are removed (the least recently used first).'),
93
+ mcp: z
94
+ .boolean()
95
+ .describe("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."),
96
+ agentSkills: z
97
+ .boolean()
98
+ .describe("Unity's skills for Claude Code and Codex, from Unity-Technologies/skills at the commit the Unity CLI pins."),
99
+ cliVersion: z
100
+ .string()
101
+ .regex(/^(latest|\d+\.\d+\.\d+(-[A-Za-z0-9.]+)?)$/)
102
+ .describe('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.'),
103
+ assetCache: z
104
+ .enum(['persisted', 'pc', 'local'])
105
+ .describe('"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).'),
91
106
  }),
92
107
  godot: z.strictObject({
93
108
  enabled: enabled('Godot from its official builds (checked against the published SHA-512 sums), self-contained in tools\\godot\\<version> with `godot` (the console build) on PATH.', 'project.godot'),
@@ -218,7 +233,7 @@ export const ToolchainsSchema = z.strictObject({
218
233
  }),
219
234
  cli: z
220
235
  .strictObject({
221
- gh: EnabledSchema.describe('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.'),
236
+ gh: EnabledSchema.describe('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.'),
222
237
  zstd: EnabledSchema.describe('Zstandard (zstd). "auto" = off; set true to get it.'),
223
238
  openssl: EnabledSchema.describe('`openssl` on PATH, from the copy Git for Windows ships (its mingw64\\bin is not put on PATH, so it cannot shadow MinGW\'s gcc). "auto" = on.'),
224
239
  })
@@ -5,6 +5,7 @@ import { epicAdapter } from './kinds/epic.js';
5
5
  import { expoAdapter } from './kinds/expo.js';
6
6
  import { keystoreAdapter } from './kinds/keystore.js';
7
7
  import { perplexityAdapter } from './kinds/perplexity.js';
8
+ import { perplexityAppAdapter } from './kinds/perplexityapp.js';
8
9
  import { playAdapter } from './kinds/play.js';
9
10
  import { steamAdapter } from './kinds/steam.js';
10
11
  import { unityAdapter } from './kinds/unity.js';
@@ -19,4 +20,5 @@ export const ADAPTERS = {
19
20
  appstore: appstoreAdapter,
20
21
  perplexity: perplexityAdapter,
21
22
  comet: cometAdapter,
23
+ perplexityapp: perplexityAppAdapter,
22
24
  };
@@ -4,28 +4,30 @@ import type { ServiceAccounts } from '../../shared/accounts/payloads.js';
4
4
  import { type GuestAdapter } from './adapter.js';
5
5
  export declare const DeliveredSchema: z.ZodObject<{
6
6
  fingerprints: z.ZodRecord<z.ZodEnum<{
7
- unity: "unity";
8
7
  keystore: "keystore";
9
8
  play: "play";
10
9
  expo: "expo";
11
10
  appstore: "appstore";
11
+ unity: "unity";
12
12
  steam: "steam";
13
13
  epic: "epic";
14
14
  cfx: "cfx";
15
15
  perplexity: "perplexity";
16
16
  comet: "comet";
17
+ perplexityapp: "perplexityapp";
17
18
  }> & z.core.$partial, z.ZodString>;
18
19
  leased: z.ZodArray<z.ZodEnum<{
19
- unity: "unity";
20
20
  keystore: "keystore";
21
21
  play: "play";
22
22
  expo: "expo";
23
23
  appstore: "appstore";
24
+ unity: "unity";
24
25
  steam: "steam";
25
26
  epic: "epic";
26
27
  cfx: "cfx";
27
28
  perplexity: "perplexity";
28
29
  comet: "comet";
30
+ perplexityapp: "perplexityapp";
29
31
  }>>;
30
32
  }, z.core.$strip>;
31
33
  export type Delivered = z.output<typeof DeliveredSchema>;
@@ -1,26 +1,31 @@
1
1
  // Epic Games: the handed-over sign-in goes into the launcher's GameUserSettings.ini before anyone opens it (its other
2
- // settings are kept, and the file keeps the encoding it had: the launcher often writes UTF-16). The watch reads it
3
- // back to notice when the launcher renews it, or when you sign in here the first time.
2
+ // settings are kept, and the file keeps the encoding it had: the launcher often writes UTF-16). Launcher 17+ reads
3
+ // Config\WindowsEditor, older ones Config\Windows: both get it. The watch reads it back to notice when the launcher
4
+ // renews it, or when you sign in here the first time.
4
5
  import fs from 'node:fs';
5
6
  import path from 'node:path';
6
- import { epicSettingsFile, MAX_EPIC_INI_BYTES, readEpicLogin, withEpicLogin, } from '../../../shared/accounts/index.js';
7
+ import { epicSettingsFiles, MAX_EPIC_INI_BYTES, readEpicLogin, withEpicLogin, } from '../../../shared/accounts/index.js';
7
8
  import { decodeText, encodeText, readBoundedFile } from '../../../shared/io/index.js';
8
9
  import { localAppData } from '../adapter.js';
9
- function settingsFile() {
10
- return epicSettingsFile(localAppData());
11
- }
12
10
  export const epicAdapter = {
13
11
  kind: 'epic',
14
12
  apply(p) {
15
- const file = settingsFile();
16
- const bytes = readBoundedFile(file, MAX_EPIC_INI_BYTES);
17
- const read = bytes ? decodeText(bytes) : { text: '', encoding: 'utf8' };
18
- fs.mkdirSync(path.dirname(file), { recursive: true });
19
- fs.writeFileSync(file, encodeText(withEpicLogin(read.text, p), read.encoding));
13
+ for (const file of epicSettingsFiles(localAppData())) {
14
+ const bytes = readBoundedFile(file, MAX_EPIC_INI_BYTES);
15
+ const read = bytes ? decodeText(bytes) : { text: '', encoding: 'utf8' };
16
+ fs.mkdirSync(path.dirname(file), { recursive: true });
17
+ fs.writeFileSync(file, encodeText(withEpicLogin(read.text, p), read.encoding));
18
+ }
20
19
  return { summary: 'Epic Games Launcher: signed in with your saved sign-in' };
21
20
  },
22
21
  current() {
23
- const bytes = readBoundedFile(settingsFile(), MAX_EPIC_INI_BYTES);
24
- return bytes ? readEpicLogin(decodeText(bytes).text) : null;
22
+ // The newest place first: the one the launcher in this sandbox writes when it renews the sign-in.
23
+ for (const file of epicSettingsFiles(localAppData())) {
24
+ const bytes = readBoundedFile(file, MAX_EPIC_INI_BYTES);
25
+ const login = bytes ? readEpicLogin(decodeText(bytes).text) : null;
26
+ if (login)
27
+ return login;
28
+ }
29
+ return null;
25
30
  },
26
31
  };
@@ -0,0 +1,7 @@
1
+ import { type CometPayload } from '../../../shared/accounts/index.js';
2
+ import { type GuestAdapter } from '../adapter.js';
3
+ /** Where the sign-in waits for the app. */
4
+ export declare function perplexityAppPendingFile(root?: string): string;
5
+ /** The sign-in waiting for the app (left in place), or null (none, or not the expected shape). */
6
+ export declare function peekPendingPerplexityApp(root?: string): CometPayload | null;
7
+ export declare const perplexityAppAdapter: GuestAdapter<'perplexityapp'>;
@@ -0,0 +1,53 @@
1
+ // Perplexity desktop app: the saved perplexity.ai sign-in cookies wait in secretDir('perplexityapp') (the sandbox's own
2
+ // disk) until the app runs; the watch then writes them into it over its DevTools port and deletes the file. While the
3
+ // sandbox runs, the watch asks the running app for its perplexity.ai cookies, so a sign-in made here (or renewed) is
4
+ // kept for the next sandbox. When the app is not running, the last sign-in seen stands.
5
+ import fs from 'node:fs';
6
+ import path from 'node:path';
7
+ import { cometSummary, PAYLOADS } from '../../../shared/accounts/index.js';
8
+ import { readBoundedFile } from '../../../shared/io/bounded.js';
9
+ import { readAppSignIn, restoreAppSignIn } from '../../browser/perplexity-app.js';
10
+ import { secretDir } from '../adapter.js';
11
+ /** Where the sign-in waits for the app. */
12
+ export function perplexityAppPendingFile(root = secretDir('perplexityapp')) {
13
+ return path.join(root, 'restore.json');
14
+ }
15
+ /** The sign-in waiting for the app (left in place), or null (none, or not the expected shape). */
16
+ export function peekPendingPerplexityApp(root) {
17
+ const bytes = readBoundedFile(perplexityAppPendingFile(root), 512 * 1024);
18
+ if (!bytes)
19
+ return null;
20
+ try {
21
+ const parsed = PAYLOADS.perplexityapp.safeParse(JSON.parse(bytes.toString('utf8')));
22
+ return parsed.success ? parsed.data : null;
23
+ }
24
+ catch {
25
+ return null; // Not JSON: nothing to restore.
26
+ }
27
+ }
28
+ /** The last sign-in seen in this process (the daemon's watch). */
29
+ let held = null;
30
+ export const perplexityAppAdapter = {
31
+ kind: 'perplexityapp',
32
+ apply(p) {
33
+ const file = perplexityAppPendingFile();
34
+ fs.mkdirSync(path.dirname(file), { recursive: true });
35
+ fs.writeFileSync(file, JSON.stringify(p), { encoding: 'utf8', mode: 0o600 });
36
+ held = p;
37
+ return {
38
+ summary: 'Perplexity app: your saved sign-in (' + cometSummary(p) + ') goes into it once it runs (reload its window)',
39
+ };
40
+ },
41
+ async refresh() {
42
+ const pending = peekPendingPerplexityApp();
43
+ if (pending && (await restoreAppSignIn(pending).catch(() => false)))
44
+ fs.rmSync(perplexityAppPendingFile(), { force: true });
45
+ const now = await readAppSignIn();
46
+ if (now)
47
+ held = now;
48
+ },
49
+ current() {
50
+ return held;
51
+ },
52
+ checkMs: 30_000,
53
+ };
@@ -1,2 +1,29 @@
1
+ import type { UnityStatus } from '../../../shared/unity/status.js';
1
2
  import { type GuestAdapter } from '../adapter.js';
3
+ /** Runs a program to its end (or its time limit); the exit code and what it printed. Injected by the self-test. */
4
+ export type UnityRunner = (file: string, args: readonly string[], o: {
5
+ readonly timeoutMs: number;
6
+ readonly env?: Readonly<Record<string, string>>;
7
+ }) => Promise<{
8
+ readonly code: number;
9
+ readonly stdout: string;
10
+ }>;
11
+ export declare const runUnityProgram: UnityRunner;
12
+ export interface UnityDirs {
13
+ readonly programData: string;
14
+ readonly localAppData: string;
15
+ /** secretDir('unity'). */
16
+ readonly secrets: string;
17
+ }
18
+ /** The adapter for these folders and this runner (the self-test passes its own). */
19
+ export declare function unityAdapterFor(dirs: UnityDirs, run?: UnityRunner): GuestAdapter<'unity'>;
2
20
  export declare const unityAdapter: GuestAdapter<'unity'>;
21
+ /**
22
+ * Activates the serial the sandbox holds once an editor exists, then asks `unity license status` where the licence
23
+ * stands. The detail never holds a secret.
24
+ */
25
+ export declare function activateUnityLicence(o: {
26
+ readonly editorExe: string | null;
27
+ readonly unityExe: string | null;
28
+ readonly source?: string;
29
+ }, dirs?: UnityDirs, run?: UnityRunner): Promise<UnityStatus['licence']>;