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/db.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);
|
|
@@ -25327,6 +25327,22 @@ var DatabasesSchema = external_exports.strictObject({
|
|
|
25327
25327
|
})
|
|
25328
25328
|
});
|
|
25329
25329
|
|
|
25330
|
+
// src/core/schema/codex.ts
|
|
25331
|
+
var CodexSchema = external_exports.strictObject({
|
|
25332
|
+
sandboxMode: external_exports.enum(["danger-full-access", "workspace-write", "read-only"]).describe(
|
|
25333
|
+
"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."
|
|
25334
|
+
),
|
|
25335
|
+
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.'),
|
|
25336
|
+
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."),
|
|
25337
|
+
reasoningEffort: external_exports.enum(["default", "minimal", "low", "medium", "high", "xhigh"]).describe(`How hard Codex thinks. "default" = Codex's own default.`),
|
|
25338
|
+
windowsSandbox: external_exports.enum(["off", "unelevated", "elevated"]).describe(
|
|
25339
|
+
`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.`
|
|
25340
|
+
),
|
|
25341
|
+
mcpLoginsInFile: external_exports.boolean().describe(
|
|
25342
|
+
`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.`
|
|
25343
|
+
)
|
|
25344
|
+
});
|
|
25345
|
+
|
|
25330
25346
|
// src/core/schema/harness.ts
|
|
25331
25347
|
var SubfolderSchema = external_exports.string().regex(/^(?!.*(^|[\\/])\.\.([\\/]|$))[A-Za-z0-9._ -]+([\\/][A-Za-z0-9._ -]+)*$/, "a plain relative folder");
|
|
25332
25348
|
var HarnessHomeSchema = external_exports.strictObject({
|
|
@@ -25386,15 +25402,17 @@ var SecretsSchema = external_exports.strictObject({
|
|
|
25386
25402
|
)
|
|
25387
25403
|
});
|
|
25388
25404
|
var AttachSchema = external_exports.strictObject({
|
|
25389
|
-
enabled: external_exports.boolean().describe(
|
|
25405
|
+
enabled: external_exports.boolean().describe(
|
|
25406
|
+
"Allow attaching this PC's terminal to a session (the terminal option when starting an agent, and attach)."
|
|
25407
|
+
),
|
|
25390
25408
|
reuseSession: external_exports.boolean().describe(
|
|
25391
|
-
"
|
|
25409
|
+
"Starting an agent with a terminal in a running sandbox reattaches to this folder's session when no terminal on this PC is attached to it (starting a new session on purpose always starts another)."
|
|
25392
25410
|
),
|
|
25393
25411
|
auto: external_exports.boolean().describe(
|
|
25394
25412
|
"Starting an agent attaches this terminal automatically, as if you passed -t (only in an interactive terminal)."
|
|
25395
25413
|
),
|
|
25396
25414
|
autoHide: external_exports.boolean().describe(
|
|
25397
|
-
"Hide the Windows Sandbox window whenever this terminal attaches; it keeps running (
|
|
25415
|
+
"Hide the Windows Sandbox window whenever this terminal attaches; it keeps running (Sandbox > Status shows it again)."
|
|
25398
25416
|
),
|
|
25399
25417
|
confirmCtrlC: external_exports.boolean().describe(
|
|
25400
25418
|
'In an attached terminal and the sandbox window, a single Ctrl+C is held back (the title says so) and only a second one within 1.5 seconds reaches the agent: a Ctrl+C meant as "copy" no longer stops it. Esc still stops an agent.'
|
|
@@ -25411,7 +25429,7 @@ var ClaudeProfileSchema = external_exports.strictObject({
|
|
|
25411
25429
|
hostDir: external_exports.string().describe('Your Claude folder, or "auto" (~/.claude or CLAUDE_CONFIG_DIR).'),
|
|
25412
25430
|
include: external_exports.array(external_exports.string().regex(/^[A-Za-z0-9._-]+$/)).describe("Files and folders copied from it."),
|
|
25413
25431
|
globalStateFile: external_exports.string().describe('Your .claude.json, or "auto". Empty string = do not copy.'),
|
|
25414
|
-
copyCredentials: external_exports.boolean().describe("Copy your Claude LOGIN into the sandbox. Prefer
|
|
25432
|
+
copyCredentials: external_exports.boolean().describe("Copy your Claude LOGIN into the sandbox. Prefer saving the login in Accounts instead."),
|
|
25415
25433
|
overwrite: external_exports.boolean().describe("Refresh these settings from this PC on every launch."),
|
|
25416
25434
|
sharePluginsAcrossAccounts: external_exports.boolean().describe(
|
|
25417
25435
|
"When you switch Claude accounts, copy your Claude plugins (and which ones are enabled) into a data set that has none yet. Off by default: plugins are code that runs in your sessions."
|
|
@@ -25440,7 +25458,7 @@ var MappingSchema = external_exports.strictObject({
|
|
|
25440
25458
|
});
|
|
25441
25459
|
var SandboxSchema = external_exports.strictObject({
|
|
25442
25460
|
engine: external_exports.enum(["windows-sandbox", "hcs"]).describe(
|
|
25443
|
-
'(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 (
|
|
25461
|
+
'(alpha) What runs the sandbox. "windows-sandbox" = Windows Sandbox (the default: desktop, Windows Terminal, GPU, clipboard, audio, printers). "hcs" = a headless Hyper-V isolated Server Core container for agents (no desktop, GPU or clipboard); it needs Windows features and an image on this PC (Maintenance > Engine lists what is missing), and starting it is not enabled yet in this alpha. Maintenance > Engine shows what each engine can do. Yours only: a project file (.sandbox-config.json) cannot set it.'
|
|
25444
25462
|
),
|
|
25445
25463
|
memoryMb: external_exports.union([external_exports.literal("auto"), external_exports.number().int().min(2048)]).describe(
|
|
25446
25464
|
'Sandbox RAM in MB (>= 2048), or "auto": free RAM minus reserveHostMb, capped at maxMemoryMb. Never more than this PC can keep in RAM for it (its RAM minus the larger of reserveHostMb and 25 %, 4 GB more with vGPU): a bigger value is lowered.'
|
|
@@ -25467,7 +25485,7 @@ var SandboxSchema = external_exports.strictObject({
|
|
|
25467
25485
|
),
|
|
25468
25486
|
networking: external_exports.boolean().describe("Internet access. false is the only hard network isolation Windows Sandbox offers."),
|
|
25469
25487
|
clipboard: external_exports.boolean().describe(
|
|
25470
|
-
"Shared clipboard between this PC and the sandbox. Also lets an agent's copy (in
|
|
25488
|
+
"Shared clipboard between this PC and the sandbox. Also lets an agent's copy (in an attached terminal) reach this PC's clipboard."
|
|
25471
25489
|
),
|
|
25472
25490
|
audioInput: external_exports.boolean().describe("Microphone access."),
|
|
25473
25491
|
videoInput: external_exports.boolean().describe("Camera access."),
|
|
@@ -25518,7 +25536,7 @@ var NetworkSchema = external_exports.strictObject({
|
|
|
25518
25536
|
});
|
|
25519
25537
|
var AuditSchema = external_exports.strictObject({
|
|
25520
25538
|
enabled: external_exports.boolean().describe(
|
|
25521
|
-
"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
|
|
25539
|
+
"Keep an audit log on this PC of what your agents did: programs started (with their command lines, secrets hidden), files changed in the projects, git commits, sessions, and what the repo guard caught, each linked to the agent session that did it where that can be known. The sandbox cannot change it. Read it on the Activity page."
|
|
25522
25540
|
),
|
|
25523
25541
|
days: external_exports.number().int().min(1).max(365).describe(
|
|
25524
25542
|
"Days the audit log is kept (1 to 30; a larger number keeps 30); older days are deleted when a sandbox starts and once a day."
|
|
@@ -25639,6 +25657,9 @@ var ToolchainsSchema = external_exports.strictObject({
|
|
|
25639
25657
|
keepInstallFiles: external_exports.boolean().describe(
|
|
25640
25658
|
"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."
|
|
25641
25659
|
),
|
|
25660
|
+
visualStudio: external_exports.enum(["full", "autosdk"]).describe(
|
|
25661
|
+
`"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).`
|
|
25662
|
+
),
|
|
25642
25663
|
persistEngines: external_exports.boolean().describe(
|
|
25643
25664
|
"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)."
|
|
25644
25665
|
),
|
|
@@ -25859,6 +25880,114 @@ var ToolchainsSchema = external_exports.strictObject({
|
|
|
25859
25880
|
)
|
|
25860
25881
|
});
|
|
25861
25882
|
|
|
25883
|
+
// src/shared/apps/catalogue-agents-web.ts
|
|
25884
|
+
var PERPLEXITY_MCP_VERSION = "1.3.0";
|
|
25885
|
+
var COMET_MCP_VERSION = "2.3.0";
|
|
25886
|
+
var CHROME_DEVTOOLS_MCP_VERSION = "1.12.0";
|
|
25887
|
+
var BROWSER_USE_VERSION = "0.13.14";
|
|
25888
|
+
var PERPLEXITY_COMPUTER_MCP_URL = "https://www.perplexity.ai/rest/computer/mcp";
|
|
25889
|
+
var COMET_SIGNER = {
|
|
25890
|
+
subject: ['^CN="?PERPLEXITY AI, INC\\.?"?(,|$)', '(^|, )O="?PERPLEXITY AI, INC\\.?"?(,|$)'],
|
|
25891
|
+
issuer: ["^CN=GlobalSign GCC R45 EV CodeSigning CA 2020(,|$)"]
|
|
25892
|
+
};
|
|
25893
|
+
var EDGE_EXE = "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe";
|
|
25894
|
+
var AGENTS_WEB_APPS = [
|
|
25895
|
+
{
|
|
25896
|
+
id: "perplexity-mcp",
|
|
25897
|
+
name: "Perplexity MCP (API)",
|
|
25898
|
+
category: "agents",
|
|
25899
|
+
about: "Web search, answers and deep research from Perplexity's API in Claude Code and Codex (perplexity_search, perplexity_ask, perplexity_research, perplexity_reason): Perplexity's own @perplexity-ai/mcp-server. Needs your Perplexity API key in Accounts; API use is billed separately from Perplexity Pro.",
|
|
25900
|
+
size: "30 MB",
|
|
25901
|
+
source: { locked: "npm", package: "@perplexity-ai/mcp-server", version: PERPLEXITY_MCP_VERSION },
|
|
25902
|
+
exe: "perplexity-mcp.cmd",
|
|
25903
|
+
service: true,
|
|
25904
|
+
mcp: {
|
|
25905
|
+
name: "sbx-perplexity",
|
|
25906
|
+
script: "node_modules/@perplexity-ai/mcp-server/dist/index.js",
|
|
25907
|
+
envVars: ["PERPLEXITY_API_KEY"],
|
|
25908
|
+
codex: true
|
|
25909
|
+
},
|
|
25910
|
+
plugsInto: "Claude Code and Codex as the MCP server sbx-perplexity; the key comes from Accounts as PERPLEXITY_API_KEY, never from a file",
|
|
25911
|
+
userOnly: true
|
|
25912
|
+
},
|
|
25913
|
+
{
|
|
25914
|
+
id: "perplexity-computer-mcp",
|
|
25915
|
+
name: "Perplexity Computer MCP",
|
|
25916
|
+
category: "agents",
|
|
25917
|
+
about: "Hands tasks to Perplexity Computer, Perplexity's cloud agent (it browses and works in its own cloud computer), from Claude Code and Codex: Perplexity's official remote MCP server. Nothing is installed. Sign in with your Perplexity account the first time (Claude Code: /mcp; Codex: codex mcp login sbx-perplexity-computer); tasks spend your Computer credits.",
|
|
25918
|
+
size: "0 MB",
|
|
25919
|
+
source: { remote: true },
|
|
25920
|
+
exe: "",
|
|
25921
|
+
service: true,
|
|
25922
|
+
mcp: { name: "sbx-perplexity-computer", url: PERPLEXITY_COMPUTER_MCP_URL, codex: true },
|
|
25923
|
+
plugsInto: "Claude Code and Codex as the remote MCP server sbx-perplexity-computer; its sign-in is kept with your agent login",
|
|
25924
|
+
userOnly: true
|
|
25925
|
+
},
|
|
25926
|
+
{
|
|
25927
|
+
id: "comet",
|
|
25928
|
+
name: "Comet (Perplexity browser)",
|
|
25929
|
+
category: "browsers",
|
|
25930
|
+
about: "Perplexity's agentic browser (Chromium), unpacked to run portable with its own profile on the sandbox's disk. With accounts.comet.share on, your perplexity.ai sign-in is kept for the next sandboxes. Its assistant acts on the pages it reads, so a page can try to steer it: browse only what you would let it act on.",
|
|
25931
|
+
size: "600 MB",
|
|
25932
|
+
source: { resolve: "comet" },
|
|
25933
|
+
unpack: "chromium",
|
|
25934
|
+
exe: "comet.exe",
|
|
25935
|
+
needs: ["7zip"],
|
|
25936
|
+
signer: COMET_SIGNER,
|
|
25937
|
+
userOnly: true
|
|
25938
|
+
},
|
|
25939
|
+
{
|
|
25940
|
+
id: "comet-mcp",
|
|
25941
|
+
name: "Comet MCP",
|
|
25942
|
+
category: "agents",
|
|
25943
|
+
about: "Lets Claude Code and Codex hand web tasks to Comet's own assistant and read its answers (hanzili/comet-mcp). Needs the Comet app: start Comet from its shortcut first, so the agent uses the sandbox's Comet profile and your sign-in.",
|
|
25944
|
+
size: "15 MB",
|
|
25945
|
+
source: { locked: "npm", package: "comet-mcp", version: COMET_MCP_VERSION },
|
|
25946
|
+
exe: "comet-mcp.cmd",
|
|
25947
|
+
service: true,
|
|
25948
|
+
mcp: { name: "sbx-comet", script: "node_modules/comet-mcp/dist/index.js", codex: true },
|
|
25949
|
+
plugsInto: "Claude Code and Codex as the MCP server sbx-comet, talking to Comet's DevTools on 127.0.0.1:9222",
|
|
25950
|
+
userOnly: true
|
|
25951
|
+
},
|
|
25952
|
+
{
|
|
25953
|
+
id: "chrome-devtools-mcp",
|
|
25954
|
+
name: "Chrome DevTools MCP",
|
|
25955
|
+
category: "agents",
|
|
25956
|
+
about: "Lets Claude Code and Codex drive and inspect a browser with DevTools: navigate, click, read the console and network, record performance traces (ChromeDevTools/chrome-devtools-mcp). It starts Microsoft Edge with a throwaway profile; Google's usage statistics and CrUX lookups are off.",
|
|
25957
|
+
size: "40 MB",
|
|
25958
|
+
source: { locked: "npm", package: "chrome-devtools-mcp", version: CHROME_DEVTOOLS_MCP_VERSION },
|
|
25959
|
+
exe: "chrome-devtools-mcp.cmd",
|
|
25960
|
+
service: true,
|
|
25961
|
+
mcp: {
|
|
25962
|
+
name: "sbx-chrome-devtools",
|
|
25963
|
+
script: "node_modules/chrome-devtools-mcp/build/src/bin/chrome-devtools-mcp.js",
|
|
25964
|
+
args: ["--executablePath", EDGE_EXE, "--isolated", "--no-usage-statistics", "--no-performance-crux"],
|
|
25965
|
+
codex: true
|
|
25966
|
+
},
|
|
25967
|
+
plugsInto: "Claude Code and Codex as the MCP server sbx-chrome-devtools (with Edge)",
|
|
25968
|
+
userOnly: true
|
|
25969
|
+
},
|
|
25970
|
+
{
|
|
25971
|
+
id: "browser-use-mcp",
|
|
25972
|
+
name: "Browser Use MCP",
|
|
25973
|
+
category: "agents",
|
|
25974
|
+
about: "Browser automation for agents from Browser Use (browser-use --mcp): open pages, click, type, read them, and hand a whole task to Browser Use's own agent (that one needs an OpenAI or Anthropic API key). It finds Edge in the sandbox; its telemetry is off.",
|
|
25975
|
+
size: "250 MB",
|
|
25976
|
+
source: { locked: "uv", package: "browser-use", version: BROWSER_USE_VERSION },
|
|
25977
|
+
exe: "browser-use.exe",
|
|
25978
|
+
service: true,
|
|
25979
|
+
mcp: {
|
|
25980
|
+
name: "sbx-browser-use",
|
|
25981
|
+
program: true,
|
|
25982
|
+
args: ["--mcp"],
|
|
25983
|
+
env: { ANONYMIZED_TELEMETRY: "false" },
|
|
25984
|
+
codex: true
|
|
25985
|
+
},
|
|
25986
|
+
plugsInto: "Claude Code and Codex as the MCP server sbx-browser-use",
|
|
25987
|
+
userOnly: true
|
|
25988
|
+
}
|
|
25989
|
+
];
|
|
25990
|
+
|
|
25862
25991
|
// src/shared/apps/catalogue-gamedev.ts
|
|
25863
25992
|
var GAMEDEV_APPS = [];
|
|
25864
25993
|
|
|
@@ -25866,7 +25995,38 @@ var GAMEDEV_APPS = [];
|
|
|
25866
25995
|
var MOBILE_APPS = [];
|
|
25867
25996
|
|
|
25868
25997
|
// src/shared/apps/catalogue-modding.ts
|
|
25869
|
-
var MODDING_APPS = [
|
|
25998
|
+
var MODDING_APPS = [
|
|
25999
|
+
{
|
|
26000
|
+
id: "lua-language-server",
|
|
26001
|
+
name: "Lua Language Server",
|
|
26002
|
+
category: "cli",
|
|
26003
|
+
about: "The Lua language server (LuaLS): completion, diagnostics and go-to-definition for Lua in editors and agents that speak LSP. FiveM resources use Lua 5.4 (lua54 in fxmanifest.lua).",
|
|
26004
|
+
size: "15 MB",
|
|
26005
|
+
source: { github: "LuaLS/lua-language-server", asset: "^lua-language-server-[\\d.]+-win32-x64\\.zip$" },
|
|
26006
|
+
exe: "lua-language-server.exe",
|
|
26007
|
+
cli: true
|
|
26008
|
+
},
|
|
26009
|
+
{
|
|
26010
|
+
id: "stylua",
|
|
26011
|
+
name: "StyLua",
|
|
26012
|
+
category: "cli",
|
|
26013
|
+
about: "An opinionated Lua formatter (`stylua .`), configured with a stylua.toml in the project.",
|
|
26014
|
+
size: "6 MB",
|
|
26015
|
+
source: { github: "JohnnyMorganz/StyLua", asset: "^stylua-windows-x86_64\\.zip$" },
|
|
26016
|
+
exe: "stylua.exe",
|
|
26017
|
+
cli: true
|
|
26018
|
+
},
|
|
26019
|
+
{
|
|
26020
|
+
id: "selene",
|
|
26021
|
+
name: "selene",
|
|
26022
|
+
category: "cli",
|
|
26023
|
+
about: 'A Lua linter (`selene .`), configured with a selene.toml (std = "lua54", and a standard library file for the FiveM / RedM globals).',
|
|
26024
|
+
size: "7 MB",
|
|
26025
|
+
source: { github: "Kampfkarren/selene", asset: "^selene-[\\d.]+-windows\\.zip$" },
|
|
26026
|
+
exe: "selene.exe",
|
|
26027
|
+
cli: true
|
|
26028
|
+
}
|
|
26029
|
+
];
|
|
25870
26030
|
|
|
25871
26031
|
// src/shared/apps/catalogue.ts
|
|
25872
26032
|
var gh = (github, asset) => ({ github, asset });
|
|
@@ -26700,7 +26860,7 @@ var CORE_APPS = [
|
|
|
26700
26860
|
cli: true
|
|
26701
26861
|
}
|
|
26702
26862
|
];
|
|
26703
|
-
var APPS = [...CORE_APPS, ...GAMEDEV_APPS, ...MODDING_APPS, ...MOBILE_APPS];
|
|
26863
|
+
var APPS = [...CORE_APPS, ...GAMEDEV_APPS, ...MODDING_APPS, ...MOBILE_APPS, ...AGENTS_WEB_APPS];
|
|
26704
26864
|
|
|
26705
26865
|
// src/core/schema/apps.ts
|
|
26706
26866
|
var CATALOGUE_IDS = APPS.filter((a) => !a.setting).map((a) => a.id);
|
|
@@ -26770,7 +26930,7 @@ var ProjectsSchema = external_exports.strictObject({
|
|
|
26770
26930
|
var RESUME_SESSIONS = ["ask", "always", "afterCrash", "never"];
|
|
26771
26931
|
var ResumeSchema = external_exports.strictObject({
|
|
26772
26932
|
sessions: external_exports.enum(RESUME_SESSIONS).describe(
|
|
26773
|
-
'When a sandbox starts after one that had agent sessions: "ask" lists them and asks whether to reopen them (without a terminal it
|
|
26933
|
+
'When a sandbox starts after one that had agent sessions: "ask" lists them and asks whether to reopen them (without a terminal it only says they can be reopened), "always" reopens them, "afterCrash" reopens them only when the last sandbox ended unexpectedly, "never" leaves it to you (Sessions reopens them). Terminal tabs you opened yourself in the sandbox are never reopened.'
|
|
26774
26934
|
),
|
|
26775
26935
|
restartAfterCrash: external_exports.boolean().describe(
|
|
26776
26936
|
"When the sandbox ends because Windows Sandbox crashed or ran out of memory, start it again by itself and reopen its sessions (at most 3 times in 6 hours)."
|
|
@@ -26789,14 +26949,14 @@ var RemoteUserSchema = external_exports.strictObject({
|
|
|
26789
26949
|
});
|
|
26790
26950
|
var WebLanSchema = external_exports.strictObject({
|
|
26791
26951
|
enabled: external_exports.boolean().describe(
|
|
26792
|
-
"(Beta) Devices on your network (a phone): an HTTPS address on this PC for devices you pair with a one-time code (
|
|
26952
|
+
"(Beta) Devices on your network (a phone): an HTTPS address on this PC for devices you pair with a one-time code (Remote access). Needs a firewall rule (turning it on asks Windows once). Off: every paired device is signed out."
|
|
26793
26953
|
),
|
|
26794
26954
|
port: external_exports.number().int().min(1024).max(65535).describe("HTTPS port for paired devices on your network."),
|
|
26795
26955
|
address: external_exports.string().trim().max(15).regex(/^$|^\d{1,3}(\.\d{1,3}){3}$/, "an IPv4 address or empty").describe("This PC's private address to listen on. Empty: the one of its network adapter (never a public one).")
|
|
26796
26956
|
});
|
|
26797
26957
|
var WebRemoteSchema = external_exports.strictObject({
|
|
26798
26958
|
windowsSignIn: external_exports.boolean().describe(
|
|
26799
|
-
"(Beta) Other Windows users of this PC named in web.remote.users sign in to your web UI (and
|
|
26959
|
+
"(Beta) Other Windows users of this PC named in web.remote.users sign in to your web UI (and the remote menu) with their own Windows account: no password, no link."
|
|
26800
26960
|
),
|
|
26801
26961
|
users: external_exports.array(RemoteUserSchema).max(32).describe("Who else may sign in with Windows, and their role (view or control)."),
|
|
26802
26962
|
rememberDays: external_exports.number().int().min(1).max(90).describe(
|
|
@@ -26806,7 +26966,7 @@ var WebRemoteSchema = external_exports.strictObject({
|
|
|
26806
26966
|
});
|
|
26807
26967
|
var WebSchema = external_exports.strictObject({
|
|
26808
26968
|
enabled: external_exports.boolean().describe(
|
|
26809
|
-
"(Beta) The web UI: your
|
|
26969
|
+
"(Beta) The web UI: your sessions in a browser on this PC (http://127.0.0.1:<port>, this PC only). On: every start of a sandbox also starts it in the background (it keeps running until you stop it in Maintenance > Web UI or restart the PC). Off: it runs only when you start it there. Open it signed in from the same page."
|
|
26810
26970
|
),
|
|
26811
26971
|
port: external_exports.number().int().min(1024).max(65535).describe("Port of the web UI on 127.0.0.1 (this PC only). Pick another when it is taken."),
|
|
26812
26972
|
openOnLaunch: external_exports.boolean().describe("(Beta) With the web UI on: open it in your browser, already signed in, every time a sandbox starts."),
|
|
@@ -26817,7 +26977,7 @@ var WebSchema = external_exports.strictObject({
|
|
|
26817
26977
|
var VPN_PROVIDERS = ["nordvpn", "openvpn-file", "wireguard-file"];
|
|
26818
26978
|
var VpnSchema = external_exports.strictObject({
|
|
26819
26979
|
enabled: external_exports.boolean().describe(
|
|
26820
|
-
"(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 (
|
|
26980
|
+
"(Alpha: not yet tried on a real PC) Send the sandbox's traffic through a VPN. Only the sandbox: your PC's own connection is untouched. Needs a saved login first (Settings > Network > VPN). The agent in the sandbox can read that login and can turn the tunnel off (it is the administrator there)."
|
|
26821
26981
|
),
|
|
26822
26982
|
provider: external_exports.enum(VPN_PROVIDERS).describe(
|
|
26823
26983
|
"nordvpn: a recommended NordVPN server is picked at every launch. openvpn-file: your own .ovpn file (configFile). wireguard-file: your own WireGuard .conf (configFile), e.g. from your company."
|
|
@@ -26835,13 +26995,14 @@ var VpnSchema = external_exports.strictObject({
|
|
|
26835
26995
|
// src/core/schema/github.ts
|
|
26836
26996
|
var GithubSchema = external_exports.strictObject({
|
|
26837
26997
|
shareToken: external_exports.boolean().describe(
|
|
26838
|
-
'Give each sandbox the GitHub token you saved
|
|
26998
|
+
'Give each sandbox the GitHub token you saved in Accounts (best a fine-grained token limited to some repositories and permissions), so gh and https git work there without logging in. Only with provisioning.git.access "full". The agent in the sandbox can read the token and use it for whatever it allows. A project file (.sandbox-config.json) cannot turn this on.'
|
|
26839
26999
|
)
|
|
26840
27000
|
});
|
|
26841
27001
|
|
|
26842
27002
|
// src/shared/accounts/kinds.ts
|
|
26843
27003
|
var AGENT_CAN_USE = "The agent in the sandbox can use this sign-in while it is there.";
|
|
26844
27004
|
var ONE_PLACE = "It works in one sandbox at a time: a second sandbox starts without it while the first one runs.";
|
|
27005
|
+
var PERPLEXITY_KEY_PATTERN = /^pplx-[A-Za-z0-9_-]{8,200}$/;
|
|
26845
27006
|
var SERVICE_SPECS = {
|
|
26846
27007
|
epic: {
|
|
26847
27008
|
kind: "epic",
|
|
@@ -26895,19 +27056,28 @@ var SERVICE_SPECS = {
|
|
|
26895
27056
|
kind: "cfx",
|
|
26896
27057
|
label: "Cfx.re (FiveM / RedM server key)",
|
|
26897
27058
|
usedBy: ["fivem"],
|
|
26898
|
-
sources: ["typed"],
|
|
27059
|
+
sources: ["typed", "file"],
|
|
26899
27060
|
singleHolder: false,
|
|
26900
27061
|
returns: false,
|
|
27062
|
+
// `import cfx --from` reads a whole server.cfg (they often run to tens of KB); the payload itself is tiny.
|
|
26901
27063
|
maxBytes: 4 * 1024,
|
|
27064
|
+
maxFileBytes: 256 * 1024,
|
|
26902
27065
|
warnings: [AGENT_CAN_USE + " Anyone with the key can run a server under your Cfx.re account."],
|
|
26903
27066
|
fields: [
|
|
26904
|
-
{
|
|
27067
|
+
{
|
|
27068
|
+
name: "licenseKey",
|
|
27069
|
+
label: "Server licence key (cfxk_...)",
|
|
27070
|
+
secret: true,
|
|
27071
|
+
pattern: /^cfxk_[A-Za-z0-9_]+$/,
|
|
27072
|
+
only: "typed"
|
|
27073
|
+
},
|
|
26905
27074
|
{
|
|
26906
27075
|
name: "steamWebApiKey",
|
|
26907
27076
|
label: "Steam Web API key (optional)",
|
|
26908
27077
|
secret: true,
|
|
26909
27078
|
optional: true,
|
|
26910
|
-
pattern: /^[A-F0-9]{32}
|
|
27079
|
+
pattern: /^[A-F0-9]{32}$/,
|
|
27080
|
+
only: "typed"
|
|
26911
27081
|
}
|
|
26912
27082
|
]
|
|
26913
27083
|
},
|
|
@@ -26961,33 +27131,77 @@ var SERVICE_SPECS = {
|
|
|
26961
27131
|
{ name: "issuerId", label: "Issuer ID", secret: false },
|
|
26962
27132
|
{ name: "keyId", label: "Key ID", secret: false, pattern: /^[A-Z0-9]{10}$/ }
|
|
26963
27133
|
]
|
|
27134
|
+
},
|
|
27135
|
+
perplexity: {
|
|
27136
|
+
kind: "perplexity",
|
|
27137
|
+
label: "Perplexity API key",
|
|
27138
|
+
usedBy: ["perplexity"],
|
|
27139
|
+
sources: ["pc", "file", "typed"],
|
|
27140
|
+
singleHolder: false,
|
|
27141
|
+
returns: false,
|
|
27142
|
+
maxBytes: 1024,
|
|
27143
|
+
maxFileBytes: 64 * 1024,
|
|
27144
|
+
warnings: [
|
|
27145
|
+
AGENT_CAN_USE + " It can read the key and spend your API credit: use a separate API key with a spending limit.",
|
|
27146
|
+
"Perplexity Pro does not include API use; the API key is billed separately.",
|
|
27147
|
+
"Only the variable PERPLEXITY_API_KEY of the agent gets it: nothing in the sandbox writes it to a file."
|
|
27148
|
+
],
|
|
27149
|
+
fields: [
|
|
27150
|
+
{
|
|
27151
|
+
name: "apiKey",
|
|
27152
|
+
label: "Perplexity API key (pplx-...)",
|
|
27153
|
+
secret: true,
|
|
27154
|
+
pattern: PERPLEXITY_KEY_PATTERN,
|
|
27155
|
+
only: "typed"
|
|
27156
|
+
}
|
|
27157
|
+
]
|
|
27158
|
+
},
|
|
27159
|
+
comet: {
|
|
27160
|
+
kind: "comet",
|
|
27161
|
+
label: "Comet (Perplexity browser)",
|
|
27162
|
+
usedBy: ["comet"],
|
|
27163
|
+
sources: ["sandbox"],
|
|
27164
|
+
singleHolder: false,
|
|
27165
|
+
returns: true,
|
|
27166
|
+
maxBytes: 256 * 1024,
|
|
27167
|
+
warnings: [
|
|
27168
|
+
AGENT_CAN_USE + " It can act as you in Comet and spend your Perplexity Computer credits; agentic browsing is open to prompt injection from the pages it reads.",
|
|
27169
|
+
"Your Comet sign-in can't be copied from this PC: Windows locks it to your PC account. Sign in once inside a sandbox and it is kept for the next ones.",
|
|
27170
|
+
"Only the perplexity.ai sign-in cookies are kept: never saved passwords, other sites, localStorage or history. Never import your main browser profile.",
|
|
27171
|
+
"Several sandboxes can use it at once: the sign-in the last one hands back is kept."
|
|
27172
|
+
],
|
|
27173
|
+
fields: []
|
|
26964
27174
|
}
|
|
26965
27175
|
};
|
|
27176
|
+
var APP_USER_TEXT = {
|
|
27177
|
+
perplexity: "the Perplexity MCP app",
|
|
27178
|
+
comet: "the Comet app"
|
|
27179
|
+
};
|
|
27180
|
+
function usedByText(usedBy) {
|
|
27181
|
+
return usedBy.map((u) => u in APP_USER_TEXT ? APP_USER_TEXT[u] : u).join(" or ");
|
|
27182
|
+
}
|
|
26966
27183
|
|
|
26967
27184
|
// src/core/schema/accounts.ts
|
|
26968
27185
|
function share(kind, how) {
|
|
26969
27186
|
const spec = SERVICE_SPECS[kind];
|
|
26970
27187
|
return external_exports.strictObject({
|
|
26971
27188
|
share: external_exports.boolean().describe(
|
|
26972
|
-
"Hand your saved " + spec.label + " sign-in to sandboxes that use " + spec.usedBy
|
|
27189
|
+
"Hand your saved " + spec.label + " sign-in to sandboxes that use " + usedByText(spec.usedBy) + " (" + how + "). Kept encrypted on this PC; " + spec.warnings.join(" ") + " Yours only: a project file can only turn it off."
|
|
26973
27190
|
)
|
|
26974
27191
|
});
|
|
26975
27192
|
}
|
|
26976
27193
|
var AccountsSchema = external_exports.strictObject({
|
|
26977
|
-
epic: share("epic", "sign in to the launcher once in a sandbox, or take this PC's
|
|
26978
|
-
steam: share(
|
|
26979
|
-
|
|
26980
|
-
|
|
26981
|
-
),
|
|
26982
|
-
|
|
26983
|
-
|
|
26984
|
-
|
|
26985
|
-
|
|
26986
|
-
|
|
26987
|
-
|
|
26988
|
-
}).describe(
|
|
26989
|
-
"Service sign-ins for sandboxes (game stores, engines, app signing). Manage them in Accounts: sandbox account status."
|
|
26990
|
-
);
|
|
27194
|
+
epic: share("epic", "sign in to the launcher once in a sandbox, or take this PC's from Accounts"),
|
|
27195
|
+
steam: share("steam", "sign in once with sbx-steam login, or take it from a SteamCMD folder in Accounts"),
|
|
27196
|
+
unity: share("unity", "sign in once in a sandbox, or take this PC's licence from Accounts"),
|
|
27197
|
+
cfx: share("cfx", "type the key in Accounts"),
|
|
27198
|
+
keystore: share("keystore", "import the upload.jks file in Accounts"),
|
|
27199
|
+
play: share("play", "import the service-account.json file in Accounts"),
|
|
27200
|
+
expo: share("expo", "type the token in Accounts"),
|
|
27201
|
+
appstore: share("appstore", "import the AuthKey.p8 file in Accounts"),
|
|
27202
|
+
perplexity: share("perplexity", "type the API key in Accounts, or import it from a .env file"),
|
|
27203
|
+
comet: share("comet", "sign in to Comet once in a sandbox: it cannot be taken from this PC")
|
|
27204
|
+
}).describe("Service sign-ins for sandboxes (game stores, engines, app signing, Perplexity). Manage them in Accounts.");
|
|
26991
27205
|
|
|
26992
27206
|
// src/core/schema/pc-installs.ts
|
|
26993
27207
|
var pick2 = (item, what, example) => external_exports.union([external_exports.boolean(), external_exports.array(item)]).describe(
|
|
@@ -27051,7 +27265,9 @@ function reservedEnvName(name) {
|
|
|
27051
27265
|
}
|
|
27052
27266
|
var ConfigSchema = external_exports.strictObject({
|
|
27053
27267
|
$schema: SchemaRefSchema.optional(),
|
|
27054
|
-
defaultHarness: NameSchema.describe(
|
|
27268
|
+
defaultHarness: NameSchema.describe(
|
|
27269
|
+
"The agent that starts when you do not name one (starting claude by name always runs claude)."
|
|
27270
|
+
),
|
|
27055
27271
|
guestWorkspace: GuestWorkspaceSchema,
|
|
27056
27272
|
readOnly: external_exports.boolean().describe("Map the workspace read-only."),
|
|
27057
27273
|
workspaceFilter: WorkspaceFilterSchema,
|
|
@@ -27061,7 +27277,7 @@ var ConfigSchema = external_exports.strictObject({
|
|
|
27061
27277
|
sharing: SharingSchema,
|
|
27062
27278
|
storage: external_exports.strictObject({
|
|
27063
27279
|
root: external_exports.string().min(1).describe(
|
|
27064
|
-
"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.
|
|
27280
|
+
"Where everything is kept on this PC (tools, databases, logins, launches). The default is a private folder for you under %ProgramData%\\AgentSandbox\\users, which works for installs for one user and for everyone. Maintenance > Storage moves it."
|
|
27065
27281
|
),
|
|
27066
27282
|
persistAgentState: external_exports.boolean().describe("Keep agent logins and history between sandboxes."),
|
|
27067
27283
|
dataName: NameSchema.describe("Name of the persistent data set (C:\\AgentData) shared by all workspaces."),
|
|
@@ -27069,11 +27285,11 @@ var ConfigSchema = external_exports.strictObject({
|
|
|
27069
27285
|
`Programs and scripts (.exe, .ps1, .bat, .cmd, .msi, .lnk ...) that appear or change in your project while a sandbox runs get Windows' "downloaded from the internet" mark, so SmartScreen and PowerShell ask before they run on this PC.`
|
|
27070
27286
|
),
|
|
27071
27287
|
contained: external_exports.enum(["off", "vhdx"]).describe(
|
|
27072
|
-
'(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
|
|
27288
|
+
'(beta) Keep the sandbox tools, state and logs inside one disk image file (vhdx) instead of loose folders, so scanning programs on this PC see one file. Not yet tried on a real PC. Turn it on in Maintenance > Storage (it moves your files and asks first); Windows asks for permission to mount the image when a sandbox starts. "off" = loose folders, as always. Yours only: a project file (.sandbox-config.json) cannot set it.'
|
|
27073
27289
|
),
|
|
27074
27290
|
containedMaxGb: external_exports.number().int().min(8).max(4096).describe("(beta) Largest size, in GB, the disk image of storage.contained may grow to."),
|
|
27075
27291
|
warnDataGb: external_exports.number().min(0).describe(
|
|
27076
|
-
"Say at launch when the persisted data (tools, databases, logins) is bigger than this many GB; 0 = never.
|
|
27292
|
+
"Say at launch when the persisted data (tools, databases, logins) is bigger than this many GB; 0 = never. Maintenance > Data shows what takes the space."
|
|
27077
27293
|
)
|
|
27078
27294
|
}),
|
|
27079
27295
|
network: NetworkSchema,
|
|
@@ -27095,6 +27311,7 @@ var ConfigSchema = external_exports.strictObject({
|
|
|
27095
27311
|
apps: AppsSchema,
|
|
27096
27312
|
claudeProfile: ClaudeProfileSchema,
|
|
27097
27313
|
harnesses: external_exports.record(NameSchema, HarnessSchema).describe("Agents that can run in the sandbox."),
|
|
27314
|
+
codex: CodexSchema,
|
|
27098
27315
|
hooks: external_exports.strictObject({ failFast: external_exports.boolean().describe("Stop when a hook script fails.") }),
|
|
27099
27316
|
projects: ProjectsSchema.describe(
|
|
27100
27317
|
"Several projects in one sandbox: folders of projects mapped at every start, and adding folders while it runs."
|
|
@@ -27179,6 +27396,10 @@ var BootProgressSchema = external_exports.strictObject({
|
|
|
27179
27396
|
done: external_exports.number().int().min(0).max(1e3),
|
|
27180
27397
|
total: external_exports.number().int().min(0).max(1e3)
|
|
27181
27398
|
});
|
|
27399
|
+
var BackgroundWorkSchema = external_exports.strictObject({
|
|
27400
|
+
name: Text(64),
|
|
27401
|
+
state: external_exports.enum(["running", "done", "failed"])
|
|
27402
|
+
});
|
|
27182
27403
|
var SandboxStatusSchema = external_exports.object({
|
|
27183
27404
|
launchId: Text(64),
|
|
27184
27405
|
phase: external_exports.enum(["booting", "provisioning", "ready", "failed"]),
|
|
@@ -27190,7 +27411,9 @@ var SandboxStatusSchema = external_exports.object({
|
|
|
27190
27411
|
/** The sandbox's IPv4 addresses (for network.forwardPorts; the host only uses ones on its Hyper-V network). */
|
|
27191
27412
|
addresses: external_exports.array(external_exports.string().max(45)).max(8).optional(),
|
|
27192
27413
|
/** A malformed progress is dropped, never the status (the phase still counts). */
|
|
27193
|
-
progress: BootProgressSchema.optional().catch(void 0)
|
|
27414
|
+
progress: BootProgressSchema.optional().catch(void 0),
|
|
27415
|
+
/** Installs that continue after the boot is ready; a malformed list is dropped, never the status. */
|
|
27416
|
+
background: external_exports.array(BackgroundWorkSchema).max(16).optional().catch(void 0)
|
|
27194
27417
|
});
|
|
27195
27418
|
var VersionSchema = external_exports.strictObject({ spec: Text(128), source: Text(256) });
|
|
27196
27419
|
var DatabasePlanSchema = external_exports.strictObject({
|
|
@@ -27338,6 +27561,8 @@ var ProjectStatusSchema = external_exports.object({
|
|
|
27338
27561
|
var VpnStatusSchema = external_exports.object({
|
|
27339
27562
|
state: external_exports.enum(["off", "starting", "up", "failed"]),
|
|
27340
27563
|
message: Text(2e3),
|
|
27564
|
+
/** Why it failed, when it did: `auth` (login refused), `unreachable`, `driver`, `timeout` or `other`. */
|
|
27565
|
+
code: external_exports.enum(["auth", "unreachable", "driver", "timeout", "other"]).optional(),
|
|
27341
27566
|
killSwitch: external_exports.boolean(),
|
|
27342
27567
|
/** A direct connection was tried after the kill switch was applied: false = it still got out. */
|
|
27343
27568
|
killSwitchHeld: external_exports.boolean().optional(),
|
|
@@ -27654,28 +27879,41 @@ var run = new RunDir(dataDir);
|
|
|
27654
27879
|
// src/guest/runtime/log.ts
|
|
27655
27880
|
import fs5 from "node:fs";
|
|
27656
27881
|
import path7 from "node:path";
|
|
27882
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
27657
27883
|
fs5.mkdirSync(logsDir, { recursive: true });
|
|
27658
27884
|
var logFile = path7.join(
|
|
27659
27885
|
logsDir,
|
|
27660
27886
|
(process.env.AGENT_LOG_PREFIX ?? "guest") + "-" + (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-") + ".log"
|
|
27661
27887
|
);
|
|
27888
|
+
var context = new AsyncLocalStorage();
|
|
27889
|
+
function fileLine(message, at = /* @__PURE__ */ new Date()) {
|
|
27890
|
+
return at.toISOString() + " " + message;
|
|
27891
|
+
}
|
|
27662
27892
|
var append = (line) => {
|
|
27663
27893
|
try {
|
|
27664
|
-
fs5.appendFileSync(logFile, line + "\n");
|
|
27894
|
+
fs5.appendFileSync(logFile, fileLine(line) + "\n");
|
|
27665
27895
|
} catch {
|
|
27666
27896
|
}
|
|
27667
27897
|
};
|
|
27898
|
+
var tagged = (message, ctx) => {
|
|
27899
|
+
const prefix = ctx?.prefix?.();
|
|
27900
|
+
return prefix ? prefix + " | " + message : message;
|
|
27901
|
+
};
|
|
27668
27902
|
function log(message) {
|
|
27669
|
-
|
|
27670
|
-
|
|
27903
|
+
const ctx = context.getStore();
|
|
27904
|
+
const line = tagged(message, ctx);
|
|
27905
|
+
if (!ctx?.quiet) console.log(line);
|
|
27906
|
+
append(line);
|
|
27671
27907
|
}
|
|
27672
27908
|
function warn(message) {
|
|
27673
|
-
|
|
27674
|
-
|
|
27909
|
+
const ctx = context.getStore();
|
|
27910
|
+
const line = tagged(message, ctx);
|
|
27911
|
+
if (!ctx?.quiet) console.warn("\x1B[33mWARNING: " + line + "\x1B[0m");
|
|
27912
|
+
append("WARNING: " + line);
|
|
27675
27913
|
}
|
|
27676
27914
|
|
|
27677
27915
|
// src/guest/runtime/project-context.ts
|
|
27678
|
-
import { AsyncLocalStorage } from "node:async_hooks";
|
|
27916
|
+
import { AsyncLocalStorage as AsyncLocalStorage2 } from "node:async_hooks";
|
|
27679
27917
|
|
|
27680
27918
|
// src/guest/runtime/session.ts
|
|
27681
27919
|
import fs9 from "node:fs";
|
|
@@ -27755,7 +27993,11 @@ function moveIntoPlace(work, destination) {
|
|
|
27755
27993
|
fs7.mkdirSync(path9.dirname(destination), { recursive: true });
|
|
27756
27994
|
fs7.renameSync(work, destination);
|
|
27757
27995
|
}
|
|
27758
|
-
|
|
27996
|
+
var extractLimit = null;
|
|
27997
|
+
function extractArchive(archive, destination, members2 = []) {
|
|
27998
|
+
return extractLimit ? extractLimit.run(() => extract(archive, destination, members2)) : extract(archive, destination, members2);
|
|
27999
|
+
}
|
|
28000
|
+
async function extract(archive, destination, members2) {
|
|
27759
28001
|
fs7.mkdirSync(destination, { recursive: true });
|
|
27760
28002
|
let status = await spawnAsync(SYSTEM.tar(), ["-xf", archive, "-C", destination, ...members2]);
|
|
27761
28003
|
if (status !== 0 && /\.(zip|nupkg)$/i.test(archive)) {
|
|
@@ -27790,6 +28032,8 @@ import { pipeline } from "node:stream/promises";
|
|
|
27790
28032
|
var Downloader = class {
|
|
27791
28033
|
/** downloads.requireChecksum: refuse anything without an expected hash. The guest sets it from session.json. */
|
|
27792
28034
|
requireChecksum = false;
|
|
28035
|
+
/** The guest's net pool: how many HTTP bodies stream at once. Host code leaves it null. */
|
|
28036
|
+
limit = null;
|
|
27793
28037
|
watcher = null;
|
|
27794
28038
|
/** Reports coarse progress of the downloads that start from now on to `watcher` (null: stop). */
|
|
27795
28039
|
watch(watcher) {
|
|
@@ -27807,39 +28051,42 @@ var Downloader = class {
|
|
|
27807
28051
|
"Refusing to download " + path10.basename(destination) + " (" + url2 + "): no checksum is published for it, and downloads.requireChecksum is on. Turn that setting off to allow downloads that cannot be verified."
|
|
27808
28052
|
);
|
|
27809
28053
|
}
|
|
27810
|
-
const response = await fetchRetry(url2, {}, 3, 20 * 60 * 1e3);
|
|
27811
|
-
if (!response.body) throw new Error("Empty response for " + url2);
|
|
27812
28054
|
fs8.mkdirSync(path10.dirname(destination), { recursive: true });
|
|
27813
28055
|
const checks = ["sha256", "sha512", "sha1"].flatMap((kind) => {
|
|
27814
28056
|
const want = sums[kind]?.trim().toLowerCase();
|
|
27815
28057
|
return want ? [{ want, hash: crypto2.createHash(kind) }] : [];
|
|
27816
28058
|
});
|
|
27817
|
-
const
|
|
27818
|
-
const
|
|
27819
|
-
|
|
27820
|
-
|
|
27821
|
-
|
|
27822
|
-
|
|
27823
|
-
|
|
27824
|
-
|
|
27825
|
-
|
|
27826
|
-
|
|
27827
|
-
|
|
27828
|
-
|
|
27829
|
-
|
|
27830
|
-
|
|
27831
|
-
|
|
27832
|
-
|
|
27833
|
-
|
|
28059
|
+
const partial2 = destination + ".part";
|
|
28060
|
+
const transfer = async () => {
|
|
28061
|
+
const response = await fetchRetry(url2, {}, 3, 20 * 60 * 1e3);
|
|
28062
|
+
if (!response.body) throw new Error("Empty response for " + url2);
|
|
28063
|
+
const size = Number(response.headers.get("content-length")) || 0;
|
|
28064
|
+
const report = size > 0 ? this.watcher?.() ?? null : null;
|
|
28065
|
+
let received = 0;
|
|
28066
|
+
let tenth = 0;
|
|
28067
|
+
let reportedAt = Date.now();
|
|
28068
|
+
const tap = new Transform({
|
|
28069
|
+
transform(chunk, _encoding, done) {
|
|
28070
|
+
for (const c of checks) c.hash.update(chunk);
|
|
28071
|
+
if (report) {
|
|
28072
|
+
received += chunk.length;
|
|
28073
|
+
const now = Math.floor(received * 10 / size);
|
|
28074
|
+
if (now !== tenth || Date.now() - reportedAt > 5e3) {
|
|
28075
|
+
tenth = now;
|
|
28076
|
+
reportedAt = Date.now();
|
|
28077
|
+
try {
|
|
28078
|
+
report(Math.min(1, received / size));
|
|
28079
|
+
} catch {
|
|
28080
|
+
}
|
|
27834
28081
|
}
|
|
27835
28082
|
}
|
|
28083
|
+
done(null, chunk);
|
|
27836
28084
|
}
|
|
27837
|
-
|
|
27838
|
-
}
|
|
27839
|
-
});
|
|
27840
|
-
const partial2 = destination + ".part";
|
|
27841
|
-
try {
|
|
28085
|
+
});
|
|
27842
28086
|
await pipeline(Readable.fromWeb(response.body), tap, fs8.createWriteStream(partial2));
|
|
28087
|
+
};
|
|
28088
|
+
try {
|
|
28089
|
+
await (this.limit ? this.limit.run(transfer) : transfer());
|
|
27843
28090
|
if (checks.some((c) => c.hash.digest("hex") !== c.want)) throw new Error("Checksum mismatch for " + url2);
|
|
27844
28091
|
if (sums.verify) await sums.verify(partial2);
|
|
27845
28092
|
fs8.rmSync(destination, { force: true });
|
|
@@ -27856,12 +28103,17 @@ var Downloader = class {
|
|
|
27856
28103
|
const work = stagingFolder(destination);
|
|
27857
28104
|
try {
|
|
27858
28105
|
const archive = path10.join(work, options.fileName ?? path10.basename(new URL(url2).pathname));
|
|
27859
|
-
|
|
27860
|
-
|
|
27861
|
-
|
|
27862
|
-
|
|
27863
|
-
|
|
27864
|
-
|
|
28106
|
+
if (options.cached && fs8.existsSync(options.cached)) {
|
|
28107
|
+
fs8.mkdirSync(work, { recursive: true });
|
|
28108
|
+
fs8.copyFileSync(options.cached, archive);
|
|
28109
|
+
fs8.rmSync(options.cached, { force: true });
|
|
28110
|
+
} else
|
|
28111
|
+
await this.file(url2, archive, {
|
|
28112
|
+
sha256: options.sha256,
|
|
28113
|
+
sha512: options.sha512,
|
|
28114
|
+
sha1: options.sha1,
|
|
28115
|
+
...options.verify ? { verify: options.verify } : {}
|
|
28116
|
+
});
|
|
27865
28117
|
const extracted = path10.join(work, "x");
|
|
27866
28118
|
await extractArchive(archive, extracted, options.members);
|
|
27867
28119
|
let root = extracted;
|
|
@@ -27960,7 +28212,7 @@ var stateDir = path11.join(dataDir, session.persistAgentState ? "state" : "state
|
|
|
27960
28212
|
var claudeDir = path11.join(stateDir, "claude");
|
|
27961
28213
|
|
|
27962
28214
|
// src/guest/runtime/project-context.ts
|
|
27963
|
-
var store = new
|
|
28215
|
+
var store = new AsyncLocalStorage2();
|
|
27964
28216
|
function projectWorkspace() {
|
|
27965
28217
|
return store.getStore()?.workspace ?? workspace;
|
|
27966
28218
|
}
|
|
@@ -27998,13 +28250,13 @@ var DatabaseServer = class {
|
|
|
27998
28250
|
// src/guest/databases/dynamodb.ts
|
|
27999
28251
|
import fs17 from "node:fs";
|
|
28000
28252
|
import path17 from "node:path";
|
|
28001
|
-
import { spawn as
|
|
28253
|
+
import { spawn as spawn4 } from "node:child_process";
|
|
28002
28254
|
|
|
28003
28255
|
// src/guest/runtime/process.ts
|
|
28004
28256
|
import fs10 from "node:fs";
|
|
28005
28257
|
import os3 from "node:os";
|
|
28006
28258
|
import path12 from "node:path";
|
|
28007
|
-
import { spawnSync as spawnSync2 } from "node:child_process";
|
|
28259
|
+
import { spawn as spawn2, spawnSync as spawnSync2 } from "node:child_process";
|
|
28008
28260
|
async function execAsync(file2, args, options = {}) {
|
|
28009
28261
|
const code = await spawnAsync(file2, args, { stdio: "inherit", ...options });
|
|
28010
28262
|
if (code !== 0)
|
|
@@ -28273,7 +28525,7 @@ async function ensureJdk() {
|
|
|
28273
28525
|
// src/guest/databases/server.ts
|
|
28274
28526
|
import fs16 from "node:fs";
|
|
28275
28527
|
import path16 from "node:path";
|
|
28276
|
-
import { spawn as
|
|
28528
|
+
import { spawn as spawn3 } from "node:child_process";
|
|
28277
28529
|
function dataFor(name) {
|
|
28278
28530
|
return path16.join(dataDir, "databases", name);
|
|
28279
28531
|
}
|
|
@@ -28281,7 +28533,7 @@ async function startServer(name, exe, args, port) {
|
|
|
28281
28533
|
if (await portOpen(port)) throw new Error("port " + port + " is already in use (change databases." + name + ".port)");
|
|
28282
28534
|
const logFile2 = path16.join(logsDir, name + ".log");
|
|
28283
28535
|
const out = fs16.openSync(logFile2, "a");
|
|
28284
|
-
|
|
28536
|
+
spawn3(exe, args, { detached: true, stdio: ["ignore", out, out], windowsHide: true }).unref();
|
|
28285
28537
|
fs16.closeSync(out);
|
|
28286
28538
|
if (!await waitForPort(port, 60))
|
|
28287
28539
|
throw new Error(name + " did not start listening on port " + port + "; see " + logFile2);
|
|
@@ -28376,7 +28628,7 @@ var DynamoServer = class extends DatabaseServer {
|
|
|
28376
28628
|
return;
|
|
28377
28629
|
}
|
|
28378
28630
|
const out = fs17.openSync(path17.join(logsDir, "dynamodb-admin.log"), "a");
|
|
28379
|
-
|
|
28631
|
+
spawn4(
|
|
28380
28632
|
process.execPath,
|
|
28381
28633
|
[script, "--port", String(plan.adminPort), "--dynamo-endpoint", endpoint, "--skip-default-credentials"],
|
|
28382
28634
|
{ detached: true, stdio: ["ignore", out, out], windowsHide: true, env: { ...process.env, ...aws } }
|
|
@@ -28638,6 +28890,14 @@ async function setupDatabase(env, plan) {
|
|
|
28638
28890
|
// src/guest/setup/environment.ts
|
|
28639
28891
|
import path23 from "node:path";
|
|
28640
28892
|
|
|
28893
|
+
// src/guest/agents/agent-files.ts
|
|
28894
|
+
var CODEX_MARKER = "# Set by the sandbox";
|
|
28895
|
+
var MAX_CODEX_CONFIG_BYTES = 1024 * 1024;
|
|
28896
|
+
var MARKED_LINES = new RegExp(
|
|
28897
|
+
"^" + CODEX_MARKER + "[^\r\n]*\r?\n(?:(?:sandbox_mode|approval_policy)[ ]*=[^\r\n]*\r?\n)*(?:[ ]*\r?\n)?",
|
|
28898
|
+
"m"
|
|
28899
|
+
);
|
|
28900
|
+
|
|
28641
28901
|
// src/guest/setup/path-plan.ts
|
|
28642
28902
|
import path22 from "node:path";
|
|
28643
28903
|
function pathKey(folder) {
|
|
@@ -28656,13 +28916,26 @@ function planPath(input2) {
|
|
|
28656
28916
|
seen.add(key);
|
|
28657
28917
|
result.push(entry);
|
|
28658
28918
|
}
|
|
28659
|
-
return result;
|
|
28919
|
+
return msvcBeforeGitUsr(result);
|
|
28660
28920
|
}
|
|
28661
28921
|
function isPinnedNodeDir(folder, nvmHome2) {
|
|
28662
28922
|
const key = pathKey(folder);
|
|
28663
28923
|
const home = pathKey(nvmHome2);
|
|
28664
28924
|
return key.startsWith(home + "\\") && /^v\d/.test(path22.win32.basename(key));
|
|
28665
28925
|
}
|
|
28926
|
+
function isMsvcToolsDir(folder) {
|
|
28927
|
+
return /\\vc\\tools\\msvc\\[^\\]+\\bin\\host[^\\]+\\[^\\]+$/.test(pathKey(folder));
|
|
28928
|
+
}
|
|
28929
|
+
function isGitUsrBin(folder) {
|
|
28930
|
+
const key = pathKey(folder);
|
|
28931
|
+
return key.endsWith("\\usr\\bin") && /\\git(\\|$)/.test(key);
|
|
28932
|
+
}
|
|
28933
|
+
function msvcBeforeGitUsr(folders) {
|
|
28934
|
+
const firstGit = folders.findIndex(isGitUsrBin);
|
|
28935
|
+
if (firstGit < 0 || !folders.slice(firstGit).some(isMsvcToolsDir)) return [...folders];
|
|
28936
|
+
const late = folders.slice(firstGit).filter(isMsvcToolsDir);
|
|
28937
|
+
return [...folders.slice(0, firstGit), ...late, ...folders.slice(firstGit).filter((f) => !isMsvcToolsDir(f))];
|
|
28938
|
+
}
|
|
28666
28939
|
|
|
28667
28940
|
// src/guest/setup/environment.ts
|
|
28668
28941
|
function addMachineEnvironment(vars, dirs, additive = false) {
|