windows-development-sandbox 1.20.0 → 1.23.1
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/config.example.json +8 -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 +29 -1
- package/dist/app/features/accounts/accounts.def.js +10 -4
- package/dist/app/features/accounts/accounts.run.d.ts +1 -0
- package/dist/app/features/accounts/accounts.run.js +7 -2
- package/dist/app/features/accounts/services.def.d.ts +4 -1
- package/dist/app/features/accounts/services.def.js +15 -14
- package/dist/app/features/accounts/services.run.d.ts +1 -0
- package/dist/app/features/accounts/services.run.js +41 -15
- package/dist/app/features/defs.d.ts +39 -2
- 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 +2 -0
- package/dist/app/features/settings/settings-rows.js +1 -1
- package/dist/app/features/settings/settings.def.js +1 -1
- package/dist/app/features/settings/settings.run.js +3 -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 +1 -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 +5 -0
- package/dist/app/kernel/view.d.ts +11 -1
- package/dist/bin/agent-sandbox.js +2 -2
- package/dist/bin/{chunk-DK4NTBUF.js → chunk-7YPEDAJD.js} +172 -48
- package/dist/bin/{chunk-2IMT7ZCT.js → chunk-QFSJX2KW.js} +1 -1
- package/dist/bin/{chunk-Z2P5OGKL.js → chunk-USTRSHIE.js} +2436 -1693
- 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/manifest.d.ts +2 -2
- package/dist/cli/manifest.js +2 -1
- 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/pages/accounts-page.js +1 -1
- package/dist/cli/menu/pages/agents-page.js +8 -2
- package/dist/cli/menu/pages/maintenance-page.d.ts +6 -0
- package/dist/cli/menu/pages/maintenance-page.js +9 -2
- 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 +12 -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/report.js +2 -0
- package/dist/cli/tui/app.d.ts +5 -0
- package/dist/cli/tui/app.js +2 -0
- package/dist/core/config/defaults.js +3 -1
- package/dist/core/schema/accounts.d.ts +6 -0
- package/dist/core/schema/accounts.js +13 -11
- package/dist/core/schema/config.d.ts +20 -8
- package/dist/core/schema/config.js +4 -4
- package/dist/core/schema/github.js +1 -1
- 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/vpn.js +1 -1
- package/dist/core/schema/web.js +3 -3
- package/dist/core/types.d.ts +6 -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 +6 -2
- 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-installer.js +1 -1
- 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 +316 -145
- 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/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/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/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 +16 -6
- package/dist/guest/toolchains/native/vcruntime.d.ts +2 -0
- package/dist/guest/toolchains/native/vcruntime.js +10 -2
- package/dist/guest/toolchains/native/visual-studio.d.ts +3 -0
- package/dist/guest/toolchains/native/visual-studio.js +44 -26
- package/dist/guest/toolchains/native/vs-request.d.ts +2 -0
- package/dist/guest/toolchains/native/vs-request.js +2 -0
- package/dist/guest/toolchains/plan.js +19 -8
- 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/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/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 +7 -1
- package/dist/host/accounts/leases.js +13 -2
- package/dist/host/accounts/source.d.ts +7 -1
- package/dist/host/accounts/source.js +27 -0
- package/dist/host/accounts/sources.js +4 -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 +4 -0
- package/dist/host/launch/toolchains.d.ts +2 -1
- package/dist/host/launch/toolchains.js +5 -3
- package/dist/host/profile/claude-login.d.ts +2 -2
- package/dist/host/profile/claude-login.js +4 -3
- package/dist/host/vpn/nordvpn.d.ts +2 -4
- package/dist/host/vpn/nordvpn.js +2 -24
- package/dist/runtime/agent.js +405 -90
- package/dist/runtime/daemon.js +3010 -1383
- package/dist/runtime/db.js +333 -90
- package/dist/runtime/main.js +4720 -1954
- package/dist/runtime/netproxy.js +286 -69
- package/dist/runtime/tool.js +2852 -1780
- package/dist/runtime/view.js +286 -69
- package/dist/selftest/accounts.test.js +1 -1
- package/dist/selftest/agent-paths.test.js +39 -1
- package/dist/selftest/agent-settings.test.js +6 -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 +5 -2
- 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/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 +8 -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/persisted-installs.test.js +6 -3
- package/dist/selftest/service-accounts.test.js +3 -2
- package/dist/selftest/support/engine-golden.js +27 -0
- package/dist/selftest/support/fixtures.d.ts +6 -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/shared/accounts/anthropic.d.ts +1 -1
- package/dist/shared/accounts/anthropic.js +9 -8
- package/dist/shared/accounts/index.d.ts +2 -0
- package/dist/shared/accounts/index.js +2 -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 +21 -3
- package/dist/shared/channel/schema.js +7 -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/readiness.d.ts +2 -2
- package/dist/shared/readiness.js +2 -2
- package/dist/web/index.html +1 -1
- package/dist/web/{main-OUUQYNK4.js → main-CCILLX2M.js} +67 -67
- package/native/csharp/HcsHost/AssemblyInfo.cs +3 -3
- package/native/csharp/HostTools/AssemblyInfo.cs +3 -3
- package/native/csharp/StorageHelper/AssemblyInfo.cs +3 -3
- 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/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 +56 -27
- package/schemas/sandbox-config.schema.json +37 -14
package/dist/runtime/view.js
CHANGED
|
@@ -26030,15 +26030,17 @@ var SecretsSchema = external_exports.strictObject({
|
|
|
26030
26030
|
)
|
|
26031
26031
|
});
|
|
26032
26032
|
var AttachSchema = external_exports.strictObject({
|
|
26033
|
-
enabled: external_exports.boolean().describe(
|
|
26033
|
+
enabled: external_exports.boolean().describe(
|
|
26034
|
+
"Allow attaching this PC's terminal to a session (the terminal option when starting an agent, and attach)."
|
|
26035
|
+
),
|
|
26034
26036
|
reuseSession: external_exports.boolean().describe(
|
|
26035
|
-
"
|
|
26037
|
+
"Starting an agent with a terminal in a running sandbox reattaches to this folder's session when no terminal on this PC is attached to it (starting a new session on purpose always starts another)."
|
|
26036
26038
|
),
|
|
26037
26039
|
auto: external_exports.boolean().describe(
|
|
26038
26040
|
"Starting an agent attaches this terminal automatically, as if you passed -t (only in an interactive terminal)."
|
|
26039
26041
|
),
|
|
26040
26042
|
autoHide: external_exports.boolean().describe(
|
|
26041
|
-
"Hide the Windows Sandbox window whenever this terminal attaches; it keeps running (
|
|
26043
|
+
"Hide the Windows Sandbox window whenever this terminal attaches; it keeps running (Sandbox > Status shows it again)."
|
|
26042
26044
|
),
|
|
26043
26045
|
confirmCtrlC: external_exports.boolean().describe(
|
|
26044
26046
|
'In an attached terminal and the sandbox window, a single Ctrl+C is held back (the title says so) and only a second one within 1.5 seconds reaches the agent: a Ctrl+C meant as "copy" no longer stops it. Esc still stops an agent.'
|
|
@@ -26055,7 +26057,7 @@ var ClaudeProfileSchema = external_exports.strictObject({
|
|
|
26055
26057
|
hostDir: external_exports.string().describe('Your Claude folder, or "auto" (~/.claude or CLAUDE_CONFIG_DIR).'),
|
|
26056
26058
|
include: external_exports.array(external_exports.string().regex(/^[A-Za-z0-9._-]+$/)).describe("Files and folders copied from it."),
|
|
26057
26059
|
globalStateFile: external_exports.string().describe('Your .claude.json, or "auto". Empty string = do not copy.'),
|
|
26058
|
-
copyCredentials: external_exports.boolean().describe("Copy your Claude LOGIN into the sandbox. Prefer
|
|
26060
|
+
copyCredentials: external_exports.boolean().describe("Copy your Claude LOGIN into the sandbox. Prefer saving the login in Accounts instead."),
|
|
26059
26061
|
overwrite: external_exports.boolean().describe("Refresh these settings from this PC on every launch."),
|
|
26060
26062
|
sharePluginsAcrossAccounts: external_exports.boolean().describe(
|
|
26061
26063
|
"When you switch Claude accounts, copy your Claude plugins (and which ones are enabled) into a data set that has none yet. Off by default: plugins are code that runs in your sessions."
|
|
@@ -26084,7 +26086,7 @@ var MappingSchema = external_exports.strictObject({
|
|
|
26084
26086
|
});
|
|
26085
26087
|
var SandboxSchema = external_exports.strictObject({
|
|
26086
26088
|
engine: external_exports.enum(["windows-sandbox", "hcs"]).describe(
|
|
26087
|
-
'(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 (
|
|
26089
|
+
'(alpha) What runs the sandbox. "windows-sandbox" = Windows Sandbox (the default: desktop, Windows Terminal, GPU, clipboard, audio, printers). "hcs" = a headless Hyper-V isolated Server Core container for agents (no desktop, GPU or clipboard); it needs Windows features and an image on this PC (Maintenance > Engine lists what is missing), and starting it is not enabled yet in this alpha. Maintenance > Engine shows what each engine can do. Yours only: a project file (.sandbox-config.json) cannot set it.'
|
|
26088
26090
|
),
|
|
26089
26091
|
memoryMb: external_exports.union([external_exports.literal("auto"), external_exports.number().int().min(2048)]).describe(
|
|
26090
26092
|
'Sandbox RAM in MB (>= 2048), or "auto": free RAM minus reserveHostMb, capped at maxMemoryMb. Never more than this PC can keep in RAM for it (its RAM minus the larger of reserveHostMb and 25 %, 4 GB more with vGPU): a bigger value is lowered.'
|
|
@@ -26111,7 +26113,7 @@ var SandboxSchema = external_exports.strictObject({
|
|
|
26111
26113
|
),
|
|
26112
26114
|
networking: external_exports.boolean().describe("Internet access. false is the only hard network isolation Windows Sandbox offers."),
|
|
26113
26115
|
clipboard: external_exports.boolean().describe(
|
|
26114
|
-
"Shared clipboard between this PC and the sandbox. Also lets an agent's copy (in
|
|
26116
|
+
"Shared clipboard between this PC and the sandbox. Also lets an agent's copy (in an attached terminal) reach this PC's clipboard."
|
|
26115
26117
|
),
|
|
26116
26118
|
audioInput: external_exports.boolean().describe("Microphone access."),
|
|
26117
26119
|
videoInput: external_exports.boolean().describe("Camera access."),
|
|
@@ -26162,7 +26164,7 @@ var NetworkSchema = external_exports.strictObject({
|
|
|
26162
26164
|
});
|
|
26163
26165
|
var AuditSchema = external_exports.strictObject({
|
|
26164
26166
|
enabled: external_exports.boolean().describe(
|
|
26165
|
-
"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
|
|
26167
|
+
"Keep an audit log on this PC of what your agents did: programs started (with their command lines, secrets hidden), files changed in the projects, git commits, sessions, and what the repo guard caught, each linked to the agent session that did it where that can be known. The sandbox cannot change it. Read it on the Activity page."
|
|
26166
26168
|
),
|
|
26167
26169
|
days: external_exports.number().int().min(1).max(365).describe(
|
|
26168
26170
|
"Days the audit log is kept (1 to 30; a larger number keeps 30); older days are deleted when a sandbox starts and once a day."
|
|
@@ -26506,6 +26508,114 @@ var ToolchainsSchema = external_exports.strictObject({
|
|
|
26506
26508
|
)
|
|
26507
26509
|
});
|
|
26508
26510
|
|
|
26511
|
+
// src/shared/apps/catalogue-agents-web.ts
|
|
26512
|
+
var PERPLEXITY_MCP_VERSION = "1.3.0";
|
|
26513
|
+
var COMET_MCP_VERSION = "2.3.0";
|
|
26514
|
+
var CHROME_DEVTOOLS_MCP_VERSION = "1.12.0";
|
|
26515
|
+
var BROWSER_USE_VERSION = "0.13.14";
|
|
26516
|
+
var PERPLEXITY_COMPUTER_MCP_URL = "https://www.perplexity.ai/rest/computer/mcp";
|
|
26517
|
+
var COMET_SIGNER = {
|
|
26518
|
+
subject: ['^CN="?PERPLEXITY AI, INC\\.?"?(,|$)', '(^|, )O="?PERPLEXITY AI, INC\\.?"?(,|$)'],
|
|
26519
|
+
issuer: ["^CN=GlobalSign GCC R45 EV CodeSigning CA 2020(,|$)"]
|
|
26520
|
+
};
|
|
26521
|
+
var EDGE_EXE = "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe";
|
|
26522
|
+
var AGENTS_WEB_APPS = [
|
|
26523
|
+
{
|
|
26524
|
+
id: "perplexity-mcp",
|
|
26525
|
+
name: "Perplexity MCP (API)",
|
|
26526
|
+
category: "agents",
|
|
26527
|
+
about: "Web search, answers and deep research from Perplexity's API in Claude Code and Codex (perplexity_search, perplexity_ask, perplexity_research, perplexity_reason): Perplexity's own @perplexity-ai/mcp-server. Needs your Perplexity API key in Accounts; API use is billed separately from Perplexity Pro.",
|
|
26528
|
+
size: "30 MB",
|
|
26529
|
+
source: { locked: "npm", package: "@perplexity-ai/mcp-server", version: PERPLEXITY_MCP_VERSION },
|
|
26530
|
+
exe: "perplexity-mcp.cmd",
|
|
26531
|
+
service: true,
|
|
26532
|
+
mcp: {
|
|
26533
|
+
name: "sbx-perplexity",
|
|
26534
|
+
script: "node_modules/@perplexity-ai/mcp-server/dist/index.js",
|
|
26535
|
+
envVars: ["PERPLEXITY_API_KEY"],
|
|
26536
|
+
codex: true
|
|
26537
|
+
},
|
|
26538
|
+
plugsInto: "Claude Code and Codex as the MCP server sbx-perplexity; the key comes from Accounts as PERPLEXITY_API_KEY, never from a file",
|
|
26539
|
+
userOnly: true
|
|
26540
|
+
},
|
|
26541
|
+
{
|
|
26542
|
+
id: "perplexity-computer-mcp",
|
|
26543
|
+
name: "Perplexity Computer MCP",
|
|
26544
|
+
category: "agents",
|
|
26545
|
+
about: "Hands tasks to Perplexity Computer, Perplexity's cloud agent (it browses and works in its own cloud computer), from Claude Code and Codex: Perplexity's official remote MCP server. Nothing is installed. Sign in with your Perplexity account the first time (Claude Code: /mcp; Codex: codex mcp login sbx-perplexity-computer); tasks spend your Computer credits.",
|
|
26546
|
+
size: "0 MB",
|
|
26547
|
+
source: { remote: true },
|
|
26548
|
+
exe: "",
|
|
26549
|
+
service: true,
|
|
26550
|
+
mcp: { name: "sbx-perplexity-computer", url: PERPLEXITY_COMPUTER_MCP_URL, codex: true },
|
|
26551
|
+
plugsInto: "Claude Code and Codex as the remote MCP server sbx-perplexity-computer; its sign-in is kept with your agent login",
|
|
26552
|
+
userOnly: true
|
|
26553
|
+
},
|
|
26554
|
+
{
|
|
26555
|
+
id: "comet",
|
|
26556
|
+
name: "Comet (Perplexity browser)",
|
|
26557
|
+
category: "browsers",
|
|
26558
|
+
about: "Perplexity's agentic browser (Chromium), unpacked to run portable with its own profile on the sandbox's disk. With accounts.comet.share on, your perplexity.ai sign-in is kept for the next sandboxes. Its assistant acts on the pages it reads, so a page can try to steer it: browse only what you would let it act on.",
|
|
26559
|
+
size: "600 MB",
|
|
26560
|
+
source: { resolve: "comet" },
|
|
26561
|
+
unpack: "chromium",
|
|
26562
|
+
exe: "comet.exe",
|
|
26563
|
+
needs: ["7zip"],
|
|
26564
|
+
signer: COMET_SIGNER,
|
|
26565
|
+
userOnly: true
|
|
26566
|
+
},
|
|
26567
|
+
{
|
|
26568
|
+
id: "comet-mcp",
|
|
26569
|
+
name: "Comet MCP",
|
|
26570
|
+
category: "agents",
|
|
26571
|
+
about: "Lets Claude Code and Codex hand web tasks to Comet's own assistant and read its answers (hanzili/comet-mcp). Needs the Comet app: start Comet from its shortcut first, so the agent uses the sandbox's Comet profile and your sign-in.",
|
|
26572
|
+
size: "15 MB",
|
|
26573
|
+
source: { locked: "npm", package: "comet-mcp", version: COMET_MCP_VERSION },
|
|
26574
|
+
exe: "comet-mcp.cmd",
|
|
26575
|
+
service: true,
|
|
26576
|
+
mcp: { name: "sbx-comet", script: "node_modules/comet-mcp/dist/index.js", codex: true },
|
|
26577
|
+
plugsInto: "Claude Code and Codex as the MCP server sbx-comet, talking to Comet's DevTools on 127.0.0.1:9222",
|
|
26578
|
+
userOnly: true
|
|
26579
|
+
},
|
|
26580
|
+
{
|
|
26581
|
+
id: "chrome-devtools-mcp",
|
|
26582
|
+
name: "Chrome DevTools MCP",
|
|
26583
|
+
category: "agents",
|
|
26584
|
+
about: "Lets Claude Code and Codex drive and inspect a browser with DevTools: navigate, click, read the console and network, record performance traces (ChromeDevTools/chrome-devtools-mcp). It starts Microsoft Edge with a throwaway profile; Google's usage statistics and CrUX lookups are off.",
|
|
26585
|
+
size: "40 MB",
|
|
26586
|
+
source: { locked: "npm", package: "chrome-devtools-mcp", version: CHROME_DEVTOOLS_MCP_VERSION },
|
|
26587
|
+
exe: "chrome-devtools-mcp.cmd",
|
|
26588
|
+
service: true,
|
|
26589
|
+
mcp: {
|
|
26590
|
+
name: "sbx-chrome-devtools",
|
|
26591
|
+
script: "node_modules/chrome-devtools-mcp/build/src/bin/chrome-devtools-mcp.js",
|
|
26592
|
+
args: ["--executablePath", EDGE_EXE, "--isolated", "--no-usage-statistics", "--no-performance-crux"],
|
|
26593
|
+
codex: true
|
|
26594
|
+
},
|
|
26595
|
+
plugsInto: "Claude Code and Codex as the MCP server sbx-chrome-devtools (with Edge)",
|
|
26596
|
+
userOnly: true
|
|
26597
|
+
},
|
|
26598
|
+
{
|
|
26599
|
+
id: "browser-use-mcp",
|
|
26600
|
+
name: "Browser Use MCP",
|
|
26601
|
+
category: "agents",
|
|
26602
|
+
about: "Browser automation for agents from Browser Use (browser-use --mcp): open pages, click, type, read them, and hand a whole task to Browser Use's own agent (that one needs an OpenAI or Anthropic API key). It finds Edge in the sandbox; its telemetry is off.",
|
|
26603
|
+
size: "250 MB",
|
|
26604
|
+
source: { locked: "uv", package: "browser-use", version: BROWSER_USE_VERSION },
|
|
26605
|
+
exe: "browser-use.exe",
|
|
26606
|
+
service: true,
|
|
26607
|
+
mcp: {
|
|
26608
|
+
name: "sbx-browser-use",
|
|
26609
|
+
program: true,
|
|
26610
|
+
args: ["--mcp"],
|
|
26611
|
+
env: { ANONYMIZED_TELEMETRY: "false" },
|
|
26612
|
+
codex: true
|
|
26613
|
+
},
|
|
26614
|
+
plugsInto: "Claude Code and Codex as the MCP server sbx-browser-use",
|
|
26615
|
+
userOnly: true
|
|
26616
|
+
}
|
|
26617
|
+
];
|
|
26618
|
+
|
|
26509
26619
|
// src/shared/apps/catalogue-gamedev.ts
|
|
26510
26620
|
var GAMEDEV_APPS = [];
|
|
26511
26621
|
|
|
@@ -26513,7 +26623,38 @@ var GAMEDEV_APPS = [];
|
|
|
26513
26623
|
var MOBILE_APPS = [];
|
|
26514
26624
|
|
|
26515
26625
|
// src/shared/apps/catalogue-modding.ts
|
|
26516
|
-
var MODDING_APPS = [
|
|
26626
|
+
var MODDING_APPS = [
|
|
26627
|
+
{
|
|
26628
|
+
id: "lua-language-server",
|
|
26629
|
+
name: "Lua Language Server",
|
|
26630
|
+
category: "cli",
|
|
26631
|
+
about: "The Lua language server (LuaLS): completion, diagnostics and go-to-definition for Lua in editors and agents that speak LSP. FiveM resources use Lua 5.4 (lua54 in fxmanifest.lua).",
|
|
26632
|
+
size: "15 MB",
|
|
26633
|
+
source: { github: "LuaLS/lua-language-server", asset: "^lua-language-server-[\\d.]+-win32-x64\\.zip$" },
|
|
26634
|
+
exe: "lua-language-server.exe",
|
|
26635
|
+
cli: true
|
|
26636
|
+
},
|
|
26637
|
+
{
|
|
26638
|
+
id: "stylua",
|
|
26639
|
+
name: "StyLua",
|
|
26640
|
+
category: "cli",
|
|
26641
|
+
about: "An opinionated Lua formatter (`stylua .`), configured with a stylua.toml in the project.",
|
|
26642
|
+
size: "6 MB",
|
|
26643
|
+
source: { github: "JohnnyMorganz/StyLua", asset: "^stylua-windows-x86_64\\.zip$" },
|
|
26644
|
+
exe: "stylua.exe",
|
|
26645
|
+
cli: true
|
|
26646
|
+
},
|
|
26647
|
+
{
|
|
26648
|
+
id: "selene",
|
|
26649
|
+
name: "selene",
|
|
26650
|
+
category: "cli",
|
|
26651
|
+
about: 'A Lua linter (`selene .`), configured with a selene.toml (std = "lua54", and a standard library file for the FiveM / RedM globals).',
|
|
26652
|
+
size: "7 MB",
|
|
26653
|
+
source: { github: "Kampfkarren/selene", asset: "^selene-[\\d.]+-windows\\.zip$" },
|
|
26654
|
+
exe: "selene.exe",
|
|
26655
|
+
cli: true
|
|
26656
|
+
}
|
|
26657
|
+
];
|
|
26517
26658
|
|
|
26518
26659
|
// src/shared/apps/catalogue.ts
|
|
26519
26660
|
var gh = (github, asset) => ({ github, asset });
|
|
@@ -27347,7 +27488,7 @@ var CORE_APPS = [
|
|
|
27347
27488
|
cli: true
|
|
27348
27489
|
}
|
|
27349
27490
|
];
|
|
27350
|
-
var APPS = [...CORE_APPS, ...GAMEDEV_APPS, ...MODDING_APPS, ...MOBILE_APPS];
|
|
27491
|
+
var APPS = [...CORE_APPS, ...GAMEDEV_APPS, ...MODDING_APPS, ...MOBILE_APPS, ...AGENTS_WEB_APPS];
|
|
27351
27492
|
|
|
27352
27493
|
// src/core/schema/apps.ts
|
|
27353
27494
|
var CATALOGUE_IDS = APPS.filter((a) => !a.setting).map((a) => a.id);
|
|
@@ -27417,7 +27558,7 @@ var ProjectsSchema = external_exports.strictObject({
|
|
|
27417
27558
|
var RESUME_SESSIONS = ["ask", "always", "afterCrash", "never"];
|
|
27418
27559
|
var ResumeSchema = external_exports.strictObject({
|
|
27419
27560
|
sessions: external_exports.enum(RESUME_SESSIONS).describe(
|
|
27420
|
-
'When a sandbox starts after one that had agent sessions: "ask" lists them and asks whether to reopen them (without a terminal it
|
|
27561
|
+
'When a sandbox starts after one that had agent sessions: "ask" lists them and asks whether to reopen them (without a terminal it only says they can be reopened), "always" reopens them, "afterCrash" reopens them only when the last sandbox ended unexpectedly, "never" leaves it to you (Sessions reopens them). Terminal tabs you opened yourself in the sandbox are never reopened.'
|
|
27421
27562
|
),
|
|
27422
27563
|
restartAfterCrash: external_exports.boolean().describe(
|
|
27423
27564
|
"When the sandbox ends because Windows Sandbox crashed or ran out of memory, start it again by itself and reopen its sessions (at most 3 times in 6 hours)."
|
|
@@ -27436,14 +27577,14 @@ var RemoteUserSchema = external_exports.strictObject({
|
|
|
27436
27577
|
});
|
|
27437
27578
|
var WebLanSchema = external_exports.strictObject({
|
|
27438
27579
|
enabled: external_exports.boolean().describe(
|
|
27439
|
-
"(Beta) Devices on your network (a phone): an HTTPS address on this PC for devices you pair with a one-time code (
|
|
27580
|
+
"(Beta) Devices on your network (a phone): an HTTPS address on this PC for devices you pair with a one-time code (Remote access). Needs a firewall rule (turning it on asks Windows once). Off: every paired device is signed out."
|
|
27440
27581
|
),
|
|
27441
27582
|
port: external_exports.number().int().min(1024).max(65535).describe("HTTPS port for paired devices on your network."),
|
|
27442
27583
|
address: external_exports.string().trim().max(15).regex(/^$|^\d{1,3}(\.\d{1,3}){3}$/, "an IPv4 address or empty").describe("This PC's private address to listen on. Empty: the one of its network adapter (never a public one).")
|
|
27443
27584
|
});
|
|
27444
27585
|
var WebRemoteSchema = external_exports.strictObject({
|
|
27445
27586
|
windowsSignIn: external_exports.boolean().describe(
|
|
27446
|
-
"(Beta) Other Windows users of this PC named in web.remote.users sign in to your web UI (and
|
|
27587
|
+
"(Beta) Other Windows users of this PC named in web.remote.users sign in to your web UI (and the remote menu) with their own Windows account: no password, no link."
|
|
27447
27588
|
),
|
|
27448
27589
|
users: external_exports.array(RemoteUserSchema).max(32).describe("Who else may sign in with Windows, and their role (view or control)."),
|
|
27449
27590
|
rememberDays: external_exports.number().int().min(1).max(90).describe(
|
|
@@ -27453,7 +27594,7 @@ var WebRemoteSchema = external_exports.strictObject({
|
|
|
27453
27594
|
});
|
|
27454
27595
|
var WebSchema = external_exports.strictObject({
|
|
27455
27596
|
enabled: external_exports.boolean().describe(
|
|
27456
|
-
"(Beta) The web UI: your
|
|
27597
|
+
"(Beta) The web UI: your sessions in a browser on this PC (http://127.0.0.1:<port>, this PC only). On: every start of a sandbox also starts it in the background (it keeps running until you stop it in Maintenance > Web UI or restart the PC). Off: it runs only when you start it there. Open it signed in from the same page."
|
|
27457
27598
|
),
|
|
27458
27599
|
port: external_exports.number().int().min(1024).max(65535).describe("Port of the web UI on 127.0.0.1 (this PC only). Pick another when it is taken."),
|
|
27459
27600
|
openOnLaunch: external_exports.boolean().describe("(Beta) With the web UI on: open it in your browser, already signed in, every time a sandbox starts."),
|
|
@@ -27464,7 +27605,7 @@ var WebSchema = external_exports.strictObject({
|
|
|
27464
27605
|
var VPN_PROVIDERS = ["nordvpn", "openvpn-file", "wireguard-file"];
|
|
27465
27606
|
var VpnSchema = external_exports.strictObject({
|
|
27466
27607
|
enabled: external_exports.boolean().describe(
|
|
27467
|
-
"(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 (
|
|
27608
|
+
"(Alpha: not yet tried on a real PC) Send the sandbox's traffic through a VPN. Only the sandbox: your PC's own connection is untouched. Needs a saved login first (Settings > Network > VPN). The agent in the sandbox can read that login and can turn the tunnel off (it is the administrator there)."
|
|
27468
27609
|
),
|
|
27469
27610
|
provider: external_exports.enum(VPN_PROVIDERS).describe(
|
|
27470
27611
|
"nordvpn: a recommended NordVPN server is picked at every launch. openvpn-file: your own .ovpn file (configFile). wireguard-file: your own WireGuard .conf (configFile), e.g. from your company."
|
|
@@ -27482,13 +27623,14 @@ var VpnSchema = external_exports.strictObject({
|
|
|
27482
27623
|
// src/core/schema/github.ts
|
|
27483
27624
|
var GithubSchema = external_exports.strictObject({
|
|
27484
27625
|
shareToken: external_exports.boolean().describe(
|
|
27485
|
-
'Give each sandbox the GitHub token you saved
|
|
27626
|
+
'Give each sandbox the GitHub token you saved in Accounts (best a fine-grained token limited to some repositories and permissions), so gh and https git work there without logging in. Only with provisioning.git.access "full". The agent in the sandbox can read the token and use it for whatever it allows. A project file (.sandbox-config.json) cannot turn this on.'
|
|
27486
27627
|
)
|
|
27487
27628
|
});
|
|
27488
27629
|
|
|
27489
27630
|
// src/shared/accounts/kinds.ts
|
|
27490
27631
|
var AGENT_CAN_USE = "The agent in the sandbox can use this sign-in while it is there.";
|
|
27491
27632
|
var ONE_PLACE = "It works in one sandbox at a time: a second sandbox starts without it while the first one runs.";
|
|
27633
|
+
var PERPLEXITY_KEY_PATTERN = /^pplx-[A-Za-z0-9_-]{8,200}$/;
|
|
27492
27634
|
var SERVICE_SPECS = {
|
|
27493
27635
|
epic: {
|
|
27494
27636
|
kind: "epic",
|
|
@@ -27542,19 +27684,28 @@ var SERVICE_SPECS = {
|
|
|
27542
27684
|
kind: "cfx",
|
|
27543
27685
|
label: "Cfx.re (FiveM / RedM server key)",
|
|
27544
27686
|
usedBy: ["fivem"],
|
|
27545
|
-
sources: ["typed"],
|
|
27687
|
+
sources: ["typed", "file"],
|
|
27546
27688
|
singleHolder: false,
|
|
27547
27689
|
returns: false,
|
|
27690
|
+
// `import cfx --from` reads a whole server.cfg (they often run to tens of KB); the payload itself is tiny.
|
|
27548
27691
|
maxBytes: 4 * 1024,
|
|
27692
|
+
maxFileBytes: 256 * 1024,
|
|
27549
27693
|
warnings: [AGENT_CAN_USE + " Anyone with the key can run a server under your Cfx.re account."],
|
|
27550
27694
|
fields: [
|
|
27551
|
-
{
|
|
27695
|
+
{
|
|
27696
|
+
name: "licenseKey",
|
|
27697
|
+
label: "Server licence key (cfxk_...)",
|
|
27698
|
+
secret: true,
|
|
27699
|
+
pattern: /^cfxk_[A-Za-z0-9_]+$/,
|
|
27700
|
+
only: "typed"
|
|
27701
|
+
},
|
|
27552
27702
|
{
|
|
27553
27703
|
name: "steamWebApiKey",
|
|
27554
27704
|
label: "Steam Web API key (optional)",
|
|
27555
27705
|
secret: true,
|
|
27556
27706
|
optional: true,
|
|
27557
|
-
pattern: /^[A-F0-9]{32}
|
|
27707
|
+
pattern: /^[A-F0-9]{32}$/,
|
|
27708
|
+
only: "typed"
|
|
27558
27709
|
}
|
|
27559
27710
|
]
|
|
27560
27711
|
},
|
|
@@ -27608,33 +27759,77 @@ var SERVICE_SPECS = {
|
|
|
27608
27759
|
{ name: "issuerId", label: "Issuer ID", secret: false },
|
|
27609
27760
|
{ name: "keyId", label: "Key ID", secret: false, pattern: /^[A-Z0-9]{10}$/ }
|
|
27610
27761
|
]
|
|
27762
|
+
},
|
|
27763
|
+
perplexity: {
|
|
27764
|
+
kind: "perplexity",
|
|
27765
|
+
label: "Perplexity API key",
|
|
27766
|
+
usedBy: ["perplexity"],
|
|
27767
|
+
sources: ["pc", "file", "typed"],
|
|
27768
|
+
singleHolder: false,
|
|
27769
|
+
returns: false,
|
|
27770
|
+
maxBytes: 1024,
|
|
27771
|
+
maxFileBytes: 64 * 1024,
|
|
27772
|
+
warnings: [
|
|
27773
|
+
AGENT_CAN_USE + " It can read the key and spend your API credit: use a separate API key with a spending limit.",
|
|
27774
|
+
"Perplexity Pro does not include API use; the API key is billed separately.",
|
|
27775
|
+
"Only the variable PERPLEXITY_API_KEY of the agent gets it: nothing in the sandbox writes it to a file."
|
|
27776
|
+
],
|
|
27777
|
+
fields: [
|
|
27778
|
+
{
|
|
27779
|
+
name: "apiKey",
|
|
27780
|
+
label: "Perplexity API key (pplx-...)",
|
|
27781
|
+
secret: true,
|
|
27782
|
+
pattern: PERPLEXITY_KEY_PATTERN,
|
|
27783
|
+
only: "typed"
|
|
27784
|
+
}
|
|
27785
|
+
]
|
|
27786
|
+
},
|
|
27787
|
+
comet: {
|
|
27788
|
+
kind: "comet",
|
|
27789
|
+
label: "Comet (Perplexity browser)",
|
|
27790
|
+
usedBy: ["comet"],
|
|
27791
|
+
sources: ["sandbox"],
|
|
27792
|
+
singleHolder: false,
|
|
27793
|
+
returns: true,
|
|
27794
|
+
maxBytes: 256 * 1024,
|
|
27795
|
+
warnings: [
|
|
27796
|
+
AGENT_CAN_USE + " It can act as you in Comet and spend your Perplexity Computer credits; agentic browsing is open to prompt injection from the pages it reads.",
|
|
27797
|
+
"Your Comet sign-in can't be copied from this PC: Windows locks it to your PC account. Sign in once inside a sandbox and it is kept for the next ones.",
|
|
27798
|
+
"Only the perplexity.ai sign-in cookies are kept: never saved passwords, other sites, localStorage or history. Never import your main browser profile.",
|
|
27799
|
+
"Several sandboxes can use it at once: the sign-in the last one hands back is kept."
|
|
27800
|
+
],
|
|
27801
|
+
fields: []
|
|
27611
27802
|
}
|
|
27612
27803
|
};
|
|
27804
|
+
var APP_USER_TEXT = {
|
|
27805
|
+
perplexity: "the Perplexity MCP app",
|
|
27806
|
+
comet: "the Comet app"
|
|
27807
|
+
};
|
|
27808
|
+
function usedByText(usedBy) {
|
|
27809
|
+
return usedBy.map((u) => u in APP_USER_TEXT ? APP_USER_TEXT[u] : u).join(" or ");
|
|
27810
|
+
}
|
|
27613
27811
|
|
|
27614
27812
|
// src/core/schema/accounts.ts
|
|
27615
27813
|
function share(kind, how) {
|
|
27616
27814
|
const spec = SERVICE_SPECS[kind];
|
|
27617
27815
|
return external_exports.strictObject({
|
|
27618
27816
|
share: external_exports.boolean().describe(
|
|
27619
|
-
"Hand your saved " + spec.label + " sign-in to sandboxes that use " + spec.usedBy
|
|
27817
|
+
"Hand your saved " + spec.label + " sign-in to sandboxes that use " + usedByText(spec.usedBy) + " (" + how + "). Kept encrypted on this PC; " + spec.warnings.join(" ") + " Yours only: a project file can only turn it off."
|
|
27620
27818
|
)
|
|
27621
27819
|
});
|
|
27622
27820
|
}
|
|
27623
27821
|
var AccountsSchema = external_exports.strictObject({
|
|
27624
|
-
epic: share("epic", "sign in to the launcher once in a sandbox, or take this PC's
|
|
27625
|
-
steam: share(
|
|
27626
|
-
|
|
27627
|
-
|
|
27628
|
-
),
|
|
27629
|
-
|
|
27630
|
-
|
|
27631
|
-
|
|
27632
|
-
|
|
27633
|
-
|
|
27634
|
-
|
|
27635
|
-
}).describe(
|
|
27636
|
-
"Service sign-ins for sandboxes (game stores, engines, app signing). Manage them in Accounts: sandbox account status."
|
|
27637
|
-
);
|
|
27822
|
+
epic: share("epic", "sign in to the launcher once in a sandbox, or take this PC's from Accounts"),
|
|
27823
|
+
steam: share("steam", "sign in once with sbx-steam login, or take it from a SteamCMD folder in Accounts"),
|
|
27824
|
+
unity: share("unity", "sign in once in a sandbox, or take this PC's licence from Accounts"),
|
|
27825
|
+
cfx: share("cfx", "type the key in Accounts"),
|
|
27826
|
+
keystore: share("keystore", "import the upload.jks file in Accounts"),
|
|
27827
|
+
play: share("play", "import the service-account.json file in Accounts"),
|
|
27828
|
+
expo: share("expo", "type the token in Accounts"),
|
|
27829
|
+
appstore: share("appstore", "import the AuthKey.p8 file in Accounts"),
|
|
27830
|
+
perplexity: share("perplexity", "type the API key in Accounts, or import it from a .env file"),
|
|
27831
|
+
comet: share("comet", "sign in to Comet once in a sandbox: it cannot be taken from this PC")
|
|
27832
|
+
}).describe("Service sign-ins for sandboxes (game stores, engines, app signing, Perplexity). Manage them in Accounts.");
|
|
27638
27833
|
|
|
27639
27834
|
// src/core/schema/pc-installs.ts
|
|
27640
27835
|
var pick2 = (item, what, example) => external_exports.union([external_exports.boolean(), external_exports.array(item)]).describe(
|
|
@@ -27698,7 +27893,9 @@ function reservedEnvName(name) {
|
|
|
27698
27893
|
}
|
|
27699
27894
|
var ConfigSchema = external_exports.strictObject({
|
|
27700
27895
|
$schema: SchemaRefSchema.optional(),
|
|
27701
|
-
defaultHarness: NameSchema.describe(
|
|
27896
|
+
defaultHarness: NameSchema.describe(
|
|
27897
|
+
"The agent that starts when you do not name one (starting claude by name always runs claude)."
|
|
27898
|
+
),
|
|
27702
27899
|
guestWorkspace: GuestWorkspaceSchema,
|
|
27703
27900
|
readOnly: external_exports.boolean().describe("Map the workspace read-only."),
|
|
27704
27901
|
workspaceFilter: WorkspaceFilterSchema,
|
|
@@ -27708,7 +27905,7 @@ var ConfigSchema = external_exports.strictObject({
|
|
|
27708
27905
|
sharing: SharingSchema,
|
|
27709
27906
|
storage: external_exports.strictObject({
|
|
27710
27907
|
root: external_exports.string().min(1).describe(
|
|
27711
|
-
"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.
|
|
27908
|
+
"Where everything is kept on this PC (tools, databases, logins, launches). The default is a private folder for you under %ProgramData%\\AgentSandbox\\users, which works for installs for one user and for everyone. Maintenance > Storage moves it."
|
|
27712
27909
|
),
|
|
27713
27910
|
persistAgentState: external_exports.boolean().describe("Keep agent logins and history between sandboxes."),
|
|
27714
27911
|
dataName: NameSchema.describe("Name of the persistent data set (C:\\AgentData) shared by all workspaces."),
|
|
@@ -27716,11 +27913,11 @@ var ConfigSchema = external_exports.strictObject({
|
|
|
27716
27913
|
`Programs and scripts (.exe, .ps1, .bat, .cmd, .msi, .lnk ...) that appear or change in your project while a sandbox runs get Windows' "downloaded from the internet" mark, so SmartScreen and PowerShell ask before they run on this PC.`
|
|
27717
27914
|
),
|
|
27718
27915
|
contained: external_exports.enum(["off", "vhdx"]).describe(
|
|
27719
|
-
'(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
|
|
27916
|
+
'(beta) Keep the sandbox tools, state and logs inside one disk image file (vhdx) instead of loose folders, so scanning programs on this PC see one file. Not yet tried on a real PC. Turn it on in Maintenance > Storage (it moves your files and asks first); Windows asks for permission to mount the image when a sandbox starts. "off" = loose folders, as always. Yours only: a project file (.sandbox-config.json) cannot set it.'
|
|
27720
27917
|
),
|
|
27721
27918
|
containedMaxGb: external_exports.number().int().min(8).max(4096).describe("(beta) Largest size, in GB, the disk image of storage.contained may grow to."),
|
|
27722
27919
|
warnDataGb: external_exports.number().min(0).describe(
|
|
27723
|
-
"Say at launch when the persisted data (tools, databases, logins) is bigger than this many GB; 0 = never.
|
|
27920
|
+
"Say at launch when the persisted data (tools, databases, logins) is bigger than this many GB; 0 = never. Maintenance > Data shows what takes the space."
|
|
27724
27921
|
)
|
|
27725
27922
|
}),
|
|
27726
27923
|
network: NetworkSchema,
|
|
@@ -27827,6 +28024,10 @@ var BootProgressSchema = external_exports.strictObject({
|
|
|
27827
28024
|
done: external_exports.number().int().min(0).max(1e3),
|
|
27828
28025
|
total: external_exports.number().int().min(0).max(1e3)
|
|
27829
28026
|
});
|
|
28027
|
+
var BackgroundWorkSchema = external_exports.strictObject({
|
|
28028
|
+
name: Text(64),
|
|
28029
|
+
state: external_exports.enum(["running", "done", "failed"])
|
|
28030
|
+
});
|
|
27830
28031
|
var SandboxStatusSchema = external_exports.object({
|
|
27831
28032
|
launchId: Text(64),
|
|
27832
28033
|
phase: external_exports.enum(["booting", "provisioning", "ready", "failed"]),
|
|
@@ -27838,7 +28039,9 @@ var SandboxStatusSchema = external_exports.object({
|
|
|
27838
28039
|
/** The sandbox's IPv4 addresses (for network.forwardPorts; the host only uses ones on its Hyper-V network). */
|
|
27839
28040
|
addresses: external_exports.array(external_exports.string().max(45)).max(8).optional(),
|
|
27840
28041
|
/** A malformed progress is dropped, never the status (the phase still counts). */
|
|
27841
|
-
progress: BootProgressSchema.optional().catch(void 0)
|
|
28042
|
+
progress: BootProgressSchema.optional().catch(void 0),
|
|
28043
|
+
/** Installs that continue after the boot is ready; a malformed list is dropped, never the status. */
|
|
28044
|
+
background: external_exports.array(BackgroundWorkSchema).max(16).optional().catch(void 0)
|
|
27842
28045
|
});
|
|
27843
28046
|
var VersionSchema = external_exports.strictObject({ spec: Text(128), source: Text(256) });
|
|
27844
28047
|
var DatabasePlanSchema = external_exports.strictObject({
|
|
@@ -28289,7 +28492,11 @@ function moveIntoPlace(work, destination) {
|
|
|
28289
28492
|
fs6.mkdirSync(path7.dirname(destination), { recursive: true });
|
|
28290
28493
|
fs6.renameSync(work, destination);
|
|
28291
28494
|
}
|
|
28292
|
-
|
|
28495
|
+
var extractLimit = null;
|
|
28496
|
+
function extractArchive(archive, destination, members2 = []) {
|
|
28497
|
+
return extractLimit ? extractLimit.run(() => extract(archive, destination, members2)) : extract(archive, destination, members2);
|
|
28498
|
+
}
|
|
28499
|
+
async function extract(archive, destination, members2) {
|
|
28293
28500
|
fs6.mkdirSync(destination, { recursive: true });
|
|
28294
28501
|
let status = await spawnAsync(SYSTEM.tar(), ["-xf", archive, "-C", destination, ...members2]);
|
|
28295
28502
|
if (status !== 0 && /\.(zip|nupkg)$/i.test(archive)) {
|
|
@@ -28324,6 +28531,8 @@ import { pipeline } from "node:stream/promises";
|
|
|
28324
28531
|
var Downloader = class {
|
|
28325
28532
|
/** downloads.requireChecksum: refuse anything without an expected hash. The guest sets it from session.json. */
|
|
28326
28533
|
requireChecksum = false;
|
|
28534
|
+
/** The guest's net pool: how many HTTP bodies stream at once. Host code leaves it null. */
|
|
28535
|
+
limit = null;
|
|
28327
28536
|
watcher = null;
|
|
28328
28537
|
/** Reports coarse progress of the downloads that start from now on to `watcher` (null: stop). */
|
|
28329
28538
|
watch(watcher) {
|
|
@@ -28341,39 +28550,42 @@ var Downloader = class {
|
|
|
28341
28550
|
"Refusing to download " + path8.basename(destination) + " (" + url2 + "): no checksum is published for it, and downloads.requireChecksum is on. Turn that setting off to allow downloads that cannot be verified."
|
|
28342
28551
|
);
|
|
28343
28552
|
}
|
|
28344
|
-
const response = await fetchRetry(url2, {}, 3, 20 * 60 * 1e3);
|
|
28345
|
-
if (!response.body) throw new Error("Empty response for " + url2);
|
|
28346
28553
|
fs7.mkdirSync(path8.dirname(destination), { recursive: true });
|
|
28347
28554
|
const checks = ["sha256", "sha512", "sha1"].flatMap((kind) => {
|
|
28348
28555
|
const want = sums[kind]?.trim().toLowerCase();
|
|
28349
28556
|
return want ? [{ want, hash: crypto2.createHash(kind) }] : [];
|
|
28350
28557
|
});
|
|
28351
|
-
const
|
|
28352
|
-
const
|
|
28353
|
-
|
|
28354
|
-
|
|
28355
|
-
|
|
28356
|
-
|
|
28357
|
-
|
|
28358
|
-
|
|
28359
|
-
|
|
28360
|
-
|
|
28361
|
-
|
|
28362
|
-
|
|
28363
|
-
|
|
28364
|
-
|
|
28365
|
-
|
|
28366
|
-
|
|
28367
|
-
|
|
28558
|
+
const partial2 = destination + ".part";
|
|
28559
|
+
const transfer = async () => {
|
|
28560
|
+
const response = await fetchRetry(url2, {}, 3, 20 * 60 * 1e3);
|
|
28561
|
+
if (!response.body) throw new Error("Empty response for " + url2);
|
|
28562
|
+
const size = Number(response.headers.get("content-length")) || 0;
|
|
28563
|
+
const report = size > 0 ? this.watcher?.() ?? null : null;
|
|
28564
|
+
let received = 0;
|
|
28565
|
+
let tenth = 0;
|
|
28566
|
+
let reportedAt = Date.now();
|
|
28567
|
+
const tap = new Transform({
|
|
28568
|
+
transform(chunk, _encoding, done) {
|
|
28569
|
+
for (const c of checks) c.hash.update(chunk);
|
|
28570
|
+
if (report) {
|
|
28571
|
+
received += chunk.length;
|
|
28572
|
+
const now = Math.floor(received * 10 / size);
|
|
28573
|
+
if (now !== tenth || Date.now() - reportedAt > 5e3) {
|
|
28574
|
+
tenth = now;
|
|
28575
|
+
reportedAt = Date.now();
|
|
28576
|
+
try {
|
|
28577
|
+
report(Math.min(1, received / size));
|
|
28578
|
+
} catch {
|
|
28579
|
+
}
|
|
28368
28580
|
}
|
|
28369
28581
|
}
|
|
28582
|
+
done(null, chunk);
|
|
28370
28583
|
}
|
|
28371
|
-
|
|
28372
|
-
}
|
|
28373
|
-
});
|
|
28374
|
-
const partial2 = destination + ".part";
|
|
28375
|
-
try {
|
|
28584
|
+
});
|
|
28376
28585
|
await pipeline(Readable.fromWeb(response.body), tap, fs7.createWriteStream(partial2));
|
|
28586
|
+
};
|
|
28587
|
+
try {
|
|
28588
|
+
await (this.limit ? this.limit.run(transfer) : transfer());
|
|
28377
28589
|
if (checks.some((c) => c.hash.digest("hex") !== c.want)) throw new Error("Checksum mismatch for " + url2);
|
|
28378
28590
|
if (sums.verify) await sums.verify(partial2);
|
|
28379
28591
|
fs7.rmSync(destination, { force: true });
|
|
@@ -28390,12 +28602,17 @@ var Downloader = class {
|
|
|
28390
28602
|
const work = stagingFolder(destination);
|
|
28391
28603
|
try {
|
|
28392
28604
|
const archive = path8.join(work, options.fileName ?? path8.basename(new URL(url2).pathname));
|
|
28393
|
-
|
|
28394
|
-
|
|
28395
|
-
|
|
28396
|
-
|
|
28397
|
-
|
|
28398
|
-
|
|
28605
|
+
if (options.cached && fs7.existsSync(options.cached)) {
|
|
28606
|
+
fs7.mkdirSync(work, { recursive: true });
|
|
28607
|
+
fs7.copyFileSync(options.cached, archive);
|
|
28608
|
+
fs7.rmSync(options.cached, { force: true });
|
|
28609
|
+
} else
|
|
28610
|
+
await this.file(url2, archive, {
|
|
28611
|
+
sha256: options.sha256,
|
|
28612
|
+
sha512: options.sha512,
|
|
28613
|
+
sha1: options.sha1,
|
|
28614
|
+
...options.verify ? { verify: options.verify } : {}
|
|
28615
|
+
});
|
|
28399
28616
|
const extracted = path8.join(work, "x");
|
|
28400
28617
|
await extractArchive(archive, extracted, options.members);
|
|
28401
28618
|
let root = extracted;
|
|
@@ -263,7 +263,7 @@ async function apiKeyAccounts(t, f) {
|
|
|
263
263
|
const said = JSON.stringify([out, asked.seen]);
|
|
264
264
|
t.check(asked.seen.questions.length === 2 &&
|
|
265
265
|
asked.seen.questions.every((q) => q.kind === 'secret') &&
|
|
266
|
-
asked.seen.questions[1].problem?.includes('
|
|
266
|
+
asked.seen.questions[1].problem?.includes('does not look like an API key') === true &&
|
|
267
267
|
out.message === 'Saved account "typed" (API key sk-ant-...Type).' &&
|
|
268
268
|
!said.includes(TYPED_KEY.slice(13)), 'save --api-key asks for the key hidden, asks again on a bad one, and says only sk-ant-...last4', said);
|
|
269
269
|
await t.throws(() => runDefinition('accounts.save', ctx, { agent: 'codex', name: 'x', apiKey: true }, fakeIO([]).io), 'for Claude accounts only', 'save --api-key is refused for another agent');
|