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.
- package/README.md +1 -1
- package/config.example.json +17 -1
- package/dist/app/features/access/access.def.js +5 -2
- package/dist/app/features/access/access.run.js +7 -3
- package/dist/app/features/accounts/accounts.def.d.ts +33 -1
- package/dist/app/features/accounts/accounts.def.js +10 -4
- package/dist/app/features/accounts/accounts.run.d.ts +2 -0
- package/dist/app/features/accounts/accounts.run.js +7 -2
- package/dist/app/features/accounts/services.def.d.ts +7 -1
- package/dist/app/features/accounts/services.def.js +19 -16
- package/dist/app/features/accounts/services.run.d.ts +2 -0
- package/dist/app/features/accounts/services.run.js +44 -16
- package/dist/app/features/agent-commands/agent-commands.def.d.ts +37 -0
- package/dist/app/features/agent-commands/agent-commands.def.js +91 -0
- package/dist/app/features/agent-commands/agent-commands.run.d.ts +28 -0
- package/dist/app/features/agent-commands/agent-commands.run.js +35 -0
- package/dist/app/features/agent-commands/index.d.ts +2 -0
- package/dist/app/features/agent-commands/index.js +3 -0
- package/dist/app/features/agents/agents.def.d.ts +14 -1
- package/dist/app/features/agents/agents.def.js +61 -6
- package/dist/app/features/agents/agents.run.d.ts +1 -0
- package/dist/app/features/agents/agents.run.js +8 -1
- package/dist/app/features/agents/claude-env.def.d.ts +36 -0
- package/dist/app/features/agents/claude-env.def.js +305 -0
- package/dist/app/features/agents/env.def.d.ts +163 -0
- package/dist/app/features/agents/env.def.js +184 -0
- package/dist/app/features/agents/env.run.d.ts +43 -0
- package/dist/app/features/agents/env.run.js +86 -0
- package/dist/app/features/agents/index.d.ts +2 -0
- package/dist/app/features/agents/index.js +2 -0
- package/dist/app/features/defs.d.ts +171 -3
- package/dist/app/features/defs.js +9 -0
- package/dist/app/features/engine/engine.run.js +1 -1
- package/dist/app/features/github/github.def.d.ts +44 -3
- package/dist/app/features/github/github.def.js +145 -63
- package/dist/app/features/github/github.run.d.ts +9 -2
- package/dist/app/features/github/github.run.js +43 -5
- package/dist/app/features/health/health.def.js +8 -2
- package/dist/app/features/logs/logs.def.js +0 -8
- package/dist/app/features/projects/projects.def.js +2 -2
- package/dist/app/features/projects/projects.run.js +5 -5
- package/dist/app/features/sandbox/sandbox.def.js +7 -3
- package/dist/app/features/sessions/sessions.def.d.ts +4 -4
- package/dist/app/features/sessions/sessions.def.js +0 -5
- package/dist/app/features/sessions/sessions.run.d.ts +1 -1
- package/dist/app/features/sessions/sessions.run.js +2 -2
- package/dist/app/features/settings/categories.def.js +7 -2
- package/dist/app/features/settings/settings-rows.js +6 -2
- package/dist/app/features/settings/settings.def.js +1 -1
- package/dist/app/features/settings/settings.run.d.ts +8 -0
- package/dist/app/features/settings/settings.run.js +12 -3
- package/dist/app/features/storage/storage.run.js +18 -9
- package/dist/app/features/updates/update-lines.js +2 -2
- package/dist/app/features/updates/updates.def.js +1 -1
- package/dist/app/features/updates/updates.run.js +13 -3
- package/dist/app/features/vpn/vpn.def.d.ts +33 -0
- package/dist/app/features/vpn/vpn.def.js +30 -6
- package/dist/app/features/vpn/vpn.run.d.ts +11 -0
- package/dist/app/features/vpn/vpn.run.js +4 -1
- package/dist/app/features/web/web.def.js +2 -2
- package/dist/app/features/web/web.run.js +12 -4
- package/dist/app/kernel/errors.d.ts +7 -0
- package/dist/app/kernel/errors.js +18 -3
- package/dist/app/kernel/rpc.d.ts +6 -1
- package/dist/app/kernel/view.d.ts +11 -1
- package/dist/app/registry.js +7 -1
- package/dist/bin/agent-sandbox.js +2 -2
- package/dist/bin/{chunk-N4GXYTLV.js → chunk-JETGP2C3.js} +239 -72
- package/dist/bin/{chunk-MY7NLQQY.js → chunk-XZKOPGNH.js} +1 -1
- package/dist/bin/{chunk-FRPLQLSY.js → chunk-ZTTOF5V3.js} +6566 -4964
- package/dist/bin/claude-host.js +2 -2
- package/dist/bin/claude-sbx.js +2 -2
- package/dist/bin/codex-sbx.js +2 -2
- package/dist/bin/gemini-sbx.js +2 -2
- package/dist/bin/sandbox.js +2 -2
- package/dist/bin/sbx-hide.js +2 -2
- package/dist/bin/sbx-show.js +2 -2
- package/dist/cli/commands/agent-commands.d.ts +0 -1
- package/dist/cli/commands/agent-commands.js +2 -32
- package/dist/cli/commands/index.d.ts +1 -1
- package/dist/cli/commands/index.js +1 -1
- package/dist/cli/commands/launch/launch.js +2 -2
- package/dist/cli/commands/registry.js +3 -2
- package/dist/cli/manifest.d.ts +3 -3
- package/dist/cli/manifest.js +3 -2
- package/dist/cli/menu/coverage-exempt.d.ts +17 -0
- package/dist/cli/menu/coverage-exempt.js +61 -0
- package/dist/cli/menu/io-menu.d.ts +2 -0
- package/dist/cli/menu/io-menu.js +50 -5
- package/dist/cli/menu/menu.d.ts +1 -1
- package/dist/cli/menu/menu.js +3 -3
- package/dist/cli/menu/pages/accounts-page.js +1 -1
- package/dist/cli/menu/pages/agents-page.d.ts +7 -2
- package/dist/cli/menu/pages/agents-page.js +75 -13
- package/dist/cli/menu/pages/maintenance-page.d.ts +6 -0
- package/dist/cli/menu/pages/maintenance-page.js +10 -4
- package/dist/cli/menu/pages/sessions-page.d.ts +2 -0
- package/dist/cli/menu/pages/sessions-page.js +12 -4
- package/dist/cli/menu/pages/settings-page.js +13 -1
- package/dist/cli/menu/remote-menu.js +1 -1
- package/dist/cli/menu/shell.d.ts +5 -0
- package/dist/cli/menu/shell.js +13 -0
- package/dist/cli/menu/views.js +2 -1
- package/dist/cli/report.js +2 -0
- package/dist/cli/services/agent-commands-service.d.ts +2 -0
- package/dist/cli/services/agent-commands-service.js +13 -7
- package/dist/cli/services/vpn-service.d.ts +5 -1
- package/dist/cli/services/vpn-service.js +6 -1
- package/dist/cli/tui/app.d.ts +5 -0
- package/dist/cli/tui/app.js +2 -0
- package/dist/cli/tui/dialogs/text-screen.js +2 -1
- package/dist/cli/tui/terminal.js +3 -1
- package/dist/core/config/defaults.js +12 -1
- package/dist/core/detect/toolchains.js +9 -0
- package/dist/core/disk.d.ts +1 -5
- package/dist/core/disk.js +1 -16
- package/dist/core/schema/accounts.d.ts +6 -0
- package/dist/core/schema/accounts.js +13 -11
- package/dist/core/schema/codex.d.ts +29 -0
- package/dist/core/schema/codex.js +24 -0
- package/dist/core/schema/config.d.ts +58 -14
- package/dist/core/schema/config.js +6 -4
- package/dist/core/schema/github.js +1 -1
- package/dist/core/schema/index.d.ts +1 -0
- package/dist/core/schema/index.js +1 -0
- package/dist/core/schema/profile.js +8 -4
- package/dist/core/schema/resume.js +1 -1
- package/dist/core/schema/sandbox.js +3 -3
- package/dist/core/schema/toolchains.d.ts +4 -0
- package/dist/core/schema/toolchains.js +3 -0
- package/dist/core/schema/vpn.js +1 -1
- package/dist/core/schema/web.js +3 -3
- package/dist/core/types.d.ts +8 -0
- package/dist/core/util/errors.d.ts +11 -1
- package/dist/core/util/errors.js +7 -1
- package/dist/core/util/index.d.ts +1 -1
- package/dist/core/util/index.js +1 -1
- package/dist/guest/accounts/adapter.d.ts +2 -0
- package/dist/guest/accounts/adapters.js +4 -0
- package/dist/guest/accounts/apply.d.ts +10 -6
- package/dist/guest/accounts/kinds/cfx.d.ts +7 -0
- package/dist/guest/accounts/kinds/cfx.js +33 -3
- package/dist/guest/accounts/kinds/comet.d.ts +7 -0
- package/dist/guest/accounts/kinds/comet.js +50 -0
- package/dist/guest/accounts/kinds/perplexity.d.ts +2 -0
- package/dist/guest/accounts/kinds/perplexity.js +12 -0
- package/dist/guest/accounts/watch.d.ts +2 -0
- package/dist/guest/accounts/watch.js +12 -2
- package/dist/guest/agents/agent-files.d.ts +26 -6
- package/dist/guest/agents/agent-files.js +84 -14
- package/dist/guest/agents/agent-installer.js +1 -1
- package/dist/guest/agents/local-state.d.ts +5 -2
- package/dist/guest/agents/local-state.js +24 -10
- package/dist/guest/agents/profile-links.d.ts +2 -0
- package/dist/guest/agents/profile-links.js +18 -4
- package/dist/guest/apps/after-install.js +19 -0
- package/dist/guest/apps/app-installer.d.ts +11 -0
- package/dist/guest/apps/app-installer.js +69 -6
- package/dist/guest/apps/comet-unpack.d.ts +20 -0
- package/dist/guest/apps/comet-unpack.js +127 -0
- package/dist/guest/apps/index.d.ts +1 -1
- package/dist/guest/apps/index.js +1 -1
- package/dist/guest/apps/resolvers-agents-web.d.ts +2 -0
- package/dist/guest/apps/resolvers-agents-web.js +7 -0
- package/dist/guest/apps/resolvers.js +2 -0
- package/dist/guest/apps/shortcuts.d.ts +2 -0
- package/dist/guest/apps/shortcuts.js +1 -0
- package/dist/guest/apps/unpack.js +14 -4
- package/dist/guest/boot/boot.d.ts +45 -16
- package/dist/guest/boot/boot.js +325 -149
- package/dist/guest/boot/graph.d.ts +252 -0
- package/dist/guest/boot/graph.js +257 -0
- package/dist/guest/boot/guide-lines.d.ts +25 -0
- package/dist/guest/boot/guide-lines.js +41 -0
- package/dist/guest/boot/guide.d.ts +1 -4
- package/dist/guest/boot/guide.js +6 -8
- package/dist/guest/boot/runner.d.ts +77 -0
- package/dist/guest/boot/runner.js +215 -0
- package/dist/guest/browser/cdp.d.ts +71 -0
- package/dist/guest/browser/cdp.js +306 -0
- package/dist/guest/browser/comet.d.ts +28 -0
- package/dist/guest/browser/comet.js +155 -0
- package/dist/guest/daemon/project-provisioner.js +6 -1
- package/dist/guest/daemon/sessions.js +2 -1
- package/dist/guest/devtools/fivem.d.ts +1 -1
- package/dist/guest/devtools/fivem.js +243 -3
- package/dist/guest/entries/daemon.js +2 -0
- package/dist/guest/runtime/log.d.ts +12 -0
- package/dist/guest/runtime/log.js +29 -5
- package/dist/guest/runtime/pools.d.ts +24 -0
- package/dist/guest/runtime/pools.js +60 -0
- package/dist/guest/runtime/process.d.ts +4 -0
- package/dist/guest/runtime/process.js +38 -1
- package/dist/guest/runtime/status.d.ts +5 -1
- package/dist/guest/runtime/status.js +19 -0
- package/dist/guest/setup/addon-mcp.d.ts +1 -1
- package/dist/guest/setup/addon-mcp.js +52 -12
- package/dist/guest/setup/agent-addons.d.ts +3 -2
- package/dist/guest/setup/agent-addons.js +12 -3
- package/dist/guest/setup/environment.d.ts +1 -1
- package/dist/guest/setup/environment.js +25 -12
- package/dist/guest/setup/headroom.d.ts +8 -3
- package/dist/guest/setup/headroom.js +44 -15
- package/dist/guest/setup/path-plan.d.ts +28 -0
- package/dist/guest/setup/path-plan.js +69 -2
- package/dist/guest/setup/shell-path.d.ts +1 -1
- package/dist/guest/setup/shell-path.js +3 -3
- package/dist/guest/toolchains/fivem/artifacts.d.ts +48 -1
- package/dist/guest/toolchains/fivem/artifacts.js +97 -4
- package/dist/guest/toolchains/fivem/fivem.d.ts +32 -1
- package/dist/guest/toolchains/fivem/fivem.js +168 -3
- package/dist/guest/toolchains/fivem/scaffold.d.ts +35 -0
- package/dist/guest/toolchains/fivem/scaffold.js +105 -0
- package/dist/guest/toolchains/fivem/serve-plan.d.ts +34 -0
- package/dist/guest/toolchains/fivem/serve-plan.js +61 -0
- package/dist/guest/toolchains/installers.d.ts +6 -10
- package/dist/guest/toolchains/installers.js +4 -12
- package/dist/guest/toolchains/languages/go.js +1 -1
- package/dist/guest/toolchains/languages/node.js +2 -1
- package/dist/guest/toolchains/languages/php.d.ts +2 -0
- package/dist/guest/toolchains/languages/php.js +13 -1
- package/dist/guest/toolchains/languages/python-tools.js +1 -1
- package/dist/guest/toolchains/languages/ruby.js +1 -1
- package/dist/guest/toolchains/native/autosdk.d.ts +3 -0
- package/dist/guest/toolchains/native/autosdk.js +50 -0
- package/dist/guest/toolchains/native/binstall.js +1 -1
- package/dist/guest/toolchains/native/msvc/packages.js +10 -4
- package/dist/guest/toolchains/native/rust.d.ts +2 -0
- package/dist/guest/toolchains/native/rust.js +11 -4
- package/dist/guest/toolchains/native/unreal.d.ts +2 -0
- package/dist/guest/toolchains/native/unreal.js +19 -6
- package/dist/guest/toolchains/native/vcruntime.d.ts +2 -3
- package/dist/guest/toolchains/native/vcruntime.js +12 -7
- package/dist/guest/toolchains/native/visual-studio.d.ts +5 -2
- package/dist/guest/toolchains/native/visual-studio.js +127 -25
- package/dist/guest/toolchains/native/vs-request.d.ts +23 -0
- package/dist/guest/toolchains/native/vs-request.js +62 -1
- package/dist/guest/toolchains/not-yet.d.ts +1 -1
- package/dist/guest/toolchains/not-yet.js +3 -3
- package/dist/guest/toolchains/persisted.js +2 -7
- package/dist/guest/toolchains/plan.js +27 -11
- package/dist/guest/toolchains/scheduler.d.ts +2 -21
- package/dist/guest/toolchains/scheduler.js +7 -121
- package/dist/guest/toolchains/setup.d.ts +15 -2
- package/dist/guest/toolchains/setup.js +39 -20
- package/dist/guest/toolchains/signature.d.ts +5 -0
- package/dist/guest/toolchains/signature.js +22 -0
- package/dist/guest/toolchains/split.d.ts +28 -0
- package/dist/guest/toolchains/split.js +60 -0
- package/dist/guest/toolchains/steam/client.js +2 -1
- package/dist/guest/toolchains/step-scheduler.d.ts +51 -0
- package/dist/guest/toolchains/step-scheduler.js +147 -0
- package/dist/guest/toolchains/step.d.ts +13 -0
- package/dist/guest/toolchains/tools/git.js +18 -0
- package/dist/guest/vpn/openvpn.js +3 -4
- package/dist/guest/vpn/tunnel.d.ts +3 -0
- package/dist/guest/vpn/tunnel.js +10 -12
- package/dist/guest/vpn/vpn.js +6 -1
- package/dist/guest/vpn/wireguard.js +11 -4
- package/dist/host/accounts/deliver.js +7 -0
- package/dist/host/accounts/handoff.js +2 -6
- package/dist/host/accounts/index.d.ts +1 -1
- package/dist/host/accounts/index.js +1 -1
- package/dist/host/accounts/kinds/cfx.d.ts +1 -1
- package/dist/host/accounts/kinds/cfx.js +47 -4
- package/dist/host/accounts/kinds/comet.d.ts +2 -0
- package/dist/host/accounts/kinds/comet.js +6 -0
- package/dist/host/accounts/kinds/perplexity.d.ts +2 -0
- package/dist/host/accounts/kinds/perplexity.js +30 -0
- package/dist/host/accounts/leases.d.ts +9 -3
- package/dist/host/accounts/leases.js +13 -2
- package/dist/host/accounts/source.d.ts +7 -1
- package/dist/host/accounts/source.js +28 -1
- package/dist/host/accounts/sources.js +4 -0
- package/dist/host/agent-commands/commands.js +1 -1
- package/dist/host/agent-commands/forwarders.d.ts +14 -2
- package/dist/host/agent-commands/forwarders.js +31 -13
- package/dist/host/agent-commands/reconcile.d.ts +2 -1
- package/dist/host/agent-commands/reconcile.js +7 -8
- package/dist/host/agent-commands/user-path.d.ts +5 -0
- package/dist/host/agent-commands/user-path.js +13 -0
- package/dist/host/github/deliver.d.ts +1 -1
- package/dist/host/github/deliver.js +20 -1
- package/dist/host/github/index.d.ts +2 -1
- package/dist/host/github/index.js +1 -0
- package/dist/host/github/token.d.ts +13 -1
- package/dist/host/github/token.js +19 -2
- package/dist/host/github/verify.d.ts +27 -0
- package/dist/host/github/verify.js +61 -0
- package/dist/host/launch/hints/fivem.d.ts +3 -1
- package/dist/host/launch/hints/fivem.js +68 -2
- package/dist/host/launch/session-file.js +5 -0
- package/dist/host/launch/toolchains.d.ts +2 -1
- package/dist/host/launch/toolchains.js +5 -3
- package/dist/host/profile/accounts.js +2 -4
- package/dist/host/profile/claude-login.d.ts +3 -2
- package/dist/host/profile/claude-login.js +3 -13
- package/dist/host/vpn/index.d.ts +2 -1
- package/dist/host/vpn/index.js +2 -1
- package/dist/host/vpn/last.d.ts +28 -0
- package/dist/host/vpn/last.js +43 -0
- package/dist/host/vpn/login.d.ts +3 -1
- package/dist/host/vpn/login.js +17 -3
- package/dist/host/vpn/nordvpn.d.ts +2 -4
- package/dist/host/vpn/nordvpn.js +2 -24
- package/dist/runtime/agent.js +433 -90
- package/dist/runtime/daemon.js +3378 -1546
- package/dist/runtime/db.js +363 -90
- package/dist/runtime/main.js +5134 -2096
- package/dist/runtime/netproxy.js +308 -69
- package/dist/runtime/tool.js +2867 -1765
- package/dist/runtime/view.js +308 -69
- package/dist/selftest/agent-commands.test.js +45 -7
- package/dist/selftest/agent-paths.test.js +40 -13
- package/dist/selftest/agent-settings.test.d.ts +2 -0
- package/dist/selftest/agent-settings.test.js +94 -0
- package/dist/selftest/agents-web.test.d.ts +2 -0
- package/dist/selftest/agents-web.test.js +647 -0
- package/dist/selftest/app.test.js +7 -3
- package/dist/selftest/boot-runner.test.d.ts +2 -0
- package/dist/selftest/boot-runner.test.js +456 -0
- package/dist/selftest/channel.test.js +15 -0
- package/dist/selftest/cli.test.js +4 -0
- package/dist/selftest/fivem.test.js +249 -3
- package/dist/selftest/github.test.js +94 -9
- package/dist/selftest/guest-boot.test.js +3 -0
- package/dist/selftest/health.test.js +1 -1
- package/dist/selftest/index.js +10 -0
- package/dist/selftest/layout.test.js +5 -0
- package/dist/selftest/menu-coverage.test.d.ts +2 -0
- package/dist/selftest/menu-coverage.test.js +46 -0
- package/dist/selftest/menu-screens.js +37 -1
- package/dist/selftest/menu.test.js +5 -3
- package/dist/selftest/pc-installs.test.js +5 -0
- package/dist/selftest/persisted-installs.test.js +72 -0
- package/dist/selftest/service-accounts.test.js +3 -2
- package/dist/selftest/support/engine-golden.js +28 -1
- package/dist/selftest/support/fixtures.d.ts +15 -0
- package/dist/selftest/support/web-preview.d.ts +34 -1
- package/dist/selftest/support/web-preview.js +21 -18
- package/dist/selftest/toolchains.test.js +23 -1
- package/dist/selftest/ui-text.test.d.ts +7 -0
- package/dist/selftest/ui-text.test.js +300 -0
- package/dist/selftest/vpn.test.js +51 -3
- package/dist/shared/accounts/anthropic.d.ts +5 -0
- package/dist/shared/accounts/anthropic.js +15 -0
- package/dist/shared/accounts/index.d.ts +3 -0
- package/dist/shared/accounts/index.js +3 -0
- package/dist/shared/accounts/kinds/comet.d.ts +12 -0
- package/dist/shared/accounts/kinds/comet.js +64 -0
- package/dist/shared/accounts/kinds/perplexity.d.ts +8 -0
- package/dist/shared/accounts/kinds/perplexity.js +37 -0
- package/dist/shared/accounts/kinds.d.ts +24 -5
- package/dist/shared/accounts/kinds.js +86 -4
- package/dist/shared/accounts/payloads.d.ts +81 -0
- package/dist/shared/accounts/payloads.js +39 -1
- package/dist/shared/apps/agent-addons.d.ts +33 -5
- package/dist/shared/apps/agent-addons.js +95 -3
- package/dist/shared/apps/catalogue-agents-web.d.ts +14 -0
- package/dist/shared/apps/catalogue-agents-web.js +112 -0
- package/dist/shared/apps/catalogue-modding.js +32 -1
- package/dist/shared/apps/catalogue.d.ts +27 -3
- package/dist/shared/apps/catalogue.js +2 -1
- package/dist/shared/apps/index.d.ts +3 -1
- package/dist/shared/apps/index.js +3 -1
- package/dist/shared/channel/schema.d.ts +40 -3
- package/dist/shared/channel/schema.js +9 -0
- package/dist/shared/channel/secrets.d.ts +19 -0
- package/dist/shared/concurrency/index.d.ts +3 -0
- package/dist/shared/concurrency/index.js +3 -0
- package/dist/shared/concurrency/installer-retry.d.ts +6 -0
- package/dist/shared/concurrency/installer-retry.js +10 -0
- package/dist/shared/concurrency/limiter.d.ts +19 -0
- package/dist/shared/concurrency/limiter.js +67 -0
- package/dist/shared/concurrency/pools.d.ts +7 -0
- package/dist/shared/concurrency/pools.js +9 -0
- package/dist/shared/download/archive.d.ts +2 -0
- package/dist/shared/download/archive.js +11 -1
- package/dist/shared/download/bounded-fetch.d.ts +13 -0
- package/dist/shared/download/bounded-fetch.js +40 -0
- package/dist/shared/download/downloader.d.ts +5 -0
- package/dist/shared/download/downloader.js +50 -38
- package/dist/shared/download/index.d.ts +2 -1
- package/dist/shared/download/index.js +2 -1
- package/dist/shared/io/disk.d.ts +9 -0
- package/dist/shared/io/disk.js +19 -0
- package/dist/shared/io/index.d.ts +1 -0
- package/dist/shared/io/index.js +1 -0
- package/dist/shared/readiness.d.ts +9 -0
- package/dist/shared/readiness.js +11 -0
- package/dist/shared/signer.d.ts +24 -0
- package/dist/shared/signer.js +15 -0
- package/dist/shared/vpn/failure.d.ts +10 -0
- package/dist/shared/vpn/failure.js +28 -0
- package/dist/sync/watcher.js +2 -0
- package/dist/web/index.html +1 -1
- package/dist/web/{main-GVZWWP4I.js → main-CCILLX2M.js} +75 -74
- package/native/csharp/HcsHost/AssemblyInfo.cs +3 -3
- package/native/csharp/HostTools/AssemblyInfo.cs +3 -3
- package/native/csharp/HostTools/Program.cs +14 -1
- package/native/csharp/HostTools/UserPath.cs +17 -0
- package/native/csharp/StorageHelper/AssemblyInfo.cs +3 -3
- package/native/scripts/edit-user-path.ps1 +6 -2
- package/package.json +1 -1
- package/sandbox/addons/browser-use-mcp/requirements.in +1 -0
- package/sandbox/addons/browser-use-mcp/requirements.txt +2350 -0
- package/sandbox/addons/chrome-devtools-mcp/package-lock.json +38 -0
- package/sandbox/addons/chrome-devtools-mcp/package.json +7 -0
- package/sandbox/addons/comet-mcp/package-lock.json +1277 -0
- package/sandbox/addons/comet-mcp/package.json +7 -0
- package/sandbox/addons/perplexity-mcp/package-lock.json +1655 -0
- package/sandbox/addons/perplexity-mcp/package.json +7 -0
- package/sandbox/scripts/add-firewall-port.ps1 +18 -4
- package/sandbox/scripts/get-signature.ps1 +13 -0
- package/sandbox/scripts/set-machine-environment.ps1 +30 -15
- package/sandbox/templates/fivem/README.txt +6 -2
- package/sandbox/templates/fivem/cs/Client/Client.csproj +15 -0
- package/sandbox/templates/fivem/cs/Client/ClientMain.cs +20 -0
- package/sandbox/templates/fivem/cs/Server/Server.csproj +14 -0
- package/sandbox/templates/fivem/cs/Server/ServerMain.cs +20 -0
- package/sandbox/templates/fivem/cs/fxmanifest.lua +11 -0
- package/sandbox/templates/fivem/js/client.js +12 -0
- package/sandbox/templates/fivem/js/fxmanifest.lua +9 -0
- package/sandbox/templates/fivem/js/server.js +6 -0
- package/sandbox/templates/fivem/lua/client.lua +8 -0
- package/sandbox/templates/fivem/lua/fxmanifest.lua +10 -0
- package/sandbox/templates/fivem/lua/server.lua +6 -0
- package/sandbox/templates/fivem/server.cfg +37 -0
- package/sandbox/templates/fivem/ts/build.js +17 -0
- package/sandbox/templates/fivem/ts/fxmanifest.lua +9 -0
- package/sandbox/templates/fivem/ts/package.json +16 -0
- package/sandbox/templates/fivem/ts/src/client/client.ts +12 -0
- package/sandbox/templates/fivem/ts/src/client/tsconfig.json +13 -0
- package/sandbox/templates/fivem/ts/src/server/server.ts +6 -0
- package/sandbox/templates/fivem/ts/src/server/tsconfig.json +13 -0
- package/schemas/config.schema.json +120 -27
- package/schemas/sandbox-config.schema.json +45 -14
- package/sandbox/scripts/get-signer.ps1 +0 -8
package/dist/runtime/agent.js
CHANGED
|
@@ -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(
|
|
726
|
-
|
|
727
|
-
var Array2 =
|
|
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 =
|
|
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 ?
|
|
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 =
|
|
753
|
-
var nativeCeil = Math2.ceil, nativeFloor = Math2.floor, nativeGetSymbols = Object2.getOwnPropertySymbols, nativeIsBuffer = Buffer2 ? Buffer2.isBuffer : undefined2, nativeIsFinite =
|
|
754
|
-
var DataView = getNative(
|
|
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);
|
|
@@ -25351,6 +25351,22 @@ var DatabasesSchema = external_exports.strictObject({
|
|
|
25351
25351
|
})
|
|
25352
25352
|
});
|
|
25353
25353
|
|
|
25354
|
+
// src/core/schema/codex.ts
|
|
25355
|
+
var CodexSchema = external_exports.strictObject({
|
|
25356
|
+
sandboxMode: external_exports.enum(["danger-full-access", "workspace-write", "read-only"]).describe(
|
|
25357
|
+
"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."
|
|
25358
|
+
),
|
|
25359
|
+
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.'),
|
|
25360
|
+
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."),
|
|
25361
|
+
reasoningEffort: external_exports.enum(["default", "minimal", "low", "medium", "high", "xhigh"]).describe(`How hard Codex thinks. "default" = Codex's own default.`),
|
|
25362
|
+
windowsSandbox: external_exports.enum(["off", "unelevated", "elevated"]).describe(
|
|
25363
|
+
`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.`
|
|
25364
|
+
),
|
|
25365
|
+
mcpLoginsInFile: external_exports.boolean().describe(
|
|
25366
|
+
`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.`
|
|
25367
|
+
)
|
|
25368
|
+
});
|
|
25369
|
+
|
|
25354
25370
|
// src/core/schema/harness.ts
|
|
25355
25371
|
var SubfolderSchema = external_exports.string().regex(/^(?!.*(^|[\\/])\.\.([\\/]|$))[A-Za-z0-9._ -]+([\\/][A-Za-z0-9._ -]+)*$/, "a plain relative folder");
|
|
25356
25372
|
var HarnessHomeSchema = external_exports.strictObject({
|
|
@@ -25410,15 +25426,17 @@ var SecretsSchema = external_exports.strictObject({
|
|
|
25410
25426
|
)
|
|
25411
25427
|
});
|
|
25412
25428
|
var AttachSchema = external_exports.strictObject({
|
|
25413
|
-
enabled: external_exports.boolean().describe(
|
|
25429
|
+
enabled: external_exports.boolean().describe(
|
|
25430
|
+
"Allow attaching this PC's terminal to a session (the terminal option when starting an agent, and attach)."
|
|
25431
|
+
),
|
|
25414
25432
|
reuseSession: external_exports.boolean().describe(
|
|
25415
|
-
"
|
|
25433
|
+
"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)."
|
|
25416
25434
|
),
|
|
25417
25435
|
auto: external_exports.boolean().describe(
|
|
25418
25436
|
"Starting an agent attaches this terminal automatically, as if you passed -t (only in an interactive terminal)."
|
|
25419
25437
|
),
|
|
25420
25438
|
autoHide: external_exports.boolean().describe(
|
|
25421
|
-
"Hide the Windows Sandbox window whenever this terminal attaches; it keeps running (
|
|
25439
|
+
"Hide the Windows Sandbox window whenever this terminal attaches; it keeps running (Sandbox > Status shows it again)."
|
|
25422
25440
|
),
|
|
25423
25441
|
confirmCtrlC: external_exports.boolean().describe(
|
|
25424
25442
|
'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.'
|
|
@@ -25435,7 +25453,7 @@ var ClaudeProfileSchema = external_exports.strictObject({
|
|
|
25435
25453
|
hostDir: external_exports.string().describe('Your Claude folder, or "auto" (~/.claude or CLAUDE_CONFIG_DIR).'),
|
|
25436
25454
|
include: external_exports.array(external_exports.string().regex(/^[A-Za-z0-9._-]+$/)).describe("Files and folders copied from it."),
|
|
25437
25455
|
globalStateFile: external_exports.string().describe('Your .claude.json, or "auto". Empty string = do not copy.'),
|
|
25438
|
-
copyCredentials: external_exports.boolean().describe("Copy your Claude LOGIN into the sandbox. Prefer
|
|
25456
|
+
copyCredentials: external_exports.boolean().describe("Copy your Claude LOGIN into the sandbox. Prefer saving the login in Accounts instead."),
|
|
25439
25457
|
overwrite: external_exports.boolean().describe("Refresh these settings from this PC on every launch."),
|
|
25440
25458
|
sharePluginsAcrossAccounts: external_exports.boolean().describe(
|
|
25441
25459
|
"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."
|
|
@@ -25464,7 +25482,7 @@ var MappingSchema = external_exports.strictObject({
|
|
|
25464
25482
|
});
|
|
25465
25483
|
var SandboxSchema = external_exports.strictObject({
|
|
25466
25484
|
engine: external_exports.enum(["windows-sandbox", "hcs"]).describe(
|
|
25467
|
-
'(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 (
|
|
25485
|
+
'(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.'
|
|
25468
25486
|
),
|
|
25469
25487
|
memoryMb: external_exports.union([external_exports.literal("auto"), external_exports.number().int().min(2048)]).describe(
|
|
25470
25488
|
'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.'
|
|
@@ -25491,7 +25509,7 @@ var SandboxSchema = external_exports.strictObject({
|
|
|
25491
25509
|
),
|
|
25492
25510
|
networking: external_exports.boolean().describe("Internet access. false is the only hard network isolation Windows Sandbox offers."),
|
|
25493
25511
|
clipboard: external_exports.boolean().describe(
|
|
25494
|
-
"Shared clipboard between this PC and the sandbox. Also lets an agent's copy (in
|
|
25512
|
+
"Shared clipboard between this PC and the sandbox. Also lets an agent's copy (in an attached terminal) reach this PC's clipboard."
|
|
25495
25513
|
),
|
|
25496
25514
|
audioInput: external_exports.boolean().describe("Microphone access."),
|
|
25497
25515
|
videoInput: external_exports.boolean().describe("Camera access."),
|
|
@@ -25542,7 +25560,7 @@ var NetworkSchema = external_exports.strictObject({
|
|
|
25542
25560
|
});
|
|
25543
25561
|
var AuditSchema = external_exports.strictObject({
|
|
25544
25562
|
enabled: external_exports.boolean().describe(
|
|
25545
|
-
"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
|
|
25563
|
+
"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."
|
|
25546
25564
|
),
|
|
25547
25565
|
days: external_exports.number().int().min(1).max(365).describe(
|
|
25548
25566
|
"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."
|
|
@@ -25663,6 +25681,9 @@ var ToolchainsSchema = external_exports.strictObject({
|
|
|
25663
25681
|
keepInstallFiles: external_exports.boolean().describe(
|
|
25664
25682
|
"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."
|
|
25665
25683
|
),
|
|
25684
|
+
visualStudio: external_exports.enum(["full", "autosdk"]).describe(
|
|
25685
|
+
`"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).`
|
|
25686
|
+
),
|
|
25666
25687
|
persistEngines: external_exports.boolean().describe(
|
|
25667
25688
|
"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)."
|
|
25668
25689
|
),
|
|
@@ -25883,6 +25904,114 @@ var ToolchainsSchema = external_exports.strictObject({
|
|
|
25883
25904
|
)
|
|
25884
25905
|
});
|
|
25885
25906
|
|
|
25907
|
+
// src/shared/apps/catalogue-agents-web.ts
|
|
25908
|
+
var PERPLEXITY_MCP_VERSION = "1.3.0";
|
|
25909
|
+
var COMET_MCP_VERSION = "2.3.0";
|
|
25910
|
+
var CHROME_DEVTOOLS_MCP_VERSION = "1.12.0";
|
|
25911
|
+
var BROWSER_USE_VERSION = "0.13.14";
|
|
25912
|
+
var PERPLEXITY_COMPUTER_MCP_URL = "https://www.perplexity.ai/rest/computer/mcp";
|
|
25913
|
+
var COMET_SIGNER = {
|
|
25914
|
+
subject: ['^CN="?PERPLEXITY AI, INC\\.?"?(,|$)', '(^|, )O="?PERPLEXITY AI, INC\\.?"?(,|$)'],
|
|
25915
|
+
issuer: ["^CN=GlobalSign GCC R45 EV CodeSigning CA 2020(,|$)"]
|
|
25916
|
+
};
|
|
25917
|
+
var EDGE_EXE = "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe";
|
|
25918
|
+
var AGENTS_WEB_APPS = [
|
|
25919
|
+
{
|
|
25920
|
+
id: "perplexity-mcp",
|
|
25921
|
+
name: "Perplexity MCP (API)",
|
|
25922
|
+
category: "agents",
|
|
25923
|
+
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.",
|
|
25924
|
+
size: "30 MB",
|
|
25925
|
+
source: { locked: "npm", package: "@perplexity-ai/mcp-server", version: PERPLEXITY_MCP_VERSION },
|
|
25926
|
+
exe: "perplexity-mcp.cmd",
|
|
25927
|
+
service: true,
|
|
25928
|
+
mcp: {
|
|
25929
|
+
name: "sbx-perplexity",
|
|
25930
|
+
script: "node_modules/@perplexity-ai/mcp-server/dist/index.js",
|
|
25931
|
+
envVars: ["PERPLEXITY_API_KEY"],
|
|
25932
|
+
codex: true
|
|
25933
|
+
},
|
|
25934
|
+
plugsInto: "Claude Code and Codex as the MCP server sbx-perplexity; the key comes from Accounts as PERPLEXITY_API_KEY, never from a file",
|
|
25935
|
+
userOnly: true
|
|
25936
|
+
},
|
|
25937
|
+
{
|
|
25938
|
+
id: "perplexity-computer-mcp",
|
|
25939
|
+
name: "Perplexity Computer MCP",
|
|
25940
|
+
category: "agents",
|
|
25941
|
+
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.",
|
|
25942
|
+
size: "0 MB",
|
|
25943
|
+
source: { remote: true },
|
|
25944
|
+
exe: "",
|
|
25945
|
+
service: true,
|
|
25946
|
+
mcp: { name: "sbx-perplexity-computer", url: PERPLEXITY_COMPUTER_MCP_URL, codex: true },
|
|
25947
|
+
plugsInto: "Claude Code and Codex as the remote MCP server sbx-perplexity-computer; its sign-in is kept with your agent login",
|
|
25948
|
+
userOnly: true
|
|
25949
|
+
},
|
|
25950
|
+
{
|
|
25951
|
+
id: "comet",
|
|
25952
|
+
name: "Comet (Perplexity browser)",
|
|
25953
|
+
category: "browsers",
|
|
25954
|
+
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.",
|
|
25955
|
+
size: "600 MB",
|
|
25956
|
+
source: { resolve: "comet" },
|
|
25957
|
+
unpack: "chromium",
|
|
25958
|
+
exe: "comet.exe",
|
|
25959
|
+
needs: ["7zip"],
|
|
25960
|
+
signer: COMET_SIGNER,
|
|
25961
|
+
userOnly: true
|
|
25962
|
+
},
|
|
25963
|
+
{
|
|
25964
|
+
id: "comet-mcp",
|
|
25965
|
+
name: "Comet MCP",
|
|
25966
|
+
category: "agents",
|
|
25967
|
+
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.",
|
|
25968
|
+
size: "15 MB",
|
|
25969
|
+
source: { locked: "npm", package: "comet-mcp", version: COMET_MCP_VERSION },
|
|
25970
|
+
exe: "comet-mcp.cmd",
|
|
25971
|
+
service: true,
|
|
25972
|
+
mcp: { name: "sbx-comet", script: "node_modules/comet-mcp/dist/index.js", codex: true },
|
|
25973
|
+
plugsInto: "Claude Code and Codex as the MCP server sbx-comet, talking to Comet's DevTools on 127.0.0.1:9222",
|
|
25974
|
+
userOnly: true
|
|
25975
|
+
},
|
|
25976
|
+
{
|
|
25977
|
+
id: "chrome-devtools-mcp",
|
|
25978
|
+
name: "Chrome DevTools MCP",
|
|
25979
|
+
category: "agents",
|
|
25980
|
+
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.",
|
|
25981
|
+
size: "40 MB",
|
|
25982
|
+
source: { locked: "npm", package: "chrome-devtools-mcp", version: CHROME_DEVTOOLS_MCP_VERSION },
|
|
25983
|
+
exe: "chrome-devtools-mcp.cmd",
|
|
25984
|
+
service: true,
|
|
25985
|
+
mcp: {
|
|
25986
|
+
name: "sbx-chrome-devtools",
|
|
25987
|
+
script: "node_modules/chrome-devtools-mcp/build/src/bin/chrome-devtools-mcp.js",
|
|
25988
|
+
args: ["--executablePath", EDGE_EXE, "--isolated", "--no-usage-statistics", "--no-performance-crux"],
|
|
25989
|
+
codex: true
|
|
25990
|
+
},
|
|
25991
|
+
plugsInto: "Claude Code and Codex as the MCP server sbx-chrome-devtools (with Edge)",
|
|
25992
|
+
userOnly: true
|
|
25993
|
+
},
|
|
25994
|
+
{
|
|
25995
|
+
id: "browser-use-mcp",
|
|
25996
|
+
name: "Browser Use MCP",
|
|
25997
|
+
category: "agents",
|
|
25998
|
+
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.",
|
|
25999
|
+
size: "250 MB",
|
|
26000
|
+
source: { locked: "uv", package: "browser-use", version: BROWSER_USE_VERSION },
|
|
26001
|
+
exe: "browser-use.exe",
|
|
26002
|
+
service: true,
|
|
26003
|
+
mcp: {
|
|
26004
|
+
name: "sbx-browser-use",
|
|
26005
|
+
program: true,
|
|
26006
|
+
args: ["--mcp"],
|
|
26007
|
+
env: { ANONYMIZED_TELEMETRY: "false" },
|
|
26008
|
+
codex: true
|
|
26009
|
+
},
|
|
26010
|
+
plugsInto: "Claude Code and Codex as the MCP server sbx-browser-use",
|
|
26011
|
+
userOnly: true
|
|
26012
|
+
}
|
|
26013
|
+
];
|
|
26014
|
+
|
|
25886
26015
|
// src/shared/apps/catalogue-gamedev.ts
|
|
25887
26016
|
var GAMEDEV_APPS = [];
|
|
25888
26017
|
|
|
@@ -25890,7 +26019,38 @@ var GAMEDEV_APPS = [];
|
|
|
25890
26019
|
var MOBILE_APPS = [];
|
|
25891
26020
|
|
|
25892
26021
|
// src/shared/apps/catalogue-modding.ts
|
|
25893
|
-
var MODDING_APPS = [
|
|
26022
|
+
var MODDING_APPS = [
|
|
26023
|
+
{
|
|
26024
|
+
id: "lua-language-server",
|
|
26025
|
+
name: "Lua Language Server",
|
|
26026
|
+
category: "cli",
|
|
26027
|
+
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).",
|
|
26028
|
+
size: "15 MB",
|
|
26029
|
+
source: { github: "LuaLS/lua-language-server", asset: "^lua-language-server-[\\d.]+-win32-x64\\.zip$" },
|
|
26030
|
+
exe: "lua-language-server.exe",
|
|
26031
|
+
cli: true
|
|
26032
|
+
},
|
|
26033
|
+
{
|
|
26034
|
+
id: "stylua",
|
|
26035
|
+
name: "StyLua",
|
|
26036
|
+
category: "cli",
|
|
26037
|
+
about: "An opinionated Lua formatter (`stylua .`), configured with a stylua.toml in the project.",
|
|
26038
|
+
size: "6 MB",
|
|
26039
|
+
source: { github: "JohnnyMorganz/StyLua", asset: "^stylua-windows-x86_64\\.zip$" },
|
|
26040
|
+
exe: "stylua.exe",
|
|
26041
|
+
cli: true
|
|
26042
|
+
},
|
|
26043
|
+
{
|
|
26044
|
+
id: "selene",
|
|
26045
|
+
name: "selene",
|
|
26046
|
+
category: "cli",
|
|
26047
|
+
about: 'A Lua linter (`selene .`), configured with a selene.toml (std = "lua54", and a standard library file for the FiveM / RedM globals).',
|
|
26048
|
+
size: "7 MB",
|
|
26049
|
+
source: { github: "Kampfkarren/selene", asset: "^selene-[\\d.]+-windows\\.zip$" },
|
|
26050
|
+
exe: "selene.exe",
|
|
26051
|
+
cli: true
|
|
26052
|
+
}
|
|
26053
|
+
];
|
|
25894
26054
|
|
|
25895
26055
|
// src/shared/apps/catalogue.ts
|
|
25896
26056
|
var gh = (github, asset) => ({ github, asset });
|
|
@@ -26724,7 +26884,7 @@ var CORE_APPS = [
|
|
|
26724
26884
|
cli: true
|
|
26725
26885
|
}
|
|
26726
26886
|
];
|
|
26727
|
-
var APPS = [...CORE_APPS, ...GAMEDEV_APPS, ...MODDING_APPS, ...MOBILE_APPS];
|
|
26887
|
+
var APPS = [...CORE_APPS, ...GAMEDEV_APPS, ...MODDING_APPS, ...MOBILE_APPS, ...AGENTS_WEB_APPS];
|
|
26728
26888
|
|
|
26729
26889
|
// src/core/schema/apps.ts
|
|
26730
26890
|
var CATALOGUE_IDS = APPS.filter((a) => !a.setting).map((a) => a.id);
|
|
@@ -26794,7 +26954,7 @@ var ProjectsSchema = external_exports.strictObject({
|
|
|
26794
26954
|
var RESUME_SESSIONS = ["ask", "always", "afterCrash", "never"];
|
|
26795
26955
|
var ResumeSchema = external_exports.strictObject({
|
|
26796
26956
|
sessions: external_exports.enum(RESUME_SESSIONS).describe(
|
|
26797
|
-
'When a sandbox starts after one that had agent sessions: "ask" lists them and asks whether to reopen them (without a terminal it
|
|
26957
|
+
'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.'
|
|
26798
26958
|
),
|
|
26799
26959
|
restartAfterCrash: external_exports.boolean().describe(
|
|
26800
26960
|
"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)."
|
|
@@ -26813,14 +26973,14 @@ var RemoteUserSchema = external_exports.strictObject({
|
|
|
26813
26973
|
});
|
|
26814
26974
|
var WebLanSchema = external_exports.strictObject({
|
|
26815
26975
|
enabled: external_exports.boolean().describe(
|
|
26816
|
-
"(Beta) Devices on your network (a phone): an HTTPS address on this PC for devices you pair with a one-time code (
|
|
26976
|
+
"(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."
|
|
26817
26977
|
),
|
|
26818
26978
|
port: external_exports.number().int().min(1024).max(65535).describe("HTTPS port for paired devices on your network."),
|
|
26819
26979
|
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).")
|
|
26820
26980
|
});
|
|
26821
26981
|
var WebRemoteSchema = external_exports.strictObject({
|
|
26822
26982
|
windowsSignIn: external_exports.boolean().describe(
|
|
26823
|
-
"(Beta) Other Windows users of this PC named in web.remote.users sign in to your web UI (and
|
|
26983
|
+
"(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."
|
|
26824
26984
|
),
|
|
26825
26985
|
users: external_exports.array(RemoteUserSchema).max(32).describe("Who else may sign in with Windows, and their role (view or control)."),
|
|
26826
26986
|
rememberDays: external_exports.number().int().min(1).max(90).describe(
|
|
@@ -26830,7 +26990,7 @@ var WebRemoteSchema = external_exports.strictObject({
|
|
|
26830
26990
|
});
|
|
26831
26991
|
var WebSchema = external_exports.strictObject({
|
|
26832
26992
|
enabled: external_exports.boolean().describe(
|
|
26833
|
-
"(Beta) The web UI: your
|
|
26993
|
+
"(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."
|
|
26834
26994
|
),
|
|
26835
26995
|
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."),
|
|
26836
26996
|
openOnLaunch: external_exports.boolean().describe("(Beta) With the web UI on: open it in your browser, already signed in, every time a sandbox starts."),
|
|
@@ -26841,7 +27001,7 @@ var WebSchema = external_exports.strictObject({
|
|
|
26841
27001
|
var VPN_PROVIDERS = ["nordvpn", "openvpn-file", "wireguard-file"];
|
|
26842
27002
|
var VpnSchema = external_exports.strictObject({
|
|
26843
27003
|
enabled: external_exports.boolean().describe(
|
|
26844
|
-
"(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 (
|
|
27004
|
+
"(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)."
|
|
26845
27005
|
),
|
|
26846
27006
|
provider: external_exports.enum(VPN_PROVIDERS).describe(
|
|
26847
27007
|
"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."
|
|
@@ -26859,13 +27019,14 @@ var VpnSchema = external_exports.strictObject({
|
|
|
26859
27019
|
// src/core/schema/github.ts
|
|
26860
27020
|
var GithubSchema = external_exports.strictObject({
|
|
26861
27021
|
shareToken: external_exports.boolean().describe(
|
|
26862
|
-
'Give each sandbox the GitHub token you saved
|
|
27022
|
+
'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.'
|
|
26863
27023
|
)
|
|
26864
27024
|
});
|
|
26865
27025
|
|
|
26866
27026
|
// src/shared/accounts/kinds.ts
|
|
26867
27027
|
var AGENT_CAN_USE = "The agent in the sandbox can use this sign-in while it is there.";
|
|
26868
27028
|
var ONE_PLACE = "It works in one sandbox at a time: a second sandbox starts without it while the first one runs.";
|
|
27029
|
+
var PERPLEXITY_KEY_PATTERN = /^pplx-[A-Za-z0-9_-]{8,200}$/;
|
|
26869
27030
|
var SERVICE_SPECS = {
|
|
26870
27031
|
epic: {
|
|
26871
27032
|
kind: "epic",
|
|
@@ -26919,19 +27080,28 @@ var SERVICE_SPECS = {
|
|
|
26919
27080
|
kind: "cfx",
|
|
26920
27081
|
label: "Cfx.re (FiveM / RedM server key)",
|
|
26921
27082
|
usedBy: ["fivem"],
|
|
26922
|
-
sources: ["typed"],
|
|
27083
|
+
sources: ["typed", "file"],
|
|
26923
27084
|
singleHolder: false,
|
|
26924
27085
|
returns: false,
|
|
27086
|
+
// `import cfx --from` reads a whole server.cfg (they often run to tens of KB); the payload itself is tiny.
|
|
26925
27087
|
maxBytes: 4 * 1024,
|
|
27088
|
+
maxFileBytes: 256 * 1024,
|
|
26926
27089
|
warnings: [AGENT_CAN_USE + " Anyone with the key can run a server under your Cfx.re account."],
|
|
26927
27090
|
fields: [
|
|
26928
|
-
{
|
|
27091
|
+
{
|
|
27092
|
+
name: "licenseKey",
|
|
27093
|
+
label: "Server licence key (cfxk_...)",
|
|
27094
|
+
secret: true,
|
|
27095
|
+
pattern: /^cfxk_[A-Za-z0-9_]+$/,
|
|
27096
|
+
only: "typed"
|
|
27097
|
+
},
|
|
26929
27098
|
{
|
|
26930
27099
|
name: "steamWebApiKey",
|
|
26931
27100
|
label: "Steam Web API key (optional)",
|
|
26932
27101
|
secret: true,
|
|
26933
27102
|
optional: true,
|
|
26934
|
-
pattern: /^[A-F0-9]{32}
|
|
27103
|
+
pattern: /^[A-F0-9]{32}$/,
|
|
27104
|
+
only: "typed"
|
|
26935
27105
|
}
|
|
26936
27106
|
]
|
|
26937
27107
|
},
|
|
@@ -26985,33 +27155,77 @@ var SERVICE_SPECS = {
|
|
|
26985
27155
|
{ name: "issuerId", label: "Issuer ID", secret: false },
|
|
26986
27156
|
{ name: "keyId", label: "Key ID", secret: false, pattern: /^[A-Z0-9]{10}$/ }
|
|
26987
27157
|
]
|
|
27158
|
+
},
|
|
27159
|
+
perplexity: {
|
|
27160
|
+
kind: "perplexity",
|
|
27161
|
+
label: "Perplexity API key",
|
|
27162
|
+
usedBy: ["perplexity"],
|
|
27163
|
+
sources: ["pc", "file", "typed"],
|
|
27164
|
+
singleHolder: false,
|
|
27165
|
+
returns: false,
|
|
27166
|
+
maxBytes: 1024,
|
|
27167
|
+
maxFileBytes: 64 * 1024,
|
|
27168
|
+
warnings: [
|
|
27169
|
+
AGENT_CAN_USE + " It can read the key and spend your API credit: use a separate API key with a spending limit.",
|
|
27170
|
+
"Perplexity Pro does not include API use; the API key is billed separately.",
|
|
27171
|
+
"Only the variable PERPLEXITY_API_KEY of the agent gets it: nothing in the sandbox writes it to a file."
|
|
27172
|
+
],
|
|
27173
|
+
fields: [
|
|
27174
|
+
{
|
|
27175
|
+
name: "apiKey",
|
|
27176
|
+
label: "Perplexity API key (pplx-...)",
|
|
27177
|
+
secret: true,
|
|
27178
|
+
pattern: PERPLEXITY_KEY_PATTERN,
|
|
27179
|
+
only: "typed"
|
|
27180
|
+
}
|
|
27181
|
+
]
|
|
27182
|
+
},
|
|
27183
|
+
comet: {
|
|
27184
|
+
kind: "comet",
|
|
27185
|
+
label: "Comet (Perplexity browser)",
|
|
27186
|
+
usedBy: ["comet"],
|
|
27187
|
+
sources: ["sandbox"],
|
|
27188
|
+
singleHolder: false,
|
|
27189
|
+
returns: true,
|
|
27190
|
+
maxBytes: 256 * 1024,
|
|
27191
|
+
warnings: [
|
|
27192
|
+
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.",
|
|
27193
|
+
"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.",
|
|
27194
|
+
"Only the perplexity.ai sign-in cookies are kept: never saved passwords, other sites, localStorage or history. Never import your main browser profile.",
|
|
27195
|
+
"Several sandboxes can use it at once: the sign-in the last one hands back is kept."
|
|
27196
|
+
],
|
|
27197
|
+
fields: []
|
|
26988
27198
|
}
|
|
26989
27199
|
};
|
|
27200
|
+
var APP_USER_TEXT = {
|
|
27201
|
+
perplexity: "the Perplexity MCP app",
|
|
27202
|
+
comet: "the Comet app"
|
|
27203
|
+
};
|
|
27204
|
+
function usedByText(usedBy) {
|
|
27205
|
+
return usedBy.map((u) => u in APP_USER_TEXT ? APP_USER_TEXT[u] : u).join(" or ");
|
|
27206
|
+
}
|
|
26990
27207
|
|
|
26991
27208
|
// src/core/schema/accounts.ts
|
|
26992
27209
|
function share(kind, how) {
|
|
26993
27210
|
const spec = SERVICE_SPECS[kind];
|
|
26994
27211
|
return external_exports.strictObject({
|
|
26995
27212
|
share: external_exports.boolean().describe(
|
|
26996
|
-
"Hand your saved " + spec.label + " sign-in to sandboxes that use " + spec.usedBy
|
|
27213
|
+
"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."
|
|
26997
27214
|
)
|
|
26998
27215
|
});
|
|
26999
27216
|
}
|
|
27000
27217
|
var AccountsSchema = external_exports.strictObject({
|
|
27001
|
-
epic: share("epic", "sign in to the launcher once in a sandbox, or take this PC's
|
|
27002
|
-
steam: share(
|
|
27003
|
-
|
|
27004
|
-
|
|
27005
|
-
),
|
|
27006
|
-
|
|
27007
|
-
|
|
27008
|
-
|
|
27009
|
-
|
|
27010
|
-
|
|
27011
|
-
|
|
27012
|
-
}).describe(
|
|
27013
|
-
"Service sign-ins for sandboxes (game stores, engines, app signing). Manage them in Accounts: sandbox account status."
|
|
27014
|
-
);
|
|
27218
|
+
epic: share("epic", "sign in to the launcher once in a sandbox, or take this PC's from Accounts"),
|
|
27219
|
+
steam: share("steam", "sign in once with sbx-steam login, or take it from a SteamCMD folder in Accounts"),
|
|
27220
|
+
unity: share("unity", "sign in once in a sandbox, or take this PC's licence from Accounts"),
|
|
27221
|
+
cfx: share("cfx", "type the key in Accounts"),
|
|
27222
|
+
keystore: share("keystore", "import the upload.jks file in Accounts"),
|
|
27223
|
+
play: share("play", "import the service-account.json file in Accounts"),
|
|
27224
|
+
expo: share("expo", "type the token in Accounts"),
|
|
27225
|
+
appstore: share("appstore", "import the AuthKey.p8 file in Accounts"),
|
|
27226
|
+
perplexity: share("perplexity", "type the API key in Accounts, or import it from a .env file"),
|
|
27227
|
+
comet: share("comet", "sign in to Comet once in a sandbox: it cannot be taken from this PC")
|
|
27228
|
+
}).describe("Service sign-ins for sandboxes (game stores, engines, app signing, Perplexity). Manage them in Accounts.");
|
|
27015
27229
|
|
|
27016
27230
|
// src/core/schema/pc-installs.ts
|
|
27017
27231
|
var pick2 = (item, what, example) => external_exports.union([external_exports.boolean(), external_exports.array(item)]).describe(
|
|
@@ -27075,7 +27289,9 @@ function reservedEnvName(name) {
|
|
|
27075
27289
|
}
|
|
27076
27290
|
var ConfigSchema = external_exports.strictObject({
|
|
27077
27291
|
$schema: SchemaRefSchema.optional(),
|
|
27078
|
-
defaultHarness: NameSchema.describe(
|
|
27292
|
+
defaultHarness: NameSchema.describe(
|
|
27293
|
+
"The agent that starts when you do not name one (starting claude by name always runs claude)."
|
|
27294
|
+
),
|
|
27079
27295
|
guestWorkspace: GuestWorkspaceSchema,
|
|
27080
27296
|
readOnly: external_exports.boolean().describe("Map the workspace read-only."),
|
|
27081
27297
|
workspaceFilter: WorkspaceFilterSchema,
|
|
@@ -27085,7 +27301,7 @@ var ConfigSchema = external_exports.strictObject({
|
|
|
27085
27301
|
sharing: SharingSchema,
|
|
27086
27302
|
storage: external_exports.strictObject({
|
|
27087
27303
|
root: external_exports.string().min(1).describe(
|
|
27088
|
-
"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.
|
|
27304
|
+
"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."
|
|
27089
27305
|
),
|
|
27090
27306
|
persistAgentState: external_exports.boolean().describe("Keep agent logins and history between sandboxes."),
|
|
27091
27307
|
dataName: NameSchema.describe("Name of the persistent data set (C:\\AgentData) shared by all workspaces."),
|
|
@@ -27093,11 +27309,11 @@ var ConfigSchema = external_exports.strictObject({
|
|
|
27093
27309
|
`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.`
|
|
27094
27310
|
),
|
|
27095
27311
|
contained: external_exports.enum(["off", "vhdx"]).describe(
|
|
27096
|
-
'(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
|
|
27312
|
+
'(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.'
|
|
27097
27313
|
),
|
|
27098
27314
|
containedMaxGb: external_exports.number().int().min(8).max(4096).describe("(beta) Largest size, in GB, the disk image of storage.contained may grow to."),
|
|
27099
27315
|
warnDataGb: external_exports.number().min(0).describe(
|
|
27100
|
-
"Say at launch when the persisted data (tools, databases, logins) is bigger than this many GB; 0 = never.
|
|
27316
|
+
"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."
|
|
27101
27317
|
)
|
|
27102
27318
|
}),
|
|
27103
27319
|
network: NetworkSchema,
|
|
@@ -27119,6 +27335,7 @@ var ConfigSchema = external_exports.strictObject({
|
|
|
27119
27335
|
apps: AppsSchema,
|
|
27120
27336
|
claudeProfile: ClaudeProfileSchema,
|
|
27121
27337
|
harnesses: external_exports.record(NameSchema, HarnessSchema).describe("Agents that can run in the sandbox."),
|
|
27338
|
+
codex: CodexSchema,
|
|
27122
27339
|
hooks: external_exports.strictObject({ failFast: external_exports.boolean().describe("Stop when a hook script fails.") }),
|
|
27123
27340
|
projects: ProjectsSchema.describe(
|
|
27124
27341
|
"Several projects in one sandbox: folders of projects mapped at every start, and adding folders while it runs."
|
|
@@ -27203,6 +27420,10 @@ var BootProgressSchema = external_exports.strictObject({
|
|
|
27203
27420
|
done: external_exports.number().int().min(0).max(1e3),
|
|
27204
27421
|
total: external_exports.number().int().min(0).max(1e3)
|
|
27205
27422
|
});
|
|
27423
|
+
var BackgroundWorkSchema = external_exports.strictObject({
|
|
27424
|
+
name: Text(64),
|
|
27425
|
+
state: external_exports.enum(["running", "done", "failed"])
|
|
27426
|
+
});
|
|
27206
27427
|
var SandboxStatusSchema = external_exports.object({
|
|
27207
27428
|
launchId: Text(64),
|
|
27208
27429
|
phase: external_exports.enum(["booting", "provisioning", "ready", "failed"]),
|
|
@@ -27214,7 +27435,9 @@ var SandboxStatusSchema = external_exports.object({
|
|
|
27214
27435
|
/** The sandbox's IPv4 addresses (for network.forwardPorts; the host only uses ones on its Hyper-V network). */
|
|
27215
27436
|
addresses: external_exports.array(external_exports.string().max(45)).max(8).optional(),
|
|
27216
27437
|
/** A malformed progress is dropped, never the status (the phase still counts). */
|
|
27217
|
-
progress: BootProgressSchema.optional().catch(void 0)
|
|
27438
|
+
progress: BootProgressSchema.optional().catch(void 0),
|
|
27439
|
+
/** Installs that continue after the boot is ready; a malformed list is dropped, never the status. */
|
|
27440
|
+
background: external_exports.array(BackgroundWorkSchema).max(16).optional().catch(void 0)
|
|
27218
27441
|
});
|
|
27219
27442
|
var VersionSchema = external_exports.strictObject({ spec: Text(128), source: Text(256) });
|
|
27220
27443
|
var DatabasePlanSchema = external_exports.strictObject({
|
|
@@ -27362,6 +27585,8 @@ var ProjectStatusSchema = external_exports.object({
|
|
|
27362
27585
|
var VpnStatusSchema = external_exports.object({
|
|
27363
27586
|
state: external_exports.enum(["off", "starting", "up", "failed"]),
|
|
27364
27587
|
message: Text(2e3),
|
|
27588
|
+
/** Why it failed, when it did: `auth` (login refused), `unreachable`, `driver`, `timeout` or `other`. */
|
|
27589
|
+
code: external_exports.enum(["auth", "unreachable", "driver", "timeout", "other"]).optional(),
|
|
27365
27590
|
killSwitch: external_exports.boolean(),
|
|
27366
27591
|
/** A direct connection was tried after the kill switch was applied: false = it still got out. */
|
|
27367
27592
|
killSwitchHeld: external_exports.boolean().optional(),
|
|
@@ -27626,24 +27851,37 @@ function mkdirp(p) {
|
|
|
27626
27851
|
// src/guest/runtime/log.ts
|
|
27627
27852
|
import fs6 from "node:fs";
|
|
27628
27853
|
import path7 from "node:path";
|
|
27854
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
27629
27855
|
fs6.mkdirSync(logsDir, { recursive: true });
|
|
27630
27856
|
var logFile = path7.join(
|
|
27631
27857
|
logsDir,
|
|
27632
27858
|
(process.env.AGENT_LOG_PREFIX ?? "guest") + "-" + (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-") + ".log"
|
|
27633
27859
|
);
|
|
27860
|
+
var context = new AsyncLocalStorage();
|
|
27861
|
+
function fileLine(message, at = /* @__PURE__ */ new Date()) {
|
|
27862
|
+
return at.toISOString() + " " + message;
|
|
27863
|
+
}
|
|
27634
27864
|
var append = (line) => {
|
|
27635
27865
|
try {
|
|
27636
|
-
fs6.appendFileSync(logFile, line + "\n");
|
|
27866
|
+
fs6.appendFileSync(logFile, fileLine(line) + "\n");
|
|
27637
27867
|
} catch {
|
|
27638
27868
|
}
|
|
27639
27869
|
};
|
|
27870
|
+
var tagged = (message, ctx) => {
|
|
27871
|
+
const prefix = ctx?.prefix?.();
|
|
27872
|
+
return prefix ? prefix + " | " + message : message;
|
|
27873
|
+
};
|
|
27640
27874
|
function log(message) {
|
|
27641
|
-
|
|
27642
|
-
|
|
27875
|
+
const ctx = context.getStore();
|
|
27876
|
+
const line = tagged(message, ctx);
|
|
27877
|
+
if (!ctx?.quiet) console.log(line);
|
|
27878
|
+
append(line);
|
|
27643
27879
|
}
|
|
27644
27880
|
function warn(message) {
|
|
27645
|
-
|
|
27646
|
-
|
|
27881
|
+
const ctx = context.getStore();
|
|
27882
|
+
const line = tagged(message, ctx);
|
|
27883
|
+
if (!ctx?.quiet) console.warn("\x1B[33mWARNING: " + line + "\x1B[0m");
|
|
27884
|
+
append("WARNING: " + line);
|
|
27647
27885
|
}
|
|
27648
27886
|
|
|
27649
27887
|
// src/guest/toolchains/tool-env.ts
|
|
@@ -27653,7 +27891,7 @@ import path12 from "node:path";
|
|
|
27653
27891
|
import fs10 from "node:fs";
|
|
27654
27892
|
import os3 from "node:os";
|
|
27655
27893
|
import path11 from "node:path";
|
|
27656
|
-
import { spawnSync } from "node:child_process";
|
|
27894
|
+
import { spawn as spawn2, spawnSync } from "node:child_process";
|
|
27657
27895
|
|
|
27658
27896
|
// src/shared/download/http.ts
|
|
27659
27897
|
var USER_AGENT = "windows-development-sandbox";
|
|
@@ -27729,7 +27967,11 @@ function moveIntoPlace(work, destination) {
|
|
|
27729
27967
|
fs8.mkdirSync(path9.dirname(destination), { recursive: true });
|
|
27730
27968
|
fs8.renameSync(work, destination);
|
|
27731
27969
|
}
|
|
27732
|
-
|
|
27970
|
+
var extractLimit = null;
|
|
27971
|
+
function extractArchive(archive, destination, members2 = []) {
|
|
27972
|
+
return extractLimit ? extractLimit.run(() => extract(archive, destination, members2)) : extract(archive, destination, members2);
|
|
27973
|
+
}
|
|
27974
|
+
async function extract(archive, destination, members2) {
|
|
27733
27975
|
fs8.mkdirSync(destination, { recursive: true });
|
|
27734
27976
|
let status = await spawnAsync(SYSTEM.tar(), ["-xf", archive, "-C", destination, ...members2]);
|
|
27735
27977
|
if (status !== 0 && /\.(zip|nupkg)$/i.test(archive)) {
|
|
@@ -27764,6 +28006,8 @@ import { pipeline } from "node:stream/promises";
|
|
|
27764
28006
|
var Downloader = class {
|
|
27765
28007
|
/** downloads.requireChecksum: refuse anything without an expected hash. The guest sets it from session.json. */
|
|
27766
28008
|
requireChecksum = false;
|
|
28009
|
+
/** The guest's net pool: how many HTTP bodies stream at once. Host code leaves it null. */
|
|
28010
|
+
limit = null;
|
|
27767
28011
|
watcher = null;
|
|
27768
28012
|
/** Reports coarse progress of the downloads that start from now on to `watcher` (null: stop). */
|
|
27769
28013
|
watch(watcher) {
|
|
@@ -27781,39 +28025,42 @@ var Downloader = class {
|
|
|
27781
28025
|
"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."
|
|
27782
28026
|
);
|
|
27783
28027
|
}
|
|
27784
|
-
const response = await fetchRetry(url2, {}, 3, 20 * 60 * 1e3);
|
|
27785
|
-
if (!response.body) throw new Error("Empty response for " + url2);
|
|
27786
28028
|
fs9.mkdirSync(path10.dirname(destination), { recursive: true });
|
|
27787
28029
|
const checks = ["sha256", "sha512", "sha1"].flatMap((kind) => {
|
|
27788
28030
|
const want = sums[kind]?.trim().toLowerCase();
|
|
27789
28031
|
return want ? [{ want, hash: crypto2.createHash(kind) }] : [];
|
|
27790
28032
|
});
|
|
27791
|
-
const
|
|
27792
|
-
const
|
|
27793
|
-
|
|
27794
|
-
|
|
27795
|
-
|
|
27796
|
-
|
|
27797
|
-
|
|
27798
|
-
|
|
27799
|
-
|
|
27800
|
-
|
|
27801
|
-
|
|
27802
|
-
|
|
27803
|
-
|
|
27804
|
-
|
|
27805
|
-
|
|
27806
|
-
|
|
27807
|
-
|
|
28033
|
+
const partial2 = destination + ".part";
|
|
28034
|
+
const transfer = async () => {
|
|
28035
|
+
const response = await fetchRetry(url2, {}, 3, 20 * 60 * 1e3);
|
|
28036
|
+
if (!response.body) throw new Error("Empty response for " + url2);
|
|
28037
|
+
const size = Number(response.headers.get("content-length")) || 0;
|
|
28038
|
+
const report = size > 0 ? this.watcher?.() ?? null : null;
|
|
28039
|
+
let received = 0;
|
|
28040
|
+
let tenth = 0;
|
|
28041
|
+
let reportedAt = Date.now();
|
|
28042
|
+
const tap = new Transform({
|
|
28043
|
+
transform(chunk, _encoding, done) {
|
|
28044
|
+
for (const c of checks) c.hash.update(chunk);
|
|
28045
|
+
if (report) {
|
|
28046
|
+
received += chunk.length;
|
|
28047
|
+
const now = Math.floor(received * 10 / size);
|
|
28048
|
+
if (now !== tenth || Date.now() - reportedAt > 5e3) {
|
|
28049
|
+
tenth = now;
|
|
28050
|
+
reportedAt = Date.now();
|
|
28051
|
+
try {
|
|
28052
|
+
report(Math.min(1, received / size));
|
|
28053
|
+
} catch {
|
|
28054
|
+
}
|
|
27808
28055
|
}
|
|
27809
28056
|
}
|
|
28057
|
+
done(null, chunk);
|
|
27810
28058
|
}
|
|
27811
|
-
|
|
27812
|
-
}
|
|
27813
|
-
});
|
|
27814
|
-
const partial2 = destination + ".part";
|
|
27815
|
-
try {
|
|
28059
|
+
});
|
|
27816
28060
|
await pipeline(Readable.fromWeb(response.body), tap, fs9.createWriteStream(partial2));
|
|
28061
|
+
};
|
|
28062
|
+
try {
|
|
28063
|
+
await (this.limit ? this.limit.run(transfer) : transfer());
|
|
27817
28064
|
if (checks.some((c) => c.hash.digest("hex") !== c.want)) throw new Error("Checksum mismatch for " + url2);
|
|
27818
28065
|
if (sums.verify) await sums.verify(partial2);
|
|
27819
28066
|
fs9.rmSync(destination, { force: true });
|
|
@@ -27830,12 +28077,17 @@ var Downloader = class {
|
|
|
27830
28077
|
const work = stagingFolder(destination);
|
|
27831
28078
|
try {
|
|
27832
28079
|
const archive = path10.join(work, options.fileName ?? path10.basename(new URL(url2).pathname));
|
|
27833
|
-
|
|
27834
|
-
|
|
27835
|
-
|
|
27836
|
-
|
|
27837
|
-
|
|
27838
|
-
|
|
28080
|
+
if (options.cached && fs9.existsSync(options.cached)) {
|
|
28081
|
+
fs9.mkdirSync(work, { recursive: true });
|
|
28082
|
+
fs9.copyFileSync(options.cached, archive);
|
|
28083
|
+
fs9.rmSync(options.cached, { force: true });
|
|
28084
|
+
} else
|
|
28085
|
+
await this.file(url2, archive, {
|
|
28086
|
+
sha256: options.sha256,
|
|
28087
|
+
sha512: options.sha512,
|
|
28088
|
+
sha1: options.sha1,
|
|
28089
|
+
...options.verify ? { verify: options.verify } : {}
|
|
28090
|
+
});
|
|
27839
28091
|
const extracted = path10.join(work, "x");
|
|
27840
28092
|
await extractArchive(archive, extracted, options.members);
|
|
27841
28093
|
let root = extracted;
|
|
@@ -28023,6 +28275,78 @@ async function setupUv(env) {
|
|
|
28023
28275
|
env.prepend.push(mkdirp(tool("uv-bin")));
|
|
28024
28276
|
}
|
|
28025
28277
|
|
|
28278
|
+
// src/guest/runtime/pools.ts
|
|
28279
|
+
import os4 from "node:os";
|
|
28280
|
+
|
|
28281
|
+
// src/shared/concurrency/limiter.ts
|
|
28282
|
+
import { AsyncLocalStorage as AsyncLocalStorage2 } from "node:async_hooks";
|
|
28283
|
+
var held = new AsyncLocalStorage2();
|
|
28284
|
+
var priorityOf = new AsyncLocalStorage2();
|
|
28285
|
+
var Limiter = class {
|
|
28286
|
+
constructor(size, name = "pool") {
|
|
28287
|
+
this.size = size;
|
|
28288
|
+
this.name = name;
|
|
28289
|
+
if (!Number.isInteger(size) || size < 1) throw new Error("A pool needs a size of at least 1");
|
|
28290
|
+
}
|
|
28291
|
+
size;
|
|
28292
|
+
name;
|
|
28293
|
+
active = 0;
|
|
28294
|
+
peakActive = 0;
|
|
28295
|
+
queues = { foreground: [], background: [] };
|
|
28296
|
+
/** The most slots that were ever busy at once (tests). */
|
|
28297
|
+
get peak() {
|
|
28298
|
+
return this.peakActive;
|
|
28299
|
+
}
|
|
28300
|
+
get running() {
|
|
28301
|
+
return this.active;
|
|
28302
|
+
}
|
|
28303
|
+
/** Runs `work` in a free slot (waiting its turn), and frees the slot afterwards. */
|
|
28304
|
+
async run(work, priority = priorityOf.getStore() ?? "foreground") {
|
|
28305
|
+
const holding = held.getStore();
|
|
28306
|
+
if (holding) throw new Error("nested pool: " + this.name + " requested while holding " + holding.name);
|
|
28307
|
+
await this.acquire(priority);
|
|
28308
|
+
try {
|
|
28309
|
+
return await held.run(this, async () => work());
|
|
28310
|
+
} finally {
|
|
28311
|
+
this.release();
|
|
28312
|
+
}
|
|
28313
|
+
}
|
|
28314
|
+
acquire(priority) {
|
|
28315
|
+
if (this.active < this.size) {
|
|
28316
|
+
this.take();
|
|
28317
|
+
return Promise.resolve();
|
|
28318
|
+
}
|
|
28319
|
+
return new Promise((resolve) => {
|
|
28320
|
+
this.queues[priority].push({
|
|
28321
|
+
start: () => {
|
|
28322
|
+
this.take();
|
|
28323
|
+
resolve();
|
|
28324
|
+
}
|
|
28325
|
+
});
|
|
28326
|
+
});
|
|
28327
|
+
}
|
|
28328
|
+
take() {
|
|
28329
|
+
this.active++;
|
|
28330
|
+
this.peakActive = Math.max(this.peakActive, this.active);
|
|
28331
|
+
}
|
|
28332
|
+
release() {
|
|
28333
|
+
this.active--;
|
|
28334
|
+
const next = this.queues.foreground.shift() ?? this.queues.background.shift();
|
|
28335
|
+
next?.start();
|
|
28336
|
+
}
|
|
28337
|
+
};
|
|
28338
|
+
|
|
28339
|
+
// src/shared/concurrency/pools.ts
|
|
28340
|
+
var net = new Limiter(4, "net");
|
|
28341
|
+
var heavy = new Limiter(2, "heavy");
|
|
28342
|
+
var installer = new Limiter(1, "installer");
|
|
28343
|
+
|
|
28344
|
+
// src/guest/runtime/pools.ts
|
|
28345
|
+
var BELOW_NORMAL = os4.constants.priority.PRIORITY_BELOW_NORMAL;
|
|
28346
|
+
function execHeavy(file2, args, options = {}) {
|
|
28347
|
+
return heavy.run(() => execAsync(file2, args, options));
|
|
28348
|
+
}
|
|
28349
|
+
|
|
28026
28350
|
// src/guest/runtime/session.ts
|
|
28027
28351
|
import fs11 from "node:fs";
|
|
28028
28352
|
import path14 from "node:path";
|
|
@@ -28056,6 +28380,12 @@ function agentPaths(toolsDir2, name, harness) {
|
|
|
28056
28380
|
function agentCommand(name, harness) {
|
|
28057
28381
|
return harness.npmBin ?? harness.uvBin ?? (harness.hostExecutable ?? name).replace(/\.exe$/i, "");
|
|
28058
28382
|
}
|
|
28383
|
+
var CODEX_MARKER = "# Set by the sandbox";
|
|
28384
|
+
var MAX_CODEX_CONFIG_BYTES = 1024 * 1024;
|
|
28385
|
+
var MARKED_LINES = new RegExp(
|
|
28386
|
+
"^" + CODEX_MARKER + "[^\r\n]*\r?\n(?:(?:sandbox_mode|approval_policy)[ ]*=[^\r\n]*\r?\n)*(?:[ ]*\r?\n)?",
|
|
28387
|
+
"m"
|
|
28388
|
+
);
|
|
28059
28389
|
|
|
28060
28390
|
// src/guest/setup/path-plan.ts
|
|
28061
28391
|
import path16 from "node:path";
|
|
@@ -28075,13 +28405,26 @@ function planPath(input2) {
|
|
|
28075
28405
|
seen.add(key);
|
|
28076
28406
|
result.push(entry);
|
|
28077
28407
|
}
|
|
28078
|
-
return result;
|
|
28408
|
+
return msvcBeforeGitUsr(result);
|
|
28079
28409
|
}
|
|
28080
28410
|
function isPinnedNodeDir(folder, nvmHome2) {
|
|
28081
28411
|
const key = pathKey(folder);
|
|
28082
28412
|
const home = pathKey(nvmHome2);
|
|
28083
28413
|
return key.startsWith(home + "\\") && /^v\d/.test(path16.win32.basename(key));
|
|
28084
28414
|
}
|
|
28415
|
+
function isMsvcToolsDir(folder) {
|
|
28416
|
+
return /\\vc\\tools\\msvc\\[^\\]+\\bin\\host[^\\]+\\[^\\]+$/.test(pathKey(folder));
|
|
28417
|
+
}
|
|
28418
|
+
function isGitUsrBin(folder) {
|
|
28419
|
+
const key = pathKey(folder);
|
|
28420
|
+
return key.endsWith("\\usr\\bin") && /\\git(\\|$)/.test(key);
|
|
28421
|
+
}
|
|
28422
|
+
function msvcBeforeGitUsr(folders) {
|
|
28423
|
+
const firstGit = folders.findIndex(isGitUsrBin);
|
|
28424
|
+
if (firstGit < 0 || !folders.slice(firstGit).some(isMsvcToolsDir)) return [...folders];
|
|
28425
|
+
const late = folders.slice(firstGit).filter(isMsvcToolsDir);
|
|
28426
|
+
return [...folders.slice(0, firstGit), ...late, ...folders.slice(firstGit).filter((f) => !isMsvcToolsDir(f))];
|
|
28427
|
+
}
|
|
28085
28428
|
|
|
28086
28429
|
// src/guest/setup/environment.ts
|
|
28087
28430
|
function addMachineEnvironment(vars, dirs, additive = false) {
|
|
@@ -28097,11 +28440,11 @@ var nvmHome = () => path17.join(toolsDir, "nvm");
|
|
|
28097
28440
|
|
|
28098
28441
|
// src/guest/agents/profile-links.ts
|
|
28099
28442
|
var profileRoot = () => process.env.USERPROFILE ?? "";
|
|
28443
|
+
var linkPairs = (agents2) => !isWin || dryRun || testMode || !profileRoot() ? [] : Object.entries(agents2).flatMap(
|
|
28444
|
+
([agent, dirs]) => dirs?.length ? profileLinkPairs(agent, dirs, profileRoot(), stateDir) : []
|
|
28445
|
+
);
|
|
28100
28446
|
function linkProfileDirs(agents2) {
|
|
28101
|
-
|
|
28102
|
-
const pairs = Object.entries(agents2).flatMap(
|
|
28103
|
-
([agent, dirs]) => dirs?.length ? profileLinkPairs(agent, dirs, profileRoot(), stateDir) : []
|
|
28104
|
-
);
|
|
28447
|
+
const pairs = linkPairs(agents2);
|
|
28105
28448
|
if (!pairs.length) return;
|
|
28106
28449
|
try {
|
|
28107
28450
|
runScriptWithJson("link-profile-dirs.ps1", "PairsFile", pairs);
|
|
@@ -28127,7 +28470,7 @@ async function installViaNpm(name, harness, dir, env) {
|
|
|
28127
28470
|
return;
|
|
28128
28471
|
}
|
|
28129
28472
|
if (!exists(npmCli)) throw new Error("npm not found at " + npmCli);
|
|
28130
|
-
await
|
|
28473
|
+
await execHeavy(process.execPath, args, { env });
|
|
28131
28474
|
}
|
|
28132
28475
|
async function installViaUv(name, harness, dir, env) {
|
|
28133
28476
|
const uv = path18.join(toolsDir, "uv", "uv.exe");
|
|
@@ -28140,7 +28483,7 @@ async function installViaUv(name, harness, dir, env) {
|
|
|
28140
28483
|
log("Installing uv for " + name + " ...");
|
|
28141
28484
|
await setupUv(emptyEnv());
|
|
28142
28485
|
}
|
|
28143
|
-
await
|
|
28486
|
+
await execHeavy(uv, ["tool", "install", "--force", "--python", "3.12", harness.uvPackage], {
|
|
28144
28487
|
env: { ...env, ...uvVars(), UV_TOOL_BIN_DIR: dir }
|
|
28145
28488
|
});
|
|
28146
28489
|
}
|