windows-development-sandbox 1.4.0 → 1.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.sandbox-config.example.json +2 -1
- package/config.example.json +4 -1
- package/dist/api.js +27 -16
- package/dist/cli/args.d.ts +4 -6
- package/dist/cli/args.js +67 -34
- package/dist/cli/argv.d.ts +9 -0
- package/dist/cli/argv.js +22 -0
- package/dist/cli/commands/accounts.d.ts +1 -1
- package/dist/cli/commands/accounts.js +42 -27
- package/dist/cli/commands/agent-commands.d.ts +3 -3
- package/dist/cli/commands/agent-commands.js +27 -18
- package/dist/cli/commands/context.d.ts +9 -11
- package/dist/cli/commands/context.js +35 -32
- package/dist/cli/commands/data/clean.d.ts +2 -2
- package/dist/cli/commands/data/clean.js +27 -11
- package/dist/cli/commands/data/collect.d.ts +6 -3
- package/dist/cli/commands/data/collect.js +46 -15
- package/dist/cli/commands/data/index.d.ts +2 -2
- package/dist/cli/commands/data/index.js +30 -12
- package/dist/cli/commands/data/remove.d.ts +1 -1
- package/dist/cli/commands/data/remove.js +4 -4
- package/dist/cli/commands/index.d.ts +5 -4
- package/dist/cli/commands/index.js +5 -4
- package/dist/cli/commands/launch/add-root.d.ts +7 -0
- package/dist/cli/commands/launch/add-root.js +64 -0
- package/dist/cli/commands/launch/boot-progress.d.ts +7 -0
- package/dist/cli/commands/launch/boot-progress.js +48 -0
- package/dist/cli/commands/launch/boot-wants.d.ts +11 -0
- package/dist/cli/commands/launch/boot-wants.js +48 -0
- package/dist/cli/commands/launch/first-start.d.ts +10 -0
- package/dist/cli/commands/launch/first-start.js +53 -0
- package/dist/cli/commands/launch/index.d.ts +6 -0
- package/dist/cli/commands/launch/index.js +6 -0
- package/dist/cli/commands/launch/launch.d.ts +8 -0
- package/dist/cli/commands/launch/launch.js +211 -0
- package/dist/cli/commands/launch/prepare.d.ts +23 -0
- package/dist/cli/commands/launch/prepare.js +109 -0
- package/dist/cli/commands/launch/running.d.ts +45 -0
- package/dist/cli/commands/launch/running.js +218 -0
- package/dist/cli/commands/launch/summary.d.ts +8 -0
- package/dist/cli/commands/launch/summary.js +98 -0
- package/dist/cli/commands/maintenance/audit.d.ts +3 -0
- package/dist/cli/commands/maintenance/audit.js +58 -0
- package/dist/cli/commands/maintenance/clean.d.ts +2 -0
- package/dist/cli/commands/maintenance/clean.js +10 -0
- package/dist/cli/commands/maintenance/config.d.ts +2 -0
- package/dist/cli/commands/maintenance/config.js +145 -0
- package/dist/cli/commands/maintenance/doctor.d.ts +2 -0
- package/dist/cli/commands/maintenance/doctor.js +52 -0
- package/dist/cli/commands/maintenance/host-claude.d.ts +2 -0
- package/dist/cli/commands/maintenance/host-claude.js +4 -0
- package/dist/cli/commands/maintenance/index.d.ts +8 -0
- package/dist/cli/commands/maintenance/index.js +9 -0
- package/dist/cli/commands/maintenance/logs.d.ts +2 -0
- package/dist/cli/commands/maintenance/logs.js +44 -0
- package/dist/cli/commands/maintenance/sync.d.ts +2 -0
- package/dist/cli/commands/maintenance/sync.js +12 -0
- package/dist/cli/commands/maintenance/watch.d.ts +3 -0
- package/dist/cli/commands/maintenance/watch.js +6 -0
- package/dist/cli/commands/projects/describe-sessions.d.ts +3 -0
- package/dist/cli/commands/projects/describe-sessions.js +15 -0
- package/dist/cli/commands/projects/here.d.ts +38 -0
- package/dist/cli/commands/projects/here.js +145 -0
- package/dist/cli/commands/projects/index.d.ts +4 -0
- package/dist/cli/commands/projects/index.js +4 -0
- package/dist/cli/commands/projects/projects.d.ts +14 -0
- package/dist/cli/commands/projects/projects.js +213 -0
- package/dist/cli/commands/projects/restart.d.ts +15 -0
- package/dist/cli/commands/projects/restart.js +149 -0
- package/dist/cli/commands/registry.d.ts +3 -0
- package/dist/cli/commands/registry.js +34 -0
- package/dist/cli/commands/repair/checks.js +105 -29
- package/dist/cli/commands/repair/finders.d.ts +13 -10
- package/dist/cli/commands/repair/finders.js +63 -43
- package/dist/cli/commands/repair/index.d.ts +4 -4
- package/dist/cli/commands/repair/index.js +47 -21
- package/dist/cli/commands/repair/types.d.ts +2 -2
- package/dist/cli/commands/repair/types.js +7 -2
- package/dist/cli/commands/sessions/attach.d.ts +2 -0
- package/dist/cli/commands/sessions/attach.js +45 -0
- package/dist/cli/commands/sessions/control.d.ts +4 -0
- package/dist/cli/commands/sessions/control.js +62 -0
- package/dist/cli/commands/sessions/exec.d.ts +6 -0
- package/dist/cli/commands/sessions/exec.js +72 -0
- package/dist/cli/commands/sessions/index.d.ts +6 -0
- package/dist/cli/commands/sessions/index.js +9 -0
- package/dist/cli/commands/sessions/list.d.ts +15 -0
- package/dist/cli/commands/sessions/list.js +65 -0
- package/dist/cli/commands/sessions/status.d.ts +2 -0
- package/dist/cli/commands/sessions/status.js +153 -0
- package/dist/cli/commands/sessions/window.d.ts +3 -0
- package/dist/cli/commands/sessions/window.js +18 -0
- package/dist/cli/commands/setup/checks.d.ts +4 -4
- package/dist/cli/commands/setup/checks.js +36 -19
- package/dist/cli/commands/setup/facts.d.ts +6 -6
- package/dist/cli/commands/setup/facts.js +23 -11
- package/dist/cli/commands/setup/index.d.ts +1 -1
- package/dist/cli/commands/setup/index.js +25 -12
- package/dist/cli/commands/user-config.d.ts +5 -5
- package/dist/cli/commands/user-config.js +14 -12
- package/dist/cli/history.d.ts +5 -4
- package/dist/cli/history.js +23 -11
- package/dist/cli/index.d.ts +4 -14
- package/dist/cli/index.js +27 -77
- package/dist/cli/manifest.d.ts +464 -10
- package/dist/cli/manifest.js +328 -54
- package/dist/cli/menu/apps.d.ts +7 -5
- package/dist/cli/menu/apps.js +64 -16
- package/dist/cli/menu/command-fields.d.ts +15 -0
- package/dist/cli/menu/command-fields.js +23 -0
- package/dist/cli/menu/command-form.d.ts +3 -5
- package/dist/cli/menu/command-form.js +116 -48
- package/dist/cli/menu/home.d.ts +22 -0
- package/dist/cli/menu/home.js +72 -0
- package/dist/cli/menu/index.d.ts +2 -24
- package/dist/cli/menu/index.js +4 -178
- package/dist/cli/menu/menu.d.ts +23 -0
- package/dist/cli/menu/menu.js +185 -0
- package/dist/cli/menu/settings/categories.d.ts +2 -2
- package/dist/cli/menu/settings/categories.js +123 -20
- package/dist/cli/menu/settings/collections/collection-editor.d.ts +23 -0
- package/dist/cli/menu/settings/collections/collection-editor.js +89 -0
- package/dist/cli/menu/settings/collections/map-editor.d.ts +10 -0
- package/dist/cli/menu/settings/collections/map-editor.js +34 -0
- package/dist/cli/menu/settings/collections/object-list-editor.d.ts +10 -0
- package/dist/cli/menu/settings/collections/object-list-editor.js +23 -0
- package/dist/cli/menu/settings/collections/object-map-editor.d.ts +10 -0
- package/dist/cli/menu/settings/collections/object-map-editor.js +35 -0
- package/dist/cli/menu/settings/collections/string-list-editor.d.ts +12 -0
- package/dist/cli/menu/settings/collections/string-list-editor.js +39 -0
- package/dist/cli/menu/settings/config-file.d.ts +2 -2
- package/dist/cli/menu/settings/config-file.js +42 -19
- package/dist/cli/menu/settings/editor-actions.d.ts +2 -0
- package/dist/cli/menu/settings/editor-actions.js +2 -0
- package/dist/cli/menu/settings/format.d.ts +5 -0
- package/dist/cli/menu/settings/format.js +39 -0
- package/dist/cli/menu/settings/index.d.ts +1 -29
- package/dist/cli/menu/settings/index.js +1 -133
- package/dist/cli/menu/settings/object-editor.d.ts +12 -0
- package/dist/cli/menu/settings/object-editor.js +86 -0
- package/dist/cli/menu/settings/schema-node.d.ts +3 -1
- package/dist/cli/menu/settings/schema-node.js +71 -24
- package/dist/cli/menu/settings/settings-editor.d.ts +30 -0
- package/dist/cli/menu/settings/settings-editor.js +176 -0
- package/dist/cli/menu/settings/{editors.d.ts → value-editor.d.ts} +2 -13
- package/dist/cli/menu/settings/value-editor.js +137 -0
- package/dist/cli/menu/several.d.ts +4 -4
- package/dist/cli/menu/several.js +61 -20
- package/dist/cli/{colors.d.ts → output/colors.d.ts} +8 -8
- package/dist/cli/{colors.js → output/colors.js} +32 -14
- package/dist/cli/output/index.d.ts +3 -0
- package/dist/cli/output/index.js +3 -0
- package/dist/cli/output/print.d.ts +5 -0
- package/dist/cli/output/print.js +14 -0
- package/dist/cli/output/progress.d.ts +24 -0
- package/dist/cli/output/progress.js +124 -0
- package/dist/cli/report.d.ts +2 -0
- package/dist/cli/report.js +20 -0
- package/dist/cli/tui/app.d.ts +6 -16
- package/dist/cli/tui/app.js +28 -8
- package/dist/cli/tui/dialogs/confirm-screen.d.ts +20 -0
- package/dist/cli/tui/dialogs/confirm-screen.js +50 -0
- package/dist/cli/tui/dialogs/message-screen.d.ts +17 -0
- package/dist/cli/tui/dialogs/message-screen.js +55 -0
- package/dist/cli/tui/dialogs/paragraphs.d.ts +2 -0
- package/dist/cli/tui/dialogs/paragraphs.js +5 -0
- package/dist/cli/tui/dialogs/text-screen.d.ts +26 -0
- package/dist/cli/tui/dialogs/text-screen.js +107 -0
- package/dist/cli/tui/frame.js +3 -1
- package/dist/cli/tui/index.d.ts +7 -3
- package/dist/cli/tui/index.js +4 -2
- package/dist/cli/tui/list/list-screen.d.ts +29 -0
- package/dist/cli/tui/{list-screen.js → list/list-screen.js} +86 -23
- package/dist/cli/tui/{list-screen.d.ts → list/list-types.d.ts} +0 -28
- package/dist/cli/tui/screen.d.ts +14 -0
- package/dist/cli/tui/terminal.js +34 -10
- package/dist/cli/tui/text.d.ts +2 -1
- package/dist/cli/tui/text.js +37 -7
- package/dist/cli/tui/theme.js +27 -9
- package/dist/cli/validate.d.ts +8 -8
- package/dist/cli/validate.js +32 -21
- package/dist/core/config/defaults.d.ts +2 -0
- package/dist/core/config/defaults.js +203 -0
- package/dist/core/config/index.d.ts +2 -0
- package/dist/core/config/index.js +3 -0
- package/dist/core/{config.d.ts → config/loader.d.ts} +1 -2
- package/dist/core/config/loader.js +47 -0
- package/dist/core/{detect-databases.js → detect/databases.js} +111 -23
- package/dist/core/detect/index.d.ts +4 -0
- package/dist/core/detect/index.js +4 -0
- package/dist/core/{detect-pwsh.d.ts → detect/pwsh.d.ts} +1 -1
- package/dist/core/{detect-pwsh.js → detect/pwsh.js} +25 -11
- package/dist/core/{detect-toolchains.d.ts → detect/toolchains.d.ts} +1 -1
- package/dist/core/{detect-toolchains.js → detect/toolchains.js} +42 -5
- package/dist/{guest/toolchains → core/detect}/versions.js +28 -12
- package/dist/core/disk.d.ts +2 -0
- package/dist/core/disk.js +46 -3
- package/dist/core/local-config/boot-wants.d.ts +45 -0
- package/dist/core/local-config/boot-wants.js +120 -0
- package/dist/core/local-config/file.d.ts +3 -0
- package/dist/core/local-config/file.js +16 -0
- package/dist/core/local-config/index.d.ts +5 -0
- package/dist/core/local-config/index.js +7 -0
- package/dist/core/{local-config.d.ts → local-config/overrides.d.ts} +11 -11
- package/dist/core/{local-config.js → local-config/overrides.js} +53 -54
- package/dist/core/{project-policy.d.ts → local-config/policy.d.ts} +7 -3
- package/dist/core/{project-policy.js → local-config/policy.js} +16 -6
- package/dist/core/local-config/trust.d.ts +13 -0
- package/dist/core/local-config/trust.js +43 -0
- package/dist/core/package-info.d.ts +4 -0
- package/dist/core/package-info.js +13 -0
- package/dist/core/run/guest-workspace.d.ts +23 -0
- package/dist/core/run/guest-workspace.js +47 -0
- package/dist/core/run/index.d.ts +3 -0
- package/dist/core/run/index.js +3 -0
- package/dist/core/run/resolve-run.d.ts +3 -0
- package/dist/core/run/resolve-run.js +202 -0
- package/dist/core/run/versions.d.ts +13 -0
- package/dist/core/run/versions.js +65 -0
- package/dist/core/safe-paths.js +17 -5
- package/dist/core/schema/apps.d.ts +4 -4
- package/dist/core/schema/apps.js +55 -21
- package/dist/core/schema/common.d.ts +13 -10
- package/dist/core/schema/common.js +16 -10
- package/dist/core/schema/config.d.ts +18 -12
- package/dist/core/schema/config.js +78 -53
- package/dist/core/schema/databases.d.ts +4 -3
- package/dist/core/schema/databases.js +16 -12
- package/dist/core/schema/harness.d.ts +1 -1
- package/dist/core/schema/harness.js +17 -7
- package/dist/core/schema/index.d.ts +6 -0
- package/dist/core/schema/index.js +8 -0
- package/dist/core/schema/json-schema.js +10 -5
- package/dist/core/schema/profile.d.ts +4 -4
- package/dist/core/schema/profile.js +37 -17
- package/dist/core/schema/projects.d.ts +2 -1
- package/dist/core/schema/projects.js +16 -5
- package/dist/core/schema/sandbox.d.ts +12 -12
- package/dist/core/schema/sandbox.js +101 -37
- package/dist/core/schema/toolchains.d.ts +6 -1
- package/dist/core/schema/toolchains.js +84 -34
- package/dist/core/types.d.ts +36 -9
- package/dist/core/util/errors.d.ts +8 -0
- package/dist/core/util/errors.js +14 -0
- package/dist/core/util/fs.d.ts +8 -0
- package/dist/core/util/fs.js +40 -0
- package/dist/core/util/index.d.ts +7 -0
- package/dist/core/util/index.js +7 -0
- package/dist/core/util/jsonc.d.ts +6 -0
- package/dist/core/util/jsonc.js +25 -0
- package/dist/core/util/links.d.ts +10 -0
- package/dist/core/util/links.js +39 -0
- package/dist/core/util/paths.d.ts +7 -0
- package/dist/core/util/paths.js +33 -0
- package/dist/core/util/process.d.ts +15 -0
- package/dist/core/util/process.js +54 -0
- package/dist/core/util/text.d.ts +8 -0
- package/dist/core/util/text.js +8 -0
- package/dist/guest/{setup/agents.js → agents/agent-installer.js} +24 -4
- package/dist/guest/apps/after-install.d.ts +3 -0
- package/dist/guest/apps/after-install.js +47 -0
- package/dist/guest/apps/app-installer.d.ts +22 -0
- package/dist/guest/apps/app-installer.js +116 -0
- package/dist/guest/apps/find-exe.d.ts +5 -0
- package/dist/guest/apps/find-exe.js +41 -0
- package/dist/guest/apps/index.d.ts +3 -10
- package/dist/guest/apps/index.js +6 -206
- package/dist/guest/apps/resolvers.js +37 -9
- package/dist/guest/apps/shortcuts.d.ts +6 -0
- package/dist/guest/apps/shortcuts.js +28 -0
- package/dist/guest/apps/sources.d.ts +4 -0
- package/dist/guest/apps/sources.js +17 -0
- package/dist/guest/apps/unpack.d.ts +3 -0
- package/dist/guest/apps/unpack.js +47 -0
- package/dist/guest/{audit-parse.js → audit/parse.js} +39 -3
- package/dist/guest/{audit.d.ts → audit/process-audit.d.ts} +3 -1
- package/dist/guest/{audit.js → audit/process-audit.js} +33 -8
- package/dist/guest/boot/boot-env.d.ts +4 -0
- package/dist/guest/{boot-env.js → boot/boot-env.js} +7 -5
- package/dist/guest/boot/boot.d.ts +1 -0
- package/dist/guest/{main.js → boot/boot.js} +100 -50
- package/dist/guest/{guide.js → boot/guide.js} +32 -7
- package/dist/guest/{project-env.d.ts → boot/project-env.d.ts} +3 -3
- package/dist/guest/{project-env.js → boot/project-env.js} +12 -4
- package/dist/guest/boot/project-status.d.ts +5 -0
- package/dist/guest/boot/project-status.js +28 -0
- package/dist/guest/daemon/daemon.d.ts +1 -0
- package/dist/guest/daemon/daemon.js +51 -0
- package/dist/guest/daemon/exec.js +18 -6
- package/dist/guest/daemon/{shutdown.js → idle-shutdown.js} +5 -4
- package/dist/guest/daemon/{project.d.ts → project-provisioner.d.ts} +3 -3
- package/dist/guest/daemon/{project.js → project-provisioner.js} +60 -22
- package/dist/guest/daemon/relays.js +5 -3
- package/dist/guest/daemon/{session.js → sessions.js} +84 -24
- package/dist/guest/daemon/state.d.ts +4 -1
- package/dist/guest/daemon/state.js +34 -20
- package/dist/guest/databases/database-server.d.ts +13 -0
- package/dist/guest/databases/database-server.js +35 -0
- package/dist/guest/databases/dynamodb.d.ts +12 -0
- package/dist/guest/databases/dynamodb.js +81 -0
- package/dist/guest/databases/index.d.ts +2 -0
- package/dist/guest/databases/index.js +2 -0
- package/dist/guest/databases/mongodb.d.ts +7 -0
- package/dist/guest/databases/mongodb.js +46 -0
- package/dist/guest/databases/mysql.d.ts +7 -0
- package/dist/guest/databases/mysql.js +59 -0
- package/dist/guest/databases/names.d.ts +5 -0
- package/dist/guest/databases/names.js +8 -0
- package/dist/guest/databases/postgres.d.ts +9 -0
- package/dist/guest/databases/postgres.js +85 -0
- package/dist/guest/databases/redis.d.ts +7 -0
- package/dist/guest/databases/redis.js +25 -0
- package/dist/guest/databases/registry.d.ts +5 -0
- package/dist/guest/databases/registry.js +51 -0
- package/dist/guest/databases/sbx-db.d.ts +1 -0
- package/dist/guest/{db.js → databases/sbx-db.js} +13 -13
- package/dist/guest/{toolchains/databases → databases}/server.d.ts +5 -5
- package/dist/guest/{toolchains/databases → databases}/server.js +18 -13
- package/dist/guest/entries/daemon.js +16 -0
- package/dist/guest/entries/db.js +10 -0
- package/dist/guest/entries/gitguard.js +20 -0
- package/dist/guest/entries/main.d.ts +1 -0
- package/dist/guest/entries/main.js +24 -0
- package/dist/guest/entries/netproxy.d.ts +1 -0
- package/dist/guest/entries/netproxy.js +7 -0
- package/dist/guest/entries/view.d.ts +1 -0
- package/dist/guest/entries/view.js +11 -0
- package/dist/guest/{gitguard.js → git/decision.js} +49 -26
- package/dist/guest/network/addresses.d.ts +2 -0
- package/dist/guest/network/addresses.js +6 -0
- package/dist/guest/{setup/network.d.ts → network/allow-only.d.ts} +0 -10
- package/dist/guest/network/allow-only.js +84 -0
- package/dist/guest/network/firewall.d.ts +9 -0
- package/dist/guest/{setup/network.js → network/firewall.js} +58 -63
- package/dist/guest/network/proxy-server.d.ts +2 -0
- package/dist/guest/{netproxy.js → network/proxy-server.js} +37 -18
- package/dist/guest/{helpers.d.ts → runtime/csc.d.ts} +1 -1
- package/dist/guest/{helpers.js → runtime/csc.js} +7 -2
- package/dist/guest/runtime/fs.d.ts +2 -0
- package/dist/guest/runtime/fs.js +6 -0
- package/dist/guest/runtime/log.d.ts +3 -0
- package/dist/guest/runtime/log.js +22 -0
- package/dist/guest/runtime/paths.d.ts +13 -0
- package/dist/guest/runtime/paths.js +14 -0
- package/dist/guest/{ports.js → runtime/ports.js} +8 -2
- package/dist/guest/runtime/process.d.ts +15 -0
- package/dist/guest/runtime/process.js +59 -0
- package/dist/guest/{project-context.js → runtime/project-context.js} +1 -1
- package/dist/guest/runtime/session.d.ts +5 -0
- package/dist/guest/runtime/session.js +10 -0
- package/dist/guest/runtime/status.d.ts +7 -0
- package/dist/guest/runtime/status.js +57 -0
- package/dist/guest/{cmdline.js → sessions/cmdline.js} +10 -4
- package/dist/guest/{ptyhost.js → sessions/pty-host.js} +12 -5
- package/dist/guest/{view.js → sessions/viewer.js} +8 -11
- package/dist/guest/setup/claude-mem.d.ts +10 -0
- package/dist/guest/setup/{claude.js → claude-mem.js} +18 -78
- package/dist/guest/setup/{claude.d.ts → claude-profile.d.ts} +0 -10
- package/dist/guest/setup/claude-profile.js +89 -0
- package/dist/guest/setup/desktop.d.ts +2 -0
- package/dist/guest/setup/desktop.js +32 -0
- package/dist/guest/setup/environment.js +28 -5
- package/dist/guest/setup/{user.d.ts → git-identity.d.ts} +0 -2
- package/dist/guest/setup/git-identity.js +34 -0
- package/dist/guest/{gitrules.d.ts → setup/git-rules.d.ts} +1 -1
- package/dist/guest/setup/git-rules.js +50 -0
- package/dist/guest/setup/hooks.js +22 -5
- package/dist/guest/setup/{policy.js → managed-policy.js} +2 -2
- package/dist/guest/toolchains/catalogue.d.ts +4 -4
- package/dist/guest/toolchains/catalogue.js +30 -7
- package/dist/guest/toolchains/detect.d.ts +12 -0
- package/dist/guest/toolchains/detect.js +54 -0
- package/dist/guest/toolchains/index.d.ts +3 -17
- package/dist/guest/toolchains/index.js +1 -80
- package/dist/guest/toolchains/install.d.ts +20 -0
- package/dist/guest/toolchains/install.js +29 -0
- package/dist/guest/toolchains/languages/go.d.ts +3 -0
- package/dist/guest/toolchains/{go.js → languages/go.js} +27 -9
- package/dist/guest/toolchains/languages/java.d.ts +8 -0
- package/dist/guest/toolchains/{java.js → languages/java.js} +57 -18
- package/dist/guest/toolchains/languages/node.d.ts +3 -0
- package/dist/guest/toolchains/{node.js → languages/node.js} +51 -18
- package/dist/guest/toolchains/languages/php.d.ts +3 -0
- package/dist/guest/toolchains/{scripting → languages}/php.js +36 -11
- package/dist/guest/toolchains/languages/python-tools.d.ts +3 -0
- package/dist/guest/toolchains/languages/python-tools.js +12 -0
- package/dist/guest/toolchains/languages/python.d.ts +3 -0
- package/dist/guest/toolchains/{python.js → languages/python.js} +29 -16
- package/dist/guest/toolchains/languages/ruby.d.ts +3 -0
- package/dist/guest/toolchains/{scripting → languages}/ruby.js +28 -10
- package/dist/guest/toolchains/leftovers.d.ts +1 -1
- package/dist/guest/toolchains/leftovers.js +13 -11
- package/dist/guest/toolchains/managers.d.ts +6 -6
- package/dist/guest/toolchains/managers.js +38 -17
- package/dist/guest/toolchains/native/binstall.d.ts +3 -2
- package/dist/guest/toolchains/native/binstall.js +20 -8
- package/dist/guest/toolchains/native/cpp.d.ts +2 -2
- package/dist/guest/toolchains/native/cpp.js +23 -8
- package/dist/guest/toolchains/native/dotnet.d.ts +5 -3
- package/dist/guest/toolchains/native/dotnet.js +72 -24
- package/dist/guest/toolchains/native/mesa.d.ts +2 -2
- package/dist/guest/toolchains/native/mesa.js +27 -10
- package/dist/guest/toolchains/native/msvc/environment.d.ts +4 -4
- package/dist/guest/toolchains/native/msvc/environment.js +30 -16
- package/dist/guest/toolchains/native/msvc/index.d.ts +3 -3
- package/dist/guest/toolchains/native/msvc/index.js +10 -8
- package/dist/guest/toolchains/native/msvc/packages.d.ts +1 -1
- package/dist/guest/toolchains/native/msvc/packages.js +69 -23
- package/dist/guest/toolchains/native/msvc/tree.d.ts +6 -6
- package/dist/guest/toolchains/native/msvc/tree.js +15 -9
- package/dist/guest/toolchains/native/rust-extras.d.ts +23 -0
- package/dist/guest/toolchains/native/rust-extras.js +100 -0
- package/dist/guest/toolchains/native/rust.d.ts +2 -2
- package/dist/guest/toolchains/native/rust.js +41 -10
- package/dist/guest/toolchains/{scripting → native}/vcruntime.d.ts +2 -2
- package/dist/guest/toolchains/{scripting → native}/vcruntime.js +17 -7
- package/dist/guest/toolchains/package-ledger.d.ts +17 -0
- package/dist/guest/toolchains/package-ledger.js +54 -0
- package/dist/guest/toolchains/plan.d.ts +3 -24
- package/dist/guest/toolchains/plan.js +99 -111
- package/dist/guest/toolchains/runtimes.d.ts +6 -6
- package/dist/guest/toolchains/runtimes.js +31 -13
- package/dist/guest/toolchains/scheduler.d.ts +22 -0
- package/dist/guest/toolchains/scheduler.js +123 -0
- package/dist/guest/toolchains/setup.d.ts +10 -0
- package/dist/guest/toolchains/setup.js +22 -0
- package/dist/guest/toolchains/state-file.d.ts +3 -0
- package/dist/guest/toolchains/state-file.js +10 -0
- package/dist/guest/toolchains/step.d.ts +24 -0
- package/dist/guest/toolchains/step.js +1 -0
- package/dist/guest/toolchains/tool-env.d.ts +12 -0
- package/dist/guest/toolchains/tool-env.js +16 -0
- package/dist/guest/toolchains/tools/cli.d.ts +10 -0
- package/dist/guest/toolchains/{cli.js → tools/cli.js} +35 -15
- package/dist/guest/toolchains/tools/git.d.ts +3 -0
- package/dist/guest/toolchains/{git.js → tools/git.js} +38 -15
- package/dist/guest/toolchains/tools/pwsh.d.ts +4 -0
- package/dist/guest/toolchains/{pwsh.js → tools/pwsh.js} +14 -7
- package/dist/guest/toolchains/{vscode-profile.d.ts → tools/vscode-profile.d.ts} +6 -6
- package/dist/guest/toolchains/{vscode-profile.js → tools/vscode-profile.js} +28 -12
- package/dist/guest/toolchains/{vscode.d.ts → tools/vscode.d.ts} +6 -6
- package/dist/guest/toolchains/{vscode.js → tools/vscode.js} +67 -21
- package/dist/guest/toolchains/version-cache.d.ts +16 -0
- package/dist/guest/toolchains/version-cache.js +67 -0
- package/dist/host/agent-commands/commands.d.ts +13 -0
- package/dist/host/agent-commands/commands.js +33 -0
- package/dist/host/agent-commands/forwarders.d.ts +7 -0
- package/dist/host/agent-commands/forwarders.js +31 -0
- package/dist/host/agent-commands/index.d.ts +4 -0
- package/dist/host/agent-commands/index.js +4 -0
- package/dist/host/agent-commands/reconcile.d.ts +12 -0
- package/dist/host/agent-commands/reconcile.js +69 -0
- package/dist/host/agent-commands/user-path.d.ts +2 -0
- package/dist/host/agent-commands/user-path.js +33 -0
- package/dist/host/audit/collect.d.ts +2 -2
- package/dist/host/audit/collect.js +59 -22
- package/dist/host/audit/log.d.ts +2 -2
- package/dist/host/audit/log.js +24 -8
- package/dist/host/{attach.d.ts → channel/attach.d.ts} +2 -2
- package/dist/host/{attach.js → channel/attach.js} +33 -15
- package/dist/host/channel/channel.d.ts +51 -0
- package/dist/host/channel/channel.js +196 -0
- package/dist/host/channel/index.d.ts +2 -0
- package/dist/host/channel/index.js +2 -0
- package/dist/host/guard/agent-files.d.ts +7 -0
- package/dist/host/guard/agent-files.js +103 -0
- package/dist/host/guard/commands.d.ts +10 -0
- package/dist/host/guard/commands.js +123 -0
- package/dist/host/guard/file-hash.d.ts +4 -0
- package/dist/host/guard/file-hash.js +37 -0
- package/dist/host/guard/git-config.d.ts +5 -0
- package/dist/host/guard/git-config.js +62 -0
- package/dist/host/guard/git-dirs.d.ts +12 -0
- package/dist/host/guard/git-dirs.js +53 -0
- package/dist/host/guard/index.d.ts +5 -0
- package/dist/host/guard/index.js +4 -0
- package/dist/host/guard/mark-of-the-web.d.ts +8 -0
- package/dist/host/guard/mark-of-the-web.js +74 -0
- package/dist/host/guard/nested-repos.d.ts +14 -0
- package/dist/host/guard/nested-repos.js +88 -0
- package/dist/host/guard/quarantine.d.ts +3 -0
- package/dist/host/guard/quarantine.js +24 -0
- package/dist/host/guard/repo-guard.d.ts +10 -0
- package/dist/host/guard/repo-guard.js +36 -0
- package/dist/host/guard/store.d.ts +40 -0
- package/dist/host/guard/store.js +145 -0
- package/dist/host/guard/types.d.ts +27 -0
- package/dist/host/guard/types.js +3 -0
- package/dist/host/guard/watch-state.d.ts +9 -0
- package/dist/host/guard/watch-state.js +26 -0
- package/dist/host/launch/boot-projects.d.ts +17 -0
- package/dist/host/launch/{projects.js → boot-projects.js} +27 -12
- package/dist/host/{database-plan.d.ts → launch/database-plan.d.ts} +5 -5
- package/dist/host/{database-plan.js → launch/database-plan.js} +24 -13
- package/dist/host/launch/generate.d.ts +4 -0
- package/dist/host/launch/generate.js +77 -0
- package/dist/host/launch/index.d.ts +10 -0
- package/dist/host/launch/index.js +10 -0
- package/dist/host/launch/mappings.d.ts +7 -2
- package/dist/host/launch/mappings.js +83 -24
- package/dist/host/launch/pc-scan.d.ts +5 -0
- package/dist/host/{pc-scan.js → launch/pc-scan.js} +20 -13
- package/dist/host/launch/project-scan.d.ts +7 -0
- package/dist/host/{project-scan.js → launch/project-scan.js} +29 -21
- package/dist/host/launch/session-file.d.ts +23 -0
- package/dist/host/launch/session-file.js +73 -0
- package/dist/host/launch/stage.d.ts +5 -5
- package/dist/host/launch/stage.js +14 -13
- package/dist/host/launch/toolchains.d.ts +4 -0
- package/dist/host/launch/toolchains.js +11 -0
- package/dist/host/launch/{wsb.d.ts → wsb-file.d.ts} +4 -2
- package/dist/host/launch/wsb-file.js +56 -0
- package/dist/host/life/crash-report.d.ts +8 -0
- package/dist/host/life/crash-report.js +87 -0
- package/dist/host/life/index.d.ts +6 -0
- package/dist/host/life/index.js +6 -0
- package/dist/host/life/keep-awake.d.ts +10 -0
- package/dist/host/life/keep-awake.js +29 -0
- package/dist/host/life/life-record.d.ts +48 -0
- package/dist/host/life/life-record.js +76 -0
- package/dist/host/life/stop-events.d.ts +27 -0
- package/dist/host/life/stop-events.js +96 -0
- package/dist/host/life/stop-warning.d.ts +4 -0
- package/dist/host/life/stop-warning.js +25 -0
- package/dist/host/life/windows-update.d.ts +3 -0
- package/dist/host/life/windows-update.js +11 -0
- package/dist/host/native.d.ts +4 -0
- package/dist/host/native.js +11 -0
- package/dist/host/network/index.d.ts +1 -0
- package/dist/host/network/index.js +1 -0
- package/dist/host/{port-forward.d.ts → network/port-forward.d.ts} +1 -1
- package/dist/host/{port-forward.js → network/port-forward.js} +16 -10
- package/dist/host/profile/accounts.d.ts +37 -0
- package/dist/host/profile/accounts.js +146 -0
- package/dist/host/profile/claude-login.d.ts +22 -0
- package/dist/host/profile/claude-login.js +57 -0
- package/dist/host/{claude-profile.d.ts → profile/claude-profile.d.ts} +9 -9
- package/dist/host/{claude-profile.js → profile/claude-profile.js} +32 -22
- package/dist/host/profile/index.d.ts +7 -0
- package/dist/host/profile/index.js +7 -0
- package/dist/host/profile/personalize.d.ts +2 -0
- package/dist/host/profile/personalize.js +127 -0
- package/dist/host/profile/reg-file.d.ts +8 -0
- package/dist/host/profile/reg-file.js +45 -0
- package/dist/host/profile/secret-files.d.ts +2 -0
- package/dist/host/profile/secret-files.js +25 -0
- package/dist/host/profile/secret-patterns.d.ts +6 -0
- package/dist/host/profile/secret-patterns.js +128 -0
- package/dist/host/profile/secrets.d.ts +12 -0
- package/dist/host/profile/secrets.js +100 -0
- package/dist/host/projects/index.d.ts +4 -0
- package/dist/host/projects/index.js +4 -0
- package/dist/host/projects/join.d.ts +38 -0
- package/dist/host/projects/join.js +119 -0
- package/dist/host/projects/known.d.ts +28 -0
- package/dist/host/projects/known.js +55 -0
- package/dist/host/projects/mapper.d.ts +29 -0
- package/dist/host/projects/mapper.js +88 -0
- package/dist/host/projects/registry.d.ts +83 -0
- package/dist/host/projects/registry.js +136 -0
- package/dist/host/sandbox/doctor.d.ts +2 -0
- package/dist/host/sandbox/doctor.js +42 -0
- package/dist/host/sandbox/host-claude.d.ts +1 -0
- package/dist/host/sandbox/host-claude.js +26 -0
- package/dist/host/sandbox/index.d.ts +6 -0
- package/dist/host/sandbox/index.js +6 -0
- package/dist/host/{platform.d.ts → sandbox/platform.d.ts} +0 -5
- package/dist/host/sandbox/platform.js +60 -0
- package/dist/host/sandbox/probe.d.ts +3 -0
- package/dist/host/sandbox/probe.js +47 -0
- package/dist/host/{window.js → sandbox/window.js} +7 -5
- package/dist/host/{wsb.js → sandbox/wsb-cli.js} +31 -8
- package/dist/host/{cleanup.js → storage/cleanup.js} +27 -12
- package/dist/host/storage/index.d.ts +2 -0
- package/dist/host/storage/index.js +2 -0
- package/dist/host/storage/state-files.d.ts +4 -0
- package/dist/host/storage/state-files.js +10 -0
- package/dist/host/test-guard.js +1 -1
- package/dist/host/tools/conpty.d.ts +8 -0
- package/dist/host/tools/conpty.js +58 -0
- package/dist/host/tools/index.d.ts +2 -0
- package/dist/host/tools/index.js +2 -0
- package/dist/host/{terminal.d.ts → tools/windows-terminal.d.ts} +2 -10
- package/dist/host/{terminal.js → tools/windows-terminal.js} +33 -57
- package/dist/host/workspace-view/active-views.d.ts +3 -0
- package/dist/host/workspace-view/active-views.js +22 -0
- package/dist/host/workspace-view/index.d.ts +2 -18
- package/dist/host/workspace-view/index.js +2 -49
- package/dist/host/workspace-view/plan.d.ts +16 -0
- package/dist/host/workspace-view/plan.js +50 -0
- package/dist/host/workspace-view/rules.js +10 -3
- package/dist/host/workspace-view/view-state.d.ts +10 -0
- package/dist/host/workspace-view/view-state.js +31 -0
- package/dist/host/workspace-view/view.d.ts +1 -0
- package/dist/host/workspace-view/view.js +51 -55
- package/dist/runtime/daemon.js +4232 -1918
- package/dist/runtime/db.js +2145 -830
- package/dist/runtime/gitguard.js +29 -11
- package/dist/runtime/main.js +4760 -2155
- package/dist/runtime/netproxy.js +1654 -418
- package/dist/runtime/view.js +1515 -453
- package/dist/selftest/accounts.test.d.ts +1 -1
- package/dist/selftest/accounts.test.js +20 -17
- package/dist/selftest/agent-commands.test.d.ts +1 -1
- package/dist/selftest/agent-commands.test.js +9 -5
- package/dist/selftest/audit.test.d.ts +1 -1
- package/dist/selftest/audit.test.js +46 -13
- package/dist/selftest/channel.test.d.ts +1 -1
- package/dist/selftest/channel.test.js +91 -8
- package/dist/selftest/cli.test.d.ts +1 -1
- package/dist/selftest/cli.test.js +68 -16
- package/dist/selftest/cmdline.test.d.ts +1 -1
- package/dist/selftest/cmdline.test.js +36 -7
- package/dist/selftest/config.test.d.ts +1 -1
- package/dist/selftest/config.test.js +12 -5
- package/dist/selftest/data.test.d.ts +1 -1
- package/dist/selftest/data.test.js +35 -6
- package/dist/selftest/detect.test.d.ts +1 -1
- package/dist/selftest/detect.test.js +22 -9
- package/dist/selftest/generate.test.d.ts +1 -1
- package/dist/selftest/generate.test.js +33 -9
- package/dist/selftest/git-access.test.d.ts +1 -1
- package/dist/selftest/git-access.test.js +42 -4
- package/dist/selftest/guest-boot.test.d.ts +1 -1
- package/dist/selftest/guest-boot.test.js +25 -7
- package/dist/selftest/host-sim.test.d.ts +1 -1
- package/dist/selftest/host-sim.test.js +27 -3
- package/dist/selftest/hostile-input.test.d.ts +1 -1
- package/dist/selftest/hostile-input.test.js +5 -5
- package/dist/selftest/index.d.ts +1 -1
- package/dist/selftest/index.js +73 -16
- package/dist/selftest/layout.test.d.ts +2 -0
- package/dist/selftest/layout.test.js +131 -0
- package/dist/selftest/links.test.d.ts +1 -1
- package/dist/selftest/links.test.js +16 -11
- package/dist/selftest/live-daemon.test.d.ts +1 -1
- package/dist/selftest/live-daemon.test.js +20 -8
- package/dist/selftest/live-git.test.d.ts +1 -1
- package/dist/selftest/live-git.test.js +13 -4
- package/dist/selftest/live-network.test.d.ts +1 -1
- package/dist/selftest/live-network.test.js +24 -9
- package/dist/selftest/live-projects.test.d.ts +1 -1
- package/dist/selftest/live-projects.test.js +47 -20
- package/dist/selftest/live-terminal.test.d.ts +2 -0
- package/dist/selftest/live-terminal.test.js +195 -0
- package/dist/selftest/local-config.test.d.ts +1 -1
- package/dist/selftest/local-config.test.js +88 -15
- package/dist/selftest/mirror.test.d.ts +1 -1
- package/dist/selftest/mirror.test.js +118 -19
- package/dist/selftest/network.test.d.ts +1 -1
- package/dist/selftest/network.test.js +17 -8
- package/dist/selftest/personalization.test.d.ts +1 -1
- package/dist/selftest/personalization.test.js +12 -5
- package/dist/selftest/projects.test.d.ts +1 -1
- package/dist/selftest/projects.test.js +336 -72
- package/dist/selftest/repair.test.d.ts +1 -1
- package/dist/selftest/repair.test.js +17 -5
- package/dist/selftest/repo-guard.test.d.ts +1 -1
- package/dist/selftest/repo-guard.test.js +21 -20
- package/dist/selftest/secrets.test.d.ts +1 -1
- package/dist/selftest/secrets.test.js +57 -13
- package/dist/selftest/setup.test.d.ts +1 -1
- package/dist/selftest/setup.test.js +25 -5
- package/dist/selftest/{fixtures.d.ts → support/fixtures.d.ts} +7 -4
- package/dist/selftest/{fixtures.js → support/fixtures.js} +95 -17
- package/dist/selftest/{harness.js → support/harness.js} +24 -7
- package/dist/selftest/{live.d.ts → support/live.d.ts} +2 -2
- package/dist/selftest/{live.js → support/live.js} +34 -10
- package/dist/selftest/support/suite.js +1 -0
- package/dist/selftest/sync.test.d.ts +1 -1
- package/dist/selftest/sync.test.js +64 -26
- package/dist/selftest/test-guard.test.d.ts +1 -1
- package/dist/selftest/test-guard.test.js +43 -15
- package/dist/selftest/toolchains.test.d.ts +1 -1
- package/dist/selftest/toolchains.test.js +135 -36
- package/dist/selftest/workspace-view.test.d.ts +1 -1
- package/dist/selftest/workspace-view.test.js +48 -11
- package/dist/selftest/workspace.test.d.ts +1 -1
- package/dist/selftest/workspace.test.js +13 -4
- package/dist/shared/{apps.d.ts → apps/catalogue.d.ts} +1 -11
- package/dist/shared/apps/catalogue.js +768 -0
- package/dist/shared/apps/index.d.ts +2 -0
- package/dist/shared/apps/index.js +2 -0
- package/dist/shared/apps/selection.d.ts +11 -0
- package/dist/shared/apps/selection.js +40 -0
- package/dist/shared/channel/index.d.ts +2 -0
- package/dist/shared/channel/index.js +2 -0
- package/dist/shared/channel/run-dir.d.ts +30 -0
- package/dist/shared/channel/run-dir.js +84 -0
- package/dist/shared/{schema.d.ts → channel/schema.d.ts} +60 -19
- package/dist/shared/channel/schema.js +131 -0
- package/dist/shared/download/archive.d.ts +13 -0
- package/dist/shared/download/archive.js +57 -0
- package/dist/shared/download/downloader.d.ts +35 -0
- package/dist/shared/download/downloader.js +110 -0
- package/dist/shared/download/github.d.ts +16 -0
- package/dist/shared/download/github.js +74 -0
- package/dist/shared/download/http.d.ts +5 -0
- package/dist/shared/download/http.js +30 -0
- package/dist/shared/download/index.d.ts +5 -0
- package/dist/shared/download/index.js +5 -0
- package/dist/shared/download/spawn.d.ts +2 -0
- package/dist/shared/download/spawn.js +7 -0
- package/dist/shared/io/index.d.ts +3 -0
- package/dist/shared/io/index.js +3 -0
- package/dist/shared/io/json-file.d.ts +10 -0
- package/dist/shared/io/json-file.js +21 -0
- package/dist/shared/io/json.d.ts +13 -0
- package/dist/shared/io/json.js +49 -0
- package/dist/shared/{safe-remove.js → io/safe-remove.js} +32 -7
- package/dist/shared/{netrules.js → network/firewall-rules.js} +36 -5
- package/dist/shared/network/index.d.ts +2 -0
- package/dist/shared/network/index.js +2 -0
- package/dist/shared/{netpolicy.js → network/policy.js} +66 -11
- package/dist/shared/{paths.js → paths/claude-paths.js} +12 -2
- package/dist/shared/{guest-paths.d.ts → paths/guest-paths.d.ts} +21 -0
- package/dist/shared/paths/guest-paths.js +146 -0
- package/dist/shared/paths/index.d.ts +3 -0
- package/dist/shared/paths/index.js +3 -0
- package/dist/shared/{projects.d.ts → paths/projects.d.ts} +27 -4
- package/dist/shared/paths/projects.js +136 -0
- package/dist/shared/pty/client.d.ts +21 -0
- package/dist/shared/pty/client.js +79 -0
- package/dist/shared/pty/console-input.d.ts +11 -0
- package/dist/shared/pty/console-input.js +81 -0
- package/dist/shared/pty/index.d.ts +6 -0
- package/dist/shared/pty/index.js +6 -0
- package/dist/shared/pty/input-joiner.d.ts +15 -0
- package/dist/shared/pty/input-joiner.js +44 -0
- package/dist/shared/pty/output-filter.d.ts +13 -0
- package/dist/shared/pty/output-filter.js +140 -0
- package/dist/shared/pty/protocol.d.ts +36 -0
- package/dist/shared/pty/protocol.js +60 -0
- package/dist/shared/pty/terminal.d.ts +24 -0
- package/dist/shared/pty/terminal.js +147 -0
- package/dist/shared/test-guard.js +3 -1
- package/dist/sync/claude-mem.d.ts +1 -1
- package/dist/sync/claude-mem.js +9 -4
- package/dist/sync/history.d.ts +1 -29
- package/dist/sync/history.js +57 -45
- package/dist/sync/index.d.ts +5 -0
- package/dist/sync/index.js +5 -0
- package/dist/sync/sync-cycle.d.ts +18 -0
- package/dist/sync/sync-cycle.js +85 -0
- package/dist/sync/sync-state.d.ts +32 -0
- package/dist/sync/sync-state.js +37 -0
- package/dist/sync/watcher.d.ts +0 -18
- package/dist/sync/watcher.js +66 -100
- package/native/keep-awake.ps1 +8 -0
- package/native/power.cs +23 -0
- package/native/stop-events.ps1 +38 -0
- package/package.json +11 -3
- package/sandbox/linkgate.cs +98 -0
- package/sandbox/memlog.ps1 +15 -6
- package/sandbox/ptyhost.cs +60 -3
- package/schemas/config.schema.json +48 -1
- package/schemas/sandbox-config.schema.json +37 -3
- package/dist/cli/commands/launch.d.ts +0 -29
- package/dist/cli/commands/launch.js +0 -366
- package/dist/cli/commands/maintenance.d.ts +0 -10
- package/dist/cli/commands/maintenance.js +0 -187
- package/dist/cli/commands/project.d.ts +0 -29
- package/dist/cli/commands/project.js +0 -63
- package/dist/cli/commands/projects.d.ts +0 -14
- package/dist/cli/commands/projects.js +0 -146
- package/dist/cli/commands/restart.d.ts +0 -6
- package/dist/cli/commands/restart.js +0 -85
- package/dist/cli/commands/sessions.d.ts +0 -12
- package/dist/cli/commands/sessions.js +0 -257
- package/dist/cli/menu/settings/editors.js +0 -305
- package/dist/cli/progress.d.ts +0 -9
- package/dist/cli/progress.js +0 -49
- package/dist/cli/tui/dialogs.d.ts +0 -57
- package/dist/cli/tui/dialogs.js +0 -162
- package/dist/core/config.js +0 -109
- package/dist/core/schema.d.ts +0 -6
- package/dist/core/schema.js +0 -8
- package/dist/core/util.d.ts +0 -62
- package/dist/core/util.js +0 -156
- package/dist/core/workspace.d.ts +0 -18
- package/dist/core/workspace.js +0 -145
- package/dist/guest/boot-env.d.ts +0 -4
- package/dist/guest/daemon.js +0 -57
- package/dist/guest/env.d.ts +0 -52
- package/dist/guest/env.js +0 -103
- package/dist/guest/gitrules.js +0 -11
- package/dist/guest/project-status.d.ts +0 -5
- package/dist/guest/project-status.js +0 -17
- package/dist/guest/setup/user.js +0 -51
- package/dist/guest/toolchains/cli.d.ts +0 -10
- package/dist/guest/toolchains/common.d.ts +0 -54
- package/dist/guest/toolchains/common.js +0 -147
- package/dist/guest/toolchains/databases/dynamodb.d.ts +0 -8
- package/dist/guest/toolchains/databases/dynamodb.js +0 -52
- package/dist/guest/toolchains/databases/index.d.ts +0 -6
- package/dist/guest/toolchains/databases/index.js +0 -62
- package/dist/guest/toolchains/databases/mongodb.d.ts +0 -3
- package/dist/guest/toolchains/databases/mongodb.js +0 -31
- package/dist/guest/toolchains/databases/mysql.d.ts +0 -3
- package/dist/guest/toolchains/databases/mysql.js +0 -38
- package/dist/guest/toolchains/databases/postgres.d.ts +0 -5
- package/dist/guest/toolchains/databases/postgres.js +0 -38
- package/dist/guest/toolchains/databases/redis.d.ts +0 -3
- package/dist/guest/toolchains/databases/redis.js +0 -16
- package/dist/guest/toolchains/git.d.ts +0 -3
- package/dist/guest/toolchains/go.d.ts +0 -3
- package/dist/guest/toolchains/java.d.ts +0 -8
- package/dist/guest/toolchains/node.d.ts +0 -3
- package/dist/guest/toolchains/pwsh.d.ts +0 -4
- package/dist/guest/toolchains/python.d.ts +0 -3
- package/dist/guest/toolchains/scripting/php.d.ts +0 -3
- package/dist/guest/toolchains/scripting/ruby.d.ts +0 -3
- package/dist/host/accounts.d.ts +0 -32
- package/dist/host/accounts.js +0 -128
- package/dist/host/agent-commands.d.ts +0 -25
- package/dist/host/agent-commands.js +0 -145
- package/dist/host/channel.d.ts +0 -38
- package/dist/host/channel.js +0 -162
- package/dist/host/generate.d.ts +0 -13
- package/dist/host/generate.js +0 -108
- package/dist/host/join.d.ts +0 -28
- package/dist/host/join.js +0 -76
- package/dist/host/launch/projects.d.ts +0 -15
- package/dist/host/launch/wsb.js +0 -34
- package/dist/host/motw.d.ts +0 -17
- package/dist/host/motw.js +0 -74
- package/dist/host/pc-scan.d.ts +0 -6
- package/dist/host/personalize.d.ts +0 -10
- package/dist/host/personalize.js +0 -97
- package/dist/host/platform.js +0 -129
- package/dist/host/project-scan.d.ts +0 -7
- package/dist/host/projects.d.ts +0 -100
- package/dist/host/projects.js +0 -147
- package/dist/host/repo-guard.d.ts +0 -43
- package/dist/host/repo-guard.js +0 -347
- package/dist/host/secrets.d.ts +0 -14
- package/dist/host/secrets.js +0 -133
- package/dist/host/stops.d.ts +0 -67
- package/dist/host/stops.js +0 -126
- package/dist/shared/apps.js +0 -114
- package/dist/shared/download.d.ts +0 -60
- package/dist/shared/download.js +0 -215
- package/dist/shared/guest-paths.js +0 -61
- package/dist/shared/projects.js +0 -67
- package/dist/shared/pty-client.d.ts +0 -91
- package/dist/shared/pty-client.js +0 -349
- package/dist/shared/rundir.d.ts +0 -41
- package/dist/shared/rundir.js +0 -96
- package/dist/shared/schema.js +0 -92
- /package/dist/{guest/daemon.d.ts → cli/tui/list/list-types.js} +0 -0
- /package/dist/{guest/db.d.ts → cli/tui/screen.js} +0 -0
- /package/dist/core/{detect-databases.d.ts → detect/databases.d.ts} +0 -0
- /package/dist/{guest/toolchains → core/detect}/versions.d.ts +0 -0
- /package/dist/guest/{setup/agents.d.ts → agents/agent-installer.d.ts} +0 -0
- /package/dist/guest/{audit-parse.d.ts → audit/parse.d.ts} +0 -0
- /package/dist/guest/{guide.d.ts → boot/guide.d.ts} +0 -0
- /package/dist/guest/daemon/{shutdown.d.ts → idle-shutdown.d.ts} +0 -0
- /package/dist/guest/daemon/{session.d.ts → sessions.d.ts} +0 -0
- /package/dist/guest/{main.d.ts → entries/daemon.d.ts} +0 -0
- /package/dist/guest/{netproxy.d.ts → entries/db.d.ts} +0 -0
- /package/dist/{selftest/suite.js → guest/entries/gitguard.d.ts} +0 -0
- /package/dist/guest/{gitguard.d.ts → git/decision.d.ts} +0 -0
- /package/dist/guest/{ports.d.ts → runtime/ports.d.ts} +0 -0
- /package/dist/guest/{project-context.d.ts → runtime/project-context.d.ts} +0 -0
- /package/dist/guest/{cmdline.d.ts → sessions/cmdline.d.ts} +0 -0
- /package/dist/guest/{ptyhost.d.ts → sessions/pty-host.d.ts} +0 -0
- /package/dist/guest/{view.d.ts → sessions/viewer.d.ts} +0 -0
- /package/dist/guest/setup/{policy.d.ts → managed-policy.d.ts} +0 -0
- /package/dist/host/{window.d.ts → sandbox/window.d.ts} +0 -0
- /package/dist/host/{wsb.d.ts → sandbox/wsb-cli.d.ts} +0 -0
- /package/dist/host/{cleanup.d.ts → storage/cleanup.d.ts} +0 -0
- /package/dist/selftest/{harness.d.ts → support/harness.d.ts} +0 -0
- /package/dist/selftest/{suite.d.ts → support/suite.d.ts} +0 -0
- /package/dist/shared/{safe-remove.d.ts → io/safe-remove.d.ts} +0 -0
- /package/dist/shared/{netrules.d.ts → network/firewall-rules.d.ts} +0 -0
- /package/dist/shared/{netpolicy.d.ts → network/policy.d.ts} +0 -0
- /package/dist/shared/{paths.d.ts → paths/claude-paths.d.ts} +0 -0
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { PROJECTS_GUEST, type ProjectEntry, type RootMapping } from '../../shared/paths/index.js';
|
|
3
|
+
export { PROJECTS_GUEST };
|
|
4
|
+
export type { ProjectEntry };
|
|
5
|
+
export declare const AbsolutePathSchema: z.ZodString;
|
|
6
|
+
declare const RegistryEntrySchema: z.ZodObject<{
|
|
7
|
+
name: z.ZodString;
|
|
8
|
+
host: z.ZodString;
|
|
9
|
+
guest: z.ZodString;
|
|
10
|
+
primary: z.ZodBoolean;
|
|
11
|
+
mechanism: z.ZodEnum<{
|
|
12
|
+
root: "root";
|
|
13
|
+
launch: "launch";
|
|
14
|
+
boot: "boot";
|
|
15
|
+
wsb: "wsb";
|
|
16
|
+
}>;
|
|
17
|
+
registeredAt: z.ZodString;
|
|
18
|
+
}, z.core.$strict>;
|
|
19
|
+
declare const RegistrySchema: z.ZodObject<{
|
|
20
|
+
launchId: z.ZodString;
|
|
21
|
+
protections: z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodBoolean, z.ZodString]>>;
|
|
22
|
+
roots: z.ZodArray<z.ZodObject<{
|
|
23
|
+
host: z.ZodString;
|
|
24
|
+
guest: z.ZodString;
|
|
25
|
+
}, z.core.$strict>>;
|
|
26
|
+
projects: z.ZodArray<z.ZodObject<{
|
|
27
|
+
name: z.ZodString;
|
|
28
|
+
host: z.ZodString;
|
|
29
|
+
guest: z.ZodString;
|
|
30
|
+
primary: z.ZodBoolean;
|
|
31
|
+
mechanism: z.ZodEnum<{
|
|
32
|
+
root: "root";
|
|
33
|
+
launch: "launch";
|
|
34
|
+
boot: "boot";
|
|
35
|
+
wsb: "wsb";
|
|
36
|
+
}>;
|
|
37
|
+
registeredAt: z.ZodString;
|
|
38
|
+
}, z.core.$strict>>;
|
|
39
|
+
atBoot: z.ZodOptional<z.ZodObject<{
|
|
40
|
+
memoryMb: z.ZodNullable<z.ZodNumber>;
|
|
41
|
+
mappings: z.ZodArray<z.ZodObject<{
|
|
42
|
+
host: z.ZodString;
|
|
43
|
+
guest: z.ZodString;
|
|
44
|
+
readOnly: z.ZodBoolean;
|
|
45
|
+
}, z.core.$strict>>;
|
|
46
|
+
widened: z.ZodRecord<z.ZodString, z.ZodString>;
|
|
47
|
+
}, z.core.$strict>>;
|
|
48
|
+
}, z.core.$strict>;
|
|
49
|
+
export type AtBoot = NonNullable<z.output<typeof RegistrySchema>['atBoot']>;
|
|
50
|
+
export type RegistryEntry = z.output<typeof RegistryEntrySchema>;
|
|
51
|
+
export type Registry = z.output<typeof RegistrySchema>;
|
|
52
|
+
/** Which project of the running sandbox a folder on this PC is in, and where that folder is inside. */
|
|
53
|
+
export interface ProjectHere {
|
|
54
|
+
project: RegistryEntry;
|
|
55
|
+
guestDir: string;
|
|
56
|
+
}
|
|
57
|
+
/** run\projects.json under the storage folder: the running sandbox's projects and roots. */
|
|
58
|
+
export declare class ProjectRegistry {
|
|
59
|
+
private readonly file;
|
|
60
|
+
constructor(storageRoot: string);
|
|
61
|
+
read(): Registry | null;
|
|
62
|
+
save(registry: Registry): void;
|
|
63
|
+
/** At launch: the launch folder, the projects mapped with it, and the roots. */
|
|
64
|
+
start(o: {
|
|
65
|
+
launchId: string;
|
|
66
|
+
protections: Registry['protections'];
|
|
67
|
+
primary: RootMapping;
|
|
68
|
+
roots: RootMapping[];
|
|
69
|
+
boot: RootMapping[];
|
|
70
|
+
atBoot?: AtBoot;
|
|
71
|
+
}): RegistryEntry;
|
|
72
|
+
/**
|
|
73
|
+
* What the running sandbox booted with. A sandbox started by 1.4.0 or older has no record: it is read from the .wsb
|
|
74
|
+
* in its launch folder (host-only storage) and recorded. null when neither is there.
|
|
75
|
+
*/
|
|
76
|
+
bootRecord(launchPath: string | null): AtBoot | null;
|
|
77
|
+
/** Which project of the running sandbox this folder is in, and where it is inside. */
|
|
78
|
+
here(hostDir: string): ProjectHere | null;
|
|
79
|
+
/** The running sandbox's root containing this folder, if any. */
|
|
80
|
+
rootHere(hostDir: string): RootMapping | null;
|
|
81
|
+
}
|
|
82
|
+
/** Reads the memory and mapped folders back from a .wsb this tool wrote (host-only launch folder; bounded). */
|
|
83
|
+
export declare function parseWsbBoot(xml: string): AtBoot;
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
// The projects of the running sandbox, and how another folder joins it (shared/projects.ts explains the ways in).
|
|
2
|
+
// Two host-only files under the storage folder, never in the data folder the sandbox can write:
|
|
3
|
+
// - run\projects.json: the running sandbox's projects, roots and machine-wide protections (written at launch, then
|
|
4
|
+
// as folders join);
|
|
5
|
+
// - known-projects.json: every folder this tool has started a project in (for projects.all and `sandbox projects`).
|
|
6
|
+
// Everything about HOW a folder becomes visible is behind ProjectMapper, so the mechanisms can change independently.
|
|
7
|
+
import fs from 'node:fs';
|
|
8
|
+
import path from 'node:path';
|
|
9
|
+
import { z } from 'zod';
|
|
10
|
+
import { IdSchema } from '../../shared/channel/index.js';
|
|
11
|
+
import { JsonFile } from '../../shared/io/index.js';
|
|
12
|
+
import { guestDirFor, hubName, PROJECTS_GUEST, projectForHostDir, } from '../../shared/paths/index.js';
|
|
13
|
+
export { PROJECTS_GUEST };
|
|
14
|
+
export const AbsolutePathSchema = z
|
|
15
|
+
.string()
|
|
16
|
+
.max(1024)
|
|
17
|
+
.refine((p) => path.isAbsolute(p), 'must be an absolute path');
|
|
18
|
+
const RegistryEntrySchema = z.strictObject({
|
|
19
|
+
name: IdSchema,
|
|
20
|
+
host: AbsolutePathSchema,
|
|
21
|
+
guest: z.string().max(1024),
|
|
22
|
+
primary: z.boolean(),
|
|
23
|
+
mechanism: z.enum(['launch', 'root', 'boot', 'wsb']),
|
|
24
|
+
registeredAt: z.string().max(64),
|
|
25
|
+
});
|
|
26
|
+
const RegistrySchema = z.strictObject({
|
|
27
|
+
launchId: z.string().max(64),
|
|
28
|
+
/** The running sandbox's protections (core/project-policy.ts), fixed at boot. */
|
|
29
|
+
protections: z.record(z.string(), z.union([z.boolean(), z.string()])),
|
|
30
|
+
roots: z.array(z.strictObject({ host: AbsolutePathSchema, guest: z.string().max(1024) })).max(64),
|
|
31
|
+
projects: z.array(RegistryEntrySchema).max(1024),
|
|
32
|
+
/** What the sandbox booted with that a joining project may also want (missing in registries of 1.4.0 and older). */
|
|
33
|
+
atBoot: z
|
|
34
|
+
.strictObject({
|
|
35
|
+
memoryMb: z.number().int().positive().nullable(),
|
|
36
|
+
mappings: z
|
|
37
|
+
.array(z.strictObject({ host: z.string().max(1024), guest: z.string().max(1024), readOnly: z.boolean() }))
|
|
38
|
+
.max(1024),
|
|
39
|
+
/** Boot settings turned on for a project mapped at boot (setting -> project): other projects share them. */
|
|
40
|
+
widened: z.record(z.string().max(100), z.string().max(100)),
|
|
41
|
+
})
|
|
42
|
+
.optional(),
|
|
43
|
+
});
|
|
44
|
+
/** run\projects.json under the storage folder: the running sandbox's projects and roots. */
|
|
45
|
+
export class ProjectRegistry {
|
|
46
|
+
file;
|
|
47
|
+
constructor(storageRoot) {
|
|
48
|
+
this.file = new JsonFile(RegistrySchema, path.join(storageRoot, 'run', 'projects.json'));
|
|
49
|
+
}
|
|
50
|
+
read() {
|
|
51
|
+
return this.file.read();
|
|
52
|
+
}
|
|
53
|
+
save(registry) {
|
|
54
|
+
this.file.write(registry);
|
|
55
|
+
}
|
|
56
|
+
/** At launch: the launch folder, the projects mapped with it, and the roots. */
|
|
57
|
+
start(o) {
|
|
58
|
+
const at = new Date().toISOString();
|
|
59
|
+
const primary = {
|
|
60
|
+
name: hubName(o.primary.host, []),
|
|
61
|
+
host: o.primary.host,
|
|
62
|
+
guest: o.primary.guest,
|
|
63
|
+
primary: true,
|
|
64
|
+
mechanism: 'launch',
|
|
65
|
+
registeredAt: at,
|
|
66
|
+
};
|
|
67
|
+
const names = [primary.name];
|
|
68
|
+
const boot = o.boot.map((b) => {
|
|
69
|
+
const name = hubName(b.host, names);
|
|
70
|
+
names.push(name);
|
|
71
|
+
return { name, host: b.host, guest: b.guest, primary: false, mechanism: 'boot', registeredAt: at };
|
|
72
|
+
});
|
|
73
|
+
this.save({
|
|
74
|
+
launchId: o.launchId,
|
|
75
|
+
protections: o.protections,
|
|
76
|
+
roots: o.roots,
|
|
77
|
+
projects: [primary, ...boot],
|
|
78
|
+
...(o.atBoot ? { atBoot: o.atBoot } : {}),
|
|
79
|
+
});
|
|
80
|
+
return primary;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* What the running sandbox booted with. A sandbox started by 1.4.0 or older has no record: it is read from the .wsb
|
|
84
|
+
* in its launch folder (host-only storage) and recorded. null when neither is there.
|
|
85
|
+
*/
|
|
86
|
+
bootRecord(launchPath) {
|
|
87
|
+
const registry = this.read();
|
|
88
|
+
if (!registry)
|
|
89
|
+
return null;
|
|
90
|
+
if (registry.atBoot)
|
|
91
|
+
return registry.atBoot;
|
|
92
|
+
if (!launchPath)
|
|
93
|
+
return null;
|
|
94
|
+
let xml;
|
|
95
|
+
try {
|
|
96
|
+
xml = fs.readFileSync(path.join(launchPath, 'agent.wsb'), 'utf8');
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
const atBoot = parseWsbBoot(xml);
|
|
102
|
+
try {
|
|
103
|
+
this.save({ ...registry, atBoot });
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
/* the record is a convenience */
|
|
107
|
+
}
|
|
108
|
+
return atBoot;
|
|
109
|
+
}
|
|
110
|
+
/** Which project of the running sandbox this folder is in, and where it is inside. */
|
|
111
|
+
here(hostDir) {
|
|
112
|
+
const project = projectForHostDir(this.read()?.projects ?? [], hostDir);
|
|
113
|
+
return project ? { project, guestDir: guestDirFor(project, hostDir) } : null;
|
|
114
|
+
}
|
|
115
|
+
/** The running sandbox's root containing this folder, if any. */
|
|
116
|
+
rootHere(hostDir) {
|
|
117
|
+
return projectForHostDir(this.read()?.roots ?? [], hostDir);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/** Reads the memory and mapped folders back from a .wsb this tool wrote (host-only launch folder; bounded). */
|
|
121
|
+
export function parseWsbBoot(xml) {
|
|
122
|
+
const text = xml.slice(0, 1_000_000);
|
|
123
|
+
const unescape = (s) => s
|
|
124
|
+
.replace(/</g, '<')
|
|
125
|
+
.replace(/>/g, '>')
|
|
126
|
+
.replace(/"/g, '"')
|
|
127
|
+
.replace(/'/g, "'")
|
|
128
|
+
.replace(/&/g, '&');
|
|
129
|
+
const mappings = [
|
|
130
|
+
...text.matchAll(/<MappedFolder><HostFolder>([^<]{1,1024})<\/HostFolder><SandboxFolder>([^<]{1,1024})<\/SandboxFolder><ReadOnly>(true|false)<\/ReadOnly><\/MappedFolder>/g),
|
|
131
|
+
]
|
|
132
|
+
.slice(0, 1024)
|
|
133
|
+
.map((m) => ({ host: unescape(m[1]), guest: unescape(m[2]), readOnly: m[3] === 'true' }));
|
|
134
|
+
const memory = /<MemoryInMB>(\d{1,7})<\/MemoryInMB>/.exec(text);
|
|
135
|
+
return { memoryMb: memory ? Number(memory[1]) : null, mappings, widened: {} };
|
|
136
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import os from 'node:os';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { updateRestartPending } from '../life/index.js';
|
|
4
|
+
import { dirExists, isWin } from '../../core/util/index.js';
|
|
5
|
+
import { probeHost } from './probe.js';
|
|
6
|
+
import { sandboxFeatureInstalled, isSandboxRunning } from './platform.js';
|
|
7
|
+
export const doctorRows = (config, harnessName, storageRoot, configPath) => {
|
|
8
|
+
const probe = probeHost(config, harnessName);
|
|
9
|
+
return [
|
|
10
|
+
['Config file', configPath ?? '(none; built-in defaults; create one with: sandbox config init)'],
|
|
11
|
+
['Windows', isWin ? 'yes' : 'NO (launch needs Windows)'],
|
|
12
|
+
['Windows Sandbox feature', sandboxFeatureInstalled() ? 'enabled' : 'NOT enabled'],
|
|
13
|
+
['Sandbox running', isSandboxRunning() ? 'YES' : 'no'],
|
|
14
|
+
['Free host RAM (MB)', String(Math.floor(os.freemem() / 1048576))],
|
|
15
|
+
[
|
|
16
|
+
'Update restart pending',
|
|
17
|
+
updateRestartPending()
|
|
18
|
+
? 'YES (Windows may restart on its own and close the sandbox; restart first or pause updates)'
|
|
19
|
+
: 'no',
|
|
20
|
+
],
|
|
21
|
+
[
|
|
22
|
+
'Keep this PC awake',
|
|
23
|
+
config.sandbox.keepAwake
|
|
24
|
+
? 'yes, while a sandbox runs'
|
|
25
|
+
: 'no (sandbox.keepAwake is off: the PC may sleep under running agents)',
|
|
26
|
+
],
|
|
27
|
+
[
|
|
28
|
+
'Provisioning',
|
|
29
|
+
config.provisioning.copyFromHost
|
|
30
|
+
? 'copy from this PC' + (config.provisioning.fallbackToInstall ? ', fall back to download' : ', no fallback')
|
|
31
|
+
: 'download inside sandbox',
|
|
32
|
+
],
|
|
33
|
+
['Host Node (runner)', probe.nvmNode ? 'nvm ' + probe.hostNodeVersion : (probe.nodeDir ?? '(none; will download)')],
|
|
34
|
+
['Host nvm versions', probe.nvmDir ?? '(no NVM_HOME; versions will be downloaded)'],
|
|
35
|
+
[
|
|
36
|
+
'Host ' + harnessName,
|
|
37
|
+
probe.harnessExe ? path.join(probe.harnessExe.dir, probe.harnessExe.file) : '(none; will npm install)',
|
|
38
|
+
],
|
|
39
|
+
['Host Git for Windows', probe.gitDir ?? '(none with bash; PortableGit will be downloaded)'],
|
|
40
|
+
['Storage root', storageRoot + (dirExists(storageRoot) ? '' : ' (will be created)')],
|
|
41
|
+
];
|
|
42
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const hostClaude: (storageRoot: string, personal: boolean, args: string[]) => number;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { spawnSync } from 'node:child_process';
|
|
3
|
+
import { SYSTEM } from '../../shared/system.js';
|
|
4
|
+
import { refuseInSelfTest } from '../test-guard.js';
|
|
5
|
+
import { commandsDir, realAgent } from '../agent-commands/index.js';
|
|
6
|
+
import { ensureDir, fail } from '../../core/util/index.js';
|
|
7
|
+
export const hostClaude = (storageRoot, personal, args) => {
|
|
8
|
+
refuseInSelfTest('run Claude Code on this PC');
|
|
9
|
+
// Never this tool's own forwarding command (agentCommands), which would start a sandbox instead.
|
|
10
|
+
const exe = realAgent('claude', commandsDir(storageRoot));
|
|
11
|
+
if (!exe)
|
|
12
|
+
fail('Claude Code is not installed on this PC (no claude.exe or claude.cmd on PATH).', 'Install it: npm install -g @anthropic-ai/claude-code');
|
|
13
|
+
const env = { ...process.env };
|
|
14
|
+
if (!personal) {
|
|
15
|
+
const profile = path.join(storageRoot, 'host', 'claude');
|
|
16
|
+
ensureDir(profile);
|
|
17
|
+
env.CLAUDE_CONFIG_DIR = profile;
|
|
18
|
+
console.warn('Host Claude is NOT sandboxed. Using separate profile: ' + profile + ' (pass --personal to use your normal one).');
|
|
19
|
+
}
|
|
20
|
+
const result = exe.toLowerCase().endsWith('.cmd')
|
|
21
|
+
? spawnSync(SYSTEM.cmd(), ['/d', '/c', exe, ...args], { stdio: 'inherit', env })
|
|
22
|
+
: spawnSync(exe, args, { stdio: 'inherit', env });
|
|
23
|
+
if (result.error)
|
|
24
|
+
throw result.error;
|
|
25
|
+
return result.status ?? 1;
|
|
26
|
+
};
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
import type { Config, HostProbe } from '../core/types.js';
|
|
2
|
-
/** What can be copied from this PC instead of downloaded inside the sandbox. */
|
|
3
|
-
export declare const probeHost: (config: Config, harnessName: string) => HostProbe;
|
|
4
1
|
/**
|
|
5
2
|
* Running INSIDE a Windows Sandbox this tool started (its launch folder and data folder are mapped in): then the CLI
|
|
6
3
|
* talks to the sandbox it is in, through C:\\AgentData and loopback, instead of looking for one on a PC.
|
|
@@ -15,5 +12,3 @@ export declare const assertCmdSafePath: (file: string) => void;
|
|
|
15
12
|
export declare const startSandbox: (wsbPath: string) => void;
|
|
16
13
|
/** Runs a detached copy of this CLI (used for the background history/claude-mem sync watcher). */
|
|
17
14
|
export declare const spawnDetached: (entry: string, args: string[]) => void;
|
|
18
|
-
export declare const hostClaude: (storageRoot: string, personal: boolean, args: string[]) => number;
|
|
19
|
-
export declare const doctorRows: (config: Config, harnessName: string, storageRoot: string, configPath: string | null) => [string, string][];
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { spawn, spawnSync } from 'node:child_process';
|
|
4
|
+
import { SYSTEM } from '../../shared/system.js';
|
|
5
|
+
import { refuseInSelfTest } from '../test-guard.js';
|
|
6
|
+
import { fail, fileExists, isWin } from '../../core/util/index.js';
|
|
7
|
+
const SANDBOX_PROCESSES = ['WindowsSandboxClient.exe', 'WindowsSandboxRemoteSession.exe', 'WindowsSandbox.exe'];
|
|
8
|
+
/**
|
|
9
|
+
* Running INSIDE a Windows Sandbox this tool started (its launch folder and data folder are mapped in): then the CLI
|
|
10
|
+
* talks to the sandbox it is in, through C:\\AgentData and loopback, instead of looking for one on a PC.
|
|
11
|
+
*/
|
|
12
|
+
export const insideSandbox = () => isWin &&
|
|
13
|
+
!process.env.AGENT_SANDBOX_HOST_ONLY &&
|
|
14
|
+
fs.existsSync('C:\\AgentLaunch\\session.json') &&
|
|
15
|
+
fs.existsSync('C:\\AgentData\\run');
|
|
16
|
+
export const GUEST_DATA_DIR = 'C:\\AgentData';
|
|
17
|
+
export const isSandboxRunning = () => {
|
|
18
|
+
if (!isWin)
|
|
19
|
+
return false;
|
|
20
|
+
if (insideSandbox())
|
|
21
|
+
return true;
|
|
22
|
+
const result = spawnSync(SYSTEM.tasklist(), ['/NH', '/FO', 'CSV'], { encoding: 'utf8', windowsHide: true });
|
|
23
|
+
const out = (result.stdout ?? '').toLowerCase();
|
|
24
|
+
return SANDBOX_PROCESSES.some((image) => out.includes('"' + image.toLowerCase() + '"'));
|
|
25
|
+
};
|
|
26
|
+
export const sandboxFeatureInstalled = () => isWin && fileExists(path.join(process.env.WINDIR ?? 'C:\\Windows', 'System32', 'WindowsSandbox.exe'));
|
|
27
|
+
export const assertCanLaunch = () => {
|
|
28
|
+
if (!isWin)
|
|
29
|
+
fail('Windows Sandbox only runs on Windows.', 'Use sandbox generate to only write the files.');
|
|
30
|
+
if (!sandboxFeatureInstalled())
|
|
31
|
+
fail('Windows Sandbox is not enabled on this PC.', 'Run in an admin PowerShell, then reboot: Enable-WindowsOptionalFeature -Online -FeatureName Containers-DisposableClientVM -All (needs Windows Pro, Enterprise or Education)');
|
|
32
|
+
if (isSandboxRunning())
|
|
33
|
+
fail('A Windows Sandbox is already running (Windows allows one at a time).', 'Attach to it with sandbox claude -t, show it with sbx-show, or shut it down with sandbox stop.');
|
|
34
|
+
};
|
|
35
|
+
/** cmd.exe expands %VAR% and ^ even inside quotes, and a quote ends them: such a path could run something else. */
|
|
36
|
+
export const assertCmdSafePath = (file) => {
|
|
37
|
+
if (/[%"^\r\n]/.test(file))
|
|
38
|
+
fail('The storage folder path has a character that cannot be started safely: ' + file, 'Set storage.root to a folder without % " ^ in its path.');
|
|
39
|
+
};
|
|
40
|
+
export const startSandbox = (wsbPath) => {
|
|
41
|
+
refuseInSelfTest('start Windows Sandbox');
|
|
42
|
+
assertCmdSafePath(wsbPath);
|
|
43
|
+
const result = spawnSync(SYSTEM.cmd(), ['/d', '/c', 'start', '""', '"' + wsbPath + '"'], {
|
|
44
|
+
stdio: 'inherit',
|
|
45
|
+
windowsVerbatimArguments: true,
|
|
46
|
+
});
|
|
47
|
+
if (result.error)
|
|
48
|
+
throw result.error;
|
|
49
|
+
};
|
|
50
|
+
/** Runs a detached copy of this CLI (used for the background history/claude-mem sync watcher). */
|
|
51
|
+
export const spawnDetached = (entry, args) => {
|
|
52
|
+
refuseInSelfTest('start background programs');
|
|
53
|
+
// cwd = the install folder: the caller's folder is the workspace, which the sandbox can write.
|
|
54
|
+
spawn(process.execPath, [entry, ...args], {
|
|
55
|
+
cwd: path.dirname(entry),
|
|
56
|
+
detached: true,
|
|
57
|
+
stdio: 'ignore',
|
|
58
|
+
windowsHide: true,
|
|
59
|
+
}).unref();
|
|
60
|
+
};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { dirExists, fileExists, findOnPath, homeDir, isWin, realPath } from '../../core/util/index.js';
|
|
3
|
+
const findHarnessExe = (config, harnessName) => {
|
|
4
|
+
const harness = config.harnesses[harnessName];
|
|
5
|
+
if (!harness?.hostExecutable)
|
|
6
|
+
return null;
|
|
7
|
+
const explicit = harness.hostDir && harness.hostDir !== 'auto' ? path.join(harness.hostDir, harness.hostExecutable) : null;
|
|
8
|
+
const found = explicit
|
|
9
|
+
? fileExists(explicit)
|
|
10
|
+
? explicit
|
|
11
|
+
: null
|
|
12
|
+
: (findOnPath([harness.hostExecutable]) ??
|
|
13
|
+
[path.join(homeDir(), '.local', 'bin', harness.hostExecutable)].find(fileExists) ??
|
|
14
|
+
null);
|
|
15
|
+
if (!found)
|
|
16
|
+
return null;
|
|
17
|
+
const real = realPath(found);
|
|
18
|
+
return { dir: path.dirname(real), file: path.basename(real) };
|
|
19
|
+
};
|
|
20
|
+
/** Git for Windows root (the folder with cmd\git.exe and bin\bash.exe), from git on PATH. */
|
|
21
|
+
const findGitRoot = () => {
|
|
22
|
+
const git = findOnPath(['git.exe']);
|
|
23
|
+
if (!git)
|
|
24
|
+
return null;
|
|
25
|
+
const root = path.resolve(path.dirname(realPath(git)), '..');
|
|
26
|
+
return fileExists(path.join(root, 'bin', 'bash.exe')) ? root : null;
|
|
27
|
+
};
|
|
28
|
+
/** What can be copied from this PC instead of downloaded inside the sandbox. */
|
|
29
|
+
export const probeHost = (config, harnessName) => {
|
|
30
|
+
const nodeDir = isWin ? path.dirname(process.execPath) : null;
|
|
31
|
+
const copy = config.provisioning.copyFromHost;
|
|
32
|
+
const nvmHome = process.env.NVM_HOME;
|
|
33
|
+
const nvmDir = copy && nvmHome && dirExists(nvmHome) ? realPath(nvmHome) : null;
|
|
34
|
+
const hasNode = (dir) => fileExists(path.join(dir, 'node.exe')) && fileExists(path.join(dir, 'node_modules', 'npm', 'bin', 'npm-cli.js'));
|
|
35
|
+
// One source for Node: nvm's copy of this version when there is one, otherwise the Node folder itself.
|
|
36
|
+
const nvmNode = Boolean(nvmDir && hasNode(path.join(nvmDir, process.version)));
|
|
37
|
+
return {
|
|
38
|
+
nodeDir: copy && !nvmNode && nodeDir && hasNode(nodeDir) ? realPath(nodeDir) : null,
|
|
39
|
+
harnessExe: copy ? findHarnessExe(config, harnessName) : null,
|
|
40
|
+
gitDir: copy && config.provisioning.git.enabled ? findGitRoot() : null,
|
|
41
|
+
nvmDir,
|
|
42
|
+
hostNodeVersion: process.version,
|
|
43
|
+
nvmNode,
|
|
44
|
+
volta: Boolean(process.env.VOLTA_HOME),
|
|
45
|
+
pyenv: Boolean(process.env.PYENV ?? process.env.PYENV_ROOT ?? process.env.PYENV_HOME),
|
|
46
|
+
};
|
|
47
|
+
};
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// Headless mode: Windows Sandbox always opens its client window, so we hide it (ShowWindow SW_HIDE) as soon as it
|
|
2
2
|
// appears. The VM and the logged-in session keep running; `sbx-show` brings the window back.
|
|
3
3
|
import path from 'node:path';
|
|
4
|
-
import { writeJsonAtomic } from '
|
|
5
|
-
import { refuseInSelfTest } from '
|
|
6
|
-
import { isWin, runPowerShell, runPowerShellAsync, tryReadJson } from '
|
|
4
|
+
import { writeJsonAtomic } from '../../shared/io/index.js';
|
|
5
|
+
import { refuseInSelfTest } from '../test-guard.js';
|
|
6
|
+
import { isWin, runPowerShell, runPowerShellAsync, tryReadJson } from '../../core/util/index.js';
|
|
7
7
|
const PRELUDE = `
|
|
8
8
|
$ErrorActionPreference = 'Stop'
|
|
9
9
|
Add-Type -Namespace AgentSandbox -Name Win -MemberDefinition @'
|
|
@@ -39,7 +39,8 @@ export const hideSandboxWindow = async (storageRoot, waitSeconds = 180) => {
|
|
|
39
39
|
refuseInSelfTest('hide windows');
|
|
40
40
|
if (!isWin)
|
|
41
41
|
return false;
|
|
42
|
-
const script = PRELUDE +
|
|
42
|
+
const script = PRELUDE +
|
|
43
|
+
`
|
|
43
44
|
$hidden = New-Object System.Collections.ArrayList
|
|
44
45
|
$deadline = (Get-Date).AddSeconds(${waitSeconds}); $settle = $null
|
|
45
46
|
while ((Get-Date) -lt $deadline) {
|
|
@@ -61,7 +62,8 @@ export const showSandboxWindow = (storageRoot) => {
|
|
|
61
62
|
return false;
|
|
62
63
|
// Only integers go into the script, whatever the file contains.
|
|
63
64
|
const recorded = (tryReadJson(stateFile(storageRoot))?.handles ?? []).filter((h) => Number.isSafeInteger(h));
|
|
64
|
-
const script = PRELUDE +
|
|
65
|
+
const script = PRELUDE +
|
|
66
|
+
`
|
|
65
67
|
$handles = @(${recorded.join(',')}) | Where-Object { [AgentSandbox.Win]::IsWindow([IntPtr]$_) }
|
|
66
68
|
if (-not $handles) { $handles = Get-SandboxWindows $false }
|
|
67
69
|
foreach ($h in $handles) { [void][AgentSandbox.Win]::ShowWindow([IntPtr]$h, 5); [void][AgentSandbox.Win]::ShowWindow([IntPtr]$h, 9); [void][AgentSandbox.Win]::SetForegroundWindow([IntPtr]$h) }
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
import fs from 'node:fs';
|
|
10
10
|
import path from 'node:path';
|
|
11
11
|
import { spawnSync } from 'node:child_process';
|
|
12
|
-
import { refuseInSelfTest } from '
|
|
12
|
+
import { refuseInSelfTest } from '../test-guard.js';
|
|
13
13
|
const GUID = /\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/i;
|
|
14
14
|
const MAX_OUTPUT = 1024 * 1024;
|
|
15
15
|
/** Where wsb.exe can be: the Store app's alias, then System32 (never by bare name; cwd is often the workspace). */
|
|
@@ -17,7 +17,7 @@ export const wsbCandidates = (env = process.env) => [
|
|
|
17
17
|
env.LOCALAPPDATA ? path.join(env.LOCALAPPDATA, 'Microsoft', 'WindowsApps', 'wsb.exe') : '',
|
|
18
18
|
path.join(env.SystemRoot ?? env.WINDIR ?? 'C:\\Windows', 'System32', 'wsb.exe'),
|
|
19
19
|
].filter(Boolean);
|
|
20
|
-
export const findWsb = (env = process.env, exists = fs.existsSync) => process.platform === 'win32' || exists !== fs.existsSync ? wsbCandidates(env).find((p) => exists(p)) ?? null : null;
|
|
20
|
+
export const findWsb = (env = process.env, exists = fs.existsSync) => process.platform === 'win32' || exists !== fs.existsSync ? (wsbCandidates(env).find((p) => exists(p)) ?? null) : null;
|
|
21
21
|
// ---- parsing (pure; the tests feed it recorded output) ---------------------------------------------------------
|
|
22
22
|
/** The version from `wsb --version` ("0.1.32.0", "wsb 1.2.3+abc"). */
|
|
23
23
|
export const parseVersion = (out) => /\d+\.\d+(?:\.\d+){0,2}/.exec(out)?.[0] ?? null;
|
|
@@ -49,10 +49,12 @@ export const parseList = (out) => {
|
|
|
49
49
|
};
|
|
50
50
|
try {
|
|
51
51
|
const parsed = JSON.parse(out);
|
|
52
|
-
const list = Array.isArray(parsed) ? parsed : Object.values(parsed).find(Array.isArray) ?? [parsed];
|
|
52
|
+
const list = Array.isArray(parsed) ? parsed : (Object.values(parsed).find(Array.isArray) ?? [parsed]);
|
|
53
53
|
return list.map(fromObject).filter((s) => s !== null);
|
|
54
54
|
}
|
|
55
|
-
catch {
|
|
55
|
+
catch {
|
|
56
|
+
/* the table */
|
|
57
|
+
}
|
|
56
58
|
return out.split(/\r?\n/).flatMap((line) => {
|
|
57
59
|
const id = GUID.exec(line)?.[0];
|
|
58
60
|
if (!id)
|
|
@@ -68,7 +70,14 @@ const call = (exe, args, timeoutMs = 60000) => {
|
|
|
68
70
|
const stderr = String(r.stderr ?? '').slice(0, MAX_OUTPUT);
|
|
69
71
|
if (r.error)
|
|
70
72
|
return { ok: false, stdout, stderr, error: r.error.message };
|
|
71
|
-
return {
|
|
73
|
+
return {
|
|
74
|
+
ok: r.status === 0,
|
|
75
|
+
stdout,
|
|
76
|
+
stderr,
|
|
77
|
+
...(r.status === 0
|
|
78
|
+
? {}
|
|
79
|
+
: { error: (stderr || stdout).trim().split(/\r?\n/).slice(-3).join(' ') || 'exit code ' + r.status }),
|
|
80
|
+
};
|
|
72
81
|
};
|
|
73
82
|
/** The CLI and what it offers, or null on Windows versions without it. */
|
|
74
83
|
export const detectWsb = (env = process.env) => {
|
|
@@ -89,13 +98,27 @@ export const runningSandboxId = (wsb) => {
|
|
|
89
98
|
const running = all.filter((s) => !/stopped/i.test(s.status));
|
|
90
99
|
if (running.length === 1)
|
|
91
100
|
return { id: running[0].id };
|
|
92
|
-
return {
|
|
101
|
+
return {
|
|
102
|
+
id: null,
|
|
103
|
+
error: running.length
|
|
104
|
+
? running.length + ' sandboxes are running (wsb list); cannot tell which one is ours'
|
|
105
|
+
: 'wsb list shows no running sandbox (one started from a .wsb file may not be listed)',
|
|
106
|
+
};
|
|
93
107
|
};
|
|
94
108
|
/** Shares a folder of this PC into the running sandbox at `sandboxPath` (read/write unless readOnly). */
|
|
95
109
|
export const shareFolder = (wsb, id, hostPath, sandboxPath, readOnly = false) => {
|
|
96
110
|
refuseInSelfTest('share a folder into Windows Sandbox');
|
|
97
111
|
if (!GUID.test(id))
|
|
98
112
|
return { ok: false, stdout: '', stderr: '', error: 'not a sandbox id: ' + id };
|
|
99
|
-
return call(wsb.exe, [
|
|
113
|
+
return call(wsb.exe, [
|
|
114
|
+
'share',
|
|
115
|
+
'--id',
|
|
116
|
+
id,
|
|
117
|
+
'-f',
|
|
118
|
+
hostPath,
|
|
119
|
+
'-s',
|
|
120
|
+
sandboxPath,
|
|
121
|
+
...(readOnly ? [] : ['--allow-write']),
|
|
122
|
+
]);
|
|
100
123
|
};
|
|
101
|
-
export const sandboxIp = (wsb, id) =>
|
|
124
|
+
export const sandboxIp = (wsb, id) => GUID.test(id) ? parseIp(call(wsb.exe, ['ip', '--id', id], 15000).stdout) : null;
|
|
@@ -2,19 +2,21 @@
|
|
|
2
2
|
import fs from 'node:fs';
|
|
3
3
|
import path from 'node:path';
|
|
4
4
|
import _ from 'lodash';
|
|
5
|
-
import { sizeOf } from '
|
|
6
|
-
import { dirExists, isLink } from '
|
|
7
|
-
import { safeRemove } from '
|
|
5
|
+
import { sizeOf } from '../../core/disk.js';
|
|
6
|
+
import { dirExists, isLink } from '../../core/util/index.js';
|
|
7
|
+
import { safeRemove } from '../../shared/io/index.js';
|
|
8
8
|
const DAY = 24 * 60 * 60 * 1000;
|
|
9
9
|
export const DEFAULT_PRUNE = { launchDays: 7, logDays: 14, conflictDays: 30, keep: [] };
|
|
10
|
-
const ageMs = (p, now) => {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
10
|
+
const ageMs = (p, now) => {
|
|
11
|
+
try {
|
|
12
|
+
return now - fs.lstatSync(p).mtimeMs;
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return 0;
|
|
16
|
+
}
|
|
17
|
+
};
|
|
16
18
|
/** Entries of a real folder; a link in place of a folder yields nothing (it is never listed or entered). */
|
|
17
|
-
const children = (dir) =>
|
|
19
|
+
const children = (dir) => dirExists(dir) && !isLink(dir) ? fs.readdirSync(dir).map((name) => path.join(dir, name)) : [];
|
|
18
20
|
/**
|
|
19
21
|
* Deletes, under the storage root:
|
|
20
22
|
* - launch folders older than `launchDays` (a launch folder is only used by the sandbox it started; `keep` protects the running one)
|
|
@@ -40,7 +42,11 @@ export const pruneStorage = (storageRoot, options = {}) => {
|
|
|
40
42
|
if (ageMs(log, now) > o.logDays * DAY)
|
|
41
43
|
remove(log, 'logs');
|
|
42
44
|
const runDir = path.join(data, 'run');
|
|
43
|
-
const dirs = [
|
|
45
|
+
const dirs = [
|
|
46
|
+
path.join(data, 'tools'),
|
|
47
|
+
path.join(data, 'state'),
|
|
48
|
+
...(isLink(runDir) ? [] : [runDir, path.join(runDir, 'responses')]),
|
|
49
|
+
];
|
|
44
50
|
for (const dir of dirs) {
|
|
45
51
|
for (const entry of children(dir)) {
|
|
46
52
|
const name = path.basename(entry);
|
|
@@ -54,4 +60,13 @@ export const pruneStorage = (storageRoot, options = {}) => {
|
|
|
54
60
|
}
|
|
55
61
|
return result;
|
|
56
62
|
};
|
|
57
|
-
export const describePrune = (r) => r.launches + r.logs + r.leftovers === 0
|
|
63
|
+
export const describePrune = (r) => r.launches + r.logs + r.leftovers === 0
|
|
64
|
+
? 'nothing to clean'
|
|
65
|
+
: _.compact([
|
|
66
|
+
r.launches && r.launches + ' launch folder(s)',
|
|
67
|
+
r.logs && r.logs + ' log(s)',
|
|
68
|
+
r.leftovers && r.leftovers + ' leftover(s)',
|
|
69
|
+
]).join(', ') +
|
|
70
|
+
' removed (' +
|
|
71
|
+
Math.round(r.bytes / 1048576) +
|
|
72
|
+
' MB)';
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export type StateFileSuffix = '.json' | '-audit.json' | '-forwards.json' | '-life.json' | '-mark.json' | '-repo.json' | '-repo-findings.json' | '-size.json' | '-views.json';
|
|
2
|
+
/** The storage folder a data folder is in (<storage>\data\<name>); inside a sandbox it differs from the context's. */
|
|
3
|
+
export declare function storageOf(dataPath: string): string;
|
|
4
|
+
export declare function hostStateFile(storageRoot: string, dataPath: string, suffix: StateFileSuffix): string;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// Host-only state of one data folder: <storage>\sync\<data name><suffix>, never in the data folder the sandbox can
|
|
2
|
+
// write.
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
/** The storage folder a data folder is in (<storage>\data\<name>); inside a sandbox it differs from the context's. */
|
|
5
|
+
export function storageOf(dataPath) {
|
|
6
|
+
return path.dirname(path.dirname(dataPath));
|
|
7
|
+
}
|
|
8
|
+
export function hostStateFile(storageRoot, dataPath, suffix) {
|
|
9
|
+
return path.join(storageRoot, 'sync', path.basename(dataPath) + suffix);
|
|
10
|
+
}
|
package/dist/host/test-guard.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Host side of the self-test guard (see shared/test-guard.ts): outward actions refuse, with a message the user can read.
|
|
2
2
|
import { testWriteRefusal, selfTestRunning } from '../shared/test-guard.js';
|
|
3
|
-
import { fail } from '../core/util.js';
|
|
3
|
+
import { fail } from '../core/util/index.js';
|
|
4
4
|
export { selfTestRunning };
|
|
5
5
|
/** Refuses an action that reaches outside the test's own temp folder (a no-op outside the self-test). */
|
|
6
6
|
export const refuseInSelfTest = (what) => {
|