windows-development-sandbox 1.25.1 → 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 (196) hide show
  1. package/config.example.json +12 -3
  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/defs.d.ts +198 -3
  5. package/dist/app/features/defs.js +8 -0
  6. package/dist/app/features/settings/categories.def.js +1 -0
  7. package/dist/app/features/unity/index.d.ts +2 -0
  8. package/dist/app/features/unity/index.js +3 -0
  9. package/dist/app/features/unity/unity.def.d.ts +294 -0
  10. package/dist/app/features/unity/unity.def.js +471 -0
  11. package/dist/app/features/unity/unity.run.d.ts +142 -0
  12. package/dist/app/features/unity/unity.run.js +363 -0
  13. package/dist/app/registry.js +6 -0
  14. package/dist/bin/agent-sandbox.js +2 -2
  15. package/dist/bin/{chunk-F4PVBN23.js → chunk-6WWMBCT2.js} +3580 -1962
  16. package/dist/bin/{chunk-3GAXLATK.js → chunk-JXL6ZOO3.js} +72 -5
  17. package/dist/bin/{chunk-G3TG4ZT7.js → chunk-ZXCAVVS4.js} +1 -1
  18. package/dist/bin/claude-host.js +2 -2
  19. package/dist/bin/claude-sbx.js +2 -2
  20. package/dist/bin/codex-sbx.js +2 -2
  21. package/dist/bin/gemini-sbx.js +2 -2
  22. package/dist/bin/sandbox.js +2 -2
  23. package/dist/bin/sbx-hide.js +2 -2
  24. package/dist/bin/sbx-show.js +2 -2
  25. package/dist/cli/commands/launch/launch.js +12 -0
  26. package/dist/cli/commands/registry.js +3 -0
  27. package/dist/cli/manifest.d.ts +33 -1
  28. package/dist/cli/manifest.js +32 -1
  29. package/dist/cli/menu/coverage-exempt.js +1 -0
  30. package/dist/cli/menu/pages/sandbox-page.d.ts +3 -0
  31. package/dist/cli/menu/pages/sandbox-page.js +40 -3
  32. package/dist/cli/menu/views.js +2 -0
  33. package/dist/core/config/defaults.js +16 -3
  34. package/dist/core/schema/accounts.d.ts +3 -0
  35. package/dist/core/schema/accounts.js +1 -0
  36. package/dist/core/schema/config.d.ts +29 -13
  37. package/dist/core/schema/github.d.ts +1 -0
  38. package/dist/core/schema/github.js +3 -0
  39. package/dist/core/schema/pc-installs.d.ts +2 -1
  40. package/dist/core/schema/pc-installs.js +6 -1
  41. package/dist/core/schema/toolchains.d.ts +8 -0
  42. package/dist/core/schema/toolchains.js +19 -4
  43. package/dist/guest/accounts/adapters.js +2 -0
  44. package/dist/guest/accounts/apply.d.ts +4 -2
  45. package/dist/guest/accounts/kinds/perplexityapp.d.ts +7 -0
  46. package/dist/guest/accounts/kinds/perplexityapp.js +53 -0
  47. package/dist/guest/accounts/kinds/unity.d.ts +27 -0
  48. package/dist/guest/accounts/kinds/unity.js +164 -7
  49. package/dist/guest/apps/app-installer.js +18 -0
  50. package/dist/guest/apps/store-app.d.ts +4 -0
  51. package/dist/guest/apps/store-app.js +19 -0
  52. package/dist/guest/apps/store-check.d.ts +8 -0
  53. package/dist/guest/apps/store-check.js +33 -0
  54. package/dist/guest/boot/boot.js +1 -1
  55. package/dist/guest/boot/guide.js +18 -0
  56. package/dist/guest/browser/comet.d.ts +3 -1
  57. package/dist/guest/browser/comet.js +1 -1
  58. package/dist/guest/browser/perplexity-app.d.ts +12 -0
  59. package/dist/guest/browser/perplexity-app.js +60 -0
  60. package/dist/guest/daemon/daemon.js +2 -0
  61. package/dist/guest/devtools/devtool.d.ts +1 -1
  62. package/dist/guest/devtools/registry.js +1 -2
  63. package/dist/guest/entries/tool.js +1 -1
  64. package/dist/guest/setup/addon-mcp.d.ts +7 -2
  65. package/dist/guest/setup/addon-mcp.js +19 -9
  66. package/dist/guest/setup/github-token.js +4 -4
  67. package/dist/guest/setup/unity-agent.d.ts +11 -0
  68. package/dist/guest/setup/unity-agent.js +36 -0
  69. package/dist/guest/toolchains/engines/unity-cli.d.ts +24 -0
  70. package/dist/guest/toolchains/engines/unity-cli.js +74 -0
  71. package/dist/guest/toolchains/engines/unity-hub.d.ts +2 -0
  72. package/dist/guest/toolchains/engines/unity-hub.js +27 -0
  73. package/dist/guest/toolchains/engines/unity-release.d.ts +4 -15
  74. package/dist/guest/toolchains/engines/unity-release.js +17 -5
  75. package/dist/guest/toolchains/engines/unity-status.d.ts +11 -0
  76. package/dist/guest/toolchains/engines/unity-status.js +39 -0
  77. package/dist/guest/toolchains/engines/unity.d.ts +20 -1
  78. package/dist/guest/toolchains/engines/unity.js +250 -3
  79. package/dist/guest/toolchains/plan.js +5 -1
  80. package/dist/guest/toolchains/tools/cli.js +2 -2
  81. package/dist/host/accounts/deliver.js +4 -0
  82. package/dist/host/accounts/kinds/perplexityapp.d.ts +2 -0
  83. package/dist/host/accounts/kinds/perplexityapp.js +8 -0
  84. package/dist/host/accounts/kinds/unity.d.ts +1 -1
  85. package/dist/host/accounts/kinds/unity.js +60 -8
  86. package/dist/host/accounts/leases.d.ts +2 -1
  87. package/dist/host/accounts/sources.js +2 -0
  88. package/dist/host/apps/index.d.ts +1 -0
  89. package/dist/host/apps/index.js +2 -0
  90. package/dist/host/apps/store-package.d.ts +51 -0
  91. package/dist/host/apps/store-package.js +209 -0
  92. package/dist/host/github/deliver.d.ts +8 -3
  93. package/dist/host/github/deliver.js +42 -29
  94. package/dist/host/github/index.d.ts +1 -0
  95. package/dist/host/github/index.js +1 -0
  96. package/dist/host/github/pc-login.d.ts +27 -0
  97. package/dist/host/github/pc-login.js +129 -0
  98. package/dist/host/pc-installs/discover.d.ts +4 -0
  99. package/dist/host/pc-installs/discover.js +16 -4
  100. package/dist/host/pc-installs/source.d.ts +1 -1
  101. package/dist/host/pc-installs/unity-assets.d.ts +5 -0
  102. package/dist/host/pc-installs/unity-assets.js +18 -0
  103. package/dist/host/pc-installs/unity.d.ts +20 -0
  104. package/dist/host/pc-installs/unity.js +135 -2
  105. package/dist/runtime/agent.js +116 -11
  106. package/dist/runtime/daemon.js +2170 -976
  107. package/dist/runtime/db.js +116 -11
  108. package/dist/runtime/main.js +2543 -1364
  109. package/dist/runtime/netproxy.js +116 -11
  110. package/dist/runtime/tool.js +133 -31
  111. package/dist/runtime/view.js +116 -11
  112. package/dist/selftest/agents-web.test.js +2 -1
  113. package/dist/selftest/engines.test.js +2 -2
  114. package/dist/selftest/github.test.js +64 -1
  115. package/dist/selftest/index.js +10 -0
  116. package/dist/selftest/menu-screens.js +3 -1
  117. package/dist/selftest/persisted-installs.test.js +1 -1
  118. package/dist/selftest/service-accounts.test.js +1 -1
  119. package/dist/selftest/store-app.test.d.ts +2 -0
  120. package/dist/selftest/store-app.test.js +162 -0
  121. package/dist/selftest/support/engine-golden.js +7 -0
  122. package/dist/selftest/support/fixtures.d.ts +10 -1
  123. package/dist/selftest/support/unity-sample.d.ts +2 -0
  124. package/dist/selftest/support/unity-sample.js +80 -0
  125. package/dist/selftest/unity-accounts.test.d.ts +2 -0
  126. package/dist/selftest/unity-accounts.test.js +106 -0
  127. package/dist/selftest/unity-agent.test.d.ts +2 -0
  128. package/dist/selftest/unity-agent.test.js +47 -0
  129. package/dist/selftest/unity-page.test.d.ts +2 -0
  130. package/dist/selftest/unity-page.test.js +177 -0
  131. package/dist/selftest/unity-setup.test.d.ts +2 -0
  132. package/dist/selftest/unity-setup.test.js +49 -0
  133. package/dist/selftest/unity.test.js +238 -3
  134. package/dist/shared/accounts/index.d.ts +1 -0
  135. package/dist/shared/accounts/index.js +1 -0
  136. package/dist/shared/accounts/kinds/unity.d.ts +28 -0
  137. package/dist/shared/accounts/kinds/unity.js +88 -0
  138. package/dist/shared/accounts/kinds.d.ts +2 -2
  139. package/dist/shared/accounts/kinds.js +23 -1
  140. package/dist/shared/accounts/payloads.d.ts +52 -0
  141. package/dist/shared/accounts/payloads.js +14 -2
  142. package/dist/shared/apps/catalogue-agents-web.d.ts +7 -0
  143. package/dist/shared/apps/catalogue-agents-web.js +23 -0
  144. package/dist/shared/apps/catalogue-gamedev.d.ts +3 -0
  145. package/dist/shared/apps/catalogue-gamedev.js +31 -0
  146. package/dist/shared/apps/catalogue.d.ts +8 -0
  147. package/dist/shared/apps/index.d.ts +3 -2
  148. package/dist/shared/apps/index.js +3 -2
  149. package/dist/shared/apps/selection.d.ts +6 -0
  150. package/dist/shared/apps/selection.js +9 -0
  151. package/dist/shared/apps/store-package.d.ts +31 -0
  152. package/dist/shared/apps/store-package.js +34 -0
  153. package/dist/shared/channel/schema.d.ts +24 -0
  154. package/dist/shared/channel/secrets.d.ts +17 -0
  155. package/dist/shared/paths/pc-installs.d.ts +1 -1
  156. package/dist/shared/paths/pc-installs.js +1 -0
  157. package/dist/shared/readiness.d.ts +2 -2
  158. package/dist/shared/readiness.js +2 -2
  159. package/dist/shared/unity/asset-cache.d.ts +20 -0
  160. package/dist/shared/unity/asset-cache.js +44 -0
  161. package/dist/shared/unity/cli.d.ts +40 -0
  162. package/dist/shared/unity/cli.js +77 -0
  163. package/dist/shared/unity/editors.d.ts +46 -0
  164. package/dist/shared/unity/editors.js +89 -0
  165. package/dist/shared/unity/guide.d.ts +9 -0
  166. package/dist/shared/unity/guide.js +84 -0
  167. package/dist/shared/unity/index.d.ts +9 -0
  168. package/dist/shared/unity/index.js +11 -0
  169. package/dist/shared/unity/manifest.d.ts +10 -0
  170. package/dist/shared/unity/manifest.js +53 -0
  171. package/dist/shared/unity/mcp.d.ts +8 -0
  172. package/dist/shared/unity/mcp.js +12 -0
  173. package/dist/shared/unity/release.d.ts +28 -0
  174. package/dist/shared/unity/release.js +83 -0
  175. package/dist/shared/unity/status.d.ts +59 -0
  176. package/dist/shared/unity/status.js +45 -0
  177. package/dist/shared/unity/version.d.ts +27 -0
  178. package/dist/shared/unity/version.js +75 -0
  179. package/dist/web/index.html +1 -1
  180. package/dist/web/{main-FNE6XEHA.js → main-VPMYTSUL.js} +67 -67
  181. package/native/csharp/HcsHost/AssemblyInfo.cs +3 -3
  182. package/native/csharp/HostTools/AssemblyInfo.cs +3 -3
  183. package/native/csharp/StorageHelper/AssemblyInfo.cs +3 -3
  184. package/native/scripts/get-store-package.ps1 +58 -0
  185. package/package.json +1 -1
  186. package/sandbox/addons/openupm-cli/package-lock.json +2921 -0
  187. package/sandbox/addons/openupm-cli/package.json +7 -0
  188. package/sandbox/addons/unity-mcp/requirements.in +1 -0
  189. package/sandbox/addons/unity-mcp/requirements.txt +1165 -0
  190. package/sandbox/csharp/AppActivation.cs +38 -0
  191. package/sandbox/scripts/install-store-package.ps1 +28 -0
  192. package/sandbox/scripts/start-store-app.ps1 +29 -0
  193. package/schemas/config.schema.json +61 -6
  194. package/schemas/sandbox-config.schema.json +38 -5
  195. package/dist/guest/devtools/unity.d.ts +0 -2
  196. package/dist/guest/devtools/unity.js +0 -7
@@ -25718,21 +25718,35 @@ var ToolchainsSchema = external_exports.strictObject({
25718
25718
  }),
25719
25719
  unity: external_exports.strictObject({
25720
25720
  enabled: enabled(
25721
- "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.",
25721
+ "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.",
25722
25722
  "ProjectSettings/ProjectVersion.txt"
25723
25723
  ),
25724
25724
  acceptLicense: external_exports.boolean().describe(
25725
25725
  "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."
25726
25726
  ),
25727
25727
  version: external_exports.string().min(1).describe(
25728
- '"project" = the version in ProjectSettings/ProjectVersion.txt, or an editor version such as "6000.0.32f1".'
25728
+ `"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).`
25729
25729
  ),
25730
25730
  modules: external_exports.array(external_exports.string().regex(/^[a-z0-9-]+$/)).describe(
25731
25731
  `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).`
25732
25732
  ),
25733
- hub: external_exports.boolean().describe("Also Unity Hub, with the installed editors listed in it."),
25733
+ hub: external_exports.boolean().describe(
25734
+ "Also Unity Hub (kept on the data disk), for signing in to Unity Personal and installing editors by hand."
25735
+ ),
25734
25736
  keepVersions: external_exports.number().int().min(1).max(20).describe(
25735
25737
  "How many editor versions to keep in tools\\unity; older ones are removed (the least recently used first)."
25738
+ ),
25739
+ mcp: external_exports.boolean().describe(
25740
+ "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."
25741
+ ),
25742
+ agentSkills: external_exports.boolean().describe(
25743
+ "Unity's skills for Claude Code and Codex, from Unity-Technologies/skills at the commit the Unity CLI pins."
25744
+ ),
25745
+ cliVersion: external_exports.string().regex(/^(latest|\d+\.\d+\.\d+(-[A-Za-z0-9.]+)?)$/).describe(
25746
+ '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.'
25747
+ ),
25748
+ assetCache: external_exports.enum(["persisted", "pc", "local"]).describe(
25749
+ `"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).`
25736
25750
  )
25737
25751
  }),
25738
25752
  godot: external_exports.strictObject({
@@ -25884,7 +25898,7 @@ var ToolchainsSchema = external_exports.strictObject({
25884
25898
  }),
25885
25899
  cli: external_exports.strictObject({
25886
25900
  gh: EnabledSchema.describe(
25887
- '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.'
25901
+ '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.'
25888
25902
  ),
25889
25903
  zstd: EnabledSchema.describe('Zstandard (zstd). "auto" = off; set true to get it.'),
25890
25904
  openssl: EnabledSchema.describe(
@@ -25939,6 +25953,9 @@ var COMET_SIGNER = {
25939
25953
  subject: ['(^|, )CN="?PERPLEXITY AI, INC\\.?"?(,|$)', '(^|, )O="?PERPLEXITY AI, INC\\.?"?(,|$)'],
25940
25954
  issuer: ["^CN=GlobalSign GCC R45 EV CodeSigning CA 2020(,|$)"]
25941
25955
  };
25956
+ var PERPLEXITY_DESKTOP_PRODUCT_ID = "9P9XG917PWCJ";
25957
+ var PERPLEXITY_DESKTOP_PACKAGE = "PerplexityAI.PerplexityApp";
25958
+ var PERPLEXITY_DESKTOP_FAMILY = "PerplexityAI.PerplexityApp_3jh4kjrg4dzr2";
25942
25959
  var EDGE_EXE = "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe";
25943
25960
  var AGENTS_WEB_APPS = [
25944
25961
  {
@@ -25985,6 +26002,22 @@ var AGENTS_WEB_APPS = [
25985
26002
  signer: COMET_SIGNER,
25986
26003
  userOnly: true
25987
26004
  },
26005
+ {
26006
+ id: "perplexity-desktop",
26007
+ name: "Perplexity (desktop app)",
26008
+ category: "agents",
26009
+ about: "Perplexity's desktop app, with Perplexity Computer, from the Microsoft Store. The package comes from this PC (winget with your own Microsoft Store access) and is kept on the data disk; the sandbox installs it on every boot. With accounts.perplexityapp.share on, your sign-in made in a sandbox is kept for the next ones (it cannot be copied from this PC). It acts on what it reads: use it only on what you would let it act on.",
26010
+ size: "300 MB",
26011
+ source: {
26012
+ store: {
26013
+ productId: PERPLEXITY_DESKTOP_PRODUCT_ID,
26014
+ packageName: PERPLEXITY_DESKTOP_PACKAGE,
26015
+ family: PERPLEXITY_DESKTOP_FAMILY
26016
+ }
26017
+ },
26018
+ exe: "",
26019
+ userOnly: true
26020
+ },
25988
26021
  {
25989
26022
  id: "comet-mcp",
25990
26023
  name: "Comet MCP",
@@ -26038,6 +26071,8 @@ var AGENTS_WEB_APPS = [
26038
26071
  ];
26039
26072
 
26040
26073
  // src/shared/apps/catalogue-gamedev.ts
26074
+ var UNITY_MCP_VERSION = "10.3.0";
26075
+ var OPENUPM_CLI_VERSION = "4.5.3";
26041
26076
  var GAMEDEV_APPS = [
26042
26077
  {
26043
26078
  id: "krita",
@@ -26107,6 +26142,34 @@ var GAMEDEV_APPS = [
26107
26142
  size: "60 MB",
26108
26143
  source: { github: "nomacs/nomacs", asset: "^nomacs-portable-win\\.zip$" },
26109
26144
  exe: "nomacs.exe"
26145
+ },
26146
+ {
26147
+ id: "unity-mcp",
26148
+ name: "MCP for Unity",
26149
+ category: "agents",
26150
+ about: "Lets Claude Code and Codex work in an open Unity editor (CoplayDev/unity-mcp 10.3.0, MIT; Unity 2021.3 to 6.x). Your project needs its package (Unity page: Add the editor bridge). Telemetry is off.",
26151
+ size: "60 MB",
26152
+ source: { locked: "uv", package: "mcpforunityserver", version: UNITY_MCP_VERSION },
26153
+ exe: "mcp-for-unity.exe",
26154
+ service: true,
26155
+ mcp: {
26156
+ name: "sbx-unity-mcp",
26157
+ program: true,
26158
+ args: ["--transport", "stdio"],
26159
+ env: { DISABLE_TELEMETRY: "1", UNITY_MCP_DISABLE_TELEMETRY: "1", MCP_DISABLE_TELEMETRY: "1" },
26160
+ codex: true
26161
+ },
26162
+ plugsInto: "Claude Code and Codex as the MCP server sbx-unity-mcp",
26163
+ userOnly: true
26164
+ },
26165
+ {
26166
+ id: "openupm-cli",
26167
+ name: "openupm-cli",
26168
+ category: "gamedev",
26169
+ about: "Adds OpenUPM packages to Unity projects from the command line (openupm 4.5.3, BSD-3-Clause).",
26170
+ size: "15 MB",
26171
+ source: { locked: "npm", package: "openupm-cli", version: OPENUPM_CLI_VERSION },
26172
+ exe: "openupm.cmd"
26110
26173
  }
26111
26174
  ];
26112
26175
 
@@ -26981,6 +27044,21 @@ var CORE_APPS = [
26981
27044
  ];
26982
27045
  var APPS = [...CORE_APPS, ...GAMEDEV_APPS, ...MODDING_APPS, ...MOBILE_APPS, ...AGENTS_WEB_APPS];
26983
27046
 
27047
+ // src/shared/apps/store-package.ts
27048
+ var GB = 1024 * 1024 * 1024;
27049
+ var FILE_NAME = /^[A-Za-z0-9._~+-]{1,200}\.(msix|appx|msixbundle|appxbundle)$/i;
27050
+ var StorePackageFileSchema = external_exports.strictObject({
27051
+ name: external_exports.string().regex(FILE_NAME),
27052
+ role: external_exports.enum(["main", "dependency"]),
27053
+ sha256: external_exports.string().regex(/^[0-9a-f]{64}$/),
27054
+ bytes: external_exports.number().int().positive().max(2 * GB)
27055
+ });
27056
+ var StorePackageManifestSchema = external_exports.strictObject({
27057
+ productId: external_exports.string().regex(/^[A-Z0-9]{12}$/),
27058
+ fetchedAt: external_exports.string().max(40),
27059
+ files: external_exports.array(StorePackageFileSchema).min(1).max(24)
27060
+ }).refine((m) => m.files.filter((f) => f.role === "main").length === 1, "exactly one file must be the app itself").refine((m) => new Set(m.files.map((f) => f.name.toLowerCase())).size === m.files.length, "file names repeat");
27061
+
26984
27062
  // src/core/schema/apps.ts
26985
27063
  var CATALOGUE_IDS = APPS.filter((a) => !a.setting).map((a) => a.id);
26986
27064
  var AppIdSchema = external_exports.enum(CATALOGUE_IDS);
@@ -27115,6 +27193,9 @@ var VpnSchema = external_exports.strictObject({
27115
27193
  var GithubSchema = external_exports.strictObject({
27116
27194
  shareToken: external_exports.boolean().describe(
27117
27195
  '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.'
27196
+ ),
27197
+ usePcLogin: external_exports.boolean().describe(
27198
+ '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.'
27118
27199
  )
27119
27200
  });
27120
27201
 
@@ -27163,7 +27244,9 @@ var SERVICE_SPECS = {
27163
27244
  warnings: [
27164
27245
  AGENT_CAN_USE,
27165
27246
  ONE_PLACE,
27166
- "A Pro seat is handed back when the sandbox stops cleanly; a sandbox closed abruptly may keep it until you return it."
27247
+ "Unity Personal is activated by signing in: sign in to Unity once in a sandbox and the licence it makes is kept for the next ones (if Unity refuses it there, sign in again).",
27248
+ "A Plus or Pro serial is activated in each sandbox and handed back when the sandbox stops cleanly; a sandbox closed abruptly may keep the seat until you remove it at id.unity.com (My Seats).",
27249
+ "A licence file taken from this PC may not work in a sandbox: Unity ties it to the computer."
27167
27250
  ],
27168
27251
  fields: [
27169
27252
  { name: "email", label: "Unity ID email", secret: false, optional: true },
@@ -27290,11 +27373,28 @@ var SERVICE_SPECS = {
27290
27373
  "Several sandboxes can use it at once: the sign-in the last one hands back is kept."
27291
27374
  ],
27292
27375
  fields: []
27376
+ },
27377
+ perplexityapp: {
27378
+ kind: "perplexityapp",
27379
+ label: "Perplexity desktop app",
27380
+ usedBy: ["perplexityapp"],
27381
+ sources: ["sandbox"],
27382
+ singleHolder: false,
27383
+ returns: true,
27384
+ maxBytes: 256 * 1024,
27385
+ warnings: [
27386
+ AGENT_CAN_USE + " It can act as you in the Perplexity app and spend your Perplexity Computer credits; the app acts on the pages it reads, which can try to steer it.",
27387
+ "Your sign-in in the Perplexity app can't be copied from this PC: Windows locks it to your PC account. Sign in once inside a sandbox and it is kept for the next ones.",
27388
+ "Only the perplexity.ai sign-in cookies are kept: never saved passwords, other sites, localStorage or history.",
27389
+ "Several sandboxes can use it at once: the sign-in the last one hands back is kept."
27390
+ ],
27391
+ fields: []
27293
27392
  }
27294
27393
  };
27295
27394
  var APP_USER_TEXT = {
27296
27395
  perplexity: "the Perplexity MCP app",
27297
- comet: "the Comet app"
27396
+ comet: "the Comet app",
27397
+ perplexityapp: "the Perplexity desktop app"
27298
27398
  };
27299
27399
  function usedByText(usedBy) {
27300
27400
  return usedBy.map((u) => u in APP_USER_TEXT ? APP_USER_TEXT[u] : u).join(" or ");
@@ -27319,7 +27419,11 @@ var AccountsSchema = external_exports.strictObject({
27319
27419
  expo: share("expo", "type the token in Accounts"),
27320
27420
  appstore: share("appstore", "import the AuthKey.p8 file in Accounts"),
27321
27421
  perplexity: share("perplexity", "type the API key in Accounts, or import it from a .env file"),
27322
- comet: share("comet", "sign in to Comet once in a sandbox: it cannot be taken from this PC")
27422
+ comet: share("comet", "sign in to Comet once in a sandbox: it cannot be taken from this PC"),
27423
+ perplexityapp: share(
27424
+ "perplexityapp",
27425
+ "sign in to the Perplexity app once in a sandbox: it cannot be taken from this PC"
27426
+ )
27323
27427
  }).describe("Service sign-ins for sandboxes (game stores, engines, app signing, Perplexity). Manage them in Accounts.");
27324
27428
 
27325
27429
  // src/core/schema/pc-installs.ts
@@ -27346,10 +27450,11 @@ var PcInstallsSchema = external_exports.strictObject({
27346
27450
  unrealAssets: external_exports.union([external_exports.literal("auto"), external_exports.boolean()]).describe(
27347
27451
  `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.`
27348
27452
  ),
27349
- unityEditors: pick2(
27350
- external_exports.string().regex(/^\d+\.\d+\.\d+[abfp]\d+$/),
27351
- "Unity editors installed with Unity Hub",
27352
- '["6000.0.32f1"]'
27453
+ unityEditors: external_exports.union([external_exports.literal("auto"), external_exports.boolean(), external_exports.array(external_exports.string().regex(/^\d+\.\d+\.\d+[abfp]\d+$/))]).describe(
27454
+ `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"]).`
27455
+ ),
27456
+ unityAssets: external_exports.union([external_exports.literal("auto"), external_exports.boolean()]).describe(
27457
+ `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.`
27353
27458
  )
27354
27459
  }).describe(
27355
27460
  "Games, engines and editors installed on this PC, mapped read-only into sandboxes (no copy, no room on the sandbox's disk)."
@@ -26091,21 +26091,35 @@ var ToolchainsSchema = external_exports.strictObject({
26091
26091
  }),
26092
26092
  unity: external_exports.strictObject({
26093
26093
  enabled: enabled(
26094
- "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.",
26094
+ "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.",
26095
26095
  "ProjectSettings/ProjectVersion.txt"
26096
26096
  ),
26097
26097
  acceptLicense: external_exports.boolean().describe(
26098
26098
  "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."
26099
26099
  ),
26100
26100
  version: external_exports.string().min(1).describe(
26101
- '"project" = the version in ProjectSettings/ProjectVersion.txt, or an editor version such as "6000.0.32f1".'
26101
+ `"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).`
26102
26102
  ),
26103
26103
  modules: external_exports.array(external_exports.string().regex(/^[a-z0-9-]+$/)).describe(
26104
26104
  `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).`
26105
26105
  ),
26106
- hub: external_exports.boolean().describe("Also Unity Hub, with the installed editors listed in it."),
26106
+ hub: external_exports.boolean().describe(
26107
+ "Also Unity Hub (kept on the data disk), for signing in to Unity Personal and installing editors by hand."
26108
+ ),
26107
26109
  keepVersions: external_exports.number().int().min(1).max(20).describe(
26108
26110
  "How many editor versions to keep in tools\\unity; older ones are removed (the least recently used first)."
26111
+ ),
26112
+ mcp: external_exports.boolean().describe(
26113
+ "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."
26114
+ ),
26115
+ agentSkills: external_exports.boolean().describe(
26116
+ "Unity's skills for Claude Code and Codex, from Unity-Technologies/skills at the commit the Unity CLI pins."
26117
+ ),
26118
+ cliVersion: external_exports.string().regex(/^(latest|\d+\.\d+\.\d+(-[A-Za-z0-9.]+)?)$/).describe(
26119
+ '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.'
26120
+ ),
26121
+ assetCache: external_exports.enum(["persisted", "pc", "local"]).describe(
26122
+ `"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).`
26109
26123
  )
26110
26124
  }),
26111
26125
  godot: external_exports.strictObject({
@@ -26257,7 +26271,7 @@ var ToolchainsSchema = external_exports.strictObject({
26257
26271
  }),
26258
26272
  cli: external_exports.strictObject({
26259
26273
  gh: EnabledSchema.describe(
26260
- '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.'
26274
+ '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.'
26261
26275
  ),
26262
26276
  zstd: EnabledSchema.describe('Zstandard (zstd). "auto" = off; set true to get it.'),
26263
26277
  openssl: EnabledSchema.describe(
@@ -26312,6 +26326,9 @@ var COMET_SIGNER = {
26312
26326
  subject: ['(^|, )CN="?PERPLEXITY AI, INC\\.?"?(,|$)', '(^|, )O="?PERPLEXITY AI, INC\\.?"?(,|$)'],
26313
26327
  issuer: ["^CN=GlobalSign GCC R45 EV CodeSigning CA 2020(,|$)"]
26314
26328
  };
26329
+ var PERPLEXITY_DESKTOP_PRODUCT_ID = "9P9XG917PWCJ";
26330
+ var PERPLEXITY_DESKTOP_PACKAGE = "PerplexityAI.PerplexityApp";
26331
+ var PERPLEXITY_DESKTOP_FAMILY = "PerplexityAI.PerplexityApp_3jh4kjrg4dzr2";
26315
26332
  var EDGE_EXE = "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe";
26316
26333
  var AGENTS_WEB_APPS = [
26317
26334
  {
@@ -26358,6 +26375,22 @@ var AGENTS_WEB_APPS = [
26358
26375
  signer: COMET_SIGNER,
26359
26376
  userOnly: true
26360
26377
  },
26378
+ {
26379
+ id: "perplexity-desktop",
26380
+ name: "Perplexity (desktop app)",
26381
+ category: "agents",
26382
+ about: "Perplexity's desktop app, with Perplexity Computer, from the Microsoft Store. The package comes from this PC (winget with your own Microsoft Store access) and is kept on the data disk; the sandbox installs it on every boot. With accounts.perplexityapp.share on, your sign-in made in a sandbox is kept for the next ones (it cannot be copied from this PC). It acts on what it reads: use it only on what you would let it act on.",
26383
+ size: "300 MB",
26384
+ source: {
26385
+ store: {
26386
+ productId: PERPLEXITY_DESKTOP_PRODUCT_ID,
26387
+ packageName: PERPLEXITY_DESKTOP_PACKAGE,
26388
+ family: PERPLEXITY_DESKTOP_FAMILY
26389
+ }
26390
+ },
26391
+ exe: "",
26392
+ userOnly: true
26393
+ },
26361
26394
  {
26362
26395
  id: "comet-mcp",
26363
26396
  name: "Comet MCP",
@@ -26411,6 +26444,8 @@ var AGENTS_WEB_APPS = [
26411
26444
  ];
26412
26445
 
26413
26446
  // src/shared/apps/catalogue-gamedev.ts
26447
+ var UNITY_MCP_VERSION = "10.3.0";
26448
+ var OPENUPM_CLI_VERSION = "4.5.3";
26414
26449
  var GAMEDEV_APPS = [
26415
26450
  {
26416
26451
  id: "krita",
@@ -26480,6 +26515,34 @@ var GAMEDEV_APPS = [
26480
26515
  size: "60 MB",
26481
26516
  source: { github: "nomacs/nomacs", asset: "^nomacs-portable-win\\.zip$" },
26482
26517
  exe: "nomacs.exe"
26518
+ },
26519
+ {
26520
+ id: "unity-mcp",
26521
+ name: "MCP for Unity",
26522
+ category: "agents",
26523
+ about: "Lets Claude Code and Codex work in an open Unity editor (CoplayDev/unity-mcp 10.3.0, MIT; Unity 2021.3 to 6.x). Your project needs its package (Unity page: Add the editor bridge). Telemetry is off.",
26524
+ size: "60 MB",
26525
+ source: { locked: "uv", package: "mcpforunityserver", version: UNITY_MCP_VERSION },
26526
+ exe: "mcp-for-unity.exe",
26527
+ service: true,
26528
+ mcp: {
26529
+ name: "sbx-unity-mcp",
26530
+ program: true,
26531
+ args: ["--transport", "stdio"],
26532
+ env: { DISABLE_TELEMETRY: "1", UNITY_MCP_DISABLE_TELEMETRY: "1", MCP_DISABLE_TELEMETRY: "1" },
26533
+ codex: true
26534
+ },
26535
+ plugsInto: "Claude Code and Codex as the MCP server sbx-unity-mcp",
26536
+ userOnly: true
26537
+ },
26538
+ {
26539
+ id: "openupm-cli",
26540
+ name: "openupm-cli",
26541
+ category: "gamedev",
26542
+ about: "Adds OpenUPM packages to Unity projects from the command line (openupm 4.5.3, BSD-3-Clause).",
26543
+ size: "15 MB",
26544
+ source: { locked: "npm", package: "openupm-cli", version: OPENUPM_CLI_VERSION },
26545
+ exe: "openupm.cmd"
26483
26546
  }
26484
26547
  ];
26485
26548
 
@@ -27354,6 +27417,21 @@ var CORE_APPS = [
27354
27417
  ];
27355
27418
  var APPS = [...CORE_APPS, ...GAMEDEV_APPS, ...MODDING_APPS, ...MOBILE_APPS, ...AGENTS_WEB_APPS];
27356
27419
 
27420
+ // src/shared/apps/store-package.ts
27421
+ var GB = 1024 * 1024 * 1024;
27422
+ var FILE_NAME = /^[A-Za-z0-9._~+-]{1,200}\.(msix|appx|msixbundle|appxbundle)$/i;
27423
+ var StorePackageFileSchema = external_exports.strictObject({
27424
+ name: external_exports.string().regex(FILE_NAME),
27425
+ role: external_exports.enum(["main", "dependency"]),
27426
+ sha256: external_exports.string().regex(/^[0-9a-f]{64}$/),
27427
+ bytes: external_exports.number().int().positive().max(2 * GB)
27428
+ });
27429
+ var StorePackageManifestSchema = external_exports.strictObject({
27430
+ productId: external_exports.string().regex(/^[A-Z0-9]{12}$/),
27431
+ fetchedAt: external_exports.string().max(40),
27432
+ files: external_exports.array(StorePackageFileSchema).min(1).max(24)
27433
+ }).refine((m) => m.files.filter((f) => f.role === "main").length === 1, "exactly one file must be the app itself").refine((m) => new Set(m.files.map((f) => f.name.toLowerCase())).size === m.files.length, "file names repeat");
27434
+
27357
27435
  // src/core/schema/apps.ts
27358
27436
  var CATALOGUE_IDS = APPS.filter((a) => !a.setting).map((a) => a.id);
27359
27437
  var AppIdSchema = external_exports.enum(CATALOGUE_IDS);
@@ -27488,6 +27566,9 @@ var VpnSchema = external_exports.strictObject({
27488
27566
  var GithubSchema = external_exports.strictObject({
27489
27567
  shareToken: external_exports.boolean().describe(
27490
27568
  '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.'
27569
+ ),
27570
+ usePcLogin: external_exports.boolean().describe(
27571
+ '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.'
27491
27572
  )
27492
27573
  });
27493
27574
 
@@ -27536,7 +27617,9 @@ var SERVICE_SPECS = {
27536
27617
  warnings: [
27537
27618
  AGENT_CAN_USE,
27538
27619
  ONE_PLACE,
27539
- "A Pro seat is handed back when the sandbox stops cleanly; a sandbox closed abruptly may keep it until you return it."
27620
+ "Unity Personal is activated by signing in: sign in to Unity once in a sandbox and the licence it makes is kept for the next ones (if Unity refuses it there, sign in again).",
27621
+ "A Plus or Pro serial is activated in each sandbox and handed back when the sandbox stops cleanly; a sandbox closed abruptly may keep the seat until you remove it at id.unity.com (My Seats).",
27622
+ "A licence file taken from this PC may not work in a sandbox: Unity ties it to the computer."
27540
27623
  ],
27541
27624
  fields: [
27542
27625
  { name: "email", label: "Unity ID email", secret: false, optional: true },
@@ -27663,11 +27746,28 @@ var SERVICE_SPECS = {
27663
27746
  "Several sandboxes can use it at once: the sign-in the last one hands back is kept."
27664
27747
  ],
27665
27748
  fields: []
27749
+ },
27750
+ perplexityapp: {
27751
+ kind: "perplexityapp",
27752
+ label: "Perplexity desktop app",
27753
+ usedBy: ["perplexityapp"],
27754
+ sources: ["sandbox"],
27755
+ singleHolder: false,
27756
+ returns: true,
27757
+ maxBytes: 256 * 1024,
27758
+ warnings: [
27759
+ AGENT_CAN_USE + " It can act as you in the Perplexity app and spend your Perplexity Computer credits; the app acts on the pages it reads, which can try to steer it.",
27760
+ "Your sign-in in the Perplexity app can't be copied from this PC: Windows locks it to your PC account. Sign in once inside a sandbox and it is kept for the next ones.",
27761
+ "Only the perplexity.ai sign-in cookies are kept: never saved passwords, other sites, localStorage or history.",
27762
+ "Several sandboxes can use it at once: the sign-in the last one hands back is kept."
27763
+ ],
27764
+ fields: []
27666
27765
  }
27667
27766
  };
27668
27767
  var APP_USER_TEXT = {
27669
27768
  perplexity: "the Perplexity MCP app",
27670
- comet: "the Comet app"
27769
+ comet: "the Comet app",
27770
+ perplexityapp: "the Perplexity desktop app"
27671
27771
  };
27672
27772
  function usedByText(usedBy) {
27673
27773
  return usedBy.map((u) => u in APP_USER_TEXT ? APP_USER_TEXT[u] : u).join(" or ");
@@ -27692,7 +27792,11 @@ var AccountsSchema = external_exports.strictObject({
27692
27792
  expo: share("expo", "type the token in Accounts"),
27693
27793
  appstore: share("appstore", "import the AuthKey.p8 file in Accounts"),
27694
27794
  perplexity: share("perplexity", "type the API key in Accounts, or import it from a .env file"),
27695
- comet: share("comet", "sign in to Comet once in a sandbox: it cannot be taken from this PC")
27795
+ comet: share("comet", "sign in to Comet once in a sandbox: it cannot be taken from this PC"),
27796
+ perplexityapp: share(
27797
+ "perplexityapp",
27798
+ "sign in to the Perplexity app once in a sandbox: it cannot be taken from this PC"
27799
+ )
27696
27800
  }).describe("Service sign-ins for sandboxes (game stores, engines, app signing, Perplexity). Manage them in Accounts.");
27697
27801
 
27698
27802
  // src/core/schema/pc-installs.ts
@@ -27719,10 +27823,11 @@ var PcInstallsSchema = external_exports.strictObject({
27719
27823
  unrealAssets: external_exports.union([external_exports.literal("auto"), external_exports.boolean()]).describe(
27720
27824
  `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.`
27721
27825
  ),
27722
- unityEditors: pick2(
27723
- external_exports.string().regex(/^\d+\.\d+\.\d+[abfp]\d+$/),
27724
- "Unity editors installed with Unity Hub",
27725
- '["6000.0.32f1"]'
27826
+ unityEditors: external_exports.union([external_exports.literal("auto"), external_exports.boolean(), external_exports.array(external_exports.string().regex(/^\d+\.\d+\.\d+[abfp]\d+$/))]).describe(
27827
+ `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"]).`
27828
+ ),
27829
+ unityAssets: external_exports.union([external_exports.literal("auto"), external_exports.boolean()]).describe(
27830
+ `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.`
27726
27831
  )
27727
27832
  }).describe(
27728
27833
  "Games, engines and editors installed on this PC, mapped read-only into sandboxes (no copy, no room on the sandbox's disk)."
@@ -28406,8 +28511,8 @@ var InstallRecordSchema = external_exports.object({
28406
28511
  var InstallRecordsSchema = external_exports.object({ installs: external_exports.array(InstallRecordSchema).max(1e3) });
28407
28512
 
28408
28513
  // src/guest/toolchains/persisted.ts
28409
- var GB = 1024 ** 3;
28410
- var LOCAL_RESERVE_BYTES = 13 * GB;
28514
+ var GB2 = 1024 ** 3;
28515
+ var LOCAL_RESERVE_BYTES = 13 * GB2;
28411
28516
  var MARKER = ".complete.json";
28412
28517
  var MAX_WALK = 2e6;
28413
28518
  var NAME = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/;
@@ -28421,7 +28526,7 @@ function checkSpec(spec) {
28421
28526
  function freeBytes(dir, deps = {}) {
28422
28527
  return freeBytesAt(dir, deps.statfs) ?? 0;
28423
28528
  }
28424
- var gb = (bytes) => (bytes / GB).toFixed(1) + " GB";
28529
+ var gb = (bytes) => (bytes / GB2).toFixed(1) + " GB";
28425
28530
  function assertRoom(dir, needBytes, what, fix, deps = {}) {
28426
28531
  const free = freeBytes(dir, deps);
28427
28532
  if (free < needBytes)
@@ -29236,10 +29341,12 @@ var SteamPayloadSchema = external_exports.strictObject({
29236
29341
  });
29237
29342
  var UnityPayloadSchema = external_exports.strictObject({
29238
29343
  ulf: external_exports.string().min(1).max(128 * KB).optional(),
29344
+ /** The named-user licence (UnityEntitlementLicense.xml) a Unity sign-in makes. */
29345
+ entitlement: external_exports.string().min(1).max(128 * KB).optional(),
29239
29346
  email: external_exports.string().email().max(256).optional(),
29240
29347
  password: secretText(1024).optional(),
29241
29348
  serial: secretText(64).optional()
29242
- });
29349
+ }).refine((p) => Object.keys(p).length > 0, "empty Unity sign-in");
29243
29350
  var CfxPayloadSchema = external_exports.strictObject({
29244
29351
  licenseKey: external_exports.string().max(256).regex(/^cfxk_[A-Za-z0-9_]+$/),
29245
29352
  steamWebApiKey: external_exports.string().regex(/^[A-F0-9]{32}$/).optional()
@@ -29292,6 +29399,7 @@ var CometCookieSchema = external_exports.strictObject({
29292
29399
  var CometPayloadSchema = external_exports.strictObject({
29293
29400
  cookies: external_exports.array(CometCookieSchema).min(1).max(MAX_COMET_COOKIES)
29294
29401
  });
29402
+ var PerplexityAppPayloadSchema = CometPayloadSchema;
29295
29403
  var ServiceAccountsSchema = external_exports.strictObject({
29296
29404
  epic: EpicPayloadSchema.optional(),
29297
29405
  steam: SteamPayloadSchema.optional(),
@@ -29302,7 +29410,8 @@ var ServiceAccountsSchema = external_exports.strictObject({
29302
29410
  expo: ExpoPayloadSchema.optional(),
29303
29411
  appstore: AppstorePayloadSchema.optional(),
29304
29412
  perplexity: PerplexityPayloadSchema.optional(),
29305
- comet: CometPayloadSchema.optional()
29413
+ comet: CometPayloadSchema.optional(),
29414
+ perplexityapp: PerplexityAppPayloadSchema.optional()
29306
29415
  });
29307
29416
  var LaunchIdSchema = external_exports.string().regex(/^[A-Za-z0-9-]{1,64}$/);
29308
29417
 
@@ -29444,8 +29553,8 @@ function readScript(file2) {
29444
29553
  // src/guest/toolchains/steam/apps.ts
29445
29554
  import fs19 from "node:fs";
29446
29555
  import path23 from "node:path";
29447
- var GB2 = 1024 ** 3;
29448
- var DEFAULT_APP_NEED_BYTES = 5 * GB2;
29556
+ var GB3 = 1024 ** 3;
29557
+ var DEFAULT_APP_NEED_BYTES = 5 * GB3;
29449
29558
  var STEAM_APPS_RECORD = "steam-apps";
29450
29559
  var MAX_WALK2 = 2e6;
29451
29560
  var MAX_MANIFEST_BYTES = 256 * 1024;
@@ -29534,7 +29643,7 @@ function installedApps(deps = {}) {
29534
29643
  }
29535
29644
 
29536
29645
  // src/guest/devtools/steam.ts
29537
- var GB3 = 1024 ** 3;
29646
+ var GB4 = 1024 ** 3;
29538
29647
  var USAGE2 = [
29539
29648
  "Usage: sbx-steam <command>",
29540
29649
  " login <account> sign in to SteamCMD (it asks for the password and Steam Guard code)",
@@ -29592,7 +29701,7 @@ function account(p, anonymousOk) {
29592
29701
  async function steamCmd(args2) {
29593
29702
  return spawnAsync(requireSteamCmd(), args2, { cwd: STEAMCMD_DIR, stdio: "inherit", windowsHide: false });
29594
29703
  }
29595
- var gb2 = (bytes) => bytes === null ? "size unknown" : (bytes / GB3).toFixed(2) + " GB";
29704
+ var gb2 = (bytes) => bytes === null ? "size unknown" : (bytes / GB4).toFixed(2) + " GB";
29596
29705
  async function login(p) {
29597
29706
  const name2 = p.words[1] ?? p.values.get("--user");
29598
29707
  if (!name2) throw new Error("Usage: sbx-steam login <account name>");
@@ -29609,9 +29718,9 @@ async function app(p) {
29609
29718
  const appId = checkAppId(p.words[1] ?? "");
29610
29719
  const given = p.values.get("--dir");
29611
29720
  const dir = given ? path24.resolve(given) : steamAppDir(appId);
29612
- const needGb = Number(p.values.get("--need-gb") ?? DEFAULT_APP_NEED_BYTES / GB3);
29721
+ const needGb = Number(p.values.get("--need-gb") ?? DEFAULT_APP_NEED_BYTES / GB4);
29613
29722
  if (!Number.isFinite(needGb) || needGb < 0 || needGb > 1e4) throw new Error("--need-gb takes a number of GB");
29614
- assertAppRoom(dir, needGb * GB3, "app " + appId);
29723
+ assertAppRoom(dir, needGb * GB4, "app " + appId);
29615
29724
  fs20.mkdirSync(dir, { recursive: true });
29616
29725
  const beta = p.values.get("--beta");
29617
29726
  const code = await steamCmd(
@@ -29634,7 +29743,7 @@ async function workshop(p) {
29634
29743
  const appId = checkAppId(p.words[2] ?? "");
29635
29744
  const items = p.words.slice(3);
29636
29745
  const cache = workshopCache();
29637
- assertAppRoom(cache, GB3, "workshop items");
29746
+ assertAppRoom(cache, GB4, "workshop items");
29638
29747
  fs20.mkdirSync(cache, { recursive: true });
29639
29748
  const code = await steamCmd(
29640
29749
  workshopGetArgs({ appId, items, dir: cache, login: account(p, true), validate: p.flags.has("--validate") })
@@ -29738,15 +29847,8 @@ var steamTool = {
29738
29847
  }
29739
29848
  };
29740
29849
 
29741
- // src/guest/devtools/unity.ts
29742
- var unityTool = {
29743
- name: "unity",
29744
- summary: "install editors, list them, build with -executeMethod, the licence status",
29745
- run: () => notAvailableYet("unity")
29746
- };
29747
-
29748
29850
  // src/guest/devtools/registry.ts
29749
- var DEVTOOLS = [steamTool, fivemTool, unityTool, androidTool];
29851
+ var DEVTOOLS = [steamTool, fivemTool, androidTool];
29750
29852
  function devToolByName(name2) {
29751
29853
  return DEVTOOLS.find((t) => t.name === name2);
29752
29854
  }