windows-development-sandbox 1.20.0 → 1.23.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 (331) hide show
  1. package/config.example.json +8 -1
  2. package/dist/app/features/access/access.def.js +5 -2
  3. package/dist/app/features/access/access.run.js +7 -3
  4. package/dist/app/features/accounts/accounts.def.d.ts +29 -1
  5. package/dist/app/features/accounts/accounts.def.js +10 -4
  6. package/dist/app/features/accounts/accounts.run.d.ts +1 -0
  7. package/dist/app/features/accounts/accounts.run.js +7 -2
  8. package/dist/app/features/accounts/services.def.d.ts +4 -1
  9. package/dist/app/features/accounts/services.def.js +15 -14
  10. package/dist/app/features/accounts/services.run.d.ts +1 -0
  11. package/dist/app/features/accounts/services.run.js +41 -15
  12. package/dist/app/features/defs.d.ts +39 -2
  13. package/dist/app/features/engine/engine.run.js +1 -1
  14. package/dist/app/features/github/github.def.d.ts +44 -3
  15. package/dist/app/features/github/github.def.js +145 -63
  16. package/dist/app/features/github/github.run.d.ts +9 -2
  17. package/dist/app/features/github/github.run.js +43 -5
  18. package/dist/app/features/health/health.def.js +8 -2
  19. package/dist/app/features/logs/logs.def.js +0 -8
  20. package/dist/app/features/projects/projects.def.js +2 -2
  21. package/dist/app/features/projects/projects.run.js +5 -5
  22. package/dist/app/features/sandbox/sandbox.def.js +7 -3
  23. package/dist/app/features/sessions/sessions.def.d.ts +4 -4
  24. package/dist/app/features/sessions/sessions.def.js +0 -5
  25. package/dist/app/features/sessions/sessions.run.d.ts +1 -1
  26. package/dist/app/features/sessions/sessions.run.js +2 -2
  27. package/dist/app/features/settings/categories.def.js +2 -0
  28. package/dist/app/features/settings/settings-rows.js +1 -1
  29. package/dist/app/features/settings/settings.def.js +1 -1
  30. package/dist/app/features/settings/settings.run.js +3 -3
  31. package/dist/app/features/storage/storage.run.js +18 -9
  32. package/dist/app/features/updates/update-lines.js +2 -2
  33. package/dist/app/features/updates/updates.def.js +1 -1
  34. package/dist/app/features/updates/updates.run.js +1 -1
  35. package/dist/app/features/web/web.def.js +2 -2
  36. package/dist/app/features/web/web.run.js +12 -4
  37. package/dist/app/kernel/errors.d.ts +7 -0
  38. package/dist/app/kernel/errors.js +18 -3
  39. package/dist/app/kernel/rpc.d.ts +5 -0
  40. package/dist/app/kernel/view.d.ts +11 -1
  41. package/dist/bin/agent-sandbox.js +2 -2
  42. package/dist/bin/{chunk-DK4NTBUF.js → chunk-JETGP2C3.js} +172 -48
  43. package/dist/bin/{chunk-2IMT7ZCT.js → chunk-XZKOPGNH.js} +1 -1
  44. package/dist/bin/{chunk-Z2P5OGKL.js → chunk-ZTTOF5V3.js} +2430 -1688
  45. package/dist/bin/claude-host.js +2 -2
  46. package/dist/bin/claude-sbx.js +2 -2
  47. package/dist/bin/codex-sbx.js +2 -2
  48. package/dist/bin/gemini-sbx.js +2 -2
  49. package/dist/bin/sandbox.js +2 -2
  50. package/dist/bin/sbx-hide.js +2 -2
  51. package/dist/bin/sbx-show.js +2 -2
  52. package/dist/cli/manifest.d.ts +2 -2
  53. package/dist/cli/manifest.js +2 -1
  54. package/dist/cli/menu/coverage-exempt.d.ts +17 -0
  55. package/dist/cli/menu/coverage-exempt.js +61 -0
  56. package/dist/cli/menu/io-menu.d.ts +2 -0
  57. package/dist/cli/menu/io-menu.js +50 -5
  58. package/dist/cli/menu/pages/accounts-page.js +1 -1
  59. package/dist/cli/menu/pages/agents-page.js +8 -2
  60. package/dist/cli/menu/pages/maintenance-page.d.ts +6 -0
  61. package/dist/cli/menu/pages/maintenance-page.js +9 -2
  62. package/dist/cli/menu/pages/sessions-page.d.ts +2 -0
  63. package/dist/cli/menu/pages/sessions-page.js +12 -4
  64. package/dist/cli/menu/pages/settings-page.js +12 -1
  65. package/dist/cli/menu/remote-menu.js +1 -1
  66. package/dist/cli/menu/shell.d.ts +5 -0
  67. package/dist/cli/menu/shell.js +13 -0
  68. package/dist/cli/report.js +2 -0
  69. package/dist/cli/tui/app.d.ts +5 -0
  70. package/dist/cli/tui/app.js +2 -0
  71. package/dist/core/config/defaults.js +3 -1
  72. package/dist/core/schema/accounts.d.ts +6 -0
  73. package/dist/core/schema/accounts.js +13 -11
  74. package/dist/core/schema/config.d.ts +20 -8
  75. package/dist/core/schema/config.js +4 -4
  76. package/dist/core/schema/github.js +1 -1
  77. package/dist/core/schema/profile.js +8 -4
  78. package/dist/core/schema/resume.js +1 -1
  79. package/dist/core/schema/sandbox.js +3 -3
  80. package/dist/core/schema/vpn.js +1 -1
  81. package/dist/core/schema/web.js +3 -3
  82. package/dist/core/types.d.ts +6 -0
  83. package/dist/core/util/errors.d.ts +11 -1
  84. package/dist/core/util/errors.js +7 -1
  85. package/dist/core/util/index.d.ts +1 -1
  86. package/dist/core/util/index.js +1 -1
  87. package/dist/guest/accounts/adapter.d.ts +2 -0
  88. package/dist/guest/accounts/adapters.js +4 -0
  89. package/dist/guest/accounts/apply.d.ts +6 -2
  90. package/dist/guest/accounts/kinds/cfx.d.ts +7 -0
  91. package/dist/guest/accounts/kinds/cfx.js +33 -3
  92. package/dist/guest/accounts/kinds/comet.d.ts +7 -0
  93. package/dist/guest/accounts/kinds/comet.js +50 -0
  94. package/dist/guest/accounts/kinds/perplexity.d.ts +2 -0
  95. package/dist/guest/accounts/kinds/perplexity.js +12 -0
  96. package/dist/guest/accounts/watch.d.ts +2 -0
  97. package/dist/guest/accounts/watch.js +12 -2
  98. package/dist/guest/agents/agent-installer.js +1 -1
  99. package/dist/guest/agents/profile-links.d.ts +2 -0
  100. package/dist/guest/agents/profile-links.js +18 -4
  101. package/dist/guest/apps/after-install.js +19 -0
  102. package/dist/guest/apps/app-installer.d.ts +11 -0
  103. package/dist/guest/apps/app-installer.js +69 -6
  104. package/dist/guest/apps/comet-unpack.d.ts +20 -0
  105. package/dist/guest/apps/comet-unpack.js +127 -0
  106. package/dist/guest/apps/index.d.ts +1 -1
  107. package/dist/guest/apps/index.js +1 -1
  108. package/dist/guest/apps/resolvers-agents-web.d.ts +2 -0
  109. package/dist/guest/apps/resolvers-agents-web.js +7 -0
  110. package/dist/guest/apps/resolvers.js +2 -0
  111. package/dist/guest/apps/shortcuts.d.ts +2 -0
  112. package/dist/guest/apps/shortcuts.js +1 -0
  113. package/dist/guest/apps/unpack.js +14 -4
  114. package/dist/guest/boot/boot.d.ts +45 -16
  115. package/dist/guest/boot/boot.js +316 -145
  116. package/dist/guest/boot/graph.d.ts +252 -0
  117. package/dist/guest/boot/graph.js +257 -0
  118. package/dist/guest/boot/guide-lines.d.ts +25 -0
  119. package/dist/guest/boot/guide-lines.js +41 -0
  120. package/dist/guest/boot/guide.d.ts +1 -4
  121. package/dist/guest/boot/guide.js +6 -8
  122. package/dist/guest/boot/runner.d.ts +77 -0
  123. package/dist/guest/boot/runner.js +215 -0
  124. package/dist/guest/browser/cdp.d.ts +71 -0
  125. package/dist/guest/browser/cdp.js +306 -0
  126. package/dist/guest/browser/comet.d.ts +28 -0
  127. package/dist/guest/browser/comet.js +155 -0
  128. package/dist/guest/daemon/project-provisioner.js +6 -1
  129. package/dist/guest/devtools/fivem.d.ts +1 -1
  130. package/dist/guest/devtools/fivem.js +243 -3
  131. package/dist/guest/entries/daemon.js +2 -0
  132. package/dist/guest/runtime/log.d.ts +12 -0
  133. package/dist/guest/runtime/log.js +29 -5
  134. package/dist/guest/runtime/pools.d.ts +24 -0
  135. package/dist/guest/runtime/pools.js +60 -0
  136. package/dist/guest/runtime/process.d.ts +4 -0
  137. package/dist/guest/runtime/process.js +38 -1
  138. package/dist/guest/runtime/status.d.ts +5 -1
  139. package/dist/guest/runtime/status.js +19 -0
  140. package/dist/guest/setup/addon-mcp.d.ts +1 -1
  141. package/dist/guest/setup/addon-mcp.js +52 -12
  142. package/dist/guest/setup/agent-addons.d.ts +3 -2
  143. package/dist/guest/setup/agent-addons.js +12 -3
  144. package/dist/guest/setup/environment.d.ts +1 -1
  145. package/dist/guest/setup/environment.js +25 -12
  146. package/dist/guest/setup/headroom.d.ts +8 -3
  147. package/dist/guest/setup/headroom.js +44 -15
  148. package/dist/guest/setup/path-plan.d.ts +28 -0
  149. package/dist/guest/setup/path-plan.js +69 -2
  150. package/dist/guest/setup/shell-path.d.ts +1 -1
  151. package/dist/guest/setup/shell-path.js +3 -3
  152. package/dist/guest/toolchains/fivem/artifacts.d.ts +48 -1
  153. package/dist/guest/toolchains/fivem/artifacts.js +97 -4
  154. package/dist/guest/toolchains/fivem/fivem.d.ts +32 -1
  155. package/dist/guest/toolchains/fivem/fivem.js +168 -3
  156. package/dist/guest/toolchains/fivem/scaffold.d.ts +35 -0
  157. package/dist/guest/toolchains/fivem/scaffold.js +105 -0
  158. package/dist/guest/toolchains/fivem/serve-plan.d.ts +34 -0
  159. package/dist/guest/toolchains/fivem/serve-plan.js +61 -0
  160. package/dist/guest/toolchains/languages/go.js +1 -1
  161. package/dist/guest/toolchains/languages/node.js +2 -1
  162. package/dist/guest/toolchains/languages/php.d.ts +2 -0
  163. package/dist/guest/toolchains/languages/php.js +13 -1
  164. package/dist/guest/toolchains/languages/python-tools.js +1 -1
  165. package/dist/guest/toolchains/languages/ruby.js +1 -1
  166. package/dist/guest/toolchains/native/binstall.js +1 -1
  167. package/dist/guest/toolchains/native/msvc/packages.js +10 -4
  168. package/dist/guest/toolchains/native/rust.d.ts +2 -0
  169. package/dist/guest/toolchains/native/rust.js +11 -4
  170. package/dist/guest/toolchains/native/unreal.d.ts +2 -0
  171. package/dist/guest/toolchains/native/unreal.js +16 -6
  172. package/dist/guest/toolchains/native/vcruntime.d.ts +2 -0
  173. package/dist/guest/toolchains/native/vcruntime.js +10 -2
  174. package/dist/guest/toolchains/native/visual-studio.d.ts +3 -0
  175. package/dist/guest/toolchains/native/visual-studio.js +44 -26
  176. package/dist/guest/toolchains/native/vs-request.d.ts +2 -0
  177. package/dist/guest/toolchains/native/vs-request.js +2 -0
  178. package/dist/guest/toolchains/plan.js +19 -8
  179. package/dist/guest/toolchains/scheduler.d.ts +2 -21
  180. package/dist/guest/toolchains/scheduler.js +7 -121
  181. package/dist/guest/toolchains/setup.d.ts +15 -2
  182. package/dist/guest/toolchains/setup.js +39 -20
  183. package/dist/guest/toolchains/split.d.ts +28 -0
  184. package/dist/guest/toolchains/split.js +60 -0
  185. package/dist/guest/toolchains/steam/client.js +2 -1
  186. package/dist/guest/toolchains/step-scheduler.d.ts +51 -0
  187. package/dist/guest/toolchains/step-scheduler.js +147 -0
  188. package/dist/guest/toolchains/step.d.ts +13 -0
  189. package/dist/guest/toolchains/tools/git.js +18 -0
  190. package/dist/guest/vpn/openvpn.js +3 -4
  191. package/dist/guest/vpn/wireguard.js +11 -4
  192. package/dist/host/accounts/deliver.js +7 -0
  193. package/dist/host/accounts/handoff.js +2 -6
  194. package/dist/host/accounts/index.d.ts +1 -1
  195. package/dist/host/accounts/index.js +1 -1
  196. package/dist/host/accounts/kinds/cfx.d.ts +1 -1
  197. package/dist/host/accounts/kinds/cfx.js +47 -4
  198. package/dist/host/accounts/kinds/comet.d.ts +2 -0
  199. package/dist/host/accounts/kinds/comet.js +6 -0
  200. package/dist/host/accounts/kinds/perplexity.d.ts +2 -0
  201. package/dist/host/accounts/kinds/perplexity.js +30 -0
  202. package/dist/host/accounts/leases.d.ts +7 -1
  203. package/dist/host/accounts/leases.js +13 -2
  204. package/dist/host/accounts/source.d.ts +7 -1
  205. package/dist/host/accounts/source.js +27 -0
  206. package/dist/host/accounts/sources.js +4 -0
  207. package/dist/host/github/deliver.d.ts +1 -1
  208. package/dist/host/github/deliver.js +20 -1
  209. package/dist/host/github/index.d.ts +2 -1
  210. package/dist/host/github/index.js +1 -0
  211. package/dist/host/github/token.d.ts +13 -1
  212. package/dist/host/github/token.js +19 -2
  213. package/dist/host/github/verify.d.ts +27 -0
  214. package/dist/host/github/verify.js +61 -0
  215. package/dist/host/launch/hints/fivem.d.ts +3 -1
  216. package/dist/host/launch/hints/fivem.js +68 -2
  217. package/dist/host/launch/session-file.js +4 -0
  218. package/dist/host/launch/toolchains.d.ts +2 -1
  219. package/dist/host/launch/toolchains.js +5 -3
  220. package/dist/host/vpn/nordvpn.d.ts +2 -4
  221. package/dist/host/vpn/nordvpn.js +2 -24
  222. package/dist/runtime/agent.js +405 -90
  223. package/dist/runtime/daemon.js +3010 -1383
  224. package/dist/runtime/db.js +333 -90
  225. package/dist/runtime/main.js +4720 -1954
  226. package/dist/runtime/netproxy.js +286 -69
  227. package/dist/runtime/tool.js +2852 -1780
  228. package/dist/runtime/view.js +286 -69
  229. package/dist/selftest/agent-paths.test.js +39 -1
  230. package/dist/selftest/agents-web.test.d.ts +2 -0
  231. package/dist/selftest/agents-web.test.js +647 -0
  232. package/dist/selftest/app.test.js +5 -2
  233. package/dist/selftest/boot-runner.test.d.ts +2 -0
  234. package/dist/selftest/boot-runner.test.js +456 -0
  235. package/dist/selftest/channel.test.js +15 -0
  236. package/dist/selftest/fivem.test.js +249 -3
  237. package/dist/selftest/github.test.js +94 -9
  238. package/dist/selftest/guest-boot.test.js +3 -0
  239. package/dist/selftest/health.test.js +1 -1
  240. package/dist/selftest/index.js +8 -0
  241. package/dist/selftest/layout.test.js +5 -0
  242. package/dist/selftest/menu-coverage.test.d.ts +2 -0
  243. package/dist/selftest/menu-coverage.test.js +46 -0
  244. package/dist/selftest/menu-screens.js +37 -1
  245. package/dist/selftest/persisted-installs.test.js +6 -3
  246. package/dist/selftest/service-accounts.test.js +3 -2
  247. package/dist/selftest/support/engine-golden.js +27 -0
  248. package/dist/selftest/support/fixtures.d.ts +6 -0
  249. package/dist/selftest/support/web-preview.d.ts +34 -1
  250. package/dist/selftest/support/web-preview.js +21 -18
  251. package/dist/selftest/toolchains.test.js +23 -1
  252. package/dist/selftest/ui-text.test.d.ts +7 -0
  253. package/dist/selftest/ui-text.test.js +300 -0
  254. package/dist/shared/accounts/index.d.ts +2 -0
  255. package/dist/shared/accounts/index.js +2 -0
  256. package/dist/shared/accounts/kinds/comet.d.ts +12 -0
  257. package/dist/shared/accounts/kinds/comet.js +64 -0
  258. package/dist/shared/accounts/kinds/perplexity.d.ts +8 -0
  259. package/dist/shared/accounts/kinds/perplexity.js +37 -0
  260. package/dist/shared/accounts/kinds.d.ts +24 -5
  261. package/dist/shared/accounts/kinds.js +86 -4
  262. package/dist/shared/accounts/payloads.d.ts +81 -0
  263. package/dist/shared/accounts/payloads.js +39 -1
  264. package/dist/shared/apps/agent-addons.d.ts +33 -5
  265. package/dist/shared/apps/agent-addons.js +95 -3
  266. package/dist/shared/apps/catalogue-agents-web.d.ts +14 -0
  267. package/dist/shared/apps/catalogue-agents-web.js +112 -0
  268. package/dist/shared/apps/catalogue-modding.js +32 -1
  269. package/dist/shared/apps/catalogue.d.ts +27 -3
  270. package/dist/shared/apps/catalogue.js +2 -1
  271. package/dist/shared/apps/index.d.ts +3 -1
  272. package/dist/shared/apps/index.js +3 -1
  273. package/dist/shared/channel/schema.d.ts +21 -3
  274. package/dist/shared/channel/schema.js +7 -0
  275. package/dist/shared/channel/secrets.d.ts +19 -0
  276. package/dist/shared/concurrency/index.d.ts +3 -0
  277. package/dist/shared/concurrency/index.js +3 -0
  278. package/dist/shared/concurrency/installer-retry.d.ts +6 -0
  279. package/dist/shared/concurrency/installer-retry.js +10 -0
  280. package/dist/shared/concurrency/limiter.d.ts +19 -0
  281. package/dist/shared/concurrency/limiter.js +67 -0
  282. package/dist/shared/concurrency/pools.d.ts +7 -0
  283. package/dist/shared/concurrency/pools.js +9 -0
  284. package/dist/shared/download/archive.d.ts +2 -0
  285. package/dist/shared/download/archive.js +11 -1
  286. package/dist/shared/download/bounded-fetch.d.ts +13 -0
  287. package/dist/shared/download/bounded-fetch.js +40 -0
  288. package/dist/shared/download/downloader.d.ts +5 -0
  289. package/dist/shared/download/downloader.js +50 -38
  290. package/dist/shared/download/index.d.ts +2 -1
  291. package/dist/shared/download/index.js +2 -1
  292. package/dist/shared/readiness.d.ts +2 -2
  293. package/dist/shared/readiness.js +2 -2
  294. package/dist/web/index.html +1 -1
  295. package/dist/web/{main-OUUQYNK4.js → main-CCILLX2M.js} +67 -67
  296. package/native/csharp/HcsHost/AssemblyInfo.cs +3 -3
  297. package/native/csharp/HostTools/AssemblyInfo.cs +3 -3
  298. package/native/csharp/StorageHelper/AssemblyInfo.cs +3 -3
  299. package/package.json +1 -1
  300. package/sandbox/addons/browser-use-mcp/requirements.in +1 -0
  301. package/sandbox/addons/browser-use-mcp/requirements.txt +2350 -0
  302. package/sandbox/addons/chrome-devtools-mcp/package-lock.json +38 -0
  303. package/sandbox/addons/chrome-devtools-mcp/package.json +7 -0
  304. package/sandbox/addons/comet-mcp/package-lock.json +1277 -0
  305. package/sandbox/addons/comet-mcp/package.json +7 -0
  306. package/sandbox/addons/perplexity-mcp/package-lock.json +1655 -0
  307. package/sandbox/addons/perplexity-mcp/package.json +7 -0
  308. package/sandbox/scripts/add-firewall-port.ps1 +18 -4
  309. package/sandbox/scripts/set-machine-environment.ps1 +30 -15
  310. package/sandbox/templates/fivem/README.txt +6 -2
  311. package/sandbox/templates/fivem/cs/Client/Client.csproj +15 -0
  312. package/sandbox/templates/fivem/cs/Client/ClientMain.cs +20 -0
  313. package/sandbox/templates/fivem/cs/Server/Server.csproj +14 -0
  314. package/sandbox/templates/fivem/cs/Server/ServerMain.cs +20 -0
  315. package/sandbox/templates/fivem/cs/fxmanifest.lua +11 -0
  316. package/sandbox/templates/fivem/js/client.js +12 -0
  317. package/sandbox/templates/fivem/js/fxmanifest.lua +9 -0
  318. package/sandbox/templates/fivem/js/server.js +6 -0
  319. package/sandbox/templates/fivem/lua/client.lua +8 -0
  320. package/sandbox/templates/fivem/lua/fxmanifest.lua +10 -0
  321. package/sandbox/templates/fivem/lua/server.lua +6 -0
  322. package/sandbox/templates/fivem/server.cfg +37 -0
  323. package/sandbox/templates/fivem/ts/build.js +17 -0
  324. package/sandbox/templates/fivem/ts/fxmanifest.lua +9 -0
  325. package/sandbox/templates/fivem/ts/package.json +16 -0
  326. package/sandbox/templates/fivem/ts/src/client/client.ts +12 -0
  327. package/sandbox/templates/fivem/ts/src/client/tsconfig.json +13 -0
  328. package/sandbox/templates/fivem/ts/src/server/server.ts +6 -0
  329. package/sandbox/templates/fivem/ts/src/server/tsconfig.json +13 -0
  330. package/schemas/config.schema.json +56 -27
  331. package/schemas/sandbox-config.schema.json +37 -14
@@ -722,11 +722,11 @@ var require_lodash = __commonJS({
722
722
  function unicodeWords(string4) {
723
723
  return string4.match(reUnicodeWord) || [];
724
724
  }
725
- var runInContext = (function runInContext2(context) {
726
- context = context == null ? root : _2.defaults(root.Object(), context, _2.pick(root, contextProps));
727
- var Array2 = context.Array, Date2 = context.Date, Error2 = context.Error, Function2 = context.Function, Math2 = context.Math, Object2 = context.Object, RegExp2 = context.RegExp, String2 = context.String, TypeError2 = context.TypeError;
725
+ var runInContext = (function runInContext2(context2) {
726
+ context2 = context2 == null ? root : _2.defaults(root.Object(), context2, _2.pick(root, contextProps));
727
+ var Array2 = context2.Array, Date2 = context2.Date, Error2 = context2.Error, Function2 = context2.Function, Math2 = context2.Math, Object2 = context2.Object, RegExp2 = context2.RegExp, String2 = context2.String, TypeError2 = context2.TypeError;
728
728
  var arrayProto = Array2.prototype, funcProto = Function2.prototype, objectProto = Object2.prototype;
729
- var coreJsData = context["__core-js_shared__"];
729
+ var coreJsData = context2["__core-js_shared__"];
730
730
  var funcToString = funcProto.toString;
731
731
  var hasOwnProperty = objectProto.hasOwnProperty;
732
732
  var idCounter = 0;
@@ -740,7 +740,7 @@ var require_lodash = __commonJS({
740
740
  var reIsNative = RegExp2(
741
741
  "^" + funcToString.call(hasOwnProperty).replace(reRegExpChar, "\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, "$1.*?") + "$"
742
742
  );
743
- var Buffer2 = moduleExports ? context.Buffer : undefined2, Symbol2 = context.Symbol, Uint8Array2 = context.Uint8Array, allocUnsafe = Buffer2 ? Buffer2.allocUnsafe : undefined2, getPrototype = overArg(Object2.getPrototypeOf, Object2), objectCreate = Object2.create, propertyIsEnumerable = objectProto.propertyIsEnumerable, splice = arrayProto.splice, spreadableSymbol = Symbol2 ? Symbol2.isConcatSpreadable : undefined2, symIterator = Symbol2 ? Symbol2.iterator : undefined2, symToStringTag = Symbol2 ? Symbol2.toStringTag : undefined2;
743
+ var Buffer2 = moduleExports ? context2.Buffer : undefined2, Symbol2 = context2.Symbol, Uint8Array2 = context2.Uint8Array, allocUnsafe = Buffer2 ? Buffer2.allocUnsafe : undefined2, getPrototype = overArg(Object2.getPrototypeOf, Object2), objectCreate = Object2.create, propertyIsEnumerable = objectProto.propertyIsEnumerable, splice = arrayProto.splice, spreadableSymbol = Symbol2 ? Symbol2.isConcatSpreadable : undefined2, symIterator = Symbol2 ? Symbol2.iterator : undefined2, symToStringTag = Symbol2 ? Symbol2.toStringTag : undefined2;
744
744
  var defineProperty = (function() {
745
745
  try {
746
746
  var func = getNative(Object2, "defineProperty");
@@ -749,9 +749,9 @@ var require_lodash = __commonJS({
749
749
  } catch (e) {
750
750
  }
751
751
  })();
752
- var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout, ctxNow = Date2 && Date2.now !== root.Date.now && Date2.now, ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;
753
- var nativeCeil = Math2.ceil, nativeFloor = Math2.floor, nativeGetSymbols = Object2.getOwnPropertySymbols, nativeIsBuffer = Buffer2 ? Buffer2.isBuffer : undefined2, nativeIsFinite = context.isFinite, nativeJoin = arrayProto.join, nativeKeys = overArg(Object2.keys, Object2), nativeMax = Math2.max, nativeMin = Math2.min, nativeNow = Date2.now, nativeParseInt = context.parseInt, nativeRandom = Math2.random, nativeReverse = arrayProto.reverse;
754
- var DataView = getNative(context, "DataView"), Map2 = getNative(context, "Map"), Promise2 = getNative(context, "Promise"), Set2 = getNative(context, "Set"), WeakMap2 = getNative(context, "WeakMap"), nativeCreate = getNative(Object2, "create");
752
+ var ctxClearTimeout = context2.clearTimeout !== root.clearTimeout && context2.clearTimeout, ctxNow = Date2 && Date2.now !== root.Date.now && Date2.now, ctxSetTimeout = context2.setTimeout !== root.setTimeout && context2.setTimeout;
753
+ var nativeCeil = Math2.ceil, nativeFloor = Math2.floor, nativeGetSymbols = Object2.getOwnPropertySymbols, nativeIsBuffer = Buffer2 ? Buffer2.isBuffer : undefined2, nativeIsFinite = context2.isFinite, nativeJoin = arrayProto.join, nativeKeys = overArg(Object2.keys, Object2), nativeMax = Math2.max, nativeMin = Math2.min, nativeNow = Date2.now, nativeParseInt = context2.parseInt, nativeRandom = Math2.random, nativeReverse = arrayProto.reverse;
754
+ var DataView = getNative(context2, "DataView"), Map2 = getNative(context2, "Map"), Promise2 = getNative(context2, "Promise"), Set2 = getNative(context2, "Set"), WeakMap2 = getNative(context2, "WeakMap"), nativeCreate = getNative(Object2, "create");
755
755
  var metaMap = WeakMap2 && new WeakMap2();
756
756
  var realNames = {};
757
757
  var dataViewCtorString = toSource(DataView), mapCtorString = toSource(Map2), promiseCtorString = toSource(Promise2), setCtorString = toSource(Set2), weakMapCtorString = toSource(WeakMap2);
@@ -25402,15 +25402,17 @@ var SecretsSchema = external_exports.strictObject({
25402
25402
  )
25403
25403
  });
25404
25404
  var AttachSchema = external_exports.strictObject({
25405
- enabled: external_exports.boolean().describe("Allow sandbox claude --terminal / sandbox attach from this PC."),
25405
+ enabled: external_exports.boolean().describe(
25406
+ "Allow attaching this PC's terminal to a session (the terminal option when starting an agent, and attach)."
25407
+ ),
25406
25408
  reuseSession: external_exports.boolean().describe(
25407
- "sandbox claude -t in a running sandbox reattaches to this folder's session when no terminal on this PC is attached to it (--new always starts another)."
25409
+ "Starting an agent with a terminal in a running sandbox reattaches to this folder's session when no terminal on this PC is attached to it (starting a new session on purpose always starts another)."
25408
25410
  ),
25409
25411
  auto: external_exports.boolean().describe(
25410
25412
  "Starting an agent attaches this terminal automatically, as if you passed -t (only in an interactive terminal)."
25411
25413
  ),
25412
25414
  autoHide: external_exports.boolean().describe(
25413
- "Hide the Windows Sandbox window whenever this terminal attaches; it keeps running (sandbox show brings it back)."
25415
+ "Hide the Windows Sandbox window whenever this terminal attaches; it keeps running (Sandbox > Status shows it again)."
25414
25416
  ),
25415
25417
  confirmCtrlC: external_exports.boolean().describe(
25416
25418
  'In an attached terminal and the sandbox window, a single Ctrl+C is held back (the title says so) and only a second one within 1.5 seconds reaches the agent: a Ctrl+C meant as "copy" no longer stops it. Esc still stops an agent.'
@@ -25427,7 +25429,7 @@ var ClaudeProfileSchema = external_exports.strictObject({
25427
25429
  hostDir: external_exports.string().describe('Your Claude folder, or "auto" (~/.claude or CLAUDE_CONFIG_DIR).'),
25428
25430
  include: external_exports.array(external_exports.string().regex(/^[A-Za-z0-9._-]+$/)).describe("Files and folders copied from it."),
25429
25431
  globalStateFile: external_exports.string().describe('Your .claude.json, or "auto". Empty string = do not copy.'),
25430
- copyCredentials: external_exports.boolean().describe("Copy your Claude LOGIN into the sandbox. Prefer sandbox account instead."),
25432
+ copyCredentials: external_exports.boolean().describe("Copy your Claude LOGIN into the sandbox. Prefer saving the login in Accounts instead."),
25431
25433
  overwrite: external_exports.boolean().describe("Refresh these settings from this PC on every launch."),
25432
25434
  sharePluginsAcrossAccounts: external_exports.boolean().describe(
25433
25435
  "When you switch Claude accounts, copy your Claude plugins (and which ones are enabled) into a data set that has none yet. Off by default: plugins are code that runs in your sessions."
@@ -25456,7 +25458,7 @@ var MappingSchema = external_exports.strictObject({
25456
25458
  });
25457
25459
  var SandboxSchema = external_exports.strictObject({
25458
25460
  engine: external_exports.enum(["windows-sandbox", "hcs"]).describe(
25459
- '(alpha) What runs the sandbox. "windows-sandbox" = Windows Sandbox (the default: desktop, Windows Terminal, GPU, clipboard, audio, printers). "hcs" = a headless Hyper-V isolated Server Core container for agents (no desktop, GPU or clipboard); it needs Windows features and an image on this PC (sandbox engine check hcs lists what is missing), and starting it is not enabled yet in this alpha. sandbox engine shows what each engine can do. Yours only: a project file (.sandbox-config.json) cannot set it.'
25461
+ '(alpha) What runs the sandbox. "windows-sandbox" = Windows Sandbox (the default: desktop, Windows Terminal, GPU, clipboard, audio, printers). "hcs" = a headless Hyper-V isolated Server Core container for agents (no desktop, GPU or clipboard); it needs Windows features and an image on this PC (Maintenance > Engine lists what is missing), and starting it is not enabled yet in this alpha. Maintenance > Engine shows what each engine can do. Yours only: a project file (.sandbox-config.json) cannot set it.'
25460
25462
  ),
25461
25463
  memoryMb: external_exports.union([external_exports.literal("auto"), external_exports.number().int().min(2048)]).describe(
25462
25464
  'Sandbox RAM in MB (>= 2048), or "auto": free RAM minus reserveHostMb, capped at maxMemoryMb. Never more than this PC can keep in RAM for it (its RAM minus the larger of reserveHostMb and 25 %, 4 GB more with vGPU): a bigger value is lowered.'
@@ -25483,7 +25485,7 @@ var SandboxSchema = external_exports.strictObject({
25483
25485
  ),
25484
25486
  networking: external_exports.boolean().describe("Internet access. false is the only hard network isolation Windows Sandbox offers."),
25485
25487
  clipboard: external_exports.boolean().describe(
25486
- "Shared clipboard between this PC and the sandbox. Also lets an agent's copy (in sandbox attach) reach this PC's clipboard."
25488
+ "Shared clipboard between this PC and the sandbox. Also lets an agent's copy (in an attached terminal) reach this PC's clipboard."
25487
25489
  ),
25488
25490
  audioInput: external_exports.boolean().describe("Microphone access."),
25489
25491
  videoInput: external_exports.boolean().describe("Camera access."),
@@ -25534,7 +25536,7 @@ var NetworkSchema = external_exports.strictObject({
25534
25536
  });
25535
25537
  var AuditSchema = external_exports.strictObject({
25536
25538
  enabled: external_exports.boolean().describe(
25537
- "Keep an audit log on this PC of what your agents did: programs started (with their command lines, secrets hidden), files changed in the projects, git commits, sessions, and what the repo guard caught, each linked to the agent session that did it where that can be known. The sandbox cannot change it. Read it with sandbox audit or on the Activity page."
25539
+ "Keep an audit log on this PC of what your agents did: programs started (with their command lines, secrets hidden), files changed in the projects, git commits, sessions, and what the repo guard caught, each linked to the agent session that did it where that can be known. The sandbox cannot change it. Read it on the Activity page."
25538
25540
  ),
25539
25541
  days: external_exports.number().int().min(1).max(365).describe(
25540
25542
  "Days the audit log is kept (1 to 30; a larger number keeps 30); older days are deleted when a sandbox starts and once a day."
@@ -25878,6 +25880,114 @@ var ToolchainsSchema = external_exports.strictObject({
25878
25880
  )
25879
25881
  });
25880
25882
 
25883
+ // src/shared/apps/catalogue-agents-web.ts
25884
+ var PERPLEXITY_MCP_VERSION = "1.3.0";
25885
+ var COMET_MCP_VERSION = "2.3.0";
25886
+ var CHROME_DEVTOOLS_MCP_VERSION = "1.12.0";
25887
+ var BROWSER_USE_VERSION = "0.13.14";
25888
+ var PERPLEXITY_COMPUTER_MCP_URL = "https://www.perplexity.ai/rest/computer/mcp";
25889
+ var COMET_SIGNER = {
25890
+ subject: ['^CN="?PERPLEXITY AI, INC\\.?"?(,|$)', '(^|, )O="?PERPLEXITY AI, INC\\.?"?(,|$)'],
25891
+ issuer: ["^CN=GlobalSign GCC R45 EV CodeSigning CA 2020(,|$)"]
25892
+ };
25893
+ var EDGE_EXE = "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe";
25894
+ var AGENTS_WEB_APPS = [
25895
+ {
25896
+ id: "perplexity-mcp",
25897
+ name: "Perplexity MCP (API)",
25898
+ category: "agents",
25899
+ about: "Web search, answers and deep research from Perplexity's API in Claude Code and Codex (perplexity_search, perplexity_ask, perplexity_research, perplexity_reason): Perplexity's own @perplexity-ai/mcp-server. Needs your Perplexity API key in Accounts; API use is billed separately from Perplexity Pro.",
25900
+ size: "30 MB",
25901
+ source: { locked: "npm", package: "@perplexity-ai/mcp-server", version: PERPLEXITY_MCP_VERSION },
25902
+ exe: "perplexity-mcp.cmd",
25903
+ service: true,
25904
+ mcp: {
25905
+ name: "sbx-perplexity",
25906
+ script: "node_modules/@perplexity-ai/mcp-server/dist/index.js",
25907
+ envVars: ["PERPLEXITY_API_KEY"],
25908
+ codex: true
25909
+ },
25910
+ plugsInto: "Claude Code and Codex as the MCP server sbx-perplexity; the key comes from Accounts as PERPLEXITY_API_KEY, never from a file",
25911
+ userOnly: true
25912
+ },
25913
+ {
25914
+ id: "perplexity-computer-mcp",
25915
+ name: "Perplexity Computer MCP",
25916
+ category: "agents",
25917
+ about: "Hands tasks to Perplexity Computer, Perplexity's cloud agent (it browses and works in its own cloud computer), from Claude Code and Codex: Perplexity's official remote MCP server. Nothing is installed. Sign in with your Perplexity account the first time (Claude Code: /mcp; Codex: codex mcp login sbx-perplexity-computer); tasks spend your Computer credits.",
25918
+ size: "0 MB",
25919
+ source: { remote: true },
25920
+ exe: "",
25921
+ service: true,
25922
+ mcp: { name: "sbx-perplexity-computer", url: PERPLEXITY_COMPUTER_MCP_URL, codex: true },
25923
+ plugsInto: "Claude Code and Codex as the remote MCP server sbx-perplexity-computer; its sign-in is kept with your agent login",
25924
+ userOnly: true
25925
+ },
25926
+ {
25927
+ id: "comet",
25928
+ name: "Comet (Perplexity browser)",
25929
+ category: "browsers",
25930
+ about: "Perplexity's agentic browser (Chromium), unpacked to run portable with its own profile on the sandbox's disk. With accounts.comet.share on, your perplexity.ai sign-in is kept for the next sandboxes. Its assistant acts on the pages it reads, so a page can try to steer it: browse only what you would let it act on.",
25931
+ size: "600 MB",
25932
+ source: { resolve: "comet" },
25933
+ unpack: "chromium",
25934
+ exe: "comet.exe",
25935
+ needs: ["7zip"],
25936
+ signer: COMET_SIGNER,
25937
+ userOnly: true
25938
+ },
25939
+ {
25940
+ id: "comet-mcp",
25941
+ name: "Comet MCP",
25942
+ category: "agents",
25943
+ about: "Lets Claude Code and Codex hand web tasks to Comet's own assistant and read its answers (hanzili/comet-mcp). Needs the Comet app: start Comet from its shortcut first, so the agent uses the sandbox's Comet profile and your sign-in.",
25944
+ size: "15 MB",
25945
+ source: { locked: "npm", package: "comet-mcp", version: COMET_MCP_VERSION },
25946
+ exe: "comet-mcp.cmd",
25947
+ service: true,
25948
+ mcp: { name: "sbx-comet", script: "node_modules/comet-mcp/dist/index.js", codex: true },
25949
+ plugsInto: "Claude Code and Codex as the MCP server sbx-comet, talking to Comet's DevTools on 127.0.0.1:9222",
25950
+ userOnly: true
25951
+ },
25952
+ {
25953
+ id: "chrome-devtools-mcp",
25954
+ name: "Chrome DevTools MCP",
25955
+ category: "agents",
25956
+ about: "Lets Claude Code and Codex drive and inspect a browser with DevTools: navigate, click, read the console and network, record performance traces (ChromeDevTools/chrome-devtools-mcp). It starts Microsoft Edge with a throwaway profile; Google's usage statistics and CrUX lookups are off.",
25957
+ size: "40 MB",
25958
+ source: { locked: "npm", package: "chrome-devtools-mcp", version: CHROME_DEVTOOLS_MCP_VERSION },
25959
+ exe: "chrome-devtools-mcp.cmd",
25960
+ service: true,
25961
+ mcp: {
25962
+ name: "sbx-chrome-devtools",
25963
+ script: "node_modules/chrome-devtools-mcp/build/src/bin/chrome-devtools-mcp.js",
25964
+ args: ["--executablePath", EDGE_EXE, "--isolated", "--no-usage-statistics", "--no-performance-crux"],
25965
+ codex: true
25966
+ },
25967
+ plugsInto: "Claude Code and Codex as the MCP server sbx-chrome-devtools (with Edge)",
25968
+ userOnly: true
25969
+ },
25970
+ {
25971
+ id: "browser-use-mcp",
25972
+ name: "Browser Use MCP",
25973
+ category: "agents",
25974
+ about: "Browser automation for agents from Browser Use (browser-use --mcp): open pages, click, type, read them, and hand a whole task to Browser Use's own agent (that one needs an OpenAI or Anthropic API key). It finds Edge in the sandbox; its telemetry is off.",
25975
+ size: "250 MB",
25976
+ source: { locked: "uv", package: "browser-use", version: BROWSER_USE_VERSION },
25977
+ exe: "browser-use.exe",
25978
+ service: true,
25979
+ mcp: {
25980
+ name: "sbx-browser-use",
25981
+ program: true,
25982
+ args: ["--mcp"],
25983
+ env: { ANONYMIZED_TELEMETRY: "false" },
25984
+ codex: true
25985
+ },
25986
+ plugsInto: "Claude Code and Codex as the MCP server sbx-browser-use",
25987
+ userOnly: true
25988
+ }
25989
+ ];
25990
+
25881
25991
  // src/shared/apps/catalogue-gamedev.ts
25882
25992
  var GAMEDEV_APPS = [];
25883
25993
 
@@ -25885,7 +25995,38 @@ var GAMEDEV_APPS = [];
25885
25995
  var MOBILE_APPS = [];
25886
25996
 
25887
25997
  // src/shared/apps/catalogue-modding.ts
25888
- var MODDING_APPS = [];
25998
+ var MODDING_APPS = [
25999
+ {
26000
+ id: "lua-language-server",
26001
+ name: "Lua Language Server",
26002
+ category: "cli",
26003
+ about: "The Lua language server (LuaLS): completion, diagnostics and go-to-definition for Lua in editors and agents that speak LSP. FiveM resources use Lua 5.4 (lua54 in fxmanifest.lua).",
26004
+ size: "15 MB",
26005
+ source: { github: "LuaLS/lua-language-server", asset: "^lua-language-server-[\\d.]+-win32-x64\\.zip$" },
26006
+ exe: "lua-language-server.exe",
26007
+ cli: true
26008
+ },
26009
+ {
26010
+ id: "stylua",
26011
+ name: "StyLua",
26012
+ category: "cli",
26013
+ about: "An opinionated Lua formatter (`stylua .`), configured with a stylua.toml in the project.",
26014
+ size: "6 MB",
26015
+ source: { github: "JohnnyMorganz/StyLua", asset: "^stylua-windows-x86_64\\.zip$" },
26016
+ exe: "stylua.exe",
26017
+ cli: true
26018
+ },
26019
+ {
26020
+ id: "selene",
26021
+ name: "selene",
26022
+ category: "cli",
26023
+ about: 'A Lua linter (`selene .`), configured with a selene.toml (std = "lua54", and a standard library file for the FiveM / RedM globals).',
26024
+ size: "7 MB",
26025
+ source: { github: "Kampfkarren/selene", asset: "^selene-[\\d.]+-windows\\.zip$" },
26026
+ exe: "selene.exe",
26027
+ cli: true
26028
+ }
26029
+ ];
25889
26030
 
25890
26031
  // src/shared/apps/catalogue.ts
25891
26032
  var gh = (github, asset) => ({ github, asset });
@@ -26719,7 +26860,7 @@ var CORE_APPS = [
26719
26860
  cli: true
26720
26861
  }
26721
26862
  ];
26722
- var APPS = [...CORE_APPS, ...GAMEDEV_APPS, ...MODDING_APPS, ...MOBILE_APPS];
26863
+ var APPS = [...CORE_APPS, ...GAMEDEV_APPS, ...MODDING_APPS, ...MOBILE_APPS, ...AGENTS_WEB_APPS];
26723
26864
 
26724
26865
  // src/core/schema/apps.ts
26725
26866
  var CATALOGUE_IDS = APPS.filter((a) => !a.setting).map((a) => a.id);
@@ -26789,7 +26930,7 @@ var ProjectsSchema = external_exports.strictObject({
26789
26930
  var RESUME_SESSIONS = ["ask", "always", "afterCrash", "never"];
26790
26931
  var ResumeSchema = external_exports.strictObject({
26791
26932
  sessions: external_exports.enum(RESUME_SESSIONS).describe(
26792
- 'When a sandbox starts after one that had agent sessions: "ask" lists them and asks whether to reopen them (without a terminal it prints the command sandbox resume), "always" reopens them, "afterCrash" reopens them only when the last sandbox ended unexpectedly, "never" leaves it to sandbox resume. Terminal tabs you opened yourself in the sandbox are never reopened.'
26933
+ 'When a sandbox starts after one that had agent sessions: "ask" lists them and asks whether to reopen them (without a terminal it only says they can be reopened), "always" reopens them, "afterCrash" reopens them only when the last sandbox ended unexpectedly, "never" leaves it to you (Sessions reopens them). Terminal tabs you opened yourself in the sandbox are never reopened.'
26793
26934
  ),
26794
26935
  restartAfterCrash: external_exports.boolean().describe(
26795
26936
  "When the sandbox ends because Windows Sandbox crashed or ran out of memory, start it again by itself and reopen its sessions (at most 3 times in 6 hours)."
@@ -26808,14 +26949,14 @@ var RemoteUserSchema = external_exports.strictObject({
26808
26949
  });
26809
26950
  var WebLanSchema = external_exports.strictObject({
26810
26951
  enabled: external_exports.boolean().describe(
26811
- "(Beta) Devices on your network (a phone): an HTTPS address on this PC for devices you pair with a one-time code (sandbox web pair). Needs a firewall rule (sandbox web lan on asks Windows once). Off: every paired device is signed out."
26952
+ "(Beta) Devices on your network (a phone): an HTTPS address on this PC for devices you pair with a one-time code (Remote access). Needs a firewall rule (turning it on asks Windows once). Off: every paired device is signed out."
26812
26953
  ),
26813
26954
  port: external_exports.number().int().min(1024).max(65535).describe("HTTPS port for paired devices on your network."),
26814
26955
  address: external_exports.string().trim().max(15).regex(/^$|^\d{1,3}(\.\d{1,3}){3}$/, "an IPv4 address or empty").describe("This PC's private address to listen on. Empty: the one of its network adapter (never a public one).")
26815
26956
  });
26816
26957
  var WebRemoteSchema = external_exports.strictObject({
26817
26958
  windowsSignIn: external_exports.boolean().describe(
26818
- "(Beta) Other Windows users of this PC named in web.remote.users sign in to your web UI (and sandbox remote) with their own Windows account: no password, no link."
26959
+ "(Beta) Other Windows users of this PC named in web.remote.users sign in to your web UI (and the remote menu) with their own Windows account: no password, no link."
26819
26960
  ),
26820
26961
  users: external_exports.array(RemoteUserSchema).max(32).describe("Who else may sign in with Windows, and their role (view or control)."),
26821
26962
  rememberDays: external_exports.number().int().min(1).max(90).describe(
@@ -26825,7 +26966,7 @@ var WebRemoteSchema = external_exports.strictObject({
26825
26966
  });
26826
26967
  var WebSchema = external_exports.strictObject({
26827
26968
  enabled: external_exports.boolean().describe(
26828
- "(Beta) The web UI: your sandbox sessions in a browser on this PC (http://127.0.0.1:<port>, this PC only). On: every sandbox start also starts it in the background (it keeps running until sandbox web stop or a restart of the PC). Off: only sandbox web start runs it. Open it signed in with sandbox web open."
26969
+ "(Beta) The web UI: your sessions in a browser on this PC (http://127.0.0.1:<port>, this PC only). On: every start of a sandbox also starts it in the background (it keeps running until you stop it in Maintenance > Web UI or restart the PC). Off: it runs only when you start it there. Open it signed in from the same page."
26829
26970
  ),
26830
26971
  port: external_exports.number().int().min(1024).max(65535).describe("Port of the web UI on 127.0.0.1 (this PC only). Pick another when it is taken."),
26831
26972
  openOnLaunch: external_exports.boolean().describe("(Beta) With the web UI on: open it in your browser, already signed in, every time a sandbox starts."),
@@ -26836,7 +26977,7 @@ var WebSchema = external_exports.strictObject({
26836
26977
  var VPN_PROVIDERS = ["nordvpn", "openvpn-file", "wireguard-file"];
26837
26978
  var VpnSchema = external_exports.strictObject({
26838
26979
  enabled: external_exports.boolean().describe(
26839
- "(Alpha: not yet tried on a real PC) Send the sandbox's traffic through a VPN. Only the sandbox: your PC's own connection is untouched. Needs a saved login first (sandbox vpn login). The agent in the sandbox can read that login and can turn the tunnel off (it is the administrator there)."
26980
+ "(Alpha: not yet tried on a real PC) Send the sandbox's traffic through a VPN. Only the sandbox: your PC's own connection is untouched. Needs a saved login first (Settings > Network > VPN). The agent in the sandbox can read that login and can turn the tunnel off (it is the administrator there)."
26840
26981
  ),
26841
26982
  provider: external_exports.enum(VPN_PROVIDERS).describe(
26842
26983
  "nordvpn: a recommended NordVPN server is picked at every launch. openvpn-file: your own .ovpn file (configFile). wireguard-file: your own WireGuard .conf (configFile), e.g. from your company."
@@ -26854,13 +26995,14 @@ var VpnSchema = external_exports.strictObject({
26854
26995
  // src/core/schema/github.ts
26855
26996
  var GithubSchema = external_exports.strictObject({
26856
26997
  shareToken: external_exports.boolean().describe(
26857
- 'Give each sandbox the GitHub token you saved with `sandbox github login` (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.'
26998
+ '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.'
26858
26999
  )
26859
27000
  });
26860
27001
 
26861
27002
  // src/shared/accounts/kinds.ts
26862
27003
  var AGENT_CAN_USE = "The agent in the sandbox can use this sign-in while it is there.";
26863
27004
  var ONE_PLACE = "It works in one sandbox at a time: a second sandbox starts without it while the first one runs.";
27005
+ var PERPLEXITY_KEY_PATTERN = /^pplx-[A-Za-z0-9_-]{8,200}$/;
26864
27006
  var SERVICE_SPECS = {
26865
27007
  epic: {
26866
27008
  kind: "epic",
@@ -26914,19 +27056,28 @@ var SERVICE_SPECS = {
26914
27056
  kind: "cfx",
26915
27057
  label: "Cfx.re (FiveM / RedM server key)",
26916
27058
  usedBy: ["fivem"],
26917
- sources: ["typed"],
27059
+ sources: ["typed", "file"],
26918
27060
  singleHolder: false,
26919
27061
  returns: false,
27062
+ // `import cfx --from` reads a whole server.cfg (they often run to tens of KB); the payload itself is tiny.
26920
27063
  maxBytes: 4 * 1024,
27064
+ maxFileBytes: 256 * 1024,
26921
27065
  warnings: [AGENT_CAN_USE + " Anyone with the key can run a server under your Cfx.re account."],
26922
27066
  fields: [
26923
- { name: "licenseKey", label: "Server licence key (cfxk_...)", secret: true, pattern: /^cfxk_[A-Za-z0-9_]+$/ },
27067
+ {
27068
+ name: "licenseKey",
27069
+ label: "Server licence key (cfxk_...)",
27070
+ secret: true,
27071
+ pattern: /^cfxk_[A-Za-z0-9_]+$/,
27072
+ only: "typed"
27073
+ },
26924
27074
  {
26925
27075
  name: "steamWebApiKey",
26926
27076
  label: "Steam Web API key (optional)",
26927
27077
  secret: true,
26928
27078
  optional: true,
26929
- pattern: /^[A-F0-9]{32}$/
27079
+ pattern: /^[A-F0-9]{32}$/,
27080
+ only: "typed"
26930
27081
  }
26931
27082
  ]
26932
27083
  },
@@ -26980,33 +27131,77 @@ var SERVICE_SPECS = {
26980
27131
  { name: "issuerId", label: "Issuer ID", secret: false },
26981
27132
  { name: "keyId", label: "Key ID", secret: false, pattern: /^[A-Z0-9]{10}$/ }
26982
27133
  ]
27134
+ },
27135
+ perplexity: {
27136
+ kind: "perplexity",
27137
+ label: "Perplexity API key",
27138
+ usedBy: ["perplexity"],
27139
+ sources: ["pc", "file", "typed"],
27140
+ singleHolder: false,
27141
+ returns: false,
27142
+ maxBytes: 1024,
27143
+ maxFileBytes: 64 * 1024,
27144
+ warnings: [
27145
+ AGENT_CAN_USE + " It can read the key and spend your API credit: use a separate API key with a spending limit.",
27146
+ "Perplexity Pro does not include API use; the API key is billed separately.",
27147
+ "Only the variable PERPLEXITY_API_KEY of the agent gets it: nothing in the sandbox writes it to a file."
27148
+ ],
27149
+ fields: [
27150
+ {
27151
+ name: "apiKey",
27152
+ label: "Perplexity API key (pplx-...)",
27153
+ secret: true,
27154
+ pattern: PERPLEXITY_KEY_PATTERN,
27155
+ only: "typed"
27156
+ }
27157
+ ]
27158
+ },
27159
+ comet: {
27160
+ kind: "comet",
27161
+ label: "Comet (Perplexity browser)",
27162
+ usedBy: ["comet"],
27163
+ sources: ["sandbox"],
27164
+ singleHolder: false,
27165
+ returns: true,
27166
+ maxBytes: 256 * 1024,
27167
+ warnings: [
27168
+ AGENT_CAN_USE + " It can act as you in Comet and spend your Perplexity Computer credits; agentic browsing is open to prompt injection from the pages it reads.",
27169
+ "Your Comet sign-in 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.",
27170
+ "Only the perplexity.ai sign-in cookies are kept: never saved passwords, other sites, localStorage or history. Never import your main browser profile.",
27171
+ "Several sandboxes can use it at once: the sign-in the last one hands back is kept."
27172
+ ],
27173
+ fields: []
26983
27174
  }
26984
27175
  };
27176
+ var APP_USER_TEXT = {
27177
+ perplexity: "the Perplexity MCP app",
27178
+ comet: "the Comet app"
27179
+ };
27180
+ function usedByText(usedBy) {
27181
+ return usedBy.map((u) => u in APP_USER_TEXT ? APP_USER_TEXT[u] : u).join(" or ");
27182
+ }
26985
27183
 
26986
27184
  // src/core/schema/accounts.ts
26987
27185
  function share(kind, how) {
26988
27186
  const spec = SERVICE_SPECS[kind];
26989
27187
  return external_exports.strictObject({
26990
27188
  share: external_exports.boolean().describe(
26991
- "Hand your saved " + spec.label + " sign-in to sandboxes that use " + spec.usedBy.join(" or ") + " (" + how + "). Kept encrypted on this PC; " + spec.warnings.join(" ") + " Yours only: a project file can only turn it off."
27189
+ "Hand your saved " + spec.label + " sign-in to sandboxes that use " + usedByText(spec.usedBy) + " (" + how + "). Kept encrypted on this PC; " + spec.warnings.join(" ") + " Yours only: a project file can only turn it off."
26992
27190
  )
26993
27191
  });
26994
27192
  }
26995
27193
  var AccountsSchema = external_exports.strictObject({
26996
- epic: share("epic", "sign in to the launcher once in a sandbox, or take this PC's: sandbox account import epic"),
26997
- steam: share(
26998
- "steam",
26999
- "sign in once with sbx-steam login, or: sandbox account import steam --from <steamcmd folder>"
27000
- ),
27001
- unity: share("unity", "sign in once in a sandbox, or take this PC's licence: sandbox account import unity"),
27002
- cfx: share("cfx", "sandbox account login cfx"),
27003
- keystore: share("keystore", "sandbox account import keystore --from <upload.jks>"),
27004
- play: share("play", "sandbox account import play --from <service-account.json>"),
27005
- expo: share("expo", "sandbox account login expo"),
27006
- appstore: share("appstore", "sandbox account import appstore --from <AuthKey.p8>")
27007
- }).describe(
27008
- "Service sign-ins for sandboxes (game stores, engines, app signing). Manage them in Accounts: sandbox account status."
27009
- );
27194
+ epic: share("epic", "sign in to the launcher once in a sandbox, or take this PC's from Accounts"),
27195
+ steam: share("steam", "sign in once with sbx-steam login, or take it from a SteamCMD folder in Accounts"),
27196
+ unity: share("unity", "sign in once in a sandbox, or take this PC's licence from Accounts"),
27197
+ cfx: share("cfx", "type the key in Accounts"),
27198
+ keystore: share("keystore", "import the upload.jks file in Accounts"),
27199
+ play: share("play", "import the service-account.json file in Accounts"),
27200
+ expo: share("expo", "type the token in Accounts"),
27201
+ appstore: share("appstore", "import the AuthKey.p8 file in Accounts"),
27202
+ perplexity: share("perplexity", "type the API key in Accounts, or import it from a .env file"),
27203
+ comet: share("comet", "sign in to Comet once in a sandbox: it cannot be taken from this PC")
27204
+ }).describe("Service sign-ins for sandboxes (game stores, engines, app signing, Perplexity). Manage them in Accounts.");
27010
27205
 
27011
27206
  // src/core/schema/pc-installs.ts
27012
27207
  var pick2 = (item, what, example) => external_exports.union([external_exports.boolean(), external_exports.array(item)]).describe(
@@ -27070,7 +27265,9 @@ function reservedEnvName(name) {
27070
27265
  }
27071
27266
  var ConfigSchema = external_exports.strictObject({
27072
27267
  $schema: SchemaRefSchema.optional(),
27073
- defaultHarness: NameSchema.describe("Agent started by `sandbox launch` (sandbox claude always runs claude)."),
27268
+ defaultHarness: NameSchema.describe(
27269
+ "The agent that starts when you do not name one (starting claude by name always runs claude)."
27270
+ ),
27074
27271
  guestWorkspace: GuestWorkspaceSchema,
27075
27272
  readOnly: external_exports.boolean().describe("Map the workspace read-only."),
27076
27273
  workspaceFilter: WorkspaceFilterSchema,
@@ -27080,7 +27277,7 @@ var ConfigSchema = external_exports.strictObject({
27080
27277
  sharing: SharingSchema,
27081
27278
  storage: external_exports.strictObject({
27082
27279
  root: external_exports.string().min(1).describe(
27083
- "Where everything is kept on this PC (tools, databases, logins, launches). The default is a private folder for you under %ProgramData%\\AgentSandbox\\users, which works for installs for one user and for everyone. sandbox storage move <folder> moves it."
27280
+ "Where everything is kept on this PC (tools, databases, logins, launches). The default is a private folder for you under %ProgramData%\\AgentSandbox\\users, which works for installs for one user and for everyone. Maintenance > Storage moves it."
27084
27281
  ),
27085
27282
  persistAgentState: external_exports.boolean().describe("Keep agent logins and history between sandboxes."),
27086
27283
  dataName: NameSchema.describe("Name of the persistent data set (C:\\AgentData) shared by all workspaces."),
@@ -27088,11 +27285,11 @@ var ConfigSchema = external_exports.strictObject({
27088
27285
  `Programs and scripts (.exe, .ps1, .bat, .cmd, .msi, .lnk ...) that appear or change in your project while a sandbox runs get Windows' "downloaded from the internet" mark, so SmartScreen and PowerShell ask before they run on this PC.`
27089
27286
  ),
27090
27287
  contained: external_exports.enum(["off", "vhdx"]).describe(
27091
- '(beta) Keep the sandbox tools, state and logs inside one disk image file (vhdx) instead of loose folders, so scanning programs on this PC see one file. Not yet tried on a real PC. Turn it on with sandbox storage contained on (it moves your files and asks first); Windows asks for permission to mount the image when a sandbox starts. "off" = loose folders, as always. Yours only: a project file (.sandbox-config.json) cannot set it.'
27288
+ '(beta) Keep the sandbox tools, state and logs inside one disk image file (vhdx) instead of loose folders, so scanning programs on this PC see one file. Not yet tried on a real PC. Turn it on in Maintenance > Storage (it moves your files and asks first); Windows asks for permission to mount the image when a sandbox starts. "off" = loose folders, as always. Yours only: a project file (.sandbox-config.json) cannot set it.'
27092
27289
  ),
27093
27290
  containedMaxGb: external_exports.number().int().min(8).max(4096).describe("(beta) Largest size, in GB, the disk image of storage.contained may grow to."),
27094
27291
  warnDataGb: external_exports.number().min(0).describe(
27095
- "Say at launch when the persisted data (tools, databases, logins) is bigger than this many GB; 0 = never. sandbox data shows what takes the space."
27292
+ "Say at launch when the persisted data (tools, databases, logins) is bigger than this many GB; 0 = never. Maintenance > Data shows what takes the space."
27096
27293
  )
27097
27294
  }),
27098
27295
  network: NetworkSchema,
@@ -27199,6 +27396,10 @@ var BootProgressSchema = external_exports.strictObject({
27199
27396
  done: external_exports.number().int().min(0).max(1e3),
27200
27397
  total: external_exports.number().int().min(0).max(1e3)
27201
27398
  });
27399
+ var BackgroundWorkSchema = external_exports.strictObject({
27400
+ name: Text(64),
27401
+ state: external_exports.enum(["running", "done", "failed"])
27402
+ });
27202
27403
  var SandboxStatusSchema = external_exports.object({
27203
27404
  launchId: Text(64),
27204
27405
  phase: external_exports.enum(["booting", "provisioning", "ready", "failed"]),
@@ -27210,7 +27411,9 @@ var SandboxStatusSchema = external_exports.object({
27210
27411
  /** The sandbox's IPv4 addresses (for network.forwardPorts; the host only uses ones on its Hyper-V network). */
27211
27412
  addresses: external_exports.array(external_exports.string().max(45)).max(8).optional(),
27212
27413
  /** A malformed progress is dropped, never the status (the phase still counts). */
27213
- progress: BootProgressSchema.optional().catch(void 0)
27414
+ progress: BootProgressSchema.optional().catch(void 0),
27415
+ /** Installs that continue after the boot is ready; a malformed list is dropped, never the status. */
27416
+ background: external_exports.array(BackgroundWorkSchema).max(16).optional().catch(void 0)
27214
27417
  });
27215
27418
  var VersionSchema = external_exports.strictObject({ spec: Text(128), source: Text(256) });
27216
27419
  var DatabasePlanSchema = external_exports.strictObject({
@@ -27676,28 +27879,41 @@ var run = new RunDir(dataDir);
27676
27879
  // src/guest/runtime/log.ts
27677
27880
  import fs5 from "node:fs";
27678
27881
  import path7 from "node:path";
27882
+ import { AsyncLocalStorage } from "node:async_hooks";
27679
27883
  fs5.mkdirSync(logsDir, { recursive: true });
27680
27884
  var logFile = path7.join(
27681
27885
  logsDir,
27682
27886
  (process.env.AGENT_LOG_PREFIX ?? "guest") + "-" + (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-") + ".log"
27683
27887
  );
27888
+ var context = new AsyncLocalStorage();
27889
+ function fileLine(message, at = /* @__PURE__ */ new Date()) {
27890
+ return at.toISOString() + " " + message;
27891
+ }
27684
27892
  var append = (line) => {
27685
27893
  try {
27686
- fs5.appendFileSync(logFile, line + "\n");
27894
+ fs5.appendFileSync(logFile, fileLine(line) + "\n");
27687
27895
  } catch {
27688
27896
  }
27689
27897
  };
27898
+ var tagged = (message, ctx) => {
27899
+ const prefix = ctx?.prefix?.();
27900
+ return prefix ? prefix + " | " + message : message;
27901
+ };
27690
27902
  function log(message) {
27691
- console.log(message);
27692
- append(message);
27903
+ const ctx = context.getStore();
27904
+ const line = tagged(message, ctx);
27905
+ if (!ctx?.quiet) console.log(line);
27906
+ append(line);
27693
27907
  }
27694
27908
  function warn(message) {
27695
- console.warn("\x1B[33mWARNING: " + message + "\x1B[0m");
27696
- append("WARNING: " + message);
27909
+ const ctx = context.getStore();
27910
+ const line = tagged(message, ctx);
27911
+ if (!ctx?.quiet) console.warn("\x1B[33mWARNING: " + line + "\x1B[0m");
27912
+ append("WARNING: " + line);
27697
27913
  }
27698
27914
 
27699
27915
  // src/guest/runtime/project-context.ts
27700
- import { AsyncLocalStorage } from "node:async_hooks";
27916
+ import { AsyncLocalStorage as AsyncLocalStorage2 } from "node:async_hooks";
27701
27917
 
27702
27918
  // src/guest/runtime/session.ts
27703
27919
  import fs9 from "node:fs";
@@ -27777,7 +27993,11 @@ function moveIntoPlace(work, destination) {
27777
27993
  fs7.mkdirSync(path9.dirname(destination), { recursive: true });
27778
27994
  fs7.renameSync(work, destination);
27779
27995
  }
27780
- async function extractArchive(archive, destination, members2 = []) {
27996
+ var extractLimit = null;
27997
+ function extractArchive(archive, destination, members2 = []) {
27998
+ return extractLimit ? extractLimit.run(() => extract(archive, destination, members2)) : extract(archive, destination, members2);
27999
+ }
28000
+ async function extract(archive, destination, members2) {
27781
28001
  fs7.mkdirSync(destination, { recursive: true });
27782
28002
  let status = await spawnAsync(SYSTEM.tar(), ["-xf", archive, "-C", destination, ...members2]);
27783
28003
  if (status !== 0 && /\.(zip|nupkg)$/i.test(archive)) {
@@ -27812,6 +28032,8 @@ import { pipeline } from "node:stream/promises";
27812
28032
  var Downloader = class {
27813
28033
  /** downloads.requireChecksum: refuse anything without an expected hash. The guest sets it from session.json. */
27814
28034
  requireChecksum = false;
28035
+ /** The guest's net pool: how many HTTP bodies stream at once. Host code leaves it null. */
28036
+ limit = null;
27815
28037
  watcher = null;
27816
28038
  /** Reports coarse progress of the downloads that start from now on to `watcher` (null: stop). */
27817
28039
  watch(watcher) {
@@ -27829,39 +28051,42 @@ var Downloader = class {
27829
28051
  "Refusing to download " + path10.basename(destination) + " (" + url2 + "): no checksum is published for it, and downloads.requireChecksum is on. Turn that setting off to allow downloads that cannot be verified."
27830
28052
  );
27831
28053
  }
27832
- const response = await fetchRetry(url2, {}, 3, 20 * 60 * 1e3);
27833
- if (!response.body) throw new Error("Empty response for " + url2);
27834
28054
  fs8.mkdirSync(path10.dirname(destination), { recursive: true });
27835
28055
  const checks = ["sha256", "sha512", "sha1"].flatMap((kind) => {
27836
28056
  const want = sums[kind]?.trim().toLowerCase();
27837
28057
  return want ? [{ want, hash: crypto2.createHash(kind) }] : [];
27838
28058
  });
27839
- const size = Number(response.headers.get("content-length")) || 0;
27840
- const report = size > 0 ? this.watcher?.() ?? null : null;
27841
- let received = 0;
27842
- let tenth = 0;
27843
- let reportedAt = Date.now();
27844
- const tap = new Transform({
27845
- transform(chunk, _encoding, done) {
27846
- for (const c of checks) c.hash.update(chunk);
27847
- if (report) {
27848
- received += chunk.length;
27849
- const now = Math.floor(received * 10 / size);
27850
- if (now !== tenth || Date.now() - reportedAt > 5e3) {
27851
- tenth = now;
27852
- reportedAt = Date.now();
27853
- try {
27854
- report(Math.min(1, received / size));
27855
- } catch {
28059
+ const partial2 = destination + ".part";
28060
+ const transfer = async () => {
28061
+ const response = await fetchRetry(url2, {}, 3, 20 * 60 * 1e3);
28062
+ if (!response.body) throw new Error("Empty response for " + url2);
28063
+ const size = Number(response.headers.get("content-length")) || 0;
28064
+ const report = size > 0 ? this.watcher?.() ?? null : null;
28065
+ let received = 0;
28066
+ let tenth = 0;
28067
+ let reportedAt = Date.now();
28068
+ const tap = new Transform({
28069
+ transform(chunk, _encoding, done) {
28070
+ for (const c of checks) c.hash.update(chunk);
28071
+ if (report) {
28072
+ received += chunk.length;
28073
+ const now = Math.floor(received * 10 / size);
28074
+ if (now !== tenth || Date.now() - reportedAt > 5e3) {
28075
+ tenth = now;
28076
+ reportedAt = Date.now();
28077
+ try {
28078
+ report(Math.min(1, received / size));
28079
+ } catch {
28080
+ }
27856
28081
  }
27857
28082
  }
28083
+ done(null, chunk);
27858
28084
  }
27859
- done(null, chunk);
27860
- }
27861
- });
27862
- const partial2 = destination + ".part";
27863
- try {
28085
+ });
27864
28086
  await pipeline(Readable.fromWeb(response.body), tap, fs8.createWriteStream(partial2));
28087
+ };
28088
+ try {
28089
+ await (this.limit ? this.limit.run(transfer) : transfer());
27865
28090
  if (checks.some((c) => c.hash.digest("hex") !== c.want)) throw new Error("Checksum mismatch for " + url2);
27866
28091
  if (sums.verify) await sums.verify(partial2);
27867
28092
  fs8.rmSync(destination, { force: true });
@@ -27878,12 +28103,17 @@ var Downloader = class {
27878
28103
  const work = stagingFolder(destination);
27879
28104
  try {
27880
28105
  const archive = path10.join(work, options.fileName ?? path10.basename(new URL(url2).pathname));
27881
- await this.file(url2, archive, {
27882
- sha256: options.sha256,
27883
- sha512: options.sha512,
27884
- sha1: options.sha1,
27885
- ...options.verify ? { verify: options.verify } : {}
27886
- });
28106
+ if (options.cached && fs8.existsSync(options.cached)) {
28107
+ fs8.mkdirSync(work, { recursive: true });
28108
+ fs8.copyFileSync(options.cached, archive);
28109
+ fs8.rmSync(options.cached, { force: true });
28110
+ } else
28111
+ await this.file(url2, archive, {
28112
+ sha256: options.sha256,
28113
+ sha512: options.sha512,
28114
+ sha1: options.sha1,
28115
+ ...options.verify ? { verify: options.verify } : {}
28116
+ });
27887
28117
  const extracted = path10.join(work, "x");
27888
28118
  await extractArchive(archive, extracted, options.members);
27889
28119
  let root = extracted;
@@ -27982,7 +28212,7 @@ var stateDir = path11.join(dataDir, session.persistAgentState ? "state" : "state
27982
28212
  var claudeDir = path11.join(stateDir, "claude");
27983
28213
 
27984
28214
  // src/guest/runtime/project-context.ts
27985
- var store = new AsyncLocalStorage();
28215
+ var store = new AsyncLocalStorage2();
27986
28216
  function projectWorkspace() {
27987
28217
  return store.getStore()?.workspace ?? workspace;
27988
28218
  }
@@ -28020,13 +28250,13 @@ var DatabaseServer = class {
28020
28250
  // src/guest/databases/dynamodb.ts
28021
28251
  import fs17 from "node:fs";
28022
28252
  import path17 from "node:path";
28023
- import { spawn as spawn3 } from "node:child_process";
28253
+ import { spawn as spawn4 } from "node:child_process";
28024
28254
 
28025
28255
  // src/guest/runtime/process.ts
28026
28256
  import fs10 from "node:fs";
28027
28257
  import os3 from "node:os";
28028
28258
  import path12 from "node:path";
28029
- import { spawnSync as spawnSync2 } from "node:child_process";
28259
+ import { spawn as spawn2, spawnSync as spawnSync2 } from "node:child_process";
28030
28260
  async function execAsync(file2, args, options = {}) {
28031
28261
  const code = await spawnAsync(file2, args, { stdio: "inherit", ...options });
28032
28262
  if (code !== 0)
@@ -28295,7 +28525,7 @@ async function ensureJdk() {
28295
28525
  // src/guest/databases/server.ts
28296
28526
  import fs16 from "node:fs";
28297
28527
  import path16 from "node:path";
28298
- import { spawn as spawn2 } from "node:child_process";
28528
+ import { spawn as spawn3 } from "node:child_process";
28299
28529
  function dataFor(name) {
28300
28530
  return path16.join(dataDir, "databases", name);
28301
28531
  }
@@ -28303,7 +28533,7 @@ async function startServer(name, exe, args, port) {
28303
28533
  if (await portOpen(port)) throw new Error("port " + port + " is already in use (change databases." + name + ".port)");
28304
28534
  const logFile2 = path16.join(logsDir, name + ".log");
28305
28535
  const out = fs16.openSync(logFile2, "a");
28306
- spawn2(exe, args, { detached: true, stdio: ["ignore", out, out], windowsHide: true }).unref();
28536
+ spawn3(exe, args, { detached: true, stdio: ["ignore", out, out], windowsHide: true }).unref();
28307
28537
  fs16.closeSync(out);
28308
28538
  if (!await waitForPort(port, 60))
28309
28539
  throw new Error(name + " did not start listening on port " + port + "; see " + logFile2);
@@ -28398,7 +28628,7 @@ var DynamoServer = class extends DatabaseServer {
28398
28628
  return;
28399
28629
  }
28400
28630
  const out = fs17.openSync(path17.join(logsDir, "dynamodb-admin.log"), "a");
28401
- spawn3(
28631
+ spawn4(
28402
28632
  process.execPath,
28403
28633
  [script, "--port", String(plan.adminPort), "--dynamo-endpoint", endpoint, "--skip-default-credentials"],
28404
28634
  { detached: true, stdio: ["ignore", out, out], windowsHide: true, env: { ...process.env, ...aws } }
@@ -28686,13 +28916,26 @@ function planPath(input2) {
28686
28916
  seen.add(key);
28687
28917
  result.push(entry);
28688
28918
  }
28689
- return result;
28919
+ return msvcBeforeGitUsr(result);
28690
28920
  }
28691
28921
  function isPinnedNodeDir(folder, nvmHome2) {
28692
28922
  const key = pathKey(folder);
28693
28923
  const home = pathKey(nvmHome2);
28694
28924
  return key.startsWith(home + "\\") && /^v\d/.test(path22.win32.basename(key));
28695
28925
  }
28926
+ function isMsvcToolsDir(folder) {
28927
+ return /\\vc\\tools\\msvc\\[^\\]+\\bin\\host[^\\]+\\[^\\]+$/.test(pathKey(folder));
28928
+ }
28929
+ function isGitUsrBin(folder) {
28930
+ const key = pathKey(folder);
28931
+ return key.endsWith("\\usr\\bin") && /\\git(\\|$)/.test(key);
28932
+ }
28933
+ function msvcBeforeGitUsr(folders) {
28934
+ const firstGit = folders.findIndex(isGitUsrBin);
28935
+ if (firstGit < 0 || !folders.slice(firstGit).some(isMsvcToolsDir)) return [...folders];
28936
+ const late = folders.slice(firstGit).filter(isMsvcToolsDir);
28937
+ return [...folders.slice(0, firstGit), ...late, ...folders.slice(firstGit).filter((f) => !isMsvcToolsDir(f))];
28938
+ }
28696
28939
 
28697
28940
  // src/guest/setup/environment.ts
28698
28941
  function addMachineEnvironment(vars, dirs, additive = false) {