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
@@ -223,6 +223,12 @@ import {
223
223
  takeHiddenInstallNotice,
224
224
  toWireError,
225
225
  trustStorePath,
226
+ unityOverview,
227
+ unityPage,
228
+ unityView,
229
+ unrealOverview,
230
+ unrealPage,
231
+ unrealView,
226
232
  updatesPage,
227
233
  updatesStatus,
228
234
  updatesView,
@@ -251,7 +257,7 @@ import {
251
257
  withOperationCommands,
252
258
  working,
253
259
  writeJson
254
- } from "./chunk-IZRGTSQ5.js";
260
+ } from "./chunk-6WWMBCT2.js";
255
261
 
256
262
  // node_modules/commander/lib/error.js
257
263
  var require_error = __commonJS({
@@ -3984,7 +3990,7 @@ var COMMAND_LIST = [
3984
3990
  },
3985
3991
  {
3986
3992
  name: "name",
3987
- description: "account name, or the service (status, import, login, logout): epic, steam, unity, cfx, keystore, play, expo, appstore, perplexity or comet",
3993
+ description: "account name, or the service (status, import, login, logout): epic, steam, unity, cfx, keystore, play, expo, appstore, perplexity, comet or perplexityapp",
3988
3994
  required: false,
3989
3995
  choices: "accounts"
3990
3996
  }
@@ -4066,6 +4072,63 @@ var COMMAND_LIST = [
4066
4072
  ],
4067
4073
  json
4068
4074
  },
4075
+ {
4076
+ name: "unreal",
4077
+ summary: "Unreal Engine: the sandbox's engines, this PC's engines and assets, register an engine folder, open the launcher",
4078
+ group: "Projects & accounts",
4079
+ json,
4080
+ examples: [
4081
+ "sandbox unreal engines, which project uses which, Visual Studio",
4082
+ "sandbox unreal add-engine D:\\UE5 use this engine folder in sandboxes (writable)",
4083
+ "sandbox unreal launcher open the Epic Games Launcher in the running sandbox"
4084
+ ],
4085
+ args: [
4086
+ {
4087
+ name: "action",
4088
+ description: "status, add-engine, forget-engine, launcher",
4089
+ required: false,
4090
+ choices: ["status"]
4091
+ },
4092
+ {
4093
+ name: "folder",
4094
+ description: "(add-engine, forget-engine) the engine folder",
4095
+ required: false,
4096
+ when: []
4097
+ }
4098
+ ],
4099
+ options: []
4100
+ },
4101
+ {
4102
+ name: "unity",
4103
+ summary: "Unity: the sandbox's editors, this PC's editors and Asset Store downloads, the licence, the editor bridge, Unity Hub",
4104
+ group: "Projects & accounts",
4105
+ json,
4106
+ examples: [
4107
+ "sandbox unity editors, which project opens with which, the licence",
4108
+ "sandbox unity sign-in sign in to Unity in the running sandbox",
4109
+ "sandbox unity add-bridge D:\\Game add the editor bridge to a project (asks first)"
4110
+ ],
4111
+ args: [
4112
+ {
4113
+ name: "action",
4114
+ description: "status, hub, sign-in, add-bridge, remove-bridge",
4115
+ required: false,
4116
+ choices: ["status"]
4117
+ },
4118
+ {
4119
+ name: "project",
4120
+ description: "(add-bridge, remove-bridge) the Unity project folder",
4121
+ required: false,
4122
+ when: []
4123
+ }
4124
+ ],
4125
+ options: [
4126
+ text("--bridge", "name", "(add-bridge) pipeline (Unity 6 and later) or coplay (older Unity)", {
4127
+ when: "add-bridge",
4128
+ label: "Bridge"
4129
+ })
4130
+ ]
4131
+ },
4069
4132
  {
4070
4133
  name: "engine",
4071
4134
  summary: "(beta) what runs your sandbox (Windows Sandbox or HCS) and what each engine can do on this PC",
@@ -6738,6 +6801,8 @@ var MENU_VIEWS = [
6738
6801
  { view: accountsView, section: "Accounts" },
6739
6802
  { view: appsView, section: "Apps" },
6740
6803
  { view: projectsView, section: "Sandbox" },
6804
+ { view: unrealView, section: "Sandbox" },
6805
+ { view: unityView, section: "Sandbox" },
6741
6806
  { view: healthView, section: "Maintenance" },
6742
6807
  { view: dataView, section: "Maintenance" },
6743
6808
  { view: storageView, section: "Maintenance" },
@@ -8614,8 +8679,24 @@ var CATEGORIES3 = [
8614
8679
  label: "Projects",
8615
8680
  description: "Project roots (folders of projects, opened without a restart) and the projects started before."
8616
8681
  },
8617
- { id: "databases", label: "Databases", description: "Databases the sandbox can run: start and stop them." }
8682
+ { id: "databases", label: "Databases", description: "Databases the sandbox can run: start and stop them." },
8683
+ {
8684
+ id: "unreal",
8685
+ label: "Unreal Engine",
8686
+ description: "Engines, which project uses which, this PC's engines and assets, Visual Studio and the debugger."
8687
+ },
8688
+ {
8689
+ id: "unity",
8690
+ label: "Unity",
8691
+ description: "Editors, this PC's editors and Asset Store downloads, the licence, the editor bridge and Unity Hub."
8692
+ }
8618
8693
  ];
8694
+ function unrealMenu(m) {
8695
+ return m.unreal ? menuView(unrealPage(m.unreal), { category: "unreal", prefix: "unreal:", refresh: false }) : void 0;
8696
+ }
8697
+ function unityMenu(m) {
8698
+ return m.unity ? menuView(unityPage(m.unity), { category: "unity", prefix: "unity:", refresh: false }) : void 0;
8699
+ }
8619
8700
  function statusView(m) {
8620
8701
  return menuView(sandboxPage(m.report), { category: "status", prefix: "status:", refresh: false });
8621
8702
  }
@@ -8624,6 +8705,8 @@ function projectsView2(m) {
8624
8705
  }
8625
8706
  function viewFor(m, category) {
8626
8707
  if (category === "projects") return projectsView2(m);
8708
+ if (category === "unreal") return unrealMenu(m);
8709
+ if (category === "unity") return unityMenu(m);
8627
8710
  if (category === "status" || category === void 0) return statusView(m);
8628
8711
  return void 0;
8629
8712
  }
@@ -8650,12 +8733,43 @@ function sandboxOptions(m) {
8650
8733
  section: "Databases",
8651
8734
  description: d.title + ". Enter " + (d.running ? "stops" : "starts") + " it (the first start downloads it)."
8652
8735
  }));
8736
+ const unreal = unrealMenu(m);
8737
+ const noUnreal = unreal ? [] : [
8738
+ {
8739
+ value: "info:unreal",
8740
+ label: "Could not read the Unreal set-up",
8741
+ category: "unreal",
8742
+ section: "Unreal Engine",
8743
+ description: "l looks again.",
8744
+ disabled: "l looks again."
8745
+ }
8746
+ ];
8747
+ const unity = unityMenu(m);
8748
+ const noUnity = unity ? [] : [
8749
+ {
8750
+ value: "info:unity",
8751
+ label: "Could not read the Unity set-up",
8752
+ category: "unity",
8753
+ section: "Unity",
8754
+ description: "l looks again.",
8755
+ disabled: "l looks again."
8756
+ }
8757
+ ];
8653
8758
  return {
8654
8759
  path: [],
8655
- items: [...statusItems, ...projects.items, ...databases, ...noDatabases],
8760
+ items: [
8761
+ ...statusItems,
8762
+ ...projects.items,
8763
+ ...databases,
8764
+ ...noDatabases,
8765
+ ...unreal?.items ?? [],
8766
+ ...noUnreal,
8767
+ ...unity?.items ?? [],
8768
+ ...noUnity
8769
+ ],
8656
8770
  categories: CATEGORIES3,
8657
8771
  empty: "Nothing here yet.",
8658
- actions: (category) => category === "projects" ? [...projects.actions, REFRESH] : category === "databases" ? [REFRESH] : [...status.actions, REFRESH],
8772
+ actions: (category) => category === "projects" ? [...projects.actions, REFRESH] : category === "databases" ? [REFRESH] : category === "unreal" ? [...unreal?.actions ?? [], REFRESH] : category === "unity" ? [...unity?.actions ?? [], REFRESH] : [...status.actions, REFRESH],
8659
8773
  enterLabel: (category, id) => viewFor(m, category)?.enterLabel(category, id) || enterLabel2(id ?? "", m)
8660
8774
  };
8661
8775
  }
@@ -8708,7 +8822,9 @@ var SandboxPage = class extends ListPage {
8708
8822
  report: report2,
8709
8823
  projects: await readQuery(listProjects, this.ctx),
8710
8824
  databases,
8711
- defaultAgent: this.defaultAgent()
8825
+ defaultAgent: this.defaultAgent(),
8826
+ unreal: await readQuery(unrealOverview, this.ctx).catch(() => null),
8827
+ unity: await readQuery(unityOverview, this.ctx).catch(() => null)
8712
8828
  };
8713
8829
  }
8714
8830
  /** The folder `sbx-db` runs in: the sandbox's own workspace. */
@@ -10478,6 +10594,10 @@ var HANDLERS = {
10478
10594
  );
10479
10595
  },
10480
10596
  engine,
10597
+ // The bare command shows the overview; its actions (add-engine, forget-engine, launcher) are the operations' hints.
10598
+ unreal: definitionHandler(unrealOverview),
10599
+ // Same for Unity: its actions (hub, sign-in, add-bridge, remove-bridge) are the operations' hints.
10600
+ unity: definitionHandler(unityOverview),
10481
10601
  "host-claude": claudeHost,
10482
10602
  host: hostCommand,
10483
10603
  _watch: watcher,
@@ -1,7 +1,7 @@
1
1
  import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
2
2
  import {
3
3
  attach
4
- } from "./chunk-IZRGTSQ5.js";
4
+ } from "./chunk-6WWMBCT2.js";
5
5
  export {
6
6
  attach
7
7
  };
@@ -2,8 +2,8 @@
2
2
  import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
3
3
  import {
4
4
  run
5
- } from "./chunk-SUYYVIDW.js";
6
- import "./chunk-IZRGTSQ5.js";
5
+ } from "./chunk-JXL6ZOO3.js";
6
+ import "./chunk-6WWMBCT2.js";
7
7
 
8
8
  // src/bin/claude-host.ts
9
9
  var args = process.argv.slice(2);
@@ -2,8 +2,8 @@
2
2
  import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
3
3
  import {
4
4
  run
5
- } from "./chunk-SUYYVIDW.js";
6
- import "./chunk-IZRGTSQ5.js";
5
+ } from "./chunk-JXL6ZOO3.js";
6
+ import "./chunk-6WWMBCT2.js";
7
7
 
8
8
  // src/bin/claude-sbx.ts
9
9
  run(process.argv.slice(2), { harness: "claude" });
@@ -2,8 +2,8 @@
2
2
  import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
3
3
  import {
4
4
  run
5
- } from "./chunk-SUYYVIDW.js";
6
- import "./chunk-IZRGTSQ5.js";
5
+ } from "./chunk-JXL6ZOO3.js";
6
+ import "./chunk-6WWMBCT2.js";
7
7
 
8
8
  // src/bin/codex-sbx.ts
9
9
  run(process.argv.slice(2), { harness: "codex" });
@@ -2,8 +2,8 @@
2
2
  import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
3
3
  import {
4
4
  run
5
- } from "./chunk-SUYYVIDW.js";
6
- import "./chunk-IZRGTSQ5.js";
5
+ } from "./chunk-JXL6ZOO3.js";
6
+ import "./chunk-6WWMBCT2.js";
7
7
 
8
8
  // src/bin/gemini-sbx.ts
9
9
  run(process.argv.slice(2), { harness: "gemini" });
@@ -2,8 +2,8 @@
2
2
  import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
3
3
  import {
4
4
  run
5
- } from "./chunk-SUYYVIDW.js";
6
- import "./chunk-IZRGTSQ5.js";
5
+ } from "./chunk-JXL6ZOO3.js";
6
+ import "./chunk-6WWMBCT2.js";
7
7
 
8
8
  // src/bin/sandbox.ts
9
9
  run(process.argv.slice(2));
@@ -2,8 +2,8 @@
2
2
  import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
3
3
  import {
4
4
  run
5
- } from "./chunk-SUYYVIDW.js";
6
- import "./chunk-IZRGTSQ5.js";
5
+ } from "./chunk-JXL6ZOO3.js";
6
+ import "./chunk-6WWMBCT2.js";
7
7
 
8
8
  // src/bin/sbx-hide.ts
9
9
  run(process.argv.slice(2), { command: "hide" });
@@ -2,8 +2,8 @@
2
2
  import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
3
3
  import {
4
4
  run
5
- } from "./chunk-SUYYVIDW.js";
6
- import "./chunk-IZRGTSQ5.js";
5
+ } from "./chunk-JXL6ZOO3.js";
6
+ import "./chunk-6WWMBCT2.js";
7
7
 
8
8
  // src/bin/sbx-show.ts
9
9
  run(process.argv.slice(2), { command: "show" });
@@ -11,6 +11,8 @@ import { RepoGuardStore } from '../../../host/guard/index.js';
11
11
  import { hostPublicIp, prepareVpn, readVpnLine, vpnNotes } from '../../../host/vpn/index.js';
12
12
  import { prepareGithubToken } from '../../../host/github/index.js';
13
13
  import { prepareServiceAccounts } from '../../../host/accounts/index.js';
14
+ import { prepareStorePackages } from '../../../host/apps/index.js';
15
+ import { storeApps } from '../../../shared/apps/index.js';
14
16
  import { discoverPcInstalls } from '../../../host/pc-installs/index.js';
15
17
  import { clearSecrets } from '../../../host/secrets/index.js';
16
18
  import { assertCanLaunch, isSandboxRunning, spawnDetached, probeHost, hideSandboxWindow, realContainedDeps, } from '../../../host/sandbox/index.js';
@@ -180,22 +182,33 @@ class Launcher {
180
182
  : prepareGithubToken(config, ctx.storageRoot, undefined, bootWants.wants.projects);
181
183
  // accounts.<kind>.share: the saved service sign-ins this boot's toolchains use, for the one-shot file only.
182
184
  const launchId = newLaunchId();
185
+ const toolchainsOn = toolchainsOnForBoot({ run }, bootWants.wants.projects);
183
186
  const accounts = generateOnly
184
187
  ? null
185
188
  : prepareServiceAccounts({
186
189
  config,
187
190
  others: bootWants.wants.projects,
188
- on: toolchainsOnForBoot({ run }, bootWants.wants.projects),
191
+ on: toolchainsOn,
189
192
  storageRoot: ctx.storageRoot,
190
193
  dataPath: run.dataPath,
191
194
  launchId,
192
195
  // A new launch needs no sandbox running, so a lease held elsewhere is from one that stopped.
193
196
  isRunning: () => isSandboxRunning(),
194
197
  });
195
- // pcInstalls: this PC's games, engines and editors, read-only (yours only: never from a project file).
198
+ // Store apps (apps.install): their packages are fetched with this PC's own Store tooling.
199
+ const store = generateOnly
200
+ ? null
201
+ : await prepareStorePackages(storeApps(config.apps.install), {
202
+ storageRoot: ctx.storageRoot,
203
+ dataPath: run.dataPath,
204
+ });
205
+ // pcInstalls: this PC's games, engines and editors, read-only (yours only: never from a project file). The
206
+ // engines ("auto") come along whenever this launch sets the sandbox up for Unreal.
196
207
  const pcInstalls = discoverPcInstalls(ctx.loaded.config.pcInstalls, {
197
208
  packageRoot: ctx.packageRoot,
198
209
  storageRoot: ctx.storageRoot,
210
+ unrealOn: toolchainsOn.has('unreal'),
211
+ unityOn: toolchainsOn.has('unity'),
199
212
  });
200
213
  // This PC's commit (RAM plus paging file) bounds the sandbox's memory as much as free RAM does.
201
214
  const hostMemory = generateOnly ? null : readHostMemory(ctx.storageRoot);
@@ -233,6 +246,8 @@ class Launcher {
233
246
  console.log(c.yellow(line));
234
247
  for (const line of accounts?.notes ?? [])
235
248
  console.log(c.yellow(line));
249
+ for (const line of store?.notes ?? [])
250
+ console.log(c.yellow(line));
236
251
  for (const line of pcInstalls.notes)
237
252
  console.log(c.yellow(line));
238
253
  table(launchSummary(run, generated, prepared));
@@ -7,6 +7,8 @@ import { agentCommandsStatus } from '../../app/features/agent-commands/index.js'
7
7
  import { listAccounts } from '../../app/features/accounts/index.js';
8
8
  import { containedStatus, showStorage } from '../../app/features/storage/index.js';
9
9
  import { listProjects } from '../../app/features/projects/index.js';
10
+ import { unrealOverview } from '../../app/features/unreal/index.js';
11
+ import { unityOverview } from '../../app/features/unity/index.js';
10
12
  import { definitionHandler } from '../operations/index.js';
11
13
  import { fail } from '../../core/util/index.js';
12
14
  import { claudeHost, config, doctor, hostCommand, logs, sync, watcher } from './maintenance/index.js';
@@ -48,6 +50,10 @@ export const HANDLERS = {
48
50
  return fail('Unknown storage action "' + action + '".', 'Use: sandbox storage, sandbox storage move <folder>, sandbox storage use <folder> or sandbox storage contained on|off|status');
49
51
  },
50
52
  engine: engine,
53
+ // The bare command shows the overview; its actions (add-engine, forget-engine, launcher) are the operations' hints.
54
+ unreal: definitionHandler(unrealOverview),
55
+ // Same for Unity: its actions (hub, sign-in, add-bridge, remove-bridge) are the operations' hints.
56
+ unity: definitionHandler(unityOverview),
51
57
  'host-claude': claudeHost,
52
58
  host: hostCommand,
53
59
  _watch: watcher,
@@ -304,7 +304,7 @@ declare const COMMAND_LIST: readonly [{
304
304
  readonly choices: readonly ["list", "save", "use", "default", "rename", "remove"];
305
305
  }, {
306
306
  readonly name: "name";
307
- readonly description: "account name, or the service (status, import, login, logout): epic, steam, unity, cfx, keystore, play, expo, appstore, perplexity or comet";
307
+ readonly description: "account name, or the service (status, import, login, logout): epic, steam, unity, cfx, keystore, play, expo, appstore, perplexity, comet or perplexityapp";
308
308
  readonly required: false;
309
309
  readonly choices: "accounts";
310
310
  }];
@@ -488,6 +488,56 @@ declare const COMMAND_LIST: readonly [{
488
488
  shownAs?: string | undefined;
489
489
  }];
490
490
  readonly json: true;
491
+ }, {
492
+ readonly name: "unreal";
493
+ readonly summary: "Unreal Engine: the sandbox's engines, this PC's engines and assets, register an engine folder, open the launcher";
494
+ readonly group: "Projects & accounts";
495
+ readonly json: true;
496
+ readonly examples: readonly ["sandbox unreal engines, which project uses which, Visual Studio", "sandbox unreal add-engine D:\\UE5 use this engine folder in sandboxes (writable)", "sandbox unreal launcher open the Epic Games Launcher in the running sandbox"];
497
+ readonly args: readonly [{
498
+ readonly name: "action";
499
+ readonly description: "status, add-engine, forget-engine, launcher";
500
+ readonly required: false;
501
+ readonly choices: readonly ["status"];
502
+ }, {
503
+ readonly name: "folder";
504
+ readonly description: "(add-engine, forget-engine) the engine folder";
505
+ readonly required: false;
506
+ readonly when: readonly [];
507
+ }];
508
+ readonly options: readonly [];
509
+ }, {
510
+ readonly name: "unity";
511
+ readonly summary: "Unity: the sandbox's editors, this PC's editors and Asset Store downloads, the licence, the editor bridge, Unity Hub";
512
+ readonly group: "Projects & accounts";
513
+ readonly json: true;
514
+ readonly examples: readonly ["sandbox unity editors, which project opens with which, the licence", "sandbox unity sign-in sign in to Unity in the running sandbox", "sandbox unity add-bridge D:\\Game add the editor bridge to a project (asks first)"];
515
+ readonly args: readonly [{
516
+ readonly name: "action";
517
+ readonly description: "status, hub, sign-in, add-bridge, remove-bridge";
518
+ readonly required: false;
519
+ readonly choices: readonly ["status"];
520
+ }, {
521
+ readonly name: "project";
522
+ readonly description: "(add-bridge, remove-bridge) the Unity project folder";
523
+ readonly required: false;
524
+ readonly when: readonly [];
525
+ }];
526
+ readonly options: readonly [{
527
+ flag: string;
528
+ type: "string" | "number" | "boolean" | "list";
529
+ description: string;
530
+ short?: string | undefined;
531
+ value?: string | undefined;
532
+ label?: string | undefined;
533
+ default?: string | number | undefined;
534
+ choices?: string[] | "accounts" | "harnesses" | "sessions" | undefined;
535
+ advanced?: boolean | undefined;
536
+ when?: string | string[] | undefined;
537
+ noMenu?: boolean | undefined;
538
+ group?: string | undefined;
539
+ shownAs?: string | undefined;
540
+ }];
491
541
  }, {
492
542
  readonly name: "engine";
493
543
  readonly summary: "(beta) what runs your sandbox (Windows Sandbox or HCS) and what each engine can do on this PC";
@@ -299,7 +299,7 @@ const COMMAND_LIST = [
299
299
  },
300
300
  {
301
301
  name: 'name',
302
- description: 'account name, or the service (status, import, login, logout): epic, steam, unity, cfx, keystore, play, expo, appstore, perplexity or comet',
302
+ description: 'account name, or the service (status, import, login, logout): epic, steam, unity, cfx, keystore, play, expo, appstore, perplexity, comet or perplexityapp',
303
303
  required: false,
304
304
  choices: 'accounts',
305
305
  },
@@ -381,6 +381,63 @@ const COMMAND_LIST = [
381
381
  ],
382
382
  json,
383
383
  },
384
+ {
385
+ name: 'unreal',
386
+ summary: "Unreal Engine: the sandbox's engines, this PC's engines and assets, register an engine folder, open the launcher",
387
+ group: 'Projects & accounts',
388
+ json,
389
+ examples: [
390
+ 'sandbox unreal engines, which project uses which, Visual Studio',
391
+ 'sandbox unreal add-engine D:\\UE5 use this engine folder in sandboxes (writable)',
392
+ 'sandbox unreal launcher open the Epic Games Launcher in the running sandbox',
393
+ ],
394
+ args: [
395
+ {
396
+ name: 'action',
397
+ description: 'status, add-engine, forget-engine, launcher',
398
+ required: false,
399
+ choices: ['status'],
400
+ },
401
+ {
402
+ name: 'folder',
403
+ description: '(add-engine, forget-engine) the engine folder',
404
+ required: false,
405
+ when: [],
406
+ },
407
+ ],
408
+ options: [],
409
+ },
410
+ {
411
+ name: 'unity',
412
+ summary: "Unity: the sandbox's editors, this PC's editors and Asset Store downloads, the licence, the editor bridge, Unity Hub",
413
+ group: 'Projects & accounts',
414
+ json,
415
+ examples: [
416
+ 'sandbox unity editors, which project opens with which, the licence',
417
+ 'sandbox unity sign-in sign in to Unity in the running sandbox',
418
+ 'sandbox unity add-bridge D:\\Game add the editor bridge to a project (asks first)',
419
+ ],
420
+ args: [
421
+ {
422
+ name: 'action',
423
+ description: 'status, hub, sign-in, add-bridge, remove-bridge',
424
+ required: false,
425
+ choices: ['status'],
426
+ },
427
+ {
428
+ name: 'project',
429
+ description: '(add-bridge, remove-bridge) the Unity project folder',
430
+ required: false,
431
+ when: [],
432
+ },
433
+ ],
434
+ options: [
435
+ text('--bridge', 'name', '(add-bridge) pipeline (Unity 6 and later) or coplay (older Unity)', {
436
+ when: 'add-bridge',
437
+ label: 'Bridge',
438
+ }),
439
+ ],
440
+ },
384
441
  {
385
442
  name: 'engine',
386
443
  summary: '(beta) what runs your sandbox (Windows Sandbox or HCS) and what each engine can do on this PC',
@@ -12,6 +12,8 @@ export const COMMAND_PLACES = {
12
12
  data: { place: 'Maintenance > Data' },
13
13
  storage: { place: 'Maintenance > Storage' },
14
14
  engine: { place: 'Maintenance > Engine' },
15
+ unreal: { place: 'Sandbox > Unreal Engine' },
16
+ unity: { place: 'Sandbox > Unity' },
15
17
  sync: { place: 'Maintenance > More commands' },
16
18
  logs: { place: 'Maintenance > Logs (key f follows)' },
17
19
  setup: { place: 'Maintenance > Health' },
@@ -1,5 +1,7 @@
1
1
  import { type ProjectsList } from '../../../app/features/projects/index.js';
2
2
  import { type SandboxStatus } from '../../../app/features/sandbox/index.js';
3
+ import { type UnrealOverview } from '../../../app/features/unreal/index.js';
4
+ import { type UnityOverview } from '../../../app/features/unity/index.js';
3
5
  import type { Context } from '../../commands/context.js';
4
6
  import { type DatabaseRow } from '../../services/index.js';
5
7
  import { type App, type ListOptions, type ListResult } from '../../tui/index.js';
@@ -11,6 +13,10 @@ export interface SandboxModel {
11
13
  readonly databases: DatabaseRow[] | null;
12
14
  /** The agent "Start the sandbox" offers while nothing runs. */
13
15
  readonly defaultAgent: string;
16
+ /** The Unreal overview; null when it could not be read. */
17
+ readonly unreal: UnrealOverview | null;
18
+ /** The Unity overview; null when it could not be read. */
19
+ readonly unity: UnityOverview | null;
14
20
  }
15
21
  /** The list for the sandbox tab. Pure. */
16
22
  export declare function sandboxOptions(m: SandboxModel): ListOptions<string>;
@@ -1,9 +1,11 @@
1
1
  // Section 3: the sandbox as a whole. Status (the sandbox view: its facts, the window, stopping it), Projects (the
2
- // projects view: roots, the projects and the all-projects setting) and Databases (start and stop), each a category on
3
- // the left.
2
+ // projects view: roots, the projects and the all-projects setting), Databases (start and stop) and Unreal Engine (the
3
+ // unreal view) and Unity (the unity view), each a category on the left.
4
4
  import { listProjects, projectsPage } from '../../../app/features/projects/index.js';
5
5
  import { sandboxPage, sandboxStatus } from '../../../app/features/sandbox/index.js';
6
6
  import { readQuery } from '../../../app/registry.js';
7
+ import { unrealOverview, unrealPage } from '../../../app/features/unreal/index.js';
8
+ import { unityOverview, unityPage } from '../../../app/features/unity/index.js';
7
9
  import { errMsg, safeText } from '../../../core/util/index.js';
8
10
  import { RunDir } from '../../../shared/channel/index.js';
9
11
  import { DatabasesService } from '../../services/index.js';
@@ -19,7 +21,27 @@ const CATEGORIES = [
19
21
  description: 'Project roots (folders of projects, opened without a restart) and the projects started before.',
20
22
  },
21
23
  { id: 'databases', label: 'Databases', description: 'Databases the sandbox can run: start and stop them.' },
24
+ {
25
+ id: 'unreal',
26
+ label: 'Unreal Engine',
27
+ description: "Engines, which project uses which, this PC's engines and assets, Visual Studio and the debugger.",
28
+ },
29
+ {
30
+ id: 'unity',
31
+ label: 'Unity',
32
+ description: "Editors, this PC's editors and Asset Store downloads, the licence, the editor bridge and Unity Hub.",
33
+ },
22
34
  ];
35
+ /** The Unreal category: the Unreal view's rows and keys (prefixed, so they never clash with other rows). */
36
+ function unrealMenu(m) {
37
+ return m.unreal
38
+ ? menuView(unrealPage(m.unreal), { category: 'unreal', prefix: 'unreal:', refresh: false })
39
+ : undefined;
40
+ }
41
+ /** The Unity category: the Unity view's rows and keys (prefixed, so they never clash with other rows). */
42
+ function unityMenu(m) {
43
+ return m.unity ? menuView(unityPage(m.unity), { category: 'unity', prefix: 'unity:', refresh: false }) : undefined;
44
+ }
23
45
  /** The status category: the sandbox view's rows (prefixed, so they never clash with the projects' rows). */
24
46
  function statusView(m) {
25
47
  return menuView(sandboxPage(m.report), { category: 'status', prefix: 'status:', refresh: false });
@@ -32,6 +54,10 @@ function projectsView(m) {
32
54
  function viewFor(m, category) {
33
55
  if (category === 'projects')
34
56
  return projectsView(m);
57
+ if (category === 'unreal')
58
+ return unrealMenu(m);
59
+ if (category === 'unity')
60
+ return unityMenu(m);
35
61
  if (category === 'status' || category === undefined)
36
62
  return statusView(m);
37
63
  return undefined;
@@ -64,16 +90,55 @@ export function sandboxOptions(m) {
64
90
  section: 'Databases',
65
91
  description: d.title + '. Enter ' + (d.running ? 'stops' : 'starts') + ' it (the first start downloads it).',
66
92
  }));
93
+ const unreal = unrealMenu(m);
94
+ const noUnreal = unreal
95
+ ? []
96
+ : [
97
+ {
98
+ value: 'info:unreal',
99
+ label: 'Could not read the Unreal set-up',
100
+ category: 'unreal',
101
+ section: 'Unreal Engine',
102
+ description: 'l looks again.',
103
+ disabled: 'l looks again.',
104
+ },
105
+ ];
106
+ const unity = unityMenu(m);
107
+ const noUnity = unity
108
+ ? []
109
+ : [
110
+ {
111
+ value: 'info:unity',
112
+ label: 'Could not read the Unity set-up',
113
+ category: 'unity',
114
+ section: 'Unity',
115
+ description: 'l looks again.',
116
+ disabled: 'l looks again.',
117
+ },
118
+ ];
67
119
  return {
68
120
  path: [],
69
- items: [...statusItems, ...projects.items, ...databases, ...noDatabases],
121
+ items: [
122
+ ...statusItems,
123
+ ...projects.items,
124
+ ...databases,
125
+ ...noDatabases,
126
+ ...(unreal?.items ?? []),
127
+ ...noUnreal,
128
+ ...(unity?.items ?? []),
129
+ ...noUnity,
130
+ ],
70
131
  categories: CATEGORIES,
71
132
  empty: 'Nothing here yet.',
72
133
  actions: (category) => category === 'projects'
73
134
  ? [...projects.actions, REFRESH]
74
135
  : category === 'databases'
75
136
  ? [REFRESH]
76
- : [...status.actions, REFRESH],
137
+ : category === 'unreal'
138
+ ? [...(unreal?.actions ?? []), REFRESH]
139
+ : category === 'unity'
140
+ ? [...(unity?.actions ?? []), REFRESH]
141
+ : [...status.actions, REFRESH],
77
142
  enterLabel: (category, id) => viewFor(m, category)?.enterLabel(category, id) || enterLabel(id ?? '', m),
78
143
  };
79
144
  }
@@ -133,6 +198,8 @@ export class SandboxPage extends ListPage {
133
198
  projects: await readQuery(listProjects, this.ctx),
134
199
  databases,
135
200
  defaultAgent: this.defaultAgent(),
201
+ unreal: await readQuery(unrealOverview, this.ctx).catch(() => null),
202
+ unity: await readQuery(unityOverview, this.ctx).catch(() => null),
136
203
  };
137
204
  }
138
205
  /** The folder `sbx-db` runs in: the sandbox's own workspace. */