windows-development-sandbox 1.20.0 → 1.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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-JETGP2C3.js} +172 -48
- package/dist/bin/{chunk-2IMT7ZCT.js → chunk-XZKOPGNH.js} +1 -1
- package/dist/bin/{chunk-Z2P5OGKL.js → chunk-ZTTOF5V3.js} +2430 -1688
- 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/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/agent-paths.test.js +39 -1
- 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/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/netproxy.js
CHANGED
|
@@ -25454,15 +25454,17 @@ var SecretsSchema = external_exports.strictObject({
|
|
|
25454
25454
|
)
|
|
25455
25455
|
});
|
|
25456
25456
|
var AttachSchema = external_exports.strictObject({
|
|
25457
|
-
enabled: external_exports.boolean().describe(
|
|
25457
|
+
enabled: external_exports.boolean().describe(
|
|
25458
|
+
"Allow attaching this PC's terminal to a session (the terminal option when starting an agent, and attach)."
|
|
25459
|
+
),
|
|
25458
25460
|
reuseSession: external_exports.boolean().describe(
|
|
25459
|
-
"
|
|
25461
|
+
"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)."
|
|
25460
25462
|
),
|
|
25461
25463
|
auto: external_exports.boolean().describe(
|
|
25462
25464
|
"Starting an agent attaches this terminal automatically, as if you passed -t (only in an interactive terminal)."
|
|
25463
25465
|
),
|
|
25464
25466
|
autoHide: external_exports.boolean().describe(
|
|
25465
|
-
"Hide the Windows Sandbox window whenever this terminal attaches; it keeps running (
|
|
25467
|
+
"Hide the Windows Sandbox window whenever this terminal attaches; it keeps running (Sandbox > Status shows it again)."
|
|
25466
25468
|
),
|
|
25467
25469
|
confirmCtrlC: external_exports.boolean().describe(
|
|
25468
25470
|
'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.'
|
|
@@ -25479,7 +25481,7 @@ var ClaudeProfileSchema = external_exports.strictObject({
|
|
|
25479
25481
|
hostDir: external_exports.string().describe('Your Claude folder, or "auto" (~/.claude or CLAUDE_CONFIG_DIR).'),
|
|
25480
25482
|
include: external_exports.array(external_exports.string().regex(/^[A-Za-z0-9._-]+$/)).describe("Files and folders copied from it."),
|
|
25481
25483
|
globalStateFile: external_exports.string().describe('Your .claude.json, or "auto". Empty string = do not copy.'),
|
|
25482
|
-
copyCredentials: external_exports.boolean().describe("Copy your Claude LOGIN into the sandbox. Prefer
|
|
25484
|
+
copyCredentials: external_exports.boolean().describe("Copy your Claude LOGIN into the sandbox. Prefer saving the login in Accounts instead."),
|
|
25483
25485
|
overwrite: external_exports.boolean().describe("Refresh these settings from this PC on every launch."),
|
|
25484
25486
|
sharePluginsAcrossAccounts: external_exports.boolean().describe(
|
|
25485
25487
|
"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."
|
|
@@ -25508,7 +25510,7 @@ var MappingSchema = external_exports.strictObject({
|
|
|
25508
25510
|
});
|
|
25509
25511
|
var SandboxSchema = external_exports.strictObject({
|
|
25510
25512
|
engine: external_exports.enum(["windows-sandbox", "hcs"]).describe(
|
|
25511
|
-
'(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 (
|
|
25513
|
+
'(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.'
|
|
25512
25514
|
),
|
|
25513
25515
|
memoryMb: external_exports.union([external_exports.literal("auto"), external_exports.number().int().min(2048)]).describe(
|
|
25514
25516
|
'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.'
|
|
@@ -25535,7 +25537,7 @@ var SandboxSchema = external_exports.strictObject({
|
|
|
25535
25537
|
),
|
|
25536
25538
|
networking: external_exports.boolean().describe("Internet access. false is the only hard network isolation Windows Sandbox offers."),
|
|
25537
25539
|
clipboard: external_exports.boolean().describe(
|
|
25538
|
-
"Shared clipboard between this PC and the sandbox. Also lets an agent's copy (in
|
|
25540
|
+
"Shared clipboard between this PC and the sandbox. Also lets an agent's copy (in an attached terminal) reach this PC's clipboard."
|
|
25539
25541
|
),
|
|
25540
25542
|
audioInput: external_exports.boolean().describe("Microphone access."),
|
|
25541
25543
|
videoInput: external_exports.boolean().describe("Camera access."),
|
|
@@ -25586,7 +25588,7 @@ var NetworkSchema = external_exports.strictObject({
|
|
|
25586
25588
|
});
|
|
25587
25589
|
var AuditSchema = external_exports.strictObject({
|
|
25588
25590
|
enabled: external_exports.boolean().describe(
|
|
25589
|
-
"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
|
|
25591
|
+
"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."
|
|
25590
25592
|
),
|
|
25591
25593
|
days: external_exports.number().int().min(1).max(365).describe(
|
|
25592
25594
|
"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."
|
|
@@ -25930,6 +25932,114 @@ var ToolchainsSchema = external_exports.strictObject({
|
|
|
25930
25932
|
)
|
|
25931
25933
|
});
|
|
25932
25934
|
|
|
25935
|
+
// src/shared/apps/catalogue-agents-web.ts
|
|
25936
|
+
var PERPLEXITY_MCP_VERSION = "1.3.0";
|
|
25937
|
+
var COMET_MCP_VERSION = "2.3.0";
|
|
25938
|
+
var CHROME_DEVTOOLS_MCP_VERSION = "1.12.0";
|
|
25939
|
+
var BROWSER_USE_VERSION = "0.13.14";
|
|
25940
|
+
var PERPLEXITY_COMPUTER_MCP_URL = "https://www.perplexity.ai/rest/computer/mcp";
|
|
25941
|
+
var COMET_SIGNER = {
|
|
25942
|
+
subject: ['^CN="?PERPLEXITY AI, INC\\.?"?(,|$)', '(^|, )O="?PERPLEXITY AI, INC\\.?"?(,|$)'],
|
|
25943
|
+
issuer: ["^CN=GlobalSign GCC R45 EV CodeSigning CA 2020(,|$)"]
|
|
25944
|
+
};
|
|
25945
|
+
var EDGE_EXE = "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe";
|
|
25946
|
+
var AGENTS_WEB_APPS = [
|
|
25947
|
+
{
|
|
25948
|
+
id: "perplexity-mcp",
|
|
25949
|
+
name: "Perplexity MCP (API)",
|
|
25950
|
+
category: "agents",
|
|
25951
|
+
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.",
|
|
25952
|
+
size: "30 MB",
|
|
25953
|
+
source: { locked: "npm", package: "@perplexity-ai/mcp-server", version: PERPLEXITY_MCP_VERSION },
|
|
25954
|
+
exe: "perplexity-mcp.cmd",
|
|
25955
|
+
service: true,
|
|
25956
|
+
mcp: {
|
|
25957
|
+
name: "sbx-perplexity",
|
|
25958
|
+
script: "node_modules/@perplexity-ai/mcp-server/dist/index.js",
|
|
25959
|
+
envVars: ["PERPLEXITY_API_KEY"],
|
|
25960
|
+
codex: true
|
|
25961
|
+
},
|
|
25962
|
+
plugsInto: "Claude Code and Codex as the MCP server sbx-perplexity; the key comes from Accounts as PERPLEXITY_API_KEY, never from a file",
|
|
25963
|
+
userOnly: true
|
|
25964
|
+
},
|
|
25965
|
+
{
|
|
25966
|
+
id: "perplexity-computer-mcp",
|
|
25967
|
+
name: "Perplexity Computer MCP",
|
|
25968
|
+
category: "agents",
|
|
25969
|
+
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.",
|
|
25970
|
+
size: "0 MB",
|
|
25971
|
+
source: { remote: true },
|
|
25972
|
+
exe: "",
|
|
25973
|
+
service: true,
|
|
25974
|
+
mcp: { name: "sbx-perplexity-computer", url: PERPLEXITY_COMPUTER_MCP_URL, codex: true },
|
|
25975
|
+
plugsInto: "Claude Code and Codex as the remote MCP server sbx-perplexity-computer; its sign-in is kept with your agent login",
|
|
25976
|
+
userOnly: true
|
|
25977
|
+
},
|
|
25978
|
+
{
|
|
25979
|
+
id: "comet",
|
|
25980
|
+
name: "Comet (Perplexity browser)",
|
|
25981
|
+
category: "browsers",
|
|
25982
|
+
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.",
|
|
25983
|
+
size: "600 MB",
|
|
25984
|
+
source: { resolve: "comet" },
|
|
25985
|
+
unpack: "chromium",
|
|
25986
|
+
exe: "comet.exe",
|
|
25987
|
+
needs: ["7zip"],
|
|
25988
|
+
signer: COMET_SIGNER,
|
|
25989
|
+
userOnly: true
|
|
25990
|
+
},
|
|
25991
|
+
{
|
|
25992
|
+
id: "comet-mcp",
|
|
25993
|
+
name: "Comet MCP",
|
|
25994
|
+
category: "agents",
|
|
25995
|
+
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.",
|
|
25996
|
+
size: "15 MB",
|
|
25997
|
+
source: { locked: "npm", package: "comet-mcp", version: COMET_MCP_VERSION },
|
|
25998
|
+
exe: "comet-mcp.cmd",
|
|
25999
|
+
service: true,
|
|
26000
|
+
mcp: { name: "sbx-comet", script: "node_modules/comet-mcp/dist/index.js", codex: true },
|
|
26001
|
+
plugsInto: "Claude Code and Codex as the MCP server sbx-comet, talking to Comet's DevTools on 127.0.0.1:9222",
|
|
26002
|
+
userOnly: true
|
|
26003
|
+
},
|
|
26004
|
+
{
|
|
26005
|
+
id: "chrome-devtools-mcp",
|
|
26006
|
+
name: "Chrome DevTools MCP",
|
|
26007
|
+
category: "agents",
|
|
26008
|
+
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.",
|
|
26009
|
+
size: "40 MB",
|
|
26010
|
+
source: { locked: "npm", package: "chrome-devtools-mcp", version: CHROME_DEVTOOLS_MCP_VERSION },
|
|
26011
|
+
exe: "chrome-devtools-mcp.cmd",
|
|
26012
|
+
service: true,
|
|
26013
|
+
mcp: {
|
|
26014
|
+
name: "sbx-chrome-devtools",
|
|
26015
|
+
script: "node_modules/chrome-devtools-mcp/build/src/bin/chrome-devtools-mcp.js",
|
|
26016
|
+
args: ["--executablePath", EDGE_EXE, "--isolated", "--no-usage-statistics", "--no-performance-crux"],
|
|
26017
|
+
codex: true
|
|
26018
|
+
},
|
|
26019
|
+
plugsInto: "Claude Code and Codex as the MCP server sbx-chrome-devtools (with Edge)",
|
|
26020
|
+
userOnly: true
|
|
26021
|
+
},
|
|
26022
|
+
{
|
|
26023
|
+
id: "browser-use-mcp",
|
|
26024
|
+
name: "Browser Use MCP",
|
|
26025
|
+
category: "agents",
|
|
26026
|
+
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.",
|
|
26027
|
+
size: "250 MB",
|
|
26028
|
+
source: { locked: "uv", package: "browser-use", version: BROWSER_USE_VERSION },
|
|
26029
|
+
exe: "browser-use.exe",
|
|
26030
|
+
service: true,
|
|
26031
|
+
mcp: {
|
|
26032
|
+
name: "sbx-browser-use",
|
|
26033
|
+
program: true,
|
|
26034
|
+
args: ["--mcp"],
|
|
26035
|
+
env: { ANONYMIZED_TELEMETRY: "false" },
|
|
26036
|
+
codex: true
|
|
26037
|
+
},
|
|
26038
|
+
plugsInto: "Claude Code and Codex as the MCP server sbx-browser-use",
|
|
26039
|
+
userOnly: true
|
|
26040
|
+
}
|
|
26041
|
+
];
|
|
26042
|
+
|
|
25933
26043
|
// src/shared/apps/catalogue-gamedev.ts
|
|
25934
26044
|
var GAMEDEV_APPS = [];
|
|
25935
26045
|
|
|
@@ -25937,7 +26047,38 @@ var GAMEDEV_APPS = [];
|
|
|
25937
26047
|
var MOBILE_APPS = [];
|
|
25938
26048
|
|
|
25939
26049
|
// src/shared/apps/catalogue-modding.ts
|
|
25940
|
-
var MODDING_APPS = [
|
|
26050
|
+
var MODDING_APPS = [
|
|
26051
|
+
{
|
|
26052
|
+
id: "lua-language-server",
|
|
26053
|
+
name: "Lua Language Server",
|
|
26054
|
+
category: "cli",
|
|
26055
|
+
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).",
|
|
26056
|
+
size: "15 MB",
|
|
26057
|
+
source: { github: "LuaLS/lua-language-server", asset: "^lua-language-server-[\\d.]+-win32-x64\\.zip$" },
|
|
26058
|
+
exe: "lua-language-server.exe",
|
|
26059
|
+
cli: true
|
|
26060
|
+
},
|
|
26061
|
+
{
|
|
26062
|
+
id: "stylua",
|
|
26063
|
+
name: "StyLua",
|
|
26064
|
+
category: "cli",
|
|
26065
|
+
about: "An opinionated Lua formatter (`stylua .`), configured with a stylua.toml in the project.",
|
|
26066
|
+
size: "6 MB",
|
|
26067
|
+
source: { github: "JohnnyMorganz/StyLua", asset: "^stylua-windows-x86_64\\.zip$" },
|
|
26068
|
+
exe: "stylua.exe",
|
|
26069
|
+
cli: true
|
|
26070
|
+
},
|
|
26071
|
+
{
|
|
26072
|
+
id: "selene",
|
|
26073
|
+
name: "selene",
|
|
26074
|
+
category: "cli",
|
|
26075
|
+
about: 'A Lua linter (`selene .`), configured with a selene.toml (std = "lua54", and a standard library file for the FiveM / RedM globals).',
|
|
26076
|
+
size: "7 MB",
|
|
26077
|
+
source: { github: "Kampfkarren/selene", asset: "^selene-[\\d.]+-windows\\.zip$" },
|
|
26078
|
+
exe: "selene.exe",
|
|
26079
|
+
cli: true
|
|
26080
|
+
}
|
|
26081
|
+
];
|
|
25941
26082
|
|
|
25942
26083
|
// src/shared/apps/catalogue.ts
|
|
25943
26084
|
var gh = (github, asset) => ({ github, asset });
|
|
@@ -26771,7 +26912,7 @@ var CORE_APPS = [
|
|
|
26771
26912
|
cli: true
|
|
26772
26913
|
}
|
|
26773
26914
|
];
|
|
26774
|
-
var APPS = [...CORE_APPS, ...GAMEDEV_APPS, ...MODDING_APPS, ...MOBILE_APPS];
|
|
26915
|
+
var APPS = [...CORE_APPS, ...GAMEDEV_APPS, ...MODDING_APPS, ...MOBILE_APPS, ...AGENTS_WEB_APPS];
|
|
26775
26916
|
|
|
26776
26917
|
// src/core/schema/apps.ts
|
|
26777
26918
|
var CATALOGUE_IDS = APPS.filter((a) => !a.setting).map((a) => a.id);
|
|
@@ -26841,7 +26982,7 @@ var ProjectsSchema = external_exports.strictObject({
|
|
|
26841
26982
|
var RESUME_SESSIONS = ["ask", "always", "afterCrash", "never"];
|
|
26842
26983
|
var ResumeSchema = external_exports.strictObject({
|
|
26843
26984
|
sessions: external_exports.enum(RESUME_SESSIONS).describe(
|
|
26844
|
-
'When a sandbox starts after one that had agent sessions: "ask" lists them and asks whether to reopen them (without a terminal it
|
|
26985
|
+
'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.'
|
|
26845
26986
|
),
|
|
26846
26987
|
restartAfterCrash: external_exports.boolean().describe(
|
|
26847
26988
|
"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)."
|
|
@@ -26860,14 +27001,14 @@ var RemoteUserSchema = external_exports.strictObject({
|
|
|
26860
27001
|
});
|
|
26861
27002
|
var WebLanSchema = external_exports.strictObject({
|
|
26862
27003
|
enabled: external_exports.boolean().describe(
|
|
26863
|
-
"(Beta) Devices on your network (a phone): an HTTPS address on this PC for devices you pair with a one-time code (
|
|
27004
|
+
"(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."
|
|
26864
27005
|
),
|
|
26865
27006
|
port: external_exports.number().int().min(1024).max(65535).describe("HTTPS port for paired devices on your network."),
|
|
26866
27007
|
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).")
|
|
26867
27008
|
});
|
|
26868
27009
|
var WebRemoteSchema = external_exports.strictObject({
|
|
26869
27010
|
windowsSignIn: external_exports.boolean().describe(
|
|
26870
|
-
"(Beta) Other Windows users of this PC named in web.remote.users sign in to your web UI (and
|
|
27011
|
+
"(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."
|
|
26871
27012
|
),
|
|
26872
27013
|
users: external_exports.array(RemoteUserSchema).max(32).describe("Who else may sign in with Windows, and their role (view or control)."),
|
|
26873
27014
|
rememberDays: external_exports.number().int().min(1).max(90).describe(
|
|
@@ -26877,7 +27018,7 @@ var WebRemoteSchema = external_exports.strictObject({
|
|
|
26877
27018
|
});
|
|
26878
27019
|
var WebSchema = external_exports.strictObject({
|
|
26879
27020
|
enabled: external_exports.boolean().describe(
|
|
26880
|
-
"(Beta) The web UI: your
|
|
27021
|
+
"(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."
|
|
26881
27022
|
),
|
|
26882
27023
|
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."),
|
|
26883
27024
|
openOnLaunch: external_exports.boolean().describe("(Beta) With the web UI on: open it in your browser, already signed in, every time a sandbox starts."),
|
|
@@ -26888,7 +27029,7 @@ var WebSchema = external_exports.strictObject({
|
|
|
26888
27029
|
var VPN_PROVIDERS = ["nordvpn", "openvpn-file", "wireguard-file"];
|
|
26889
27030
|
var VpnSchema = external_exports.strictObject({
|
|
26890
27031
|
enabled: external_exports.boolean().describe(
|
|
26891
|
-
"(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 (
|
|
27032
|
+
"(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)."
|
|
26892
27033
|
),
|
|
26893
27034
|
provider: external_exports.enum(VPN_PROVIDERS).describe(
|
|
26894
27035
|
"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."
|
|
@@ -26906,13 +27047,14 @@ var VpnSchema = external_exports.strictObject({
|
|
|
26906
27047
|
// src/core/schema/github.ts
|
|
26907
27048
|
var GithubSchema = external_exports.strictObject({
|
|
26908
27049
|
shareToken: external_exports.boolean().describe(
|
|
26909
|
-
'Give each sandbox the GitHub token you saved
|
|
27050
|
+
'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.'
|
|
26910
27051
|
)
|
|
26911
27052
|
});
|
|
26912
27053
|
|
|
26913
27054
|
// src/shared/accounts/kinds.ts
|
|
26914
27055
|
var AGENT_CAN_USE = "The agent in the sandbox can use this sign-in while it is there.";
|
|
26915
27056
|
var ONE_PLACE = "It works in one sandbox at a time: a second sandbox starts without it while the first one runs.";
|
|
27057
|
+
var PERPLEXITY_KEY_PATTERN = /^pplx-[A-Za-z0-9_-]{8,200}$/;
|
|
26916
27058
|
var SERVICE_SPECS = {
|
|
26917
27059
|
epic: {
|
|
26918
27060
|
kind: "epic",
|
|
@@ -26966,19 +27108,28 @@ var SERVICE_SPECS = {
|
|
|
26966
27108
|
kind: "cfx",
|
|
26967
27109
|
label: "Cfx.re (FiveM / RedM server key)",
|
|
26968
27110
|
usedBy: ["fivem"],
|
|
26969
|
-
sources: ["typed"],
|
|
27111
|
+
sources: ["typed", "file"],
|
|
26970
27112
|
singleHolder: false,
|
|
26971
27113
|
returns: false,
|
|
27114
|
+
// `import cfx --from` reads a whole server.cfg (they often run to tens of KB); the payload itself is tiny.
|
|
26972
27115
|
maxBytes: 4 * 1024,
|
|
27116
|
+
maxFileBytes: 256 * 1024,
|
|
26973
27117
|
warnings: [AGENT_CAN_USE + " Anyone with the key can run a server under your Cfx.re account."],
|
|
26974
27118
|
fields: [
|
|
26975
|
-
{
|
|
27119
|
+
{
|
|
27120
|
+
name: "licenseKey",
|
|
27121
|
+
label: "Server licence key (cfxk_...)",
|
|
27122
|
+
secret: true,
|
|
27123
|
+
pattern: /^cfxk_[A-Za-z0-9_]+$/,
|
|
27124
|
+
only: "typed"
|
|
27125
|
+
},
|
|
26976
27126
|
{
|
|
26977
27127
|
name: "steamWebApiKey",
|
|
26978
27128
|
label: "Steam Web API key (optional)",
|
|
26979
27129
|
secret: true,
|
|
26980
27130
|
optional: true,
|
|
26981
|
-
pattern: /^[A-F0-9]{32}
|
|
27131
|
+
pattern: /^[A-F0-9]{32}$/,
|
|
27132
|
+
only: "typed"
|
|
26982
27133
|
}
|
|
26983
27134
|
]
|
|
26984
27135
|
},
|
|
@@ -27032,33 +27183,77 @@ var SERVICE_SPECS = {
|
|
|
27032
27183
|
{ name: "issuerId", label: "Issuer ID", secret: false },
|
|
27033
27184
|
{ name: "keyId", label: "Key ID", secret: false, pattern: /^[A-Z0-9]{10}$/ }
|
|
27034
27185
|
]
|
|
27186
|
+
},
|
|
27187
|
+
perplexity: {
|
|
27188
|
+
kind: "perplexity",
|
|
27189
|
+
label: "Perplexity API key",
|
|
27190
|
+
usedBy: ["perplexity"],
|
|
27191
|
+
sources: ["pc", "file", "typed"],
|
|
27192
|
+
singleHolder: false,
|
|
27193
|
+
returns: false,
|
|
27194
|
+
maxBytes: 1024,
|
|
27195
|
+
maxFileBytes: 64 * 1024,
|
|
27196
|
+
warnings: [
|
|
27197
|
+
AGENT_CAN_USE + " It can read the key and spend your API credit: use a separate API key with a spending limit.",
|
|
27198
|
+
"Perplexity Pro does not include API use; the API key is billed separately.",
|
|
27199
|
+
"Only the variable PERPLEXITY_API_KEY of the agent gets it: nothing in the sandbox writes it to a file."
|
|
27200
|
+
],
|
|
27201
|
+
fields: [
|
|
27202
|
+
{
|
|
27203
|
+
name: "apiKey",
|
|
27204
|
+
label: "Perplexity API key (pplx-...)",
|
|
27205
|
+
secret: true,
|
|
27206
|
+
pattern: PERPLEXITY_KEY_PATTERN,
|
|
27207
|
+
only: "typed"
|
|
27208
|
+
}
|
|
27209
|
+
]
|
|
27210
|
+
},
|
|
27211
|
+
comet: {
|
|
27212
|
+
kind: "comet",
|
|
27213
|
+
label: "Comet (Perplexity browser)",
|
|
27214
|
+
usedBy: ["comet"],
|
|
27215
|
+
sources: ["sandbox"],
|
|
27216
|
+
singleHolder: false,
|
|
27217
|
+
returns: true,
|
|
27218
|
+
maxBytes: 256 * 1024,
|
|
27219
|
+
warnings: [
|
|
27220
|
+
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.",
|
|
27221
|
+
"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.",
|
|
27222
|
+
"Only the perplexity.ai sign-in cookies are kept: never saved passwords, other sites, localStorage or history. Never import your main browser profile.",
|
|
27223
|
+
"Several sandboxes can use it at once: the sign-in the last one hands back is kept."
|
|
27224
|
+
],
|
|
27225
|
+
fields: []
|
|
27035
27226
|
}
|
|
27036
27227
|
};
|
|
27228
|
+
var APP_USER_TEXT = {
|
|
27229
|
+
perplexity: "the Perplexity MCP app",
|
|
27230
|
+
comet: "the Comet app"
|
|
27231
|
+
};
|
|
27232
|
+
function usedByText(usedBy) {
|
|
27233
|
+
return usedBy.map((u) => u in APP_USER_TEXT ? APP_USER_TEXT[u] : u).join(" or ");
|
|
27234
|
+
}
|
|
27037
27235
|
|
|
27038
27236
|
// src/core/schema/accounts.ts
|
|
27039
27237
|
function share(kind, how) {
|
|
27040
27238
|
const spec = SERVICE_SPECS[kind];
|
|
27041
27239
|
return external_exports.strictObject({
|
|
27042
27240
|
share: external_exports.boolean().describe(
|
|
27043
|
-
"Hand your saved " + spec.label + " sign-in to sandboxes that use " + spec.usedBy
|
|
27241
|
+
"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."
|
|
27044
27242
|
)
|
|
27045
27243
|
});
|
|
27046
27244
|
}
|
|
27047
27245
|
var AccountsSchema = external_exports.strictObject({
|
|
27048
|
-
epic: share("epic", "sign in to the launcher once in a sandbox, or take this PC's
|
|
27049
|
-
steam: share(
|
|
27050
|
-
|
|
27051
|
-
|
|
27052
|
-
),
|
|
27053
|
-
|
|
27054
|
-
|
|
27055
|
-
|
|
27056
|
-
|
|
27057
|
-
|
|
27058
|
-
|
|
27059
|
-
}).describe(
|
|
27060
|
-
"Service sign-ins for sandboxes (game stores, engines, app signing). Manage them in Accounts: sandbox account status."
|
|
27061
|
-
);
|
|
27246
|
+
epic: share("epic", "sign in to the launcher once in a sandbox, or take this PC's from Accounts"),
|
|
27247
|
+
steam: share("steam", "sign in once with sbx-steam login, or take it from a SteamCMD folder in Accounts"),
|
|
27248
|
+
unity: share("unity", "sign in once in a sandbox, or take this PC's licence from Accounts"),
|
|
27249
|
+
cfx: share("cfx", "type the key in Accounts"),
|
|
27250
|
+
keystore: share("keystore", "import the upload.jks file in Accounts"),
|
|
27251
|
+
play: share("play", "import the service-account.json file in Accounts"),
|
|
27252
|
+
expo: share("expo", "type the token in Accounts"),
|
|
27253
|
+
appstore: share("appstore", "import the AuthKey.p8 file in Accounts"),
|
|
27254
|
+
perplexity: share("perplexity", "type the API key in Accounts, or import it from a .env file"),
|
|
27255
|
+
comet: share("comet", "sign in to Comet once in a sandbox: it cannot be taken from this PC")
|
|
27256
|
+
}).describe("Service sign-ins for sandboxes (game stores, engines, app signing, Perplexity). Manage them in Accounts.");
|
|
27062
27257
|
|
|
27063
27258
|
// src/core/schema/pc-installs.ts
|
|
27064
27259
|
var pick2 = (item, what, example) => external_exports.union([external_exports.boolean(), external_exports.array(item)]).describe(
|
|
@@ -27122,7 +27317,9 @@ function reservedEnvName(name) {
|
|
|
27122
27317
|
}
|
|
27123
27318
|
var ConfigSchema = external_exports.strictObject({
|
|
27124
27319
|
$schema: SchemaRefSchema.optional(),
|
|
27125
|
-
defaultHarness: NameSchema.describe(
|
|
27320
|
+
defaultHarness: NameSchema.describe(
|
|
27321
|
+
"The agent that starts when you do not name one (starting claude by name always runs claude)."
|
|
27322
|
+
),
|
|
27126
27323
|
guestWorkspace: GuestWorkspaceSchema,
|
|
27127
27324
|
readOnly: external_exports.boolean().describe("Map the workspace read-only."),
|
|
27128
27325
|
workspaceFilter: WorkspaceFilterSchema,
|
|
@@ -27132,7 +27329,7 @@ var ConfigSchema = external_exports.strictObject({
|
|
|
27132
27329
|
sharing: SharingSchema,
|
|
27133
27330
|
storage: external_exports.strictObject({
|
|
27134
27331
|
root: external_exports.string().min(1).describe(
|
|
27135
|
-
"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.
|
|
27332
|
+
"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."
|
|
27136
27333
|
),
|
|
27137
27334
|
persistAgentState: external_exports.boolean().describe("Keep agent logins and history between sandboxes."),
|
|
27138
27335
|
dataName: NameSchema.describe("Name of the persistent data set (C:\\AgentData) shared by all workspaces."),
|
|
@@ -27140,11 +27337,11 @@ var ConfigSchema = external_exports.strictObject({
|
|
|
27140
27337
|
`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.`
|
|
27141
27338
|
),
|
|
27142
27339
|
contained: external_exports.enum(["off", "vhdx"]).describe(
|
|
27143
|
-
'(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
|
|
27340
|
+
'(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.'
|
|
27144
27341
|
),
|
|
27145
27342
|
containedMaxGb: external_exports.number().int().min(8).max(4096).describe("(beta) Largest size, in GB, the disk image of storage.contained may grow to."),
|
|
27146
27343
|
warnDataGb: external_exports.number().min(0).describe(
|
|
27147
|
-
"Say at launch when the persisted data (tools, databases, logins) is bigger than this many GB; 0 = never.
|
|
27344
|
+
"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."
|
|
27148
27345
|
)
|
|
27149
27346
|
}),
|
|
27150
27347
|
network: NetworkSchema,
|
|
@@ -27251,6 +27448,10 @@ var BootProgressSchema = external_exports.strictObject({
|
|
|
27251
27448
|
done: external_exports.number().int().min(0).max(1e3),
|
|
27252
27449
|
total: external_exports.number().int().min(0).max(1e3)
|
|
27253
27450
|
});
|
|
27451
|
+
var BackgroundWorkSchema = external_exports.strictObject({
|
|
27452
|
+
name: Text(64),
|
|
27453
|
+
state: external_exports.enum(["running", "done", "failed"])
|
|
27454
|
+
});
|
|
27254
27455
|
var SandboxStatusSchema = external_exports.object({
|
|
27255
27456
|
launchId: Text(64),
|
|
27256
27457
|
phase: external_exports.enum(["booting", "provisioning", "ready", "failed"]),
|
|
@@ -27262,7 +27463,9 @@ var SandboxStatusSchema = external_exports.object({
|
|
|
27262
27463
|
/** The sandbox's IPv4 addresses (for network.forwardPorts; the host only uses ones on its Hyper-V network). */
|
|
27263
27464
|
addresses: external_exports.array(external_exports.string().max(45)).max(8).optional(),
|
|
27264
27465
|
/** A malformed progress is dropped, never the status (the phase still counts). */
|
|
27265
|
-
progress: BootProgressSchema.optional().catch(void 0)
|
|
27466
|
+
progress: BootProgressSchema.optional().catch(void 0),
|
|
27467
|
+
/** Installs that continue after the boot is ready; a malformed list is dropped, never the status. */
|
|
27468
|
+
background: external_exports.array(BackgroundWorkSchema).max(16).optional().catch(void 0)
|
|
27266
27469
|
});
|
|
27267
27470
|
var VersionSchema = external_exports.strictObject({ spec: Text(128), source: Text(256) });
|
|
27268
27471
|
var DatabasePlanSchema = external_exports.strictObject({
|
|
@@ -27763,7 +27966,11 @@ function moveIntoPlace(work, destination) {
|
|
|
27763
27966
|
fs6.mkdirSync(path7.dirname(destination), { recursive: true });
|
|
27764
27967
|
fs6.renameSync(work, destination);
|
|
27765
27968
|
}
|
|
27766
|
-
|
|
27969
|
+
var extractLimit = null;
|
|
27970
|
+
function extractArchive(archive, destination, members2 = []) {
|
|
27971
|
+
return extractLimit ? extractLimit.run(() => extract(archive, destination, members2)) : extract(archive, destination, members2);
|
|
27972
|
+
}
|
|
27973
|
+
async function extract(archive, destination, members2) {
|
|
27767
27974
|
fs6.mkdirSync(destination, { recursive: true });
|
|
27768
27975
|
let status = await spawnAsync(SYSTEM.tar(), ["-xf", archive, "-C", destination, ...members2]);
|
|
27769
27976
|
if (status !== 0 && /\.(zip|nupkg)$/i.test(archive)) {
|
|
@@ -27798,6 +28005,8 @@ import { pipeline } from "node:stream/promises";
|
|
|
27798
28005
|
var Downloader = class {
|
|
27799
28006
|
/** downloads.requireChecksum: refuse anything without an expected hash. The guest sets it from session.json. */
|
|
27800
28007
|
requireChecksum = false;
|
|
28008
|
+
/** The guest's net pool: how many HTTP bodies stream at once. Host code leaves it null. */
|
|
28009
|
+
limit = null;
|
|
27801
28010
|
watcher = null;
|
|
27802
28011
|
/** Reports coarse progress of the downloads that start from now on to `watcher` (null: stop). */
|
|
27803
28012
|
watch(watcher) {
|
|
@@ -27815,39 +28024,42 @@ var Downloader = class {
|
|
|
27815
28024
|
"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."
|
|
27816
28025
|
);
|
|
27817
28026
|
}
|
|
27818
|
-
const response = await fetchRetry(url2, {}, 3, 20 * 60 * 1e3);
|
|
27819
|
-
if (!response.body) throw new Error("Empty response for " + url2);
|
|
27820
28027
|
fs7.mkdirSync(path8.dirname(destination), { recursive: true });
|
|
27821
28028
|
const checks = ["sha256", "sha512", "sha1"].flatMap((kind) => {
|
|
27822
28029
|
const want = sums[kind]?.trim().toLowerCase();
|
|
27823
28030
|
return want ? [{ want, hash: crypto2.createHash(kind) }] : [];
|
|
27824
28031
|
});
|
|
27825
|
-
const
|
|
27826
|
-
const
|
|
27827
|
-
|
|
27828
|
-
|
|
27829
|
-
|
|
27830
|
-
|
|
27831
|
-
|
|
27832
|
-
|
|
27833
|
-
|
|
27834
|
-
|
|
27835
|
-
|
|
27836
|
-
|
|
27837
|
-
|
|
27838
|
-
|
|
27839
|
-
|
|
27840
|
-
|
|
27841
|
-
|
|
28032
|
+
const partial2 = destination + ".part";
|
|
28033
|
+
const transfer = async () => {
|
|
28034
|
+
const response = await fetchRetry(url2, {}, 3, 20 * 60 * 1e3);
|
|
28035
|
+
if (!response.body) throw new Error("Empty response for " + url2);
|
|
28036
|
+
const size = Number(response.headers.get("content-length")) || 0;
|
|
28037
|
+
const report = size > 0 ? this.watcher?.() ?? null : null;
|
|
28038
|
+
let received = 0;
|
|
28039
|
+
let tenth = 0;
|
|
28040
|
+
let reportedAt = Date.now();
|
|
28041
|
+
const tap = new Transform({
|
|
28042
|
+
transform(chunk, _encoding, done) {
|
|
28043
|
+
for (const c of checks) c.hash.update(chunk);
|
|
28044
|
+
if (report) {
|
|
28045
|
+
received += chunk.length;
|
|
28046
|
+
const now = Math.floor(received * 10 / size);
|
|
28047
|
+
if (now !== tenth || Date.now() - reportedAt > 5e3) {
|
|
28048
|
+
tenth = now;
|
|
28049
|
+
reportedAt = Date.now();
|
|
28050
|
+
try {
|
|
28051
|
+
report(Math.min(1, received / size));
|
|
28052
|
+
} catch {
|
|
28053
|
+
}
|
|
27842
28054
|
}
|
|
27843
28055
|
}
|
|
28056
|
+
done(null, chunk);
|
|
27844
28057
|
}
|
|
27845
|
-
|
|
27846
|
-
}
|
|
27847
|
-
});
|
|
27848
|
-
const partial2 = destination + ".part";
|
|
27849
|
-
try {
|
|
28058
|
+
});
|
|
27850
28059
|
await pipeline(Readable.fromWeb(response.body), tap, fs7.createWriteStream(partial2));
|
|
28060
|
+
};
|
|
28061
|
+
try {
|
|
28062
|
+
await (this.limit ? this.limit.run(transfer) : transfer());
|
|
27851
28063
|
if (checks.some((c) => c.hash.digest("hex") !== c.want)) throw new Error("Checksum mismatch for " + url2);
|
|
27852
28064
|
if (sums.verify) await sums.verify(partial2);
|
|
27853
28065
|
fs7.rmSync(destination, { force: true });
|
|
@@ -27864,12 +28076,17 @@ var Downloader = class {
|
|
|
27864
28076
|
const work = stagingFolder(destination);
|
|
27865
28077
|
try {
|
|
27866
28078
|
const archive = path8.join(work, options.fileName ?? path8.basename(new URL(url2).pathname));
|
|
27867
|
-
|
|
27868
|
-
|
|
27869
|
-
|
|
27870
|
-
|
|
27871
|
-
|
|
27872
|
-
|
|
28079
|
+
if (options.cached && fs7.existsSync(options.cached)) {
|
|
28080
|
+
fs7.mkdirSync(work, { recursive: true });
|
|
28081
|
+
fs7.copyFileSync(options.cached, archive);
|
|
28082
|
+
fs7.rmSync(options.cached, { force: true });
|
|
28083
|
+
} else
|
|
28084
|
+
await this.file(url2, archive, {
|
|
28085
|
+
sha256: options.sha256,
|
|
28086
|
+
sha512: options.sha512,
|
|
28087
|
+
sha1: options.sha1,
|
|
28088
|
+
...options.verify ? { verify: options.verify } : {}
|
|
28089
|
+
});
|
|
27873
28090
|
const extracted = path8.join(work, "x");
|
|
27874
28091
|
await extractArchive(archive, extracted, options.members);
|
|
27875
28092
|
let root = extracted;
|