windows-development-sandbox 1.18.4 → 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 (438) hide show
  1. package/README.md +1 -1
  2. package/config.example.json +17 -1
  3. package/dist/app/features/access/access.def.js +5 -2
  4. package/dist/app/features/access/access.run.js +7 -3
  5. package/dist/app/features/accounts/accounts.def.d.ts +33 -1
  6. package/dist/app/features/accounts/accounts.def.js +10 -4
  7. package/dist/app/features/accounts/accounts.run.d.ts +2 -0
  8. package/dist/app/features/accounts/accounts.run.js +7 -2
  9. package/dist/app/features/accounts/services.def.d.ts +7 -1
  10. package/dist/app/features/accounts/services.def.js +19 -16
  11. package/dist/app/features/accounts/services.run.d.ts +2 -0
  12. package/dist/app/features/accounts/services.run.js +44 -16
  13. package/dist/app/features/agent-commands/agent-commands.def.d.ts +37 -0
  14. package/dist/app/features/agent-commands/agent-commands.def.js +91 -0
  15. package/dist/app/features/agent-commands/agent-commands.run.d.ts +28 -0
  16. package/dist/app/features/agent-commands/agent-commands.run.js +35 -0
  17. package/dist/app/features/agent-commands/index.d.ts +2 -0
  18. package/dist/app/features/agent-commands/index.js +3 -0
  19. package/dist/app/features/agents/agents.def.d.ts +14 -1
  20. package/dist/app/features/agents/agents.def.js +61 -6
  21. package/dist/app/features/agents/agents.run.d.ts +1 -0
  22. package/dist/app/features/agents/agents.run.js +8 -1
  23. package/dist/app/features/agents/claude-env.def.d.ts +36 -0
  24. package/dist/app/features/agents/claude-env.def.js +305 -0
  25. package/dist/app/features/agents/env.def.d.ts +163 -0
  26. package/dist/app/features/agents/env.def.js +184 -0
  27. package/dist/app/features/agents/env.run.d.ts +43 -0
  28. package/dist/app/features/agents/env.run.js +86 -0
  29. package/dist/app/features/agents/index.d.ts +2 -0
  30. package/dist/app/features/agents/index.js +2 -0
  31. package/dist/app/features/defs.d.ts +171 -3
  32. package/dist/app/features/defs.js +9 -0
  33. package/dist/app/features/engine/engine.run.js +1 -1
  34. package/dist/app/features/github/github.def.d.ts +44 -3
  35. package/dist/app/features/github/github.def.js +145 -63
  36. package/dist/app/features/github/github.run.d.ts +9 -2
  37. package/dist/app/features/github/github.run.js +43 -5
  38. package/dist/app/features/health/health.def.js +8 -2
  39. package/dist/app/features/logs/logs.def.js +0 -8
  40. package/dist/app/features/projects/projects.def.js +2 -2
  41. package/dist/app/features/projects/projects.run.js +5 -5
  42. package/dist/app/features/sandbox/sandbox.def.js +7 -3
  43. package/dist/app/features/sessions/sessions.def.d.ts +4 -4
  44. package/dist/app/features/sessions/sessions.def.js +0 -5
  45. package/dist/app/features/sessions/sessions.run.d.ts +1 -1
  46. package/dist/app/features/sessions/sessions.run.js +2 -2
  47. package/dist/app/features/settings/categories.def.js +7 -2
  48. package/dist/app/features/settings/settings-rows.js +6 -2
  49. package/dist/app/features/settings/settings.def.js +1 -1
  50. package/dist/app/features/settings/settings.run.d.ts +8 -0
  51. package/dist/app/features/settings/settings.run.js +12 -3
  52. package/dist/app/features/storage/storage.run.js +18 -9
  53. package/dist/app/features/updates/update-lines.js +2 -2
  54. package/dist/app/features/updates/updates.def.js +1 -1
  55. package/dist/app/features/updates/updates.run.js +13 -3
  56. package/dist/app/features/vpn/vpn.def.d.ts +33 -0
  57. package/dist/app/features/vpn/vpn.def.js +30 -6
  58. package/dist/app/features/vpn/vpn.run.d.ts +11 -0
  59. package/dist/app/features/vpn/vpn.run.js +4 -1
  60. package/dist/app/features/web/web.def.js +2 -2
  61. package/dist/app/features/web/web.run.js +12 -4
  62. package/dist/app/kernel/errors.d.ts +7 -0
  63. package/dist/app/kernel/errors.js +18 -3
  64. package/dist/app/kernel/rpc.d.ts +6 -1
  65. package/dist/app/kernel/view.d.ts +11 -1
  66. package/dist/app/registry.js +7 -1
  67. package/dist/bin/agent-sandbox.js +2 -2
  68. package/dist/bin/{chunk-N4GXYTLV.js → chunk-JETGP2C3.js} +239 -72
  69. package/dist/bin/{chunk-MY7NLQQY.js → chunk-XZKOPGNH.js} +1 -1
  70. package/dist/bin/{chunk-FRPLQLSY.js → chunk-ZTTOF5V3.js} +6566 -4964
  71. package/dist/bin/claude-host.js +2 -2
  72. package/dist/bin/claude-sbx.js +2 -2
  73. package/dist/bin/codex-sbx.js +2 -2
  74. package/dist/bin/gemini-sbx.js +2 -2
  75. package/dist/bin/sandbox.js +2 -2
  76. package/dist/bin/sbx-hide.js +2 -2
  77. package/dist/bin/sbx-show.js +2 -2
  78. package/dist/cli/commands/agent-commands.d.ts +0 -1
  79. package/dist/cli/commands/agent-commands.js +2 -32
  80. package/dist/cli/commands/index.d.ts +1 -1
  81. package/dist/cli/commands/index.js +1 -1
  82. package/dist/cli/commands/launch/launch.js +2 -2
  83. package/dist/cli/commands/registry.js +3 -2
  84. package/dist/cli/manifest.d.ts +3 -3
  85. package/dist/cli/manifest.js +3 -2
  86. package/dist/cli/menu/coverage-exempt.d.ts +17 -0
  87. package/dist/cli/menu/coverage-exempt.js +61 -0
  88. package/dist/cli/menu/io-menu.d.ts +2 -0
  89. package/dist/cli/menu/io-menu.js +50 -5
  90. package/dist/cli/menu/menu.d.ts +1 -1
  91. package/dist/cli/menu/menu.js +3 -3
  92. package/dist/cli/menu/pages/accounts-page.js +1 -1
  93. package/dist/cli/menu/pages/agents-page.d.ts +7 -2
  94. package/dist/cli/menu/pages/agents-page.js +75 -13
  95. package/dist/cli/menu/pages/maintenance-page.d.ts +6 -0
  96. package/dist/cli/menu/pages/maintenance-page.js +10 -4
  97. package/dist/cli/menu/pages/sessions-page.d.ts +2 -0
  98. package/dist/cli/menu/pages/sessions-page.js +12 -4
  99. package/dist/cli/menu/pages/settings-page.js +13 -1
  100. package/dist/cli/menu/remote-menu.js +1 -1
  101. package/dist/cli/menu/shell.d.ts +5 -0
  102. package/dist/cli/menu/shell.js +13 -0
  103. package/dist/cli/menu/views.js +2 -1
  104. package/dist/cli/report.js +2 -0
  105. package/dist/cli/services/agent-commands-service.d.ts +2 -0
  106. package/dist/cli/services/agent-commands-service.js +13 -7
  107. package/dist/cli/services/vpn-service.d.ts +5 -1
  108. package/dist/cli/services/vpn-service.js +6 -1
  109. package/dist/cli/tui/app.d.ts +5 -0
  110. package/dist/cli/tui/app.js +2 -0
  111. package/dist/cli/tui/dialogs/text-screen.js +2 -1
  112. package/dist/cli/tui/terminal.js +3 -1
  113. package/dist/core/config/defaults.js +12 -1
  114. package/dist/core/detect/toolchains.js +9 -0
  115. package/dist/core/disk.d.ts +1 -5
  116. package/dist/core/disk.js +1 -16
  117. package/dist/core/schema/accounts.d.ts +6 -0
  118. package/dist/core/schema/accounts.js +13 -11
  119. package/dist/core/schema/codex.d.ts +29 -0
  120. package/dist/core/schema/codex.js +24 -0
  121. package/dist/core/schema/config.d.ts +58 -14
  122. package/dist/core/schema/config.js +6 -4
  123. package/dist/core/schema/github.js +1 -1
  124. package/dist/core/schema/index.d.ts +1 -0
  125. package/dist/core/schema/index.js +1 -0
  126. package/dist/core/schema/profile.js +8 -4
  127. package/dist/core/schema/resume.js +1 -1
  128. package/dist/core/schema/sandbox.js +3 -3
  129. package/dist/core/schema/toolchains.d.ts +4 -0
  130. package/dist/core/schema/toolchains.js +3 -0
  131. package/dist/core/schema/vpn.js +1 -1
  132. package/dist/core/schema/web.js +3 -3
  133. package/dist/core/types.d.ts +8 -0
  134. package/dist/core/util/errors.d.ts +11 -1
  135. package/dist/core/util/errors.js +7 -1
  136. package/dist/core/util/index.d.ts +1 -1
  137. package/dist/core/util/index.js +1 -1
  138. package/dist/guest/accounts/adapter.d.ts +2 -0
  139. package/dist/guest/accounts/adapters.js +4 -0
  140. package/dist/guest/accounts/apply.d.ts +10 -6
  141. package/dist/guest/accounts/kinds/cfx.d.ts +7 -0
  142. package/dist/guest/accounts/kinds/cfx.js +33 -3
  143. package/dist/guest/accounts/kinds/comet.d.ts +7 -0
  144. package/dist/guest/accounts/kinds/comet.js +50 -0
  145. package/dist/guest/accounts/kinds/perplexity.d.ts +2 -0
  146. package/dist/guest/accounts/kinds/perplexity.js +12 -0
  147. package/dist/guest/accounts/watch.d.ts +2 -0
  148. package/dist/guest/accounts/watch.js +12 -2
  149. package/dist/guest/agents/agent-files.d.ts +26 -6
  150. package/dist/guest/agents/agent-files.js +84 -14
  151. package/dist/guest/agents/agent-installer.js +1 -1
  152. package/dist/guest/agents/local-state.d.ts +5 -2
  153. package/dist/guest/agents/local-state.js +24 -10
  154. package/dist/guest/agents/profile-links.d.ts +2 -0
  155. package/dist/guest/agents/profile-links.js +18 -4
  156. package/dist/guest/apps/after-install.js +19 -0
  157. package/dist/guest/apps/app-installer.d.ts +11 -0
  158. package/dist/guest/apps/app-installer.js +69 -6
  159. package/dist/guest/apps/comet-unpack.d.ts +20 -0
  160. package/dist/guest/apps/comet-unpack.js +127 -0
  161. package/dist/guest/apps/index.d.ts +1 -1
  162. package/dist/guest/apps/index.js +1 -1
  163. package/dist/guest/apps/resolvers-agents-web.d.ts +2 -0
  164. package/dist/guest/apps/resolvers-agents-web.js +7 -0
  165. package/dist/guest/apps/resolvers.js +2 -0
  166. package/dist/guest/apps/shortcuts.d.ts +2 -0
  167. package/dist/guest/apps/shortcuts.js +1 -0
  168. package/dist/guest/apps/unpack.js +14 -4
  169. package/dist/guest/boot/boot.d.ts +45 -16
  170. package/dist/guest/boot/boot.js +325 -149
  171. package/dist/guest/boot/graph.d.ts +252 -0
  172. package/dist/guest/boot/graph.js +257 -0
  173. package/dist/guest/boot/guide-lines.d.ts +25 -0
  174. package/dist/guest/boot/guide-lines.js +41 -0
  175. package/dist/guest/boot/guide.d.ts +1 -4
  176. package/dist/guest/boot/guide.js +6 -8
  177. package/dist/guest/boot/runner.d.ts +77 -0
  178. package/dist/guest/boot/runner.js +215 -0
  179. package/dist/guest/browser/cdp.d.ts +71 -0
  180. package/dist/guest/browser/cdp.js +306 -0
  181. package/dist/guest/browser/comet.d.ts +28 -0
  182. package/dist/guest/browser/comet.js +155 -0
  183. package/dist/guest/daemon/project-provisioner.js +6 -1
  184. package/dist/guest/daemon/sessions.js +2 -1
  185. package/dist/guest/devtools/fivem.d.ts +1 -1
  186. package/dist/guest/devtools/fivem.js +243 -3
  187. package/dist/guest/entries/daemon.js +2 -0
  188. package/dist/guest/runtime/log.d.ts +12 -0
  189. package/dist/guest/runtime/log.js +29 -5
  190. package/dist/guest/runtime/pools.d.ts +24 -0
  191. package/dist/guest/runtime/pools.js +60 -0
  192. package/dist/guest/runtime/process.d.ts +4 -0
  193. package/dist/guest/runtime/process.js +38 -1
  194. package/dist/guest/runtime/status.d.ts +5 -1
  195. package/dist/guest/runtime/status.js +19 -0
  196. package/dist/guest/setup/addon-mcp.d.ts +1 -1
  197. package/dist/guest/setup/addon-mcp.js +52 -12
  198. package/dist/guest/setup/agent-addons.d.ts +3 -2
  199. package/dist/guest/setup/agent-addons.js +12 -3
  200. package/dist/guest/setup/environment.d.ts +1 -1
  201. package/dist/guest/setup/environment.js +25 -12
  202. package/dist/guest/setup/headroom.d.ts +8 -3
  203. package/dist/guest/setup/headroom.js +44 -15
  204. package/dist/guest/setup/path-plan.d.ts +28 -0
  205. package/dist/guest/setup/path-plan.js +69 -2
  206. package/dist/guest/setup/shell-path.d.ts +1 -1
  207. package/dist/guest/setup/shell-path.js +3 -3
  208. package/dist/guest/toolchains/fivem/artifacts.d.ts +48 -1
  209. package/dist/guest/toolchains/fivem/artifacts.js +97 -4
  210. package/dist/guest/toolchains/fivem/fivem.d.ts +32 -1
  211. package/dist/guest/toolchains/fivem/fivem.js +168 -3
  212. package/dist/guest/toolchains/fivem/scaffold.d.ts +35 -0
  213. package/dist/guest/toolchains/fivem/scaffold.js +105 -0
  214. package/dist/guest/toolchains/fivem/serve-plan.d.ts +34 -0
  215. package/dist/guest/toolchains/fivem/serve-plan.js +61 -0
  216. package/dist/guest/toolchains/installers.d.ts +6 -10
  217. package/dist/guest/toolchains/installers.js +4 -12
  218. package/dist/guest/toolchains/languages/go.js +1 -1
  219. package/dist/guest/toolchains/languages/node.js +2 -1
  220. package/dist/guest/toolchains/languages/php.d.ts +2 -0
  221. package/dist/guest/toolchains/languages/php.js +13 -1
  222. package/dist/guest/toolchains/languages/python-tools.js +1 -1
  223. package/dist/guest/toolchains/languages/ruby.js +1 -1
  224. package/dist/guest/toolchains/native/autosdk.d.ts +3 -0
  225. package/dist/guest/toolchains/native/autosdk.js +50 -0
  226. package/dist/guest/toolchains/native/binstall.js +1 -1
  227. package/dist/guest/toolchains/native/msvc/packages.js +10 -4
  228. package/dist/guest/toolchains/native/rust.d.ts +2 -0
  229. package/dist/guest/toolchains/native/rust.js +11 -4
  230. package/dist/guest/toolchains/native/unreal.d.ts +2 -0
  231. package/dist/guest/toolchains/native/unreal.js +19 -6
  232. package/dist/guest/toolchains/native/vcruntime.d.ts +2 -3
  233. package/dist/guest/toolchains/native/vcruntime.js +12 -7
  234. package/dist/guest/toolchains/native/visual-studio.d.ts +5 -2
  235. package/dist/guest/toolchains/native/visual-studio.js +127 -25
  236. package/dist/guest/toolchains/native/vs-request.d.ts +23 -0
  237. package/dist/guest/toolchains/native/vs-request.js +62 -1
  238. package/dist/guest/toolchains/not-yet.d.ts +1 -1
  239. package/dist/guest/toolchains/not-yet.js +3 -3
  240. package/dist/guest/toolchains/persisted.js +2 -7
  241. package/dist/guest/toolchains/plan.js +27 -11
  242. package/dist/guest/toolchains/scheduler.d.ts +2 -21
  243. package/dist/guest/toolchains/scheduler.js +7 -121
  244. package/dist/guest/toolchains/setup.d.ts +15 -2
  245. package/dist/guest/toolchains/setup.js +39 -20
  246. package/dist/guest/toolchains/signature.d.ts +5 -0
  247. package/dist/guest/toolchains/signature.js +22 -0
  248. package/dist/guest/toolchains/split.d.ts +28 -0
  249. package/dist/guest/toolchains/split.js +60 -0
  250. package/dist/guest/toolchains/steam/client.js +2 -1
  251. package/dist/guest/toolchains/step-scheduler.d.ts +51 -0
  252. package/dist/guest/toolchains/step-scheduler.js +147 -0
  253. package/dist/guest/toolchains/step.d.ts +13 -0
  254. package/dist/guest/toolchains/tools/git.js +18 -0
  255. package/dist/guest/vpn/openvpn.js +3 -4
  256. package/dist/guest/vpn/tunnel.d.ts +3 -0
  257. package/dist/guest/vpn/tunnel.js +10 -12
  258. package/dist/guest/vpn/vpn.js +6 -1
  259. package/dist/guest/vpn/wireguard.js +11 -4
  260. package/dist/host/accounts/deliver.js +7 -0
  261. package/dist/host/accounts/handoff.js +2 -6
  262. package/dist/host/accounts/index.d.ts +1 -1
  263. package/dist/host/accounts/index.js +1 -1
  264. package/dist/host/accounts/kinds/cfx.d.ts +1 -1
  265. package/dist/host/accounts/kinds/cfx.js +47 -4
  266. package/dist/host/accounts/kinds/comet.d.ts +2 -0
  267. package/dist/host/accounts/kinds/comet.js +6 -0
  268. package/dist/host/accounts/kinds/perplexity.d.ts +2 -0
  269. package/dist/host/accounts/kinds/perplexity.js +30 -0
  270. package/dist/host/accounts/leases.d.ts +9 -3
  271. package/dist/host/accounts/leases.js +13 -2
  272. package/dist/host/accounts/source.d.ts +7 -1
  273. package/dist/host/accounts/source.js +28 -1
  274. package/dist/host/accounts/sources.js +4 -0
  275. package/dist/host/agent-commands/commands.js +1 -1
  276. package/dist/host/agent-commands/forwarders.d.ts +14 -2
  277. package/dist/host/agent-commands/forwarders.js +31 -13
  278. package/dist/host/agent-commands/reconcile.d.ts +2 -1
  279. package/dist/host/agent-commands/reconcile.js +7 -8
  280. package/dist/host/agent-commands/user-path.d.ts +5 -0
  281. package/dist/host/agent-commands/user-path.js +13 -0
  282. package/dist/host/github/deliver.d.ts +1 -1
  283. package/dist/host/github/deliver.js +20 -1
  284. package/dist/host/github/index.d.ts +2 -1
  285. package/dist/host/github/index.js +1 -0
  286. package/dist/host/github/token.d.ts +13 -1
  287. package/dist/host/github/token.js +19 -2
  288. package/dist/host/github/verify.d.ts +27 -0
  289. package/dist/host/github/verify.js +61 -0
  290. package/dist/host/launch/hints/fivem.d.ts +3 -1
  291. package/dist/host/launch/hints/fivem.js +68 -2
  292. package/dist/host/launch/session-file.js +5 -0
  293. package/dist/host/launch/toolchains.d.ts +2 -1
  294. package/dist/host/launch/toolchains.js +5 -3
  295. package/dist/host/profile/accounts.js +2 -4
  296. package/dist/host/profile/claude-login.d.ts +3 -2
  297. package/dist/host/profile/claude-login.js +3 -13
  298. package/dist/host/vpn/index.d.ts +2 -1
  299. package/dist/host/vpn/index.js +2 -1
  300. package/dist/host/vpn/last.d.ts +28 -0
  301. package/dist/host/vpn/last.js +43 -0
  302. package/dist/host/vpn/login.d.ts +3 -1
  303. package/dist/host/vpn/login.js +17 -3
  304. package/dist/host/vpn/nordvpn.d.ts +2 -4
  305. package/dist/host/vpn/nordvpn.js +2 -24
  306. package/dist/runtime/agent.js +433 -90
  307. package/dist/runtime/daemon.js +3378 -1546
  308. package/dist/runtime/db.js +363 -90
  309. package/dist/runtime/main.js +5134 -2096
  310. package/dist/runtime/netproxy.js +308 -69
  311. package/dist/runtime/tool.js +2867 -1765
  312. package/dist/runtime/view.js +308 -69
  313. package/dist/selftest/agent-commands.test.js +45 -7
  314. package/dist/selftest/agent-paths.test.js +40 -13
  315. package/dist/selftest/agent-settings.test.d.ts +2 -0
  316. package/dist/selftest/agent-settings.test.js +94 -0
  317. package/dist/selftest/agents-web.test.d.ts +2 -0
  318. package/dist/selftest/agents-web.test.js +647 -0
  319. package/dist/selftest/app.test.js +7 -3
  320. package/dist/selftest/boot-runner.test.d.ts +2 -0
  321. package/dist/selftest/boot-runner.test.js +456 -0
  322. package/dist/selftest/channel.test.js +15 -0
  323. package/dist/selftest/cli.test.js +4 -0
  324. package/dist/selftest/fivem.test.js +249 -3
  325. package/dist/selftest/github.test.js +94 -9
  326. package/dist/selftest/guest-boot.test.js +3 -0
  327. package/dist/selftest/health.test.js +1 -1
  328. package/dist/selftest/index.js +10 -0
  329. package/dist/selftest/layout.test.js +5 -0
  330. package/dist/selftest/menu-coverage.test.d.ts +2 -0
  331. package/dist/selftest/menu-coverage.test.js +46 -0
  332. package/dist/selftest/menu-screens.js +37 -1
  333. package/dist/selftest/menu.test.js +5 -3
  334. package/dist/selftest/pc-installs.test.js +5 -0
  335. package/dist/selftest/persisted-installs.test.js +72 -0
  336. package/dist/selftest/service-accounts.test.js +3 -2
  337. package/dist/selftest/support/engine-golden.js +28 -1
  338. package/dist/selftest/support/fixtures.d.ts +15 -0
  339. package/dist/selftest/support/web-preview.d.ts +34 -1
  340. package/dist/selftest/support/web-preview.js +21 -18
  341. package/dist/selftest/toolchains.test.js +23 -1
  342. package/dist/selftest/ui-text.test.d.ts +7 -0
  343. package/dist/selftest/ui-text.test.js +300 -0
  344. package/dist/selftest/vpn.test.js +51 -3
  345. package/dist/shared/accounts/anthropic.d.ts +5 -0
  346. package/dist/shared/accounts/anthropic.js +15 -0
  347. package/dist/shared/accounts/index.d.ts +3 -0
  348. package/dist/shared/accounts/index.js +3 -0
  349. package/dist/shared/accounts/kinds/comet.d.ts +12 -0
  350. package/dist/shared/accounts/kinds/comet.js +64 -0
  351. package/dist/shared/accounts/kinds/perplexity.d.ts +8 -0
  352. package/dist/shared/accounts/kinds/perplexity.js +37 -0
  353. package/dist/shared/accounts/kinds.d.ts +24 -5
  354. package/dist/shared/accounts/kinds.js +86 -4
  355. package/dist/shared/accounts/payloads.d.ts +81 -0
  356. package/dist/shared/accounts/payloads.js +39 -1
  357. package/dist/shared/apps/agent-addons.d.ts +33 -5
  358. package/dist/shared/apps/agent-addons.js +95 -3
  359. package/dist/shared/apps/catalogue-agents-web.d.ts +14 -0
  360. package/dist/shared/apps/catalogue-agents-web.js +112 -0
  361. package/dist/shared/apps/catalogue-modding.js +32 -1
  362. package/dist/shared/apps/catalogue.d.ts +27 -3
  363. package/dist/shared/apps/catalogue.js +2 -1
  364. package/dist/shared/apps/index.d.ts +3 -1
  365. package/dist/shared/apps/index.js +3 -1
  366. package/dist/shared/channel/schema.d.ts +40 -3
  367. package/dist/shared/channel/schema.js +9 -0
  368. package/dist/shared/channel/secrets.d.ts +19 -0
  369. package/dist/shared/concurrency/index.d.ts +3 -0
  370. package/dist/shared/concurrency/index.js +3 -0
  371. package/dist/shared/concurrency/installer-retry.d.ts +6 -0
  372. package/dist/shared/concurrency/installer-retry.js +10 -0
  373. package/dist/shared/concurrency/limiter.d.ts +19 -0
  374. package/dist/shared/concurrency/limiter.js +67 -0
  375. package/dist/shared/concurrency/pools.d.ts +7 -0
  376. package/dist/shared/concurrency/pools.js +9 -0
  377. package/dist/shared/download/archive.d.ts +2 -0
  378. package/dist/shared/download/archive.js +11 -1
  379. package/dist/shared/download/bounded-fetch.d.ts +13 -0
  380. package/dist/shared/download/bounded-fetch.js +40 -0
  381. package/dist/shared/download/downloader.d.ts +5 -0
  382. package/dist/shared/download/downloader.js +50 -38
  383. package/dist/shared/download/index.d.ts +2 -1
  384. package/dist/shared/download/index.js +2 -1
  385. package/dist/shared/io/disk.d.ts +9 -0
  386. package/dist/shared/io/disk.js +19 -0
  387. package/dist/shared/io/index.d.ts +1 -0
  388. package/dist/shared/io/index.js +1 -0
  389. package/dist/shared/readiness.d.ts +9 -0
  390. package/dist/shared/readiness.js +11 -0
  391. package/dist/shared/signer.d.ts +24 -0
  392. package/dist/shared/signer.js +15 -0
  393. package/dist/shared/vpn/failure.d.ts +10 -0
  394. package/dist/shared/vpn/failure.js +28 -0
  395. package/dist/sync/watcher.js +2 -0
  396. package/dist/web/index.html +1 -1
  397. package/dist/web/{main-GVZWWP4I.js → main-CCILLX2M.js} +75 -74
  398. package/native/csharp/HcsHost/AssemblyInfo.cs +3 -3
  399. package/native/csharp/HostTools/AssemblyInfo.cs +3 -3
  400. package/native/csharp/HostTools/Program.cs +14 -1
  401. package/native/csharp/HostTools/UserPath.cs +17 -0
  402. package/native/csharp/StorageHelper/AssemblyInfo.cs +3 -3
  403. package/native/scripts/edit-user-path.ps1 +6 -2
  404. package/package.json +1 -1
  405. package/sandbox/addons/browser-use-mcp/requirements.in +1 -0
  406. package/sandbox/addons/browser-use-mcp/requirements.txt +2350 -0
  407. package/sandbox/addons/chrome-devtools-mcp/package-lock.json +38 -0
  408. package/sandbox/addons/chrome-devtools-mcp/package.json +7 -0
  409. package/sandbox/addons/comet-mcp/package-lock.json +1277 -0
  410. package/sandbox/addons/comet-mcp/package.json +7 -0
  411. package/sandbox/addons/perplexity-mcp/package-lock.json +1655 -0
  412. package/sandbox/addons/perplexity-mcp/package.json +7 -0
  413. package/sandbox/scripts/add-firewall-port.ps1 +18 -4
  414. package/sandbox/scripts/get-signature.ps1 +13 -0
  415. package/sandbox/scripts/set-machine-environment.ps1 +30 -15
  416. package/sandbox/templates/fivem/README.txt +6 -2
  417. package/sandbox/templates/fivem/cs/Client/Client.csproj +15 -0
  418. package/sandbox/templates/fivem/cs/Client/ClientMain.cs +20 -0
  419. package/sandbox/templates/fivem/cs/Server/Server.csproj +14 -0
  420. package/sandbox/templates/fivem/cs/Server/ServerMain.cs +20 -0
  421. package/sandbox/templates/fivem/cs/fxmanifest.lua +11 -0
  422. package/sandbox/templates/fivem/js/client.js +12 -0
  423. package/sandbox/templates/fivem/js/fxmanifest.lua +9 -0
  424. package/sandbox/templates/fivem/js/server.js +6 -0
  425. package/sandbox/templates/fivem/lua/client.lua +8 -0
  426. package/sandbox/templates/fivem/lua/fxmanifest.lua +10 -0
  427. package/sandbox/templates/fivem/lua/server.lua +6 -0
  428. package/sandbox/templates/fivem/server.cfg +37 -0
  429. package/sandbox/templates/fivem/ts/build.js +17 -0
  430. package/sandbox/templates/fivem/ts/fxmanifest.lua +9 -0
  431. package/sandbox/templates/fivem/ts/package.json +16 -0
  432. package/sandbox/templates/fivem/ts/src/client/client.ts +12 -0
  433. package/sandbox/templates/fivem/ts/src/client/tsconfig.json +13 -0
  434. package/sandbox/templates/fivem/ts/src/server/server.ts +6 -0
  435. package/sandbox/templates/fivem/ts/src/server/tsconfig.json +13 -0
  436. package/schemas/config.schema.json +120 -27
  437. package/schemas/sandbox-config.schema.json +45 -14
  438. package/sandbox/scripts/get-signer.ps1 +0 -8
@@ -25955,6 +25955,22 @@ var DatabasesSchema = external_exports.strictObject({
25955
25955
  })
25956
25956
  });
25957
25957
 
25958
+ // src/core/schema/codex.ts
25959
+ var CodexSchema = external_exports.strictObject({
25960
+ sandboxMode: external_exports.enum(["danger-full-access", "workspace-write", "read-only"]).describe(
25961
+ "Codex's own sandbox. Inside Windows Sandbox Codex's own sandbox only slows it down (it re-grants file permissions over your profile at every boot), so the default is danger-full-access: Windows Sandbox is the sandbox."
25962
+ ),
25963
+ approvalPolicy: external_exports.enum(["never", "on-request", "on-failure", "untrusted"]).describe('When Codex asks before it runs a command. "never" with danger-full-access starts it with no questions.'),
25964
+ model: external_exports.string().max(100).regex(/^[A-Za-z0-9._:/-]*$/, "letters, digits and . _ : / - only").describe("The model Codex uses. Empty = Codex's own default."),
25965
+ reasoningEffort: external_exports.enum(["default", "minimal", "low", "medium", "high", "xhigh"]).describe(`How hard Codex thinks. "default" = Codex's own default.`),
25966
+ windowsSandbox: external_exports.enum(["off", "unelevated", "elevated"]).describe(
25967
+ `Codex's Windows sandbox mode in its config.toml. "off" removes the setting so Codex does not set up its sandbox users and firewall rules at every boot.`
25968
+ ),
25969
+ mcpLoginsInFile: external_exports.boolean().describe(
25970
+ `Keep the sign-ins of Codex's MCP servers in a file in the saved Codex folder (mcp_oauth_credentials_store = "file"), so they survive between sandboxes. A value you set in config.toml is kept.`
25971
+ )
25972
+ });
25973
+
25958
25974
  // src/core/schema/harness.ts
25959
25975
  var SubfolderSchema = external_exports.string().regex(/^(?!.*(^|[\\/])\.\.([\\/]|$))[A-Za-z0-9._ -]+([\\/][A-Za-z0-9._ -]+)*$/, "a plain relative folder");
25960
25976
  var HarnessHomeSchema = external_exports.strictObject({
@@ -26014,15 +26030,17 @@ var SecretsSchema = external_exports.strictObject({
26014
26030
  )
26015
26031
  });
26016
26032
  var AttachSchema = external_exports.strictObject({
26017
- enabled: external_exports.boolean().describe("Allow sandbox claude --terminal / sandbox attach from this PC."),
26033
+ enabled: external_exports.boolean().describe(
26034
+ "Allow attaching this PC's terminal to a session (the terminal option when starting an agent, and attach)."
26035
+ ),
26018
26036
  reuseSession: external_exports.boolean().describe(
26019
- "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)."
26037
+ "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)."
26020
26038
  ),
26021
26039
  auto: external_exports.boolean().describe(
26022
26040
  "Starting an agent attaches this terminal automatically, as if you passed -t (only in an interactive terminal)."
26023
26041
  ),
26024
26042
  autoHide: external_exports.boolean().describe(
26025
- "Hide the Windows Sandbox window whenever this terminal attaches; it keeps running (sandbox show brings it back)."
26043
+ "Hide the Windows Sandbox window whenever this terminal attaches; it keeps running (Sandbox > Status shows it again)."
26026
26044
  ),
26027
26045
  confirmCtrlC: external_exports.boolean().describe(
26028
26046
  '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.'
@@ -26039,7 +26057,7 @@ var ClaudeProfileSchema = external_exports.strictObject({
26039
26057
  hostDir: external_exports.string().describe('Your Claude folder, or "auto" (~/.claude or CLAUDE_CONFIG_DIR).'),
26040
26058
  include: external_exports.array(external_exports.string().regex(/^[A-Za-z0-9._-]+$/)).describe("Files and folders copied from it."),
26041
26059
  globalStateFile: external_exports.string().describe('Your .claude.json, or "auto". Empty string = do not copy.'),
26042
- copyCredentials: external_exports.boolean().describe("Copy your Claude LOGIN into the sandbox. Prefer sandbox account instead."),
26060
+ copyCredentials: external_exports.boolean().describe("Copy your Claude LOGIN into the sandbox. Prefer saving the login in Accounts instead."),
26043
26061
  overwrite: external_exports.boolean().describe("Refresh these settings from this PC on every launch."),
26044
26062
  sharePluginsAcrossAccounts: external_exports.boolean().describe(
26045
26063
  "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."
@@ -26068,7 +26086,7 @@ var MappingSchema = external_exports.strictObject({
26068
26086
  });
26069
26087
  var SandboxSchema = external_exports.strictObject({
26070
26088
  engine: external_exports.enum(["windows-sandbox", "hcs"]).describe(
26071
- '(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.'
26089
+ '(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.'
26072
26090
  ),
26073
26091
  memoryMb: external_exports.union([external_exports.literal("auto"), external_exports.number().int().min(2048)]).describe(
26074
26092
  '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.'
@@ -26095,7 +26113,7 @@ var SandboxSchema = external_exports.strictObject({
26095
26113
  ),
26096
26114
  networking: external_exports.boolean().describe("Internet access. false is the only hard network isolation Windows Sandbox offers."),
26097
26115
  clipboard: external_exports.boolean().describe(
26098
- "Shared clipboard between this PC and the sandbox. Also lets an agent's copy (in sandbox attach) reach this PC's clipboard."
26116
+ "Shared clipboard between this PC and the sandbox. Also lets an agent's copy (in an attached terminal) reach this PC's clipboard."
26099
26117
  ),
26100
26118
  audioInput: external_exports.boolean().describe("Microphone access."),
26101
26119
  videoInput: external_exports.boolean().describe("Camera access."),
@@ -26146,7 +26164,7 @@ var NetworkSchema = external_exports.strictObject({
26146
26164
  });
26147
26165
  var AuditSchema = external_exports.strictObject({
26148
26166
  enabled: external_exports.boolean().describe(
26149
- "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."
26167
+ "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."
26150
26168
  ),
26151
26169
  days: external_exports.number().int().min(1).max(365).describe(
26152
26170
  "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."
@@ -26267,6 +26285,9 @@ var ToolchainsSchema = external_exports.strictObject({
26267
26285
  keepInstallFiles: external_exports.boolean().describe(
26268
26286
  "Keep an offline copy of the Visual Studio install files in tools\\visualstudio (~10 GB, made once), so later boots install without downloading them again. Skipped while that disk has too little room."
26269
26287
  ),
26288
+ visualStudio: external_exports.enum(["full", "autosdk"]).describe(
26289
+ `"full": install Visual Studio Community (the engine finds it through the Setup API; ~10 GB, redone every boot). "autosdk" (experimental): skip Visual Studio and build an Unreal AutoSDK tree from the portable MSVC in tools\\unreal\\autosdk (kept between sandboxes); UnrealBuildTool finds MSVC through AutoSDK, but the editor's Visual Studio integration is not available. Needs toolchains.msvc (turned on for you).`
26290
+ ),
26270
26291
  persistEngines: external_exports.boolean().describe(
26271
26292
  "Engines the Epic Games Launcher installs go to tools\\unreal\\engines (kept between sandboxes, 40-60 GB each) and are registered with the launcher again every boot. Off: they go on the sandbox disk and are lost when it closes. Engines installed on this PC can be mapped instead (pcInstalls.unrealEngines)."
26272
26293
  ),
@@ -26487,6 +26508,114 @@ var ToolchainsSchema = external_exports.strictObject({
26487
26508
  )
26488
26509
  });
26489
26510
 
26511
+ // src/shared/apps/catalogue-agents-web.ts
26512
+ var PERPLEXITY_MCP_VERSION = "1.3.0";
26513
+ var COMET_MCP_VERSION = "2.3.0";
26514
+ var CHROME_DEVTOOLS_MCP_VERSION = "1.12.0";
26515
+ var BROWSER_USE_VERSION = "0.13.14";
26516
+ var PERPLEXITY_COMPUTER_MCP_URL = "https://www.perplexity.ai/rest/computer/mcp";
26517
+ var COMET_SIGNER = {
26518
+ subject: ['^CN="?PERPLEXITY AI, INC\\.?"?(,|$)', '(^|, )O="?PERPLEXITY AI, INC\\.?"?(,|$)'],
26519
+ issuer: ["^CN=GlobalSign GCC R45 EV CodeSigning CA 2020(,|$)"]
26520
+ };
26521
+ var EDGE_EXE = "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe";
26522
+ var AGENTS_WEB_APPS = [
26523
+ {
26524
+ id: "perplexity-mcp",
26525
+ name: "Perplexity MCP (API)",
26526
+ category: "agents",
26527
+ 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.",
26528
+ size: "30 MB",
26529
+ source: { locked: "npm", package: "@perplexity-ai/mcp-server", version: PERPLEXITY_MCP_VERSION },
26530
+ exe: "perplexity-mcp.cmd",
26531
+ service: true,
26532
+ mcp: {
26533
+ name: "sbx-perplexity",
26534
+ script: "node_modules/@perplexity-ai/mcp-server/dist/index.js",
26535
+ envVars: ["PERPLEXITY_API_KEY"],
26536
+ codex: true
26537
+ },
26538
+ plugsInto: "Claude Code and Codex as the MCP server sbx-perplexity; the key comes from Accounts as PERPLEXITY_API_KEY, never from a file",
26539
+ userOnly: true
26540
+ },
26541
+ {
26542
+ id: "perplexity-computer-mcp",
26543
+ name: "Perplexity Computer MCP",
26544
+ category: "agents",
26545
+ 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.",
26546
+ size: "0 MB",
26547
+ source: { remote: true },
26548
+ exe: "",
26549
+ service: true,
26550
+ mcp: { name: "sbx-perplexity-computer", url: PERPLEXITY_COMPUTER_MCP_URL, codex: true },
26551
+ plugsInto: "Claude Code and Codex as the remote MCP server sbx-perplexity-computer; its sign-in is kept with your agent login",
26552
+ userOnly: true
26553
+ },
26554
+ {
26555
+ id: "comet",
26556
+ name: "Comet (Perplexity browser)",
26557
+ category: "browsers",
26558
+ 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.",
26559
+ size: "600 MB",
26560
+ source: { resolve: "comet" },
26561
+ unpack: "chromium",
26562
+ exe: "comet.exe",
26563
+ needs: ["7zip"],
26564
+ signer: COMET_SIGNER,
26565
+ userOnly: true
26566
+ },
26567
+ {
26568
+ id: "comet-mcp",
26569
+ name: "Comet MCP",
26570
+ category: "agents",
26571
+ 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.",
26572
+ size: "15 MB",
26573
+ source: { locked: "npm", package: "comet-mcp", version: COMET_MCP_VERSION },
26574
+ exe: "comet-mcp.cmd",
26575
+ service: true,
26576
+ mcp: { name: "sbx-comet", script: "node_modules/comet-mcp/dist/index.js", codex: true },
26577
+ plugsInto: "Claude Code and Codex as the MCP server sbx-comet, talking to Comet's DevTools on 127.0.0.1:9222",
26578
+ userOnly: true
26579
+ },
26580
+ {
26581
+ id: "chrome-devtools-mcp",
26582
+ name: "Chrome DevTools MCP",
26583
+ category: "agents",
26584
+ 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.",
26585
+ size: "40 MB",
26586
+ source: { locked: "npm", package: "chrome-devtools-mcp", version: CHROME_DEVTOOLS_MCP_VERSION },
26587
+ exe: "chrome-devtools-mcp.cmd",
26588
+ service: true,
26589
+ mcp: {
26590
+ name: "sbx-chrome-devtools",
26591
+ script: "node_modules/chrome-devtools-mcp/build/src/bin/chrome-devtools-mcp.js",
26592
+ args: ["--executablePath", EDGE_EXE, "--isolated", "--no-usage-statistics", "--no-performance-crux"],
26593
+ codex: true
26594
+ },
26595
+ plugsInto: "Claude Code and Codex as the MCP server sbx-chrome-devtools (with Edge)",
26596
+ userOnly: true
26597
+ },
26598
+ {
26599
+ id: "browser-use-mcp",
26600
+ name: "Browser Use MCP",
26601
+ category: "agents",
26602
+ 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.",
26603
+ size: "250 MB",
26604
+ source: { locked: "uv", package: "browser-use", version: BROWSER_USE_VERSION },
26605
+ exe: "browser-use.exe",
26606
+ service: true,
26607
+ mcp: {
26608
+ name: "sbx-browser-use",
26609
+ program: true,
26610
+ args: ["--mcp"],
26611
+ env: { ANONYMIZED_TELEMETRY: "false" },
26612
+ codex: true
26613
+ },
26614
+ plugsInto: "Claude Code and Codex as the MCP server sbx-browser-use",
26615
+ userOnly: true
26616
+ }
26617
+ ];
26618
+
26490
26619
  // src/shared/apps/catalogue-gamedev.ts
26491
26620
  var GAMEDEV_APPS = [];
26492
26621
 
@@ -26494,7 +26623,38 @@ var GAMEDEV_APPS = [];
26494
26623
  var MOBILE_APPS = [];
26495
26624
 
26496
26625
  // src/shared/apps/catalogue-modding.ts
26497
- var MODDING_APPS = [];
26626
+ var MODDING_APPS = [
26627
+ {
26628
+ id: "lua-language-server",
26629
+ name: "Lua Language Server",
26630
+ category: "cli",
26631
+ 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).",
26632
+ size: "15 MB",
26633
+ source: { github: "LuaLS/lua-language-server", asset: "^lua-language-server-[\\d.]+-win32-x64\\.zip$" },
26634
+ exe: "lua-language-server.exe",
26635
+ cli: true
26636
+ },
26637
+ {
26638
+ id: "stylua",
26639
+ name: "StyLua",
26640
+ category: "cli",
26641
+ about: "An opinionated Lua formatter (`stylua .`), configured with a stylua.toml in the project.",
26642
+ size: "6 MB",
26643
+ source: { github: "JohnnyMorganz/StyLua", asset: "^stylua-windows-x86_64\\.zip$" },
26644
+ exe: "stylua.exe",
26645
+ cli: true
26646
+ },
26647
+ {
26648
+ id: "selene",
26649
+ name: "selene",
26650
+ category: "cli",
26651
+ about: 'A Lua linter (`selene .`), configured with a selene.toml (std = "lua54", and a standard library file for the FiveM / RedM globals).',
26652
+ size: "7 MB",
26653
+ source: { github: "Kampfkarren/selene", asset: "^selene-[\\d.]+-windows\\.zip$" },
26654
+ exe: "selene.exe",
26655
+ cli: true
26656
+ }
26657
+ ];
26498
26658
 
26499
26659
  // src/shared/apps/catalogue.ts
26500
26660
  var gh = (github, asset) => ({ github, asset });
@@ -27328,7 +27488,7 @@ var CORE_APPS = [
27328
27488
  cli: true
27329
27489
  }
27330
27490
  ];
27331
- var APPS = [...CORE_APPS, ...GAMEDEV_APPS, ...MODDING_APPS, ...MOBILE_APPS];
27491
+ var APPS = [...CORE_APPS, ...GAMEDEV_APPS, ...MODDING_APPS, ...MOBILE_APPS, ...AGENTS_WEB_APPS];
27332
27492
 
27333
27493
  // src/core/schema/apps.ts
27334
27494
  var CATALOGUE_IDS = APPS.filter((a) => !a.setting).map((a) => a.id);
@@ -27398,7 +27558,7 @@ var ProjectsSchema = external_exports.strictObject({
27398
27558
  var RESUME_SESSIONS = ["ask", "always", "afterCrash", "never"];
27399
27559
  var ResumeSchema = external_exports.strictObject({
27400
27560
  sessions: external_exports.enum(RESUME_SESSIONS).describe(
27401
- '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.'
27561
+ '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.'
27402
27562
  ),
27403
27563
  restartAfterCrash: external_exports.boolean().describe(
27404
27564
  "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)."
@@ -27417,14 +27577,14 @@ var RemoteUserSchema = external_exports.strictObject({
27417
27577
  });
27418
27578
  var WebLanSchema = external_exports.strictObject({
27419
27579
  enabled: external_exports.boolean().describe(
27420
- "(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."
27580
+ "(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."
27421
27581
  ),
27422
27582
  port: external_exports.number().int().min(1024).max(65535).describe("HTTPS port for paired devices on your network."),
27423
27583
  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).")
27424
27584
  });
27425
27585
  var WebRemoteSchema = external_exports.strictObject({
27426
27586
  windowsSignIn: external_exports.boolean().describe(
27427
- "(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."
27587
+ "(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."
27428
27588
  ),
27429
27589
  users: external_exports.array(RemoteUserSchema).max(32).describe("Who else may sign in with Windows, and their role (view or control)."),
27430
27590
  rememberDays: external_exports.number().int().min(1).max(90).describe(
@@ -27434,7 +27594,7 @@ var WebRemoteSchema = external_exports.strictObject({
27434
27594
  });
27435
27595
  var WebSchema = external_exports.strictObject({
27436
27596
  enabled: external_exports.boolean().describe(
27437
- "(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."
27597
+ "(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."
27438
27598
  ),
27439
27599
  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."),
27440
27600
  openOnLaunch: external_exports.boolean().describe("(Beta) With the web UI on: open it in your browser, already signed in, every time a sandbox starts."),
@@ -27445,7 +27605,7 @@ var WebSchema = external_exports.strictObject({
27445
27605
  var VPN_PROVIDERS = ["nordvpn", "openvpn-file", "wireguard-file"];
27446
27606
  var VpnSchema = external_exports.strictObject({
27447
27607
  enabled: external_exports.boolean().describe(
27448
- "(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)."
27608
+ "(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)."
27449
27609
  ),
27450
27610
  provider: external_exports.enum(VPN_PROVIDERS).describe(
27451
27611
  "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."
@@ -27463,13 +27623,14 @@ var VpnSchema = external_exports.strictObject({
27463
27623
  // src/core/schema/github.ts
27464
27624
  var GithubSchema = external_exports.strictObject({
27465
27625
  shareToken: external_exports.boolean().describe(
27466
- '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.'
27626
+ '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.'
27467
27627
  )
27468
27628
  });
27469
27629
 
27470
27630
  // src/shared/accounts/kinds.ts
27471
27631
  var AGENT_CAN_USE = "The agent in the sandbox can use this sign-in while it is there.";
27472
27632
  var ONE_PLACE = "It works in one sandbox at a time: a second sandbox starts without it while the first one runs.";
27633
+ var PERPLEXITY_KEY_PATTERN = /^pplx-[A-Za-z0-9_-]{8,200}$/;
27473
27634
  var SERVICE_SPECS = {
27474
27635
  epic: {
27475
27636
  kind: "epic",
@@ -27523,19 +27684,28 @@ var SERVICE_SPECS = {
27523
27684
  kind: "cfx",
27524
27685
  label: "Cfx.re (FiveM / RedM server key)",
27525
27686
  usedBy: ["fivem"],
27526
- sources: ["typed"],
27687
+ sources: ["typed", "file"],
27527
27688
  singleHolder: false,
27528
27689
  returns: false,
27690
+ // `import cfx --from` reads a whole server.cfg (they often run to tens of KB); the payload itself is tiny.
27529
27691
  maxBytes: 4 * 1024,
27692
+ maxFileBytes: 256 * 1024,
27530
27693
  warnings: [AGENT_CAN_USE + " Anyone with the key can run a server under your Cfx.re account."],
27531
27694
  fields: [
27532
- { name: "licenseKey", label: "Server licence key (cfxk_...)", secret: true, pattern: /^cfxk_[A-Za-z0-9_]+$/ },
27695
+ {
27696
+ name: "licenseKey",
27697
+ label: "Server licence key (cfxk_...)",
27698
+ secret: true,
27699
+ pattern: /^cfxk_[A-Za-z0-9_]+$/,
27700
+ only: "typed"
27701
+ },
27533
27702
  {
27534
27703
  name: "steamWebApiKey",
27535
27704
  label: "Steam Web API key (optional)",
27536
27705
  secret: true,
27537
27706
  optional: true,
27538
- pattern: /^[A-F0-9]{32}$/
27707
+ pattern: /^[A-F0-9]{32}$/,
27708
+ only: "typed"
27539
27709
  }
27540
27710
  ]
27541
27711
  },
@@ -27589,33 +27759,77 @@ var SERVICE_SPECS = {
27589
27759
  { name: "issuerId", label: "Issuer ID", secret: false },
27590
27760
  { name: "keyId", label: "Key ID", secret: false, pattern: /^[A-Z0-9]{10}$/ }
27591
27761
  ]
27762
+ },
27763
+ perplexity: {
27764
+ kind: "perplexity",
27765
+ label: "Perplexity API key",
27766
+ usedBy: ["perplexity"],
27767
+ sources: ["pc", "file", "typed"],
27768
+ singleHolder: false,
27769
+ returns: false,
27770
+ maxBytes: 1024,
27771
+ maxFileBytes: 64 * 1024,
27772
+ warnings: [
27773
+ AGENT_CAN_USE + " It can read the key and spend your API credit: use a separate API key with a spending limit.",
27774
+ "Perplexity Pro does not include API use; the API key is billed separately.",
27775
+ "Only the variable PERPLEXITY_API_KEY of the agent gets it: nothing in the sandbox writes it to a file."
27776
+ ],
27777
+ fields: [
27778
+ {
27779
+ name: "apiKey",
27780
+ label: "Perplexity API key (pplx-...)",
27781
+ secret: true,
27782
+ pattern: PERPLEXITY_KEY_PATTERN,
27783
+ only: "typed"
27784
+ }
27785
+ ]
27786
+ },
27787
+ comet: {
27788
+ kind: "comet",
27789
+ label: "Comet (Perplexity browser)",
27790
+ usedBy: ["comet"],
27791
+ sources: ["sandbox"],
27792
+ singleHolder: false,
27793
+ returns: true,
27794
+ maxBytes: 256 * 1024,
27795
+ warnings: [
27796
+ 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.",
27797
+ "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.",
27798
+ "Only the perplexity.ai sign-in cookies are kept: never saved passwords, other sites, localStorage or history. Never import your main browser profile.",
27799
+ "Several sandboxes can use it at once: the sign-in the last one hands back is kept."
27800
+ ],
27801
+ fields: []
27592
27802
  }
27593
27803
  };
27804
+ var APP_USER_TEXT = {
27805
+ perplexity: "the Perplexity MCP app",
27806
+ comet: "the Comet app"
27807
+ };
27808
+ function usedByText(usedBy) {
27809
+ return usedBy.map((u) => u in APP_USER_TEXT ? APP_USER_TEXT[u] : u).join(" or ");
27810
+ }
27594
27811
 
27595
27812
  // src/core/schema/accounts.ts
27596
27813
  function share(kind, how) {
27597
27814
  const spec = SERVICE_SPECS[kind];
27598
27815
  return external_exports.strictObject({
27599
27816
  share: external_exports.boolean().describe(
27600
- "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."
27817
+ "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."
27601
27818
  )
27602
27819
  });
27603
27820
  }
27604
27821
  var AccountsSchema = external_exports.strictObject({
27605
- epic: share("epic", "sign in to the launcher once in a sandbox, or take this PC's: sandbox account import epic"),
27606
- steam: share(
27607
- "steam",
27608
- "sign in once with sbx-steam login, or: sandbox account import steam --from <steamcmd folder>"
27609
- ),
27610
- unity: share("unity", "sign in once in a sandbox, or take this PC's licence: sandbox account import unity"),
27611
- cfx: share("cfx", "sandbox account login cfx"),
27612
- keystore: share("keystore", "sandbox account import keystore --from <upload.jks>"),
27613
- play: share("play", "sandbox account import play --from <service-account.json>"),
27614
- expo: share("expo", "sandbox account login expo"),
27615
- appstore: share("appstore", "sandbox account import appstore --from <AuthKey.p8>")
27616
- }).describe(
27617
- "Service sign-ins for sandboxes (game stores, engines, app signing). Manage them in Accounts: sandbox account status."
27618
- );
27822
+ epic: share("epic", "sign in to the launcher once in a sandbox, or take this PC's from Accounts"),
27823
+ steam: share("steam", "sign in once with sbx-steam login, or take it from a SteamCMD folder in Accounts"),
27824
+ unity: share("unity", "sign in once in a sandbox, or take this PC's licence from Accounts"),
27825
+ cfx: share("cfx", "type the key in Accounts"),
27826
+ keystore: share("keystore", "import the upload.jks file in Accounts"),
27827
+ play: share("play", "import the service-account.json file in Accounts"),
27828
+ expo: share("expo", "type the token in Accounts"),
27829
+ appstore: share("appstore", "import the AuthKey.p8 file in Accounts"),
27830
+ perplexity: share("perplexity", "type the API key in Accounts, or import it from a .env file"),
27831
+ comet: share("comet", "sign in to Comet once in a sandbox: it cannot be taken from this PC")
27832
+ }).describe("Service sign-ins for sandboxes (game stores, engines, app signing, Perplexity). Manage them in Accounts.");
27619
27833
 
27620
27834
  // src/core/schema/pc-installs.ts
27621
27835
  var pick2 = (item, what, example) => external_exports.union([external_exports.boolean(), external_exports.array(item)]).describe(
@@ -27679,7 +27893,9 @@ function reservedEnvName(name) {
27679
27893
  }
27680
27894
  var ConfigSchema = external_exports.strictObject({
27681
27895
  $schema: SchemaRefSchema.optional(),
27682
- defaultHarness: NameSchema.describe("Agent started by `sandbox launch` (sandbox claude always runs claude)."),
27896
+ defaultHarness: NameSchema.describe(
27897
+ "The agent that starts when you do not name one (starting claude by name always runs claude)."
27898
+ ),
27683
27899
  guestWorkspace: GuestWorkspaceSchema,
27684
27900
  readOnly: external_exports.boolean().describe("Map the workspace read-only."),
27685
27901
  workspaceFilter: WorkspaceFilterSchema,
@@ -27689,7 +27905,7 @@ var ConfigSchema = external_exports.strictObject({
27689
27905
  sharing: SharingSchema,
27690
27906
  storage: external_exports.strictObject({
27691
27907
  root: external_exports.string().min(1).describe(
27692
- "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."
27908
+ "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."
27693
27909
  ),
27694
27910
  persistAgentState: external_exports.boolean().describe("Keep agent logins and history between sandboxes."),
27695
27911
  dataName: NameSchema.describe("Name of the persistent data set (C:\\AgentData) shared by all workspaces."),
@@ -27697,11 +27913,11 @@ var ConfigSchema = external_exports.strictObject({
27697
27913
  `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.`
27698
27914
  ),
27699
27915
  contained: external_exports.enum(["off", "vhdx"]).describe(
27700
- '(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.'
27916
+ '(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.'
27701
27917
  ),
27702
27918
  containedMaxGb: external_exports.number().int().min(8).max(4096).describe("(beta) Largest size, in GB, the disk image of storage.contained may grow to."),
27703
27919
  warnDataGb: external_exports.number().min(0).describe(
27704
- "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."
27920
+ "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."
27705
27921
  )
27706
27922
  }),
27707
27923
  network: NetworkSchema,
@@ -27723,6 +27939,7 @@ var ConfigSchema = external_exports.strictObject({
27723
27939
  apps: AppsSchema,
27724
27940
  claudeProfile: ClaudeProfileSchema,
27725
27941
  harnesses: external_exports.record(NameSchema, HarnessSchema).describe("Agents that can run in the sandbox."),
27942
+ codex: CodexSchema,
27726
27943
  hooks: external_exports.strictObject({ failFast: external_exports.boolean().describe("Stop when a hook script fails.") }),
27727
27944
  projects: ProjectsSchema.describe(
27728
27945
  "Several projects in one sandbox: folders of projects mapped at every start, and adding folders while it runs."
@@ -27807,6 +28024,10 @@ var BootProgressSchema = external_exports.strictObject({
27807
28024
  done: external_exports.number().int().min(0).max(1e3),
27808
28025
  total: external_exports.number().int().min(0).max(1e3)
27809
28026
  });
28027
+ var BackgroundWorkSchema = external_exports.strictObject({
28028
+ name: Text(64),
28029
+ state: external_exports.enum(["running", "done", "failed"])
28030
+ });
27810
28031
  var SandboxStatusSchema = external_exports.object({
27811
28032
  launchId: Text(64),
27812
28033
  phase: external_exports.enum(["booting", "provisioning", "ready", "failed"]),
@@ -27818,7 +28039,9 @@ var SandboxStatusSchema = external_exports.object({
27818
28039
  /** The sandbox's IPv4 addresses (for network.forwardPorts; the host only uses ones on its Hyper-V network). */
27819
28040
  addresses: external_exports.array(external_exports.string().max(45)).max(8).optional(),
27820
28041
  /** A malformed progress is dropped, never the status (the phase still counts). */
27821
- progress: BootProgressSchema.optional().catch(void 0)
28042
+ progress: BootProgressSchema.optional().catch(void 0),
28043
+ /** Installs that continue after the boot is ready; a malformed list is dropped, never the status. */
28044
+ background: external_exports.array(BackgroundWorkSchema).max(16).optional().catch(void 0)
27822
28045
  });
27823
28046
  var VersionSchema = external_exports.strictObject({ spec: Text(128), source: Text(256) });
27824
28047
  var DatabasePlanSchema = external_exports.strictObject({
@@ -27966,6 +28189,8 @@ var ProjectStatusSchema = external_exports.object({
27966
28189
  var VpnStatusSchema = external_exports.object({
27967
28190
  state: external_exports.enum(["off", "starting", "up", "failed"]),
27968
28191
  message: Text(2e3),
28192
+ /** Why it failed, when it did: `auth` (login refused), `unreachable`, `driver`, `timeout` or `other`. */
28193
+ code: external_exports.enum(["auth", "unreachable", "driver", "timeout", "other"]).optional(),
27969
28194
  killSwitch: external_exports.boolean(),
27970
28195
  /** A direct connection was tried after the kill switch was applied: false = it still got out. */
27971
28196
  killSwitchHeld: external_exports.boolean().optional(),
@@ -28267,7 +28492,11 @@ function moveIntoPlace(work, destination) {
28267
28492
  fs6.mkdirSync(path7.dirname(destination), { recursive: true });
28268
28493
  fs6.renameSync(work, destination);
28269
28494
  }
28270
- async function extractArchive(archive, destination, members2 = []) {
28495
+ var extractLimit = null;
28496
+ function extractArchive(archive, destination, members2 = []) {
28497
+ return extractLimit ? extractLimit.run(() => extract(archive, destination, members2)) : extract(archive, destination, members2);
28498
+ }
28499
+ async function extract(archive, destination, members2) {
28271
28500
  fs6.mkdirSync(destination, { recursive: true });
28272
28501
  let status = await spawnAsync(SYSTEM.tar(), ["-xf", archive, "-C", destination, ...members2]);
28273
28502
  if (status !== 0 && /\.(zip|nupkg)$/i.test(archive)) {
@@ -28302,6 +28531,8 @@ import { pipeline } from "node:stream/promises";
28302
28531
  var Downloader = class {
28303
28532
  /** downloads.requireChecksum: refuse anything without an expected hash. The guest sets it from session.json. */
28304
28533
  requireChecksum = false;
28534
+ /** The guest's net pool: how many HTTP bodies stream at once. Host code leaves it null. */
28535
+ limit = null;
28305
28536
  watcher = null;
28306
28537
  /** Reports coarse progress of the downloads that start from now on to `watcher` (null: stop). */
28307
28538
  watch(watcher) {
@@ -28319,39 +28550,42 @@ var Downloader = class {
28319
28550
  "Refusing to download " + path8.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."
28320
28551
  );
28321
28552
  }
28322
- const response = await fetchRetry(url2, {}, 3, 20 * 60 * 1e3);
28323
- if (!response.body) throw new Error("Empty response for " + url2);
28324
28553
  fs7.mkdirSync(path8.dirname(destination), { recursive: true });
28325
28554
  const checks = ["sha256", "sha512", "sha1"].flatMap((kind) => {
28326
28555
  const want = sums[kind]?.trim().toLowerCase();
28327
28556
  return want ? [{ want, hash: crypto2.createHash(kind) }] : [];
28328
28557
  });
28329
- const size = Number(response.headers.get("content-length")) || 0;
28330
- const report = size > 0 ? this.watcher?.() ?? null : null;
28331
- let received = 0;
28332
- let tenth = 0;
28333
- let reportedAt = Date.now();
28334
- const tap = new Transform({
28335
- transform(chunk, _encoding, done) {
28336
- for (const c of checks) c.hash.update(chunk);
28337
- if (report) {
28338
- received += chunk.length;
28339
- const now = Math.floor(received * 10 / size);
28340
- if (now !== tenth || Date.now() - reportedAt > 5e3) {
28341
- tenth = now;
28342
- reportedAt = Date.now();
28343
- try {
28344
- report(Math.min(1, received / size));
28345
- } catch {
28558
+ const partial2 = destination + ".part";
28559
+ const transfer = async () => {
28560
+ const response = await fetchRetry(url2, {}, 3, 20 * 60 * 1e3);
28561
+ if (!response.body) throw new Error("Empty response for " + url2);
28562
+ const size = Number(response.headers.get("content-length")) || 0;
28563
+ const report = size > 0 ? this.watcher?.() ?? null : null;
28564
+ let received = 0;
28565
+ let tenth = 0;
28566
+ let reportedAt = Date.now();
28567
+ const tap = new Transform({
28568
+ transform(chunk, _encoding, done) {
28569
+ for (const c of checks) c.hash.update(chunk);
28570
+ if (report) {
28571
+ received += chunk.length;
28572
+ const now = Math.floor(received * 10 / size);
28573
+ if (now !== tenth || Date.now() - reportedAt > 5e3) {
28574
+ tenth = now;
28575
+ reportedAt = Date.now();
28576
+ try {
28577
+ report(Math.min(1, received / size));
28578
+ } catch {
28579
+ }
28346
28580
  }
28347
28581
  }
28582
+ done(null, chunk);
28348
28583
  }
28349
- done(null, chunk);
28350
- }
28351
- });
28352
- const partial2 = destination + ".part";
28353
- try {
28584
+ });
28354
28585
  await pipeline(Readable.fromWeb(response.body), tap, fs7.createWriteStream(partial2));
28586
+ };
28587
+ try {
28588
+ await (this.limit ? this.limit.run(transfer) : transfer());
28355
28589
  if (checks.some((c) => c.hash.digest("hex") !== c.want)) throw new Error("Checksum mismatch for " + url2);
28356
28590
  if (sums.verify) await sums.verify(partial2);
28357
28591
  fs7.rmSync(destination, { force: true });
@@ -28368,12 +28602,17 @@ var Downloader = class {
28368
28602
  const work = stagingFolder(destination);
28369
28603
  try {
28370
28604
  const archive = path8.join(work, options.fileName ?? path8.basename(new URL(url2).pathname));
28371
- await this.file(url2, archive, {
28372
- sha256: options.sha256,
28373
- sha512: options.sha512,
28374
- sha1: options.sha1,
28375
- ...options.verify ? { verify: options.verify } : {}
28376
- });
28605
+ if (options.cached && fs7.existsSync(options.cached)) {
28606
+ fs7.mkdirSync(work, { recursive: true });
28607
+ fs7.copyFileSync(options.cached, archive);
28608
+ fs7.rmSync(options.cached, { force: true });
28609
+ } else
28610
+ await this.file(url2, archive, {
28611
+ sha256: options.sha256,
28612
+ sha512: options.sha512,
28613
+ sha1: options.sha1,
28614
+ ...options.verify ? { verify: options.verify } : {}
28615
+ });
28377
28616
  const extracted = path8.join(work, "x");
28378
28617
  await extractArchive(archive, extracted, options.members);
28379
28618
  let root = extracted;