windows-development-sandbox 1.4.0 → 1.4.3
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/.sandbox-config.example.json +2 -1
- package/config.example.json +4 -1
- package/dist/api.js +27 -16
- package/dist/cli/args.d.ts +4 -6
- package/dist/cli/args.js +67 -34
- package/dist/cli/argv.d.ts +9 -0
- package/dist/cli/argv.js +22 -0
- package/dist/cli/commands/accounts.d.ts +1 -1
- package/dist/cli/commands/accounts.js +42 -27
- package/dist/cli/commands/agent-commands.d.ts +3 -3
- package/dist/cli/commands/agent-commands.js +27 -18
- package/dist/cli/commands/context.d.ts +9 -11
- package/dist/cli/commands/context.js +35 -32
- package/dist/cli/commands/data/clean.d.ts +2 -2
- package/dist/cli/commands/data/clean.js +27 -11
- package/dist/cli/commands/data/collect.d.ts +6 -3
- package/dist/cli/commands/data/collect.js +46 -15
- package/dist/cli/commands/data/index.d.ts +2 -2
- package/dist/cli/commands/data/index.js +30 -12
- package/dist/cli/commands/data/remove.d.ts +1 -1
- package/dist/cli/commands/data/remove.js +4 -4
- package/dist/cli/commands/index.d.ts +5 -4
- package/dist/cli/commands/index.js +5 -4
- package/dist/cli/commands/launch/add-root.d.ts +7 -0
- package/dist/cli/commands/launch/add-root.js +64 -0
- package/dist/cli/commands/launch/boot-progress.d.ts +7 -0
- package/dist/cli/commands/launch/boot-progress.js +48 -0
- package/dist/cli/commands/launch/boot-wants.d.ts +11 -0
- package/dist/cli/commands/launch/boot-wants.js +48 -0
- package/dist/cli/commands/launch/first-start.d.ts +10 -0
- package/dist/cli/commands/launch/first-start.js +53 -0
- package/dist/cli/commands/launch/index.d.ts +6 -0
- package/dist/cli/commands/launch/index.js +6 -0
- package/dist/cli/commands/launch/launch.d.ts +8 -0
- package/dist/cli/commands/launch/launch.js +211 -0
- package/dist/cli/commands/launch/prepare.d.ts +23 -0
- package/dist/cli/commands/launch/prepare.js +109 -0
- package/dist/cli/commands/launch/running.d.ts +45 -0
- package/dist/cli/commands/launch/running.js +218 -0
- package/dist/cli/commands/launch/summary.d.ts +8 -0
- package/dist/cli/commands/launch/summary.js +98 -0
- package/dist/cli/commands/maintenance/audit.d.ts +3 -0
- package/dist/cli/commands/maintenance/audit.js +58 -0
- package/dist/cli/commands/maintenance/clean.d.ts +2 -0
- package/dist/cli/commands/maintenance/clean.js +10 -0
- package/dist/cli/commands/maintenance/config.d.ts +2 -0
- package/dist/cli/commands/maintenance/config.js +145 -0
- package/dist/cli/commands/maintenance/doctor.d.ts +2 -0
- package/dist/cli/commands/maintenance/doctor.js +52 -0
- package/dist/cli/commands/maintenance/host-claude.d.ts +2 -0
- package/dist/cli/commands/maintenance/host-claude.js +4 -0
- package/dist/cli/commands/maintenance/index.d.ts +8 -0
- package/dist/cli/commands/maintenance/index.js +9 -0
- package/dist/cli/commands/maintenance/logs.d.ts +2 -0
- package/dist/cli/commands/maintenance/logs.js +44 -0
- package/dist/cli/commands/maintenance/sync.d.ts +2 -0
- package/dist/cli/commands/maintenance/sync.js +12 -0
- package/dist/cli/commands/maintenance/watch.d.ts +3 -0
- package/dist/cli/commands/maintenance/watch.js +6 -0
- package/dist/cli/commands/projects/describe-sessions.d.ts +3 -0
- package/dist/cli/commands/projects/describe-sessions.js +15 -0
- package/dist/cli/commands/projects/here.d.ts +38 -0
- package/dist/cli/commands/projects/here.js +145 -0
- package/dist/cli/commands/projects/index.d.ts +4 -0
- package/dist/cli/commands/projects/index.js +4 -0
- package/dist/cli/commands/projects/projects.d.ts +14 -0
- package/dist/cli/commands/projects/projects.js +213 -0
- package/dist/cli/commands/projects/restart.d.ts +15 -0
- package/dist/cli/commands/projects/restart.js +149 -0
- package/dist/cli/commands/registry.d.ts +3 -0
- package/dist/cli/commands/registry.js +34 -0
- package/dist/cli/commands/repair/checks.js +105 -29
- package/dist/cli/commands/repair/finders.d.ts +13 -10
- package/dist/cli/commands/repair/finders.js +63 -43
- package/dist/cli/commands/repair/index.d.ts +4 -4
- package/dist/cli/commands/repair/index.js +47 -21
- package/dist/cli/commands/repair/types.d.ts +2 -2
- package/dist/cli/commands/repair/types.js +7 -2
- package/dist/cli/commands/sessions/attach.d.ts +2 -0
- package/dist/cli/commands/sessions/attach.js +45 -0
- package/dist/cli/commands/sessions/control.d.ts +4 -0
- package/dist/cli/commands/sessions/control.js +62 -0
- package/dist/cli/commands/sessions/exec.d.ts +6 -0
- package/dist/cli/commands/sessions/exec.js +72 -0
- package/dist/cli/commands/sessions/index.d.ts +6 -0
- package/dist/cli/commands/sessions/index.js +9 -0
- package/dist/cli/commands/sessions/list.d.ts +15 -0
- package/dist/cli/commands/sessions/list.js +65 -0
- package/dist/cli/commands/sessions/status.d.ts +2 -0
- package/dist/cli/commands/sessions/status.js +153 -0
- package/dist/cli/commands/sessions/window.d.ts +3 -0
- package/dist/cli/commands/sessions/window.js +18 -0
- package/dist/cli/commands/setup/checks.d.ts +4 -4
- package/dist/cli/commands/setup/checks.js +36 -19
- package/dist/cli/commands/setup/facts.d.ts +6 -6
- package/dist/cli/commands/setup/facts.js +23 -11
- package/dist/cli/commands/setup/index.d.ts +1 -1
- package/dist/cli/commands/setup/index.js +25 -12
- package/dist/cli/commands/user-config.d.ts +5 -5
- package/dist/cli/commands/user-config.js +14 -12
- package/dist/cli/history.d.ts +5 -4
- package/dist/cli/history.js +23 -11
- package/dist/cli/index.d.ts +4 -14
- package/dist/cli/index.js +27 -77
- package/dist/cli/manifest.d.ts +464 -10
- package/dist/cli/manifest.js +328 -54
- package/dist/cli/menu/apps.d.ts +7 -5
- package/dist/cli/menu/apps.js +64 -16
- package/dist/cli/menu/command-fields.d.ts +15 -0
- package/dist/cli/menu/command-fields.js +23 -0
- package/dist/cli/menu/command-form.d.ts +3 -5
- package/dist/cli/menu/command-form.js +116 -48
- package/dist/cli/menu/home.d.ts +22 -0
- package/dist/cli/menu/home.js +72 -0
- package/dist/cli/menu/index.d.ts +2 -24
- package/dist/cli/menu/index.js +4 -178
- package/dist/cli/menu/menu.d.ts +23 -0
- package/dist/cli/menu/menu.js +185 -0
- package/dist/cli/menu/settings/categories.d.ts +2 -2
- package/dist/cli/menu/settings/categories.js +123 -20
- package/dist/cli/menu/settings/collections/collection-editor.d.ts +23 -0
- package/dist/cli/menu/settings/collections/collection-editor.js +89 -0
- package/dist/cli/menu/settings/collections/map-editor.d.ts +10 -0
- package/dist/cli/menu/settings/collections/map-editor.js +34 -0
- package/dist/cli/menu/settings/collections/object-list-editor.d.ts +10 -0
- package/dist/cli/menu/settings/collections/object-list-editor.js +23 -0
- package/dist/cli/menu/settings/collections/object-map-editor.d.ts +10 -0
- package/dist/cli/menu/settings/collections/object-map-editor.js +35 -0
- package/dist/cli/menu/settings/collections/string-list-editor.d.ts +12 -0
- package/dist/cli/menu/settings/collections/string-list-editor.js +39 -0
- package/dist/cli/menu/settings/config-file.d.ts +2 -2
- package/dist/cli/menu/settings/config-file.js +42 -19
- package/dist/cli/menu/settings/editor-actions.d.ts +2 -0
- package/dist/cli/menu/settings/editor-actions.js +2 -0
- package/dist/cli/menu/settings/format.d.ts +5 -0
- package/dist/cli/menu/settings/format.js +39 -0
- package/dist/cli/menu/settings/index.d.ts +1 -29
- package/dist/cli/menu/settings/index.js +1 -133
- package/dist/cli/menu/settings/object-editor.d.ts +12 -0
- package/dist/cli/menu/settings/object-editor.js +86 -0
- package/dist/cli/menu/settings/schema-node.d.ts +3 -1
- package/dist/cli/menu/settings/schema-node.js +71 -24
- package/dist/cli/menu/settings/settings-editor.d.ts +30 -0
- package/dist/cli/menu/settings/settings-editor.js +176 -0
- package/dist/cli/menu/settings/{editors.d.ts → value-editor.d.ts} +2 -13
- package/dist/cli/menu/settings/value-editor.js +137 -0
- package/dist/cli/menu/several.d.ts +4 -4
- package/dist/cli/menu/several.js +61 -20
- package/dist/cli/{colors.d.ts → output/colors.d.ts} +8 -8
- package/dist/cli/{colors.js → output/colors.js} +32 -14
- package/dist/cli/output/index.d.ts +3 -0
- package/dist/cli/output/index.js +3 -0
- package/dist/cli/output/print.d.ts +5 -0
- package/dist/cli/output/print.js +14 -0
- package/dist/cli/output/progress.d.ts +24 -0
- package/dist/cli/output/progress.js +124 -0
- package/dist/cli/report.d.ts +2 -0
- package/dist/cli/report.js +20 -0
- package/dist/cli/tui/app.d.ts +6 -16
- package/dist/cli/tui/app.js +28 -8
- package/dist/cli/tui/dialogs/confirm-screen.d.ts +20 -0
- package/dist/cli/tui/dialogs/confirm-screen.js +50 -0
- package/dist/cli/tui/dialogs/message-screen.d.ts +17 -0
- package/dist/cli/tui/dialogs/message-screen.js +55 -0
- package/dist/cli/tui/dialogs/paragraphs.d.ts +2 -0
- package/dist/cli/tui/dialogs/paragraphs.js +5 -0
- package/dist/cli/tui/dialogs/text-screen.d.ts +26 -0
- package/dist/cli/tui/dialogs/text-screen.js +107 -0
- package/dist/cli/tui/frame.js +3 -1
- package/dist/cli/tui/index.d.ts +7 -3
- package/dist/cli/tui/index.js +4 -2
- package/dist/cli/tui/list/list-screen.d.ts +29 -0
- package/dist/cli/tui/{list-screen.js → list/list-screen.js} +86 -23
- package/dist/cli/tui/{list-screen.d.ts → list/list-types.d.ts} +0 -28
- package/dist/cli/tui/screen.d.ts +14 -0
- package/dist/cli/tui/terminal.js +34 -10
- package/dist/cli/tui/text.d.ts +2 -1
- package/dist/cli/tui/text.js +37 -7
- package/dist/cli/tui/theme.js +27 -9
- package/dist/cli/validate.d.ts +8 -8
- package/dist/cli/validate.js +32 -21
- package/dist/core/config/defaults.d.ts +2 -0
- package/dist/core/config/defaults.js +203 -0
- package/dist/core/config/index.d.ts +2 -0
- package/dist/core/config/index.js +3 -0
- package/dist/core/{config.d.ts → config/loader.d.ts} +1 -2
- package/dist/core/config/loader.js +47 -0
- package/dist/core/{detect-databases.js → detect/databases.js} +111 -23
- package/dist/core/detect/index.d.ts +4 -0
- package/dist/core/detect/index.js +4 -0
- package/dist/core/{detect-pwsh.d.ts → detect/pwsh.d.ts} +1 -1
- package/dist/core/{detect-pwsh.js → detect/pwsh.js} +25 -11
- package/dist/core/{detect-toolchains.d.ts → detect/toolchains.d.ts} +1 -1
- package/dist/core/{detect-toolchains.js → detect/toolchains.js} +42 -5
- package/dist/{guest/toolchains → core/detect}/versions.js +28 -12
- package/dist/core/disk.d.ts +2 -0
- package/dist/core/disk.js +46 -3
- package/dist/core/local-config/boot-wants.d.ts +45 -0
- package/dist/core/local-config/boot-wants.js +120 -0
- package/dist/core/local-config/file.d.ts +3 -0
- package/dist/core/local-config/file.js +16 -0
- package/dist/core/local-config/index.d.ts +5 -0
- package/dist/core/local-config/index.js +7 -0
- package/dist/core/{local-config.d.ts → local-config/overrides.d.ts} +11 -11
- package/dist/core/{local-config.js → local-config/overrides.js} +53 -54
- package/dist/core/{project-policy.d.ts → local-config/policy.d.ts} +7 -3
- package/dist/core/{project-policy.js → local-config/policy.js} +16 -6
- package/dist/core/local-config/trust.d.ts +13 -0
- package/dist/core/local-config/trust.js +43 -0
- package/dist/core/package-info.d.ts +4 -0
- package/dist/core/package-info.js +13 -0
- package/dist/core/run/guest-workspace.d.ts +23 -0
- package/dist/core/run/guest-workspace.js +47 -0
- package/dist/core/run/index.d.ts +3 -0
- package/dist/core/run/index.js +3 -0
- package/dist/core/run/resolve-run.d.ts +3 -0
- package/dist/core/run/resolve-run.js +202 -0
- package/dist/core/run/versions.d.ts +13 -0
- package/dist/core/run/versions.js +65 -0
- package/dist/core/safe-paths.js +17 -5
- package/dist/core/schema/apps.d.ts +4 -4
- package/dist/core/schema/apps.js +55 -21
- package/dist/core/schema/common.d.ts +13 -10
- package/dist/core/schema/common.js +16 -10
- package/dist/core/schema/config.d.ts +18 -12
- package/dist/core/schema/config.js +78 -53
- package/dist/core/schema/databases.d.ts +4 -3
- package/dist/core/schema/databases.js +16 -12
- package/dist/core/schema/harness.d.ts +1 -1
- package/dist/core/schema/harness.js +17 -7
- package/dist/core/schema/index.d.ts +6 -0
- package/dist/core/schema/index.js +8 -0
- package/dist/core/schema/json-schema.js +10 -5
- package/dist/core/schema/profile.d.ts +4 -4
- package/dist/core/schema/profile.js +37 -17
- package/dist/core/schema/projects.d.ts +2 -1
- package/dist/core/schema/projects.js +16 -5
- package/dist/core/schema/sandbox.d.ts +12 -12
- package/dist/core/schema/sandbox.js +101 -37
- package/dist/core/schema/toolchains.d.ts +6 -1
- package/dist/core/schema/toolchains.js +84 -34
- package/dist/core/types.d.ts +36 -9
- package/dist/core/util/errors.d.ts +8 -0
- package/dist/core/util/errors.js +14 -0
- package/dist/core/util/fs.d.ts +8 -0
- package/dist/core/util/fs.js +40 -0
- package/dist/core/util/index.d.ts +7 -0
- package/dist/core/util/index.js +7 -0
- package/dist/core/util/jsonc.d.ts +6 -0
- package/dist/core/util/jsonc.js +25 -0
- package/dist/core/util/links.d.ts +10 -0
- package/dist/core/util/links.js +39 -0
- package/dist/core/util/paths.d.ts +7 -0
- package/dist/core/util/paths.js +33 -0
- package/dist/core/util/process.d.ts +15 -0
- package/dist/core/util/process.js +54 -0
- package/dist/core/util/text.d.ts +8 -0
- package/dist/core/util/text.js +8 -0
- package/dist/guest/{setup/agents.js → agents/agent-installer.js} +24 -4
- package/dist/guest/apps/after-install.d.ts +3 -0
- package/dist/guest/apps/after-install.js +47 -0
- package/dist/guest/apps/app-installer.d.ts +22 -0
- package/dist/guest/apps/app-installer.js +116 -0
- package/dist/guest/apps/find-exe.d.ts +5 -0
- package/dist/guest/apps/find-exe.js +41 -0
- package/dist/guest/apps/index.d.ts +3 -10
- package/dist/guest/apps/index.js +6 -206
- package/dist/guest/apps/resolvers.js +37 -9
- package/dist/guest/apps/shortcuts.d.ts +6 -0
- package/dist/guest/apps/shortcuts.js +28 -0
- package/dist/guest/apps/sources.d.ts +4 -0
- package/dist/guest/apps/sources.js +17 -0
- package/dist/guest/apps/unpack.d.ts +3 -0
- package/dist/guest/apps/unpack.js +47 -0
- package/dist/guest/{audit-parse.js → audit/parse.js} +39 -3
- package/dist/guest/{audit.d.ts → audit/process-audit.d.ts} +3 -1
- package/dist/guest/{audit.js → audit/process-audit.js} +33 -8
- package/dist/guest/boot/boot-env.d.ts +4 -0
- package/dist/guest/{boot-env.js → boot/boot-env.js} +7 -5
- package/dist/guest/boot/boot.d.ts +1 -0
- package/dist/guest/{main.js → boot/boot.js} +100 -50
- package/dist/guest/{guide.js → boot/guide.js} +32 -7
- package/dist/guest/{project-env.d.ts → boot/project-env.d.ts} +3 -3
- package/dist/guest/{project-env.js → boot/project-env.js} +12 -4
- package/dist/guest/boot/project-status.d.ts +5 -0
- package/dist/guest/boot/project-status.js +28 -0
- package/dist/guest/daemon/daemon.d.ts +1 -0
- package/dist/guest/daemon/daemon.js +51 -0
- package/dist/guest/daemon/exec.js +18 -6
- package/dist/guest/daemon/{shutdown.js → idle-shutdown.js} +5 -4
- package/dist/guest/daemon/{project.d.ts → project-provisioner.d.ts} +3 -3
- package/dist/guest/daemon/{project.js → project-provisioner.js} +60 -22
- package/dist/guest/daemon/relays.js +5 -3
- package/dist/guest/daemon/{session.js → sessions.js} +84 -24
- package/dist/guest/daemon/state.d.ts +4 -1
- package/dist/guest/daemon/state.js +34 -20
- package/dist/guest/databases/database-server.d.ts +13 -0
- package/dist/guest/databases/database-server.js +35 -0
- package/dist/guest/databases/dynamodb.d.ts +12 -0
- package/dist/guest/databases/dynamodb.js +81 -0
- package/dist/guest/databases/index.d.ts +2 -0
- package/dist/guest/databases/index.js +2 -0
- package/dist/guest/databases/mongodb.d.ts +7 -0
- package/dist/guest/databases/mongodb.js +46 -0
- package/dist/guest/databases/mysql.d.ts +7 -0
- package/dist/guest/databases/mysql.js +59 -0
- package/dist/guest/databases/names.d.ts +5 -0
- package/dist/guest/databases/names.js +8 -0
- package/dist/guest/databases/postgres.d.ts +9 -0
- package/dist/guest/databases/postgres.js +85 -0
- package/dist/guest/databases/redis.d.ts +7 -0
- package/dist/guest/databases/redis.js +25 -0
- package/dist/guest/databases/registry.d.ts +5 -0
- package/dist/guest/databases/registry.js +51 -0
- package/dist/guest/databases/sbx-db.d.ts +1 -0
- package/dist/guest/{db.js → databases/sbx-db.js} +13 -13
- package/dist/guest/{toolchains/databases → databases}/server.d.ts +5 -5
- package/dist/guest/{toolchains/databases → databases}/server.js +18 -13
- package/dist/guest/entries/daemon.js +16 -0
- package/dist/guest/entries/db.js +10 -0
- package/dist/guest/entries/gitguard.js +20 -0
- package/dist/guest/entries/main.d.ts +1 -0
- package/dist/guest/entries/main.js +24 -0
- package/dist/guest/entries/netproxy.d.ts +1 -0
- package/dist/guest/entries/netproxy.js +7 -0
- package/dist/guest/entries/view.d.ts +1 -0
- package/dist/guest/entries/view.js +11 -0
- package/dist/guest/{gitguard.js → git/decision.js} +49 -26
- package/dist/guest/network/addresses.d.ts +2 -0
- package/dist/guest/network/addresses.js +6 -0
- package/dist/guest/{setup/network.d.ts → network/allow-only.d.ts} +0 -10
- package/dist/guest/network/allow-only.js +84 -0
- package/dist/guest/network/firewall.d.ts +9 -0
- package/dist/guest/{setup/network.js → network/firewall.js} +58 -63
- package/dist/guest/network/proxy-server.d.ts +2 -0
- package/dist/guest/{netproxy.js → network/proxy-server.js} +37 -18
- package/dist/guest/{helpers.d.ts → runtime/csc.d.ts} +1 -1
- package/dist/guest/{helpers.js → runtime/csc.js} +7 -2
- package/dist/guest/runtime/fs.d.ts +2 -0
- package/dist/guest/runtime/fs.js +6 -0
- package/dist/guest/runtime/log.d.ts +3 -0
- package/dist/guest/runtime/log.js +22 -0
- package/dist/guest/runtime/paths.d.ts +13 -0
- package/dist/guest/runtime/paths.js +14 -0
- package/dist/guest/{ports.js → runtime/ports.js} +8 -2
- package/dist/guest/runtime/process.d.ts +15 -0
- package/dist/guest/runtime/process.js +59 -0
- package/dist/guest/{project-context.js → runtime/project-context.js} +1 -1
- package/dist/guest/runtime/session.d.ts +5 -0
- package/dist/guest/runtime/session.js +10 -0
- package/dist/guest/runtime/status.d.ts +7 -0
- package/dist/guest/runtime/status.js +57 -0
- package/dist/guest/{cmdline.js → sessions/cmdline.js} +10 -4
- package/dist/guest/{ptyhost.js → sessions/pty-host.js} +12 -5
- package/dist/guest/{view.js → sessions/viewer.js} +8 -11
- package/dist/guest/setup/claude-mem.d.ts +10 -0
- package/dist/guest/setup/{claude.js → claude-mem.js} +18 -78
- package/dist/guest/setup/{claude.d.ts → claude-profile.d.ts} +0 -10
- package/dist/guest/setup/claude-profile.js +89 -0
- package/dist/guest/setup/desktop.d.ts +2 -0
- package/dist/guest/setup/desktop.js +32 -0
- package/dist/guest/setup/environment.js +28 -5
- package/dist/guest/setup/{user.d.ts → git-identity.d.ts} +0 -2
- package/dist/guest/setup/git-identity.js +34 -0
- package/dist/guest/{gitrules.d.ts → setup/git-rules.d.ts} +1 -1
- package/dist/guest/setup/git-rules.js +50 -0
- package/dist/guest/setup/hooks.js +22 -5
- package/dist/guest/setup/{policy.js → managed-policy.js} +2 -2
- package/dist/guest/toolchains/catalogue.d.ts +4 -4
- package/dist/guest/toolchains/catalogue.js +30 -7
- package/dist/guest/toolchains/detect.d.ts +12 -0
- package/dist/guest/toolchains/detect.js +54 -0
- package/dist/guest/toolchains/index.d.ts +3 -17
- package/dist/guest/toolchains/index.js +1 -80
- package/dist/guest/toolchains/install.d.ts +20 -0
- package/dist/guest/toolchains/install.js +29 -0
- package/dist/guest/toolchains/languages/go.d.ts +3 -0
- package/dist/guest/toolchains/{go.js → languages/go.js} +27 -9
- package/dist/guest/toolchains/languages/java.d.ts +8 -0
- package/dist/guest/toolchains/{java.js → languages/java.js} +57 -18
- package/dist/guest/toolchains/languages/node.d.ts +3 -0
- package/dist/guest/toolchains/{node.js → languages/node.js} +51 -18
- package/dist/guest/toolchains/languages/php.d.ts +3 -0
- package/dist/guest/toolchains/{scripting → languages}/php.js +36 -11
- package/dist/guest/toolchains/languages/python-tools.d.ts +3 -0
- package/dist/guest/toolchains/languages/python-tools.js +12 -0
- package/dist/guest/toolchains/languages/python.d.ts +3 -0
- package/dist/guest/toolchains/{python.js → languages/python.js} +29 -16
- package/dist/guest/toolchains/languages/ruby.d.ts +3 -0
- package/dist/guest/toolchains/{scripting → languages}/ruby.js +28 -10
- package/dist/guest/toolchains/leftovers.d.ts +1 -1
- package/dist/guest/toolchains/leftovers.js +13 -11
- package/dist/guest/toolchains/managers.d.ts +6 -6
- package/dist/guest/toolchains/managers.js +38 -17
- package/dist/guest/toolchains/native/binstall.d.ts +3 -2
- package/dist/guest/toolchains/native/binstall.js +20 -8
- package/dist/guest/toolchains/native/cpp.d.ts +2 -2
- package/dist/guest/toolchains/native/cpp.js +23 -8
- package/dist/guest/toolchains/native/dotnet.d.ts +5 -3
- package/dist/guest/toolchains/native/dotnet.js +72 -24
- package/dist/guest/toolchains/native/mesa.d.ts +2 -2
- package/dist/guest/toolchains/native/mesa.js +27 -10
- package/dist/guest/toolchains/native/msvc/environment.d.ts +4 -4
- package/dist/guest/toolchains/native/msvc/environment.js +30 -16
- package/dist/guest/toolchains/native/msvc/index.d.ts +3 -3
- package/dist/guest/toolchains/native/msvc/index.js +10 -8
- package/dist/guest/toolchains/native/msvc/packages.d.ts +1 -1
- package/dist/guest/toolchains/native/msvc/packages.js +69 -23
- package/dist/guest/toolchains/native/msvc/tree.d.ts +6 -6
- package/dist/guest/toolchains/native/msvc/tree.js +15 -9
- package/dist/guest/toolchains/native/rust-extras.d.ts +23 -0
- package/dist/guest/toolchains/native/rust-extras.js +100 -0
- package/dist/guest/toolchains/native/rust.d.ts +2 -2
- package/dist/guest/toolchains/native/rust.js +41 -10
- package/dist/guest/toolchains/{scripting → native}/vcruntime.d.ts +2 -2
- package/dist/guest/toolchains/{scripting → native}/vcruntime.js +17 -7
- package/dist/guest/toolchains/package-ledger.d.ts +17 -0
- package/dist/guest/toolchains/package-ledger.js +54 -0
- package/dist/guest/toolchains/plan.d.ts +3 -24
- package/dist/guest/toolchains/plan.js +99 -111
- package/dist/guest/toolchains/runtimes.d.ts +6 -6
- package/dist/guest/toolchains/runtimes.js +31 -13
- package/dist/guest/toolchains/scheduler.d.ts +22 -0
- package/dist/guest/toolchains/scheduler.js +123 -0
- package/dist/guest/toolchains/setup.d.ts +10 -0
- package/dist/guest/toolchains/setup.js +22 -0
- package/dist/guest/toolchains/state-file.d.ts +3 -0
- package/dist/guest/toolchains/state-file.js +10 -0
- package/dist/guest/toolchains/step.d.ts +24 -0
- package/dist/guest/toolchains/step.js +1 -0
- package/dist/guest/toolchains/tool-env.d.ts +12 -0
- package/dist/guest/toolchains/tool-env.js +16 -0
- package/dist/guest/toolchains/tools/cli.d.ts +10 -0
- package/dist/guest/toolchains/{cli.js → tools/cli.js} +35 -15
- package/dist/guest/toolchains/tools/git.d.ts +3 -0
- package/dist/guest/toolchains/{git.js → tools/git.js} +38 -15
- package/dist/guest/toolchains/tools/pwsh.d.ts +4 -0
- package/dist/guest/toolchains/{pwsh.js → tools/pwsh.js} +14 -7
- package/dist/guest/toolchains/{vscode-profile.d.ts → tools/vscode-profile.d.ts} +6 -6
- package/dist/guest/toolchains/{vscode-profile.js → tools/vscode-profile.js} +28 -12
- package/dist/guest/toolchains/{vscode.d.ts → tools/vscode.d.ts} +6 -6
- package/dist/guest/toolchains/{vscode.js → tools/vscode.js} +67 -21
- package/dist/guest/toolchains/version-cache.d.ts +16 -0
- package/dist/guest/toolchains/version-cache.js +67 -0
- package/dist/host/agent-commands/commands.d.ts +13 -0
- package/dist/host/agent-commands/commands.js +33 -0
- package/dist/host/agent-commands/forwarders.d.ts +7 -0
- package/dist/host/agent-commands/forwarders.js +31 -0
- package/dist/host/agent-commands/index.d.ts +4 -0
- package/dist/host/agent-commands/index.js +4 -0
- package/dist/host/agent-commands/reconcile.d.ts +12 -0
- package/dist/host/agent-commands/reconcile.js +69 -0
- package/dist/host/agent-commands/user-path.d.ts +2 -0
- package/dist/host/agent-commands/user-path.js +33 -0
- package/dist/host/audit/collect.d.ts +2 -2
- package/dist/host/audit/collect.js +59 -22
- package/dist/host/audit/log.d.ts +2 -2
- package/dist/host/audit/log.js +24 -8
- package/dist/host/{attach.d.ts → channel/attach.d.ts} +2 -2
- package/dist/host/{attach.js → channel/attach.js} +33 -15
- package/dist/host/channel/channel.d.ts +51 -0
- package/dist/host/channel/channel.js +196 -0
- package/dist/host/channel/index.d.ts +2 -0
- package/dist/host/channel/index.js +2 -0
- package/dist/host/guard/agent-files.d.ts +7 -0
- package/dist/host/guard/agent-files.js +103 -0
- package/dist/host/guard/commands.d.ts +10 -0
- package/dist/host/guard/commands.js +123 -0
- package/dist/host/guard/file-hash.d.ts +4 -0
- package/dist/host/guard/file-hash.js +37 -0
- package/dist/host/guard/git-config.d.ts +5 -0
- package/dist/host/guard/git-config.js +62 -0
- package/dist/host/guard/git-dirs.d.ts +12 -0
- package/dist/host/guard/git-dirs.js +53 -0
- package/dist/host/guard/index.d.ts +5 -0
- package/dist/host/guard/index.js +4 -0
- package/dist/host/guard/mark-of-the-web.d.ts +8 -0
- package/dist/host/guard/mark-of-the-web.js +74 -0
- package/dist/host/guard/nested-repos.d.ts +14 -0
- package/dist/host/guard/nested-repos.js +88 -0
- package/dist/host/guard/quarantine.d.ts +3 -0
- package/dist/host/guard/quarantine.js +24 -0
- package/dist/host/guard/repo-guard.d.ts +10 -0
- package/dist/host/guard/repo-guard.js +36 -0
- package/dist/host/guard/store.d.ts +40 -0
- package/dist/host/guard/store.js +145 -0
- package/dist/host/guard/types.d.ts +27 -0
- package/dist/host/guard/types.js +3 -0
- package/dist/host/guard/watch-state.d.ts +9 -0
- package/dist/host/guard/watch-state.js +26 -0
- package/dist/host/launch/boot-projects.d.ts +17 -0
- package/dist/host/launch/{projects.js → boot-projects.js} +27 -12
- package/dist/host/{database-plan.d.ts → launch/database-plan.d.ts} +5 -5
- package/dist/host/{database-plan.js → launch/database-plan.js} +24 -13
- package/dist/host/launch/generate.d.ts +4 -0
- package/dist/host/launch/generate.js +77 -0
- package/dist/host/launch/index.d.ts +10 -0
- package/dist/host/launch/index.js +10 -0
- package/dist/host/launch/mappings.d.ts +7 -2
- package/dist/host/launch/mappings.js +83 -24
- package/dist/host/launch/pc-scan.d.ts +5 -0
- package/dist/host/{pc-scan.js → launch/pc-scan.js} +20 -13
- package/dist/host/launch/project-scan.d.ts +7 -0
- package/dist/host/{project-scan.js → launch/project-scan.js} +29 -21
- package/dist/host/launch/session-file.d.ts +23 -0
- package/dist/host/launch/session-file.js +73 -0
- package/dist/host/launch/stage.d.ts +5 -5
- package/dist/host/launch/stage.js +14 -13
- package/dist/host/launch/toolchains.d.ts +4 -0
- package/dist/host/launch/toolchains.js +11 -0
- package/dist/host/launch/{wsb.d.ts → wsb-file.d.ts} +4 -2
- package/dist/host/launch/wsb-file.js +56 -0
- package/dist/host/life/crash-report.d.ts +8 -0
- package/dist/host/life/crash-report.js +87 -0
- package/dist/host/life/index.d.ts +6 -0
- package/dist/host/life/index.js +6 -0
- package/dist/host/life/keep-awake.d.ts +10 -0
- package/dist/host/life/keep-awake.js +29 -0
- package/dist/host/life/life-record.d.ts +48 -0
- package/dist/host/life/life-record.js +76 -0
- package/dist/host/life/stop-events.d.ts +27 -0
- package/dist/host/life/stop-events.js +96 -0
- package/dist/host/life/stop-warning.d.ts +4 -0
- package/dist/host/life/stop-warning.js +25 -0
- package/dist/host/life/windows-update.d.ts +3 -0
- package/dist/host/life/windows-update.js +11 -0
- package/dist/host/native.d.ts +4 -0
- package/dist/host/native.js +11 -0
- package/dist/host/network/index.d.ts +1 -0
- package/dist/host/network/index.js +1 -0
- package/dist/host/{port-forward.d.ts → network/port-forward.d.ts} +1 -1
- package/dist/host/{port-forward.js → network/port-forward.js} +16 -10
- package/dist/host/profile/accounts.d.ts +37 -0
- package/dist/host/profile/accounts.js +146 -0
- package/dist/host/profile/claude-login.d.ts +22 -0
- package/dist/host/profile/claude-login.js +57 -0
- package/dist/host/{claude-profile.d.ts → profile/claude-profile.d.ts} +9 -9
- package/dist/host/{claude-profile.js → profile/claude-profile.js} +32 -22
- package/dist/host/profile/index.d.ts +7 -0
- package/dist/host/profile/index.js +7 -0
- package/dist/host/profile/personalize.d.ts +2 -0
- package/dist/host/profile/personalize.js +127 -0
- package/dist/host/profile/reg-file.d.ts +8 -0
- package/dist/host/profile/reg-file.js +45 -0
- package/dist/host/profile/secret-files.d.ts +2 -0
- package/dist/host/profile/secret-files.js +25 -0
- package/dist/host/profile/secret-patterns.d.ts +6 -0
- package/dist/host/profile/secret-patterns.js +128 -0
- package/dist/host/profile/secrets.d.ts +12 -0
- package/dist/host/profile/secrets.js +100 -0
- package/dist/host/projects/index.d.ts +4 -0
- package/dist/host/projects/index.js +4 -0
- package/dist/host/projects/join.d.ts +38 -0
- package/dist/host/projects/join.js +119 -0
- package/dist/host/projects/known.d.ts +28 -0
- package/dist/host/projects/known.js +55 -0
- package/dist/host/projects/mapper.d.ts +29 -0
- package/dist/host/projects/mapper.js +88 -0
- package/dist/host/projects/registry.d.ts +83 -0
- package/dist/host/projects/registry.js +136 -0
- package/dist/host/sandbox/doctor.d.ts +2 -0
- package/dist/host/sandbox/doctor.js +42 -0
- package/dist/host/sandbox/host-claude.d.ts +1 -0
- package/dist/host/sandbox/host-claude.js +26 -0
- package/dist/host/sandbox/index.d.ts +6 -0
- package/dist/host/sandbox/index.js +6 -0
- package/dist/host/{platform.d.ts → sandbox/platform.d.ts} +0 -5
- package/dist/host/sandbox/platform.js +60 -0
- package/dist/host/sandbox/probe.d.ts +3 -0
- package/dist/host/sandbox/probe.js +47 -0
- package/dist/host/{window.js → sandbox/window.js} +7 -5
- package/dist/host/{wsb.js → sandbox/wsb-cli.js} +31 -8
- package/dist/host/{cleanup.js → storage/cleanup.js} +27 -12
- package/dist/host/storage/index.d.ts +2 -0
- package/dist/host/storage/index.js +2 -0
- package/dist/host/storage/state-files.d.ts +4 -0
- package/dist/host/storage/state-files.js +10 -0
- package/dist/host/test-guard.js +1 -1
- package/dist/host/tools/conpty.d.ts +8 -0
- package/dist/host/tools/conpty.js +58 -0
- package/dist/host/tools/index.d.ts +2 -0
- package/dist/host/tools/index.js +2 -0
- package/dist/host/{terminal.d.ts → tools/windows-terminal.d.ts} +2 -10
- package/dist/host/{terminal.js → tools/windows-terminal.js} +33 -57
- package/dist/host/workspace-view/active-views.d.ts +3 -0
- package/dist/host/workspace-view/active-views.js +22 -0
- package/dist/host/workspace-view/index.d.ts +2 -18
- package/dist/host/workspace-view/index.js +2 -49
- package/dist/host/workspace-view/plan.d.ts +16 -0
- package/dist/host/workspace-view/plan.js +50 -0
- package/dist/host/workspace-view/rules.js +10 -3
- package/dist/host/workspace-view/view-state.d.ts +10 -0
- package/dist/host/workspace-view/view-state.js +31 -0
- package/dist/host/workspace-view/view.d.ts +1 -0
- package/dist/host/workspace-view/view.js +51 -55
- package/dist/runtime/daemon.js +4232 -1918
- package/dist/runtime/db.js +2145 -830
- package/dist/runtime/gitguard.js +29 -11
- package/dist/runtime/main.js +4760 -2155
- package/dist/runtime/netproxy.js +1654 -418
- package/dist/runtime/view.js +1515 -453
- package/dist/selftest/accounts.test.d.ts +1 -1
- package/dist/selftest/accounts.test.js +20 -17
- package/dist/selftest/agent-commands.test.d.ts +1 -1
- package/dist/selftest/agent-commands.test.js +9 -5
- package/dist/selftest/audit.test.d.ts +1 -1
- package/dist/selftest/audit.test.js +46 -13
- package/dist/selftest/channel.test.d.ts +1 -1
- package/dist/selftest/channel.test.js +91 -8
- package/dist/selftest/cli.test.d.ts +1 -1
- package/dist/selftest/cli.test.js +68 -16
- package/dist/selftest/cmdline.test.d.ts +1 -1
- package/dist/selftest/cmdline.test.js +36 -7
- package/dist/selftest/config.test.d.ts +1 -1
- package/dist/selftest/config.test.js +12 -5
- package/dist/selftest/data.test.d.ts +1 -1
- package/dist/selftest/data.test.js +35 -6
- package/dist/selftest/detect.test.d.ts +1 -1
- package/dist/selftest/detect.test.js +22 -9
- package/dist/selftest/generate.test.d.ts +1 -1
- package/dist/selftest/generate.test.js +33 -9
- package/dist/selftest/git-access.test.d.ts +1 -1
- package/dist/selftest/git-access.test.js +42 -4
- package/dist/selftest/guest-boot.test.d.ts +1 -1
- package/dist/selftest/guest-boot.test.js +25 -7
- package/dist/selftest/host-sim.test.d.ts +1 -1
- package/dist/selftest/host-sim.test.js +27 -3
- package/dist/selftest/hostile-input.test.d.ts +1 -1
- package/dist/selftest/hostile-input.test.js +5 -5
- package/dist/selftest/index.d.ts +1 -1
- package/dist/selftest/index.js +73 -16
- package/dist/selftest/layout.test.d.ts +2 -0
- package/dist/selftest/layout.test.js +131 -0
- package/dist/selftest/links.test.d.ts +1 -1
- package/dist/selftest/links.test.js +16 -11
- package/dist/selftest/live-daemon.test.d.ts +1 -1
- package/dist/selftest/live-daemon.test.js +20 -8
- package/dist/selftest/live-git.test.d.ts +1 -1
- package/dist/selftest/live-git.test.js +13 -4
- package/dist/selftest/live-network.test.d.ts +1 -1
- package/dist/selftest/live-network.test.js +24 -9
- package/dist/selftest/live-projects.test.d.ts +1 -1
- package/dist/selftest/live-projects.test.js +47 -20
- package/dist/selftest/live-terminal.test.d.ts +2 -0
- package/dist/selftest/live-terminal.test.js +195 -0
- package/dist/selftest/local-config.test.d.ts +1 -1
- package/dist/selftest/local-config.test.js +88 -15
- package/dist/selftest/mirror.test.d.ts +1 -1
- package/dist/selftest/mirror.test.js +118 -19
- package/dist/selftest/network.test.d.ts +1 -1
- package/dist/selftest/network.test.js +17 -8
- package/dist/selftest/personalization.test.d.ts +1 -1
- package/dist/selftest/personalization.test.js +12 -5
- package/dist/selftest/projects.test.d.ts +1 -1
- package/dist/selftest/projects.test.js +336 -72
- package/dist/selftest/repair.test.d.ts +1 -1
- package/dist/selftest/repair.test.js +17 -5
- package/dist/selftest/repo-guard.test.d.ts +1 -1
- package/dist/selftest/repo-guard.test.js +21 -20
- package/dist/selftest/secrets.test.d.ts +1 -1
- package/dist/selftest/secrets.test.js +57 -13
- package/dist/selftest/setup.test.d.ts +1 -1
- package/dist/selftest/setup.test.js +25 -5
- package/dist/selftest/{fixtures.d.ts → support/fixtures.d.ts} +7 -4
- package/dist/selftest/{fixtures.js → support/fixtures.js} +95 -17
- package/dist/selftest/{harness.js → support/harness.js} +24 -7
- package/dist/selftest/{live.d.ts → support/live.d.ts} +2 -2
- package/dist/selftest/{live.js → support/live.js} +34 -10
- package/dist/selftest/support/suite.js +1 -0
- package/dist/selftest/sync.test.d.ts +1 -1
- package/dist/selftest/sync.test.js +64 -26
- package/dist/selftest/test-guard.test.d.ts +1 -1
- package/dist/selftest/test-guard.test.js +43 -15
- package/dist/selftest/toolchains.test.d.ts +1 -1
- package/dist/selftest/toolchains.test.js +135 -36
- package/dist/selftest/workspace-view.test.d.ts +1 -1
- package/dist/selftest/workspace-view.test.js +48 -11
- package/dist/selftest/workspace.test.d.ts +1 -1
- package/dist/selftest/workspace.test.js +13 -4
- package/dist/shared/{apps.d.ts → apps/catalogue.d.ts} +1 -11
- package/dist/shared/apps/catalogue.js +768 -0
- package/dist/shared/apps/index.d.ts +2 -0
- package/dist/shared/apps/index.js +2 -0
- package/dist/shared/apps/selection.d.ts +11 -0
- package/dist/shared/apps/selection.js +40 -0
- package/dist/shared/channel/index.d.ts +2 -0
- package/dist/shared/channel/index.js +2 -0
- package/dist/shared/channel/run-dir.d.ts +30 -0
- package/dist/shared/channel/run-dir.js +84 -0
- package/dist/shared/{schema.d.ts → channel/schema.d.ts} +60 -19
- package/dist/shared/channel/schema.js +131 -0
- package/dist/shared/download/archive.d.ts +13 -0
- package/dist/shared/download/archive.js +57 -0
- package/dist/shared/download/downloader.d.ts +35 -0
- package/dist/shared/download/downloader.js +110 -0
- package/dist/shared/download/github.d.ts +16 -0
- package/dist/shared/download/github.js +74 -0
- package/dist/shared/download/http.d.ts +5 -0
- package/dist/shared/download/http.js +30 -0
- package/dist/shared/download/index.d.ts +5 -0
- package/dist/shared/download/index.js +5 -0
- package/dist/shared/download/spawn.d.ts +2 -0
- package/dist/shared/download/spawn.js +7 -0
- package/dist/shared/io/index.d.ts +3 -0
- package/dist/shared/io/index.js +3 -0
- package/dist/shared/io/json-file.d.ts +10 -0
- package/dist/shared/io/json-file.js +21 -0
- package/dist/shared/io/json.d.ts +13 -0
- package/dist/shared/io/json.js +49 -0
- package/dist/shared/{safe-remove.js → io/safe-remove.js} +32 -7
- package/dist/shared/{netrules.js → network/firewall-rules.js} +36 -5
- package/dist/shared/network/index.d.ts +2 -0
- package/dist/shared/network/index.js +2 -0
- package/dist/shared/{netpolicy.js → network/policy.js} +66 -11
- package/dist/shared/{paths.js → paths/claude-paths.js} +12 -2
- package/dist/shared/{guest-paths.d.ts → paths/guest-paths.d.ts} +21 -0
- package/dist/shared/paths/guest-paths.js +146 -0
- package/dist/shared/paths/index.d.ts +3 -0
- package/dist/shared/paths/index.js +3 -0
- package/dist/shared/{projects.d.ts → paths/projects.d.ts} +27 -4
- package/dist/shared/paths/projects.js +136 -0
- package/dist/shared/pty/client.d.ts +21 -0
- package/dist/shared/pty/client.js +79 -0
- package/dist/shared/pty/console-input.d.ts +11 -0
- package/dist/shared/pty/console-input.js +81 -0
- package/dist/shared/pty/index.d.ts +6 -0
- package/dist/shared/pty/index.js +6 -0
- package/dist/shared/pty/input-joiner.d.ts +15 -0
- package/dist/shared/pty/input-joiner.js +44 -0
- package/dist/shared/pty/output-filter.d.ts +13 -0
- package/dist/shared/pty/output-filter.js +140 -0
- package/dist/shared/pty/protocol.d.ts +36 -0
- package/dist/shared/pty/protocol.js +60 -0
- package/dist/shared/pty/terminal.d.ts +24 -0
- package/dist/shared/pty/terminal.js +147 -0
- package/dist/shared/test-guard.js +3 -1
- package/dist/sync/claude-mem.d.ts +1 -1
- package/dist/sync/claude-mem.js +9 -4
- package/dist/sync/history.d.ts +1 -29
- package/dist/sync/history.js +57 -45
- package/dist/sync/index.d.ts +5 -0
- package/dist/sync/index.js +5 -0
- package/dist/sync/sync-cycle.d.ts +18 -0
- package/dist/sync/sync-cycle.js +85 -0
- package/dist/sync/sync-state.d.ts +32 -0
- package/dist/sync/sync-state.js +37 -0
- package/dist/sync/watcher.d.ts +0 -18
- package/dist/sync/watcher.js +66 -100
- package/native/keep-awake.ps1 +8 -0
- package/native/power.cs +23 -0
- package/native/stop-events.ps1 +38 -0
- package/package.json +11 -3
- package/sandbox/linkgate.cs +98 -0
- package/sandbox/memlog.ps1 +15 -6
- package/sandbox/ptyhost.cs +60 -3
- package/schemas/config.schema.json +48 -1
- package/schemas/sandbox-config.schema.json +37 -3
- package/dist/cli/commands/launch.d.ts +0 -29
- package/dist/cli/commands/launch.js +0 -366
- package/dist/cli/commands/maintenance.d.ts +0 -10
- package/dist/cli/commands/maintenance.js +0 -187
- package/dist/cli/commands/project.d.ts +0 -29
- package/dist/cli/commands/project.js +0 -63
- package/dist/cli/commands/projects.d.ts +0 -14
- package/dist/cli/commands/projects.js +0 -146
- package/dist/cli/commands/restart.d.ts +0 -6
- package/dist/cli/commands/restart.js +0 -85
- package/dist/cli/commands/sessions.d.ts +0 -12
- package/dist/cli/commands/sessions.js +0 -257
- package/dist/cli/menu/settings/editors.js +0 -305
- package/dist/cli/progress.d.ts +0 -9
- package/dist/cli/progress.js +0 -49
- package/dist/cli/tui/dialogs.d.ts +0 -57
- package/dist/cli/tui/dialogs.js +0 -162
- package/dist/core/config.js +0 -109
- package/dist/core/schema.d.ts +0 -6
- package/dist/core/schema.js +0 -8
- package/dist/core/util.d.ts +0 -62
- package/dist/core/util.js +0 -156
- package/dist/core/workspace.d.ts +0 -18
- package/dist/core/workspace.js +0 -145
- package/dist/guest/boot-env.d.ts +0 -4
- package/dist/guest/daemon.js +0 -57
- package/dist/guest/env.d.ts +0 -52
- package/dist/guest/env.js +0 -103
- package/dist/guest/gitrules.js +0 -11
- package/dist/guest/project-status.d.ts +0 -5
- package/dist/guest/project-status.js +0 -17
- package/dist/guest/setup/user.js +0 -51
- package/dist/guest/toolchains/cli.d.ts +0 -10
- package/dist/guest/toolchains/common.d.ts +0 -54
- package/dist/guest/toolchains/common.js +0 -147
- package/dist/guest/toolchains/databases/dynamodb.d.ts +0 -8
- package/dist/guest/toolchains/databases/dynamodb.js +0 -52
- package/dist/guest/toolchains/databases/index.d.ts +0 -6
- package/dist/guest/toolchains/databases/index.js +0 -62
- package/dist/guest/toolchains/databases/mongodb.d.ts +0 -3
- package/dist/guest/toolchains/databases/mongodb.js +0 -31
- package/dist/guest/toolchains/databases/mysql.d.ts +0 -3
- package/dist/guest/toolchains/databases/mysql.js +0 -38
- package/dist/guest/toolchains/databases/postgres.d.ts +0 -5
- package/dist/guest/toolchains/databases/postgres.js +0 -38
- package/dist/guest/toolchains/databases/redis.d.ts +0 -3
- package/dist/guest/toolchains/databases/redis.js +0 -16
- package/dist/guest/toolchains/git.d.ts +0 -3
- package/dist/guest/toolchains/go.d.ts +0 -3
- package/dist/guest/toolchains/java.d.ts +0 -8
- package/dist/guest/toolchains/node.d.ts +0 -3
- package/dist/guest/toolchains/pwsh.d.ts +0 -4
- package/dist/guest/toolchains/python.d.ts +0 -3
- package/dist/guest/toolchains/scripting/php.d.ts +0 -3
- package/dist/guest/toolchains/scripting/ruby.d.ts +0 -3
- package/dist/host/accounts.d.ts +0 -32
- package/dist/host/accounts.js +0 -128
- package/dist/host/agent-commands.d.ts +0 -25
- package/dist/host/agent-commands.js +0 -145
- package/dist/host/channel.d.ts +0 -38
- package/dist/host/channel.js +0 -162
- package/dist/host/generate.d.ts +0 -13
- package/dist/host/generate.js +0 -108
- package/dist/host/join.d.ts +0 -28
- package/dist/host/join.js +0 -76
- package/dist/host/launch/projects.d.ts +0 -15
- package/dist/host/launch/wsb.js +0 -34
- package/dist/host/motw.d.ts +0 -17
- package/dist/host/motw.js +0 -74
- package/dist/host/pc-scan.d.ts +0 -6
- package/dist/host/personalize.d.ts +0 -10
- package/dist/host/personalize.js +0 -97
- package/dist/host/platform.js +0 -129
- package/dist/host/project-scan.d.ts +0 -7
- package/dist/host/projects.d.ts +0 -100
- package/dist/host/projects.js +0 -147
- package/dist/host/repo-guard.d.ts +0 -43
- package/dist/host/repo-guard.js +0 -347
- package/dist/host/secrets.d.ts +0 -14
- package/dist/host/secrets.js +0 -133
- package/dist/host/stops.d.ts +0 -67
- package/dist/host/stops.js +0 -126
- package/dist/shared/apps.js +0 -114
- package/dist/shared/download.d.ts +0 -60
- package/dist/shared/download.js +0 -215
- package/dist/shared/guest-paths.js +0 -61
- package/dist/shared/projects.js +0 -67
- package/dist/shared/pty-client.d.ts +0 -91
- package/dist/shared/pty-client.js +0 -349
- package/dist/shared/rundir.d.ts +0 -41
- package/dist/shared/rundir.js +0 -96
- package/dist/shared/schema.js +0 -92
- /package/dist/{guest/daemon.d.ts → cli/tui/list/list-types.js} +0 -0
- /package/dist/{guest/db.d.ts → cli/tui/screen.js} +0 -0
- /package/dist/core/{detect-databases.d.ts → detect/databases.d.ts} +0 -0
- /package/dist/{guest/toolchains → core/detect}/versions.d.ts +0 -0
- /package/dist/guest/{setup/agents.d.ts → agents/agent-installer.d.ts} +0 -0
- /package/dist/guest/{audit-parse.d.ts → audit/parse.d.ts} +0 -0
- /package/dist/guest/{guide.d.ts → boot/guide.d.ts} +0 -0
- /package/dist/guest/daemon/{shutdown.d.ts → idle-shutdown.d.ts} +0 -0
- /package/dist/guest/daemon/{session.d.ts → sessions.d.ts} +0 -0
- /package/dist/guest/{main.d.ts → entries/daemon.d.ts} +0 -0
- /package/dist/guest/{netproxy.d.ts → entries/db.d.ts} +0 -0
- /package/dist/{selftest/suite.js → guest/entries/gitguard.d.ts} +0 -0
- /package/dist/guest/{gitguard.d.ts → git/decision.d.ts} +0 -0
- /package/dist/guest/{ports.d.ts → runtime/ports.d.ts} +0 -0
- /package/dist/guest/{project-context.d.ts → runtime/project-context.d.ts} +0 -0
- /package/dist/guest/{cmdline.d.ts → sessions/cmdline.d.ts} +0 -0
- /package/dist/guest/{ptyhost.d.ts → sessions/pty-host.d.ts} +0 -0
- /package/dist/guest/{view.d.ts → sessions/viewer.d.ts} +0 -0
- /package/dist/guest/setup/{policy.d.ts → managed-policy.d.ts} +0 -0
- /package/dist/host/{window.d.ts → sandbox/window.d.ts} +0 -0
- /package/dist/host/{wsb.d.ts → sandbox/wsb-cli.d.ts} +0 -0
- /package/dist/host/{cleanup.d.ts → storage/cleanup.d.ts} +0 -0
- /package/dist/selftest/{harness.d.ts → support/harness.d.ts} +0 -0
- /package/dist/selftest/{suite.d.ts → support/suite.d.ts} +0 -0
- /package/dist/shared/{safe-remove.d.ts → io/safe-remove.d.ts} +0 -0
- /package/dist/shared/{netrules.d.ts → network/firewall-rules.d.ts} +0 -0
- /package/dist/shared/{netpolicy.d.ts → network/policy.d.ts} +0 -0
- /package/dist/shared/{paths.d.ts → paths/claude-paths.d.ts} +0 -0
package/dist/runtime/netproxy.js
CHANGED
|
@@ -1363,11 +1363,11 @@ var require_lodash = __commonJS({
|
|
|
1363
1363
|
return isFunction(object2[key]);
|
|
1364
1364
|
});
|
|
1365
1365
|
}
|
|
1366
|
-
function baseGet(object2,
|
|
1367
|
-
|
|
1368
|
-
var index = 0, length =
|
|
1366
|
+
function baseGet(object2, path10) {
|
|
1367
|
+
path10 = castPath(path10, object2);
|
|
1368
|
+
var index = 0, length = path10.length;
|
|
1369
1369
|
while (object2 != null && index < length) {
|
|
1370
|
-
object2 = object2[toKey(
|
|
1370
|
+
object2 = object2[toKey(path10[index++])];
|
|
1371
1371
|
}
|
|
1372
1372
|
return index && index == length ? object2 : undefined2;
|
|
1373
1373
|
}
|
|
@@ -1431,10 +1431,10 @@ var require_lodash = __commonJS({
|
|
|
1431
1431
|
});
|
|
1432
1432
|
return accumulator;
|
|
1433
1433
|
}
|
|
1434
|
-
function baseInvoke(object2,
|
|
1435
|
-
|
|
1436
|
-
object2 = parent(object2,
|
|
1437
|
-
var func = object2 == null ? object2 : object2[toKey(last(
|
|
1434
|
+
function baseInvoke(object2, path10, args) {
|
|
1435
|
+
path10 = castPath(path10, object2);
|
|
1436
|
+
object2 = parent(object2, path10);
|
|
1437
|
+
var func = object2 == null ? object2 : object2[toKey(last(path10))];
|
|
1438
1438
|
return func == null ? undefined2 : apply(func, object2, args);
|
|
1439
1439
|
}
|
|
1440
1440
|
function baseIsArguments(value) {
|
|
@@ -1590,13 +1590,13 @@ var require_lodash = __commonJS({
|
|
|
1590
1590
|
return object2 === source || baseIsMatch(object2, source, matchData);
|
|
1591
1591
|
};
|
|
1592
1592
|
}
|
|
1593
|
-
function baseMatchesProperty(
|
|
1594
|
-
if (isKey(
|
|
1595
|
-
return matchesStrictComparable(toKey(
|
|
1593
|
+
function baseMatchesProperty(path10, srcValue) {
|
|
1594
|
+
if (isKey(path10) && isStrictComparable(srcValue)) {
|
|
1595
|
+
return matchesStrictComparable(toKey(path10), srcValue);
|
|
1596
1596
|
}
|
|
1597
1597
|
return function(object2) {
|
|
1598
|
-
var objValue = get(object2,
|
|
1599
|
-
return objValue === undefined2 && objValue === srcValue ? hasIn(object2,
|
|
1598
|
+
var objValue = get(object2, path10);
|
|
1599
|
+
return objValue === undefined2 && objValue === srcValue ? hasIn(object2, path10) : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);
|
|
1600
1600
|
};
|
|
1601
1601
|
}
|
|
1602
1602
|
function baseMerge(object2, source, srcIndex, customizer, stack) {
|
|
@@ -1693,23 +1693,23 @@ var require_lodash = __commonJS({
|
|
|
1693
1693
|
});
|
|
1694
1694
|
}
|
|
1695
1695
|
function basePick(object2, paths) {
|
|
1696
|
-
return basePickBy(object2, paths, function(value,
|
|
1697
|
-
return hasIn(object2,
|
|
1696
|
+
return basePickBy(object2, paths, function(value, path10) {
|
|
1697
|
+
return hasIn(object2, path10);
|
|
1698
1698
|
});
|
|
1699
1699
|
}
|
|
1700
1700
|
function basePickBy(object2, paths, predicate) {
|
|
1701
1701
|
var index = -1, length = paths.length, result2 = {};
|
|
1702
1702
|
while (++index < length) {
|
|
1703
|
-
var
|
|
1704
|
-
if (predicate(value,
|
|
1705
|
-
baseSet(result2, castPath(
|
|
1703
|
+
var path10 = paths[index], value = baseGet(object2, path10);
|
|
1704
|
+
if (predicate(value, path10)) {
|
|
1705
|
+
baseSet(result2, castPath(path10, object2), value);
|
|
1706
1706
|
}
|
|
1707
1707
|
}
|
|
1708
1708
|
return result2;
|
|
1709
1709
|
}
|
|
1710
|
-
function basePropertyDeep(
|
|
1710
|
+
function basePropertyDeep(path10) {
|
|
1711
1711
|
return function(object2) {
|
|
1712
|
-
return baseGet(object2,
|
|
1712
|
+
return baseGet(object2, path10);
|
|
1713
1713
|
};
|
|
1714
1714
|
}
|
|
1715
1715
|
function basePullAll(array2, values2, iteratee2, comparator) {
|
|
@@ -1783,14 +1783,14 @@ var require_lodash = __commonJS({
|
|
|
1783
1783
|
var array2 = values(collection);
|
|
1784
1784
|
return shuffleSelf(array2, baseClamp(n, 0, array2.length));
|
|
1785
1785
|
}
|
|
1786
|
-
function baseSet(object2,
|
|
1786
|
+
function baseSet(object2, path10, value, customizer) {
|
|
1787
1787
|
if (!isObject2(object2)) {
|
|
1788
1788
|
return object2;
|
|
1789
1789
|
}
|
|
1790
|
-
|
|
1791
|
-
var index = -1, length =
|
|
1790
|
+
path10 = castPath(path10, object2);
|
|
1791
|
+
var index = -1, length = path10.length, lastIndex = length - 1, nested = object2;
|
|
1792
1792
|
while (nested != null && ++index < length) {
|
|
1793
|
-
var key = toKey(
|
|
1793
|
+
var key = toKey(path10[index]), newValue = value;
|
|
1794
1794
|
if (key === "__proto__" || key === "constructor" || key === "prototype") {
|
|
1795
1795
|
return object2;
|
|
1796
1796
|
}
|
|
@@ -1798,7 +1798,7 @@ var require_lodash = __commonJS({
|
|
|
1798
1798
|
var objValue = nested[key];
|
|
1799
1799
|
newValue = customizer ? customizer(objValue, key, nested) : undefined2;
|
|
1800
1800
|
if (newValue === undefined2) {
|
|
1801
|
-
newValue = isObject2(objValue) ? objValue : isIndex(
|
|
1801
|
+
newValue = isObject2(objValue) ? objValue : isIndex(path10[index + 1]) ? [] : {};
|
|
1802
1802
|
}
|
|
1803
1803
|
}
|
|
1804
1804
|
assignValue(nested, key, newValue);
|
|
@@ -1964,14 +1964,14 @@ var require_lodash = __commonJS({
|
|
|
1964
1964
|
}
|
|
1965
1965
|
return result2;
|
|
1966
1966
|
}
|
|
1967
|
-
function baseUnset(object2,
|
|
1968
|
-
|
|
1969
|
-
var index = -1, length =
|
|
1967
|
+
function baseUnset(object2, path10) {
|
|
1968
|
+
path10 = castPath(path10, object2);
|
|
1969
|
+
var index = -1, length = path10.length;
|
|
1970
1970
|
if (!length) {
|
|
1971
1971
|
return true;
|
|
1972
1972
|
}
|
|
1973
1973
|
while (++index < length) {
|
|
1974
|
-
var key = toKey(
|
|
1974
|
+
var key = toKey(path10[index]);
|
|
1975
1975
|
if (key === "__proto__" && !hasOwnProperty.call(object2, "__proto__")) {
|
|
1976
1976
|
return false;
|
|
1977
1977
|
}
|
|
@@ -1979,11 +1979,11 @@ var require_lodash = __commonJS({
|
|
|
1979
1979
|
return false;
|
|
1980
1980
|
}
|
|
1981
1981
|
}
|
|
1982
|
-
var obj = parent(object2,
|
|
1983
|
-
return obj == null || delete obj[toKey(last(
|
|
1982
|
+
var obj = parent(object2, path10);
|
|
1983
|
+
return obj == null || delete obj[toKey(last(path10))];
|
|
1984
1984
|
}
|
|
1985
|
-
function baseUpdate(object2,
|
|
1986
|
-
return baseSet(object2,
|
|
1985
|
+
function baseUpdate(object2, path10, updater, customizer) {
|
|
1986
|
+
return baseSet(object2, path10, updater(baseGet(object2, path10)), customizer);
|
|
1987
1987
|
}
|
|
1988
1988
|
function baseWhile(array2, predicate, isDrop, fromRight) {
|
|
1989
1989
|
var length = array2.length, index = fromRight ? length : -1;
|
|
@@ -2866,11 +2866,11 @@ var require_lodash = __commonJS({
|
|
|
2866
2866
|
var match = source.match(reWrapDetails);
|
|
2867
2867
|
return match ? match[1].split(reSplitDetails) : [];
|
|
2868
2868
|
}
|
|
2869
|
-
function hasPath(object2,
|
|
2870
|
-
|
|
2871
|
-
var index = -1, length =
|
|
2869
|
+
function hasPath(object2, path10, hasFunc) {
|
|
2870
|
+
path10 = castPath(path10, object2);
|
|
2871
|
+
var index = -1, length = path10.length, result2 = false;
|
|
2872
2872
|
while (++index < length) {
|
|
2873
|
-
var key = toKey(
|
|
2873
|
+
var key = toKey(path10[index]);
|
|
2874
2874
|
if (!(result2 = object2 != null && hasFunc(object2, key))) {
|
|
2875
2875
|
break;
|
|
2876
2876
|
}
|
|
@@ -3072,8 +3072,8 @@ var require_lodash = __commonJS({
|
|
|
3072
3072
|
return apply(func, this, otherArgs);
|
|
3073
3073
|
};
|
|
3074
3074
|
}
|
|
3075
|
-
function parent(object2,
|
|
3076
|
-
return
|
|
3075
|
+
function parent(object2, path10) {
|
|
3076
|
+
return path10.length < 2 ? object2 : baseGet(object2, baseSlice(path10, 0, -1));
|
|
3077
3077
|
}
|
|
3078
3078
|
function reorder(array2, indexes) {
|
|
3079
3079
|
var arrLength = array2.length, length = nativeMin(indexes.length, arrLength), oldArray = copyArray(array2);
|
|
@@ -3708,10 +3708,10 @@ var require_lodash = __commonJS({
|
|
|
3708
3708
|
}
|
|
3709
3709
|
return isString(collection) ? fromIndex <= length && collection.indexOf(value, fromIndex) > -1 : !!length && baseIndexOf(collection, value, fromIndex) > -1;
|
|
3710
3710
|
}
|
|
3711
|
-
var invokeMap = baseRest(function(collection,
|
|
3712
|
-
var index = -1, isFunc = typeof
|
|
3711
|
+
var invokeMap = baseRest(function(collection, path10, args) {
|
|
3712
|
+
var index = -1, isFunc = typeof path10 == "function", result2 = isArrayLike(collection) ? Array2(collection.length) : [];
|
|
3713
3713
|
baseEach(collection, function(value) {
|
|
3714
|
-
result2[++index] = isFunc ? apply(
|
|
3714
|
+
result2[++index] = isFunc ? apply(path10, value, args) : baseInvoke(value, path10, args);
|
|
3715
3715
|
});
|
|
3716
3716
|
return result2;
|
|
3717
3717
|
});
|
|
@@ -3801,7 +3801,7 @@ var require_lodash = __commonJS({
|
|
|
3801
3801
|
}
|
|
3802
3802
|
return baseOrderBy(collection, baseFlatten(iteratees, 1), []);
|
|
3803
3803
|
});
|
|
3804
|
-
var
|
|
3804
|
+
var now = ctxNow || function() {
|
|
3805
3805
|
return root.Date.now();
|
|
3806
3806
|
};
|
|
3807
3807
|
function after(n, func) {
|
|
@@ -3897,7 +3897,7 @@ var require_lodash = __commonJS({
|
|
|
3897
3897
|
return lastCallTime === undefined2 || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait;
|
|
3898
3898
|
}
|
|
3899
3899
|
function timerExpired() {
|
|
3900
|
-
var time3 =
|
|
3900
|
+
var time3 = now();
|
|
3901
3901
|
if (shouldInvoke(time3)) {
|
|
3902
3902
|
return trailingEdge(time3);
|
|
3903
3903
|
}
|
|
@@ -3919,10 +3919,10 @@ var require_lodash = __commonJS({
|
|
|
3919
3919
|
lastArgs = lastCallTime = lastThis = timerId = undefined2;
|
|
3920
3920
|
}
|
|
3921
3921
|
function flush() {
|
|
3922
|
-
return timerId === undefined2 ? result2 : trailingEdge(
|
|
3922
|
+
return timerId === undefined2 ? result2 : trailingEdge(now());
|
|
3923
3923
|
}
|
|
3924
3924
|
function debounced() {
|
|
3925
|
-
var time3 =
|
|
3925
|
+
var time3 = now(), isInvoking = shouldInvoke(time3);
|
|
3926
3926
|
lastArgs = arguments;
|
|
3927
3927
|
lastThis = this;
|
|
3928
3928
|
lastCallTime = time3;
|
|
@@ -4363,15 +4363,15 @@ var require_lodash = __commonJS({
|
|
|
4363
4363
|
function functionsIn(object2) {
|
|
4364
4364
|
return object2 == null ? [] : baseFunctions(object2, keysIn(object2));
|
|
4365
4365
|
}
|
|
4366
|
-
function get(object2,
|
|
4367
|
-
var result2 = object2 == null ? undefined2 : baseGet(object2,
|
|
4366
|
+
function get(object2, path10, defaultValue) {
|
|
4367
|
+
var result2 = object2 == null ? undefined2 : baseGet(object2, path10);
|
|
4368
4368
|
return result2 === undefined2 ? defaultValue : result2;
|
|
4369
4369
|
}
|
|
4370
|
-
function has(object2,
|
|
4371
|
-
return object2 != null && hasPath(object2,
|
|
4370
|
+
function has(object2, path10) {
|
|
4371
|
+
return object2 != null && hasPath(object2, path10, baseHas);
|
|
4372
4372
|
}
|
|
4373
|
-
function hasIn(object2,
|
|
4374
|
-
return object2 != null && hasPath(object2,
|
|
4373
|
+
function hasIn(object2, path10) {
|
|
4374
|
+
return object2 != null && hasPath(object2, path10, baseHasIn);
|
|
4375
4375
|
}
|
|
4376
4376
|
var invert = createInverter(function(result2, value, key) {
|
|
4377
4377
|
if (value != null && typeof value.toString != "function") {
|
|
@@ -4424,10 +4424,10 @@ var require_lodash = __commonJS({
|
|
|
4424
4424
|
return result2;
|
|
4425
4425
|
}
|
|
4426
4426
|
var isDeep = false;
|
|
4427
|
-
paths = arrayMap(paths, function(
|
|
4428
|
-
|
|
4429
|
-
isDeep || (isDeep =
|
|
4430
|
-
return
|
|
4427
|
+
paths = arrayMap(paths, function(path10) {
|
|
4428
|
+
path10 = castPath(path10, object2);
|
|
4429
|
+
isDeep || (isDeep = path10.length > 1);
|
|
4430
|
+
return path10;
|
|
4431
4431
|
});
|
|
4432
4432
|
copyObject(object2, getAllKeysIn(object2), result2);
|
|
4433
4433
|
if (isDeep) {
|
|
@@ -4453,19 +4453,19 @@ var require_lodash = __commonJS({
|
|
|
4453
4453
|
return [prop];
|
|
4454
4454
|
});
|
|
4455
4455
|
predicate = getIteratee(predicate);
|
|
4456
|
-
return basePickBy(object2, props, function(value,
|
|
4457
|
-
return predicate(value,
|
|
4456
|
+
return basePickBy(object2, props, function(value, path10) {
|
|
4457
|
+
return predicate(value, path10[0]);
|
|
4458
4458
|
});
|
|
4459
4459
|
}
|
|
4460
|
-
function result(object2,
|
|
4461
|
-
|
|
4462
|
-
var index = -1, length =
|
|
4460
|
+
function result(object2, path10, defaultValue) {
|
|
4461
|
+
path10 = castPath(path10, object2);
|
|
4462
|
+
var index = -1, length = path10.length;
|
|
4463
4463
|
if (!length) {
|
|
4464
4464
|
length = 1;
|
|
4465
4465
|
object2 = undefined2;
|
|
4466
4466
|
}
|
|
4467
4467
|
while (++index < length) {
|
|
4468
|
-
var value = object2 == null ? undefined2 : object2[toKey(
|
|
4468
|
+
var value = object2 == null ? undefined2 : object2[toKey(path10[index])];
|
|
4469
4469
|
if (value === undefined2) {
|
|
4470
4470
|
index = length;
|
|
4471
4471
|
value = defaultValue;
|
|
@@ -4474,12 +4474,12 @@ var require_lodash = __commonJS({
|
|
|
4474
4474
|
}
|
|
4475
4475
|
return object2;
|
|
4476
4476
|
}
|
|
4477
|
-
function set2(object2,
|
|
4478
|
-
return object2 == null ? object2 : baseSet(object2,
|
|
4477
|
+
function set2(object2, path10, value) {
|
|
4478
|
+
return object2 == null ? object2 : baseSet(object2, path10, value);
|
|
4479
4479
|
}
|
|
4480
|
-
function setWith(object2,
|
|
4480
|
+
function setWith(object2, path10, value, customizer) {
|
|
4481
4481
|
customizer = typeof customizer == "function" ? customizer : undefined2;
|
|
4482
|
-
return object2 == null ? object2 : baseSet(object2,
|
|
4482
|
+
return object2 == null ? object2 : baseSet(object2, path10, value, customizer);
|
|
4483
4483
|
}
|
|
4484
4484
|
var toPairs = createToPairs(keys);
|
|
4485
4485
|
var toPairsIn = createToPairs(keysIn);
|
|
@@ -4501,15 +4501,15 @@ var require_lodash = __commonJS({
|
|
|
4501
4501
|
});
|
|
4502
4502
|
return accumulator;
|
|
4503
4503
|
}
|
|
4504
|
-
function unset(object2,
|
|
4505
|
-
return object2 == null ? true : baseUnset(object2,
|
|
4504
|
+
function unset(object2, path10) {
|
|
4505
|
+
return object2 == null ? true : baseUnset(object2, path10);
|
|
4506
4506
|
}
|
|
4507
|
-
function update(object2,
|
|
4508
|
-
return object2 == null ? object2 : baseUpdate(object2,
|
|
4507
|
+
function update(object2, path10, updater) {
|
|
4508
|
+
return object2 == null ? object2 : baseUpdate(object2, path10, castFunction(updater));
|
|
4509
4509
|
}
|
|
4510
|
-
function updateWith(object2,
|
|
4510
|
+
function updateWith(object2, path10, updater, customizer) {
|
|
4511
4511
|
customizer = typeof customizer == "function" ? customizer : undefined2;
|
|
4512
|
-
return object2 == null ? object2 : baseUpdate(object2,
|
|
4512
|
+
return object2 == null ? object2 : baseUpdate(object2, path10, castFunction(updater), customizer);
|
|
4513
4513
|
}
|
|
4514
4514
|
function values(object2) {
|
|
4515
4515
|
return object2 == null ? [] : baseValues(object2, keys(object2));
|
|
@@ -4895,17 +4895,17 @@ var require_lodash = __commonJS({
|
|
|
4895
4895
|
function matches(source) {
|
|
4896
4896
|
return baseMatches(baseClone(source, CLONE_DEEP_FLAG));
|
|
4897
4897
|
}
|
|
4898
|
-
function matchesProperty(
|
|
4899
|
-
return baseMatchesProperty(
|
|
4898
|
+
function matchesProperty(path10, srcValue) {
|
|
4899
|
+
return baseMatchesProperty(path10, baseClone(srcValue, CLONE_DEEP_FLAG));
|
|
4900
4900
|
}
|
|
4901
|
-
var method = baseRest(function(
|
|
4901
|
+
var method = baseRest(function(path10, args) {
|
|
4902
4902
|
return function(object2) {
|
|
4903
|
-
return baseInvoke(object2,
|
|
4903
|
+
return baseInvoke(object2, path10, args);
|
|
4904
4904
|
};
|
|
4905
4905
|
});
|
|
4906
4906
|
var methodOf = baseRest(function(object2, args) {
|
|
4907
|
-
return function(
|
|
4908
|
-
return baseInvoke(object2,
|
|
4907
|
+
return function(path10) {
|
|
4908
|
+
return baseInvoke(object2, path10, args);
|
|
4909
4909
|
};
|
|
4910
4910
|
});
|
|
4911
4911
|
function mixin(object2, source, options) {
|
|
@@ -4952,12 +4952,12 @@ var require_lodash = __commonJS({
|
|
|
4952
4952
|
var over = createOver(arrayMap);
|
|
4953
4953
|
var overEvery = createOver(arrayEvery);
|
|
4954
4954
|
var overSome = createOver(arraySome);
|
|
4955
|
-
function property(
|
|
4956
|
-
return isKey(
|
|
4955
|
+
function property(path10) {
|
|
4956
|
+
return isKey(path10) ? baseProperty(toKey(path10)) : basePropertyDeep(path10);
|
|
4957
4957
|
}
|
|
4958
4958
|
function propertyOf(object2) {
|
|
4959
|
-
return function(
|
|
4960
|
-
return object2 == null ? undefined2 : baseGet(object2,
|
|
4959
|
+
return function(path10) {
|
|
4960
|
+
return object2 == null ? undefined2 : baseGet(object2, path10);
|
|
4961
4961
|
};
|
|
4962
4962
|
}
|
|
4963
4963
|
var range = createRange();
|
|
@@ -5297,7 +5297,7 @@ var require_lodash = __commonJS({
|
|
|
5297
5297
|
lodash.nth = nth;
|
|
5298
5298
|
lodash.noConflict = noConflict;
|
|
5299
5299
|
lodash.noop = noop;
|
|
5300
|
-
lodash.now =
|
|
5300
|
+
lodash.now = now;
|
|
5301
5301
|
lodash.pad = pad;
|
|
5302
5302
|
lodash.padEnd = padEnd;
|
|
5303
5303
|
lodash.padStart = padStart;
|
|
@@ -5410,12 +5410,12 @@ var require_lodash = __commonJS({
|
|
|
5410
5410
|
LazyWrapper.prototype.findLast = function(predicate) {
|
|
5411
5411
|
return this.reverse().find(predicate);
|
|
5412
5412
|
};
|
|
5413
|
-
LazyWrapper.prototype.invokeMap = baseRest(function(
|
|
5414
|
-
if (typeof
|
|
5413
|
+
LazyWrapper.prototype.invokeMap = baseRest(function(path10, args) {
|
|
5414
|
+
if (typeof path10 == "function") {
|
|
5415
5415
|
return new LazyWrapper(this);
|
|
5416
5416
|
}
|
|
5417
5417
|
return this.map(function(value) {
|
|
5418
|
-
return baseInvoke(value,
|
|
5418
|
+
return baseInvoke(value, path10, args);
|
|
5419
5419
|
});
|
|
5420
5420
|
});
|
|
5421
5421
|
LazyWrapper.prototype.reject = function(predicate) {
|
|
@@ -5531,13 +5531,7 @@ var require_lodash = __commonJS({
|
|
|
5531
5531
|
}
|
|
5532
5532
|
});
|
|
5533
5533
|
|
|
5534
|
-
// src/
|
|
5535
|
-
import fs2 from "node:fs";
|
|
5536
|
-
import http from "node:http";
|
|
5537
|
-
import net from "node:net";
|
|
5538
|
-
import path3 from "node:path";
|
|
5539
|
-
|
|
5540
|
-
// src/shared/netpolicy.ts
|
|
5534
|
+
// src/shared/network/policy.ts
|
|
5541
5535
|
var HOST_PATTERN = /^(\*\.)?([a-z0-9-]+\.)*[a-z0-9-]+$/i;
|
|
5542
5536
|
var DEVELOPER_HOSTS = [
|
|
5543
5537
|
// AI providers
|
|
@@ -5602,25 +5596,29 @@ var DEVELOPER_HOSTS = [
|
|
|
5602
5596
|
"*.vscode-cdn.net",
|
|
5603
5597
|
"update.code.visualstudio.com"
|
|
5604
5598
|
];
|
|
5605
|
-
var expandAllowList = (list) => [
|
|
5599
|
+
var expandAllowList = (list) => [
|
|
5600
|
+
...new Set(
|
|
5601
|
+
list.flatMap((h) => h.trim().toLowerCase() === "@developer" ? DEVELOPER_HOSTS : [h]).map((h) => h.trim().toLowerCase()).filter((h) => HOST_PATTERN.test(h))
|
|
5602
|
+
)
|
|
5603
|
+
];
|
|
5606
5604
|
var hostAllowed = (host, patterns) => {
|
|
5607
5605
|
const h = host.toLowerCase().replace(/\.$/, "");
|
|
5608
5606
|
return patterns.some((p) => p.startsWith("*.") ? h.endsWith(p.slice(1)) && h.length > p.length - 1 : h === p);
|
|
5609
5607
|
};
|
|
5610
5608
|
var PROXY_PORT = 38080;
|
|
5611
5609
|
|
|
5612
|
-
// src/guest/
|
|
5613
|
-
import
|
|
5614
|
-
import
|
|
5610
|
+
// src/guest/network/proxy-server.ts
|
|
5611
|
+
import fs8 from "node:fs";
|
|
5612
|
+
import http from "node:http";
|
|
5613
|
+
import net from "node:net";
|
|
5614
|
+
import path9 from "node:path";
|
|
5615
5615
|
|
|
5616
|
-
// src/
|
|
5617
|
-
|
|
5618
|
-
var setChecksumRequired = (on) => {
|
|
5619
|
-
checksumRequired = on;
|
|
5620
|
-
};
|
|
5616
|
+
// src/guest/runtime/paths.ts
|
|
5617
|
+
import path4 from "node:path";
|
|
5621
5618
|
|
|
5622
|
-
// src/shared/
|
|
5623
|
-
import
|
|
5619
|
+
// src/shared/channel/run-dir.ts
|
|
5620
|
+
import fs4 from "node:fs";
|
|
5621
|
+
import path3 from "node:path";
|
|
5624
5622
|
|
|
5625
5623
|
// node_modules/zod/v4/classic/external.js
|
|
5626
5624
|
var external_exports = {};
|
|
@@ -6438,10 +6436,10 @@ function mergeDefs(...defs) {
|
|
|
6438
6436
|
function cloneDef(schema) {
|
|
6439
6437
|
return mergeDefs(schema._zod.def);
|
|
6440
6438
|
}
|
|
6441
|
-
function getElementAtPath(obj,
|
|
6442
|
-
if (!
|
|
6439
|
+
function getElementAtPath(obj, path10) {
|
|
6440
|
+
if (!path10)
|
|
6443
6441
|
return obj;
|
|
6444
|
-
return
|
|
6442
|
+
return path10.reduce((acc, key) => acc?.[key], obj);
|
|
6445
6443
|
}
|
|
6446
6444
|
function promiseAllObject(promisesObj) {
|
|
6447
6445
|
const keys = Object.keys(promisesObj);
|
|
@@ -6781,11 +6779,11 @@ function explicitlyAborted(x, startIndex = 0) {
|
|
|
6781
6779
|
}
|
|
6782
6780
|
return false;
|
|
6783
6781
|
}
|
|
6784
|
-
function prefixIssues(
|
|
6782
|
+
function prefixIssues(path10, issues) {
|
|
6785
6783
|
return issues.map((iss) => {
|
|
6786
6784
|
var _a3;
|
|
6787
6785
|
(_a3 = iss).path ?? (_a3.path = []);
|
|
6788
|
-
iss.path.unshift(
|
|
6786
|
+
iss.path.unshift(path10);
|
|
6789
6787
|
return iss;
|
|
6790
6788
|
});
|
|
6791
6789
|
}
|
|
@@ -7235,16 +7233,16 @@ function flattenError(error62, mapper = (issue2) => issue2.message) {
|
|
|
7235
7233
|
}
|
|
7236
7234
|
function formatError(error62, mapper = (issue2) => issue2.message) {
|
|
7237
7235
|
const fieldErrors = { _errors: [] };
|
|
7238
|
-
const processError = (error63,
|
|
7236
|
+
const processError = (error63, path10 = []) => {
|
|
7239
7237
|
for (const issue2 of error63.issues) {
|
|
7240
7238
|
if (issue2.code === "invalid_union" && issue2.errors.length) {
|
|
7241
|
-
issue2.errors.map((issues) => processError({ issues }, [...
|
|
7239
|
+
issue2.errors.map((issues) => processError({ issues }, [...path10, ...issue2.path]));
|
|
7242
7240
|
} else if (issue2.code === "invalid_key") {
|
|
7243
|
-
processError({ issues: issue2.issues }, [...
|
|
7241
|
+
processError({ issues: issue2.issues }, [...path10, ...issue2.path]);
|
|
7244
7242
|
} else if (issue2.code === "invalid_element") {
|
|
7245
|
-
processError({ issues: issue2.issues }, [...
|
|
7243
|
+
processError({ issues: issue2.issues }, [...path10, ...issue2.path]);
|
|
7246
7244
|
} else {
|
|
7247
|
-
const fullpath = [...
|
|
7245
|
+
const fullpath = [...path10, ...issue2.path];
|
|
7248
7246
|
if (fullpath.length === 0) {
|
|
7249
7247
|
fieldErrors._errors.push(mapper(issue2));
|
|
7250
7248
|
} else {
|
|
@@ -7283,17 +7281,17 @@ function formatError(error62, mapper = (issue2) => issue2.message) {
|
|
|
7283
7281
|
}
|
|
7284
7282
|
function treeifyError(error62, mapper = (issue2) => issue2.message) {
|
|
7285
7283
|
const result = { errors: [] };
|
|
7286
|
-
const processError = (error63,
|
|
7284
|
+
const processError = (error63, path10 = []) => {
|
|
7287
7285
|
var _a3;
|
|
7288
7286
|
for (const issue2 of error63.issues) {
|
|
7289
7287
|
if (issue2.code === "invalid_union" && issue2.errors.length) {
|
|
7290
|
-
issue2.errors.map((issues) => processError({ issues }, [...
|
|
7288
|
+
issue2.errors.map((issues) => processError({ issues }, [...path10, ...issue2.path]));
|
|
7291
7289
|
} else if (issue2.code === "invalid_key") {
|
|
7292
|
-
processError({ issues: issue2.issues }, [...
|
|
7290
|
+
processError({ issues: issue2.issues }, [...path10, ...issue2.path]);
|
|
7293
7291
|
} else if (issue2.code === "invalid_element") {
|
|
7294
|
-
processError({ issues: issue2.issues }, [...
|
|
7292
|
+
processError({ issues: issue2.issues }, [...path10, ...issue2.path]);
|
|
7295
7293
|
} else {
|
|
7296
|
-
const fullpath = [...
|
|
7294
|
+
const fullpath = [...path10, ...issue2.path];
|
|
7297
7295
|
if (fullpath.length === 0) {
|
|
7298
7296
|
result.errors.push(mapper(issue2));
|
|
7299
7297
|
continue;
|
|
@@ -7332,8 +7330,8 @@ function treeifyError(error62, mapper = (issue2) => issue2.message) {
|
|
|
7332
7330
|
}
|
|
7333
7331
|
function toDotPath(_path) {
|
|
7334
7332
|
const segs = [];
|
|
7335
|
-
const
|
|
7336
|
-
for (const seg of
|
|
7333
|
+
const path10 = _path.map((seg) => typeof seg === "object" ? seg.key : seg);
|
|
7334
|
+
for (const seg of path10) {
|
|
7337
7335
|
if (typeof seg === "number")
|
|
7338
7336
|
segs.push(`[${seg}]`);
|
|
7339
7337
|
else if (typeof seg === "symbol")
|
|
@@ -21036,13 +21034,13 @@ function _promise(Class2, innerType) {
|
|
|
21036
21034
|
}
|
|
21037
21035
|
// @__NO_SIDE_EFFECTS__
|
|
21038
21036
|
function _custom(Class2, fn, _params) {
|
|
21039
|
-
const
|
|
21040
|
-
|
|
21037
|
+
const norm2 = normalizeParams(_params);
|
|
21038
|
+
norm2.abort ?? (norm2.abort = true);
|
|
21041
21039
|
const schema = new Class2({
|
|
21042
21040
|
type: "custom",
|
|
21043
21041
|
check: "custom",
|
|
21044
21042
|
fn,
|
|
21045
|
-
...
|
|
21043
|
+
...norm2
|
|
21046
21044
|
});
|
|
21047
21045
|
return schema;
|
|
21048
21046
|
}
|
|
@@ -24435,13 +24433,13 @@ function resolveRef(ref, ctx) {
|
|
|
24435
24433
|
if (!ref.startsWith("#")) {
|
|
24436
24434
|
throw new Error("External $ref is not supported, only local refs (#/...) are allowed");
|
|
24437
24435
|
}
|
|
24438
|
-
const
|
|
24439
|
-
if (
|
|
24436
|
+
const path10 = ref.slice(1).split("/").filter(Boolean);
|
|
24437
|
+
if (path10.length === 0) {
|
|
24440
24438
|
return ctx.rootSchema;
|
|
24441
24439
|
}
|
|
24442
24440
|
const defsKey = ctx.version === "draft-2020-12" ? "$defs" : "definitions";
|
|
24443
|
-
if (
|
|
24444
|
-
const key =
|
|
24441
|
+
if (path10[0] === defsKey) {
|
|
24442
|
+
const key = path10[1] === void 0 ? void 0 : decodeJSONPointerSegment(path10[1]);
|
|
24445
24443
|
if (!key || !ctx.defs[key]) {
|
|
24446
24444
|
throw new Error(`Reference not found: ${ref}`);
|
|
24447
24445
|
}
|
|
@@ -25290,7 +25288,7 @@ function date4(params) {
|
|
|
25290
25288
|
return _coercedDate(ZodDate, params);
|
|
25291
25289
|
}
|
|
25292
25290
|
|
|
25293
|
-
// src/shared/guest-paths.ts
|
|
25291
|
+
// src/shared/paths/guest-paths.ts
|
|
25294
25292
|
var RESERVED_GUEST = /^C:\\(?:Windows|Program Files|Program Files \(x86\)|ProgramData|Users|AgentLaunch|AgentData|HostTools|nvm|Mirror)(?:\\|$)/i;
|
|
25295
25293
|
var MIRROR_LETTER = /^[D-Z]$/;
|
|
25296
25294
|
var DRIVE_PATH = /^([A-Za-z]):\\(.*)$/;
|
|
@@ -25301,93 +25299,122 @@ var isValidGuestPath = (guest) => {
|
|
|
25301
25299
|
const letter = m[1].toUpperCase();
|
|
25302
25300
|
const rest = m[2].replace(/\\+$/, "");
|
|
25303
25301
|
if (rest === "" || BAD_CHARS.test(rest)) return false;
|
|
25304
|
-
if (rest.split("\\").some((segment) => segment === "" || segment === "." || segment === ".." || /[. ]$/.test(segment)))
|
|
25302
|
+
if (rest.split("\\").some((segment) => segment === "" || segment === "." || segment === ".." || /[. ]$/.test(segment)))
|
|
25303
|
+
return false;
|
|
25305
25304
|
if (letter === "C") return !RESERVED_GUEST.test("C:\\" + rest);
|
|
25306
25305
|
return MIRROR_LETTER.test(letter);
|
|
25307
25306
|
};
|
|
25308
25307
|
|
|
25309
25308
|
// src/core/schema/common.ts
|
|
25310
|
-
var
|
|
25309
|
+
var GuestPathSchema = external_exports.string().refine(
|
|
25311
25310
|
isValidGuestPath,
|
|
25312
25311
|
"reserved or invalid guest path (a folder under C:\\ other than Windows, Program Files, Users, AgentData, Mirror, ..., or on drive D: to Z:)"
|
|
25313
25312
|
);
|
|
25314
|
-
var
|
|
25315
|
-
var
|
|
25313
|
+
var NameSchema = external_exports.string().regex(/^[A-Za-z0-9_-]+$/, "letters, numbers, - and _ only");
|
|
25314
|
+
var StringsSchema = external_exports.array(external_exports.string());
|
|
25316
25315
|
var toggle = (description) => external_exports.strictObject({ enabled: external_exports.boolean().describe(description) });
|
|
25317
|
-
var
|
|
25318
|
-
var
|
|
25319
|
-
|
|
25320
|
-
|
|
25321
|
-
var
|
|
25316
|
+
var SchemaRefSchema = external_exports.string().describe("Path or URL of the JSON Schema for editor autocomplete and docs.");
|
|
25317
|
+
var GitAccessSchema = external_exports.enum(["full", "readonly", "none"]).describe(
|
|
25318
|
+
"full: normal git. readonly: status/log/diff/show/blame only (no commit, push, checkout, ...). none: no git at all; .git is hidden from the agent."
|
|
25319
|
+
);
|
|
25320
|
+
var EnabledSchema = external_exports.union([external_exports.boolean(), external_exports.literal("auto")]);
|
|
25321
|
+
var enabled = (what, markers) => EnabledSchema.describe(what + ' true, false, or "auto" = only when the project has ' + markers + ".");
|
|
25322
|
+
var Packages = (what, example) => StringsSchema.describe(what + ", installed once and kept (e.g. " + example + ").");
|
|
25322
25323
|
|
|
25323
25324
|
// src/core/schema/config.ts
|
|
25324
25325
|
var import_lodash = __toESM(require_lodash(), 1);
|
|
25325
25326
|
|
|
25326
25327
|
// src/core/schema/databases.ts
|
|
25327
|
-
var
|
|
25328
|
-
var dbEnabled = (name) =>
|
|
25329
|
-
|
|
25328
|
+
var PortSchema = external_exports.number().int().min(1024).max(65535);
|
|
25329
|
+
var dbEnabled = (name) => EnabledSchema.describe(
|
|
25330
|
+
name + ': true, false, or "auto" = only when the project needs it (found from compose files, dependencies of every language, Prisma/ORM config and connection strings).'
|
|
25331
|
+
);
|
|
25332
|
+
var DatabasesSchema = external_exports.strictObject({
|
|
25330
25333
|
postgres: external_exports.strictObject({
|
|
25331
25334
|
enabled: dbEnabled("PostgreSQL (with psql, pg_dump). User postgres, no password, localhost only"),
|
|
25332
25335
|
version: external_exports.string().min(1).describe('"latest" or a major version such as "16". A compose file pinning postgres:<major> wins.'),
|
|
25333
|
-
port:
|
|
25336
|
+
port: PortSchema.describe("Port inside the sandbox.")
|
|
25334
25337
|
}),
|
|
25335
25338
|
mysql: external_exports.strictObject({
|
|
25336
25339
|
enabled: dbEnabled("MySQL-compatible database (MariaDB). User root, no password, localhost only"),
|
|
25337
25340
|
version: external_exports.string().min(1).describe('"lts" (newest MariaDB LTS) or a MariaDB series such as "11.4".'),
|
|
25338
|
-
port:
|
|
25341
|
+
port: PortSchema.describe("Port inside the sandbox.")
|
|
25339
25342
|
}),
|
|
25340
25343
|
mongodb: external_exports.strictObject({
|
|
25341
25344
|
enabled: dbEnabled("MongoDB with mongosh, localhost only"),
|
|
25342
25345
|
version: external_exports.string().min(1).describe('"latest" or a version prefix such as "8.0".'),
|
|
25343
|
-
port:
|
|
25346
|
+
port: PortSchema.describe("Port inside the sandbox.")
|
|
25344
25347
|
}),
|
|
25345
25348
|
redis: external_exports.strictObject({
|
|
25346
25349
|
enabled: dbEnabled("Redis (community Windows build), localhost only"),
|
|
25347
|
-
port:
|
|
25350
|
+
port: PortSchema.describe("Port inside the sandbox.")
|
|
25348
25351
|
}),
|
|
25349
25352
|
dynamodb: external_exports.strictObject({
|
|
25350
|
-
enabled: dbEnabled(
|
|
25351
|
-
|
|
25352
|
-
|
|
25353
|
+
enabled: dbEnabled(
|
|
25354
|
+
"DynamoDB Local (Amazon's official emulator, on the Java toolchain) with dynamodb-admin, a web UI to browse and edit tables"
|
|
25355
|
+
),
|
|
25356
|
+
port: PortSchema.describe("DynamoDB endpoint port inside the sandbox (http://localhost:<port>)."),
|
|
25357
|
+
adminPort: PortSchema.describe(
|
|
25358
|
+
"dynamodb-admin web UI port (open http://localhost:<adminPort> in the sandbox's browser)."
|
|
25359
|
+
),
|
|
25353
25360
|
admin: external_exports.boolean().describe("Run dynamodb-admin next to DynamoDB Local.")
|
|
25354
25361
|
}),
|
|
25355
25362
|
sqlserver: external_exports.strictObject({
|
|
25356
|
-
enabled: dbEnabled(
|
|
25363
|
+
enabled: dbEnabled(
|
|
25364
|
+
"SQL Server. It cannot run inside Windows Sandbox; when a project needs it you get a note to use Postgres or SQLite for local work"
|
|
25365
|
+
)
|
|
25357
25366
|
})
|
|
25358
25367
|
});
|
|
25359
25368
|
|
|
25360
25369
|
// src/core/schema/harness.ts
|
|
25361
|
-
var
|
|
25370
|
+
var HarnessSchema = external_exports.strictObject({
|
|
25362
25371
|
hostExecutable: external_exports.string().optional().describe("Executable copied from this PC when installed here (e.g. claude.exe)."),
|
|
25363
25372
|
hostDir: external_exports.string().optional().describe('Folder of hostExecutable on this PC, or "auto" to search PATH and ~/.local/bin.'),
|
|
25364
25373
|
npmPackage: external_exports.string().optional().describe("npm package installed inside the sandbox when there is no host copy."),
|
|
25365
25374
|
npmBin: external_exports.string().optional().describe("Command the npm package provides."),
|
|
25366
25375
|
uvPackage: external_exports.string().optional().describe("Python package installed with `uv tool install` inside the sandbox (e.g. aider-chat)."),
|
|
25367
25376
|
uvBin: external_exports.string().optional().describe("Command the uv package provides."),
|
|
25368
|
-
arguments:
|
|
25377
|
+
arguments: StringsSchema.describe("Arguments always passed to the agent."),
|
|
25369
25378
|
environment: external_exports.record(external_exports.string(), external_exports.string()).describe("Environment variables for the agent."),
|
|
25370
|
-
resumeArguments:
|
|
25379
|
+
resumeArguments: StringsSchema.optional().describe(
|
|
25380
|
+
"Arguments used when the agent is restarted in place (e.g. after an account switch) so it resumes the conversation."
|
|
25381
|
+
)
|
|
25371
25382
|
}).refine((h) => h.hostExecutable || h.npmPackage || h.uvPackage, "needs hostExecutable, npmPackage or uvPackage").refine((h) => !h.uvPackage || h.uvBin, "needs uvBin when uvPackage is set").refine((h) => !h.npmPackage || h.npmBin, "needs npmBin when npmPackage is set");
|
|
25372
25383
|
|
|
25373
25384
|
// src/core/schema/profile.ts
|
|
25374
|
-
var
|
|
25375
|
-
strip: external_exports.boolean().describe(
|
|
25376
|
-
|
|
25377
|
-
|
|
25378
|
-
|
|
25385
|
+
var SecretsSchema = external_exports.strictObject({
|
|
25386
|
+
strip: external_exports.boolean().describe(
|
|
25387
|
+
`Remove credentials from everything copied into the sandbox (your Claude settings.json "env" and credential helpers, MCP servers' env, headers and arguments): AWS, Azure, Google Cloud, Cloudflare, hosting, CI, registries, payment, AI API keys, database URLs, anything named *_TOKEN / *_SECRET / *PASSWORD* / *_KEY or *PROD*, and values that look like keys.`
|
|
25388
|
+
),
|
|
25389
|
+
allow: StringsSchema.describe(
|
|
25390
|
+
'Variable names that may go in anyway; * matches anything, e.g. ["AWS_REGION", "AWS_PROFILE", "MY_APP_*"].'
|
|
25391
|
+
),
|
|
25392
|
+
patterns: StringsSchema.describe(
|
|
25393
|
+
'More variable names to treat as secrets; * matches anything, e.g. ["ACME_*", "*_INTERNAL_URL"].'
|
|
25394
|
+
),
|
|
25395
|
+
warnFiles: external_exports.boolean().describe(
|
|
25396
|
+
"Warn at launch about files in the workspace that usually hold secrets (.env, *.pem, credentials.json, ...). The agent CAN read them: Windows Sandbox maps the whole folder."
|
|
25397
|
+
)
|
|
25379
25398
|
});
|
|
25380
|
-
var
|
|
25399
|
+
var AttachSchema = external_exports.strictObject({
|
|
25381
25400
|
enabled: external_exports.boolean().describe("Allow sandbox claude --terminal / sandbox attach from this PC."),
|
|
25382
|
-
reuseSession: external_exports.boolean().describe(
|
|
25383
|
-
|
|
25384
|
-
|
|
25401
|
+
reuseSession: external_exports.boolean().describe(
|
|
25402
|
+
"sandbox claude -t in a running sandbox reattaches to this folder's session when no terminal on this PC is attached to it (--new always starts another)."
|
|
25403
|
+
),
|
|
25404
|
+
auto: external_exports.boolean().describe(
|
|
25405
|
+
"Starting an agent attaches this terminal automatically, as if you passed -t (only in an interactive terminal)."
|
|
25406
|
+
),
|
|
25407
|
+
autoHide: external_exports.boolean().describe(
|
|
25408
|
+
"Hide the Windows Sandbox window whenever this terminal attaches; it keeps running (sandbox show brings it back)."
|
|
25409
|
+
)
|
|
25385
25410
|
});
|
|
25386
|
-
var
|
|
25387
|
-
enabled: external_exports.boolean().describe(
|
|
25388
|
-
|
|
25411
|
+
var AgentCommandsSchema = external_exports.strictObject({
|
|
25412
|
+
enabled: external_exports.boolean().describe(
|
|
25413
|
+
"(Beta) Typing an agent's own command on this PC (claude, codex, ...) starts it in a hidden sandbox for the folder you are in and attaches that terminal. Adds one folder to the start of YOUR PATH; off removes it. SANDBOX_AGENT_DIRECT=1 runs the real agent instead."
|
|
25414
|
+
),
|
|
25415
|
+
agents: external_exports.union([external_exports.literal("auto"), external_exports.array(NameSchema)]).describe('"auto" = every agent installed on this PC, or a list of agent names, e.g. ["claude", "codex"].')
|
|
25389
25416
|
});
|
|
25390
|
-
var
|
|
25417
|
+
var ClaudeProfileSchema = external_exports.strictObject({
|
|
25391
25418
|
enabled: external_exports.boolean().describe("Copy selected Claude settings from this PC into the sandbox."),
|
|
25392
25419
|
hostDir: external_exports.string().describe('Your Claude folder, or "auto" (~/.claude or CLAUDE_CONFIG_DIR).'),
|
|
25393
25420
|
include: external_exports.array(external_exports.string().regex(/^[A-Za-z0-9._-]+$/)).describe("Files and folders copied from it."),
|
|
@@ -25395,25 +25422,37 @@ var ClaudeProfile = external_exports.strictObject({
|
|
|
25395
25422
|
copyCredentials: external_exports.boolean().describe("Copy your Claude LOGIN into the sandbox. Prefer sandbox account instead."),
|
|
25396
25423
|
overwrite: external_exports.boolean().describe("Refresh these settings from this PC on every launch."),
|
|
25397
25424
|
syncHistory: external_exports.boolean().describe("Bring conversation history in, and sync new history back (path-translated)."),
|
|
25398
|
-
historyScope: external_exports.enum(["project", "all"]).describe(
|
|
25425
|
+
historyScope: external_exports.enum(["project", "all"]).describe(
|
|
25426
|
+
`Which history comes in: "project" = only the projects in this sandbox (other projects' conversations, file backups and prompts stay on this PC), "all" = everything. Only this sandbox's projects ever sync back.`
|
|
25427
|
+
),
|
|
25399
25428
|
syncClaudeMem: external_exports.boolean().describe("Bring claude-mem data into the sandbox (its settings and backups stay on this PC)."),
|
|
25400
|
-
syncClaudeMemBack: external_exports.boolean().describe(
|
|
25429
|
+
syncClaudeMemBack: external_exports.boolean().describe(
|
|
25430
|
+
"Also copy claude-mem's database back to this PC when the sandbox closes. Off by default: what is in it is loaded into every Claude session on this PC, so a compromised agent could plant instructions there."
|
|
25431
|
+
)
|
|
25401
25432
|
});
|
|
25402
25433
|
|
|
25403
25434
|
// src/core/schema/sandbox.ts
|
|
25404
|
-
var
|
|
25405
|
-
|
|
25435
|
+
var GuestWorkspaceSchema = external_exports.union([external_exports.literal("auto"), external_exports.literal("mirror"), GuestPathSchema]).describe(
|
|
25436
|
+
'Where the workspace appears inside the sandbox. "auto" = C:\\Workspace\\<folder name>. "mirror" = the same path as on this PC, so absolute paths in configs and build caches match (another drive letter such as F: is a subst drive onto C:\\Mirror\\F); paths the sandbox reserves (C:\\Users\\..., C:\\Program Files\\...) fall back to "auto".'
|
|
25437
|
+
);
|
|
25438
|
+
var MappingSchema = external_exports.strictObject({
|
|
25406
25439
|
host: external_exports.string().min(1).describe("Folder on this PC (relative paths are relative to the config file)."),
|
|
25407
|
-
guest:
|
|
25440
|
+
guest: external_exports.string().min(1).max(1024).optional().describe(
|
|
25441
|
+
"Where it appears inside the sandbox, e.g. C:\\Assets, or on another drive letter (D: to Z:) such as F:\\SteamLibrary\\steamapps\\common\\Game (shown as F: at boot). Leave it out to use the same path as on this PC (a folder inside the project stays where it is in the project). A full path only; one the sandbox cannot use (C:\\Windows\\..., C:\\Users\\..., one already in use) stops the launch with the fix."
|
|
25442
|
+
),
|
|
25408
25443
|
readOnly: external_exports.boolean().describe("true = the agent can only read it."),
|
|
25409
25444
|
optional: external_exports.boolean().optional().describe("true = skip it quietly when the host folder does not exist.")
|
|
25410
25445
|
});
|
|
25411
|
-
var
|
|
25446
|
+
var SandboxSchema = external_exports.strictObject({
|
|
25412
25447
|
memoryMb: external_exports.union([external_exports.literal("auto"), external_exports.number().int().min(2048)]).describe('Sandbox RAM in MB (>= 2048), or "auto": free RAM minus reserveHostMb, capped at maxMemoryMb.'),
|
|
25413
25448
|
maxMemoryMb: external_exports.number().int().positive().describe('Upper limit for memoryMb "auto".'),
|
|
25414
25449
|
maxMemoryPercent: external_exports.number().int().min(10).max(100).describe(`memoryMb "auto" never takes more than this share of this PC's total RAM (percent).`),
|
|
25415
|
-
cpuLimit: external_exports.union([external_exports.literal("none"), external_exports.number().int().min(5).max(100)]).describe(
|
|
25416
|
-
|
|
25450
|
+
cpuLimit: external_exports.union([external_exports.literal("none"), external_exports.number().int().min(5).max(100)]).describe(
|
|
25451
|
+
`Most of this PC's CPU the sandbox may use, in percent (5-100), e.g. 50 keeps half free for you; "none" = no cap (Windows Sandbox would take every processor). Covers everything this tool starts in the sandbox (agents, installs, builds, its terminal).`
|
|
25452
|
+
),
|
|
25453
|
+
pageFileMb: external_exports.number().int().min(0).max(262144).describe(
|
|
25454
|
+
`Size of the sandbox's paging file in MB, created at full size when it starts so it never grows while builds run (8 GB of its disk always stays free). Windows Sandbox starts with about 1 GB: parallel builds then fail with "The paging file is too small", and Windows grows the file under load. 0 = leave Windows' own.`
|
|
25455
|
+
),
|
|
25417
25456
|
reserveHostMb: external_exports.number().int().nonnegative().describe('RAM always left for this PC when memoryMb is "auto".'),
|
|
25418
25457
|
vGpu: external_exports.boolean().describe("Virtual GPU. Off by default: Microsoft notes it widens the sandbox attack surface."),
|
|
25419
25458
|
networking: external_exports.boolean().describe("Internet access. false is the only hard network isolation Windows Sandbox offers."),
|
|
@@ -25422,215 +25461,964 @@ var Sandbox = external_exports.strictObject({
|
|
|
25422
25461
|
videoInput: external_exports.boolean().describe("Camera access."),
|
|
25423
25462
|
printerRedirection: external_exports.boolean().describe("Printers from this PC."),
|
|
25424
25463
|
protectedClient: external_exports.boolean().describe("Run the sandbox window in Protected Client mode (recommended)."),
|
|
25425
|
-
headless: external_exports.boolean().describe(
|
|
25426
|
-
|
|
25464
|
+
headless: external_exports.boolean().describe(
|
|
25465
|
+
"Hide the sandbox window (sbx-show brings it back). A headless sandbox shuts down when its last session ends."
|
|
25466
|
+
),
|
|
25467
|
+
keepAwake: external_exports.boolean().describe(
|
|
25468
|
+
"Keep this PC from sleeping while a sandbox runs, so agents left working overnight keep going (the screen may still turn off; closing a laptop lid still sleeps it)."
|
|
25469
|
+
)
|
|
25427
25470
|
});
|
|
25428
|
-
var
|
|
25429
|
-
var
|
|
25430
|
-
|
|
25471
|
+
var PortSchema2 = external_exports.number().int().min(1).max(65535);
|
|
25472
|
+
var HostEntrySchema = external_exports.string().max(253).regex(
|
|
25473
|
+
/^(@developer|(\*\.)?([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+)$/,
|
|
25474
|
+
"a host name like example.com, *.example.com, or @developer"
|
|
25475
|
+
);
|
|
25476
|
+
var NetworkSchema = external_exports.strictObject({
|
|
25431
25477
|
blockPrivateRanges: external_exports.boolean().describe("Block your LAN (10/8, 172.16/12, 192.168/16, SMB) from inside the sandbox."),
|
|
25432
|
-
allowOnly: external_exports.array(
|
|
25433
|
-
|
|
25434
|
-
|
|
25435
|
-
|
|
25436
|
-
|
|
25437
|
-
|
|
25478
|
+
allowOnly: external_exports.array(HostEntrySchema).describe(
|
|
25479
|
+
"Only these hosts can be reached once the sandbox is set up (tools still download first). *.example.com covers its subdomains; @developer adds package registries, GitHub, toolchain downloads and the AI providers. Programs go through a proxy in the sandbox (HTTP_PROXY); anything else is blocked by its firewall. Empty = no limit."
|
|
25480
|
+
),
|
|
25481
|
+
blockHosts: external_exports.array(
|
|
25482
|
+
external_exports.string().max(253).regex(/^([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+$/, "a host name like telemetry.example.com")
|
|
25483
|
+
).describe(
|
|
25484
|
+
"Never reachable from the sandbox, e.g. production servers or telemetry (each exact name; the sandbox's hosts file sends them nowhere)."
|
|
25485
|
+
),
|
|
25486
|
+
forwardPorts: external_exports.array(
|
|
25487
|
+
external_exports.strictObject({
|
|
25488
|
+
pc: PortSchema2.describe("The port on this PC (localhost only)."),
|
|
25489
|
+
sandbox: PortSchema2.describe("The port inside the sandbox (a server there may listen on localhost only).")
|
|
25490
|
+
})
|
|
25491
|
+
).describe(
|
|
25492
|
+
"Reach servers in the sandbox from this PC: http://localhost:<pc> here goes to <sandbox> inside, while it runs. Nothing else on your network can use them."
|
|
25493
|
+
),
|
|
25438
25494
|
dns: external_exports.array(external_exports.string().regex(/^\d{1,3}(\.\d{1,3}){3}$/, "an IPv4 address like 1.1.1.1")).describe("DNS servers for the sandbox instead of your network's, e.g. 1.1.1.1 and 9.9.9.9."),
|
|
25439
|
-
proxy: external_exports.string().regex(/^(https?:\/\/[^\s]+)?$/, "http://host:port").describe(
|
|
25495
|
+
proxy: external_exports.string().regex(/^(https?:\/\/[^\s]+)?$/, "http://host:port").describe(
|
|
25496
|
+
"An HTTP proxy the sandbox uses to reach the internet (HTTP_PROXY / HTTPS_PROXY for everything in it), e.g. http://proxy.corp:8080. Empty = none."
|
|
25497
|
+
)
|
|
25440
25498
|
});
|
|
25441
|
-
var
|
|
25442
|
-
enabled: external_exports.boolean().describe(
|
|
25499
|
+
var AuditSchema = external_exports.strictObject({
|
|
25500
|
+
enabled: external_exports.boolean().describe(
|
|
25501
|
+
"Keep an audit log on this PC of what happened in your sandboxes: programs started (with their command lines), files changed in the project, sessions, and what the repo guard caught. The sandbox cannot change it. Read it with sandbox audit."
|
|
25502
|
+
),
|
|
25443
25503
|
days: external_exports.number().int().min(1).max(365).describe("Days the audit log is kept."),
|
|
25444
25504
|
maxMb: external_exports.number().int().min(5).max(5e3).describe("Most space the audit log may take, in MB (older days go first). Days before today are compressed."),
|
|
25445
|
-
processes: external_exports.boolean().describe(
|
|
25505
|
+
processes: external_exports.boolean().describe(
|
|
25506
|
+
"Record every program started in the sandbox with its command line (Windows process auditing; repeated runs are counted, not listed)."
|
|
25507
|
+
),
|
|
25446
25508
|
files: external_exports.boolean().describe("Record the files changed in the project while the sandbox runs.")
|
|
25447
25509
|
});
|
|
25448
|
-
var
|
|
25449
|
-
enabled: external_exports.boolean().describe(
|
|
25510
|
+
var WorkspaceFilterSchema = external_exports.strictObject({
|
|
25511
|
+
enabled: external_exports.boolean().describe(
|
|
25512
|
+
"Keep what your .gitignore lists (.env files, node_modules, build output ...) out of the sandbox. The sandbox works on a copy of the project without those files, kept in step with it both ways within about a second; what it creates that is ignored (its own node_modules, builds) stays in the sandbox. Git works as usual. Off = the project folder itself is mapped."
|
|
25513
|
+
),
|
|
25450
25514
|
exclude: external_exports.array(external_exports.string().max(500)).describe("Also keep these out, as .gitignore patterns, e.g. secrets/, *.pem, data/private/."),
|
|
25451
25515
|
include: external_exports.array(external_exports.string().max(500)).describe("Let these in although .gitignore lists them, e.g. .env.example, data/fixtures/.")
|
|
25452
25516
|
});
|
|
25453
|
-
var
|
|
25454
|
-
|
|
25517
|
+
var GitSchema = external_exports.strictObject({
|
|
25518
|
+
enabled: external_exports.boolean().describe("Provide Git for Windows (and Git Bash, which Claude Code needs)."),
|
|
25519
|
+
access: GitAccessSchema
|
|
25520
|
+
});
|
|
25521
|
+
var ProvisioningSchema = external_exports.strictObject({
|
|
25455
25522
|
copyFromHost: external_exports.boolean().describe("Copy Node, Git, nvm and the agent from this PC when they are installed here."),
|
|
25456
25523
|
fallbackToInstall: external_exports.boolean().describe("Download anything that cannot be copied from this PC."),
|
|
25457
25524
|
refresh: external_exports.boolean().describe("Re-copy / re-download everything on the next launch."),
|
|
25458
|
-
git:
|
|
25525
|
+
git: GitSchema,
|
|
25459
25526
|
terminal: toggle("Windows Terminal as the sandbox window (downloaded once)."),
|
|
25460
|
-
conpty: toggle(
|
|
25527
|
+
conpty: toggle(
|
|
25528
|
+
"Agent sessions use Microsoft's newer pseudo console (conpty.dll, downloaded once) instead of the one built into Windows: no garbled screen after resizing, real scrollback for the mouse wheel. Off = the one built into Windows."
|
|
25529
|
+
)
|
|
25461
25530
|
});
|
|
25462
|
-
var
|
|
25463
|
-
requireChecksum: external_exports.boolean().describe(
|
|
25531
|
+
var DownloadsSchema = external_exports.strictObject({
|
|
25532
|
+
requireChecksum: external_exports.boolean().describe(
|
|
25533
|
+
"Refuse any toolchain, database or tool download that has no published checksum (SHA-256/SHA-512) to verify it against. false = allow those, as before. Downloads that do have a published checksum are always verified. A project's .sandbox-config.json can only turn this on."
|
|
25534
|
+
)
|
|
25464
25535
|
});
|
|
25465
25536
|
|
|
25466
25537
|
// src/core/schema/toolchains.ts
|
|
25467
|
-
var
|
|
25538
|
+
var ToolchainsSchema = external_exports.strictObject({
|
|
25468
25539
|
node: external_exports.strictObject({
|
|
25469
|
-
version: external_exports.string().min(1).describe(
|
|
25470
|
-
|
|
25540
|
+
version: external_exports.string().min(1).describe(
|
|
25541
|
+
`Default Node version for nvm. "host" = the Node on this PC. A project's .nvmrc / .node-version wins.`
|
|
25542
|
+
),
|
|
25543
|
+
extraVersions: StringsSchema.describe(
|
|
25544
|
+
"More Node versions to install (switch with nvm use). On top of the up to 3 versions copied from this PC's nvm, not counted towards that limit."
|
|
25545
|
+
),
|
|
25471
25546
|
corepack: external_exports.boolean().describe(`pnpm and yarn through corepack (a project's "packageManager" in package.json picks the version).`),
|
|
25472
|
-
volta:
|
|
25473
|
-
|
|
25547
|
+
volta: EnabledSchema.describe(
|
|
25548
|
+
`Volta: true, false, or "auto" = when the project's package.json has "volta" pins or this PC uses Volta. With pins, Volta's node/npm/yarn/pnpm come first on PATH.`
|
|
25549
|
+
),
|
|
25550
|
+
globalPackages: Packages(
|
|
25551
|
+
"npm packages installed globally into the default Node version",
|
|
25552
|
+
'["typescript", "npm-check-updates"]'
|
|
25553
|
+
)
|
|
25474
25554
|
}),
|
|
25475
25555
|
python: external_exports.strictObject({
|
|
25476
|
-
enabled: enabled(
|
|
25556
|
+
enabled: enabled(
|
|
25557
|
+
"Python 3 (CPython with pip).",
|
|
25558
|
+
"pyproject.toml, requirements.txt, setup.py, Pipfile or .python-version"
|
|
25559
|
+
),
|
|
25477
25560
|
version: external_exports.string().min(1).describe(`Python 3 version prefix, e.g. "3" or "3.12". A project's .python-version wins.`),
|
|
25478
25561
|
python2: external_exports.boolean().describe("Also install Python 2.7 as python2 / pip2."),
|
|
25479
|
-
pyenv:
|
|
25480
|
-
|
|
25562
|
+
pyenv: EnabledSchema.describe(
|
|
25563
|
+
'pyenv-win (pyenv install / local / global): true, false, or "auto" = when this PC uses pyenv. .python-version is honoured either way, and `uv python install` always works.'
|
|
25564
|
+
),
|
|
25565
|
+
tools: Packages(
|
|
25566
|
+
"Python command-line tools installed with `uv tool install` (needs uv)",
|
|
25567
|
+
'["poetry", "ruff", "pre-commit"]'
|
|
25568
|
+
)
|
|
25481
25569
|
}),
|
|
25482
25570
|
rust: external_exports.strictObject({
|
|
25483
25571
|
enabled: enabled("Rust via rustup (cargo, rustc).", "Cargo.toml or rust-toolchain(.toml)"),
|
|
25484
25572
|
toolchain: external_exports.string().min(1).describe('Default toolchain, e.g. "stable". rust-toolchain.toml in a project wins.'),
|
|
25485
|
-
host: external_exports.string().min(1).describe(
|
|
25573
|
+
host: external_exports.string().min(1).describe(
|
|
25574
|
+
'Host triple, or "auto": x86_64-pc-windows-msvc when the MSVC toolchain is on (like most PCs), else x86_64-pc-windows-gnu (MinGW is its linker).'
|
|
25575
|
+
),
|
|
25486
25576
|
components: Packages("Extra rustup components", '["rust-src", "llvm-tools"]'),
|
|
25487
25577
|
targets: Packages("Extra rustup targets", '["wasm32-unknown-unknown"]'),
|
|
25488
|
-
crates: Packages(
|
|
25489
|
-
|
|
25578
|
+
crates: Packages(
|
|
25579
|
+
"Binaries for cargo: prebuilt via cargo-binstall when the crate publishes a Windows build, else compiled with `cargo install --locked` (slow the first time)",
|
|
25580
|
+
'["sccache", "cargo-nextest", "cargo-deny"]'
|
|
25581
|
+
),
|
|
25582
|
+
targetDir: external_exports.string().min(1).describe(
|
|
25583
|
+
`"shared": cargo's default target\\ (shared with builds on this PC, so builds on either side invalidate the other), "separate": <workspace>\\target\\sandbox (kept, no cross-talk), "local": on the sandbox's own disk (fastest, lost every boot), or a guest path.`
|
|
25584
|
+
),
|
|
25585
|
+
linker: external_exports.enum(["lld", "gnu"]).describe(
|
|
25586
|
+
`GNU host: "lld" links with Rust's own lld through MinGW's gcc (much less memory than GNU ld), "gnu" with GNU ld.`
|
|
25587
|
+
),
|
|
25588
|
+
linkSlots: external_exports.union([external_exports.literal("auto"), external_exports.number().int().min(1).max(32)]).describe(
|
|
25589
|
+
'GNU host: how many programs may link at the same time in the whole sandbox (other links wait). "auto" = one per 8 GB of sandbox memory, 2 to 4. Several agents linking big programs at once can take Windows down.'
|
|
25590
|
+
)
|
|
25490
25591
|
}),
|
|
25491
25592
|
msvc: external_exports.strictObject({
|
|
25492
|
-
enabled: enabled(
|
|
25493
|
-
|
|
25593
|
+
enabled: enabled(
|
|
25594
|
+
"MSVC (cl, link) and the Windows SDK, portable from Microsoft's Visual Studio manifest (~1-2 GB once), with vcvars64.bat and vswhere.",
|
|
25595
|
+
"a .vcxproj, CMakePresets.json, a script calling vcvars/vswhere, or a Rust project when this PC builds Rust with MSVC"
|
|
25596
|
+
),
|
|
25597
|
+
acceptLicense: external_exports.boolean().describe(
|
|
25598
|
+
"Required to install MSVC: you accept the Visual Studio licence terms (https://visualstudio.microsoft.com/license-terms/), which need a Visual Studio licence."
|
|
25599
|
+
),
|
|
25494
25600
|
msvcVersion: external_exports.string().min(1).describe('"latest" or an MSVC tools version prefix, e.g. "14.44".'),
|
|
25495
25601
|
sdkVersion: external_exports.string().min(1).describe('"latest" or a Windows SDK build, e.g. "26100" or "10.0.22621".')
|
|
25496
25602
|
}),
|
|
25497
25603
|
cpp: external_exports.strictObject({
|
|
25498
|
-
enabled: enabled(
|
|
25499
|
-
|
|
25604
|
+
enabled: enabled(
|
|
25605
|
+
"MinGW-w64 GCC with CMake, Ninja, premake5 and mingw32-make (also Rust's linker).",
|
|
25606
|
+
"CMakeLists.txt, Makefile, meson.build, premake5.lua or Cargo.toml"
|
|
25607
|
+
),
|
|
25608
|
+
flexBison: external_exports.boolean().describe(
|
|
25609
|
+
"win_flex / win_bison, the parser generators many C/C++ projects (game engines among them) need; CMake finds them."
|
|
25610
|
+
)
|
|
25500
25611
|
}),
|
|
25501
25612
|
dotnet: external_exports.strictObject({
|
|
25502
25613
|
enabled: enabled(".NET SDK (C#, F#).", "a .sln, .slnx, .csproj, .fsproj or global.json"),
|
|
25503
|
-
channels:
|
|
25614
|
+
channels: StringsSchema.describe(`SDK channels, e.g. ["LTS", "8.0"]. A project's global.json is installed too.`),
|
|
25504
25615
|
tools: Packages("Global .NET tools (`dotnet tool install -g`)", '["dotnet-ef", "csharpier"]'),
|
|
25505
25616
|
workloads: Packages("SDK workloads (`dotnet workload install`)", '["aspire", "wasm-tools"]'),
|
|
25506
|
-
frameworkTargets:
|
|
25507
|
-
|
|
25617
|
+
frameworkTargets: StringsSchema.describe(
|
|
25618
|
+
'.NET Framework reference assemblies (targeting packs) from NuGet, so net4x and old-style .csproj projects build without Visual Studio, e.g. ["net48", "net472", "net462"]. The 4.8 runtime itself ships with Windows.'
|
|
25619
|
+
),
|
|
25620
|
+
netfx35: external_exports.boolean().describe(
|
|
25621
|
+
".NET Framework 3.5 runtime (a Windows feature, enabled from Windows Update on every boot; a few minutes)."
|
|
25622
|
+
)
|
|
25508
25623
|
}),
|
|
25509
25624
|
go: external_exports.strictObject({
|
|
25510
25625
|
enabled: enabled("Go.", "go.mod or go.work"),
|
|
25511
|
-
version: external_exports.string().min(1).describe(
|
|
25626
|
+
version: external_exports.string().min(1).describe(
|
|
25627
|
+
'"stable" or a version prefix such as "1.23". A go.mod asking for newer fetches it itself (GOTOOLCHAIN=auto).'
|
|
25628
|
+
),
|
|
25512
25629
|
tools: Packages("Go tools (`go install <path>@<version>`)", '["golang.org/x/tools/gopls@latest"]')
|
|
25513
25630
|
}),
|
|
25514
25631
|
java: external_exports.strictObject({
|
|
25515
|
-
enabled: enabled(
|
|
25632
|
+
enabled: enabled(
|
|
25633
|
+
"Java: Eclipse Temurin JDK.",
|
|
25634
|
+
"pom.xml, build.gradle(.kts), settings.gradle(.kts), mvnw, gradlew or .java-version"
|
|
25635
|
+
),
|
|
25516
25636
|
version: external_exports.string().min(1).describe(`"lts" (newest LTS) or a major version such as "21". A project's .java-version or .sdkmanrc wins.`),
|
|
25517
25637
|
maven: external_exports.boolean().describe("Apache Maven (mvn). A project's mvnw works either way."),
|
|
25518
25638
|
gradle: external_exports.boolean().describe("Gradle (gradle). A project's gradlew works either way.")
|
|
25519
25639
|
}),
|
|
25520
25640
|
ruby: external_exports.strictObject({
|
|
25521
|
-
enabled: enabled(
|
|
25641
|
+
enabled: enabled(
|
|
25642
|
+
"Ruby (RubyInstaller, with gem and bundler). Gems with C extensions need MSYS2, which is not included.",
|
|
25643
|
+
"Gemfile, a .gemspec or .ruby-version"
|
|
25644
|
+
),
|
|
25522
25645
|
version: external_exports.string().min(1).describe(`Version prefix, e.g. "3" or "3.3". A project's .ruby-version wins.`),
|
|
25523
25646
|
gems: Packages("Gems installed globally", '["rubocop"]')
|
|
25524
25647
|
}),
|
|
25525
25648
|
php: external_exports.strictObject({
|
|
25526
|
-
enabled: enabled(
|
|
25649
|
+
enabled: enabled(
|
|
25650
|
+
"PHP (with the Visual C++ runtime it needs, installed on every boot).",
|
|
25651
|
+
"composer.json, artisan or .php-version"
|
|
25652
|
+
),
|
|
25527
25653
|
version: external_exports.string().min(1).describe(`Version prefix, e.g. "8" or "8.3". A project's .php-version wins.`),
|
|
25528
25654
|
composer: external_exports.boolean().describe("Composer.")
|
|
25529
25655
|
}),
|
|
25530
25656
|
deno: external_exports.strictObject({ enabled: enabled("Deno.", "deno.json, deno.jsonc or deno.lock") }),
|
|
25531
|
-
pwsh: external_exports.strictObject({
|
|
25657
|
+
pwsh: external_exports.strictObject({
|
|
25658
|
+
enabled: EnabledSchema.describe(
|
|
25659
|
+
'PowerShell 7 (pwsh), portable (~110 MB once); `powershell` stays Windows PowerShell 5.1. true, false, or "auto" = when a .ps1 at the root or one folder down has #Requires -Version 7 / -PSEdition Core or a `pwsh ...` usage line, or, in a folder that is no project yet, when this PC has PowerShell 7.'
|
|
25660
|
+
)
|
|
25661
|
+
}),
|
|
25532
25662
|
cli: external_exports.strictObject({
|
|
25533
|
-
gh:
|
|
25534
|
-
|
|
25535
|
-
|
|
25663
|
+
gh: EnabledSchema.describe(
|
|
25664
|
+
'GitHub CLI (gh). Only with provisioning.git.access "full": gh can push and merge through the GitHub API, past a read-only git. Your PC\'s gh login is never copied; `gh auth login` inside persists (GH_CONFIG_DIR). "auto" = when the project has a .github folder.'
|
|
25665
|
+
),
|
|
25666
|
+
zstd: EnabledSchema.describe('Zstandard (zstd). "auto" = off; set true to get it.'),
|
|
25667
|
+
openssl: EnabledSchema.describe(
|
|
25668
|
+
'`openssl` on PATH, from the copy Git for Windows ships (its mingw64\\bin is not put on PATH, so it cannot shadow MinGW\'s gcc). "auto" = on.'
|
|
25669
|
+
)
|
|
25536
25670
|
}).describe("Small portable command-line tools from their GitHub releases, installed once into tools\\cli."),
|
|
25537
25671
|
bun: toggle("Bun runtime (claude-mem needs it)."),
|
|
25538
25672
|
uv: toggle("uv, the Python package manager (claude-mem needs it)."),
|
|
25539
|
-
vcRuntime: toggle(
|
|
25673
|
+
vcRuntime: toggle(
|
|
25674
|
+
"Microsoft Visual C++ runtime for tools that need it (a real installer, so it runs on every boot, ~15 s). PHP installs it regardless."
|
|
25675
|
+
),
|
|
25540
25676
|
mesa: external_exports.strictObject({
|
|
25541
|
-
enabled: external_exports.boolean().describe(
|
|
25542
|
-
|
|
25677
|
+
enabled: external_exports.boolean().describe(
|
|
25678
|
+
"Mesa 3D (llvmpipe): OpenGL 4.5 in software for games and apps when there is no GPU (sandbox.vGpu off). Copy opengl32.dll and libgallium_wgl.dll from %MESA_DIR% next to the program's .exe."
|
|
25679
|
+
),
|
|
25680
|
+
vulkan: external_exports.boolean().describe(
|
|
25681
|
+
"Also software Vulkan 1.4 (Mesa lavapipe) with the Khronos loader, registered for every program; for wgpu set WGPU_BACKEND=vulkan."
|
|
25682
|
+
)
|
|
25543
25683
|
}),
|
|
25544
25684
|
vscode: external_exports.strictObject({
|
|
25545
|
-
enabled: external_exports.boolean().describe(
|
|
25546
|
-
|
|
25685
|
+
enabled: external_exports.boolean().describe(
|
|
25686
|
+
"Portable VS Code inside the sandbox (code on PATH, desktop shortcut); its settings and extensions persist."
|
|
25687
|
+
),
|
|
25688
|
+
setup: external_exports.boolean().describe(
|
|
25689
|
+
"Point VS Code at the sandbox's own tools (JDK, Python, Go, compilers, .NET, Git, PowerShell 7 and Git Bash terminals) and install the language extensions for the toolchains in use."
|
|
25690
|
+
),
|
|
25547
25691
|
recommended: external_exports.boolean().describe("Also install the extensions a project recommends in its .vscode/extensions.json."),
|
|
25548
25692
|
extensions: external_exports.array(external_exports.string().regex(/^[\w-]+\.[\w-]+$/, "publisher.name, e.g. eamodio.gitlens")).describe("More extensions to install in every sandbox, e.g. eamodio.gitlens, ms-azuretools.vscode-docker.")
|
|
25549
25693
|
}),
|
|
25550
|
-
environment: external_exports.record(external_exports.string().regex(/^[A-Za-z_][A-Za-z0-9_]*$/, "letters, digits and _ only"), external_exports.string()).describe(
|
|
25694
|
+
environment: external_exports.record(external_exports.string().regex(/^[A-Za-z_][A-Za-z0-9_]*$/, "letters, digits and _ only"), external_exports.string()).describe(
|
|
25695
|
+
'Extra environment variables for the agent and every terminal, e.g. registry mirrors: {"NPM_CONFIG_REGISTRY": "https://...", "PIP_INDEX_URL": "https://..."}.'
|
|
25696
|
+
)
|
|
25551
25697
|
});
|
|
25552
25698
|
|
|
25553
|
-
// src/shared/apps.ts
|
|
25699
|
+
// src/shared/apps/catalogue.ts
|
|
25554
25700
|
var gh = (github, asset) => ({ github, asset });
|
|
25555
25701
|
var APPS = [
|
|
25556
25702
|
// ---- editors
|
|
25557
|
-
{
|
|
25558
|
-
|
|
25559
|
-
|
|
25560
|
-
|
|
25561
|
-
|
|
25703
|
+
{
|
|
25704
|
+
id: "vscode",
|
|
25705
|
+
name: "Visual Studio Code",
|
|
25706
|
+
category: "editors",
|
|
25707
|
+
about: "Code editor with debugging, set up for the sandbox's languages.",
|
|
25708
|
+
size: "150 MB",
|
|
25709
|
+
source: { resolve: "setting" },
|
|
25710
|
+
exe: "Code.exe",
|
|
25711
|
+
setting: "toolchains.vscode.enabled"
|
|
25712
|
+
},
|
|
25713
|
+
{
|
|
25714
|
+
id: "windows-terminal",
|
|
25715
|
+
name: "Windows Terminal",
|
|
25716
|
+
category: "utilities",
|
|
25717
|
+
about: "The sandbox window: tabs, panes, PowerShell 7 profile.",
|
|
25718
|
+
size: "40 MB",
|
|
25719
|
+
source: { resolve: "setting" },
|
|
25720
|
+
exe: "WindowsTerminal.exe",
|
|
25721
|
+
setting: "provisioning.terminal.enabled"
|
|
25722
|
+
},
|
|
25723
|
+
{
|
|
25724
|
+
id: "notepadpp",
|
|
25725
|
+
name: "Notepad++",
|
|
25726
|
+
category: "editors",
|
|
25727
|
+
about: "Fast text and code editor.",
|
|
25728
|
+
size: "8 MB",
|
|
25729
|
+
source: gh("notepad-plus-plus/notepad-plus-plus", "^npp\\.[\\d.]+\\.portable\\.x64\\.zip$"),
|
|
25730
|
+
exe: "notepad++.exe"
|
|
25731
|
+
},
|
|
25732
|
+
{
|
|
25733
|
+
id: "sublime",
|
|
25734
|
+
name: "Sublime Text",
|
|
25735
|
+
category: "editors",
|
|
25736
|
+
about: "Fast code editor (paid licence, free to evaluate).",
|
|
25737
|
+
size: "28 MB",
|
|
25738
|
+
source: { resolve: "sublime" },
|
|
25739
|
+
exe: "sublime_text.exe"
|
|
25740
|
+
},
|
|
25741
|
+
{
|
|
25742
|
+
id: "neovim",
|
|
25743
|
+
name: "Neovim",
|
|
25744
|
+
category: "editors",
|
|
25745
|
+
about: "Terminal text editor (nvim).",
|
|
25746
|
+
size: "12 MB",
|
|
25747
|
+
source: gh("neovim/neovim", "^nvim-win64\\.zip$"),
|
|
25748
|
+
exe: "nvim.exe",
|
|
25749
|
+
cli: true
|
|
25750
|
+
},
|
|
25562
25751
|
// ---- database clients
|
|
25563
|
-
{
|
|
25564
|
-
|
|
25565
|
-
|
|
25566
|
-
|
|
25567
|
-
|
|
25568
|
-
|
|
25569
|
-
|
|
25570
|
-
|
|
25571
|
-
|
|
25752
|
+
{
|
|
25753
|
+
id: "dbeaver",
|
|
25754
|
+
name: "DBeaver Community",
|
|
25755
|
+
category: "databases",
|
|
25756
|
+
about: "Universal database client: PostgreSQL, MySQL, SQLite, SQL Server and more.",
|
|
25757
|
+
size: "120 MB",
|
|
25758
|
+
source: gh("dbeaver/dbeaver", "^dbeaver-ce-[\\d.]+-windows-x86_64\\.zip$"),
|
|
25759
|
+
exe: "dbeaver.exe"
|
|
25760
|
+
},
|
|
25761
|
+
{
|
|
25762
|
+
id: "pgadmin",
|
|
25763
|
+
name: "pgAdmin 4",
|
|
25764
|
+
category: "databases",
|
|
25765
|
+
about: "The PostgreSQL admin GUI (from the PostgreSQL binaries zip).",
|
|
25766
|
+
size: "330 MB",
|
|
25767
|
+
source: { resolve: "pgadmin" },
|
|
25768
|
+
exe: "pgAdmin4.exe"
|
|
25769
|
+
},
|
|
25770
|
+
{
|
|
25771
|
+
id: "heidisql",
|
|
25772
|
+
name: "HeidiSQL",
|
|
25773
|
+
category: "databases",
|
|
25774
|
+
about: "Light client for MySQL, MariaDB, PostgreSQL and SQL Server.",
|
|
25775
|
+
size: "28 MB",
|
|
25776
|
+
source: gh("HeidiSQL/HeidiSQL", "^HeidiSQL_[\\d.]+_64_Portable\\.zip$"),
|
|
25777
|
+
exe: "heidisql.exe"
|
|
25778
|
+
},
|
|
25779
|
+
{
|
|
25780
|
+
id: "sqlitebrowser",
|
|
25781
|
+
name: "DB Browser for SQLite",
|
|
25782
|
+
category: "databases",
|
|
25783
|
+
about: "Open, browse and edit SQLite files.",
|
|
25784
|
+
size: "21 MB",
|
|
25785
|
+
source: gh("sqlitebrowser/sqlitebrowser", "^DB\\.Browser\\.for\\.SQLite-v?[\\d.]+-win64\\.zip$"),
|
|
25786
|
+
exe: "DB Browser for SQLite.exe"
|
|
25787
|
+
},
|
|
25788
|
+
{
|
|
25789
|
+
id: "compass",
|
|
25790
|
+
name: "MongoDB Compass",
|
|
25791
|
+
category: "databases",
|
|
25792
|
+
about: "The MongoDB GUI.",
|
|
25793
|
+
size: "220 MB",
|
|
25794
|
+
source: gh("mongodb-js/compass", "^mongodb-compass-[\\d.]+-win32-x64\\.zip$"),
|
|
25795
|
+
exe: "MongoDBCompass.exe"
|
|
25796
|
+
},
|
|
25797
|
+
{
|
|
25798
|
+
id: "redisinsight",
|
|
25799
|
+
name: "Redis Insight",
|
|
25800
|
+
category: "databases",
|
|
25801
|
+
about: "The Redis GUI.",
|
|
25802
|
+
size: "110 MB",
|
|
25803
|
+
source: gh("redis/RedisInsight", "^Redis-Insight-win-installer\\.exe$"),
|
|
25804
|
+
unpack: "nsis",
|
|
25805
|
+
exe: "Redis Insight.exe",
|
|
25806
|
+
needs: ["7zip"]
|
|
25807
|
+
},
|
|
25808
|
+
{
|
|
25809
|
+
id: "dbgate",
|
|
25810
|
+
name: "DbGate",
|
|
25811
|
+
category: "databases",
|
|
25812
|
+
about: "Database manager for SQL and NoSQL databases.",
|
|
25813
|
+
size: "180 MB",
|
|
25814
|
+
source: gh("dbgate/dbgate", "^dbgate-[\\d.]+-win_x64\\.zip$"),
|
|
25815
|
+
exe: "DbGate.exe"
|
|
25816
|
+
},
|
|
25817
|
+
{
|
|
25818
|
+
id: "beekeeper",
|
|
25819
|
+
name: "Beekeeper Studio",
|
|
25820
|
+
category: "databases",
|
|
25821
|
+
about: "SQL editor and database manager.",
|
|
25822
|
+
size: "245 MB",
|
|
25823
|
+
source: gh("beekeeper-studio/beekeeper-studio", "^Beekeeper-Studio-[\\d.]+-portable\\.exe$"),
|
|
25824
|
+
unpack: "nsis",
|
|
25825
|
+
exe: "Beekeeper Studio.exe",
|
|
25826
|
+
needs: ["7zip"]
|
|
25827
|
+
},
|
|
25828
|
+
{
|
|
25829
|
+
id: "dynamodb-admin",
|
|
25830
|
+
name: "dynamodb-admin",
|
|
25831
|
+
category: "databases",
|
|
25832
|
+
about: "Web GUI for DynamoDB Local: run dynamodb-admin, then open http://localhost:8001.",
|
|
25833
|
+
size: "5 MB",
|
|
25834
|
+
source: { npm: "dynamodb-admin" },
|
|
25835
|
+
exe: "dynamodb-admin.cmd",
|
|
25836
|
+
cli: true
|
|
25837
|
+
},
|
|
25572
25838
|
// ---- API clients
|
|
25573
|
-
{
|
|
25574
|
-
|
|
25839
|
+
{
|
|
25840
|
+
id: "bruno",
|
|
25841
|
+
name: "Bruno",
|
|
25842
|
+
category: "api",
|
|
25843
|
+
about: "Offline, git-friendly API client (collections are files in your repo).",
|
|
25844
|
+
size: "175 MB",
|
|
25845
|
+
source: gh("usebruno/bruno", "^bruno_[\\d.]+_x64_win\\.zip$"),
|
|
25846
|
+
exe: "Bruno.exe"
|
|
25847
|
+
},
|
|
25848
|
+
{
|
|
25849
|
+
id: "insomnia",
|
|
25850
|
+
name: "Insomnia",
|
|
25851
|
+
category: "api",
|
|
25852
|
+
about: "REST, GraphQL and gRPC client.",
|
|
25853
|
+
size: "590 MB",
|
|
25854
|
+
source: gh("Kong/insomnia", "^insomnia-[\\d.]+-full\\.nupkg$"),
|
|
25855
|
+
exe: "Insomnia.exe"
|
|
25856
|
+
},
|
|
25575
25857
|
// ---- git
|
|
25576
|
-
{
|
|
25577
|
-
|
|
25578
|
-
|
|
25858
|
+
{
|
|
25859
|
+
id: "sourcegit",
|
|
25860
|
+
name: "SourceGit",
|
|
25861
|
+
category: "git",
|
|
25862
|
+
about: "Fast open-source Git GUI.",
|
|
25863
|
+
size: "26 MB",
|
|
25864
|
+
source: gh("sourcegit-scm/sourcegit", "^sourcegit_[\\d.]+\\.win-x64\\.zip$"),
|
|
25865
|
+
exe: "SourceGit.exe"
|
|
25866
|
+
},
|
|
25867
|
+
{
|
|
25868
|
+
id: "githubdesktop",
|
|
25869
|
+
name: "GitHub Desktop",
|
|
25870
|
+
category: "git",
|
|
25871
|
+
about: 'Simple Git GUI from GitHub. It has its own git, so it needs provisioning.git.access "full".',
|
|
25872
|
+
size: "300 MB",
|
|
25873
|
+
source: gh("desktop/desktop", "^GitHubDesktop-[\\d.]+-x64-full\\.nupkg$"),
|
|
25874
|
+
exe: "GitHubDesktop.exe",
|
|
25875
|
+
fullGitOnly: true
|
|
25876
|
+
},
|
|
25877
|
+
{
|
|
25878
|
+
id: "lazygit",
|
|
25879
|
+
name: "lazygit",
|
|
25880
|
+
category: "git",
|
|
25881
|
+
about: "Git in the terminal.",
|
|
25882
|
+
size: "7 MB",
|
|
25883
|
+
source: gh("jesseduffield/lazygit", "^lazygit_[\\d.]+_windows_x86_64\\.zip$"),
|
|
25884
|
+
exe: "lazygit.exe",
|
|
25885
|
+
cli: true
|
|
25886
|
+
},
|
|
25579
25887
|
// ---- utilities
|
|
25580
|
-
{
|
|
25581
|
-
|
|
25582
|
-
|
|
25583
|
-
|
|
25584
|
-
|
|
25888
|
+
{
|
|
25889
|
+
id: "7zip",
|
|
25890
|
+
name: "7-Zip",
|
|
25891
|
+
category: "utilities",
|
|
25892
|
+
about: "Archive manager (7z, zip, rar, tar ...). Also unpacks installers for other apps.",
|
|
25893
|
+
size: "2 MB",
|
|
25894
|
+
source: { resolve: "7zip" },
|
|
25895
|
+
exe: "7zFM.exe"
|
|
25896
|
+
},
|
|
25897
|
+
{
|
|
25898
|
+
id: "winmerge",
|
|
25899
|
+
name: "WinMerge",
|
|
25900
|
+
category: "utilities",
|
|
25901
|
+
about: "Compare and merge files and folders.",
|
|
25902
|
+
size: "23 MB",
|
|
25903
|
+
source: gh("WinMerge/winmerge", "^winmerge-[\\d.]+-x64-exe\\.zip$"),
|
|
25904
|
+
exe: "WinMergeU.exe"
|
|
25905
|
+
},
|
|
25906
|
+
{
|
|
25907
|
+
id: "everything",
|
|
25908
|
+
name: "Everything",
|
|
25909
|
+
category: "utilities",
|
|
25910
|
+
about: "Finds files by name instantly.",
|
|
25911
|
+
size: "2 MB",
|
|
25912
|
+
source: { resolve: "everything" },
|
|
25913
|
+
exe: "Everything.exe"
|
|
25914
|
+
},
|
|
25915
|
+
{
|
|
25916
|
+
id: "sysinternals",
|
|
25917
|
+
name: "Sysinternals Suite",
|
|
25918
|
+
category: "utilities",
|
|
25919
|
+
about: "Process Explorer, Process Monitor, Autoruns, TCPView and more (on PATH).",
|
|
25920
|
+
size: "200 MB",
|
|
25921
|
+
source: { url: "https://download.sysinternals.com/files/SysinternalsSuite.zip" },
|
|
25922
|
+
exe: "procexp64.exe"
|
|
25923
|
+
},
|
|
25924
|
+
{
|
|
25925
|
+
id: "imhex",
|
|
25926
|
+
name: "ImHex",
|
|
25927
|
+
category: "utilities",
|
|
25928
|
+
about: "Hex editor for reverse engineering and binary formats.",
|
|
25929
|
+
size: "80 MB",
|
|
25930
|
+
source: gh("WerWolv/ImHex", "^imhex-[\\d.]+-Windows-Portable-NoGPU-x86_64\\.zip$"),
|
|
25931
|
+
exe: "imhex-gui.exe"
|
|
25932
|
+
},
|
|
25585
25933
|
// ---- browsers
|
|
25586
|
-
{
|
|
25587
|
-
|
|
25934
|
+
{
|
|
25935
|
+
id: "chrome",
|
|
25936
|
+
name: "Chrome for Testing",
|
|
25937
|
+
category: "browsers",
|
|
25938
|
+
about: "Chrome build made for automated tests (with chromedriver on PATH).",
|
|
25939
|
+
size: "170 MB",
|
|
25940
|
+
source: { resolve: "chrome" },
|
|
25941
|
+
exe: "chrome.exe"
|
|
25942
|
+
},
|
|
25943
|
+
{
|
|
25944
|
+
id: "firefox",
|
|
25945
|
+
name: "Firefox",
|
|
25946
|
+
category: "browsers",
|
|
25947
|
+
about: "Firefox for testing.",
|
|
25948
|
+
size: "75 MB",
|
|
25949
|
+
source: { resolve: "firefox" },
|
|
25950
|
+
unpack: "nsis",
|
|
25951
|
+
exe: "firefox.exe",
|
|
25952
|
+
needs: ["7zip"]
|
|
25953
|
+
},
|
|
25588
25954
|
// ---- game development
|
|
25589
|
-
{
|
|
25590
|
-
|
|
25591
|
-
|
|
25592
|
-
|
|
25593
|
-
|
|
25594
|
-
|
|
25955
|
+
{
|
|
25956
|
+
id: "godot",
|
|
25957
|
+
name: "Godot",
|
|
25958
|
+
category: "gamedev",
|
|
25959
|
+
about: "Open-source 2D and 3D game engine.",
|
|
25960
|
+
size: "80 MB",
|
|
25961
|
+
source: gh("godotengine/godot", "^Godot_v[\\d.]+-stable_win64\\.exe\\.zip$"),
|
|
25962
|
+
exe: "/^Godot_v[\\d.]+-stable_win64\\.exe$/",
|
|
25963
|
+
needs: ["mesa"]
|
|
25964
|
+
},
|
|
25965
|
+
{
|
|
25966
|
+
id: "blender",
|
|
25967
|
+
name: "Blender",
|
|
25968
|
+
category: "gamedev",
|
|
25969
|
+
about: "3D modelling, animation and rendering.",
|
|
25970
|
+
size: "400 MB",
|
|
25971
|
+
source: { resolve: "blender" },
|
|
25972
|
+
exe: "blender.exe",
|
|
25973
|
+
needs: ["mesa"]
|
|
25974
|
+
},
|
|
25975
|
+
{
|
|
25976
|
+
id: "love",
|
|
25977
|
+
name: "L\xD6VE",
|
|
25978
|
+
category: "gamedev",
|
|
25979
|
+
about: "Lua framework for 2D games.",
|
|
25980
|
+
size: "4 MB",
|
|
25981
|
+
source: gh("love2d/love", "^love-[\\d.]+-win64\\.zip$"),
|
|
25982
|
+
exe: "love.exe",
|
|
25983
|
+
needs: ["mesa"]
|
|
25984
|
+
},
|
|
25985
|
+
{
|
|
25986
|
+
id: "defold",
|
|
25987
|
+
name: "Defold",
|
|
25988
|
+
category: "gamedev",
|
|
25989
|
+
about: "Free 2D/3D game engine and editor.",
|
|
25990
|
+
size: "330 MB",
|
|
25991
|
+
source: gh("defold/defold", "^Defold-x86_64-win32\\.zip$"),
|
|
25992
|
+
exe: "Defold.exe",
|
|
25993
|
+
needs: ["mesa"]
|
|
25994
|
+
},
|
|
25995
|
+
{
|
|
25996
|
+
id: "pixelorama",
|
|
25997
|
+
name: "Pixelorama",
|
|
25998
|
+
category: "gamedev",
|
|
25999
|
+
about: "Pixel-art and sprite editor.",
|
|
26000
|
+
size: "40 MB",
|
|
26001
|
+
source: gh("Orama-Interactive/Pixelorama", "^Pixelorama-Windows-64bit\\.zip$"),
|
|
26002
|
+
exe: "Pixelorama.exe",
|
|
26003
|
+
needs: ["mesa"]
|
|
26004
|
+
},
|
|
26005
|
+
{
|
|
26006
|
+
id: "tiled",
|
|
26007
|
+
name: "Tiled",
|
|
26008
|
+
category: "gamedev",
|
|
26009
|
+
about: "Tile map editor.",
|
|
26010
|
+
size: "22 MB",
|
|
26011
|
+
source: gh("mapeditor/tiled", "^Tiled-[\\d.]+_Windows-10\\+_x86_64\\.msi$"),
|
|
26012
|
+
unpack: "msi",
|
|
26013
|
+
exe: "tiled.exe"
|
|
26014
|
+
},
|
|
25595
26015
|
// ---- cloud
|
|
25596
|
-
{
|
|
25597
|
-
|
|
25598
|
-
|
|
25599
|
-
|
|
25600
|
-
|
|
25601
|
-
|
|
25602
|
-
|
|
26016
|
+
{
|
|
26017
|
+
id: "kubectl",
|
|
26018
|
+
name: "kubectl",
|
|
26019
|
+
category: "cloud",
|
|
26020
|
+
about: "Kubernetes command line.",
|
|
26021
|
+
size: "60 MB",
|
|
26022
|
+
source: { resolve: "kubectl" },
|
|
26023
|
+
unpack: "file",
|
|
26024
|
+
exe: "kubectl.exe",
|
|
26025
|
+
cli: true
|
|
26026
|
+
},
|
|
26027
|
+
{
|
|
26028
|
+
id: "helm",
|
|
26029
|
+
name: "Helm",
|
|
26030
|
+
category: "cloud",
|
|
26031
|
+
about: "Kubernetes package manager.",
|
|
26032
|
+
size: "20 MB",
|
|
26033
|
+
source: { resolve: "helm" },
|
|
26034
|
+
exe: "helm.exe",
|
|
26035
|
+
cli: true
|
|
26036
|
+
},
|
|
26037
|
+
{
|
|
26038
|
+
id: "k9s",
|
|
26039
|
+
name: "k9s",
|
|
26040
|
+
category: "cloud",
|
|
26041
|
+
about: "Kubernetes cluster UI in the terminal.",
|
|
26042
|
+
size: "40 MB",
|
|
26043
|
+
source: gh("derailed/k9s", "^k9s_Windows_amd64\\.zip$"),
|
|
26044
|
+
exe: "k9s.exe",
|
|
26045
|
+
cli: true
|
|
26046
|
+
},
|
|
26047
|
+
{
|
|
26048
|
+
id: "terraform",
|
|
26049
|
+
name: "Terraform",
|
|
26050
|
+
category: "cloud",
|
|
26051
|
+
about: "Infrastructure as code.",
|
|
26052
|
+
size: "30 MB",
|
|
26053
|
+
source: { resolve: "terraform" },
|
|
26054
|
+
exe: "terraform.exe",
|
|
26055
|
+
cli: true
|
|
26056
|
+
},
|
|
26057
|
+
{
|
|
26058
|
+
id: "azure-cli",
|
|
26059
|
+
name: "Azure CLI",
|
|
26060
|
+
category: "cloud",
|
|
26061
|
+
about: "Manage Azure (az).",
|
|
26062
|
+
size: "90 MB",
|
|
26063
|
+
source: { url: "https://aka.ms/installazurecliwindowszipx64" },
|
|
26064
|
+
exe: "az.cmd",
|
|
26065
|
+
cli: true
|
|
26066
|
+
},
|
|
26067
|
+
{
|
|
26068
|
+
id: "gcloud",
|
|
26069
|
+
name: "Google Cloud CLI",
|
|
26070
|
+
category: "cloud",
|
|
26071
|
+
about: "Manage Google Cloud (gcloud, gsutil, bq).",
|
|
26072
|
+
size: "120 MB",
|
|
26073
|
+
source: {
|
|
26074
|
+
url: "https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-cli-windows-x86_64-bundled-python.zip"
|
|
26075
|
+
},
|
|
26076
|
+
exe: "gcloud.cmd",
|
|
26077
|
+
cli: true
|
|
26078
|
+
},
|
|
26079
|
+
{
|
|
26080
|
+
id: "aws-cli",
|
|
26081
|
+
name: "AWS CLI",
|
|
26082
|
+
category: "cloud",
|
|
26083
|
+
about: "Manage AWS (aws).",
|
|
26084
|
+
size: "50 MB",
|
|
26085
|
+
source: { url: "https://awscli.amazonaws.com/AWSCLIV2.msi" },
|
|
26086
|
+
unpack: "msi",
|
|
26087
|
+
exe: "aws.exe",
|
|
26088
|
+
cli: true
|
|
26089
|
+
},
|
|
25603
26090
|
// ---- diagrams and docs
|
|
25604
|
-
{
|
|
25605
|
-
|
|
26091
|
+
{
|
|
26092
|
+
id: "drawio",
|
|
26093
|
+
name: "draw.io",
|
|
26094
|
+
category: "diagrams",
|
|
26095
|
+
about: "Diagram editor (flowcharts, architecture, UML).",
|
|
26096
|
+
size: "170 MB",
|
|
26097
|
+
source: gh("jgraph/drawio-desktop", "^draw\\.io-[\\d.]+-windows\\.zip$"),
|
|
26098
|
+
exe: "draw.io.exe"
|
|
26099
|
+
},
|
|
26100
|
+
{
|
|
26101
|
+
id: "pandoc",
|
|
26102
|
+
name: "Pandoc",
|
|
26103
|
+
category: "diagrams",
|
|
26104
|
+
about: "Convert documents between Markdown, HTML, Word, PDF ...",
|
|
26105
|
+
size: "35 MB",
|
|
26106
|
+
source: gh("jgm/pandoc", "^pandoc-[\\d.]+-windows-x86_64\\.zip$"),
|
|
26107
|
+
exe: "pandoc.exe",
|
|
26108
|
+
cli: true
|
|
26109
|
+
},
|
|
25606
26110
|
// ---- network
|
|
25607
|
-
{
|
|
25608
|
-
|
|
25609
|
-
|
|
25610
|
-
|
|
26111
|
+
{
|
|
26112
|
+
id: "mitmproxy",
|
|
26113
|
+
name: "mitmproxy",
|
|
26114
|
+
category: "network",
|
|
26115
|
+
about: "Intercepting HTTPS proxy (mitmweb opens a web UI).",
|
|
26116
|
+
size: "90 MB",
|
|
26117
|
+
source: { resolve: "mitmproxy" },
|
|
26118
|
+
exe: "mitmweb.exe",
|
|
26119
|
+
cli: true
|
|
26120
|
+
},
|
|
26121
|
+
{
|
|
26122
|
+
id: "xh",
|
|
26123
|
+
name: "xh",
|
|
26124
|
+
category: "network",
|
|
26125
|
+
about: "Friendly HTTP requests from the terminal (like HTTPie).",
|
|
26126
|
+
size: "5 MB",
|
|
26127
|
+
source: gh("ducaale/xh", "^xh-v[\\d.]+-x86_64-pc-windows-msvc\\.zip$"),
|
|
26128
|
+
exe: "xh.exe",
|
|
26129
|
+
cli: true
|
|
26130
|
+
},
|
|
26131
|
+
{
|
|
26132
|
+
id: "grpcurl",
|
|
26133
|
+
name: "grpcurl",
|
|
26134
|
+
category: "network",
|
|
26135
|
+
about: "curl for gRPC servers.",
|
|
26136
|
+
size: "10 MB",
|
|
26137
|
+
source: gh("fullstorydev/grpcurl", "^grpcurl_[\\d.]+_windows_x86_64\\.zip$"),
|
|
26138
|
+
exe: "grpcurl.exe",
|
|
26139
|
+
cli: true
|
|
26140
|
+
},
|
|
26141
|
+
{
|
|
26142
|
+
id: "k6",
|
|
26143
|
+
name: "k6",
|
|
26144
|
+
category: "network",
|
|
26145
|
+
about: "Load testing with JavaScript scripts.",
|
|
26146
|
+
size: "30 MB",
|
|
26147
|
+
source: gh("grafana/k6", "^k6-v[\\d.]+-windows-amd64\\.zip$"),
|
|
26148
|
+
exe: "k6.exe",
|
|
26149
|
+
cli: true
|
|
26150
|
+
},
|
|
26151
|
+
// ---- reverse engineering
|
|
26152
|
+
{
|
|
26153
|
+
id: "rea",
|
|
26154
|
+
name: "REA (Reverse Engineer Anything)",
|
|
26155
|
+
category: "reversing",
|
|
26156
|
+
about: "Agent-driven reverse engineering (MCP server and CLI, by morluto). Run `rea setup` once to add it to Claude Code and Codex. Native binaries need Ghidra; needs Node 22.19+.",
|
|
26157
|
+
size: "8 MB",
|
|
26158
|
+
source: { npm: "rea-agents" },
|
|
26159
|
+
exe: "rea.cmd",
|
|
26160
|
+
cli: true
|
|
26161
|
+
},
|
|
26162
|
+
{
|
|
26163
|
+
id: "ghidra",
|
|
26164
|
+
name: "Ghidra",
|
|
26165
|
+
category: "reversing",
|
|
26166
|
+
about: "NSA's reverse-engineering suite: disassembler and decompiler. Needs Java 21 (toolchains.java).",
|
|
26167
|
+
size: "570 MB",
|
|
26168
|
+
source: gh("NationalSecurityAgency/ghidra", "^ghidra_[\\d.]+_PUBLIC_[\\d]+\\.zip$"),
|
|
26169
|
+
exe: "ghidraRun.bat"
|
|
26170
|
+
},
|
|
26171
|
+
{
|
|
26172
|
+
id: "x64dbg",
|
|
26173
|
+
name: "x64dbg",
|
|
26174
|
+
category: "reversing",
|
|
26175
|
+
about: "Debugger for 64- and 32-bit Windows programs.",
|
|
26176
|
+
size: "32 MB",
|
|
26177
|
+
source: gh("x64dbg/x64dbg", "^snapshot_[\\d_-]+\\.zip$"),
|
|
26178
|
+
exe: "/^x64dbg\\.exe$/"
|
|
26179
|
+
},
|
|
26180
|
+
{
|
|
26181
|
+
id: "ilspy",
|
|
26182
|
+
name: "ILSpy",
|
|
26183
|
+
category: "reversing",
|
|
26184
|
+
about: ".NET decompiler.",
|
|
26185
|
+
size: "55 MB",
|
|
26186
|
+
source: gh("icsharpcode/ILSpy", "^ILSpy_windows_selfcontained_[\\d.]+-x64\\.zip$"),
|
|
26187
|
+
exe: "ILSpy.exe"
|
|
26188
|
+
},
|
|
26189
|
+
{
|
|
26190
|
+
id: "dnspy",
|
|
26191
|
+
name: "dnSpyEx",
|
|
26192
|
+
category: "reversing",
|
|
26193
|
+
about: ".NET debugger and assembly editor.",
|
|
26194
|
+
size: "100 MB",
|
|
26195
|
+
source: gh("dnSpyEx/dnSpy", "^dnSpy-net-win64\\.zip$"),
|
|
26196
|
+
exe: "dnSpy.exe"
|
|
26197
|
+
},
|
|
26198
|
+
{
|
|
26199
|
+
id: "die",
|
|
26200
|
+
name: "Detect It Easy",
|
|
26201
|
+
category: "reversing",
|
|
26202
|
+
about: "Identifies file types, compilers and packers.",
|
|
26203
|
+
size: "25 MB",
|
|
26204
|
+
source: gh("horsicq/DIE-engine", "^die_win64_portable_[\\d.]+_x64\\.zip$"),
|
|
26205
|
+
exe: "die.exe"
|
|
26206
|
+
},
|
|
26207
|
+
{
|
|
26208
|
+
id: "pe-bear",
|
|
26209
|
+
name: "PE-bear",
|
|
26210
|
+
category: "reversing",
|
|
26211
|
+
about: "Views and edits Windows executables (PE files).",
|
|
26212
|
+
size: "12 MB",
|
|
26213
|
+
source: gh("hasherezade/pe-bear", "^PE-bear_[\\d.]+_qt6_x64_win_vs22\\.zip$"),
|
|
26214
|
+
exe: "PE-bear.exe"
|
|
26215
|
+
},
|
|
26216
|
+
{
|
|
26217
|
+
id: "cutter",
|
|
26218
|
+
name: "Cutter",
|
|
26219
|
+
category: "reversing",
|
|
26220
|
+
about: "Reverse-engineering GUI built on rizin.",
|
|
26221
|
+
size: "141 MB",
|
|
26222
|
+
source: gh("rizinorg/cutter", "^Cutter-v[\\d.]+-Windows-x86_64\\.zip$"),
|
|
26223
|
+
exe: "cutter.exe"
|
|
26224
|
+
},
|
|
26225
|
+
{
|
|
26226
|
+
id: "radare2",
|
|
26227
|
+
name: "radare2",
|
|
26228
|
+
category: "reversing",
|
|
26229
|
+
about: "Command-line reverse-engineering framework (r2).",
|
|
26230
|
+
size: "14 MB",
|
|
26231
|
+
source: gh("radareorg/radare2", "^radare2-[\\d.]+-w64\\.zip$"),
|
|
26232
|
+
exe: "radare2.exe",
|
|
26233
|
+
cli: true
|
|
26234
|
+
},
|
|
26235
|
+
{
|
|
26236
|
+
id: "jadx",
|
|
26237
|
+
name: "JADX",
|
|
26238
|
+
category: "reversing",
|
|
26239
|
+
about: "Android APK and DEX decompiler.",
|
|
26240
|
+
size: "99 MB",
|
|
26241
|
+
source: gh("skylot/jadx", "^jadx-gui-[\\d.]+-with-jre-win\\.zip$"),
|
|
26242
|
+
exe: "jadx-gui.exe"
|
|
26243
|
+
},
|
|
26244
|
+
{
|
|
26245
|
+
id: "system-informer",
|
|
26246
|
+
name: "System Informer",
|
|
26247
|
+
category: "reversing",
|
|
26248
|
+
about: "Process, service and network monitor (Process Hacker's successor).",
|
|
26249
|
+
size: "22 MB",
|
|
26250
|
+
source: gh("winsiderss/systeminformer", "^systeminformer-[\\d.]+-bin\\.zip$"),
|
|
26251
|
+
exe: "SystemInformer.exe"
|
|
26252
|
+
},
|
|
25611
26253
|
// ---- command-line tools
|
|
25612
|
-
{
|
|
25613
|
-
|
|
25614
|
-
|
|
25615
|
-
|
|
25616
|
-
|
|
25617
|
-
|
|
25618
|
-
|
|
25619
|
-
|
|
25620
|
-
|
|
25621
|
-
|
|
25622
|
-
|
|
25623
|
-
{
|
|
25624
|
-
|
|
25625
|
-
|
|
25626
|
-
|
|
25627
|
-
|
|
26254
|
+
{
|
|
26255
|
+
id: "jq",
|
|
26256
|
+
name: "jq",
|
|
26257
|
+
category: "cli",
|
|
26258
|
+
about: "Query and reshape JSON.",
|
|
26259
|
+
size: "1 MB",
|
|
26260
|
+
source: gh("jqlang/jq", "^jq-windows-amd64\\.exe$"),
|
|
26261
|
+
unpack: "file",
|
|
26262
|
+
exe: "jq.exe",
|
|
26263
|
+
cli: true
|
|
26264
|
+
},
|
|
26265
|
+
{
|
|
26266
|
+
id: "yq",
|
|
26267
|
+
name: "yq",
|
|
26268
|
+
category: "cli",
|
|
26269
|
+
about: "Query and edit YAML, JSON, XML and TOML.",
|
|
26270
|
+
size: "10 MB",
|
|
26271
|
+
source: gh("mikefarah/yq", "^yq_windows_amd64\\.exe$"),
|
|
26272
|
+
unpack: "file",
|
|
26273
|
+
exe: "yq.exe",
|
|
26274
|
+
cli: true
|
|
26275
|
+
},
|
|
26276
|
+
{
|
|
26277
|
+
id: "ripgrep",
|
|
26278
|
+
name: "ripgrep",
|
|
26279
|
+
category: "cli",
|
|
26280
|
+
about: "Very fast recursive search (rg).",
|
|
26281
|
+
size: "2 MB",
|
|
26282
|
+
source: gh("BurntSushi/ripgrep", "^ripgrep-[\\d.]+-x86_64-pc-windows-msvc\\.zip$"),
|
|
26283
|
+
exe: "rg.exe",
|
|
26284
|
+
cli: true
|
|
26285
|
+
},
|
|
26286
|
+
{
|
|
26287
|
+
id: "fd",
|
|
26288
|
+
name: "fd",
|
|
26289
|
+
category: "cli",
|
|
26290
|
+
about: "Fast, friendly alternative to find.",
|
|
26291
|
+
size: "2 MB",
|
|
26292
|
+
source: gh("sharkdp/fd", "^fd-v[\\d.]+-x86_64-pc-windows-msvc\\.zip$"),
|
|
26293
|
+
exe: "fd.exe",
|
|
26294
|
+
cli: true
|
|
26295
|
+
},
|
|
26296
|
+
{
|
|
26297
|
+
id: "bat",
|
|
26298
|
+
name: "bat",
|
|
26299
|
+
category: "cli",
|
|
26300
|
+
about: "cat with syntax highlighting and git changes.",
|
|
26301
|
+
size: "3 MB",
|
|
26302
|
+
source: gh("sharkdp/bat", "^bat-v[\\d.]+-x86_64-pc-windows-msvc\\.zip$"),
|
|
26303
|
+
exe: "bat.exe",
|
|
26304
|
+
cli: true
|
|
26305
|
+
},
|
|
26306
|
+
{
|
|
26307
|
+
id: "fzf",
|
|
26308
|
+
name: "fzf",
|
|
26309
|
+
category: "cli",
|
|
26310
|
+
about: "Fuzzy finder for the terminal.",
|
|
26311
|
+
size: "2 MB",
|
|
26312
|
+
source: gh("junegunn/fzf", "^fzf-[\\d.]+-windows_amd64\\.zip$"),
|
|
26313
|
+
exe: "fzf.exe",
|
|
26314
|
+
cli: true
|
|
26315
|
+
},
|
|
26316
|
+
{
|
|
26317
|
+
id: "delta",
|
|
26318
|
+
name: "delta",
|
|
26319
|
+
category: "cli",
|
|
26320
|
+
about: "Readable git diffs with syntax highlighting.",
|
|
26321
|
+
size: "3 MB",
|
|
26322
|
+
source: gh("dandavison/delta", "^delta-[\\d.]+-x86_64-pc-windows-msvc\\.zip$"),
|
|
26323
|
+
exe: "delta.exe",
|
|
26324
|
+
cli: true
|
|
26325
|
+
},
|
|
26326
|
+
{
|
|
26327
|
+
id: "just",
|
|
26328
|
+
name: "just",
|
|
26329
|
+
category: "cli",
|
|
26330
|
+
about: "Command runner (a simpler make for project tasks).",
|
|
26331
|
+
size: "2 MB",
|
|
26332
|
+
source: gh("casey/just", "^just-[\\d.]+-x86_64-pc-windows-msvc\\.zip$"),
|
|
26333
|
+
exe: "just.exe",
|
|
26334
|
+
cli: true
|
|
26335
|
+
},
|
|
26336
|
+
{
|
|
26337
|
+
id: "hyperfine",
|
|
26338
|
+
name: "hyperfine",
|
|
26339
|
+
category: "cli",
|
|
26340
|
+
about: "Benchmark commands.",
|
|
26341
|
+
size: "1 MB",
|
|
26342
|
+
source: gh("sharkdp/hyperfine", "^hyperfine-v[\\d.]+-x86_64-pc-windows-msvc\\.zip$"),
|
|
26343
|
+
exe: "hyperfine.exe",
|
|
26344
|
+
cli: true
|
|
26345
|
+
},
|
|
26346
|
+
{
|
|
26347
|
+
id: "watchexec",
|
|
26348
|
+
name: "watchexec",
|
|
26349
|
+
category: "cli",
|
|
26350
|
+
about: "Run a command when files change.",
|
|
26351
|
+
size: "5 MB",
|
|
26352
|
+
source: gh("watchexec/watchexec", "^watchexec-[\\d.]+-x86_64-pc-windows-msvc\\.zip$"),
|
|
26353
|
+
exe: "watchexec.exe",
|
|
26354
|
+
cli: true
|
|
26355
|
+
},
|
|
26356
|
+
{
|
|
26357
|
+
id: "protoc",
|
|
26358
|
+
name: "protoc",
|
|
26359
|
+
category: "cli",
|
|
26360
|
+
about: "Protocol Buffers compiler.",
|
|
26361
|
+
size: "3 MB",
|
|
26362
|
+
source: gh("protocolbuffers/protobuf", "^protoc-[\\d.]+-win64\\.zip$"),
|
|
26363
|
+
exe: "protoc.exe",
|
|
26364
|
+
cli: true
|
|
26365
|
+
},
|
|
26366
|
+
{
|
|
26367
|
+
id: "ninja",
|
|
26368
|
+
name: "Ninja",
|
|
26369
|
+
category: "cli",
|
|
26370
|
+
about: "Small, fast build system (CMake's favourite generator).",
|
|
26371
|
+
size: "1 MB",
|
|
26372
|
+
source: gh("ninja-build/ninja", "^ninja-win\\.zip$"),
|
|
26373
|
+
exe: "ninja.exe",
|
|
26374
|
+
cli: true
|
|
26375
|
+
},
|
|
26376
|
+
{
|
|
26377
|
+
id: "ffmpeg",
|
|
26378
|
+
name: "FFmpeg",
|
|
26379
|
+
category: "cli",
|
|
26380
|
+
about: "Convert and process audio and video.",
|
|
26381
|
+
size: "200 MB",
|
|
26382
|
+
source: gh("BtbN/FFmpeg-Builds", "^ffmpeg-master-latest-win64-gpl\\.zip$"),
|
|
26383
|
+
exe: "ffmpeg.exe",
|
|
26384
|
+
cli: true
|
|
26385
|
+
},
|
|
26386
|
+
{
|
|
26387
|
+
id: "sqlite",
|
|
26388
|
+
name: "SQLite tools",
|
|
26389
|
+
category: "cli",
|
|
26390
|
+
about: "sqlite3 command-line shell.",
|
|
26391
|
+
size: "5 MB",
|
|
26392
|
+
source: { resolve: "sqlite" },
|
|
26393
|
+
exe: "sqlite3.exe",
|
|
26394
|
+
cli: true
|
|
26395
|
+
},
|
|
26396
|
+
{
|
|
26397
|
+
id: "shellcheck",
|
|
26398
|
+
name: "ShellCheck",
|
|
26399
|
+
category: "cli",
|
|
26400
|
+
about: "Finds bugs in shell scripts.",
|
|
26401
|
+
size: "10 MB",
|
|
26402
|
+
source: gh("koalaman/shellcheck", "^shellcheck-v[\\d.]+\\.zip$"),
|
|
26403
|
+
exe: "shellcheck.exe",
|
|
26404
|
+
cli: true
|
|
26405
|
+
},
|
|
26406
|
+
{
|
|
26407
|
+
id: "gitleaks",
|
|
26408
|
+
name: "Gitleaks",
|
|
26409
|
+
category: "cli",
|
|
26410
|
+
about: "Finds secrets committed to git.",
|
|
26411
|
+
size: "8 MB",
|
|
26412
|
+
source: gh("gitleaks/gitleaks", "^gitleaks_[\\d.]+_windows_x64\\.zip$"),
|
|
26413
|
+
exe: "gitleaks.exe",
|
|
26414
|
+
cli: true
|
|
26415
|
+
}
|
|
25628
26416
|
];
|
|
25629
26417
|
|
|
25630
26418
|
// src/core/schema/apps.ts
|
|
25631
26419
|
var CATALOGUE_IDS = APPS.filter((a) => !a.setting).map((a) => a.id);
|
|
25632
|
-
var
|
|
25633
|
-
var
|
|
26420
|
+
var AppIdSchema = external_exports.enum(CATALOGUE_IDS);
|
|
26421
|
+
var CustomAppIdSchema = external_exports.string().regex(/^[a-z0-9][a-z0-9-]{0,40}$/, "lower-case letters, digits and - only");
|
|
25634
26422
|
var compiles = (pattern) => {
|
|
25635
26423
|
try {
|
|
25636
26424
|
new RegExp(pattern);
|
|
@@ -25639,153 +26427,225 @@ var compiles = (pattern) => {
|
|
|
25639
26427
|
return false;
|
|
25640
26428
|
}
|
|
25641
26429
|
};
|
|
25642
|
-
var
|
|
26430
|
+
var CustomAppSchema = external_exports.strictObject({
|
|
25643
26431
|
name: external_exports.string().min(1).max(80).describe('The name on the desktop shortcut, e.g. "My Tool".'),
|
|
25644
26432
|
github: external_exports.string().regex(/^[\w.-]+\/[\w.-]+$/, "owner/repo, e.g. sharkdp/bat").optional().describe("GitHub repository (owner/repo): the file comes from its latest release."),
|
|
25645
26433
|
asset: external_exports.string().max(200).refine(compiles, "not a valid pattern").optional().describe("With github: a pattern (regular expression) matching the release file, e.g. windows.*x64\\.zip$"),
|
|
25646
26434
|
url: external_exports.string().url().startsWith("https://", "https:// only").optional().describe("Or a direct https:// download link (zip, 7z, exe or msi)."),
|
|
25647
26435
|
sha256: external_exports.string().regex(/^[0-9a-fA-F]{64}$/, "64 hex characters").optional().describe("SHA-256 of the download (GitHub releases usually publish one; then this is not needed)."),
|
|
25648
|
-
unpack: external_exports.enum(["archive", "file", "nsis", "msi"]).optional().describe(
|
|
26436
|
+
unpack: external_exports.enum(["archive", "file", "nsis", "msi"]).optional().describe(
|
|
26437
|
+
"archive (zip, 7z, tar: the default), file (a single .exe), nsis (an installer 7-Zip can open) or msi."
|
|
26438
|
+
),
|
|
25649
26439
|
exe: external_exports.string().min(1).max(200).describe("The program to start (found anywhere in the download), e.g. mytool.exe."),
|
|
25650
26440
|
cli: external_exports.boolean().optional().describe("A command-line tool: its folder goes on PATH instead of getting a desktop shortcut.")
|
|
25651
|
-
}).refine((a) => a.github && a.asset ? !a.url : Boolean(a.url) && !a.github && !a.asset, {
|
|
25652
|
-
|
|
25653
|
-
|
|
25654
|
-
|
|
26441
|
+
}).refine((a) => a.github && a.asset ? !a.url : Boolean(a.url) && !a.github && !a.asset, {
|
|
26442
|
+
message: "give github + asset, or url (not both)"
|
|
26443
|
+
});
|
|
26444
|
+
var AppsSchema = external_exports.strictObject({
|
|
26445
|
+
install: external_exports.array(AppIdSchema).describe(
|
|
26446
|
+
"Apps from the catalogue to install in every sandbox (the Apps screen in the menu lists them by category). Each is downloaded once and kept."
|
|
26447
|
+
),
|
|
26448
|
+
custom: external_exports.record(CustomAppIdSchema, CustomAppSchema).describe(
|
|
26449
|
+
"Programs of your own: a GitHub release or a download link, and the program to start. Installed like the catalogue apps."
|
|
26450
|
+
)
|
|
25655
26451
|
});
|
|
25656
26452
|
|
|
25657
26453
|
// src/core/schema/projects.ts
|
|
25658
|
-
var
|
|
25659
|
-
all: external_exports.boolean().describe(
|
|
26454
|
+
var ProjectsSchema = external_exports.strictObject({
|
|
26455
|
+
all: external_exports.boolean().describe(
|
|
26456
|
+
"Map every project you have started before (and every folder in your roots) at every start, except those in exclude, so all of them open in the running sandbox without a restart. Every agent in the sandbox can then see all of them. Each one is still only set up when you first use it."
|
|
26457
|
+
),
|
|
25660
26458
|
exclude: external_exports.array(external_exports.string().min(1)).describe('Projects left out when "all" is on (folders on this PC).'),
|
|
25661
|
-
roots: external_exports.array(external_exports.string().min(1)).describe(
|
|
26459
|
+
roots: external_exports.array(external_exports.string().min(1)).describe(
|
|
26460
|
+
'Folders whose subfolders are your projects (e.g. "F:\\\\Code"), mapped read/write at every start. Any project inside one, including ones you create later, opens in the running sandbox at once, without a restart. Every agent in the sandbox can see all of them.'
|
|
26461
|
+
),
|
|
25662
26462
|
askToAddRoot: external_exports.boolean().describe("When you start a project whose parent folder is not a root yet, ask once whether to add it."),
|
|
25663
26463
|
declinedRoots: external_exports.array(external_exports.string().min(1)).describe("Parent folders you said no to (not asked again)."),
|
|
25664
|
-
|
|
26464
|
+
allowOutsideMappings: external_exports.union([external_exports.literal("ask"), external_exports.boolean()]).describe(
|
|
26465
|
+
`A project's .sandbox-config.json may map folders from outside the project (e.g. a game folder on another drive). "ask" = an interactive launch asks once per project and set of folders, and remembers your answer; true = always allowed (still listed when you approve the file); false = never (the launch stops and says which folders). Only your own settings decide this, never a project file.`
|
|
26466
|
+
),
|
|
26467
|
+
wsbShare: external_exports.boolean().describe(
|
|
26468
|
+
"On Windows 11 24H2+ with the Windows Sandbox command line (wsb), add other folders to the running sandbox with `wsb share` (untested). Otherwise starting a project outside every root offers a restart."
|
|
26469
|
+
)
|
|
25665
26470
|
});
|
|
25666
26471
|
|
|
25667
26472
|
// src/core/schema/config.ts
|
|
25668
|
-
var
|
|
25669
|
-
$schema:
|
|
25670
|
-
defaultHarness:
|
|
25671
|
-
guestWorkspace:
|
|
26473
|
+
var ConfigSchema = external_exports.strictObject({
|
|
26474
|
+
$schema: SchemaRefSchema.optional(),
|
|
26475
|
+
defaultHarness: NameSchema.describe("Agent started by `sandbox launch` (sandbox claude always runs claude)."),
|
|
26476
|
+
guestWorkspace: GuestWorkspaceSchema,
|
|
25672
26477
|
readOnly: external_exports.boolean().describe("Map the workspace read-only."),
|
|
25673
|
-
workspaceFilter:
|
|
25674
|
-
audit:
|
|
25675
|
-
mappings: external_exports.array(
|
|
25676
|
-
sandbox:
|
|
26478
|
+
workspaceFilter: WorkspaceFilterSchema,
|
|
26479
|
+
audit: AuditSchema,
|
|
26480
|
+
mappings: external_exports.array(MappingSchema).describe("Extra folders from this PC."),
|
|
26481
|
+
sandbox: SandboxSchema,
|
|
25677
26482
|
storage: external_exports.strictObject({
|
|
25678
26483
|
root: external_exports.string().min(1).describe("Where everything is kept on this PC (tools, databases, logins, launches)."),
|
|
25679
26484
|
persistAgentState: external_exports.boolean().describe("Keep agent logins and history between sandboxes."),
|
|
25680
|
-
dataName:
|
|
25681
|
-
markSandboxFiles: external_exports.boolean().describe(
|
|
25682
|
-
|
|
26485
|
+
dataName: NameSchema.describe("Name of the persistent data set (C:\\AgentData) shared by all workspaces."),
|
|
26486
|
+
markSandboxFiles: external_exports.boolean().describe(
|
|
26487
|
+
`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.`
|
|
26488
|
+
),
|
|
26489
|
+
warnDataGb: external_exports.number().min(0).describe(
|
|
26490
|
+
"Say at launch when the persisted data (tools, databases, logins) is bigger than this many GB; 0 = never. sandbox data shows what takes the space."
|
|
26491
|
+
)
|
|
25683
26492
|
}),
|
|
25684
|
-
network:
|
|
25685
|
-
provisioning:
|
|
25686
|
-
downloads:
|
|
25687
|
-
toolchains:
|
|
25688
|
-
databases:
|
|
25689
|
-
|
|
25690
|
-
|
|
25691
|
-
|
|
26493
|
+
network: NetworkSchema,
|
|
26494
|
+
provisioning: ProvisioningSchema,
|
|
26495
|
+
downloads: DownloadsSchema,
|
|
26496
|
+
toolchains: ToolchainsSchema,
|
|
26497
|
+
databases: DatabasesSchema.describe(
|
|
26498
|
+
"Databases running inside the sandbox. Data persists in C:\\AgentData\\databases; each one starts at boot."
|
|
26499
|
+
),
|
|
26500
|
+
attach: AttachSchema,
|
|
26501
|
+
agentCommands: AgentCommandsSchema,
|
|
26502
|
+
secrets: SecretsSchema,
|
|
25692
26503
|
personalization: toggle("Copy your desktop look (theme, accent, taskbar, wallpaper, ...) into the sandbox."),
|
|
25693
|
-
apps:
|
|
25694
|
-
claudeProfile:
|
|
25695
|
-
harnesses: external_exports.record(
|
|
26504
|
+
apps: AppsSchema,
|
|
26505
|
+
claudeProfile: ClaudeProfileSchema,
|
|
26506
|
+
harnesses: external_exports.record(NameSchema, HarnessSchema).describe("Agents that can run in the sandbox."),
|
|
25696
26507
|
hooks: external_exports.strictObject({ failFast: external_exports.boolean().describe("Stop when a hook script fails.") }),
|
|
25697
|
-
projects:
|
|
25698
|
-
|
|
25699
|
-
|
|
25700
|
-
|
|
25701
|
-
|
|
25702
|
-
|
|
26508
|
+
projects: ProjectsSchema.describe(
|
|
26509
|
+
"Several projects in one sandbox: folders of projects mapped at every start, and adding folders while it runs."
|
|
26510
|
+
)
|
|
26511
|
+
}).refine((c) => c.harnesses[c.defaultHarness] !== void 0, {
|
|
26512
|
+
message: "defaultHarness must be one of the configured harnesses",
|
|
26513
|
+
path: ["defaultHarness"]
|
|
26514
|
+
});
|
|
26515
|
+
var LocalOverridesSchema = external_exports.strictObject({
|
|
26516
|
+
$schema: SchemaRefSchema,
|
|
26517
|
+
harness: NameSchema.describe("Agent for this project."),
|
|
26518
|
+
guestWorkspace: GuestWorkspaceSchema,
|
|
25703
26519
|
readOnly: external_exports.boolean().describe("Map this project read-only."),
|
|
25704
26520
|
// A project may turn the filter on and keep more out, never let ignored files in.
|
|
25705
|
-
workspaceFilter:
|
|
25706
|
-
mappings: external_exports.array(
|
|
25707
|
-
|
|
26521
|
+
workspaceFilter: WorkspaceFilterSchema.pick({ enabled: true, exclude: true }).partial(),
|
|
26522
|
+
mappings: external_exports.array(MappingSchema).describe(
|
|
26523
|
+
"Extra folders (relative paths are relative to this file), e.g. a read-only data folder at another place in the sandbox. Folders outside the project are used only as your projects.allowOutsideMappings setting allows (by default you are asked once)."
|
|
26524
|
+
),
|
|
26525
|
+
scripts: StringsSchema.describe(
|
|
26526
|
+
"Scripts (.ps1 / .mjs / .cmd, relative to this file) run inside the sandbox before the agent."
|
|
26527
|
+
),
|
|
25708
26528
|
// This PC's resources are yours to share: CPU and paging file (this PC's disk) are not a project's to set.
|
|
25709
|
-
sandbox:
|
|
26529
|
+
sandbox: SandboxSchema.omit({ cpuLimit: true, pageFileMb: true }).partial(),
|
|
25710
26530
|
// A project may block more (the LAN, hosts); it never opens hosts, ports, DNS or a proxy.
|
|
25711
|
-
network:
|
|
25712
|
-
provisioning:
|
|
25713
|
-
downloads:
|
|
26531
|
+
network: NetworkSchema.pick({ blockPrivateRanges: true, blockHosts: true }).partial(),
|
|
26532
|
+
provisioning: ProvisioningSchema.pick({ copyFromHost: true, fallbackToInstall: true, refresh: true }).extend({ git: GitSchema.partial(), terminal: toggle("Windows Terminal as the sandbox window.").partial() }).partial(),
|
|
26533
|
+
downloads: DownloadsSchema.partial(),
|
|
25714
26534
|
// Every toolchain setting, each one optional (a project usually only switches languages on or pins a version).
|
|
25715
26535
|
toolchains: external_exports.strictObject({
|
|
25716
|
-
...import_lodash.default.mapValues(import_lodash.default.omit(
|
|
25717
|
-
environment:
|
|
26536
|
+
...import_lodash.default.mapValues(import_lodash.default.omit(ToolchainsSchema.shape, "environment"), (shape) => shape.partial()),
|
|
26537
|
+
environment: ToolchainsSchema.shape.environment
|
|
25718
26538
|
}).partial(),
|
|
25719
|
-
databases: external_exports.strictObject(import_lodash.default.mapValues(
|
|
25720
|
-
attach:
|
|
26539
|
+
databases: external_exports.strictObject(import_lodash.default.mapValues(DatabasesSchema.shape, (shape) => shape.partial())).partial(),
|
|
26540
|
+
attach: AttachSchema.partial(),
|
|
25721
26541
|
personalization: toggle("Copy your desktop look into the sandbox.").partial(),
|
|
25722
|
-
// Catalogue apps only (a vetted list): your own programs (apps.custom) download anything, so a repo cannot add
|
|
25723
|
-
|
|
25724
|
-
|
|
26542
|
+
// Catalogue apps only (a vetted list): your own programs (apps.custom) download anything, so a repo cannot add
|
|
26543
|
+
// them.
|
|
26544
|
+
apps: AppsSchema.pick({ install: true }).partial(),
|
|
26545
|
+
claudeProfile: ClaudeProfileSchema.pick({
|
|
26546
|
+
enabled: true,
|
|
26547
|
+
overwrite: true,
|
|
26548
|
+
copyCredentials: true,
|
|
26549
|
+
syncHistory: true,
|
|
26550
|
+
syncClaudeMem: true
|
|
26551
|
+
}).partial(),
|
|
25725
26552
|
hooks: external_exports.strictObject({ failFast: external_exports.boolean() }).partial()
|
|
25726
26553
|
}).partial();
|
|
25727
26554
|
|
|
25728
|
-
// src/shared/schema.ts
|
|
25729
|
-
var
|
|
26555
|
+
// src/shared/channel/schema.ts
|
|
26556
|
+
var IdSchema = external_exports.string().regex(/^[A-Za-z0-9_-]{1,64}$/, "invalid id");
|
|
25730
26557
|
var Text = (max = 4096) => external_exports.string().max(max);
|
|
25731
|
-
var
|
|
25732
|
-
var
|
|
26558
|
+
var TimeSchema = Text(64);
|
|
26559
|
+
var AttachEndpointSchema = external_exports.strictObject({
|
|
25733
26560
|
addresses: external_exports.array(Text(64)).max(16),
|
|
25734
26561
|
port: external_exports.number().int().min(1024).max(65535),
|
|
25735
26562
|
token: Text(256)
|
|
25736
26563
|
});
|
|
25737
|
-
var
|
|
26564
|
+
var BootProgressSchema = external_exports.strictObject({
|
|
26565
|
+
step: external_exports.number().int().min(1).max(32),
|
|
26566
|
+
steps: external_exports.number().int().min(1).max(32),
|
|
26567
|
+
title: Text(120),
|
|
26568
|
+
/** Being set up now; percent while it downloads (when the size is known). */
|
|
26569
|
+
active: external_exports.array(external_exports.strictObject({ name: Text(64), percent: external_exports.number().int().min(0).max(100).optional() })).max(8),
|
|
26570
|
+
done: external_exports.number().int().min(0).max(1e3),
|
|
26571
|
+
total: external_exports.number().int().min(0).max(1e3)
|
|
26572
|
+
});
|
|
26573
|
+
var SandboxStatusSchema = external_exports.object({
|
|
25738
26574
|
launchId: Text(64),
|
|
25739
26575
|
phase: external_exports.enum(["booting", "provisioning", "ready", "failed"]),
|
|
25740
26576
|
message: Text(),
|
|
25741
|
-
updatedAt:
|
|
26577
|
+
updatedAt: TimeSchema,
|
|
25742
26578
|
workspaceHost: Text(),
|
|
25743
26579
|
guestWorkspace: Text(),
|
|
25744
26580
|
headless: external_exports.boolean(),
|
|
25745
26581
|
/** The sandbox's IPv4 addresses (for network.forwardPorts; the host only uses ones on its Hyper-V network). */
|
|
25746
|
-
addresses: external_exports.array(external_exports.string().max(45)).max(8).optional()
|
|
26582
|
+
addresses: external_exports.array(external_exports.string().max(45)).max(8).optional(),
|
|
26583
|
+
/** A malformed progress is dropped, never the status (the phase still counts). */
|
|
26584
|
+
progress: BootProgressSchema.optional().catch(void 0)
|
|
25747
26585
|
});
|
|
25748
|
-
var
|
|
25749
|
-
var
|
|
26586
|
+
var VersionSchema = external_exports.strictObject({ spec: Text(128), source: Text(256) });
|
|
26587
|
+
var DatabasePlanSchema = external_exports.strictObject({
|
|
25750
26588
|
database: external_exports.enum(["postgres", "mysql", "sqlserver", "mongodb", "redis", "dynamodb"]),
|
|
25751
26589
|
reasons: external_exports.array(Text(1024)).max(32),
|
|
25752
26590
|
version: Text(64),
|
|
25753
26591
|
port: external_exports.number().int().min(1024).max(65535),
|
|
25754
26592
|
adminPort: external_exports.number().int().min(1024).max(65535).optional()
|
|
25755
26593
|
});
|
|
25756
|
-
var
|
|
25757
|
-
name:
|
|
26594
|
+
var ProjectSpecSchema = external_exports.strictObject({
|
|
26595
|
+
name: IdSchema,
|
|
25758
26596
|
/** Inside the sandbox: C:\Projects\<name>. */
|
|
25759
26597
|
workspace: Text(1024),
|
|
25760
26598
|
workspaceHost: Text(1024),
|
|
25761
|
-
toolchains:
|
|
25762
|
-
versions: external_exports.strictObject({ node:
|
|
25763
|
-
databases: external_exports.array(
|
|
26599
|
+
toolchains: ToolchainsSchema,
|
|
26600
|
+
versions: external_exports.strictObject({ node: VersionSchema, nodeExtra: external_exports.array(Text(128)).max(16), python: VersionSchema }),
|
|
26601
|
+
databases: external_exports.array(DatabasePlanSchema).max(8),
|
|
25764
26602
|
/** Agents this project may start that the sandbox did not boot with (its .sandbox-config.json "harness"). */
|
|
25765
|
-
harnesses: external_exports.record(Text(64),
|
|
26603
|
+
harnesses: external_exports.record(Text(64), HarnessSchema).refine((h) => Object.keys(h).length <= 8, "at most 8 agents"),
|
|
25766
26604
|
/** Its hooks were staged in C:\AgentLaunch\projects\<name>\hooks. */
|
|
25767
26605
|
hooks: external_exports.boolean()
|
|
25768
26606
|
});
|
|
25769
|
-
var
|
|
25770
|
-
external_exports.strictObject({
|
|
26607
|
+
var GuestRequestSchema = external_exports.discriminatedUnion("kind", [
|
|
26608
|
+
external_exports.strictObject({
|
|
26609
|
+
kind: external_exports.literal("session"),
|
|
26610
|
+
id: IdSchema,
|
|
26611
|
+
harness: Text(64),
|
|
26612
|
+
args: external_exports.array(Text()).max(256),
|
|
26613
|
+
cwd: Text(),
|
|
26614
|
+
project: ProjectSpecSchema.optional(),
|
|
26615
|
+
harnessSpec: HarnessSchema.optional(),
|
|
26616
|
+
createdAt: TimeSchema
|
|
26617
|
+
}),
|
|
25771
26618
|
/** Provision a registered project without starting an agent (sandbox start / exec / db from its folder). */
|
|
25772
|
-
external_exports.strictObject({ kind: external_exports.literal("project"), id:
|
|
25773
|
-
external_exports.strictObject({
|
|
26619
|
+
external_exports.strictObject({ kind: external_exports.literal("project"), id: IdSchema, project: ProjectSpecSchema, createdAt: TimeSchema }),
|
|
26620
|
+
external_exports.strictObject({
|
|
26621
|
+
kind: external_exports.literal("exec"),
|
|
26622
|
+
id: IdSchema,
|
|
26623
|
+
command: external_exports.array(Text()).min(1).max(256),
|
|
26624
|
+
cwd: Text(),
|
|
26625
|
+
timeoutSeconds: external_exports.number().positive().max(86400),
|
|
26626
|
+
createdAt: TimeSchema
|
|
26627
|
+
}),
|
|
25774
26628
|
/** cwd: only the sessions in this folder or below (one project's); omitted = every session. */
|
|
25775
|
-
external_exports.strictObject({
|
|
25776
|
-
|
|
26629
|
+
external_exports.strictObject({
|
|
26630
|
+
kind: external_exports.literal("restart"),
|
|
26631
|
+
id: IdSchema,
|
|
26632
|
+
harness: Text(64).nullable(),
|
|
26633
|
+
cwd: Text().optional(),
|
|
26634
|
+
createdAt: TimeSchema
|
|
26635
|
+
}),
|
|
26636
|
+
external_exports.strictObject({ kind: external_exports.literal("ping"), id: IdSchema, createdAt: TimeSchema })
|
|
25777
26637
|
]);
|
|
25778
|
-
var
|
|
25779
|
-
id:
|
|
26638
|
+
var GuestResponseSchema = external_exports.object({
|
|
26639
|
+
id: IdSchema,
|
|
25780
26640
|
ok: external_exports.boolean(),
|
|
25781
26641
|
message: Text(65536),
|
|
25782
26642
|
exitCode: external_exports.number().int().optional(),
|
|
25783
26643
|
stdout: Text(4 * 1024 * 1024).optional(),
|
|
25784
26644
|
stderr: Text(4 * 1024 * 1024).optional(),
|
|
25785
|
-
finishedAt:
|
|
26645
|
+
finishedAt: TimeSchema
|
|
25786
26646
|
});
|
|
25787
|
-
var
|
|
25788
|
-
id:
|
|
26647
|
+
var SessionStatusSchema = external_exports.object({
|
|
26648
|
+
id: IdSchema,
|
|
25789
26649
|
launchId: Text(64),
|
|
25790
26650
|
harness: Text(64),
|
|
25791
26651
|
cwd: Text(),
|
|
@@ -25793,44 +26653,206 @@ var SessionStatus = external_exports.object({
|
|
|
25793
26653
|
project: Text(64).optional(),
|
|
25794
26654
|
phase: external_exports.enum(["starting", "running", "exited", "failed"]),
|
|
25795
26655
|
message: Text(),
|
|
25796
|
-
updatedAt:
|
|
25797
|
-
startedAt:
|
|
26656
|
+
updatedAt: TimeSchema,
|
|
26657
|
+
startedAt: TimeSchema,
|
|
25798
26658
|
exitCode: external_exports.number().int().optional(),
|
|
25799
|
-
attach:
|
|
26659
|
+
attach: AttachEndpointSchema.optional()
|
|
25800
26660
|
});
|
|
25801
|
-
var
|
|
25802
|
-
name:
|
|
26661
|
+
var ProjectStatusSchema = external_exports.object({
|
|
26662
|
+
name: IdSchema,
|
|
25803
26663
|
workspace: Text(1024),
|
|
25804
26664
|
phase: external_exports.enum(["provisioning", "ready", "failed"]),
|
|
25805
26665
|
message: Text(),
|
|
25806
|
-
updatedAt:
|
|
26666
|
+
updatedAt: TimeSchema,
|
|
25807
26667
|
databases: external_exports.array(external_exports.object({ database: Text(32), port: external_exports.number().int() })).max(16),
|
|
25808
26668
|
summary: external_exports.array(Text(512)).max(64)
|
|
25809
26669
|
});
|
|
25810
26670
|
|
|
25811
|
-
// src/shared/
|
|
26671
|
+
// src/shared/io/json.ts
|
|
26672
|
+
import fs2 from "node:fs";
|
|
26673
|
+
|
|
26674
|
+
// src/shared/test-guard.ts
|
|
26675
|
+
import fs from "node:fs";
|
|
26676
|
+
import os from "node:os";
|
|
26677
|
+
import path from "node:path";
|
|
26678
|
+
var selfTestRunning = () => process.env.AGENT_SANDBOX_SELFTEST === "1";
|
|
26679
|
+
var canonical = (p) => {
|
|
26680
|
+
let rest = "";
|
|
26681
|
+
let current = path.resolve(p);
|
|
26682
|
+
for (; ; ) {
|
|
26683
|
+
try {
|
|
26684
|
+
return path.join(fs.realpathSync.native(current), rest).toLowerCase();
|
|
26685
|
+
} catch {
|
|
26686
|
+
const parent = path.dirname(current);
|
|
26687
|
+
if (parent === current) return path.resolve(p).toLowerCase();
|
|
26688
|
+
rest = path.join(path.basename(current), rest);
|
|
26689
|
+
current = parent;
|
|
26690
|
+
}
|
|
26691
|
+
}
|
|
26692
|
+
};
|
|
26693
|
+
var testWriteRefusal = (target) => {
|
|
26694
|
+
if (!selfTestRunning()) return null;
|
|
26695
|
+
const temp = canonical(os.tmpdir());
|
|
26696
|
+
const t = canonical(target);
|
|
26697
|
+
return t === temp || t.startsWith(temp + path.sep) ? null : "The self-test refused to change " + target + ": it only works in temp folders, so it can never change this PC.";
|
|
26698
|
+
};
|
|
26699
|
+
var assertTestWritable = (target) => {
|
|
26700
|
+
const refusal = testWriteRefusal(target);
|
|
26701
|
+
if (refusal) throw new Error(refusal);
|
|
26702
|
+
};
|
|
26703
|
+
|
|
26704
|
+
// src/shared/io/json.ts
|
|
25812
26705
|
var MAX_MESSAGE_BYTES = 8 * 1024 * 1024;
|
|
25813
|
-
var
|
|
25814
|
-
|
|
25815
|
-
|
|
25816
|
-
|
|
25817
|
-
|
|
25818
|
-
|
|
25819
|
-
|
|
25820
|
-
|
|
25821
|
-
|
|
25822
|
-
|
|
25823
|
-
|
|
25824
|
-
|
|
25825
|
-
|
|
25826
|
-
|
|
25827
|
-
|
|
25828
|
-
|
|
25829
|
-
|
|
25830
|
-
|
|
26706
|
+
var readJsonFile = (file2) => {
|
|
26707
|
+
try {
|
|
26708
|
+
if (fs2.statSync(file2).size > MAX_MESSAGE_BYTES) return null;
|
|
26709
|
+
return JSON.parse(fs2.readFileSync(file2, "utf8").replace(/^\uFEFF/, ""));
|
|
26710
|
+
} catch {
|
|
26711
|
+
return null;
|
|
26712
|
+
}
|
|
26713
|
+
};
|
|
26714
|
+
var readValid = (schema, file2) => {
|
|
26715
|
+
const parsed = schema.safeParse(readJsonFile(file2));
|
|
26716
|
+
return parsed.success ? parsed.data : null;
|
|
26717
|
+
};
|
|
26718
|
+
|
|
26719
|
+
// src/shared/io/safe-remove.ts
|
|
26720
|
+
import fs3 from "node:fs";
|
|
26721
|
+
import os2 from "node:os";
|
|
26722
|
+
import path2 from "node:path";
|
|
26723
|
+
var norm = (p) => path2.resolve(p).replace(/[\\/]+$/, "").toLowerCase();
|
|
26724
|
+
var isAncestorOrSame = (parent, child) => {
|
|
26725
|
+
const a = norm(parent);
|
|
26726
|
+
const b = norm(child);
|
|
26727
|
+
return a === b || b.startsWith(a + path2.sep);
|
|
26728
|
+
};
|
|
26729
|
+
var protectedFolders = () => [
|
|
26730
|
+
os2.homedir(),
|
|
26731
|
+
process.env.USERPROFILE,
|
|
26732
|
+
process.env.APPDATA,
|
|
26733
|
+
process.env.LOCALAPPDATA,
|
|
26734
|
+
path2.join(os2.homedir(), "Documents"),
|
|
26735
|
+
path2.join(os2.homedir(), "Desktop"),
|
|
26736
|
+
process.env.SystemRoot,
|
|
26737
|
+
process.env.WINDIR,
|
|
26738
|
+
process.env.ProgramFiles,
|
|
26739
|
+
process.env["ProgramFiles(x86)"],
|
|
26740
|
+
process.env.ProgramData,
|
|
26741
|
+
"C:\\Users",
|
|
26742
|
+
"C:\\Windows"
|
|
26743
|
+
].filter((p) => typeof p === "string" && p.trim() !== "");
|
|
26744
|
+
var systemFolders = () => [
|
|
26745
|
+
process.env.SystemRoot,
|
|
26746
|
+
process.env.WINDIR,
|
|
26747
|
+
process.env.ProgramFiles,
|
|
26748
|
+
process.env["ProgramFiles(x86)"],
|
|
26749
|
+
"C:\\Windows",
|
|
26750
|
+
"C:\\Program Files",
|
|
26751
|
+
"C:\\Program Files (x86)"
|
|
26752
|
+
].filter((p) => typeof p === "string" && p.trim() !== "");
|
|
26753
|
+
var removeRefusal = (target, root) => {
|
|
26754
|
+
if (!target || !path2.isAbsolute(target) || !root || !path2.isAbsolute(root)) return "not an absolute path";
|
|
26755
|
+
if (/^[\\/]{2}[?.][\\/]/.test(target) || /^[\\/]{2}[?.][\\/]/.test(root)) return "a device path (\\\\?\\ or \\\\.\\)";
|
|
26756
|
+
const t = norm(target);
|
|
26757
|
+
if (t === norm(path2.parse(t).root)) return "a drive root";
|
|
26758
|
+
const hit = protectedFolders().find((p) => isAncestorOrSame(t, p));
|
|
26759
|
+
if (hit) return "it is, or contains, " + hit;
|
|
26760
|
+
const system = systemFolders().find((p) => isAncestorOrSame(p, t));
|
|
26761
|
+
if (system) return "it is inside " + system;
|
|
26762
|
+
if (!t.startsWith(norm(root) + path2.sep)) return "it is not inside " + root;
|
|
26763
|
+
return null;
|
|
26764
|
+
};
|
|
26765
|
+
var safeRemove = (target, root) => {
|
|
26766
|
+
const refusal = removeRefusal(target, root);
|
|
26767
|
+
if (refusal) throw new Error("Refusing to delete " + target + ": " + refusal);
|
|
26768
|
+
assertTestWritable(target);
|
|
26769
|
+
let stat;
|
|
26770
|
+
try {
|
|
26771
|
+
stat = fs3.lstatSync(target);
|
|
26772
|
+
} catch {
|
|
26773
|
+
return;
|
|
26774
|
+
}
|
|
26775
|
+
if (stat.isSymbolicLink()) {
|
|
26776
|
+
try {
|
|
26777
|
+
fs3.unlinkSync(target);
|
|
26778
|
+
} catch {
|
|
26779
|
+
fs3.rmdirSync(target);
|
|
26780
|
+
}
|
|
26781
|
+
return;
|
|
26782
|
+
}
|
|
26783
|
+
fs3.rmSync(target, { recursive: true, force: true, maxRetries: 2 });
|
|
26784
|
+
};
|
|
26785
|
+
|
|
26786
|
+
// src/shared/channel/run-dir.ts
|
|
26787
|
+
function safeId(id) {
|
|
26788
|
+
return IdSchema.parse(id);
|
|
26789
|
+
}
|
|
26790
|
+
var scan = (schema, dir) => {
|
|
26791
|
+
if (!fs4.existsSync(dir)) return { valid: [], invalid: [] };
|
|
26792
|
+
const valid = [];
|
|
26793
|
+
const invalid = [];
|
|
26794
|
+
for (const name of fs4.readdirSync(dir)) {
|
|
26795
|
+
if (name.endsWith(".tmp")) continue;
|
|
26796
|
+
const message = /^[A-Za-z0-9_-]{1,64}\.json$/.test(name) ? readValid(schema, path3.join(dir, name)) : null;
|
|
26797
|
+
if (message) valid.push(message);
|
|
26798
|
+
else invalid.push(path3.join(dir, name));
|
|
26799
|
+
}
|
|
26800
|
+
return { valid, invalid };
|
|
26801
|
+
};
|
|
26802
|
+
var RunDir = class {
|
|
26803
|
+
root;
|
|
26804
|
+
sandboxFile;
|
|
26805
|
+
requestsDir;
|
|
26806
|
+
responsesDir;
|
|
26807
|
+
sessionsDir;
|
|
26808
|
+
projectsDir;
|
|
26809
|
+
/** audit.processes: programs the sandbox started, in small .jsonl files the host takes in and deletes. */
|
|
26810
|
+
auditDir;
|
|
26811
|
+
constructor(dataDir2) {
|
|
26812
|
+
this.root = path3.join(dataDir2, "run");
|
|
26813
|
+
this.sandboxFile = path3.join(this.root, "sandbox.json");
|
|
26814
|
+
this.requestsDir = path3.join(this.root, "requests");
|
|
26815
|
+
this.responsesDir = path3.join(this.root, "responses");
|
|
26816
|
+
this.sessionsDir = path3.join(this.root, "sessions");
|
|
26817
|
+
this.projectsDir = path3.join(this.root, "projects");
|
|
26818
|
+
this.auditDir = path3.join(this.root, "audit");
|
|
26819
|
+
}
|
|
26820
|
+
requestFile(id) {
|
|
26821
|
+
return path3.join(this.requestsDir, safeId(id) + ".json");
|
|
26822
|
+
}
|
|
26823
|
+
responseFile(id) {
|
|
26824
|
+
return path3.join(this.responsesDir, safeId(id) + ".json");
|
|
26825
|
+
}
|
|
26826
|
+
sessionFile(id) {
|
|
26827
|
+
return path3.join(this.sessionsDir, safeId(id) + ".json");
|
|
26828
|
+
}
|
|
26829
|
+
projectFile(name) {
|
|
26830
|
+
return path3.join(this.projectsDir, safeId(name) + ".json");
|
|
26831
|
+
}
|
|
26832
|
+
readSandboxStatus() {
|
|
26833
|
+
return readValid(SandboxStatusSchema, this.sandboxFile);
|
|
26834
|
+
}
|
|
26835
|
+
readSession(id) {
|
|
26836
|
+
return readValid(SessionStatusSchema, this.sessionFile(id));
|
|
26837
|
+
}
|
|
26838
|
+
readResponse(id) {
|
|
26839
|
+
return readValid(GuestResponseSchema, this.responseFile(id));
|
|
26840
|
+
}
|
|
26841
|
+
listSessions() {
|
|
26842
|
+
return scan(SessionStatusSchema, this.sessionsDir).valid.sort((a, b) => a.startedAt.localeCompare(b.startedAt));
|
|
26843
|
+
}
|
|
26844
|
+
readProjectStatus(name) {
|
|
26845
|
+
return readValid(ProjectStatusSchema, this.projectFile(name));
|
|
26846
|
+
}
|
|
26847
|
+
listProjectStatus() {
|
|
26848
|
+
return scan(ProjectStatusSchema, this.projectsDir).valid.slice(0, 64);
|
|
26849
|
+
}
|
|
26850
|
+
scanRequests() {
|
|
26851
|
+
return scan(GuestRequestSchema, this.requestsDir);
|
|
26852
|
+
}
|
|
25831
26853
|
};
|
|
25832
26854
|
|
|
25833
|
-
// src/guest/
|
|
26855
|
+
// src/guest/runtime/paths.ts
|
|
25834
26856
|
var isWin = process.platform === "win32";
|
|
25835
26857
|
var dryRun = process.env.AGENT_DRY_RUN === "1";
|
|
25836
26858
|
var testMode = process.env.AGENT_SANDBOX_TEST === "1";
|
|
@@ -25838,26 +26860,215 @@ var launchDir = process.env.AGENT_LAUNCH_DIR ?? "C:\\AgentLaunch";
|
|
|
25838
26860
|
var dataDir = process.env.AGENT_DATA_DIR ?? "C:\\AgentData";
|
|
25839
26861
|
var hostToolsDir = process.env.AGENT_HOST_TOOLS_DIR ?? "C:\\HostTools";
|
|
25840
26862
|
var localDir = process.env.AGENT_LOCAL_DIR ?? "C:\\nvm";
|
|
25841
|
-
var toolsDir =
|
|
25842
|
-
var logsDir =
|
|
25843
|
-
var run =
|
|
25844
|
-
|
|
25845
|
-
|
|
26863
|
+
var toolsDir = path4.join(dataDir, "tools");
|
|
26864
|
+
var logsDir = path4.join(dataDir, "logs");
|
|
26865
|
+
var run = new RunDir(dataDir);
|
|
26866
|
+
|
|
26867
|
+
// src/guest/runtime/session.ts
|
|
26868
|
+
import fs7 from "node:fs";
|
|
26869
|
+
import path8 from "node:path";
|
|
26870
|
+
|
|
26871
|
+
// src/shared/download/http.ts
|
|
26872
|
+
var USER_AGENT = "windows-development-sandbox";
|
|
26873
|
+
var fetchRetry = async (url2, init = {}, attempts = 5, timeoutMs = 6e4) => {
|
|
26874
|
+
let last;
|
|
26875
|
+
for (let i = 1; i <= attempts; i++) {
|
|
26876
|
+
try {
|
|
26877
|
+
const response = await fetch(url2, {
|
|
26878
|
+
...init,
|
|
26879
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
26880
|
+
headers: { "User-Agent": USER_AGENT, ...init.headers ?? {} }
|
|
26881
|
+
});
|
|
26882
|
+
if (response.ok) return response;
|
|
26883
|
+
last = new Error("HTTP " + response.status + " for " + url2);
|
|
26884
|
+
if (response.status === 404) break;
|
|
26885
|
+
} catch (e) {
|
|
26886
|
+
last = e;
|
|
26887
|
+
}
|
|
26888
|
+
if (i < attempts) await new Promise((r) => setTimeout(r, 3e3));
|
|
26889
|
+
}
|
|
26890
|
+
throw last instanceof Error ? last : new Error(String(last));
|
|
26891
|
+
};
|
|
26892
|
+
|
|
26893
|
+
// src/shared/download/archive.ts
|
|
26894
|
+
import fs5 from "node:fs";
|
|
26895
|
+
import path6 from "node:path";
|
|
26896
|
+
import crypto from "node:crypto";
|
|
26897
|
+
|
|
26898
|
+
// src/shared/system.ts
|
|
26899
|
+
import path5 from "node:path";
|
|
26900
|
+
var systemRoot = () => process.env.SystemRoot ?? process.env.WINDIR ?? "C:\\Windows";
|
|
26901
|
+
var system32 = (exe) => path5.join(systemRoot(), "System32", exe);
|
|
26902
|
+
var SYSTEM = {
|
|
26903
|
+
cmd: () => system32("cmd.exe"),
|
|
26904
|
+
powershell: () => system32("WindowsPowerShell\\v1.0\\powershell.exe"),
|
|
26905
|
+
tasklist: () => system32("tasklist.exe"),
|
|
26906
|
+
tar: () => system32("tar.exe"),
|
|
26907
|
+
reg: () => system32("reg.exe"),
|
|
26908
|
+
netsh: () => system32("netsh.exe"),
|
|
26909
|
+
netstat: () => system32("NETSTAT.EXE"),
|
|
26910
|
+
route: () => system32("ROUTE.EXE"),
|
|
26911
|
+
ipconfig: () => system32("ipconfig.exe"),
|
|
26912
|
+
robocopy: () => system32("Robocopy.exe"),
|
|
26913
|
+
shutdown: () => system32("shutdown.exe"),
|
|
26914
|
+
dism: () => system32("Dism.exe"),
|
|
26915
|
+
msiexec: () => system32("msiexec.exe")
|
|
26916
|
+
};
|
|
26917
|
+
|
|
26918
|
+
// src/shared/download/spawn.ts
|
|
26919
|
+
import { spawn } from "node:child_process";
|
|
26920
|
+
var spawnAsync = (file2, args, options = {}) => new Promise((resolve, reject) => {
|
|
26921
|
+
const child = spawn(file2, args, { stdio: "ignore", windowsHide: true, ...options });
|
|
26922
|
+
child.once("error", reject);
|
|
26923
|
+
child.once("close", (code) => resolve(code ?? -1));
|
|
26924
|
+
});
|
|
26925
|
+
|
|
26926
|
+
// src/shared/download/archive.ts
|
|
26927
|
+
var stagingFolder = (destination) => destination + ".staging-" + crypto.randomBytes(3).toString("hex");
|
|
26928
|
+
var moveIntoPlace = (work, destination) => {
|
|
26929
|
+
safeRemove(destination, path6.dirname(destination));
|
|
26930
|
+
fs5.mkdirSync(path6.dirname(destination), { recursive: true });
|
|
26931
|
+
fs5.renameSync(work, destination);
|
|
26932
|
+
};
|
|
26933
|
+
var extractArchive = async (archive, destination, members2 = []) => {
|
|
26934
|
+
fs5.mkdirSync(destination, { recursive: true });
|
|
26935
|
+
let status = await spawnAsync(SYSTEM.tar(), ["-xf", archive, "-C", destination, ...members2]);
|
|
26936
|
+
if (status !== 0 && /\.(zip|nupkg)$/i.test(archive)) {
|
|
26937
|
+
const zip = archive.endsWith(".zip") ? archive : archive + ".zip";
|
|
26938
|
+
if (zip !== archive) fs5.copyFileSync(archive, zip);
|
|
26939
|
+
status = await spawnAsync(SYSTEM.powershell(), [
|
|
26940
|
+
"-NoLogo",
|
|
26941
|
+
"-NoProfile",
|
|
26942
|
+
"-Command",
|
|
26943
|
+
"Expand-Archive -LiteralPath '" + zip.replace(/'/g, "''") + "' -DestinationPath '" + destination.replace(/'/g, "''") + "' -Force"
|
|
26944
|
+
]);
|
|
26945
|
+
}
|
|
26946
|
+
if (status !== 0) throw new Error("Could not extract " + archive);
|
|
26947
|
+
};
|
|
26948
|
+
var findFile = (root, name, maxDepth = 4) => {
|
|
26949
|
+
if (maxDepth < 0 || !fs5.existsSync(root)) return null;
|
|
26950
|
+
const entries = fs5.readdirSync(root, { withFileTypes: true });
|
|
26951
|
+
for (const entry of entries)
|
|
26952
|
+
if (entry.isFile() && entry.name.toLowerCase() === name.toLowerCase()) return path6.join(root, entry.name);
|
|
26953
|
+
for (const entry of entries)
|
|
26954
|
+
if (entry.isDirectory()) {
|
|
26955
|
+
const found = findFile(path6.join(root, entry.name), name, maxDepth - 1);
|
|
26956
|
+
if (found) return found;
|
|
26957
|
+
}
|
|
26958
|
+
return null;
|
|
26959
|
+
};
|
|
26960
|
+
|
|
26961
|
+
// src/shared/download/downloader.ts
|
|
26962
|
+
import fs6 from "node:fs";
|
|
26963
|
+
import path7 from "node:path";
|
|
26964
|
+
import crypto2 from "node:crypto";
|
|
26965
|
+
import { Readable, Transform } from "node:stream";
|
|
26966
|
+
import { pipeline } from "node:stream/promises";
|
|
26967
|
+
var Downloader = class {
|
|
26968
|
+
/** downloads.requireChecksum: refuse anything without an expected hash. The guest sets it from session.json. */
|
|
26969
|
+
requireChecksum = false;
|
|
26970
|
+
watcher = null;
|
|
26971
|
+
/** Reports coarse progress of the downloads that start from now on to `watcher` (null: stop). */
|
|
26972
|
+
watch(watcher) {
|
|
26973
|
+
this.watcher = watcher;
|
|
26974
|
+
}
|
|
26975
|
+
/**
|
|
26976
|
+
* Streams a download to disk, hashing as it goes: big archives (PostgreSQL is ~330 MB) never sit in memory, and the
|
|
26977
|
+
* event loop stays free so other toolchains keep downloading meanwhile. A mismatch (or any failure) leaves no file
|
|
26978
|
+
* behind.
|
|
26979
|
+
*/
|
|
26980
|
+
async file(url2, destination, expected = null) {
|
|
26981
|
+
const sums = typeof expected === "string" || expected === null ? { sha256: expected } : expected;
|
|
26982
|
+
if (this.requireChecksum && !sums.sha256?.trim() && !sums.sha512?.trim()) {
|
|
26983
|
+
throw new Error(
|
|
26984
|
+
"Refusing to download " + path7.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."
|
|
26985
|
+
);
|
|
26986
|
+
}
|
|
26987
|
+
const response = await fetchRetry(url2, {}, 3, 20 * 60 * 1e3);
|
|
26988
|
+
if (!response.body) throw new Error("Empty response for " + url2);
|
|
26989
|
+
fs6.mkdirSync(path7.dirname(destination), { recursive: true });
|
|
26990
|
+
const checks = ["sha256", "sha512"].flatMap((kind) => {
|
|
26991
|
+
const want = sums[kind]?.trim().toLowerCase();
|
|
26992
|
+
return want ? [{ want, hash: crypto2.createHash(kind) }] : [];
|
|
26993
|
+
});
|
|
26994
|
+
const size = Number(response.headers.get("content-length")) || 0;
|
|
26995
|
+
const report = size > 0 ? this.watcher?.() ?? null : null;
|
|
26996
|
+
let received = 0;
|
|
26997
|
+
let tenth = 0;
|
|
26998
|
+
let reportedAt = Date.now();
|
|
26999
|
+
const tap = new Transform({
|
|
27000
|
+
transform(chunk, _encoding, done) {
|
|
27001
|
+
for (const c of checks) c.hash.update(chunk);
|
|
27002
|
+
if (report) {
|
|
27003
|
+
received += chunk.length;
|
|
27004
|
+
const now = Math.floor(received * 10 / size);
|
|
27005
|
+
if (now !== tenth || Date.now() - reportedAt > 5e3) {
|
|
27006
|
+
tenth = now;
|
|
27007
|
+
reportedAt = Date.now();
|
|
27008
|
+
try {
|
|
27009
|
+
report(Math.min(1, received / size));
|
|
27010
|
+
} catch {
|
|
27011
|
+
}
|
|
27012
|
+
}
|
|
27013
|
+
}
|
|
27014
|
+
done(null, chunk);
|
|
27015
|
+
}
|
|
27016
|
+
});
|
|
27017
|
+
const partial2 = destination + ".part";
|
|
27018
|
+
try {
|
|
27019
|
+
await pipeline(Readable.fromWeb(response.body), tap, fs6.createWriteStream(partial2));
|
|
27020
|
+
if (checks.some((c) => c.hash.digest("hex") !== c.want)) throw new Error("Checksum mismatch for " + url2);
|
|
27021
|
+
fs6.rmSync(destination, { force: true });
|
|
27022
|
+
fs6.renameSync(partial2, destination);
|
|
27023
|
+
} finally {
|
|
27024
|
+
fs6.rmSync(partial2, { force: true });
|
|
27025
|
+
}
|
|
27026
|
+
}
|
|
27027
|
+
/**
|
|
27028
|
+
* Downloads + extracts into `destination` atomically (staging folder, then rename). With `locate`, only the folder
|
|
27029
|
+
* holding that file is kept (`up` folders above it, e.g. locate ruby.exe with up 1 keeps the folder around bin).
|
|
27030
|
+
*/
|
|
27031
|
+
async archive(url2, destination, options = {}) {
|
|
27032
|
+
const work = stagingFolder(destination);
|
|
27033
|
+
try {
|
|
27034
|
+
const archive = path7.join(work, options.fileName ?? path7.basename(new URL(url2).pathname));
|
|
27035
|
+
await this.file(url2, archive, { sha256: options.sha256, sha512: options.sha512 });
|
|
27036
|
+
const extracted = path7.join(work, "x");
|
|
27037
|
+
await extractArchive(archive, extracted, options.members);
|
|
27038
|
+
let root = extracted;
|
|
27039
|
+
if (options.locate) {
|
|
27040
|
+
const found = findFile(extracted, options.locate);
|
|
27041
|
+
if (!found) throw new Error(options.locate + " not found in " + url2);
|
|
27042
|
+
root = path7.dirname(found);
|
|
27043
|
+
for (let i = 0; i < (options.up ?? 0) && path7.dirname(root).startsWith(extracted); i++)
|
|
27044
|
+
root = path7.dirname(root);
|
|
27045
|
+
}
|
|
27046
|
+
moveIntoPlace(root, destination);
|
|
27047
|
+
} finally {
|
|
27048
|
+
safeRemove(work, path7.dirname(work));
|
|
27049
|
+
}
|
|
27050
|
+
}
|
|
27051
|
+
};
|
|
27052
|
+
var downloader = new Downloader();
|
|
27053
|
+
|
|
27054
|
+
// src/guest/runtime/session.ts
|
|
27055
|
+
var session = JSON.parse(
|
|
27056
|
+
fs7.readFileSync(path8.join(launchDir, "session.json"), "utf8").replace(/^\uFEFF/, "")
|
|
27057
|
+
);
|
|
27058
|
+
downloader.requireChecksum = session.downloads?.requireChecksum === true;
|
|
25846
27059
|
var workspace = process.env.AGENT_WORKSPACE ?? session.workspace;
|
|
25847
|
-
var stateDir =
|
|
25848
|
-
var claudeDir =
|
|
25849
|
-
fs.mkdirSync(logsDir, { recursive: true });
|
|
25850
|
-
var logFile = path2.join(logsDir, (process.env.AGENT_LOG_PREFIX ?? "guest") + "-" + (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-") + ".log");
|
|
27060
|
+
var stateDir = path8.join(dataDir, session.persistAgentState ? "state" : "state-session");
|
|
27061
|
+
var claudeDir = path8.join(stateDir, "claude");
|
|
25851
27062
|
|
|
25852
|
-
// src/guest/
|
|
27063
|
+
// src/guest/network/proxy-server.ts
|
|
25853
27064
|
var allowed = expandAllowList(session.network.allowOnly ?? []);
|
|
25854
27065
|
var upstream = session.network.proxy ? new URL(session.network.proxy) : null;
|
|
25855
|
-
var
|
|
27066
|
+
var logFile = path9.join(logsDir, "netproxy.log");
|
|
25856
27067
|
var logged = 0;
|
|
25857
27068
|
var refuse = (host) => {
|
|
25858
27069
|
if (logged++ > 5e3) return;
|
|
25859
27070
|
try {
|
|
25860
|
-
|
|
27071
|
+
fs8.appendFileSync(logFile, (/* @__PURE__ */ new Date()).toISOString() + " blocked " + host + "\n");
|
|
25861
27072
|
} catch {
|
|
25862
27073
|
}
|
|
25863
27074
|
};
|
|
@@ -25867,7 +27078,11 @@ var tunnel = (host, port, onReady, onError) => {
|
|
|
25867
27078
|
socket2.once("error", onError);
|
|
25868
27079
|
return;
|
|
25869
27080
|
}
|
|
25870
|
-
const socket = net.connect(
|
|
27081
|
+
const socket = net.connect(
|
|
27082
|
+
Number(upstream.port || 80),
|
|
27083
|
+
upstream.hostname,
|
|
27084
|
+
() => socket.write("CONNECT " + host + ":" + port + " HTTP/1.1\r\nHost: " + host + ":" + port + "\r\n\r\n")
|
|
27085
|
+
);
|
|
25871
27086
|
socket.once("error", onError);
|
|
25872
27087
|
let head = "";
|
|
25873
27088
|
const onData = (chunk) => {
|
|
@@ -25905,7 +27120,19 @@ var server = http.createServer((req, res) => {
|
|
|
25905
27120
|
res.writeHead(403, { "Content-Type": "text/plain" }).end("Blocked by the sandbox (network.allowOnly): " + target.hostname + "\n");
|
|
25906
27121
|
return;
|
|
25907
27122
|
}
|
|
25908
|
-
const options = upstream ? {
|
|
27123
|
+
const options = upstream ? {
|
|
27124
|
+
host: upstream.hostname,
|
|
27125
|
+
port: Number(upstream.port || 80),
|
|
27126
|
+
path: target.href,
|
|
27127
|
+
method: req.method,
|
|
27128
|
+
headers: req.headers
|
|
27129
|
+
} : {
|
|
27130
|
+
host: target.hostname,
|
|
27131
|
+
port: Number(target.port || 80),
|
|
27132
|
+
path: target.pathname + target.search,
|
|
27133
|
+
method: req.method,
|
|
27134
|
+
headers: req.headers
|
|
27135
|
+
};
|
|
25909
27136
|
const out = http.request(options, (up) => {
|
|
25910
27137
|
res.writeHead(up.statusCode ?? 502, up.headers);
|
|
25911
27138
|
up.pipe(res);
|
|
@@ -25922,15 +27149,24 @@ server.on("connect", (req, client, head) => {
|
|
|
25922
27149
|
client.on("error", () => client.destroy());
|
|
25923
27150
|
if (!host || !(port > 0 && port < 65536) || !hostAllowed(host, allowed)) {
|
|
25924
27151
|
refuse(host ?? "?");
|
|
25925
|
-
client.end(
|
|
27152
|
+
client.end(
|
|
27153
|
+
"HTTP/1.1 403 Forbidden\r\nContent-Type: text/plain\r\n\r\nBlocked by the sandbox (network.allowOnly): " + host + "\n"
|
|
27154
|
+
);
|
|
25926
27155
|
return;
|
|
25927
27156
|
}
|
|
25928
|
-
tunnel(
|
|
25929
|
-
|
|
25930
|
-
|
|
25931
|
-
remote
|
|
25932
|
-
|
|
25933
|
-
|
|
25934
|
-
|
|
27157
|
+
tunnel(
|
|
27158
|
+
host,
|
|
27159
|
+
port,
|
|
27160
|
+
(remote) => {
|
|
27161
|
+
client.write("HTTP/1.1 200 Connection Established\r\n\r\n");
|
|
27162
|
+
if (head.length) remote.write(head);
|
|
27163
|
+
remote.pipe(client);
|
|
27164
|
+
client.pipe(remote);
|
|
27165
|
+
remote.on("error", () => client.destroy());
|
|
27166
|
+
},
|
|
27167
|
+
() => client.end("HTTP/1.1 502 Bad Gateway\r\n\r\n")
|
|
27168
|
+
);
|
|
25935
27169
|
});
|
|
27170
|
+
|
|
27171
|
+
// src/guest/entries/netproxy.ts
|
|
25936
27172
|
server.listen(PROXY_PORT, "127.0.0.1");
|