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
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { askYesNo } from '../../../core/prompt.js';
|
|
3
|
+
import { SandboxChannel } from '../../../host/channel/index.js';
|
|
4
|
+
import { isSandboxRunning } from '../../../host/sandbox/index.js';
|
|
5
|
+
import { isWithin } from '../../../shared/paths/index.js';
|
|
6
|
+
import { RunDir } from '../../../shared/channel/index.js';
|
|
7
|
+
import { fail, safeText } from '../../../core/util/index.js';
|
|
8
|
+
import { requireOnPc, requireRunning } from '../context.js';
|
|
9
|
+
import { hereDir, locateHere } from '../projects/index.js';
|
|
10
|
+
import { working, c } from '../../output/index.js';
|
|
11
|
+
/** Restarts this folder's project's sessions (--all: every session). */
|
|
12
|
+
export async function restart(ctx) {
|
|
13
|
+
requireOnPc('restart');
|
|
14
|
+
requireRunning();
|
|
15
|
+
const here = locateHere(ctx, new RunDir(ctx.dataPath).readSandboxStatus());
|
|
16
|
+
const scope = ctx.options.all || !here.project ? undefined : here.project.guest;
|
|
17
|
+
if (!scope && !ctx.options.all)
|
|
18
|
+
console.log(c.dim(hereDir(ctx) + ' is not a project of the running sandbox: restarting every session.'));
|
|
19
|
+
console.log(safeText((await working('Restarting the agents' + (scope ? ' of ' + here.project?.name : ''), () => new SandboxChannel(ctx.dataPath).restart(ctx.options.harness ?? null, scope))).message));
|
|
20
|
+
return 0;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Stopping ends every project's sessions: other projects' sessions need a yes (or --yes). A script must never end them
|
|
24
|
+
* by accident, so without a terminal to ask in it fails.
|
|
25
|
+
*/
|
|
26
|
+
async function othersMayEnd(ctx, others) {
|
|
27
|
+
if (!others.length || ctx.options.yes)
|
|
28
|
+
return true;
|
|
29
|
+
const interactive = process.stdin.isTTY && process.stdout.isTTY;
|
|
30
|
+
if (!interactive)
|
|
31
|
+
fail(others.length + ' of these sessions belong to other projects, so the sandbox was not stopped.', 'Stop it anyway with: sandbox stop --yes');
|
|
32
|
+
return askYesNo(others.length + ' of them belong to other projects. Stop the whole sandbox?');
|
|
33
|
+
}
|
|
34
|
+
export async function stop(ctx) {
|
|
35
|
+
requireOnPc('stop');
|
|
36
|
+
if (!isSandboxRunning()) {
|
|
37
|
+
console.log('No Windows Sandbox is running.');
|
|
38
|
+
return 0;
|
|
39
|
+
}
|
|
40
|
+
const sandbox = new RunDir(ctx.dataPath).readSandboxStatus() ??
|
|
41
|
+
fail('This sandbox was not started by this tool.', 'Close its window instead.');
|
|
42
|
+
// Stopping ends every project's sessions, not just this folder's: say which, and ask when others would end too.
|
|
43
|
+
const here = locateHere(ctx, sandbox);
|
|
44
|
+
const channel = new SandboxChannel(ctx.dataPath);
|
|
45
|
+
const running = channel.currentSessions();
|
|
46
|
+
const others = running.filter((s) => !(here.guestDir && isWithin(here.project?.guest ?? here.guestDir, s.cwd)));
|
|
47
|
+
if (running.length)
|
|
48
|
+
console.log('Stopping ends ' +
|
|
49
|
+
running.length +
|
|
50
|
+
' session(s): ' +
|
|
51
|
+
running
|
|
52
|
+
.map((s) => safeText(s.harness) + ' in ' + safeText(s.project ?? path.win32.basename(s.cwd)))
|
|
53
|
+
.join(', ') +
|
|
54
|
+
'.');
|
|
55
|
+
if (!(await othersMayEnd(ctx, others))) {
|
|
56
|
+
console.log('Nothing changed.');
|
|
57
|
+
return 1;
|
|
58
|
+
}
|
|
59
|
+
await working('Asking the sandbox to shut down', () => channel.exec(['C:\\Windows\\System32\\shutdown.exe', '/s', '/t', '2'], sandbox.guestWorkspace, 30));
|
|
60
|
+
console.log('Sandbox is shutting down; history and claude-mem sync back when it closes.');
|
|
61
|
+
return 0;
|
|
62
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type Context } from '../context.js';
|
|
2
|
+
export declare function exec(ctx: Context): Promise<number>;
|
|
3
|
+
/**
|
|
4
|
+
* `sandbox db`: runs the sandbox's own `sbx-db` in this folder's project, which knows its database versions and ports.
|
|
5
|
+
*/
|
|
6
|
+
export declare function db(ctx: Context): Promise<number>;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { spawnSync } from 'node:child_process';
|
|
3
|
+
import { SandboxChannel } from '../../../host/channel/index.js';
|
|
4
|
+
import { insideSandbox } from '../../../host/sandbox/index.js';
|
|
5
|
+
import { NeedsRestart } from '../../../host/projects/index.js';
|
|
6
|
+
import { fail, safeText } from '../../../core/util/index.js';
|
|
7
|
+
import { printJson, working } from '../../output/index.js';
|
|
8
|
+
import { requireOnPc, requireRunning } from '../context.js';
|
|
9
|
+
import { readySandbox } from '../launch/index.js';
|
|
10
|
+
import { hereDir, joinHere, provisionJoined } from '../projects/index.js';
|
|
11
|
+
/** What a command run in the sandbox printed (text from the sandbox: through safeText), or why it failed. */
|
|
12
|
+
function printExecResult(result) {
|
|
13
|
+
if (result.stdout)
|
|
14
|
+
process.stdout.write(safeText(result.stdout));
|
|
15
|
+
if (result.stderr)
|
|
16
|
+
process.stderr.write(safeText(result.stderr));
|
|
17
|
+
if (!result.ok && !result.stdout && !result.stderr)
|
|
18
|
+
console.error(safeText(result.message));
|
|
19
|
+
}
|
|
20
|
+
/** The guest folder for this folder, joining the running sandbox (and setting the project up) when needed. */
|
|
21
|
+
async function guestFolderHere(ctx, what) {
|
|
22
|
+
const ready = await readySandbox(ctx.dataPath);
|
|
23
|
+
try {
|
|
24
|
+
// A command needs no restart for what the project wants at boot: it runs without them (and says so).
|
|
25
|
+
const joined = await joinHere(ctx, ready, { noRestart: true });
|
|
26
|
+
for (const note of joined.notes)
|
|
27
|
+
console.error(note);
|
|
28
|
+
await provisionJoined(ctx, joined);
|
|
29
|
+
return joined.guestDir;
|
|
30
|
+
}
|
|
31
|
+
catch (e) {
|
|
32
|
+
if (!(e instanceof NeedsRestart))
|
|
33
|
+
throw e;
|
|
34
|
+
return fail(hereDir(ctx) + ' is not in the running sandbox (' + e.reason + '), so "sandbox ' + what + '" cannot run there.', 'sandbox claude (or sandbox start) from that folder offers a restart that adds it; or add its parent folder as a root: sandbox projects roots add "' +
|
|
35
|
+
path.dirname(e.hostDir) +
|
|
36
|
+
'"');
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export async function exec(ctx) {
|
|
40
|
+
const command = [...ctx.options.positionals, ...ctx.options.passthrough];
|
|
41
|
+
if (command.length === 0)
|
|
42
|
+
fail('No command given.', 'Usage: sandbox exec [--timeout <s>] -- <command> [args...]');
|
|
43
|
+
requireOnPc('exec');
|
|
44
|
+
requireRunning();
|
|
45
|
+
const cwd = await guestFolderHere(ctx, 'exec');
|
|
46
|
+
const result = await new SandboxChannel(ctx.dataPath).exec(command, cwd, ctx.options.timeout);
|
|
47
|
+
if (!printJson(ctx, result))
|
|
48
|
+
printExecResult(result);
|
|
49
|
+
return result.exitCode ?? 1;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* `sandbox db`: runs the sandbox's own `sbx-db` in this folder's project, which knows its database versions and ports.
|
|
53
|
+
*/
|
|
54
|
+
export async function db(ctx) {
|
|
55
|
+
const [action = 'list', name] = ctx.options.positionals;
|
|
56
|
+
if (!['list', 'start', 'stop'].includes(action))
|
|
57
|
+
fail('Unknown db action "' + action + '".', 'Use: sandbox db (list) or sandbox db start|stop <postgres|mysql|mongodb|redis|dynamodb>');
|
|
58
|
+
if (action !== 'list' && !name)
|
|
59
|
+
fail('Which database?', 'Usage: sandbox db ' + action + ' <postgres|mysql|mongodb|redis|dynamodb>');
|
|
60
|
+
// Already inside the sandbox: run the database tool here instead of asking the sandbox from outside.
|
|
61
|
+
if (insideSandbox())
|
|
62
|
+
return (spawnSync(process.execPath, [path.join(ctx.packageRoot, 'dist', 'runtime', 'db.js'), action, ...(name ? [name] : [])], { stdio: 'inherit', windowsHide: true }).status ?? 1);
|
|
63
|
+
requireRunning('Start one with: sandbox start --database <name>');
|
|
64
|
+
const cwd = await guestFolderHere(ctx, 'db');
|
|
65
|
+
// Starting can download the database the first time.
|
|
66
|
+
const result = await working((action === 'list' ? 'Asking' : action === 'start' ? 'Starting' : 'Stopping') +
|
|
67
|
+
' the database' +
|
|
68
|
+
(name ? ' ' + name : 's') +
|
|
69
|
+
' in the sandbox', () => new SandboxChannel(ctx.dataPath).exec(['sbx-db', action, ...(name ? [name] : [])], cwd, 1800));
|
|
70
|
+
printExecResult(result);
|
|
71
|
+
return result.exitCode ?? 1;
|
|
72
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// Working with a running sandbox: attach, sessions, status, exec, restart, stop, show/hide. Each knows which project
|
|
2
|
+
// you run it from (project.ts): attach and sessions put that project's sessions first, exec and db run in it, restart
|
|
3
|
+
// restarts its sessions, stop warns about the other projects' sessions.
|
|
4
|
+
export * from './attach.js';
|
|
5
|
+
export * from './list.js';
|
|
6
|
+
export * from './status.js';
|
|
7
|
+
export * from './exec.js';
|
|
8
|
+
export * from './control.js';
|
|
9
|
+
export * from './window.js';
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { SessionStatus } from '../../../core/types.js';
|
|
2
|
+
import type { Viewers } from '../../../shared/pty/index.js';
|
|
3
|
+
import { type RegistryEntry } from '../../../host/projects/index.js';
|
|
4
|
+
import { type Context } from '../context.js';
|
|
5
|
+
export declare function viewerText(v: Viewers | null | undefined): string;
|
|
6
|
+
export declare function projectOf(projects: RegistryEntry[], s: SessionStatus): string;
|
|
7
|
+
/** A session with who is watching it and whether it is in the project of the current folder. */
|
|
8
|
+
export type ListedSession = SessionStatus & {
|
|
9
|
+
readonly viewers?: Viewers | null;
|
|
10
|
+
readonly here?: boolean;
|
|
11
|
+
readonly projectName?: string;
|
|
12
|
+
};
|
|
13
|
+
/** Sessions with who is watching them; `here` marks the ones in the project of the current folder. */
|
|
14
|
+
export declare function listedSessions(ctx: Context): Promise<ListedSession[]>;
|
|
15
|
+
export declare function sessions(ctx: Context): Promise<number>;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import _ from 'lodash';
|
|
2
|
+
import { SandboxChannel, sessionViewers } from '../../../host/channel/index.js';
|
|
3
|
+
import { isSandboxRunning } from '../../../host/sandbox/index.js';
|
|
4
|
+
import { ProjectRegistry } from '../../../host/projects/index.js';
|
|
5
|
+
import { isWithin, projectForGuestDir } from '../../../shared/paths/index.js';
|
|
6
|
+
import { RunDir } from '../../../shared/channel/index.js';
|
|
7
|
+
import { safeText } from '../../../core/util/index.js';
|
|
8
|
+
import { printJson, table, ago, c, shortenMiddle, termWidth } from '../../output/index.js';
|
|
9
|
+
import { locateHere } from '../projects/index.js';
|
|
10
|
+
export function viewerText(v) {
|
|
11
|
+
return v === undefined
|
|
12
|
+
? '-'
|
|
13
|
+
: v === null
|
|
14
|
+
? 'unknown (older session)'
|
|
15
|
+
: v.remote + ' here, ' + (v.viewers - v.remote) + ' in sandbox';
|
|
16
|
+
}
|
|
17
|
+
export function projectOf(projects, s) {
|
|
18
|
+
return s.project ?? projectForGuestDir(projects, s.cwd)?.name ?? '-';
|
|
19
|
+
}
|
|
20
|
+
/** Sessions with who is watching them; `here` marks the ones in the project of the current folder. */
|
|
21
|
+
export async function listedSessions(ctx) {
|
|
22
|
+
// Who is attached comes from each session itself, so a terminal that was closed is never counted.
|
|
23
|
+
const live = isSandboxRunning();
|
|
24
|
+
// Only this sandbox's sessions are asked (and at most MAX_QUERIED_SESSIONS): the sandbox writes these files.
|
|
25
|
+
const ask = new Set(live ? new SandboxChannel(ctx.dataPath).currentSessions().map((s) => s.id) : []);
|
|
26
|
+
const here = live ? locateHere(ctx, new RunDir(ctx.dataPath).readSandboxStatus()) : { guestDir: null };
|
|
27
|
+
const projects = new ProjectRegistry(ctx.storageRoot).read()?.projects ?? [];
|
|
28
|
+
return Promise.all(new RunDir(ctx.dataPath).listSessions().map(async (s) => ({
|
|
29
|
+
...s,
|
|
30
|
+
projectName: projectOf(projects, s),
|
|
31
|
+
here: Boolean(here.guestDir && isWithin(here.guestDir, s.cwd)),
|
|
32
|
+
...(ask.has(s.id) ? { viewers: await sessionViewers(s) } : {}),
|
|
33
|
+
})));
|
|
34
|
+
}
|
|
35
|
+
export async function sessions(ctx) {
|
|
36
|
+
const list = await listedSessions(ctx);
|
|
37
|
+
if (printJson(ctx, list.map((s) => _.omit(s, 'attach'))))
|
|
38
|
+
return 0;
|
|
39
|
+
if (list.length === 0) {
|
|
40
|
+
console.log('No sessions. Start one with: sandbox claude');
|
|
41
|
+
return 0;
|
|
42
|
+
}
|
|
43
|
+
// This folder's project first, newest first within each group; harness, cwd and times are written by the sandbox.
|
|
44
|
+
const ordered = [
|
|
45
|
+
..._.sortBy(list.filter((s) => s.here), (s) => s.startedAt).reverse(),
|
|
46
|
+
..._.sortBy(list.filter((s) => !s.here), (s) => s.startedAt).reverse(),
|
|
47
|
+
];
|
|
48
|
+
const folderWidth = Math.max(16, termWidth() - 80);
|
|
49
|
+
table([
|
|
50
|
+
['', 'ID', 'AGENT', 'PROJECT', 'STATE', 'ATTACHED', 'FOLDER', 'STARTED'],
|
|
51
|
+
...ordered.map((s) => [
|
|
52
|
+
s.here ? '*' : '',
|
|
53
|
+
s.id,
|
|
54
|
+
safeText(s.harness),
|
|
55
|
+
safeText(s.projectName ?? '-'),
|
|
56
|
+
s.phase + (s.exitCode !== undefined ? ' (' + s.exitCode + ')' : ''),
|
|
57
|
+
viewerText(s.viewers),
|
|
58
|
+
shortenMiddle(safeText(s.cwd), folderWidth),
|
|
59
|
+
ago(s.startedAt),
|
|
60
|
+
]),
|
|
61
|
+
]);
|
|
62
|
+
if (list.some((s) => s.here))
|
|
63
|
+
console.log(c.dim('* = the project of this folder'));
|
|
64
|
+
return 0;
|
|
65
|
+
}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import _ from 'lodash';
|
|
2
|
+
import { AccountStore } from '../../../host/profile/index.js';
|
|
3
|
+
import { SandboxChannel } from '../../../host/channel/index.js';
|
|
4
|
+
import { isSandboxRunning } from '../../../host/sandbox/index.js';
|
|
5
|
+
import { ProjectRegistry } from '../../../host/projects/index.js';
|
|
6
|
+
import { RepoGuardStore } from '../../../host/guard/index.js';
|
|
7
|
+
import { projectForGuestDir } from '../../../shared/paths/index.js';
|
|
8
|
+
import { RunDir } from '../../../shared/channel/index.js';
|
|
9
|
+
import { watcherRunning } from '../../../sync/index.js';
|
|
10
|
+
import { errMsg, safeText } from '../../../core/util/index.js';
|
|
11
|
+
import { printJson, table, ago, c, shortenMiddle, termWidth } from '../../output/index.js';
|
|
12
|
+
import { hereDir, locateHere } from '../projects/index.js';
|
|
13
|
+
import { listedSessions, viewerText } from './list.js';
|
|
14
|
+
/** Running databases by port, from the sandbox's own `sbx-db list` (best effort: unknown when it does not answer). */
|
|
15
|
+
async function runningPorts(channel, cwd) {
|
|
16
|
+
try {
|
|
17
|
+
const r = await channel.exec(['sbx-db', 'list'], cwd, 30);
|
|
18
|
+
return new Set((r.stdout ?? '')
|
|
19
|
+
.split(/\r?\n/)
|
|
20
|
+
.filter((l) => /\brunning\b/.test(l))
|
|
21
|
+
.map((l) => Number(/port (\d+)/.exec(l)?.[1]))
|
|
22
|
+
.filter((n) => n > 0));
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/** One project: its setup, databases, running sessions and repo guard findings (sandbox text through safeText). */
|
|
29
|
+
function projectInfo(p, all, facts) {
|
|
30
|
+
const prov = facts.provisioning.find((s) => s.name.toLowerCase() === p.name.toLowerCase());
|
|
31
|
+
const own = facts.sessions.filter((s) => s.phase === 'running' && projectForGuestDir(all, s.cwd)?.name === p.name);
|
|
32
|
+
const { ports } = facts;
|
|
33
|
+
return {
|
|
34
|
+
name: p.name,
|
|
35
|
+
host: p.host,
|
|
36
|
+
guest: p.guest,
|
|
37
|
+
mechanism: p.mechanism,
|
|
38
|
+
here: facts.here === p.name,
|
|
39
|
+
setup: prov
|
|
40
|
+
? { phase: prov.phase, message: safeText(prov.message) }
|
|
41
|
+
: { phase: 'not set up yet', message: 'set up when you first start a session or command there' },
|
|
42
|
+
databases: (prov?.databases ?? []).map((d) => ({
|
|
43
|
+
database: safeText(d.database),
|
|
44
|
+
port: d.port,
|
|
45
|
+
state: ports ? (ports.has(d.port) ? 'running' : 'stopped') : 'unknown',
|
|
46
|
+
})),
|
|
47
|
+
sessions: own.map((s) => ({
|
|
48
|
+
id: s.id,
|
|
49
|
+
harness: safeText(s.harness),
|
|
50
|
+
viewers: viewerText(s.viewers),
|
|
51
|
+
started: s.startedAt,
|
|
52
|
+
})),
|
|
53
|
+
// With several guarded folders each finding starts with its folder.
|
|
54
|
+
repoGuard: facts.findings
|
|
55
|
+
.filter((f) => f.detail.toLowerCase().startsWith(p.host.toLowerCase() + ':'))
|
|
56
|
+
.map((f) => f.kind + ': ' + safeText(f.detail)),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
const MECHANISM_TEXT = {
|
|
60
|
+
launch: 'started from here',
|
|
61
|
+
root: 'in a project root',
|
|
62
|
+
boot: 'mapped at start',
|
|
63
|
+
};
|
|
64
|
+
function mechanismText(mechanism) {
|
|
65
|
+
return mechanism in MECHANISM_TEXT ? MECHANISM_TEXT[mechanism] : 'wsb share';
|
|
66
|
+
}
|
|
67
|
+
function printProject(p) {
|
|
68
|
+
console.log((p.here ? '* ' : ' ') +
|
|
69
|
+
c.bold(p.name) +
|
|
70
|
+
' ' +
|
|
71
|
+
p.host +
|
|
72
|
+
' -> ' +
|
|
73
|
+
p.guest +
|
|
74
|
+
c.dim(' (' + mechanismText(p.mechanism) + ')'));
|
|
75
|
+
console.log(' setup: ' +
|
|
76
|
+
p.setup.phase +
|
|
77
|
+
(p.setup.phase === 'ready' ? '' : ' - ' + shortenMiddle(p.setup.message, termWidth() - 20)));
|
|
78
|
+
if (p.databases.length)
|
|
79
|
+
console.log(' databases: ' + p.databases.map((d) => d.database + ' :' + d.port + ' ' + d.state).join(', '));
|
|
80
|
+
for (const s of p.sessions)
|
|
81
|
+
console.log(' session ' + s.id + ' ' + s.harness + ' ' + s.viewers + ' ' + ago(s.started));
|
|
82
|
+
for (const f of p.repoGuard)
|
|
83
|
+
console.log(' ' + c.yellow('guard: ' + f));
|
|
84
|
+
}
|
|
85
|
+
export async function status(ctx) {
|
|
86
|
+
const running = isSandboxRunning();
|
|
87
|
+
const run = new RunDir(ctx.dataPath);
|
|
88
|
+
const channel = new SandboxChannel(ctx.dataPath);
|
|
89
|
+
const guard = new RepoGuardStore(ctx.dataPath);
|
|
90
|
+
const sandbox = run.readSandboxStatus();
|
|
91
|
+
const registry = running ? new ProjectRegistry(ctx.storageRoot).read() : null;
|
|
92
|
+
const ready = running && sandbox?.phase === 'ready';
|
|
93
|
+
const daemon = ready
|
|
94
|
+
? await channel.ping().then((r) => r.message, (e) => 'no answer (' + errMsg(e) + ')')
|
|
95
|
+
: '-';
|
|
96
|
+
const here = running ? locateHere(ctx, sandbox) : { project: null, guestDir: null };
|
|
97
|
+
const sessionList = running ? await listedSessions(ctx) : [];
|
|
98
|
+
const provisioning = running ? run.listProjectStatus() : [];
|
|
99
|
+
const ports = ready && sandbox ? await runningPorts(channel, sandbox.guestWorkspace) : null;
|
|
100
|
+
const findings = guard.findings();
|
|
101
|
+
const startedAt = Number(/^(\d+)-/.exec(registry?.launchId ?? sandbox?.launchId ?? '')?.[1]) || null;
|
|
102
|
+
const all = registry?.projects ?? [];
|
|
103
|
+
const facts = { here: here.project?.name ?? null, provisioning, sessions: sessionList, ports, findings };
|
|
104
|
+
const projects = all.map((p) => projectInfo(p, all, facts));
|
|
105
|
+
const info = {
|
|
106
|
+
sandbox: {
|
|
107
|
+
running,
|
|
108
|
+
phase: running ? (sandbox?.phase ?? 'unknown') : 'stopped',
|
|
109
|
+
message: sandbox?.message,
|
|
110
|
+
headless: sandbox?.headless,
|
|
111
|
+
uptime: running && startedAt ? ago(startedAt).replace(' ago', '') : null,
|
|
112
|
+
daemon,
|
|
113
|
+
account: new AccountStore(ctx.storageRoot).activeFor(ctx.dataPath),
|
|
114
|
+
syncWatcher: watcherRunning(ctx.dataPath),
|
|
115
|
+
},
|
|
116
|
+
here: { folder: hereDir(ctx), project: here.project?.name ?? null, guest: here.guestDir },
|
|
117
|
+
roots: registry?.roots ?? [],
|
|
118
|
+
projects,
|
|
119
|
+
otherSessions: sessionList
|
|
120
|
+
.filter((s) => s.phase === 'running' && !projects.some((p) => p.sessions.some((x) => x.id === s.id)))
|
|
121
|
+
.map((s) => ({ id: s.id, harness: safeText(s.harness), cwd: safeText(s.cwd) })),
|
|
122
|
+
repoGuard: {
|
|
123
|
+
guarded: guard.guarded().length,
|
|
124
|
+
findings: findings.map((f) => f.kind + ': ' + f.detail),
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
if (printJson(ctx, info))
|
|
128
|
+
return 0;
|
|
129
|
+
const yesNo = (v) => (typeof v === 'boolean' ? (v ? 'yes' : 'no') : String(v ?? '-'));
|
|
130
|
+
table(Object.entries(info.sandbox).map(([k, v]) => [_.startCase(k), safeText(yesNo(v))]));
|
|
131
|
+
if (!running)
|
|
132
|
+
return 0;
|
|
133
|
+
console.log('\n' +
|
|
134
|
+
c.bold('Projects') +
|
|
135
|
+
c.dim(' (* = this folder: ' + info.here.folder + (info.here.project ? '' : ', not in this sandbox') + ')'));
|
|
136
|
+
for (const p of projects)
|
|
137
|
+
printProject(p);
|
|
138
|
+
for (const r of info.roots)
|
|
139
|
+
console.log(' root ' + r.host + ' -> ' + r.guest + c.dim(' (every project in it opens without a restart)'));
|
|
140
|
+
for (const s of info.otherSessions)
|
|
141
|
+
console.log(' session ' + s.id + ' ' + s.harness + ' ' + s.cwd);
|
|
142
|
+
console.log('\n' +
|
|
143
|
+
c.bold('Repo guard') +
|
|
144
|
+
' ' +
|
|
145
|
+
info.repoGuard.guarded +
|
|
146
|
+
' folder(s) guarded; ' +
|
|
147
|
+
(findings.length
|
|
148
|
+
? c.yellow(findings.length + ' change(s) neutralised:')
|
|
149
|
+
: 'nothing from the sandbox needed neutralising'));
|
|
150
|
+
for (const f of info.repoGuard.findings.slice(-10))
|
|
151
|
+
console.log(' ' + c.yellow(safeText(f)));
|
|
152
|
+
return 0;
|
|
153
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { hideSandboxWindow, showSandboxWindow } from '../../../host/sandbox/index.js';
|
|
2
|
+
import { fail } from '../../../core/util/index.js';
|
|
3
|
+
import { requireOnPc, requireRunning } from '../context.js';
|
|
4
|
+
export function show(ctx) {
|
|
5
|
+
requireOnPc('show');
|
|
6
|
+
requireRunning();
|
|
7
|
+
if (!showSandboxWindow(ctx.storageRoot))
|
|
8
|
+
fail('Could not find the Windows Sandbox window.', 'It may still be starting; try again in a few seconds.');
|
|
9
|
+
return 0;
|
|
10
|
+
}
|
|
11
|
+
export async function hide(ctx) {
|
|
12
|
+
requireOnPc('hide');
|
|
13
|
+
requireRunning();
|
|
14
|
+
if (!(await hideSandboxWindow(ctx.storageRoot, 5)))
|
|
15
|
+
fail('Could not find a visible Windows Sandbox window.', 'It may already be hidden (sbx-show brings it back).');
|
|
16
|
+
console.log('Sandbox window hidden. Bring it back with: sbx-show');
|
|
17
|
+
return 0;
|
|
18
|
+
}
|
|
@@ -6,8 +6,8 @@ export interface Check {
|
|
|
6
6
|
detail: string;
|
|
7
7
|
}
|
|
8
8
|
/** Windows Sandbox needs Pro, Enterprise or Education (build 18305+); Home ("Core*") and Server cannot run it. */
|
|
9
|
-
export declare
|
|
10
|
-
export declare
|
|
9
|
+
export declare function editionSupport(edition: string | null): EditionSupport;
|
|
10
|
+
export declare function nodeMajor(version: string): number;
|
|
11
11
|
/** Offer to enable the feature only when it is off and this edition can have it. */
|
|
12
|
-
export declare
|
|
13
|
-
export declare
|
|
12
|
+
export declare function canEnableFeature(f: MachineFacts): boolean;
|
|
13
|
+
export declare function buildChecks(f: MachineFacts): Check[];
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { GB } from '../../../core/disk.js';
|
|
3
3
|
import { ENABLE_COMMAND } from './facts.js';
|
|
4
4
|
/** Windows Sandbox needs Pro, Enterprise or Education (build 18305+); Home ("Core*") and Server cannot run it. */
|
|
5
|
-
export
|
|
5
|
+
export function editionSupport(edition) {
|
|
6
6
|
if (!edition)
|
|
7
7
|
return 'unknown';
|
|
8
8
|
if (/^Core/i.test(edition))
|
|
@@ -10,13 +10,24 @@ export const editionSupport = (edition) => {
|
|
|
10
10
|
if (/^Server/i.test(edition))
|
|
11
11
|
return 'unsupported';
|
|
12
12
|
return /^(Professional|Enterprise|Education|IoTEnterprise)/i.test(edition) ? 'supported' : 'unknown';
|
|
13
|
-
}
|
|
14
|
-
export
|
|
13
|
+
}
|
|
14
|
+
export function nodeMajor(version) {
|
|
15
|
+
return Number(/^v?(\d+)/.exec(version.trim())?.[1] ?? 0);
|
|
16
|
+
}
|
|
15
17
|
/** Offer to enable the feature only when it is off and this edition can have it. */
|
|
16
|
-
export
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
export function canEnableFeature(f) {
|
|
19
|
+
return (f.feature !== 'enabled' &&
|
|
20
|
+
f.feature !== 'pending' &&
|
|
21
|
+
!f.sandboxExe &&
|
|
22
|
+
['supported', 'unknown'].includes(editionSupport(f.edition)));
|
|
23
|
+
}
|
|
24
|
+
function formatGb(bytes) {
|
|
25
|
+
return (bytes / GB).toFixed(1) + ' GB';
|
|
26
|
+
}
|
|
27
|
+
function check(name, status, detail) {
|
|
28
|
+
return { name, status, detail };
|
|
29
|
+
}
|
|
30
|
+
function editionCheck(f) {
|
|
20
31
|
const support = editionSupport(f.edition);
|
|
21
32
|
const edition = (f.edition ?? 'unknown edition') + (f.build ? ', build ' + f.build : '');
|
|
22
33
|
const name = 'Windows edition';
|
|
@@ -29,17 +40,17 @@ const editionCheck = (f) => {
|
|
|
29
40
|
if (support === 'supported')
|
|
30
41
|
return check(name, 'action', edition + ': too old; Windows Sandbox needs Windows 10 version 1903 or newer.');
|
|
31
42
|
return check(name, 'warn', edition + ': not sure this edition has Windows Sandbox (it needs Pro, Enterprise or Education).');
|
|
32
|
-
}
|
|
33
|
-
|
|
43
|
+
}
|
|
44
|
+
function virtualizationCheck(f) {
|
|
34
45
|
const name = 'CPU virtualization';
|
|
35
46
|
const virt = f.hypervisorPresent || f.virtualizationFirmware;
|
|
36
47
|
if (virt)
|
|
37
48
|
return check(name, 'ok', f.hypervisorPresent ? 'on (hypervisor running)' : 'on');
|
|
38
49
|
if (virt === false)
|
|
39
|
-
return check(name, 'action',
|
|
50
|
+
return check(name, 'action', "off. Turn on Intel VT-x / AMD-V (SVM) in your PC's BIOS/UEFI settings, then run this again.");
|
|
40
51
|
return check(name, 'warn', 'could not tell; if Windows Sandbox will not start, turn on VT-x / AMD-V in the BIOS/UEFI.');
|
|
41
|
-
}
|
|
42
|
-
|
|
52
|
+
}
|
|
53
|
+
function featureCheck(f) {
|
|
43
54
|
const name = 'Windows Sandbox feature';
|
|
44
55
|
if (f.feature === 'enabled' && f.sandboxExe)
|
|
45
56
|
return check(name, 'ok', 'enabled');
|
|
@@ -48,16 +59,16 @@ const featureCheck = (f) => {
|
|
|
48
59
|
if (f.sandboxExe)
|
|
49
60
|
return check(name, 'ok', 'installed');
|
|
50
61
|
return check(name, 'action', 'not enabled. In an admin PowerShell: ' + ENABLE_COMMAND + ', then restart.');
|
|
51
|
-
}
|
|
52
|
-
|
|
62
|
+
}
|
|
63
|
+
function memoryCheck(f) {
|
|
53
64
|
const gb = formatGb(f.totalRamBytes);
|
|
54
65
|
if (f.totalRamBytes < 4 * GB)
|
|
55
66
|
return check('Memory', 'action', gb + ': Windows Sandbox needs at least 4 GB.');
|
|
56
67
|
if (f.totalRamBytes < 8 * GB)
|
|
57
68
|
return check('Memory', 'warn', gb + ': works, but 8 GB or more is recommended.');
|
|
58
69
|
return check('Memory', 'ok', gb);
|
|
59
|
-
}
|
|
60
|
-
|
|
70
|
+
}
|
|
71
|
+
function diskCheck(f) {
|
|
61
72
|
if (f.freeDiskBytes === null)
|
|
62
73
|
return check('Free disk', 'warn', 'could not check the drive of ' + f.storageRoot);
|
|
63
74
|
const free = formatGb(f.freeDiskBytes) + ' free for ' + f.storageRoot;
|
|
@@ -66,6 +77,12 @@ const diskCheck = (f) => {
|
|
|
66
77
|
if (f.freeDiskBytes < 20 * GB)
|
|
67
78
|
return check('Free disk', 'warn', free + ': getting low; toolchains and caches can use several GB.');
|
|
68
79
|
return check('Free disk', 'ok', free);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
|
|
80
|
+
}
|
|
81
|
+
function nodeCheck(f) {
|
|
82
|
+
return nodeMajor(f.nodeVersion) >= 20
|
|
83
|
+
? check('Node.js', 'ok', f.nodeVersion)
|
|
84
|
+
: check('Node.js', 'action', f.nodeVersion + ': needs 20 or newer (winget install OpenJS.NodeJS.LTS).');
|
|
85
|
+
}
|
|
86
|
+
export function buildChecks(f) {
|
|
87
|
+
return [editionCheck(f), virtualizationCheck(f), featureCheck(f), memoryCheck(f), diskCheck(f), nodeCheck(f)];
|
|
88
|
+
}
|
|
@@ -16,16 +16,16 @@ export interface MachineFacts {
|
|
|
16
16
|
}
|
|
17
17
|
export declare const ENABLE_COMMAND: string;
|
|
18
18
|
/** `reg query <key>` output to { valueName: data }. */
|
|
19
|
-
export declare
|
|
19
|
+
export declare function parseRegQuery(text: string): Record<string, string>;
|
|
20
20
|
/** The "State : ..." line of `Dism /Get-FeatureInfo` (English output only; anything else is unknown). */
|
|
21
|
-
export declare
|
|
21
|
+
export declare function parseDismState(text: string): FeatureState;
|
|
22
22
|
/** Win32_OptionalFeature.InstallState: 1 enabled, 2 disabled, 3 absent. */
|
|
23
|
-
export declare
|
|
24
|
-
declare const
|
|
23
|
+
export declare function featureFromInstallState(state: number | null | undefined): FeatureState;
|
|
24
|
+
declare const ProbeSchema: z.ZodObject<{
|
|
25
25
|
virtualizationFirmware: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
|
|
26
26
|
hypervisorPresent: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
|
|
27
27
|
installState: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
28
28
|
}, z.core.$strip>;
|
|
29
|
-
export declare
|
|
30
|
-
export declare
|
|
29
|
+
export declare function parseProbe(text: string): z.infer<typeof ProbeSchema>;
|
|
30
|
+
export declare function gatherFacts(storageRoot: string): MachineFacts;
|
|
31
31
|
export {};
|
|
@@ -3,23 +3,29 @@ import os from 'node:os';
|
|
|
3
3
|
import _ from 'lodash';
|
|
4
4
|
import { z } from 'zod';
|
|
5
5
|
import { freeBytesAt } from '../../../core/disk.js';
|
|
6
|
-
import { captureOutput, fileExists } from '../../../core/util.js';
|
|
6
|
+
import { captureOutput, fileExists } from '../../../core/util/index.js';
|
|
7
7
|
import { SYSTEM, system32 } from '../../../shared/system.js';
|
|
8
8
|
const FEATURE = 'Containers-DisposableClientVM';
|
|
9
9
|
export const ENABLE_COMMAND = 'Enable-WindowsOptionalFeature -Online -FeatureName ' + FEATURE + ' -All -NoRestart';
|
|
10
10
|
/** `reg query <key>` output to { valueName: data }. */
|
|
11
|
-
export
|
|
11
|
+
export function parseRegQuery(text) {
|
|
12
|
+
return Object.fromEntries(_.compact(text
|
|
13
|
+
.split(/\r?\n/)
|
|
14
|
+
.map((line) => /^\s+(\S+)\s+REG_\w+\s+(.*)$/.exec(line)?.slice(1, 3))));
|
|
15
|
+
}
|
|
12
16
|
/** The "State : ..." line of `Dism /Get-FeatureInfo` (English output only; anything else is unknown). */
|
|
13
|
-
export
|
|
17
|
+
export function parseDismState(text) {
|
|
14
18
|
const state = /^State\s*:\s*(.+?)\s*$/im.exec(text)?.[1].toLowerCase() ?? '';
|
|
15
19
|
if (state === 'enabled')
|
|
16
20
|
return 'enabled';
|
|
17
21
|
if (state.includes('pending'))
|
|
18
22
|
return 'pending';
|
|
19
23
|
return state.startsWith('disabled') ? 'disabled' : 'unknown';
|
|
20
|
-
}
|
|
24
|
+
}
|
|
21
25
|
/** Win32_OptionalFeature.InstallState: 1 enabled, 2 disabled, 3 absent. */
|
|
22
|
-
export
|
|
26
|
+
export function featureFromInstallState(state) {
|
|
27
|
+
return state === 1 ? 'enabled' : state === 2 || state === 3 ? 'disabled' : 'unknown';
|
|
28
|
+
}
|
|
23
29
|
// Fixed script (no outside data): CPU/hypervisor facts and the feature state, readable without admin rights.
|
|
24
30
|
const PROBE = [
|
|
25
31
|
'$ErrorActionPreference = "SilentlyContinue"',
|
|
@@ -31,16 +37,22 @@ const PROBE = [
|
|
|
31
37
|
'$s = $null; if ($f) { $s = [int]$f.InstallState }',
|
|
32
38
|
'@{ virtualizationFirmware = $v; hypervisorPresent = $h; installState = $s } | ConvertTo-Json -Compress',
|
|
33
39
|
].join('; ');
|
|
34
|
-
const
|
|
35
|
-
|
|
40
|
+
const ProbeSchema = z
|
|
41
|
+
.object({
|
|
42
|
+
virtualizationFirmware: z.boolean().nullable(),
|
|
43
|
+
hypervisorPresent: z.boolean().nullable(),
|
|
44
|
+
installState: z.number().nullable(),
|
|
45
|
+
})
|
|
46
|
+
.partial();
|
|
47
|
+
export function parseProbe(text) {
|
|
36
48
|
try {
|
|
37
|
-
return
|
|
49
|
+
return ProbeSchema.parse(JSON.parse(_.last(text.trim().split(/\r?\n/)) ?? ''));
|
|
38
50
|
}
|
|
39
51
|
catch {
|
|
40
52
|
return {};
|
|
41
53
|
}
|
|
42
|
-
}
|
|
43
|
-
export
|
|
54
|
+
}
|
|
55
|
+
export function gatherFacts(storageRoot) {
|
|
44
56
|
const reg = parseRegQuery(captureOutput(SYSTEM.reg(), ['query', 'HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion']));
|
|
45
57
|
const probe = parseProbe(captureOutput(SYSTEM.powershell(), ['-NoProfile', '-NonInteractive', '-Command', PROBE]));
|
|
46
58
|
// DISM knows about a pending restart but needs admin rights; the CIM state works for everyone.
|
|
@@ -57,4 +69,4 @@ export const gatherFacts = (storageRoot) => {
|
|
|
57
69
|
storageRoot,
|
|
58
70
|
nodeVersion: process.version,
|
|
59
71
|
};
|
|
60
|
-
}
|
|
72
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { type Context } from '../context.js';
|
|
2
|
-
export declare
|
|
2
|
+
export declare function setup(ctx: Context): Promise<number>;
|