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
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// Loading the settings: built-in defaults, a user config file, and the example config that ships with the tool.
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import _ from 'lodash';
|
|
4
|
-
import { DEFAULTS, loadConfig } from '../core/config.js';
|
|
5
|
-
import { readJsonc } from '../core/util.js';
|
|
4
|
+
import { DEFAULTS, loadConfig } from '../core/config/index.js';
|
|
5
|
+
import { readJsonc } from '../core/util/index.js';
|
|
6
6
|
export const configSuite = {
|
|
7
7
|
name: 'config',
|
|
8
8
|
title: 'built-in defaults, user config file, config.example.json',
|
|
@@ -23,16 +23,23 @@ export const configSuite = {
|
|
|
23
23
|
mappings: [{ host: 'rel-folder', guest: 'C:\\Rel', readOnly: true }],
|
|
24
24
|
});
|
|
25
25
|
const custom = loadConfig(customFile);
|
|
26
|
-
t.equal({
|
|
26
|
+
t.equal({
|
|
27
|
+
headless: custom.config.sandbox.headless,
|
|
28
|
+
rust: custom.config.toolchains.rust.enabled,
|
|
29
|
+
python: custom.config.toolchains.python.enabled,
|
|
30
|
+
}, { headless: true, rust: false, python: 'auto' }, 'a config file only needs the keys it changes (deep merge over the defaults)');
|
|
27
31
|
await t.throws(() => loadConfig(t.at('missing.json')), 'Config file not found', 'an explicit --config that does not exist is an error');
|
|
28
32
|
t.dir('rel-folder');
|
|
29
33
|
const relativeRun = await f.run({}, { ...custom.config, storage: f.baseConfig.storage });
|
|
30
34
|
const mappedHosts = relativeRun.config.mappings.map((m) => m.host);
|
|
31
|
-
t.check(mappedHosts.includes(t.at('rel-folder')),
|
|
35
|
+
t.check(mappedHosts.includes(t.at('rel-folder')), "relative mappings in the user config resolve against the config file's folder", 'mapped hosts: ' + JSON.stringify(mappedHosts));
|
|
32
36
|
t.section('config.example.json');
|
|
33
37
|
const examplePath = path.join(t.packageRoot, 'config.example.json');
|
|
34
38
|
t.equal(loadConfig(examplePath).config.defaultHarness, 'claude', 'config.example.json is valid');
|
|
35
39
|
const example = _.omit(readJsonc(examplePath), '$schema');
|
|
36
|
-
t.check(_.isEqual(example, DEFAULTS), 'config.example.json lists exactly the built-in defaults', 'the differences are in: ' +
|
|
40
|
+
t.check(_.isEqual(example, DEFAULTS), 'config.example.json lists exactly the built-in defaults', 'the differences are in: ' +
|
|
41
|
+
Object.keys(DEFAULTS)
|
|
42
|
+
.filter((key) => !_.isEqual(example[key], DEFAULTS[key]))
|
|
43
|
+
.join(', '));
|
|
37
44
|
},
|
|
38
45
|
};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { Suite } from './suite.js';
|
|
1
|
+
import type { Suite } from './support/suite.js';
|
|
2
2
|
export declare const dataSuite: Suite;
|
|
@@ -6,7 +6,7 @@ import { resolveCleanTargets } from '../cli/commands/data/clean.js';
|
|
|
6
6
|
import { removeTree } from '../cli/commands/data/remove.js';
|
|
7
7
|
import { findLinks } from '../cli/commands/repair/finders.js';
|
|
8
8
|
import { humanBytes, sizeOf } from '../core/disk.js';
|
|
9
|
-
import { pruneStorage } from '../host/
|
|
9
|
+
import { pruneStorage } from '../host/storage/index.js';
|
|
10
10
|
export const dataSuite = {
|
|
11
11
|
name: 'data',
|
|
12
12
|
title: 'data clean targets, sizes and removal with links, storage cleanup',
|
|
@@ -21,13 +21,33 @@ export const dataSuite = {
|
|
|
21
21
|
t.equal(resolve('Tools/agents/claude'), [inData('tools', 'agents', 'claude')], 'tools/agents/<name> resolves, whatever the case');
|
|
22
22
|
t.equal(resolve('databases/postgres-18'), [inData('databases', 'postgres-18')], 'databases/<name> resolves');
|
|
23
23
|
t.equal(resolve('logs'), [inData('logs')], 'logs resolves');
|
|
24
|
-
t.equal(resolve('launches'), ['launches'],
|
|
24
|
+
t.equal(resolve('launches'), ['launches'], "launches resolves to the storage folder's launches");
|
|
25
25
|
t.equal(resolve('state/claude'), [inData('state', 'claude')], 'state/<agent> resolves');
|
|
26
26
|
t.equal(resolve('tools', 'tools/go', 'tools/go'), [inData('tools')], 'nested and repeated targets collapse');
|
|
27
27
|
t.equal(resolve('all', 'logs'), [inData(), 'launches'], '`all` is the data folder plus launches');
|
|
28
28
|
t.check(Boolean(resolveCleanTargets(['state/claude'], dataPath, storage)[0].warning?.includes('login')), 'cleaning state warns about the login');
|
|
29
29
|
t.check(Boolean(resolveCleanTargets(['all'], dataPath, storage)[0].warning), 'cleaning everything carries a warning');
|
|
30
|
-
const badTargets = [
|
|
30
|
+
const badTargets = [
|
|
31
|
+
'',
|
|
32
|
+
'..',
|
|
33
|
+
'tools/..',
|
|
34
|
+
'tools/../../x',
|
|
35
|
+
'../data',
|
|
36
|
+
'C:\\Windows',
|
|
37
|
+
'C:tools',
|
|
38
|
+
'/etc',
|
|
39
|
+
'\\\\server\\share',
|
|
40
|
+
'tools/*',
|
|
41
|
+
'tools/go:stream',
|
|
42
|
+
'tools/a/b',
|
|
43
|
+
'tools/agents/a/b',
|
|
44
|
+
'logs/guest.log',
|
|
45
|
+
'accounts',
|
|
46
|
+
'sync',
|
|
47
|
+
'windows',
|
|
48
|
+
'tools/.',
|
|
49
|
+
'tools/go.',
|
|
50
|
+
];
|
|
31
51
|
const accepted = badTargets.filter((target) => {
|
|
32
52
|
try {
|
|
33
53
|
resolveCleanTargets([target], dataPath, storage);
|
|
@@ -50,7 +70,9 @@ export const dataSuite = {
|
|
|
50
70
|
fs.symlinkSync(outside, path.join(sized, 'sub', 'escape'), 'junction');
|
|
51
71
|
linked = true;
|
|
52
72
|
}
|
|
53
|
-
catch {
|
|
73
|
+
catch {
|
|
74
|
+
/* no junctions here */
|
|
75
|
+
}
|
|
54
76
|
t.equal(sizeOf(sized), 1024, 'sizes count real files only' + (linked ? ' (a junction counts 0)' : ''));
|
|
55
77
|
t.equal([humanBytes(1536), humanBytes(0), humanBytes(3 * 1024 ** 3)], ['1.5 KB', '0 B', '3.0 GB'], 'sizes are shown in readable units');
|
|
56
78
|
if (linked)
|
|
@@ -60,8 +82,15 @@ export const dataSuite = {
|
|
|
60
82
|
t.check(fs.existsSync(path.join(outside, 'keep.txt')), 'removing a folder never deletes what a link inside points to');
|
|
61
83
|
t.section('storage cleanup');
|
|
62
84
|
const store = t.at('prune');
|
|
63
|
-
const aged = (p, days) => {
|
|
64
|
-
|
|
85
|
+
const aged = (p, days) => {
|
|
86
|
+
const d = new Date(Date.now() - days * 86400000);
|
|
87
|
+
fs.utimesSync(p, d, d);
|
|
88
|
+
};
|
|
89
|
+
for (const [name, days] of [
|
|
90
|
+
['old', 9],
|
|
91
|
+
['kept', 30],
|
|
92
|
+
['new', 1],
|
|
93
|
+
]) {
|
|
65
94
|
aged(t.write(path.join(store, 'launches', name, 'agent.wsb'), 'x'), days);
|
|
66
95
|
aged(path.join(store, 'launches', name), days);
|
|
67
96
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { Suite } from './suite.js';
|
|
1
|
+
import type { Suite } from './support/suite.js';
|
|
2
2
|
export declare const detectSuite: Suite;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// "What does this project need?": databases and toolchains detected from project files, and the plans built from them.
|
|
2
|
-
import { databasesFromServices, detectDatabases } from '../core/detect
|
|
3
|
-
import { DEFAULTS } from '../core/config.js';
|
|
4
|
-
import { databaseCatalog, planDatabases } from '../host/
|
|
5
|
-
import { decideToolchains, resolveToolchains } from '../core/detect
|
|
2
|
+
import { databasesFromServices, detectDatabases } from '../core/detect/index.js';
|
|
3
|
+
import { DEFAULTS } from '../core/config/index.js';
|
|
4
|
+
import { databaseCatalog, planDatabases } from '../host/launch/index.js';
|
|
5
|
+
import { decideToolchains, resolveToolchains } from '../core/detect/index.js';
|
|
6
6
|
const found = (files, host = []) => detectDatabases(files, host).map((d) => d.database);
|
|
7
7
|
const file = (path, text) => ({ path, text });
|
|
8
8
|
export const detectSuite = {
|
|
@@ -16,10 +16,16 @@ export const detectSuite = {
|
|
|
16
16
|
t.equal(found([file('package.json', '{"dependencies":{"pgadmin-ui":"1","mysql-logger":"2","express":"4"}}')]), [], 'package.json: names that only contain a driver name do not count');
|
|
17
17
|
t.equal(found([file('prisma/schema.prisma', 'datasource db {\n provider = "mysql"\n url = env("DATABASE_URL")\n}')]), ['mysql'], 'Prisma: the datasource provider decides');
|
|
18
18
|
t.equal(found([file('requirements.txt', 'django==5.0\npsycopg2-binary==2.9\npymongo>=4\n')]), ['postgres', 'mongodb'], 'Python requirements: psycopg2 and pymongo');
|
|
19
|
-
t.equal(found([
|
|
20
|
-
|
|
19
|
+
t.equal(found([
|
|
20
|
+
file('Api/Api.csproj', '<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.0" />'),
|
|
21
|
+
]), ['sqlserver'], '.NET: EF Core SQL Server provider');
|
|
22
|
+
t.equal(found([
|
|
23
|
+
file('.env.example', 'DATABASE_URL=postgresql://user:pass@localhost:5432/app\nMONGO_URL=mongodb+srv://cluster/x\n'),
|
|
24
|
+
]), ['postgres', 'mongodb'], '.env templates: connection-string schemes');
|
|
21
25
|
t.equal(found([file('template.yaml', 'Resources:\n Table:\n Type: AWS::DynamoDB::Table\n')]), ['dynamodb'], 'SAM/CloudFormation: a DynamoDB table resource');
|
|
22
|
-
t.equal(found([
|
|
26
|
+
t.equal(found([
|
|
27
|
+
file('go.mod', 'require (\n\tgithub.com/jackc/pgx/v5 v5.5.0\n\tgithub.com/aws/aws-sdk-go-v2/service/dynamodb v1.0.0\n)'),
|
|
28
|
+
]), ['postgres', 'dynamodb'], 'go.mod: pgx and the DynamoDB SDK');
|
|
23
29
|
const knex = [file('package.json', '{"dependencies":{"knex":"3"}}')];
|
|
24
30
|
t.equal(found(knex), [], 'an ORM that names no database uses nothing when this PC has none');
|
|
25
31
|
t.equal(found(knex, ['mysql']), ['mysql'], 'an ORM that names no database uses the one installed on this PC');
|
|
@@ -35,10 +41,17 @@ export const detectSuite = {
|
|
|
35
41
|
const took = Date.now() - started;
|
|
36
42
|
t.check(took < 2000, 'database detection stays fast on hostile workspace files (no catastrophic backtracking)', 'took ' + took + ' ms');
|
|
37
43
|
t.section('the database plan');
|
|
38
|
-
const plan = planDatabases({
|
|
44
|
+
const plan = planDatabases({
|
|
45
|
+
...DEFAULTS.databases,
|
|
46
|
+
mongodb: { ...DEFAULTS.databases.mongodb, enabled: true },
|
|
47
|
+
redis: { ...DEFAULTS.databases.redis, enabled: false },
|
|
48
|
+
}, 'unused', { files: [compose], host: [] });
|
|
39
49
|
t.equal(plan.map((p) => p.database + '@' + p.version + ':' + p.port), ['postgres@16:5432', 'mongodb@latest:27017', 'dynamodb@latest:8000'], 'plan: "auto" from the project (compose pins Postgres 16), true always, false never');
|
|
40
50
|
t.equal(plan.find((p) => p.database === 'dynamodb')?.adminPort, 8001, 'plan: DynamoDB gets its admin UI port');
|
|
41
|
-
const catalog = databaseCatalog({
|
|
51
|
+
const catalog = databaseCatalog({
|
|
52
|
+
...DEFAULTS.databases,
|
|
53
|
+
postgres: { ...DEFAULTS.databases.postgres, enabled: false, port: 6543 },
|
|
54
|
+
});
|
|
42
55
|
t.equal(catalog.map((p) => p.database), ['postgres', 'mysql', 'mongodb', 'redis', 'dynamodb'], 'sbx-db catalog: every database that can run (not SQL Server), even ones off at boot');
|
|
43
56
|
t.equal(catalog[0].port, 6543, 'sbx-db catalog: configured ports are used');
|
|
44
57
|
t.section('toolchains from project files');
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { Suite } from './suite.js';
|
|
1
|
+
import type { Suite } from './support/suite.js';
|
|
2
2
|
export declare const generateSuite: Suite;
|
|
@@ -2,10 +2,8 @@
|
|
|
2
2
|
// session.json, the staged Claude profile, and the values read from this PC (git identity, free RAM).
|
|
3
3
|
import fs from 'node:fs';
|
|
4
4
|
import path from 'node:path';
|
|
5
|
-
import {
|
|
6
|
-
import { logonEnv } from '../host/
|
|
7
|
-
import { gitIdentity } from '../host/launch/stage.js';
|
|
8
|
-
import { buildWsb, resolveMemoryMb } from '../host/launch/wsb.js';
|
|
5
|
+
import { LocalOverridesSchema } from '../core/schema/index.js';
|
|
6
|
+
import { buildWsb, gitIdentity, logonEnv, resolveMemoryMb } from '../host/launch/index.js';
|
|
9
7
|
export const generateSuite = {
|
|
10
8
|
name: 'generate',
|
|
11
9
|
title: 'generated .wsb, launch folder and session.json',
|
|
@@ -15,14 +13,31 @@ export const generateSuite = {
|
|
|
15
13
|
const wsb = fs.readFileSync(gen.wsbPath, 'utf8');
|
|
16
14
|
t.includes(wsb, '<MemoryInMB>8192</MemoryInMB>', 'wsb: the configured memory');
|
|
17
15
|
t.includes(wsb, '<SandboxFolder>C:\\Workspace\\work-a</SandboxFolder>', 'wsb: the workspace is mapped to its guest folder');
|
|
18
|
-
t.includes(wsb, 'C:\\HostTools\\git',
|
|
19
|
-
t.includes(wsb, 'C:\\HostTools\\nvm',
|
|
16
|
+
t.includes(wsb, 'C:\\HostTools\\git', "wsb: this PC's git is mapped");
|
|
17
|
+
t.includes(wsb, 'C:\\HostTools\\nvm', "wsb: this PC's nvm is mapped");
|
|
20
18
|
t.excludes(wsb, 'Missing', 'wsb: an optional mapping whose folder is missing is skipped');
|
|
21
19
|
t.includes(wsb, 'logon.cmd</Command>', 'wsb: the logon command');
|
|
22
20
|
t.includes(wsb, '<vGPU>Disable</vGPU>', 'wsb: vGPU is off');
|
|
23
21
|
t.includes(buildWsb(f.baseConfig, 4096, [{ host: 'C:\\a&b', guest: 'C:\\X', readOnly: true }]), 'C:\\a&b', 'wsb values are XML-escaped');
|
|
24
22
|
t.section('the launch folder');
|
|
25
|
-
const expectedFiles = [
|
|
23
|
+
const expectedFiles = [
|
|
24
|
+
'package.json',
|
|
25
|
+
'runtime/main.js',
|
|
26
|
+
'runtime/daemon.js',
|
|
27
|
+
'runtime/view.js',
|
|
28
|
+
'runtime/gitguard.js',
|
|
29
|
+
'sandbox/bootstrap.ps1',
|
|
30
|
+
'sandbox/logon.cmd',
|
|
31
|
+
'sandbox/trust.cmd',
|
|
32
|
+
'sandbox/ptyhost.cs',
|
|
33
|
+
'sandbox/gitshim.cs',
|
|
34
|
+
'sandbox/cpucap.ps1',
|
|
35
|
+
'sandbox/cpucap.cs',
|
|
36
|
+
'sandbox/pagefile.ps1',
|
|
37
|
+
'sandbox/pagefile.cs',
|
|
38
|
+
'sandbox/memlog.ps1',
|
|
39
|
+
'sandbox/linkgate.cs',
|
|
40
|
+
];
|
|
26
41
|
const missing = expectedFiles.filter((file) => !fs.existsSync(path.join(gen.launchPath, file)));
|
|
27
42
|
t.equal(missing, [], 'the launch folder has the runtime, the C# sources and the boot scripts');
|
|
28
43
|
t.equal(fs.readdirSync(path.join(gen.launchPath, 'runtime')).length, 6, 'the runtime is 6 self-contained files');
|
|
@@ -44,11 +59,20 @@ export const generateSuite = {
|
|
|
44
59
|
nvmFromHost: Boolean(session.hostTools.nvm),
|
|
45
60
|
nodeSpec: session.versions.node.spec,
|
|
46
61
|
gitAccess: session.provisioning.git.access,
|
|
47
|
-
}, {
|
|
62
|
+
}, {
|
|
63
|
+
launchId: true,
|
|
64
|
+
workspace: 'C:\\Workspace\\work-a',
|
|
65
|
+
workspaceHost: f.workA,
|
|
66
|
+
firstArgument: '--version',
|
|
67
|
+
gitFromHost: true,
|
|
68
|
+
nvmFromHost: true,
|
|
69
|
+
nodeSpec: '22.3.0',
|
|
70
|
+
gitAccess: 'full',
|
|
71
|
+
}, 'session.json carries the id, paths, agent arguments, host tools, versions and git access');
|
|
48
72
|
t.matches(session.hostTools.nodeVersion ?? '', /^\d+\.\d+\.\d+$/, 'session.json: the host Node version is a plain version');
|
|
49
73
|
t.equal(session.cpuLimitPercent, 80, 'session.json carries the CPU cap for cpucap.ps1 (default 80 %)');
|
|
50
74
|
t.equal(session.pageFileMb, 16384, 'session.json carries the paging file limit for pagefile.ps1 (default 16 GB)');
|
|
51
|
-
t.check(!
|
|
75
|
+
t.check(!LocalOverridesSchema.safeParse({ sandbox: { cpuLimit: 'none' } }).success, "a project's .sandbox-config.json cannot lift your CPU cap (sandbox.cpuLimit is yours only)");
|
|
52
76
|
t.section('what is copied from this PC');
|
|
53
77
|
const staged = path.join(gen.launchPath, 'claude-profile');
|
|
54
78
|
const stagedMissing = ['settings.json', 'CLAUDE.md', '.claude.json', 'plugins'].filter((name) => !fs.existsSync(path.join(staged, name)));
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { Suite } from './suite.js';
|
|
1
|
+
import type { Suite } from './support/suite.js';
|
|
2
2
|
export declare const gitAccessSuite: Suite;
|
|
@@ -1,15 +1,53 @@
|
|
|
1
1
|
// Git access modes ("full", "readonly", "none"): which git commands the guard allows and the matching Claude deny rules.
|
|
2
|
-
import { gitDecision } from '../guest/
|
|
3
|
-
import { gitDenyRules } from '../guest/
|
|
2
|
+
import { gitDecision } from '../guest/git/decision.js';
|
|
3
|
+
import { gitDenyRules } from '../guest/setup/git-rules.js';
|
|
4
4
|
export const gitAccessSuite = {
|
|
5
5
|
name: 'git-access',
|
|
6
6
|
title: 'git access modes and Claude deny rules',
|
|
7
7
|
run: (t) => {
|
|
8
8
|
t.section('readonly');
|
|
9
9
|
const allowed = (args, mode = 'readonly') => gitDecision(args, mode).allow;
|
|
10
|
-
const reading = [
|
|
10
|
+
const reading = [
|
|
11
|
+
'status',
|
|
12
|
+
'log --oneline',
|
|
13
|
+
'diff HEAD~1',
|
|
14
|
+
'show HEAD',
|
|
15
|
+
'blame a.ts',
|
|
16
|
+
'branch',
|
|
17
|
+
'branch -a',
|
|
18
|
+
'branch --contains HEAD',
|
|
19
|
+
'tag',
|
|
20
|
+
'tag -l v*',
|
|
21
|
+
'remote -v',
|
|
22
|
+
'config --get user.name',
|
|
23
|
+
'stash list',
|
|
24
|
+
'-C sub status',
|
|
25
|
+
'--no-pager log',
|
|
26
|
+
];
|
|
11
27
|
t.equal(reading.filter((command) => !allowed(command.split(' '))), [], 'readonly: reading commands are allowed');
|
|
12
|
-
const writing = [
|
|
28
|
+
const writing = [
|
|
29
|
+
'commit -m x',
|
|
30
|
+
'push',
|
|
31
|
+
'add .',
|
|
32
|
+
'checkout main',
|
|
33
|
+
'switch -c x',
|
|
34
|
+
'reset --hard',
|
|
35
|
+
'stash',
|
|
36
|
+
'stash pop',
|
|
37
|
+
'branch new',
|
|
38
|
+
'branch -D x',
|
|
39
|
+
'tag v1',
|
|
40
|
+
'merge x',
|
|
41
|
+
'rebase main',
|
|
42
|
+
'fetch',
|
|
43
|
+
'pull',
|
|
44
|
+
'config user.name x',
|
|
45
|
+
'remote add o u',
|
|
46
|
+
'-c core.hooksPath=x status',
|
|
47
|
+
'--git-dir=x status',
|
|
48
|
+
'clean -fd',
|
|
49
|
+
'apply p.diff',
|
|
50
|
+
];
|
|
13
51
|
t.equal(writing.filter((command) => allowed(command.split(' '))), [], 'readonly: anything that writes (or overrides config) is refused');
|
|
14
52
|
t.section('none and full');
|
|
15
53
|
t.check(!allowed(['status'], 'none') && !allowed(['--version'], 'none'), 'none: every git call is refused');
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { Suite } from './suite.js';
|
|
1
|
+
import type { Suite } from './support/suite.js';
|
|
2
2
|
export declare const guestBootSuite: Suite;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// what it copies in, and what it refuses to.
|
|
3
3
|
import fs from 'node:fs';
|
|
4
4
|
import path from 'node:path';
|
|
5
|
-
import { readJsonFile } from '../shared/
|
|
5
|
+
import { readJsonFile } from '../shared/io/index.js';
|
|
6
6
|
export const guestBootSuite = {
|
|
7
7
|
name: 'guest-boot',
|
|
8
8
|
title: 'guest boot in dry-run mode (provisioning, Claude state, git policy)',
|
|
@@ -15,7 +15,16 @@ export const guestBootSuite = {
|
|
|
15
15
|
t.includes(boot.out, 'would run:', 'the guest starts the agent...');
|
|
16
16
|
t.includes(boot.out, '--version', '... with its arguments...');
|
|
17
17
|
t.includes(boot.out, 'cwd=' + f.workA, '... in the workspace');
|
|
18
|
-
for (const step of [
|
|
18
|
+
for (const step of [
|
|
19
|
+
'would provision nvm and Node 22.3.0 (from this PC)',
|
|
20
|
+
'would provision Python 3',
|
|
21
|
+
'would provision MinGW-w64 GCC',
|
|
22
|
+
'would provision Rust',
|
|
23
|
+
'.NET SDK',
|
|
24
|
+
'would provision bun',
|
|
25
|
+
'would provision uv',
|
|
26
|
+
'would provision Git for Windows from this PC',
|
|
27
|
+
]) {
|
|
19
28
|
t.includes(boot.out, step, 'the guest provisions: ' + step);
|
|
20
29
|
}
|
|
21
30
|
t.includes(boot.out, 'AgentSandbox-Block-Private', 'the firewall plan blocks the LAN...');
|
|
@@ -23,7 +32,7 @@ export const guestBootSuite = {
|
|
|
23
32
|
t.equal(readJsonFile(path.join(data1, 'run', 'sandbox.json'))?.phase, 'ready', 'the guest reports "ready" in run/sandbox.json');
|
|
24
33
|
t.section('Claude state copied in');
|
|
25
34
|
const claudeState = path.join(data1, 'state', 'claude');
|
|
26
|
-
t.includes(fs.readFileSync(path.join(claudeState, 'settings.json'), 'utf8'), 'dark',
|
|
35
|
+
t.includes(fs.readFileSync(path.join(claudeState, 'settings.json'), 'utf8'), 'dark', "the guest applied this PC's Claude settings");
|
|
27
36
|
t.check(fs.existsSync(path.join(claudeState, 'commands', 'review.md')), 'custom commands are copied');
|
|
28
37
|
t.check(!fs.existsSync(path.join(claudeState, '.credentials.json')), 'the login is not copied');
|
|
29
38
|
const plugins = fs.readFileSync(path.join(claudeState, 'plugins', 'installed_plugins.json'), 'utf8');
|
|
@@ -34,13 +43,20 @@ export const guestBootSuite = {
|
|
|
34
43
|
t.includes(manifest, 'DISPOSABLE Windows Sandbox', 'the agent manifest goes to the managed CLAUDE.md...');
|
|
35
44
|
t.includes(manifest, f.workA, '... naming the workspace');
|
|
36
45
|
t.check(manifest.split('\n').length < 16, 'the managed manifest stays tiny', manifest.split('\n').length + ' lines');
|
|
37
|
-
t.equal(fs.readFileSync(path.join(claudeState, 'CLAUDE.md'), 'utf8'), 'my rules',
|
|
46
|
+
t.equal(fs.readFileSync(path.join(claudeState, 'CLAUDE.md'), 'utf8'), 'my rules', "the user's own CLAUDE.md is untouched");
|
|
38
47
|
t.check(fs.existsSync(path.join(data1, 'SANDBOX.md')), 'SANDBOX.md is written to the data folder');
|
|
39
48
|
t.check(!fs.existsSync(f.at('managed', 'managed-settings.json')), 'git access full: no managed deny rules');
|
|
40
49
|
t.section('second boot');
|
|
41
50
|
// The host changed its MCP servers: the sandbox keeps its own login and .claude.json but gets the new servers.
|
|
42
|
-
fs.writeFileSync(path.join(claudeState, '.claude.json'), JSON.stringify({
|
|
43
|
-
|
|
51
|
+
fs.writeFileSync(path.join(claudeState, '.claude.json'), JSON.stringify({
|
|
52
|
+
...guestState,
|
|
53
|
+
oauthAccount: { emailAddress: 'sandbox@x' },
|
|
54
|
+
mcpServers: { local: { command: 'x' } },
|
|
55
|
+
}));
|
|
56
|
+
t.writeJson(path.join(gen.launchPath, 'claude-profile', '.claude.json'), {
|
|
57
|
+
mcpServers: { github: { command: 'npx2' } },
|
|
58
|
+
projects: { [f.workA.replace(/\\/g, '/')]: { mcpServers: { db: { command: 'pg' } } } },
|
|
59
|
+
});
|
|
44
60
|
await f.runGuest(gen.launchPath, data1, f.workA);
|
|
45
61
|
const merged = f.readJson(path.join(claudeState, '.claude.json'));
|
|
46
62
|
t.equal(merged.oauthAccount.emailAddress, 'sandbox@x', 'MCP re-sync leaves the sandbox login alone');
|
|
@@ -63,7 +79,9 @@ export const guestBootSuite = {
|
|
|
63
79
|
t.check(hook.status === 0, 'a project with "scripts" boots', hook.out);
|
|
64
80
|
t.equal(fs.readFileSync(t.at('data-hook', 'hook-ran.txt'), 'utf8'), f.workB, 'local "scripts" run inside the sandbox with the workspace set');
|
|
65
81
|
const genInstall = await f.launch({}, { config: f.makeConfig(false), probe: { ...f.probe, nodeDir: null, harnessExe: null } });
|
|
66
|
-
const install = await f.runGuest(genInstall.launchPath, t.at('data3'), f.workA, {
|
|
82
|
+
const install = await f.runGuest(genInstall.launchPath, t.at('data3'), f.workA, {
|
|
83
|
+
AGENT_HOST_TOOLS_DIR: t.at('empty'),
|
|
84
|
+
});
|
|
67
85
|
t.check(install.status === 0, 'install mode boots', install.out);
|
|
68
86
|
t.includes(install.out, 'npm-cli.js', 'install mode: npm is used...');
|
|
69
87
|
t.includes(install.out, '@anthropic-ai/claude-code', '... to install the agent');
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { Suite } from './suite.js';
|
|
1
|
+
import type { Suite } from './support/suite.js';
|
|
2
2
|
export declare const hostSimSuite: Suite;
|
|
@@ -7,7 +7,22 @@
|
|
|
7
7
|
// (every one is a fresh Node process, which is what makes this the slowest suite when run one by one).
|
|
8
8
|
import fs from 'node:fs';
|
|
9
9
|
import path from 'node:path';
|
|
10
|
-
const SANDBOX_ONLY_VARS = [
|
|
10
|
+
const SANDBOX_ONLY_VARS = [
|
|
11
|
+
'CLAUDE_CONFIG_DIR',
|
|
12
|
+
'CODEX_HOME',
|
|
13
|
+
'GEMINI_CLI_HOME',
|
|
14
|
+
'AGENT_WORKSPACE',
|
|
15
|
+
'AGENT_DATA',
|
|
16
|
+
'AGENT_TOOLS',
|
|
17
|
+
'AGENT_PROJECT',
|
|
18
|
+
'NVM_HOME',
|
|
19
|
+
'NVM_SYMLINK',
|
|
20
|
+
'BASH_ENV',
|
|
21
|
+
'CLAUDE_CODE_GIT_BASH_PATH',
|
|
22
|
+
'AGENT_GIT_ACCESS',
|
|
23
|
+
'AGENT_REAL_GIT',
|
|
24
|
+
'AGENT_SANDBOX_CONFIG',
|
|
25
|
+
];
|
|
11
26
|
const PARALLEL = 2;
|
|
12
27
|
const sandbox = (label, ...args) => ({ bin: 'agent-sandbox', label, args, config: true });
|
|
13
28
|
const COMMANDS = [
|
|
@@ -61,7 +76,11 @@ export const hostSimSuite = {
|
|
|
61
76
|
const freshPc = (name) => {
|
|
62
77
|
const home = t.dir('host-sim', name, 'home');
|
|
63
78
|
const storage = t.dir('host-sim', name, 'storage');
|
|
64
|
-
const config = t.writeJson(t.at('host-sim', name, 'config.json'), {
|
|
79
|
+
const config = t.writeJson(t.at('host-sim', name, 'config.json'), {
|
|
80
|
+
storage: { root: storage },
|
|
81
|
+
personalization: { enabled: false },
|
|
82
|
+
provisioning: { terminal: { enabled: false } },
|
|
83
|
+
});
|
|
65
84
|
return { home, config };
|
|
66
85
|
};
|
|
67
86
|
const broken = [];
|
|
@@ -71,7 +90,12 @@ export const hostSimSuite = {
|
|
|
71
90
|
const crashed = r.status === null || r.status > 1 || /Unexpected error|node:internal|^\s+at .+:\d+:\d+\)?$/m.test(r.out);
|
|
72
91
|
const unexplained = r.status === 1 && !/(^|\n)(Error: |error: )/.test(r.out) && command.bin !== 'claude-host';
|
|
73
92
|
if (crashed || unexplained)
|
|
74
|
-
broken.push(command.label +
|
|
93
|
+
broken.push(command.label +
|
|
94
|
+
' (exit ' +
|
|
95
|
+
r.status +
|
|
96
|
+
(r.timedOut ? ', timed out' : '') +
|
|
97
|
+
'): ' +
|
|
98
|
+
r.out.trim().split('\n').slice(0, 4).join(' | '));
|
|
75
99
|
};
|
|
76
100
|
// `config init` twice must see the same home (the second run finds the files the first one made).
|
|
77
101
|
const initPc = freshPc('init');
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { Suite } from './suite.js';
|
|
1
|
+
import type { Suite } from './support/suite.js';
|
|
2
2
|
export declare const hostileInputSuite: Suite;
|
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
import fs from 'node:fs';
|
|
4
4
|
import os from 'node:os';
|
|
5
5
|
import path from 'node:path';
|
|
6
|
-
import { assertCmdSafePath } from '../host/
|
|
6
|
+
import { assertCmdSafePath } from '../host/sandbox/index.js';
|
|
7
7
|
import { assertSafeMapping } from '../core/safe-paths.js';
|
|
8
|
-
import { safeText } from '../core/util.js';
|
|
9
|
-
import { isSafeFileName } from '../shared/paths.js';
|
|
10
|
-
import { removeRefusal, safeRemove } from '../shared/
|
|
11
|
-
import { writeJsonAtomic } from '../shared/
|
|
8
|
+
import { safeText } from '../core/util/index.js';
|
|
9
|
+
import { isSafeFileName } from '../shared/paths/index.js';
|
|
10
|
+
import { removeRefusal, safeRemove } from '../shared/io/index.js';
|
|
11
|
+
import { writeJsonAtomic } from '../shared/io/index.js';
|
|
12
12
|
export const hostileInputSuite = {
|
|
13
13
|
name: 'hostile-input',
|
|
14
14
|
title: 'file names, deletes, printed text, mappings and state files from an untrusted sandbox',
|
package/dist/selftest/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Suite } from './suite.js';
|
|
1
|
+
import type { Suite } from './support/suite.js';
|
|
2
2
|
/** Every suite, in the order they run. The live ones come last: they are the slowest and need Windows. */
|
|
3
3
|
export declare const SUITES: Suite[];
|
|
4
4
|
/** Windows Sandbox (its user is always WDAGUtilityAccount) or a GitHub Actions runner: never someone's PC. */
|
package/dist/selftest/index.js
CHANGED
|
@@ -6,10 +6,10 @@
|
|
|
6
6
|
// comma-separated list) to run only those: `sandbox self-test config`, `npm test -- live-daemon`.
|
|
7
7
|
import os from 'node:os';
|
|
8
8
|
import path from 'node:path';
|
|
9
|
-
import { errMsg } from '../core/util.js';
|
|
10
|
-
import { createFixtures } from './fixtures.js';
|
|
11
|
-
import { createHarness } from './harness.js';
|
|
12
|
-
import { liveTestsAvailable } from './live.js';
|
|
9
|
+
import { errMsg } from '../core/util/index.js';
|
|
10
|
+
import { createFixtures } from './support/fixtures.js';
|
|
11
|
+
import { createHarness } from './support/harness.js';
|
|
12
|
+
import { liveTestsAvailable } from './support/live.js';
|
|
13
13
|
import { accountsSuite } from './accounts.test.js';
|
|
14
14
|
import { agentCommandsSuite } from './agent-commands.test.js';
|
|
15
15
|
import { channelSuite } from './channel.test.js';
|
|
@@ -42,29 +42,61 @@ import { toolchainsSuite } from './toolchains.test.js';
|
|
|
42
42
|
import { workspaceSuite } from './workspace.test.js';
|
|
43
43
|
import { workspaceViewSuite } from './workspace-view.test.js';
|
|
44
44
|
import { liveNetworkSuite } from './live-network.test.js';
|
|
45
|
+
import { liveTerminalSuite } from './live-terminal.test.js';
|
|
45
46
|
import { auditSuite } from './audit.test.js';
|
|
47
|
+
import { layoutSuite } from './layout.test.js';
|
|
46
48
|
/** Every suite, in the order they run. The live ones come last: they are the slowest and need Windows. */
|
|
47
49
|
export const SUITES = [
|
|
48
50
|
// settings and project files
|
|
49
|
-
configSuite,
|
|
51
|
+
configSuite,
|
|
52
|
+
workspaceSuite,
|
|
53
|
+
localConfigSuite,
|
|
50
54
|
// the generated sandbox and the guest that boots it
|
|
51
|
-
generateSuite,
|
|
55
|
+
generateSuite,
|
|
56
|
+
guestBootSuite,
|
|
57
|
+
mirrorSuite,
|
|
58
|
+
projectsSuite,
|
|
52
59
|
// syncing with this PC
|
|
53
|
-
syncSuite,
|
|
60
|
+
syncSuite,
|
|
61
|
+
accountsSuite,
|
|
62
|
+
workspaceViewSuite,
|
|
63
|
+
auditSuite,
|
|
54
64
|
// an untrusted sandbox: what the host refuses to do with what it finds
|
|
55
|
-
linksSuite,
|
|
65
|
+
linksSuite,
|
|
66
|
+
channelSuite,
|
|
67
|
+
gitAccessSuite,
|
|
68
|
+
repoGuardSuite,
|
|
69
|
+
secretsSuite,
|
|
70
|
+
hostileInputSuite,
|
|
71
|
+
testGuardSuite,
|
|
56
72
|
// pure helpers and the command line
|
|
57
|
-
|
|
73
|
+
layoutSuite,
|
|
74
|
+
toolchainsSuite,
|
|
75
|
+
detectSuite,
|
|
76
|
+
networkSuite,
|
|
77
|
+
personalizationSuite,
|
|
78
|
+
cmdlineSuite,
|
|
79
|
+
setupSuite,
|
|
80
|
+
dataSuite,
|
|
81
|
+
repairSuite,
|
|
82
|
+
cliSuite,
|
|
83
|
+
agentCommandsSuite,
|
|
58
84
|
// every command as its own process
|
|
59
85
|
hostSimSuite,
|
|
60
86
|
// real processes
|
|
61
|
-
liveDaemonSuite,
|
|
87
|
+
liveDaemonSuite,
|
|
88
|
+
liveProjectsSuite,
|
|
89
|
+
liveGitSuite,
|
|
90
|
+
liveNetworkSuite,
|
|
91
|
+
liveTerminalSuite,
|
|
62
92
|
];
|
|
63
93
|
/** Windows Sandbox (its user is always WDAGUtilityAccount) or a GitHub Actions runner: never someone's PC. */
|
|
64
94
|
export const onThrowawayMachine = () => os.userInfo().username.toLowerCase() === 'wdagutilityaccount' || process.env.GITHUB_ACTIONS === 'true';
|
|
65
95
|
const withDeadline = async (work, ms, what) => {
|
|
66
96
|
let timer;
|
|
67
|
-
const deadline = new Promise((_, reject) => {
|
|
97
|
+
const deadline = new Promise((_, reject) => {
|
|
98
|
+
timer = setTimeout(() => reject(new Error(what + ' did not finish within ' + Math.round(ms / 1000) + ' s')), ms);
|
|
99
|
+
});
|
|
68
100
|
try {
|
|
69
101
|
return await Promise.race([work, deadline]);
|
|
70
102
|
}
|
|
@@ -90,21 +122,46 @@ const runSuite = async (suite, t, f) => {
|
|
|
90
122
|
t.check(false, 'suite "' + suite.name + '" stopped with an unexpected error', errMsg(e) + (e instanceof Error && e.stack ? '\n' + e.stack : ''));
|
|
91
123
|
}
|
|
92
124
|
}
|
|
93
|
-
return {
|
|
125
|
+
return {
|
|
126
|
+
suite,
|
|
127
|
+
checks: t.checks() - checksBefore,
|
|
128
|
+
failed: t.failures() - failedBefore,
|
|
129
|
+
seconds: (Date.now() - started) / 1000,
|
|
130
|
+
note,
|
|
131
|
+
};
|
|
94
132
|
};
|
|
95
133
|
const printSummary = (results) => {
|
|
96
134
|
const width = Math.max(...results.map((r) => r.suite.name.length));
|
|
97
135
|
console.log('\n\x1b[36m-- summary\x1b[0m');
|
|
98
136
|
for (const r of results) {
|
|
99
137
|
const state = r.note ?? (r.failed ? r.failed + ' FAILED' : 'ok');
|
|
100
|
-
console.log(' ' +
|
|
138
|
+
console.log(' ' +
|
|
139
|
+
r.suite.name.padEnd(width) +
|
|
140
|
+
' ' +
|
|
141
|
+
String(r.checks).padStart(4) +
|
|
142
|
+
' checks ' +
|
|
143
|
+
r.seconds.toFixed(1).padStart(6) +
|
|
144
|
+
' s ' +
|
|
145
|
+
state);
|
|
101
146
|
}
|
|
102
147
|
const total = results.reduce((sum, r) => sum + r.checks, 0);
|
|
103
|
-
console.log(' ' +
|
|
148
|
+
console.log(' ' +
|
|
149
|
+
'total'.padEnd(width) +
|
|
150
|
+
' ' +
|
|
151
|
+
String(total).padStart(4) +
|
|
152
|
+
' checks ' +
|
|
153
|
+
results
|
|
154
|
+
.reduce((sum, r) => sum + r.seconds, 0)
|
|
155
|
+
.toFixed(1)
|
|
156
|
+
.padStart(6) +
|
|
157
|
+
' s');
|
|
104
158
|
};
|
|
105
159
|
/** Resolves "a,b" / ["a", "b"] to suites; throws with the list of valid names for an unknown one. */
|
|
106
160
|
export const pickSuites = (names) => {
|
|
107
|
-
const wanted = names
|
|
161
|
+
const wanted = names
|
|
162
|
+
.flatMap((n) => n.split(','))
|
|
163
|
+
.map((n) => n.trim())
|
|
164
|
+
.filter(Boolean);
|
|
108
165
|
if (wanted.length === 0)
|
|
109
166
|
return SUITES;
|
|
110
167
|
const unknown = wanted.filter((name) => !SUITES.some((s) => s.name === name));
|
|
@@ -114,7 +171,7 @@ export const pickSuites = (names) => {
|
|
|
114
171
|
};
|
|
115
172
|
export const selfTest = async (packageRoot, suiteNames = []) => {
|
|
116
173
|
if (!onThrowawayMachine()) {
|
|
117
|
-
console.error(
|
|
174
|
+
console.error("The self-test only runs inside a Windows Sandbox, so it can never change this PC.\nRun it there: `sandbox start` in this folder, then `npm test` in the sandbox's terminal.");
|
|
118
175
|
return 1;
|
|
119
176
|
}
|
|
120
177
|
let chosen;
|