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
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { spawn, spawnSync } from 'node:child_process';
|
|
4
|
+
import { expandAllowList, PROXY_PORT } from '../../shared/network/policy.js';
|
|
5
|
+
import { SYSTEM } from '../../shared/system.js';
|
|
6
|
+
import { dryRun, isWin, launchDir, toolsDir } from '../runtime/paths.js';
|
|
7
|
+
import { log } from '../runtime/log.js';
|
|
8
|
+
import { session } from '../runtime/session.js';
|
|
9
|
+
import { run } from './firewall.js';
|
|
10
|
+
const ALLOW_RULES = [
|
|
11
|
+
'AgentSandbox-Proxy-Out',
|
|
12
|
+
'AgentSandbox-DNS-Out-UDP',
|
|
13
|
+
'AgentSandbox-DNS-Out-TCP',
|
|
14
|
+
'AgentSandbox-DHCP-Out',
|
|
15
|
+
];
|
|
16
|
+
/** HTTP_PROXY & co. for everything in the sandbox: its own proxy (allowOnly) or yours (network.proxy). */
|
|
17
|
+
export const proxyEnv = () => {
|
|
18
|
+
const own = (session.network.allowOnly ?? []).length > 0;
|
|
19
|
+
const url = own ? 'http://127.0.0.1:' + PROXY_PORT : (session.network.proxy ?? '');
|
|
20
|
+
if (!url)
|
|
21
|
+
return {};
|
|
22
|
+
const noProxy = 'localhost,127.0.0.1,::1';
|
|
23
|
+
return { HTTP_PROXY: url, HTTPS_PROXY: url, http_proxy: url, https_proxy: url, NO_PROXY: noProxy, no_proxy: noProxy };
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* network.allowOnly, after the tools are installed: the sandbox's proxy (a copy of Node named sbx-netproxy.exe, so the
|
|
27
|
+
* firewall can tell it apart) is the only program allowed out, besides DNS and DHCP; Windows and browsers use it as
|
|
28
|
+
* the system proxy, everything else through HTTP_PROXY. A guardrail for agents that behave: an admin in the sandbox
|
|
29
|
+
* could undo it, which is why sandbox.networking false is the only hard isolation.
|
|
30
|
+
*/
|
|
31
|
+
export const applyAllowOnly = async () => {
|
|
32
|
+
const hosts = session.network.allowOnly ?? [];
|
|
33
|
+
if (!session.networking || !hosts.length)
|
|
34
|
+
return false;
|
|
35
|
+
if (!isWin || dryRun) {
|
|
36
|
+
log('(dry run) would allow only: ' + hosts.join(', '));
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
const exe = path.join(toolsDir, 'netproxy', 'sbx-netproxy.exe');
|
|
40
|
+
fs.mkdirSync(path.dirname(exe), { recursive: true });
|
|
41
|
+
if (!fs.existsSync(exe) || fs.statSync(exe).size !== fs.statSync(process.execPath).size)
|
|
42
|
+
fs.copyFileSync(process.execPath, exe);
|
|
43
|
+
spawn(exe, [path.join(launchDir, 'runtime', 'netproxy.js')], {
|
|
44
|
+
detached: true,
|
|
45
|
+
stdio: 'ignore',
|
|
46
|
+
windowsHide: true,
|
|
47
|
+
}).unref();
|
|
48
|
+
const add = (name, extra) => [
|
|
49
|
+
'advfirewall',
|
|
50
|
+
'firewall',
|
|
51
|
+
'add',
|
|
52
|
+
'rule',
|
|
53
|
+
'name=' + name,
|
|
54
|
+
'dir=out',
|
|
55
|
+
'action=allow',
|
|
56
|
+
'enable=yes',
|
|
57
|
+
'profile=any',
|
|
58
|
+
...extra,
|
|
59
|
+
];
|
|
60
|
+
run([
|
|
61
|
+
...ALLOW_RULES.map((n) => ['advfirewall', 'firewall', 'delete', 'rule', 'name=' + n]),
|
|
62
|
+
add('AgentSandbox-Proxy-Out', ['program=' + exe]),
|
|
63
|
+
add('AgentSandbox-DNS-Out-UDP', ['protocol=udp', 'remoteport=53']),
|
|
64
|
+
add('AgentSandbox-DNS-Out-TCP', ['protocol=tcp', 'remoteport=53']),
|
|
65
|
+
add('AgentSandbox-DHCP-Out', ['protocol=udp', 'remoteport=67', 'localport=68']),
|
|
66
|
+
['advfirewall', 'set', 'allprofiles', 'firewallpolicy', 'blockinbound,blockoutbound'],
|
|
67
|
+
['winhttp', 'set', 'proxy', '127.0.0.1:' + PROXY_PORT, '<local>'],
|
|
68
|
+
]);
|
|
69
|
+
const internet = 'HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings';
|
|
70
|
+
for (const [name, type, value] of [
|
|
71
|
+
['ProxyEnable', 'REG_DWORD', '1'],
|
|
72
|
+
['ProxyServer', 'REG_SZ', '127.0.0.1:' + PROXY_PORT],
|
|
73
|
+
['ProxyOverride', 'REG_SZ', '<local>'],
|
|
74
|
+
]) {
|
|
75
|
+
spawnSync(SYSTEM.reg(), ['add', internet, '/v', name, '/t', type, '/d', value, '/f'], {
|
|
76
|
+
windowsHide: true,
|
|
77
|
+
stdio: 'ignore',
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
log('Only these hosts can be reached now (network.allowOnly): ' +
|
|
81
|
+
expandAllowList(hosts).join(', ') +
|
|
82
|
+
'. Refused ones are listed in logs\\netproxy.log.');
|
|
83
|
+
return true;
|
|
84
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** What the agent's manifest says about the LAN. */
|
|
2
|
+
export type LanState = 'blocked' | 'open' | 'offline';
|
|
3
|
+
export declare const run: (commands: string[][]) => void;
|
|
4
|
+
/**
|
|
5
|
+
* Applies the LAN block. Internet is checked first; if it works before the rules but not after, the rules (not the
|
|
6
|
+
* internet) are the problem, so they are removed and the agent is told the LAN is open. If there is no internet at
|
|
7
|
+
* all, the block stays in place: being offline is never a reason to open the LAN.
|
|
8
|
+
*/
|
|
9
|
+
export declare const applyNetworkPolicy: (ptyHostExe: string | null) => Promise<LanState>;
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
// Guest firewall: block the host's LAN (keeping DNS/DHCP to the gateway) and let the host reach session ports.
|
|
2
2
|
import dns from 'node:dns';
|
|
3
3
|
import fs from 'node:fs';
|
|
4
|
-
import os from 'node:os';
|
|
5
4
|
import path from 'node:path';
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import { buildFirewallCommands, ipv4DnsServers, isIPv4, parseDefaultGateways, parseDnsServers } from '../../shared/
|
|
5
|
+
import { spawnSync } from 'node:child_process';
|
|
6
|
+
import { relayPort, withBlockedHosts } from '../../shared/network/policy.js';
|
|
7
|
+
import { buildFirewallCommands, ipv4DnsServers, isIPv4, parseDefaultGateways, parseDnsServers, } from '../../shared/network/firewall-rules.js';
|
|
9
8
|
import { SYSTEM } from '../../shared/system.js';
|
|
10
|
-
import { dryRun,
|
|
9
|
+
import { dryRun, isWin } from '../runtime/paths.js';
|
|
10
|
+
import { log, warn } from '../runtime/log.js';
|
|
11
|
+
import { session } from '../runtime/session.js';
|
|
12
|
+
import { errMsg } from '../../core/util/errors.js';
|
|
11
13
|
const ATTACH_RULE = 'AgentSandbox-Attach';
|
|
12
14
|
const netsh = (args) => {
|
|
13
15
|
const r = spawnSync(SYSTEM.netsh(), args, { encoding: 'utf8', windowsHide: true });
|
|
@@ -24,7 +26,9 @@ const discoverExemptIps = () => {
|
|
|
24
26
|
try {
|
|
25
27
|
servers = ipv4DnsServers(dns.getServers());
|
|
26
28
|
}
|
|
27
|
-
catch {
|
|
29
|
+
catch {
|
|
30
|
+
/* fall back below */
|
|
31
|
+
}
|
|
28
32
|
if (!servers.length)
|
|
29
33
|
servers = parseDnsServers(spawnSync(SYSTEM.ipconfig(), ['/all'], { encoding: 'utf8', windowsHide: true }).stdout ?? '');
|
|
30
34
|
return [...parseDefaultGateways(route.stdout ?? ''), ...servers];
|
|
@@ -49,9 +53,22 @@ const waitForInternet = async (seconds) => {
|
|
|
49
53
|
/** Inbound rule for ptyhost only, and only from the sandbox's own subnet (where the host's Hyper-V adapter is). */
|
|
50
54
|
const attachRule = (ptyHostExe) => [
|
|
51
55
|
['advfirewall', 'firewall', 'delete', 'rule', 'name=' + ATTACH_RULE],
|
|
52
|
-
[
|
|
56
|
+
[
|
|
57
|
+
'advfirewall',
|
|
58
|
+
'firewall',
|
|
59
|
+
'add',
|
|
60
|
+
'rule',
|
|
61
|
+
'name=' + ATTACH_RULE,
|
|
62
|
+
'dir=in',
|
|
63
|
+
'action=allow',
|
|
64
|
+
'enable=yes',
|
|
65
|
+
'profile=any',
|
|
66
|
+
'protocol=tcp',
|
|
67
|
+
'remoteip=LocalSubnet',
|
|
68
|
+
'program=' + ptyHostExe,
|
|
69
|
+
],
|
|
53
70
|
];
|
|
54
|
-
const run = (commands) => {
|
|
71
|
+
export const run = (commands) => {
|
|
55
72
|
for (const c of commands) {
|
|
56
73
|
const r = netsh(c);
|
|
57
74
|
if (r.status !== 0 && c[2] !== 'delete')
|
|
@@ -71,7 +88,11 @@ export const applyNetworkPolicy = async (ptyHostExe) => {
|
|
|
71
88
|
const block = session.network.blockPrivateRanges;
|
|
72
89
|
const exempt = block ? discoverExemptIps() : [];
|
|
73
90
|
const lanRules = block ? buildFirewallCommands(exempt) : [];
|
|
74
|
-
const commands = [
|
|
91
|
+
const commands = [
|
|
92
|
+
...lanRules,
|
|
93
|
+
...(ptyHostExe && session.attach.enabled ? attachRule(ptyHostExe) : []),
|
|
94
|
+
...forwardRule(),
|
|
95
|
+
];
|
|
75
96
|
if (isWin && !dryRun) {
|
|
76
97
|
try {
|
|
77
98
|
applyBlockedHosts();
|
|
@@ -89,7 +110,8 @@ export const applyNetworkPolicy = async (ptyHostExe) => {
|
|
|
89
110
|
if (!block)
|
|
90
111
|
log('Private-range blocking disabled by config.');
|
|
91
112
|
if (block)
|
|
92
|
-
log('Gateway/DNS addresses kept reachable for DNS only: ' +
|
|
113
|
+
log('Gateway/DNS addresses kept reachable for DNS only: ' +
|
|
114
|
+
(exempt.length ? [...new Set(exempt)].join(', ') : '(none found)'));
|
|
93
115
|
if (!isWin || dryRun) {
|
|
94
116
|
log('(dry run) firewall plan:');
|
|
95
117
|
for (const c of commands)
|
|
@@ -114,7 +136,6 @@ export const applyNetworkPolicy = async (ptyHostExe) => {
|
|
|
114
136
|
};
|
|
115
137
|
// ---- the rest of the network settings -----------------------------------------------------------------------------
|
|
116
138
|
const FORWARD_RULE = 'AgentSandbox-Forward';
|
|
117
|
-
const ALLOW_RULES = ['AgentSandbox-Proxy-Out', 'AgentSandbox-DNS-Out-UDP', 'AgentSandbox-DNS-Out-TCP', 'AgentSandbox-DHCP-Out'];
|
|
118
139
|
const HOSTS_FILE = path.join(process.env.WINDIR ?? 'C:\\Windows', 'System32', 'drivers', 'etc', 'hosts');
|
|
119
140
|
/** network.blockHosts: those names go nowhere (the sandbox's hosts file; the registry and files are new every boot). */
|
|
120
141
|
const applyBlockedHosts = () => {
|
|
@@ -130,7 +151,13 @@ const applyDns = () => {
|
|
|
130
151
|
const servers = (session.network.dns ?? []).filter(isIPv4);
|
|
131
152
|
if (!servers.length)
|
|
132
153
|
return;
|
|
133
|
-
const r = spawnSync(SYSTEM.powershell(), [
|
|
154
|
+
const r = spawnSync(SYSTEM.powershell(), [
|
|
155
|
+
'-NoLogo',
|
|
156
|
+
'-NoProfile',
|
|
157
|
+
'-Command',
|
|
158
|
+
"Get-NetAdapter | Where-Object Status -eq 'Up' | Set-DnsClientServerAddress -ServerAddresses " +
|
|
159
|
+
servers.map((s) => "'" + s + "'").join(','),
|
|
160
|
+
], { encoding: 'utf8', windowsHide: true });
|
|
134
161
|
if (r.status !== 0)
|
|
135
162
|
throw new Error('could not set the DNS servers: ' + (r.stderr ?? '').trim().slice(0, 300));
|
|
136
163
|
log('DNS servers (network.dns): ' + servers.join(', '));
|
|
@@ -138,55 +165,23 @@ const applyDns = () => {
|
|
|
138
165
|
/** network.forwardPorts: the relays (in the daemon) take connections from the PC only, i.e. the sandbox's own subnet. */
|
|
139
166
|
const forwardRule = () => {
|
|
140
167
|
const forwards = session.network.forwardPorts ?? [];
|
|
141
|
-
return forwards.length
|
|
142
|
-
[
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
*/
|
|
161
|
-
export const applyAllowOnly = async () => {
|
|
162
|
-
const hosts = session.network.allowOnly ?? [];
|
|
163
|
-
if (!session.networking || !hosts.length)
|
|
164
|
-
return false;
|
|
165
|
-
if (!isWin || dryRun) {
|
|
166
|
-
log('(dry run) would allow only: ' + hosts.join(', '));
|
|
167
|
-
return false;
|
|
168
|
-
}
|
|
169
|
-
const exe = path.join(toolsDir, 'netproxy', 'sbx-netproxy.exe');
|
|
170
|
-
fs.mkdirSync(path.dirname(exe), { recursive: true });
|
|
171
|
-
if (!fs.existsSync(exe) || fs.statSync(exe).size !== fs.statSync(process.execPath).size)
|
|
172
|
-
fs.copyFileSync(process.execPath, exe);
|
|
173
|
-
spawn(exe, [path.join(launchDir, 'runtime', 'netproxy.js')], { detached: true, stdio: 'ignore', windowsHide: true }).unref();
|
|
174
|
-
const add = (name, extra) => ['advfirewall', 'firewall', 'add', 'rule', 'name=' + name, 'dir=out', 'action=allow', 'enable=yes', 'profile=any', ...extra];
|
|
175
|
-
run([
|
|
176
|
-
...ALLOW_RULES.map((n) => ['advfirewall', 'firewall', 'delete', 'rule', 'name=' + n]),
|
|
177
|
-
add('AgentSandbox-Proxy-Out', ['program=' + exe]),
|
|
178
|
-
add('AgentSandbox-DNS-Out-UDP', ['protocol=udp', 'remoteport=53']),
|
|
179
|
-
add('AgentSandbox-DNS-Out-TCP', ['protocol=tcp', 'remoteport=53']),
|
|
180
|
-
add('AgentSandbox-DHCP-Out', ['protocol=udp', 'remoteport=67', 'localport=68']),
|
|
181
|
-
['advfirewall', 'set', 'allprofiles', 'firewallpolicy', 'blockinbound,blockoutbound'],
|
|
182
|
-
['winhttp', 'set', 'proxy', '127.0.0.1:' + PROXY_PORT, '<local>'],
|
|
183
|
-
]);
|
|
184
|
-
const internet = 'HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings';
|
|
185
|
-
for (const [name, type, value] of [['ProxyEnable', 'REG_DWORD', '1'], ['ProxyServer', 'REG_SZ', '127.0.0.1:' + PROXY_PORT], ['ProxyOverride', 'REG_SZ', '<local>']]) {
|
|
186
|
-
spawnSync(SYSTEM.reg(), ['add', internet, '/v', name, '/t', type, '/d', value, '/f'], { windowsHide: true, stdio: 'ignore' });
|
|
187
|
-
}
|
|
188
|
-
log('Only these hosts can be reached now (network.allowOnly): ' + expandAllowList(hosts).join(', ') + '. Refused ones are listed in logs\\netproxy.log.');
|
|
189
|
-
return true;
|
|
168
|
+
return forwards.length
|
|
169
|
+
? [
|
|
170
|
+
['advfirewall', 'firewall', 'delete', 'rule', 'name=' + FORWARD_RULE],
|
|
171
|
+
[
|
|
172
|
+
'advfirewall',
|
|
173
|
+
'firewall',
|
|
174
|
+
'add',
|
|
175
|
+
'rule',
|
|
176
|
+
'name=' + FORWARD_RULE,
|
|
177
|
+
'dir=in',
|
|
178
|
+
'action=allow',
|
|
179
|
+
'enable=yes',
|
|
180
|
+
'profile=any',
|
|
181
|
+
'protocol=tcp',
|
|
182
|
+
'remoteip=LocalSubnet',
|
|
183
|
+
'localport=' + forwards.map((_f, i) => relayPort(i)).join(','),
|
|
184
|
+
],
|
|
185
|
+
]
|
|
186
|
+
: [];
|
|
190
187
|
};
|
|
191
|
-
/** Guest IPv4 addresses the host can use to reach session ports. */
|
|
192
|
-
export const guestAddresses = () => Object.values(os.networkInterfaces()).flat().filter((i) => Boolean(i) && i.family === 'IPv4' && !i.internal).map((i) => i.address);
|
|
@@ -1,13 +1,10 @@
|
|
|
1
|
-
// The sandbox's own proxy for network.allowOnly (runs detached for the sandbox's life, as sbx-netproxy.exe so the
|
|
2
|
-
// firewall can let only it out). HTTPS goes through CONNECT, plain HTTP as proxy requests; a host that is not allowed
|
|
3
|
-
// gets 403 and a line in logs\netproxy.log. With network.proxy set it hands everything on to that proxy.
|
|
4
|
-
// Usage: sbx-netproxy.exe netproxy.js
|
|
5
1
|
import fs from 'node:fs';
|
|
6
2
|
import http from 'node:http';
|
|
7
3
|
import net from 'node:net';
|
|
8
4
|
import path from 'node:path';
|
|
9
|
-
import { expandAllowList, hostAllowed
|
|
10
|
-
import { logsDir
|
|
5
|
+
import { expandAllowList, hostAllowed } from '../../shared/network/policy.js';
|
|
6
|
+
import { logsDir } from '../runtime/paths.js';
|
|
7
|
+
import { session } from '../runtime/session.js';
|
|
11
8
|
const allowed = expandAllowList(session.network.allowOnly ?? []);
|
|
12
9
|
const upstream = session.network.proxy ? new URL(session.network.proxy) : null;
|
|
13
10
|
const logFile = path.join(logsDir, 'netproxy.log');
|
|
@@ -19,7 +16,9 @@ const refuse = (host) => {
|
|
|
19
16
|
try {
|
|
20
17
|
fs.appendFileSync(logFile, new Date().toISOString() + ' blocked ' + host + '\n');
|
|
21
18
|
}
|
|
22
|
-
catch {
|
|
19
|
+
catch {
|
|
20
|
+
/* ignore */
|
|
21
|
+
}
|
|
23
22
|
};
|
|
24
23
|
/** Opens a TCP tunnel to host:port, directly or through the upstream proxy (CONNECT). */
|
|
25
24
|
const tunnel = (host, port, onReady, onError) => {
|
|
@@ -54,7 +53,7 @@ const tunnel = (host, port, onReady, onError) => {
|
|
|
54
53
|
};
|
|
55
54
|
socket.on('data', onData);
|
|
56
55
|
};
|
|
57
|
-
const server = http.createServer((req, res) => {
|
|
56
|
+
export const server = http.createServer((req, res) => {
|
|
58
57
|
// Plain HTTP: the request line has the full URL.
|
|
59
58
|
let target;
|
|
60
59
|
try {
|
|
@@ -66,17 +65,36 @@ const server = http.createServer((req, res) => {
|
|
|
66
65
|
}
|
|
67
66
|
if (!hostAllowed(target.hostname, allowed)) {
|
|
68
67
|
refuse(target.hostname);
|
|
69
|
-
res
|
|
68
|
+
res
|
|
69
|
+
.writeHead(403, { 'Content-Type': 'text/plain' })
|
|
70
|
+
.end('Blocked by the sandbox (network.allowOnly): ' + target.hostname + '\n');
|
|
70
71
|
return;
|
|
71
72
|
}
|
|
72
73
|
const options = upstream
|
|
73
|
-
? {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
74
|
+
? {
|
|
75
|
+
host: upstream.hostname,
|
|
76
|
+
port: Number(upstream.port || 80),
|
|
77
|
+
path: target.href,
|
|
78
|
+
method: req.method,
|
|
79
|
+
headers: req.headers,
|
|
80
|
+
}
|
|
81
|
+
: {
|
|
82
|
+
host: target.hostname,
|
|
83
|
+
port: Number(target.port || 80),
|
|
84
|
+
path: target.pathname + target.search,
|
|
85
|
+
method: req.method,
|
|
86
|
+
headers: req.headers,
|
|
87
|
+
};
|
|
88
|
+
const out = http.request(options, (up) => {
|
|
89
|
+
res.writeHead(up.statusCode ?? 502, up.headers);
|
|
90
|
+
up.pipe(res);
|
|
91
|
+
});
|
|
92
|
+
out.on('error', () => {
|
|
93
|
+
if (!res.headersSent)
|
|
94
|
+
res.writeHead(502).end('upstream error');
|
|
95
|
+
else
|
|
96
|
+
res.destroy();
|
|
97
|
+
});
|
|
80
98
|
req.pipe(out);
|
|
81
99
|
});
|
|
82
100
|
server.on('connect', (req, client, head) => {
|
|
@@ -85,7 +103,9 @@ server.on('connect', (req, client, head) => {
|
|
|
85
103
|
client.on('error', () => client.destroy());
|
|
86
104
|
if (!host || !(port > 0 && port < 65536) || !hostAllowed(host, allowed)) {
|
|
87
105
|
refuse(host ?? '?');
|
|
88
|
-
client.end('HTTP/1.1 403 Forbidden\r\nContent-Type: text/plain\r\n\r\nBlocked by the sandbox (network.allowOnly): ' +
|
|
106
|
+
client.end('HTTP/1.1 403 Forbidden\r\nContent-Type: text/plain\r\n\r\nBlocked by the sandbox (network.allowOnly): ' +
|
|
107
|
+
host +
|
|
108
|
+
'\n');
|
|
89
109
|
return;
|
|
90
110
|
}
|
|
91
111
|
tunnel(host, port, (remote) => {
|
|
@@ -97,4 +117,3 @@ server.on('connect', (req, client, head) => {
|
|
|
97
117
|
remote.on('error', () => client.destroy());
|
|
98
118
|
}, () => client.end('HTTP/1.1 502 Bad Gateway\r\n\r\n'));
|
|
99
119
|
});
|
|
100
|
-
server.listen(PROXY_PORT, '127.0.0.1');
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export type Helper = 'ptyhost' | 'gitshim' | 'vswhere' | 'openssl' | 'cargoshim';
|
|
1
|
+
export type Helper = 'ptyhost' | 'gitshim' | 'vswhere' | 'openssl' | 'cargoshim' | 'linkgate';
|
|
2
2
|
/** %TEMP%\agent-sandbox\<name>-<hash>.exe, compiled from this launch's sandbox\<name>.cs the first time it is needed. */
|
|
3
3
|
export declare const ensureCompiled: (name: Helper) => string;
|
|
@@ -8,9 +8,14 @@ import os from 'node:os';
|
|
|
8
8
|
import path from 'node:path';
|
|
9
9
|
import crypto from 'node:crypto';
|
|
10
10
|
import { spawnSync } from 'node:child_process';
|
|
11
|
-
import { exists,
|
|
11
|
+
import { exists, mkdirp } from './fs.js';
|
|
12
|
+
import { launchDir } from './paths.js';
|
|
12
13
|
const CSC = path.join(process.env.WINDIR ?? 'C:\\Windows', 'Microsoft.NET', 'Framework64', 'v4.0.30319', 'csc.exe');
|
|
13
|
-
const sourceHash = (name) => crypto
|
|
14
|
+
const sourceHash = (name) => crypto
|
|
15
|
+
.createHash('sha256')
|
|
16
|
+
.update(fs.readFileSync(path.join(launchDir, 'sandbox', name + '.cs')))
|
|
17
|
+
.digest('hex')
|
|
18
|
+
.slice(0, 12);
|
|
14
19
|
/** %TEMP%\agent-sandbox\<name>-<hash>.exe, compiled from this launch's sandbox\<name>.cs the first time it is needed. */
|
|
15
20
|
export const ensureCompiled = (name) => {
|
|
16
21
|
const exe = path.join(os.tmpdir(), 'agent-sandbox', name + '-' + sourceHash(name) + '.exe');
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { logsDir } from './paths.js';
|
|
4
|
+
fs.mkdirSync(logsDir, { recursive: true });
|
|
5
|
+
const logFile = path.join(logsDir, (process.env.AGENT_LOG_PREFIX ?? 'guest') + '-' + new Date().toISOString().replace(/[:.]/g, '-') + '.log');
|
|
6
|
+
const append = (line) => {
|
|
7
|
+
try {
|
|
8
|
+
fs.appendFileSync(logFile, line + '\n');
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
/* logging must never break the run */
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
export const log = (message) => {
|
|
15
|
+
console.log(message);
|
|
16
|
+
append(message);
|
|
17
|
+
};
|
|
18
|
+
export const warn = (message) => {
|
|
19
|
+
console.warn('\x1b[33mWARNING: ' + message + '\x1b[0m');
|
|
20
|
+
append('WARNING: ' + message);
|
|
21
|
+
};
|
|
22
|
+
export const logPath = logFile;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { RunDir } from '../../shared/channel/run-dir.js';
|
|
2
|
+
export declare const isWin: boolean;
|
|
3
|
+
export declare const dryRun: boolean;
|
|
4
|
+
/** Real provisioning, but nothing machine-wide (environment variables): for end-to-end tests outside a sandbox. */
|
|
5
|
+
export declare const testMode: boolean;
|
|
6
|
+
export declare const launchDir: string;
|
|
7
|
+
export declare const dataDir: string;
|
|
8
|
+
export declare const hostToolsDir: string;
|
|
9
|
+
/** Folders that must stay on the sandbox's own disk (symlinks, SQLite) rather than in a mapped folder. */
|
|
10
|
+
export declare const localDir: string;
|
|
11
|
+
export declare const toolsDir: string;
|
|
12
|
+
export declare const logsDir: string;
|
|
13
|
+
export declare const run: RunDir;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { RunDir } from '../../shared/channel/run-dir.js';
|
|
3
|
+
export const isWin = process.platform === 'win32';
|
|
4
|
+
export const dryRun = process.env.AGENT_DRY_RUN === '1';
|
|
5
|
+
/** Real provisioning, but nothing machine-wide (environment variables): for end-to-end tests outside a sandbox. */
|
|
6
|
+
export const testMode = process.env.AGENT_SANDBOX_TEST === '1';
|
|
7
|
+
export const launchDir = process.env.AGENT_LAUNCH_DIR ?? 'C:\\AgentLaunch';
|
|
8
|
+
export const dataDir = process.env.AGENT_DATA_DIR ?? 'C:\\AgentData';
|
|
9
|
+
export const hostToolsDir = process.env.AGENT_HOST_TOOLS_DIR ?? 'C:\\HostTools';
|
|
10
|
+
/** Folders that must stay on the sandbox's own disk (symlinks, SQLite) rather than in a mapped folder. */
|
|
11
|
+
export const localDir = process.env.AGENT_LOCAL_DIR ?? 'C:\\nvm';
|
|
12
|
+
export const toolsDir = path.join(dataDir, 'tools');
|
|
13
|
+
export const logsDir = path.join(dataDir, 'logs');
|
|
14
|
+
export const run = new RunDir(dataDir);
|
|
@@ -4,11 +4,17 @@ import net from 'node:net';
|
|
|
4
4
|
export const freePort = () => new Promise((resolve, reject) => {
|
|
5
5
|
const server = net.createServer();
|
|
6
6
|
server.once('error', reject);
|
|
7
|
-
server.listen(0, '127.0.0.1', () => {
|
|
7
|
+
server.listen(0, '127.0.0.1', () => {
|
|
8
|
+
const { port } = server.address();
|
|
9
|
+
server.close(() => resolve(port));
|
|
10
|
+
});
|
|
8
11
|
});
|
|
9
12
|
/** Whether something accepts connections on 127.0.0.1:port. */
|
|
10
13
|
export const portOpen = (port) => new Promise((resolve) => {
|
|
11
|
-
const socket = net.connect({ host: '127.0.0.1', port }, () => {
|
|
14
|
+
const socket = net.connect({ host: '127.0.0.1', port }, () => {
|
|
15
|
+
socket.destroy();
|
|
16
|
+
resolve(true);
|
|
17
|
+
});
|
|
12
18
|
socket.once('error', () => resolve(false));
|
|
13
19
|
});
|
|
14
20
|
/** Polls until the port accepts connections; false when `seconds` pass first. */
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type SpawnOptions, type SpawnSyncOptions } from 'node:child_process';
|
|
2
|
+
/** Runs a program, streaming output, and throws with a readable message when it fails. */
|
|
3
|
+
export declare const exec: (file: string, args: string[], options?: SpawnSyncOptions) => void;
|
|
4
|
+
/** exec without blocking: other toolchains keep downloading while this one runs an installer. */
|
|
5
|
+
export declare const execAsync: (file: string, args: string[], options?: SpawnOptions) => Promise<void>;
|
|
6
|
+
export declare const execOutput: (file: string, args: string[], options?: SpawnSyncOptions) => string;
|
|
7
|
+
export declare const powershell: (script: string) => void;
|
|
8
|
+
/** Copies a folder with robocopy (fast, restartable), or just the named files in it; exit codes below 8 mean success. */
|
|
9
|
+
export declare const robocopy: (from: string, to: string, files?: string[]) => void;
|
|
10
|
+
/**
|
|
11
|
+
* A Node install without its global packages (nvm keeps those per version: often tens of thousands of small files,
|
|
12
|
+
* which is what made copying from this PC slow). Same file list as Copy-NodeFromHost in sandbox/bootstrap.ps1.
|
|
13
|
+
* Copied into a staging folder and renamed into place: node.exe alone (an interrupted copy) must not look like a full install.
|
|
14
|
+
*/
|
|
15
|
+
export declare const copyNode: (from: string, to: string) => void;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { spawnSync } from 'node:child_process';
|
|
4
|
+
import { moveIntoPlace, spawnAsync, stagingFolder } from '../../shared/download/index.js';
|
|
5
|
+
import { safeRemove } from '../../shared/io/safe-remove.js';
|
|
6
|
+
import { SYSTEM } from '../../shared/system.js';
|
|
7
|
+
import { isWin } from './paths.js';
|
|
8
|
+
/** Runs a program, streaming output, and throws with a readable message when it fails. */
|
|
9
|
+
export const exec = (file, args, options = {}) => {
|
|
10
|
+
const result = spawnSync(file, args, { stdio: 'inherit', windowsHide: true, ...options });
|
|
11
|
+
if (result.error)
|
|
12
|
+
throw result.error;
|
|
13
|
+
if (result.status !== 0)
|
|
14
|
+
throw new Error(path.basename(file) + ' ' + args.slice(0, 3).join(' ') + ' failed with exit code ' + result.status);
|
|
15
|
+
};
|
|
16
|
+
/** exec without blocking: other toolchains keep downloading while this one runs an installer. */
|
|
17
|
+
export const execAsync = async (file, args, options = {}) => {
|
|
18
|
+
const code = await spawnAsync(file, args, { stdio: 'inherit', ...options });
|
|
19
|
+
if (code !== 0)
|
|
20
|
+
throw new Error(path.basename(file) + ' ' + args.slice(0, 3).join(' ') + ' failed with exit code ' + code);
|
|
21
|
+
};
|
|
22
|
+
export const execOutput = (file, args, options = {}) => {
|
|
23
|
+
const result = spawnSync(file, args, { encoding: 'utf8', windowsHide: true, ...options });
|
|
24
|
+
return result.status === 0 ? String(result.stdout ?? '').trim() : '';
|
|
25
|
+
};
|
|
26
|
+
export const powershell = (script) => exec(SYSTEM.powershell(), ['-NoLogo', '-NoProfile', '-ExecutionPolicy', 'Bypass', '-Command', script]);
|
|
27
|
+
/** Copies a folder with robocopy (fast, restartable), or just the named files in it; exit codes below 8 mean success. */
|
|
28
|
+
export const robocopy = (from, to, files = []) => {
|
|
29
|
+
if (!isWin) {
|
|
30
|
+
if (!files.length) {
|
|
31
|
+
fs.cpSync(from, to, { recursive: true });
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
fs.mkdirSync(to, { recursive: true });
|
|
35
|
+
for (const f of files.filter((f) => fs.existsSync(path.join(from, f))))
|
|
36
|
+
fs.copyFileSync(path.join(from, f), path.join(to, f));
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const what = files.length ? files : ['/E', '/MT:16'];
|
|
40
|
+
const result = spawnSync(SYSTEM.robocopy(), [from, to, ...what, '/NFL', '/NDL', '/NJH', '/NJS', '/NP', '/R:1', '/W:1', '/XJ'], { stdio: 'ignore', windowsHide: true });
|
|
41
|
+
if ((result.status ?? 16) >= 8)
|
|
42
|
+
throw new Error('robocopy ' + from + ' -> ' + to + ' failed (exit ' + result.status + ')');
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* A Node install without its global packages (nvm keeps those per version: often tens of thousands of small files,
|
|
46
|
+
* which is what made copying from this PC slow). Same file list as Copy-NodeFromHost in sandbox/bootstrap.ps1.
|
|
47
|
+
* Copied into a staging folder and renamed into place: node.exe alone (an interrupted copy) must not look like a full install.
|
|
48
|
+
*/
|
|
49
|
+
export const copyNode = (from, to) => {
|
|
50
|
+
const work = stagingFolder(to);
|
|
51
|
+
try {
|
|
52
|
+
robocopy(from, work, ['node.exe', 'npm', 'npm.cmd', 'npx', 'npx.cmd']);
|
|
53
|
+
robocopy(path.join(from, 'node_modules', 'npm'), path.join(work, 'node_modules', 'npm'));
|
|
54
|
+
moveIntoPlace(work, to);
|
|
55
|
+
}
|
|
56
|
+
finally {
|
|
57
|
+
safeRemove(work, path.dirname(work));
|
|
58
|
+
}
|
|
59
|
+
};
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// files and markers from projectWorkspace(), and duringSession() tells them to leave machine-wide state alone (the
|
|
4
4
|
// nvm symlink, shims, compiled helpers in use) because sessions of other projects depend on it.
|
|
5
5
|
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
6
|
-
import { workspace } from './
|
|
6
|
+
import { workspace } from './session.js';
|
|
7
7
|
const store = new AsyncLocalStorage();
|
|
8
8
|
export const withProject = (context, work) => store.run(context, work);
|
|
9
9
|
export const projectWorkspace = () => store.getStore()?.workspace ?? workspace;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// Shared state for the guest scripts (main, daemon, view): fixed paths, the session description, logging, status.
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { downloader } from '../../shared/download/index.js';
|
|
5
|
+
import { launchDir, dataDir } from './paths.js';
|
|
6
|
+
export const session = JSON.parse(fs.readFileSync(path.join(launchDir, 'session.json'), 'utf8').replace(/^\uFEFF/, ''));
|
|
7
|
+
downloader.requireChecksum = session.downloads?.requireChecksum === true;
|
|
8
|
+
export const workspace = process.env.AGENT_WORKSPACE ?? session.workspace;
|
|
9
|
+
export const stateDir = path.join(dataDir, session.persistAgentState ? 'state' : 'state-session');
|
|
10
|
+
export const claudeDir = path.join(stateDir, 'claude');
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { SandboxStatus } from '../../core/types.js';
|
|
2
|
+
import type { BootProgress } from '../../shared/channel/schema.js';
|
|
3
|
+
/**
|
|
4
|
+
* Best-effort: progress reporting must never be what breaks the boot. `update` changes the structured progress
|
|
5
|
+
* (a new step, what is being set up); it stays as it was otherwise.
|
|
6
|
+
*/
|
|
7
|
+
export declare function setSandboxStatus(phase: SandboxStatus['phase'], message: string, update?: Partial<BootProgress>): void;
|