windows-development-sandbox 1.4.1 → 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/config.example.json +3 -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 +327 -53
- 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/{progress.d.ts → output/progress.d.ts} +5 -5
- package/dist/cli/{progress.js → output/progress.js} +42 -19
- 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} +3 -18
- package/dist/core/{local-config.js → local-config/overrides.js} +45 -52
- package/dist/core/local-config/policy.d.ts +19 -0
- package/dist/core/local-config/policy.js +45 -0
- 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 +15 -10
- 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 +1 -1
- package/dist/core/schema/projects.js +16 -6
- package/dist/core/schema/sandbox.d.ts +11 -11
- 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 +19 -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} +96 -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 -106
- 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} +22 -13
- 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 +5 -5
- package/dist/host/launch/mappings.js +37 -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/{join.d.ts → projects/join.d.ts} +12 -9
- package/dist/host/{join.js → projects/join.js} +62 -33
- 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 +4220 -1968
- package/dist/runtime/db.js +2134 -849
- package/dist/runtime/gitguard.js +29 -11
- package/dist/runtime/main.js +4687 -2243
- package/dist/runtime/netproxy.js +1644 -420
- package/dist/runtime/view.js +1356 -428
- 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 +63 -16
- 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 +72 -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 +1 -1
- package/dist/selftest/live-terminal.test.js +41 -15
- package/dist/selftest/local-config.test.d.ts +1 -1
- package/dist/selftest/local-config.test.js +64 -16
- package/dist/selftest/mirror.test.d.ts +1 -1
- package/dist/selftest/mirror.test.js +102 -32
- 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 +280 -85
- 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} +5 -3
- 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} +38 -21
- package/dist/shared/{schema.js → channel/schema.js} +62 -35
- 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} +6 -12
- package/dist/shared/{guest-paths.js → paths/guest-paths.js} +53 -36
- package/dist/shared/paths/index.d.ts +3 -0
- package/dist/shared/paths/index.js +3 -0
- package/dist/shared/{projects.js → paths/projects.js} +13 -3
- package/dist/shared/pty/client.d.ts +21 -0
- package/dist/shared/pty/client.js +79 -0
- package/dist/shared/{console-input.js → pty/console-input.js} +26 -6
- 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/schemas/config.schema.json +34 -1
- package/schemas/sandbox-config.schema.json +34 -1
- package/dist/cli/boot-progress.d.ts +0 -22
- package/dist/cli/boot-progress.js +0 -59
- package/dist/cli/commands/launch.d.ts +0 -32
- package/dist/cli/commands/launch.js +0 -421
- package/dist/cli/commands/maintenance.d.ts +0 -10
- package/dist/cli/commands/maintenance.js +0 -220
- package/dist/cli/commands/project.d.ts +0 -33
- package/dist/cli/commands/project.js +0 -102
- 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 -95
- package/dist/cli/commands/sessions.d.ts +0 -12
- package/dist/cli/commands/sessions.js +0 -258
- package/dist/cli/menu/settings/editors.js +0 -305
- 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/project-policy.d.ts +0 -62
- package/dist/core/project-policy.js +0 -121
- 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 -35
- package/dist/core/workspace.js +0 -206
- package/dist/guest/boot-env.d.ts +0 -4
- package/dist/guest/daemon.js +0 -57
- package/dist/guest/env.d.ts +0 -56
- package/dist/guest/env.js +0 -115
- 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 -163
- package/dist/host/generate.d.ts +0 -13
- package/dist/host/generate.js +0 -115
- package/dist/host/launch/projects.d.ts +0 -17
- 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 -123
- package/dist/host/projects.js +0 -196
- 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 -63
- package/dist/shared/download.js +0 -238
- package/dist/shared/pty-client.d.ts +0 -108
- package/dist/shared/pty-client.js +0 -406
- package/dist/shared/rundir.d.ts +0 -41
- package/dist/shared/rundir.js +0 -96
- /package/dist/{guest/daemon.d.ts → cli/tui/list/list-types.js} +0 -0
- /package/dist/{guest/db.d.ts → cli/tui/screen.js} +0 -0
- /package/dist/core/{detect-databases.d.ts → detect/databases.d.ts} +0 -0
- /package/dist/{guest/toolchains → core/detect}/versions.d.ts +0 -0
- /package/dist/guest/{setup/agents.d.ts → agents/agent-installer.d.ts} +0 -0
- /package/dist/guest/{audit-parse.d.ts → audit/parse.d.ts} +0 -0
- /package/dist/guest/{guide.d.ts → boot/guide.d.ts} +0 -0
- /package/dist/guest/daemon/{shutdown.d.ts → idle-shutdown.d.ts} +0 -0
- /package/dist/guest/daemon/{session.d.ts → sessions.d.ts} +0 -0
- /package/dist/guest/{main.d.ts → entries/daemon.d.ts} +0 -0
- /package/dist/guest/{netproxy.d.ts → entries/db.d.ts} +0 -0
- /package/dist/{selftest/suite.js → guest/entries/gitguard.d.ts} +0 -0
- /package/dist/guest/{gitguard.d.ts → git/decision.d.ts} +0 -0
- /package/dist/guest/{ports.d.ts → runtime/ports.d.ts} +0 -0
- /package/dist/guest/{project-context.d.ts → runtime/project-context.d.ts} +0 -0
- /package/dist/guest/{cmdline.d.ts → sessions/cmdline.d.ts} +0 -0
- /package/dist/guest/{ptyhost.d.ts → sessions/pty-host.d.ts} +0 -0
- /package/dist/guest/{view.d.ts → sessions/viewer.d.ts} +0 -0
- /package/dist/guest/setup/{policy.d.ts → managed-policy.d.ts} +0 -0
- /package/dist/host/{window.d.ts → sandbox/window.d.ts} +0 -0
- /package/dist/host/{wsb.d.ts → sandbox/wsb-cli.d.ts} +0 -0
- /package/dist/host/{cleanup.d.ts → storage/cleanup.d.ts} +0 -0
- /package/dist/selftest/{harness.d.ts → support/harness.d.ts} +0 -0
- /package/dist/selftest/{suite.d.ts → support/suite.d.ts} +0 -0
- /package/dist/shared/{safe-remove.d.ts → io/safe-remove.d.ts} +0 -0
- /package/dist/shared/{netrules.d.ts → network/firewall-rules.d.ts} +0 -0
- /package/dist/shared/{netpolicy.d.ts → network/policy.d.ts} +0 -0
- /package/dist/shared/{paths.d.ts → paths/claude-paths.d.ts} +0 -0
- /package/dist/shared/{projects.d.ts → paths/projects.d.ts} +0 -0
- /package/dist/shared/{console-input.d.ts → pty/console-input.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';
|
|
@@ -44,28 +44,59 @@ import { workspaceViewSuite } from './workspace-view.test.js';
|
|
|
44
44
|
import { liveNetworkSuite } from './live-network.test.js';
|
|
45
45
|
import { liveTerminalSuite } from './live-terminal.test.js';
|
|
46
46
|
import { auditSuite } from './audit.test.js';
|
|
47
|
+
import { layoutSuite } from './layout.test.js';
|
|
47
48
|
/** Every suite, in the order they run. The live ones come last: they are the slowest and need Windows. */
|
|
48
49
|
export const SUITES = [
|
|
49
50
|
// settings and project files
|
|
50
|
-
configSuite,
|
|
51
|
+
configSuite,
|
|
52
|
+
workspaceSuite,
|
|
53
|
+
localConfigSuite,
|
|
51
54
|
// the generated sandbox and the guest that boots it
|
|
52
|
-
generateSuite,
|
|
55
|
+
generateSuite,
|
|
56
|
+
guestBootSuite,
|
|
57
|
+
mirrorSuite,
|
|
58
|
+
projectsSuite,
|
|
53
59
|
// syncing with this PC
|
|
54
|
-
syncSuite,
|
|
60
|
+
syncSuite,
|
|
61
|
+
accountsSuite,
|
|
62
|
+
workspaceViewSuite,
|
|
63
|
+
auditSuite,
|
|
55
64
|
// an untrusted sandbox: what the host refuses to do with what it finds
|
|
56
|
-
linksSuite,
|
|
65
|
+
linksSuite,
|
|
66
|
+
channelSuite,
|
|
67
|
+
gitAccessSuite,
|
|
68
|
+
repoGuardSuite,
|
|
69
|
+
secretsSuite,
|
|
70
|
+
hostileInputSuite,
|
|
71
|
+
testGuardSuite,
|
|
57
72
|
// pure helpers and the command line
|
|
58
|
-
|
|
73
|
+
layoutSuite,
|
|
74
|
+
toolchainsSuite,
|
|
75
|
+
detectSuite,
|
|
76
|
+
networkSuite,
|
|
77
|
+
personalizationSuite,
|
|
78
|
+
cmdlineSuite,
|
|
79
|
+
setupSuite,
|
|
80
|
+
dataSuite,
|
|
81
|
+
repairSuite,
|
|
82
|
+
cliSuite,
|
|
83
|
+
agentCommandsSuite,
|
|
59
84
|
// every command as its own process
|
|
60
85
|
hostSimSuite,
|
|
61
86
|
// real processes
|
|
62
|
-
liveDaemonSuite,
|
|
87
|
+
liveDaemonSuite,
|
|
88
|
+
liveProjectsSuite,
|
|
89
|
+
liveGitSuite,
|
|
90
|
+
liveNetworkSuite,
|
|
91
|
+
liveTerminalSuite,
|
|
63
92
|
];
|
|
64
93
|
/** Windows Sandbox (its user is always WDAGUtilityAccount) or a GitHub Actions runner: never someone's PC. */
|
|
65
94
|
export const onThrowawayMachine = () => os.userInfo().username.toLowerCase() === 'wdagutilityaccount' || process.env.GITHUB_ACTIONS === 'true';
|
|
66
95
|
const withDeadline = async (work, ms, what) => {
|
|
67
96
|
let timer;
|
|
68
|
-
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
|
+
});
|
|
69
100
|
try {
|
|
70
101
|
return await Promise.race([work, deadline]);
|
|
71
102
|
}
|
|
@@ -91,21 +122,46 @@ const runSuite = async (suite, t, f) => {
|
|
|
91
122
|
t.check(false, 'suite "' + suite.name + '" stopped with an unexpected error', errMsg(e) + (e instanceof Error && e.stack ? '\n' + e.stack : ''));
|
|
92
123
|
}
|
|
93
124
|
}
|
|
94
|
-
return {
|
|
125
|
+
return {
|
|
126
|
+
suite,
|
|
127
|
+
checks: t.checks() - checksBefore,
|
|
128
|
+
failed: t.failures() - failedBefore,
|
|
129
|
+
seconds: (Date.now() - started) / 1000,
|
|
130
|
+
note,
|
|
131
|
+
};
|
|
95
132
|
};
|
|
96
133
|
const printSummary = (results) => {
|
|
97
134
|
const width = Math.max(...results.map((r) => r.suite.name.length));
|
|
98
135
|
console.log('\n\x1b[36m-- summary\x1b[0m');
|
|
99
136
|
for (const r of results) {
|
|
100
137
|
const state = r.note ?? (r.failed ? r.failed + ' FAILED' : 'ok');
|
|
101
|
-
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);
|
|
102
146
|
}
|
|
103
147
|
const total = results.reduce((sum, r) => sum + r.checks, 0);
|
|
104
|
-
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');
|
|
105
158
|
};
|
|
106
159
|
/** Resolves "a,b" / ["a", "b"] to suites; throws with the list of valid names for an unknown one. */
|
|
107
160
|
export const pickSuites = (names) => {
|
|
108
|
-
const wanted = names
|
|
161
|
+
const wanted = names
|
|
162
|
+
.flatMap((n) => n.split(','))
|
|
163
|
+
.map((n) => n.trim())
|
|
164
|
+
.filter(Boolean);
|
|
109
165
|
if (wanted.length === 0)
|
|
110
166
|
return SUITES;
|
|
111
167
|
const unknown = wanted.filter((name) => !SUITES.some((s) => s.name === name));
|
|
@@ -115,7 +171,7 @@ export const pickSuites = (names) => {
|
|
|
115
171
|
};
|
|
116
172
|
export const selfTest = async (packageRoot, suiteNames = []) => {
|
|
117
173
|
if (!onThrowawayMachine()) {
|
|
118
|
-
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.");
|
|
119
175
|
return 1;
|
|
120
176
|
}
|
|
121
177
|
let chosen;
|