windows-development-sandbox 1.4.0 → 1.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.sandbox-config.example.json +2 -1
- package/config.example.json +4 -1
- package/dist/api.js +27 -16
- package/dist/cli/args.d.ts +4 -6
- package/dist/cli/args.js +67 -34
- package/dist/cli/argv.d.ts +9 -0
- package/dist/cli/argv.js +22 -0
- package/dist/cli/commands/accounts.d.ts +1 -1
- package/dist/cli/commands/accounts.js +42 -27
- package/dist/cli/commands/agent-commands.d.ts +3 -3
- package/dist/cli/commands/agent-commands.js +27 -18
- package/dist/cli/commands/context.d.ts +9 -11
- package/dist/cli/commands/context.js +35 -32
- package/dist/cli/commands/data/clean.d.ts +2 -2
- package/dist/cli/commands/data/clean.js +27 -11
- package/dist/cli/commands/data/collect.d.ts +6 -3
- package/dist/cli/commands/data/collect.js +46 -15
- package/dist/cli/commands/data/index.d.ts +2 -2
- package/dist/cli/commands/data/index.js +30 -12
- package/dist/cli/commands/data/remove.d.ts +1 -1
- package/dist/cli/commands/data/remove.js +4 -4
- package/dist/cli/commands/index.d.ts +5 -4
- package/dist/cli/commands/index.js +5 -4
- package/dist/cli/commands/launch/add-root.d.ts +7 -0
- package/dist/cli/commands/launch/add-root.js +64 -0
- package/dist/cli/commands/launch/boot-progress.d.ts +7 -0
- package/dist/cli/commands/launch/boot-progress.js +48 -0
- package/dist/cli/commands/launch/boot-wants.d.ts +11 -0
- package/dist/cli/commands/launch/boot-wants.js +48 -0
- package/dist/cli/commands/launch/first-start.d.ts +10 -0
- package/dist/cli/commands/launch/first-start.js +53 -0
- package/dist/cli/commands/launch/index.d.ts +6 -0
- package/dist/cli/commands/launch/index.js +6 -0
- package/dist/cli/commands/launch/launch.d.ts +8 -0
- package/dist/cli/commands/launch/launch.js +211 -0
- package/dist/cli/commands/launch/prepare.d.ts +23 -0
- package/dist/cli/commands/launch/prepare.js +109 -0
- package/dist/cli/commands/launch/running.d.ts +45 -0
- package/dist/cli/commands/launch/running.js +218 -0
- package/dist/cli/commands/launch/summary.d.ts +8 -0
- package/dist/cli/commands/launch/summary.js +98 -0
- package/dist/cli/commands/maintenance/audit.d.ts +3 -0
- package/dist/cli/commands/maintenance/audit.js +58 -0
- package/dist/cli/commands/maintenance/clean.d.ts +2 -0
- package/dist/cli/commands/maintenance/clean.js +10 -0
- package/dist/cli/commands/maintenance/config.d.ts +2 -0
- package/dist/cli/commands/maintenance/config.js +145 -0
- package/dist/cli/commands/maintenance/doctor.d.ts +2 -0
- package/dist/cli/commands/maintenance/doctor.js +52 -0
- package/dist/cli/commands/maintenance/host-claude.d.ts +2 -0
- package/dist/cli/commands/maintenance/host-claude.js +4 -0
- package/dist/cli/commands/maintenance/index.d.ts +8 -0
- package/dist/cli/commands/maintenance/index.js +9 -0
- package/dist/cli/commands/maintenance/logs.d.ts +2 -0
- package/dist/cli/commands/maintenance/logs.js +44 -0
- package/dist/cli/commands/maintenance/sync.d.ts +2 -0
- package/dist/cli/commands/maintenance/sync.js +12 -0
- package/dist/cli/commands/maintenance/watch.d.ts +3 -0
- package/dist/cli/commands/maintenance/watch.js +6 -0
- package/dist/cli/commands/projects/describe-sessions.d.ts +3 -0
- package/dist/cli/commands/projects/describe-sessions.js +15 -0
- package/dist/cli/commands/projects/here.d.ts +38 -0
- package/dist/cli/commands/projects/here.js +145 -0
- package/dist/cli/commands/projects/index.d.ts +4 -0
- package/dist/cli/commands/projects/index.js +4 -0
- package/dist/cli/commands/projects/projects.d.ts +14 -0
- package/dist/cli/commands/projects/projects.js +213 -0
- package/dist/cli/commands/projects/restart.d.ts +15 -0
- package/dist/cli/commands/projects/restart.js +149 -0
- package/dist/cli/commands/registry.d.ts +3 -0
- package/dist/cli/commands/registry.js +34 -0
- package/dist/cli/commands/repair/checks.js +105 -29
- package/dist/cli/commands/repair/finders.d.ts +13 -10
- package/dist/cli/commands/repair/finders.js +63 -43
- package/dist/cli/commands/repair/index.d.ts +4 -4
- package/dist/cli/commands/repair/index.js +47 -21
- package/dist/cli/commands/repair/types.d.ts +2 -2
- package/dist/cli/commands/repair/types.js +7 -2
- package/dist/cli/commands/sessions/attach.d.ts +2 -0
- package/dist/cli/commands/sessions/attach.js +45 -0
- package/dist/cli/commands/sessions/control.d.ts +4 -0
- package/dist/cli/commands/sessions/control.js +62 -0
- package/dist/cli/commands/sessions/exec.d.ts +6 -0
- package/dist/cli/commands/sessions/exec.js +72 -0
- package/dist/cli/commands/sessions/index.d.ts +6 -0
- package/dist/cli/commands/sessions/index.js +9 -0
- package/dist/cli/commands/sessions/list.d.ts +15 -0
- package/dist/cli/commands/sessions/list.js +65 -0
- package/dist/cli/commands/sessions/status.d.ts +2 -0
- package/dist/cli/commands/sessions/status.js +153 -0
- package/dist/cli/commands/sessions/window.d.ts +3 -0
- package/dist/cli/commands/sessions/window.js +18 -0
- package/dist/cli/commands/setup/checks.d.ts +4 -4
- package/dist/cli/commands/setup/checks.js +36 -19
- package/dist/cli/commands/setup/facts.d.ts +6 -6
- package/dist/cli/commands/setup/facts.js +23 -11
- package/dist/cli/commands/setup/index.d.ts +1 -1
- package/dist/cli/commands/setup/index.js +25 -12
- package/dist/cli/commands/user-config.d.ts +5 -5
- package/dist/cli/commands/user-config.js +14 -12
- package/dist/cli/history.d.ts +5 -4
- package/dist/cli/history.js +23 -11
- package/dist/cli/index.d.ts +4 -14
- package/dist/cli/index.js +27 -77
- package/dist/cli/manifest.d.ts +464 -10
- package/dist/cli/manifest.js +328 -54
- package/dist/cli/menu/apps.d.ts +7 -5
- package/dist/cli/menu/apps.js +64 -16
- package/dist/cli/menu/command-fields.d.ts +15 -0
- package/dist/cli/menu/command-fields.js +23 -0
- package/dist/cli/menu/command-form.d.ts +3 -5
- package/dist/cli/menu/command-form.js +116 -48
- package/dist/cli/menu/home.d.ts +22 -0
- package/dist/cli/menu/home.js +72 -0
- package/dist/cli/menu/index.d.ts +2 -24
- package/dist/cli/menu/index.js +4 -178
- package/dist/cli/menu/menu.d.ts +23 -0
- package/dist/cli/menu/menu.js +185 -0
- package/dist/cli/menu/settings/categories.d.ts +2 -2
- package/dist/cli/menu/settings/categories.js +123 -20
- package/dist/cli/menu/settings/collections/collection-editor.d.ts +23 -0
- package/dist/cli/menu/settings/collections/collection-editor.js +89 -0
- package/dist/cli/menu/settings/collections/map-editor.d.ts +10 -0
- package/dist/cli/menu/settings/collections/map-editor.js +34 -0
- package/dist/cli/menu/settings/collections/object-list-editor.d.ts +10 -0
- package/dist/cli/menu/settings/collections/object-list-editor.js +23 -0
- package/dist/cli/menu/settings/collections/object-map-editor.d.ts +10 -0
- package/dist/cli/menu/settings/collections/object-map-editor.js +35 -0
- package/dist/cli/menu/settings/collections/string-list-editor.d.ts +12 -0
- package/dist/cli/menu/settings/collections/string-list-editor.js +39 -0
- package/dist/cli/menu/settings/config-file.d.ts +2 -2
- package/dist/cli/menu/settings/config-file.js +42 -19
- package/dist/cli/menu/settings/editor-actions.d.ts +2 -0
- package/dist/cli/menu/settings/editor-actions.js +2 -0
- package/dist/cli/menu/settings/format.d.ts +5 -0
- package/dist/cli/menu/settings/format.js +39 -0
- package/dist/cli/menu/settings/index.d.ts +1 -29
- package/dist/cli/menu/settings/index.js +1 -133
- package/dist/cli/menu/settings/object-editor.d.ts +12 -0
- package/dist/cli/menu/settings/object-editor.js +86 -0
- package/dist/cli/menu/settings/schema-node.d.ts +3 -1
- package/dist/cli/menu/settings/schema-node.js +71 -24
- package/dist/cli/menu/settings/settings-editor.d.ts +30 -0
- package/dist/cli/menu/settings/settings-editor.js +176 -0
- package/dist/cli/menu/settings/{editors.d.ts → value-editor.d.ts} +2 -13
- package/dist/cli/menu/settings/value-editor.js +137 -0
- package/dist/cli/menu/several.d.ts +4 -4
- package/dist/cli/menu/several.js +61 -20
- package/dist/cli/{colors.d.ts → output/colors.d.ts} +8 -8
- package/dist/cli/{colors.js → output/colors.js} +32 -14
- package/dist/cli/output/index.d.ts +3 -0
- package/dist/cli/output/index.js +3 -0
- package/dist/cli/output/print.d.ts +5 -0
- package/dist/cli/output/print.js +14 -0
- package/dist/cli/output/progress.d.ts +24 -0
- package/dist/cli/output/progress.js +124 -0
- package/dist/cli/report.d.ts +2 -0
- package/dist/cli/report.js +20 -0
- package/dist/cli/tui/app.d.ts +6 -16
- package/dist/cli/tui/app.js +28 -8
- package/dist/cli/tui/dialogs/confirm-screen.d.ts +20 -0
- package/dist/cli/tui/dialogs/confirm-screen.js +50 -0
- package/dist/cli/tui/dialogs/message-screen.d.ts +17 -0
- package/dist/cli/tui/dialogs/message-screen.js +55 -0
- package/dist/cli/tui/dialogs/paragraphs.d.ts +2 -0
- package/dist/cli/tui/dialogs/paragraphs.js +5 -0
- package/dist/cli/tui/dialogs/text-screen.d.ts +26 -0
- package/dist/cli/tui/dialogs/text-screen.js +107 -0
- package/dist/cli/tui/frame.js +3 -1
- package/dist/cli/tui/index.d.ts +7 -3
- package/dist/cli/tui/index.js +4 -2
- package/dist/cli/tui/list/list-screen.d.ts +29 -0
- package/dist/cli/tui/{list-screen.js → list/list-screen.js} +86 -23
- package/dist/cli/tui/{list-screen.d.ts → list/list-types.d.ts} +0 -28
- package/dist/cli/tui/screen.d.ts +14 -0
- package/dist/cli/tui/terminal.js +34 -10
- package/dist/cli/tui/text.d.ts +2 -1
- package/dist/cli/tui/text.js +37 -7
- package/dist/cli/tui/theme.js +27 -9
- package/dist/cli/validate.d.ts +8 -8
- package/dist/cli/validate.js +32 -21
- package/dist/core/config/defaults.d.ts +2 -0
- package/dist/core/config/defaults.js +203 -0
- package/dist/core/config/index.d.ts +2 -0
- package/dist/core/config/index.js +3 -0
- package/dist/core/{config.d.ts → config/loader.d.ts} +1 -2
- package/dist/core/config/loader.js +47 -0
- package/dist/core/{detect-databases.js → detect/databases.js} +111 -23
- package/dist/core/detect/index.d.ts +4 -0
- package/dist/core/detect/index.js +4 -0
- package/dist/core/{detect-pwsh.d.ts → detect/pwsh.d.ts} +1 -1
- package/dist/core/{detect-pwsh.js → detect/pwsh.js} +25 -11
- package/dist/core/{detect-toolchains.d.ts → detect/toolchains.d.ts} +1 -1
- package/dist/core/{detect-toolchains.js → detect/toolchains.js} +42 -5
- package/dist/{guest/toolchains → core/detect}/versions.js +28 -12
- package/dist/core/disk.d.ts +2 -0
- package/dist/core/disk.js +46 -3
- package/dist/core/local-config/boot-wants.d.ts +45 -0
- package/dist/core/local-config/boot-wants.js +120 -0
- package/dist/core/local-config/file.d.ts +3 -0
- package/dist/core/local-config/file.js +16 -0
- package/dist/core/local-config/index.d.ts +5 -0
- package/dist/core/local-config/index.js +7 -0
- package/dist/core/{local-config.d.ts → local-config/overrides.d.ts} +11 -11
- package/dist/core/{local-config.js → local-config/overrides.js} +53 -54
- package/dist/core/{project-policy.d.ts → local-config/policy.d.ts} +7 -3
- package/dist/core/{project-policy.js → local-config/policy.js} +16 -6
- package/dist/core/local-config/trust.d.ts +13 -0
- package/dist/core/local-config/trust.js +43 -0
- package/dist/core/package-info.d.ts +4 -0
- package/dist/core/package-info.js +13 -0
- package/dist/core/run/guest-workspace.d.ts +23 -0
- package/dist/core/run/guest-workspace.js +47 -0
- package/dist/core/run/index.d.ts +3 -0
- package/dist/core/run/index.js +3 -0
- package/dist/core/run/resolve-run.d.ts +3 -0
- package/dist/core/run/resolve-run.js +202 -0
- package/dist/core/run/versions.d.ts +13 -0
- package/dist/core/run/versions.js +65 -0
- package/dist/core/safe-paths.js +17 -5
- package/dist/core/schema/apps.d.ts +4 -4
- package/dist/core/schema/apps.js +55 -21
- package/dist/core/schema/common.d.ts +13 -10
- package/dist/core/schema/common.js +16 -10
- package/dist/core/schema/config.d.ts +18 -12
- package/dist/core/schema/config.js +78 -53
- package/dist/core/schema/databases.d.ts +4 -3
- package/dist/core/schema/databases.js +16 -12
- package/dist/core/schema/harness.d.ts +1 -1
- package/dist/core/schema/harness.js +17 -7
- package/dist/core/schema/index.d.ts +6 -0
- package/dist/core/schema/index.js +8 -0
- package/dist/core/schema/json-schema.js +10 -5
- package/dist/core/schema/profile.d.ts +4 -4
- package/dist/core/schema/profile.js +37 -17
- package/dist/core/schema/projects.d.ts +2 -1
- package/dist/core/schema/projects.js +16 -5
- package/dist/core/schema/sandbox.d.ts +12 -12
- package/dist/core/schema/sandbox.js +101 -37
- package/dist/core/schema/toolchains.d.ts +6 -1
- package/dist/core/schema/toolchains.js +84 -34
- package/dist/core/types.d.ts +36 -9
- package/dist/core/util/errors.d.ts +8 -0
- package/dist/core/util/errors.js +14 -0
- package/dist/core/util/fs.d.ts +8 -0
- package/dist/core/util/fs.js +40 -0
- package/dist/core/util/index.d.ts +7 -0
- package/dist/core/util/index.js +7 -0
- package/dist/core/util/jsonc.d.ts +6 -0
- package/dist/core/util/jsonc.js +25 -0
- package/dist/core/util/links.d.ts +10 -0
- package/dist/core/util/links.js +39 -0
- package/dist/core/util/paths.d.ts +7 -0
- package/dist/core/util/paths.js +33 -0
- package/dist/core/util/process.d.ts +15 -0
- package/dist/core/util/process.js +54 -0
- package/dist/core/util/text.d.ts +8 -0
- package/dist/core/util/text.js +8 -0
- package/dist/guest/{setup/agents.js → agents/agent-installer.js} +24 -4
- package/dist/guest/apps/after-install.d.ts +3 -0
- package/dist/guest/apps/after-install.js +47 -0
- package/dist/guest/apps/app-installer.d.ts +22 -0
- package/dist/guest/apps/app-installer.js +116 -0
- package/dist/guest/apps/find-exe.d.ts +5 -0
- package/dist/guest/apps/find-exe.js +41 -0
- package/dist/guest/apps/index.d.ts +3 -10
- package/dist/guest/apps/index.js +6 -206
- package/dist/guest/apps/resolvers.js +37 -9
- package/dist/guest/apps/shortcuts.d.ts +6 -0
- package/dist/guest/apps/shortcuts.js +28 -0
- package/dist/guest/apps/sources.d.ts +4 -0
- package/dist/guest/apps/sources.js +17 -0
- package/dist/guest/apps/unpack.d.ts +3 -0
- package/dist/guest/apps/unpack.js +47 -0
- package/dist/guest/{audit-parse.js → audit/parse.js} +39 -3
- package/dist/guest/{audit.d.ts → audit/process-audit.d.ts} +3 -1
- package/dist/guest/{audit.js → audit/process-audit.js} +33 -8
- package/dist/guest/boot/boot-env.d.ts +4 -0
- package/dist/guest/{boot-env.js → boot/boot-env.js} +7 -5
- package/dist/guest/boot/boot.d.ts +1 -0
- package/dist/guest/{main.js → boot/boot.js} +100 -50
- package/dist/guest/{guide.js → boot/guide.js} +32 -7
- package/dist/guest/{project-env.d.ts → boot/project-env.d.ts} +3 -3
- package/dist/guest/{project-env.js → boot/project-env.js} +12 -4
- package/dist/guest/boot/project-status.d.ts +5 -0
- package/dist/guest/boot/project-status.js +28 -0
- package/dist/guest/daemon/daemon.d.ts +1 -0
- package/dist/guest/daemon/daemon.js +51 -0
- package/dist/guest/daemon/exec.js +18 -6
- package/dist/guest/daemon/{shutdown.js → idle-shutdown.js} +5 -4
- package/dist/guest/daemon/{project.d.ts → project-provisioner.d.ts} +3 -3
- package/dist/guest/daemon/{project.js → project-provisioner.js} +60 -22
- package/dist/guest/daemon/relays.js +5 -3
- package/dist/guest/daemon/{session.js → sessions.js} +84 -24
- package/dist/guest/daemon/state.d.ts +4 -1
- package/dist/guest/daemon/state.js +34 -20
- package/dist/guest/databases/database-server.d.ts +13 -0
- package/dist/guest/databases/database-server.js +35 -0
- package/dist/guest/databases/dynamodb.d.ts +12 -0
- package/dist/guest/databases/dynamodb.js +81 -0
- package/dist/guest/databases/index.d.ts +2 -0
- package/dist/guest/databases/index.js +2 -0
- package/dist/guest/databases/mongodb.d.ts +7 -0
- package/dist/guest/databases/mongodb.js +46 -0
- package/dist/guest/databases/mysql.d.ts +7 -0
- package/dist/guest/databases/mysql.js +59 -0
- package/dist/guest/databases/names.d.ts +5 -0
- package/dist/guest/databases/names.js +8 -0
- package/dist/guest/databases/postgres.d.ts +9 -0
- package/dist/guest/databases/postgres.js +85 -0
- package/dist/guest/databases/redis.d.ts +7 -0
- package/dist/guest/databases/redis.js +25 -0
- package/dist/guest/databases/registry.d.ts +5 -0
- package/dist/guest/databases/registry.js +51 -0
- package/dist/guest/databases/sbx-db.d.ts +1 -0
- package/dist/guest/{db.js → databases/sbx-db.js} +13 -13
- package/dist/guest/{toolchains/databases → databases}/server.d.ts +5 -5
- package/dist/guest/{toolchains/databases → databases}/server.js +18 -13
- package/dist/guest/entries/daemon.js +16 -0
- package/dist/guest/entries/db.js +10 -0
- package/dist/guest/entries/gitguard.js +20 -0
- package/dist/guest/entries/main.d.ts +1 -0
- package/dist/guest/entries/main.js +24 -0
- package/dist/guest/entries/netproxy.d.ts +1 -0
- package/dist/guest/entries/netproxy.js +7 -0
- package/dist/guest/entries/view.d.ts +1 -0
- package/dist/guest/entries/view.js +11 -0
- package/dist/guest/{gitguard.js → git/decision.js} +49 -26
- package/dist/guest/network/addresses.d.ts +2 -0
- package/dist/guest/network/addresses.js +6 -0
- package/dist/guest/{setup/network.d.ts → network/allow-only.d.ts} +0 -10
- package/dist/guest/network/allow-only.js +84 -0
- package/dist/guest/network/firewall.d.ts +9 -0
- package/dist/guest/{setup/network.js → network/firewall.js} +58 -63
- package/dist/guest/network/proxy-server.d.ts +2 -0
- package/dist/guest/{netproxy.js → network/proxy-server.js} +37 -18
- package/dist/guest/{helpers.d.ts → runtime/csc.d.ts} +1 -1
- package/dist/guest/{helpers.js → runtime/csc.js} +7 -2
- package/dist/guest/runtime/fs.d.ts +2 -0
- package/dist/guest/runtime/fs.js +6 -0
- package/dist/guest/runtime/log.d.ts +3 -0
- package/dist/guest/runtime/log.js +22 -0
- package/dist/guest/runtime/paths.d.ts +13 -0
- package/dist/guest/runtime/paths.js +14 -0
- package/dist/guest/{ports.js → runtime/ports.js} +8 -2
- package/dist/guest/runtime/process.d.ts +15 -0
- package/dist/guest/runtime/process.js +59 -0
- package/dist/guest/{project-context.js → runtime/project-context.js} +1 -1
- package/dist/guest/runtime/session.d.ts +5 -0
- package/dist/guest/runtime/session.js +10 -0
- package/dist/guest/runtime/status.d.ts +7 -0
- package/dist/guest/runtime/status.js +57 -0
- package/dist/guest/{cmdline.js → sessions/cmdline.js} +10 -4
- package/dist/guest/{ptyhost.js → sessions/pty-host.js} +12 -5
- package/dist/guest/{view.js → sessions/viewer.js} +8 -11
- package/dist/guest/setup/claude-mem.d.ts +10 -0
- package/dist/guest/setup/{claude.js → claude-mem.js} +18 -78
- package/dist/guest/setup/{claude.d.ts → claude-profile.d.ts} +0 -10
- package/dist/guest/setup/claude-profile.js +89 -0
- package/dist/guest/setup/desktop.d.ts +2 -0
- package/dist/guest/setup/desktop.js +32 -0
- package/dist/guest/setup/environment.js +28 -5
- package/dist/guest/setup/{user.d.ts → git-identity.d.ts} +0 -2
- package/dist/guest/setup/git-identity.js +34 -0
- package/dist/guest/{gitrules.d.ts → setup/git-rules.d.ts} +1 -1
- package/dist/guest/setup/git-rules.js +50 -0
- package/dist/guest/setup/hooks.js +22 -5
- package/dist/guest/setup/{policy.js → managed-policy.js} +2 -2
- package/dist/guest/toolchains/catalogue.d.ts +4 -4
- package/dist/guest/toolchains/catalogue.js +30 -7
- package/dist/guest/toolchains/detect.d.ts +12 -0
- package/dist/guest/toolchains/detect.js +54 -0
- package/dist/guest/toolchains/index.d.ts +3 -17
- package/dist/guest/toolchains/index.js +1 -80
- package/dist/guest/toolchains/install.d.ts +20 -0
- package/dist/guest/toolchains/install.js +29 -0
- package/dist/guest/toolchains/languages/go.d.ts +3 -0
- package/dist/guest/toolchains/{go.js → languages/go.js} +27 -9
- package/dist/guest/toolchains/languages/java.d.ts +8 -0
- package/dist/guest/toolchains/{java.js → languages/java.js} +57 -18
- package/dist/guest/toolchains/languages/node.d.ts +3 -0
- package/dist/guest/toolchains/{node.js → languages/node.js} +51 -18
- package/dist/guest/toolchains/languages/php.d.ts +3 -0
- package/dist/guest/toolchains/{scripting → languages}/php.js +36 -11
- package/dist/guest/toolchains/languages/python-tools.d.ts +3 -0
- package/dist/guest/toolchains/languages/python-tools.js +12 -0
- package/dist/guest/toolchains/languages/python.d.ts +3 -0
- package/dist/guest/toolchains/{python.js → languages/python.js} +29 -16
- package/dist/guest/toolchains/languages/ruby.d.ts +3 -0
- package/dist/guest/toolchains/{scripting → languages}/ruby.js +28 -10
- package/dist/guest/toolchains/leftovers.d.ts +1 -1
- package/dist/guest/toolchains/leftovers.js +13 -11
- package/dist/guest/toolchains/managers.d.ts +6 -6
- package/dist/guest/toolchains/managers.js +38 -17
- package/dist/guest/toolchains/native/binstall.d.ts +3 -2
- package/dist/guest/toolchains/native/binstall.js +20 -8
- package/dist/guest/toolchains/native/cpp.d.ts +2 -2
- package/dist/guest/toolchains/native/cpp.js +23 -8
- package/dist/guest/toolchains/native/dotnet.d.ts +5 -3
- package/dist/guest/toolchains/native/dotnet.js +72 -24
- package/dist/guest/toolchains/native/mesa.d.ts +2 -2
- package/dist/guest/toolchains/native/mesa.js +27 -10
- package/dist/guest/toolchains/native/msvc/environment.d.ts +4 -4
- package/dist/guest/toolchains/native/msvc/environment.js +30 -16
- package/dist/guest/toolchains/native/msvc/index.d.ts +3 -3
- package/dist/guest/toolchains/native/msvc/index.js +10 -8
- package/dist/guest/toolchains/native/msvc/packages.d.ts +1 -1
- package/dist/guest/toolchains/native/msvc/packages.js +69 -23
- package/dist/guest/toolchains/native/msvc/tree.d.ts +6 -6
- package/dist/guest/toolchains/native/msvc/tree.js +15 -9
- package/dist/guest/toolchains/native/rust-extras.d.ts +23 -0
- package/dist/guest/toolchains/native/rust-extras.js +100 -0
- package/dist/guest/toolchains/native/rust.d.ts +2 -2
- package/dist/guest/toolchains/native/rust.js +41 -10
- package/dist/guest/toolchains/{scripting → native}/vcruntime.d.ts +2 -2
- package/dist/guest/toolchains/{scripting → native}/vcruntime.js +17 -7
- package/dist/guest/toolchains/package-ledger.d.ts +17 -0
- package/dist/guest/toolchains/package-ledger.js +54 -0
- package/dist/guest/toolchains/plan.d.ts +3 -24
- package/dist/guest/toolchains/plan.js +99 -111
- package/dist/guest/toolchains/runtimes.d.ts +6 -6
- package/dist/guest/toolchains/runtimes.js +31 -13
- package/dist/guest/toolchains/scheduler.d.ts +22 -0
- package/dist/guest/toolchains/scheduler.js +123 -0
- package/dist/guest/toolchains/setup.d.ts +10 -0
- package/dist/guest/toolchains/setup.js +22 -0
- package/dist/guest/toolchains/state-file.d.ts +3 -0
- package/dist/guest/toolchains/state-file.js +10 -0
- package/dist/guest/toolchains/step.d.ts +24 -0
- package/dist/guest/toolchains/step.js +1 -0
- package/dist/guest/toolchains/tool-env.d.ts +12 -0
- package/dist/guest/toolchains/tool-env.js +16 -0
- package/dist/guest/toolchains/tools/cli.d.ts +10 -0
- package/dist/guest/toolchains/{cli.js → tools/cli.js} +35 -15
- package/dist/guest/toolchains/tools/git.d.ts +3 -0
- package/dist/guest/toolchains/{git.js → tools/git.js} +38 -15
- package/dist/guest/toolchains/tools/pwsh.d.ts +4 -0
- package/dist/guest/toolchains/{pwsh.js → tools/pwsh.js} +14 -7
- package/dist/guest/toolchains/{vscode-profile.d.ts → tools/vscode-profile.d.ts} +6 -6
- package/dist/guest/toolchains/{vscode-profile.js → tools/vscode-profile.js} +28 -12
- package/dist/guest/toolchains/{vscode.d.ts → tools/vscode.d.ts} +6 -6
- package/dist/guest/toolchains/{vscode.js → tools/vscode.js} +67 -21
- package/dist/guest/toolchains/version-cache.d.ts +16 -0
- package/dist/guest/toolchains/version-cache.js +67 -0
- package/dist/host/agent-commands/commands.d.ts +13 -0
- package/dist/host/agent-commands/commands.js +33 -0
- package/dist/host/agent-commands/forwarders.d.ts +7 -0
- package/dist/host/agent-commands/forwarders.js +31 -0
- package/dist/host/agent-commands/index.d.ts +4 -0
- package/dist/host/agent-commands/index.js +4 -0
- package/dist/host/agent-commands/reconcile.d.ts +12 -0
- package/dist/host/agent-commands/reconcile.js +69 -0
- package/dist/host/agent-commands/user-path.d.ts +2 -0
- package/dist/host/agent-commands/user-path.js +33 -0
- package/dist/host/audit/collect.d.ts +2 -2
- package/dist/host/audit/collect.js +59 -22
- package/dist/host/audit/log.d.ts +2 -2
- package/dist/host/audit/log.js +24 -8
- package/dist/host/{attach.d.ts → channel/attach.d.ts} +2 -2
- package/dist/host/{attach.js → channel/attach.js} +33 -15
- package/dist/host/channel/channel.d.ts +51 -0
- package/dist/host/channel/channel.js +196 -0
- package/dist/host/channel/index.d.ts +2 -0
- package/dist/host/channel/index.js +2 -0
- package/dist/host/guard/agent-files.d.ts +7 -0
- package/dist/host/guard/agent-files.js +103 -0
- package/dist/host/guard/commands.d.ts +10 -0
- package/dist/host/guard/commands.js +123 -0
- package/dist/host/guard/file-hash.d.ts +4 -0
- package/dist/host/guard/file-hash.js +37 -0
- package/dist/host/guard/git-config.d.ts +5 -0
- package/dist/host/guard/git-config.js +62 -0
- package/dist/host/guard/git-dirs.d.ts +12 -0
- package/dist/host/guard/git-dirs.js +53 -0
- package/dist/host/guard/index.d.ts +5 -0
- package/dist/host/guard/index.js +4 -0
- package/dist/host/guard/mark-of-the-web.d.ts +8 -0
- package/dist/host/guard/mark-of-the-web.js +74 -0
- package/dist/host/guard/nested-repos.d.ts +14 -0
- package/dist/host/guard/nested-repos.js +88 -0
- package/dist/host/guard/quarantine.d.ts +3 -0
- package/dist/host/guard/quarantine.js +24 -0
- package/dist/host/guard/repo-guard.d.ts +10 -0
- package/dist/host/guard/repo-guard.js +36 -0
- package/dist/host/guard/store.d.ts +40 -0
- package/dist/host/guard/store.js +145 -0
- package/dist/host/guard/types.d.ts +27 -0
- package/dist/host/guard/types.js +3 -0
- package/dist/host/guard/watch-state.d.ts +9 -0
- package/dist/host/guard/watch-state.js +26 -0
- package/dist/host/launch/boot-projects.d.ts +17 -0
- package/dist/host/launch/{projects.js → boot-projects.js} +27 -12
- package/dist/host/{database-plan.d.ts → launch/database-plan.d.ts} +5 -5
- package/dist/host/{database-plan.js → launch/database-plan.js} +24 -13
- package/dist/host/launch/generate.d.ts +4 -0
- package/dist/host/launch/generate.js +77 -0
- package/dist/host/launch/index.d.ts +10 -0
- package/dist/host/launch/index.js +10 -0
- package/dist/host/launch/mappings.d.ts +7 -2
- package/dist/host/launch/mappings.js +83 -24
- package/dist/host/launch/pc-scan.d.ts +5 -0
- package/dist/host/{pc-scan.js → launch/pc-scan.js} +20 -13
- package/dist/host/launch/project-scan.d.ts +7 -0
- package/dist/host/{project-scan.js → launch/project-scan.js} +29 -21
- package/dist/host/launch/session-file.d.ts +23 -0
- package/dist/host/launch/session-file.js +73 -0
- package/dist/host/launch/stage.d.ts +5 -5
- package/dist/host/launch/stage.js +14 -13
- package/dist/host/launch/toolchains.d.ts +4 -0
- package/dist/host/launch/toolchains.js +11 -0
- package/dist/host/launch/{wsb.d.ts → wsb-file.d.ts} +4 -2
- package/dist/host/launch/wsb-file.js +56 -0
- package/dist/host/life/crash-report.d.ts +8 -0
- package/dist/host/life/crash-report.js +87 -0
- package/dist/host/life/index.d.ts +6 -0
- package/dist/host/life/index.js +6 -0
- package/dist/host/life/keep-awake.d.ts +10 -0
- package/dist/host/life/keep-awake.js +29 -0
- package/dist/host/life/life-record.d.ts +48 -0
- package/dist/host/life/life-record.js +76 -0
- package/dist/host/life/stop-events.d.ts +27 -0
- package/dist/host/life/stop-events.js +96 -0
- package/dist/host/life/stop-warning.d.ts +4 -0
- package/dist/host/life/stop-warning.js +25 -0
- package/dist/host/life/windows-update.d.ts +3 -0
- package/dist/host/life/windows-update.js +11 -0
- package/dist/host/native.d.ts +4 -0
- package/dist/host/native.js +11 -0
- package/dist/host/network/index.d.ts +1 -0
- package/dist/host/network/index.js +1 -0
- package/dist/host/{port-forward.d.ts → network/port-forward.d.ts} +1 -1
- package/dist/host/{port-forward.js → network/port-forward.js} +16 -10
- package/dist/host/profile/accounts.d.ts +37 -0
- package/dist/host/profile/accounts.js +146 -0
- package/dist/host/profile/claude-login.d.ts +22 -0
- package/dist/host/profile/claude-login.js +57 -0
- package/dist/host/{claude-profile.d.ts → profile/claude-profile.d.ts} +9 -9
- package/dist/host/{claude-profile.js → profile/claude-profile.js} +32 -22
- package/dist/host/profile/index.d.ts +7 -0
- package/dist/host/profile/index.js +7 -0
- package/dist/host/profile/personalize.d.ts +2 -0
- package/dist/host/profile/personalize.js +127 -0
- package/dist/host/profile/reg-file.d.ts +8 -0
- package/dist/host/profile/reg-file.js +45 -0
- package/dist/host/profile/secret-files.d.ts +2 -0
- package/dist/host/profile/secret-files.js +25 -0
- package/dist/host/profile/secret-patterns.d.ts +6 -0
- package/dist/host/profile/secret-patterns.js +128 -0
- package/dist/host/profile/secrets.d.ts +12 -0
- package/dist/host/profile/secrets.js +100 -0
- package/dist/host/projects/index.d.ts +4 -0
- package/dist/host/projects/index.js +4 -0
- package/dist/host/projects/join.d.ts +38 -0
- package/dist/host/projects/join.js +119 -0
- package/dist/host/projects/known.d.ts +28 -0
- package/dist/host/projects/known.js +55 -0
- package/dist/host/projects/mapper.d.ts +29 -0
- package/dist/host/projects/mapper.js +88 -0
- package/dist/host/projects/registry.d.ts +83 -0
- package/dist/host/projects/registry.js +136 -0
- package/dist/host/sandbox/doctor.d.ts +2 -0
- package/dist/host/sandbox/doctor.js +42 -0
- package/dist/host/sandbox/host-claude.d.ts +1 -0
- package/dist/host/sandbox/host-claude.js +26 -0
- package/dist/host/sandbox/index.d.ts +6 -0
- package/dist/host/sandbox/index.js +6 -0
- package/dist/host/{platform.d.ts → sandbox/platform.d.ts} +0 -5
- package/dist/host/sandbox/platform.js +60 -0
- package/dist/host/sandbox/probe.d.ts +3 -0
- package/dist/host/sandbox/probe.js +47 -0
- package/dist/host/{window.js → sandbox/window.js} +7 -5
- package/dist/host/{wsb.js → sandbox/wsb-cli.js} +31 -8
- package/dist/host/{cleanup.js → storage/cleanup.js} +27 -12
- package/dist/host/storage/index.d.ts +2 -0
- package/dist/host/storage/index.js +2 -0
- package/dist/host/storage/state-files.d.ts +4 -0
- package/dist/host/storage/state-files.js +10 -0
- package/dist/host/test-guard.js +1 -1
- package/dist/host/tools/conpty.d.ts +8 -0
- package/dist/host/tools/conpty.js +58 -0
- package/dist/host/tools/index.d.ts +2 -0
- package/dist/host/tools/index.js +2 -0
- package/dist/host/{terminal.d.ts → tools/windows-terminal.d.ts} +2 -10
- package/dist/host/{terminal.js → tools/windows-terminal.js} +33 -57
- package/dist/host/workspace-view/active-views.d.ts +3 -0
- package/dist/host/workspace-view/active-views.js +22 -0
- package/dist/host/workspace-view/index.d.ts +2 -18
- package/dist/host/workspace-view/index.js +2 -49
- package/dist/host/workspace-view/plan.d.ts +16 -0
- package/dist/host/workspace-view/plan.js +50 -0
- package/dist/host/workspace-view/rules.js +10 -3
- package/dist/host/workspace-view/view-state.d.ts +10 -0
- package/dist/host/workspace-view/view-state.js +31 -0
- package/dist/host/workspace-view/view.d.ts +1 -0
- package/dist/host/workspace-view/view.js +51 -55
- package/dist/runtime/daemon.js +4232 -1918
- package/dist/runtime/db.js +2145 -830
- package/dist/runtime/gitguard.js +29 -11
- package/dist/runtime/main.js +4760 -2155
- package/dist/runtime/netproxy.js +1654 -418
- package/dist/runtime/view.js +1515 -453
- package/dist/selftest/accounts.test.d.ts +1 -1
- package/dist/selftest/accounts.test.js +20 -17
- package/dist/selftest/agent-commands.test.d.ts +1 -1
- package/dist/selftest/agent-commands.test.js +9 -5
- package/dist/selftest/audit.test.d.ts +1 -1
- package/dist/selftest/audit.test.js +46 -13
- package/dist/selftest/channel.test.d.ts +1 -1
- package/dist/selftest/channel.test.js +91 -8
- package/dist/selftest/cli.test.d.ts +1 -1
- package/dist/selftest/cli.test.js +68 -16
- package/dist/selftest/cmdline.test.d.ts +1 -1
- package/dist/selftest/cmdline.test.js +36 -7
- package/dist/selftest/config.test.d.ts +1 -1
- package/dist/selftest/config.test.js +12 -5
- package/dist/selftest/data.test.d.ts +1 -1
- package/dist/selftest/data.test.js +35 -6
- package/dist/selftest/detect.test.d.ts +1 -1
- package/dist/selftest/detect.test.js +22 -9
- package/dist/selftest/generate.test.d.ts +1 -1
- package/dist/selftest/generate.test.js +33 -9
- package/dist/selftest/git-access.test.d.ts +1 -1
- package/dist/selftest/git-access.test.js +42 -4
- package/dist/selftest/guest-boot.test.d.ts +1 -1
- package/dist/selftest/guest-boot.test.js +25 -7
- package/dist/selftest/host-sim.test.d.ts +1 -1
- package/dist/selftest/host-sim.test.js +27 -3
- package/dist/selftest/hostile-input.test.d.ts +1 -1
- package/dist/selftest/hostile-input.test.js +5 -5
- package/dist/selftest/index.d.ts +1 -1
- package/dist/selftest/index.js +73 -16
- package/dist/selftest/layout.test.d.ts +2 -0
- package/dist/selftest/layout.test.js +131 -0
- package/dist/selftest/links.test.d.ts +1 -1
- package/dist/selftest/links.test.js +16 -11
- package/dist/selftest/live-daemon.test.d.ts +1 -1
- package/dist/selftest/live-daemon.test.js +20 -8
- package/dist/selftest/live-git.test.d.ts +1 -1
- package/dist/selftest/live-git.test.js +13 -4
- package/dist/selftest/live-network.test.d.ts +1 -1
- package/dist/selftest/live-network.test.js +24 -9
- package/dist/selftest/live-projects.test.d.ts +1 -1
- package/dist/selftest/live-projects.test.js +47 -20
- package/dist/selftest/live-terminal.test.d.ts +2 -0
- package/dist/selftest/live-terminal.test.js +195 -0
- package/dist/selftest/local-config.test.d.ts +1 -1
- package/dist/selftest/local-config.test.js +88 -15
- package/dist/selftest/mirror.test.d.ts +1 -1
- package/dist/selftest/mirror.test.js +118 -19
- package/dist/selftest/network.test.d.ts +1 -1
- package/dist/selftest/network.test.js +17 -8
- package/dist/selftest/personalization.test.d.ts +1 -1
- package/dist/selftest/personalization.test.js +12 -5
- package/dist/selftest/projects.test.d.ts +1 -1
- package/dist/selftest/projects.test.js +336 -72
- package/dist/selftest/repair.test.d.ts +1 -1
- package/dist/selftest/repair.test.js +17 -5
- package/dist/selftest/repo-guard.test.d.ts +1 -1
- package/dist/selftest/repo-guard.test.js +21 -20
- package/dist/selftest/secrets.test.d.ts +1 -1
- package/dist/selftest/secrets.test.js +57 -13
- package/dist/selftest/setup.test.d.ts +1 -1
- package/dist/selftest/setup.test.js +25 -5
- package/dist/selftest/{fixtures.d.ts → support/fixtures.d.ts} +7 -4
- package/dist/selftest/{fixtures.js → support/fixtures.js} +95 -17
- package/dist/selftest/{harness.js → support/harness.js} +24 -7
- package/dist/selftest/{live.d.ts → support/live.d.ts} +2 -2
- package/dist/selftest/{live.js → support/live.js} +34 -10
- package/dist/selftest/support/suite.js +1 -0
- package/dist/selftest/sync.test.d.ts +1 -1
- package/dist/selftest/sync.test.js +64 -26
- package/dist/selftest/test-guard.test.d.ts +1 -1
- package/dist/selftest/test-guard.test.js +43 -15
- package/dist/selftest/toolchains.test.d.ts +1 -1
- package/dist/selftest/toolchains.test.js +135 -36
- package/dist/selftest/workspace-view.test.d.ts +1 -1
- package/dist/selftest/workspace-view.test.js +48 -11
- package/dist/selftest/workspace.test.d.ts +1 -1
- package/dist/selftest/workspace.test.js +13 -4
- package/dist/shared/{apps.d.ts → apps/catalogue.d.ts} +1 -11
- package/dist/shared/apps/catalogue.js +768 -0
- package/dist/shared/apps/index.d.ts +2 -0
- package/dist/shared/apps/index.js +2 -0
- package/dist/shared/apps/selection.d.ts +11 -0
- package/dist/shared/apps/selection.js +40 -0
- package/dist/shared/channel/index.d.ts +2 -0
- package/dist/shared/channel/index.js +2 -0
- package/dist/shared/channel/run-dir.d.ts +30 -0
- package/dist/shared/channel/run-dir.js +84 -0
- package/dist/shared/{schema.d.ts → channel/schema.d.ts} +60 -19
- package/dist/shared/channel/schema.js +131 -0
- package/dist/shared/download/archive.d.ts +13 -0
- package/dist/shared/download/archive.js +57 -0
- package/dist/shared/download/downloader.d.ts +35 -0
- package/dist/shared/download/downloader.js +110 -0
- package/dist/shared/download/github.d.ts +16 -0
- package/dist/shared/download/github.js +74 -0
- package/dist/shared/download/http.d.ts +5 -0
- package/dist/shared/download/http.js +30 -0
- package/dist/shared/download/index.d.ts +5 -0
- package/dist/shared/download/index.js +5 -0
- package/dist/shared/download/spawn.d.ts +2 -0
- package/dist/shared/download/spawn.js +7 -0
- package/dist/shared/io/index.d.ts +3 -0
- package/dist/shared/io/index.js +3 -0
- package/dist/shared/io/json-file.d.ts +10 -0
- package/dist/shared/io/json-file.js +21 -0
- package/dist/shared/io/json.d.ts +13 -0
- package/dist/shared/io/json.js +49 -0
- package/dist/shared/{safe-remove.js → io/safe-remove.js} +32 -7
- package/dist/shared/{netrules.js → network/firewall-rules.js} +36 -5
- package/dist/shared/network/index.d.ts +2 -0
- package/dist/shared/network/index.js +2 -0
- package/dist/shared/{netpolicy.js → network/policy.js} +66 -11
- package/dist/shared/{paths.js → paths/claude-paths.js} +12 -2
- package/dist/shared/{guest-paths.d.ts → paths/guest-paths.d.ts} +21 -0
- package/dist/shared/paths/guest-paths.js +146 -0
- package/dist/shared/paths/index.d.ts +3 -0
- package/dist/shared/paths/index.js +3 -0
- package/dist/shared/{projects.d.ts → paths/projects.d.ts} +27 -4
- package/dist/shared/paths/projects.js +136 -0
- package/dist/shared/pty/client.d.ts +21 -0
- package/dist/shared/pty/client.js +79 -0
- package/dist/shared/pty/console-input.d.ts +11 -0
- package/dist/shared/pty/console-input.js +81 -0
- package/dist/shared/pty/index.d.ts +6 -0
- package/dist/shared/pty/index.js +6 -0
- package/dist/shared/pty/input-joiner.d.ts +15 -0
- package/dist/shared/pty/input-joiner.js +44 -0
- package/dist/shared/pty/output-filter.d.ts +13 -0
- package/dist/shared/pty/output-filter.js +140 -0
- package/dist/shared/pty/protocol.d.ts +36 -0
- package/dist/shared/pty/protocol.js +60 -0
- package/dist/shared/pty/terminal.d.ts +24 -0
- package/dist/shared/pty/terminal.js +147 -0
- package/dist/shared/test-guard.js +3 -1
- package/dist/sync/claude-mem.d.ts +1 -1
- package/dist/sync/claude-mem.js +9 -4
- package/dist/sync/history.d.ts +1 -29
- package/dist/sync/history.js +57 -45
- package/dist/sync/index.d.ts +5 -0
- package/dist/sync/index.js +5 -0
- package/dist/sync/sync-cycle.d.ts +18 -0
- package/dist/sync/sync-cycle.js +85 -0
- package/dist/sync/sync-state.d.ts +32 -0
- package/dist/sync/sync-state.js +37 -0
- package/dist/sync/watcher.d.ts +0 -18
- package/dist/sync/watcher.js +66 -100
- package/native/keep-awake.ps1 +8 -0
- package/native/power.cs +23 -0
- package/native/stop-events.ps1 +38 -0
- package/package.json +11 -3
- package/sandbox/linkgate.cs +98 -0
- package/sandbox/memlog.ps1 +15 -6
- package/sandbox/ptyhost.cs +60 -3
- package/schemas/config.schema.json +48 -1
- package/schemas/sandbox-config.schema.json +37 -3
- package/dist/cli/commands/launch.d.ts +0 -29
- package/dist/cli/commands/launch.js +0 -366
- package/dist/cli/commands/maintenance.d.ts +0 -10
- package/dist/cli/commands/maintenance.js +0 -187
- package/dist/cli/commands/project.d.ts +0 -29
- package/dist/cli/commands/project.js +0 -63
- package/dist/cli/commands/projects.d.ts +0 -14
- package/dist/cli/commands/projects.js +0 -146
- package/dist/cli/commands/restart.d.ts +0 -6
- package/dist/cli/commands/restart.js +0 -85
- package/dist/cli/commands/sessions.d.ts +0 -12
- package/dist/cli/commands/sessions.js +0 -257
- package/dist/cli/menu/settings/editors.js +0 -305
- package/dist/cli/progress.d.ts +0 -9
- package/dist/cli/progress.js +0 -49
- package/dist/cli/tui/dialogs.d.ts +0 -57
- package/dist/cli/tui/dialogs.js +0 -162
- package/dist/core/config.js +0 -109
- package/dist/core/schema.d.ts +0 -6
- package/dist/core/schema.js +0 -8
- package/dist/core/util.d.ts +0 -62
- package/dist/core/util.js +0 -156
- package/dist/core/workspace.d.ts +0 -18
- package/dist/core/workspace.js +0 -145
- package/dist/guest/boot-env.d.ts +0 -4
- package/dist/guest/daemon.js +0 -57
- package/dist/guest/env.d.ts +0 -52
- package/dist/guest/env.js +0 -103
- package/dist/guest/gitrules.js +0 -11
- package/dist/guest/project-status.d.ts +0 -5
- package/dist/guest/project-status.js +0 -17
- package/dist/guest/setup/user.js +0 -51
- package/dist/guest/toolchains/cli.d.ts +0 -10
- package/dist/guest/toolchains/common.d.ts +0 -54
- package/dist/guest/toolchains/common.js +0 -147
- package/dist/guest/toolchains/databases/dynamodb.d.ts +0 -8
- package/dist/guest/toolchains/databases/dynamodb.js +0 -52
- package/dist/guest/toolchains/databases/index.d.ts +0 -6
- package/dist/guest/toolchains/databases/index.js +0 -62
- package/dist/guest/toolchains/databases/mongodb.d.ts +0 -3
- package/dist/guest/toolchains/databases/mongodb.js +0 -31
- package/dist/guest/toolchains/databases/mysql.d.ts +0 -3
- package/dist/guest/toolchains/databases/mysql.js +0 -38
- package/dist/guest/toolchains/databases/postgres.d.ts +0 -5
- package/dist/guest/toolchains/databases/postgres.js +0 -38
- package/dist/guest/toolchains/databases/redis.d.ts +0 -3
- package/dist/guest/toolchains/databases/redis.js +0 -16
- package/dist/guest/toolchains/git.d.ts +0 -3
- package/dist/guest/toolchains/go.d.ts +0 -3
- package/dist/guest/toolchains/java.d.ts +0 -8
- package/dist/guest/toolchains/node.d.ts +0 -3
- package/dist/guest/toolchains/pwsh.d.ts +0 -4
- package/dist/guest/toolchains/python.d.ts +0 -3
- package/dist/guest/toolchains/scripting/php.d.ts +0 -3
- package/dist/guest/toolchains/scripting/ruby.d.ts +0 -3
- package/dist/host/accounts.d.ts +0 -32
- package/dist/host/accounts.js +0 -128
- package/dist/host/agent-commands.d.ts +0 -25
- package/dist/host/agent-commands.js +0 -145
- package/dist/host/channel.d.ts +0 -38
- package/dist/host/channel.js +0 -162
- package/dist/host/generate.d.ts +0 -13
- package/dist/host/generate.js +0 -108
- package/dist/host/join.d.ts +0 -28
- package/dist/host/join.js +0 -76
- package/dist/host/launch/projects.d.ts +0 -15
- package/dist/host/launch/wsb.js +0 -34
- package/dist/host/motw.d.ts +0 -17
- package/dist/host/motw.js +0 -74
- package/dist/host/pc-scan.d.ts +0 -6
- package/dist/host/personalize.d.ts +0 -10
- package/dist/host/personalize.js +0 -97
- package/dist/host/platform.js +0 -129
- package/dist/host/project-scan.d.ts +0 -7
- package/dist/host/projects.d.ts +0 -100
- package/dist/host/projects.js +0 -147
- package/dist/host/repo-guard.d.ts +0 -43
- package/dist/host/repo-guard.js +0 -347
- package/dist/host/secrets.d.ts +0 -14
- package/dist/host/secrets.js +0 -133
- package/dist/host/stops.d.ts +0 -67
- package/dist/host/stops.js +0 -126
- package/dist/shared/apps.js +0 -114
- package/dist/shared/download.d.ts +0 -60
- package/dist/shared/download.js +0 -215
- package/dist/shared/guest-paths.js +0 -61
- package/dist/shared/projects.js +0 -67
- package/dist/shared/pty-client.d.ts +0 -91
- package/dist/shared/pty-client.js +0 -349
- package/dist/shared/rundir.d.ts +0 -41
- package/dist/shared/rundir.js +0 -96
- package/dist/shared/schema.js +0 -92
- /package/dist/{guest/daemon.d.ts → cli/tui/list/list-types.js} +0 -0
- /package/dist/{guest/db.d.ts → cli/tui/screen.js} +0 -0
- /package/dist/core/{detect-databases.d.ts → detect/databases.d.ts} +0 -0
- /package/dist/{guest/toolchains → core/detect}/versions.d.ts +0 -0
- /package/dist/guest/{setup/agents.d.ts → agents/agent-installer.d.ts} +0 -0
- /package/dist/guest/{audit-parse.d.ts → audit/parse.d.ts} +0 -0
- /package/dist/guest/{guide.d.ts → boot/guide.d.ts} +0 -0
- /package/dist/guest/daemon/{shutdown.d.ts → idle-shutdown.d.ts} +0 -0
- /package/dist/guest/daemon/{session.d.ts → sessions.d.ts} +0 -0
- /package/dist/guest/{main.d.ts → entries/daemon.d.ts} +0 -0
- /package/dist/guest/{netproxy.d.ts → entries/db.d.ts} +0 -0
- /package/dist/{selftest/suite.js → guest/entries/gitguard.d.ts} +0 -0
- /package/dist/guest/{gitguard.d.ts → git/decision.d.ts} +0 -0
- /package/dist/guest/{ports.d.ts → runtime/ports.d.ts} +0 -0
- /package/dist/guest/{project-context.d.ts → runtime/project-context.d.ts} +0 -0
- /package/dist/guest/{cmdline.d.ts → sessions/cmdline.d.ts} +0 -0
- /package/dist/guest/{ptyhost.d.ts → sessions/pty-host.d.ts} +0 -0
- /package/dist/guest/{view.d.ts → sessions/viewer.d.ts} +0 -0
- /package/dist/guest/setup/{policy.d.ts → managed-policy.d.ts} +0 -0
- /package/dist/host/{window.d.ts → sandbox/window.d.ts} +0 -0
- /package/dist/host/{wsb.d.ts → sandbox/wsb-cli.d.ts} +0 -0
- /package/dist/host/{cleanup.d.ts → storage/cleanup.d.ts} +0 -0
- /package/dist/selftest/{harness.d.ts → support/harness.d.ts} +0 -0
- /package/dist/selftest/{suite.d.ts → support/suite.d.ts} +0 -0
- /package/dist/shared/{safe-remove.d.ts → io/safe-remove.d.ts} +0 -0
- /package/dist/shared/{netrules.d.ts → network/firewall-rules.d.ts} +0 -0
- /package/dist/shared/{netpolicy.d.ts → network/policy.d.ts} +0 -0
- /package/dist/shared/{paths.d.ts → paths/claude-paths.d.ts} +0 -0
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
// Which project of the running sandbox a command is run from. Every command that works on a running sandbox uses
|
|
2
|
-
// these, so they all agree: `locateHere` only looks (attach, sessions, status, restart), `joinHere` also makes the
|
|
3
|
-
// folder a project of the running sandbox when it can without a restart (launch, start, exec, db).
|
|
4
|
-
import path from 'node:path';
|
|
5
|
-
import { askYesNo } from '../../core/prompt.js';
|
|
6
|
-
import { isInsideOrEqual } from '../../core/util.js';
|
|
7
|
-
import { resolveRun } from '../../core/workspace.js';
|
|
8
|
-
import { prepareProject } from '../../host/channel.js';
|
|
9
|
-
import { projectHere, readRegistry } from '../../host/projects.js';
|
|
10
|
-
import { joinRunning } from '../../host/join.js';
|
|
11
|
-
import { working } from '../progress.js';
|
|
12
|
-
import { guestPathFor, sandboxAlive } from './context.js';
|
|
13
|
-
/** The folder the command is about: --workspace, else the current one. */
|
|
14
|
-
export const hereDir = (ctx) => path.resolve(ctx.options.workspace ?? process.cwd());
|
|
15
|
-
/** Where this folder is in the running sandbox, if it is in it at all (nothing is registered). */
|
|
16
|
-
export const locateHere = (ctx, status) => {
|
|
17
|
-
const dir = hereDir(ctx);
|
|
18
|
-
const here = projectHere(ctx.storageRoot, dir);
|
|
19
|
-
if (here)
|
|
20
|
-
return here;
|
|
21
|
-
// A sandbox started before projects existed: only its launch folder.
|
|
22
|
-
if (!readRegistry(ctx.storageRoot) && status && isInsideOrEqual(status.workspaceHost, dir))
|
|
23
|
-
return { project: null, guestDir: guestPathFor(dir, status.workspaceHost, status.guestWorkspace) };
|
|
24
|
-
return { project: null, guestDir: null };
|
|
25
|
-
};
|
|
26
|
-
/**
|
|
27
|
-
* Makes this folder a project of the running sandbox (nothing to do for the launch folder and projects already in
|
|
28
|
-
* it): its .sandbox-config.json is approved like at a launch, its protections are checked, and it is made visible.
|
|
29
|
-
* Throws NeedsRestart (host/projects.ts) when that is impossible without a restart.
|
|
30
|
-
*/
|
|
31
|
-
export const joinHere = async (ctx, status) => {
|
|
32
|
-
const { options, loaded, packageRoot, storageRoot, dataPath } = ctx;
|
|
33
|
-
const dir = hereDir(ctx);
|
|
34
|
-
// A sandbox started before projects existed: only its launch folder (guestPathFor explains why otherwise).
|
|
35
|
-
if (!readRegistry(storageRoot))
|
|
36
|
-
return { project: null, guestDir: guestPathFor(dir, status.workspaceHost, status.guestWorkspace), spec: null, harness: null, notes: [] };
|
|
37
|
-
const joined = await joinRunning({
|
|
38
|
-
storageRoot, dataPath, packageRoot, hostDir: dir, wsbShare: loaded.config.projects.wsbShare,
|
|
39
|
-
resolve: (root) => resolveRun({
|
|
40
|
-
packageRoot, loaded, cwd: root, workspace: root, harness: options.harness, noAgent: options.noAgent,
|
|
41
|
-
noLocalConfig: options.noLocalConfig, trustConfig: options.trustConfig, scripts: options.scripts, databases: options.databases,
|
|
42
|
-
nodeVersion: options.node, pythonVersion: options.python, ask: askYesNo,
|
|
43
|
-
}),
|
|
44
|
-
});
|
|
45
|
-
const harness = joined.run && joined.run.harnessName !== 'none' ? joined.run.harnessName : null;
|
|
46
|
-
return { project: joined.project, guestDir: joined.guestDir, spec: joined.spec, harness, notes: joined.notes };
|
|
47
|
-
};
|
|
48
|
-
/** Waits until the sandbox has set a project up, with its progress on a spinner (plain lines without a terminal). */
|
|
49
|
-
export const provisionJoined = async (ctx, joined) => {
|
|
50
|
-
if (!joined.spec)
|
|
51
|
-
return;
|
|
52
|
-
const spec = joined.spec;
|
|
53
|
-
let step = 'starting';
|
|
54
|
-
await working(() => 'Setting up ' + spec.name + ' in the running sandbox: ' + step, () => prepareProject(ctx.dataPath, spec, sandboxAlive, (m) => { step = m; }));
|
|
55
|
-
};
|
|
56
|
-
/** joinHere, then (for another project) waits until the sandbox has set it up. */
|
|
57
|
-
export const readyHere = async (ctx, status) => {
|
|
58
|
-
const joined = await joinHere(ctx, status);
|
|
59
|
-
for (const note of joined.notes)
|
|
60
|
-
console.log(note);
|
|
61
|
-
await provisionJoined(ctx, joined);
|
|
62
|
-
return joined;
|
|
63
|
-
};
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { type Context } from './context.js';
|
|
2
|
-
interface Row {
|
|
3
|
-
folder: string;
|
|
4
|
-
here: boolean;
|
|
5
|
-
known: boolean;
|
|
6
|
-
root: string | null;
|
|
7
|
-
excluded: boolean;
|
|
8
|
-
mappedAtStart: boolean;
|
|
9
|
-
running: string | null;
|
|
10
|
-
}
|
|
11
|
-
/** Every project worth listing: known ones, the running sandbox's, and this folder. */
|
|
12
|
-
export declare const projectRows: (ctx: Context) => Row[];
|
|
13
|
-
export declare const projects: (ctx: Context) => Promise<number>;
|
|
14
|
-
export {};
|
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
// `sandbox projects`: which projects a sandbox can open without a restart. Project roots (whole folders of projects),
|
|
2
|
-
// the projects this tool has started before, and projects.all / projects.exclude. Changes to what is mapped take
|
|
3
|
-
// effect at the next start; a project you start while a sandbox runs joins it when it can (projects.ts in host/).
|
|
4
|
-
import path from 'node:path';
|
|
5
|
-
import { checkbox } from '@inquirer/prompts';
|
|
6
|
-
import { assertSafeMapping, assertSafeWorkspace } from '../../core/safe-paths.js';
|
|
7
|
-
import { dirExists, expandPath, fail, isRootPath } from '../../core/util.js';
|
|
8
|
-
import { isSandboxRunning } from '../../host/platform.js';
|
|
9
|
-
import { forgetProject, projectMapper, readKnown, readRegistry, rememberProject } from '../../host/projects.js';
|
|
10
|
-
import { isWithin } from '../../shared/projects.js';
|
|
11
|
-
import { c, pageSizeFor, shortenMiddle, termWidth } from '../colors.js';
|
|
12
|
-
import { printJson, table } from './context.js';
|
|
13
|
-
import { hereDir } from './project.js';
|
|
14
|
-
import { addToList, removeFromList, setSetting } from './user-config.js';
|
|
15
|
-
const settings = (ctx) => {
|
|
16
|
-
const p = ctx.loaded.config.projects;
|
|
17
|
-
const expand = (list) => list.map((x) => expandPath(x, ctx.loaded.base));
|
|
18
|
-
return { all: p.all, roots: expand(p.roots), exclude: expand(p.exclude) };
|
|
19
|
-
};
|
|
20
|
-
/** Every project worth listing: known ones, the running sandbox's, and this folder. */
|
|
21
|
-
export const projectRows = (ctx) => {
|
|
22
|
-
const s = settings(ctx);
|
|
23
|
-
const registry = isSandboxRunning() ? readRegistry(ctx.storageRoot) : null;
|
|
24
|
-
const here = hereDir(ctx);
|
|
25
|
-
const folders = [...readKnown(ctx.storageRoot).map((k) => k.host), ...(registry?.projects.map((p) => p.host) ?? [])];
|
|
26
|
-
const unique = folders.filter((f, i) => folders.findIndex((g) => g.toLowerCase() === f.toLowerCase()) === i);
|
|
27
|
-
return unique.map((folder) => {
|
|
28
|
-
const root = s.roots.find((r) => isWithin(r, folder)) ?? null;
|
|
29
|
-
const excluded = s.exclude.some((e) => isWithin(e, folder));
|
|
30
|
-
const inSandbox = registry?.projects.find((p) => p.host.toLowerCase() === folder.toLowerCase());
|
|
31
|
-
return {
|
|
32
|
-
folder, here: isWithin(folder, here), known: readKnown(ctx.storageRoot).some((k) => k.host.toLowerCase() === folder.toLowerCase()), root, excluded,
|
|
33
|
-
mappedAtStart: root !== null || (s.all && !excluded && dirExists(folder)), running: inSandbox ? inSandbox.name + ' (' + inSandbox.mechanism + ')' : null,
|
|
34
|
-
};
|
|
35
|
-
});
|
|
36
|
-
};
|
|
37
|
-
const NEXT_START = 'This changes what is mapped from the next start.';
|
|
38
|
-
const runningNote = () => (isSandboxRunning() ? ' The running sandbox keeps what it has; start a project in it (sandbox claude there) and it joins without a restart when it can, or you are offered one.' : '');
|
|
39
|
-
/** A folder for roots: it holds projects, so it must pass the same checks as a workspace and must not be a drive. */
|
|
40
|
-
const checkFolder = (ctx, folder, what) => {
|
|
41
|
-
const dir = path.resolve(folder);
|
|
42
|
-
if (!dirExists(dir))
|
|
43
|
-
fail('The folder ' + dir + ' does not exist.', 'Check the path.');
|
|
44
|
-
if (isRootPath(dir))
|
|
45
|
-
fail('A whole drive cannot be ' + what + ': ' + dir, 'Use the folder that holds your projects, e.g. F:\\Code.');
|
|
46
|
-
assertSafeWorkspace(dir, ctx.packageRoot, ctx.storageRoot);
|
|
47
|
-
assertSafeMapping(dir, ctx.packageRoot, ctx.storageRoot);
|
|
48
|
-
return dir;
|
|
49
|
-
};
|
|
50
|
-
const list = (ctx) => {
|
|
51
|
-
const rows = projectRows(ctx);
|
|
52
|
-
const s = settings(ctx);
|
|
53
|
-
if (printJson(ctx, { all: s.all, roots: s.roots, exclude: s.exclude, projects: rows }))
|
|
54
|
-
return 0;
|
|
55
|
-
console.log(c.bold('projects.all') + ': ' + (s.all ? 'on (every project below is mapped at every start, except excluded ones)' : 'off') + c.dim(' sandbox projects all on|off'));
|
|
56
|
-
console.log(c.bold('Roots') + ': ' + (s.roots.length ? s.roots.join(', ') : c.dim('none (sandbox projects roots add <folder>)')));
|
|
57
|
-
if (!rows.length) {
|
|
58
|
-
console.log('No projects yet: start one with sandbox claude in its folder.');
|
|
59
|
-
return 0;
|
|
60
|
-
}
|
|
61
|
-
const width = Math.max(20, termWidth() - 46);
|
|
62
|
-
table([['', 'FOLDER', 'AT START', 'RUNNING SANDBOX'], ...rows.map((r) => [
|
|
63
|
-
r.here ? '*' : '', shortenMiddle(r.folder, width), r.root ? 'root' : r.excluded ? 'excluded' : r.mappedAtStart ? 'mapped' : '-', r.running ?? '-',
|
|
64
|
-
])]);
|
|
65
|
-
console.log(c.dim('* = this folder. Choose with: sandbox projects choose'));
|
|
66
|
-
return 0;
|
|
67
|
-
};
|
|
68
|
-
/** Ticks the projects mapped at every start (turns projects.all on when any is ticked); the rest are excluded. */
|
|
69
|
-
const choose = async (ctx) => {
|
|
70
|
-
const rows = projectRows(ctx).filter((r) => !r.root);
|
|
71
|
-
if (!rows.length) {
|
|
72
|
-
console.log('No projects to choose from yet (projects in a root are always mapped with it). Start one with sandbox claude in its folder.');
|
|
73
|
-
return 0;
|
|
74
|
-
}
|
|
75
|
-
if (!process.stdin.isTTY)
|
|
76
|
-
fail('sandbox projects choose needs an interactive terminal.', 'Use sandbox projects include|exclude <folder> instead.');
|
|
77
|
-
const s = settings(ctx);
|
|
78
|
-
const picked = await checkbox({
|
|
79
|
-
message: 'Projects mapped at every start, so they open without a restart (every agent in the sandbox can see them):',
|
|
80
|
-
pageSize: pageSizeFor(rows.length),
|
|
81
|
-
choices: rows.map((r) => ({ value: r.folder, name: shortenMiddle(r.folder, termWidth() - 12) + (r.here ? c.dim(' (this folder)') : ''), checked: s.all && !r.excluded })),
|
|
82
|
-
});
|
|
83
|
-
const exclude = rows.filter((r) => !picked.includes(r.folder)).map((r) => r.folder);
|
|
84
|
-
setSetting(ctx, ['projects', 'exclude'], [...s.exclude.filter((e) => !rows.some((r) => r.folder.toLowerCase() === e.toLowerCase())), ...exclude]);
|
|
85
|
-
setSetting(ctx, ['projects', 'all'], picked.length > 0);
|
|
86
|
-
console.log(picked.length + ' project(s) mapped at every start, ' + exclude.length + ' excluded. ' + NEXT_START + runningNote());
|
|
87
|
-
return 0;
|
|
88
|
-
};
|
|
89
|
-
export const projects = async (ctx) => {
|
|
90
|
-
const [action = 'list', value, folder] = ctx.options.positionals;
|
|
91
|
-
switch (action) {
|
|
92
|
-
case 'list': return list(ctx);
|
|
93
|
-
case 'choose': return choose(ctx);
|
|
94
|
-
case 'add': {
|
|
95
|
-
const dir = checkFolder(ctx, value, 'a project');
|
|
96
|
-
rememberProject(ctx.storageRoot, dir);
|
|
97
|
-
console.log('Added ' + dir + ' to your projects.' + (settings(ctx).all ? ' ' + NEXT_START : ' It is mapped at every start once projects.all is on (sandbox projects all on).'));
|
|
98
|
-
return 0;
|
|
99
|
-
}
|
|
100
|
-
case 'remove': {
|
|
101
|
-
const dir = path.resolve(value);
|
|
102
|
-
const forgot = forgetProject(ctx.storageRoot, dir);
|
|
103
|
-
// The running sandbox forgets it too (its folder stays visible until the sandbox stops, if it was mapped).
|
|
104
|
-
const registered = isSandboxRunning() ? readRegistry(ctx.storageRoot)?.projects.find((p) => !p.primary && p.host.toLowerCase() === dir.toLowerCase()) : undefined;
|
|
105
|
-
if (registered)
|
|
106
|
-
projectMapper({ storageRoot: ctx.storageRoot, packageRoot: ctx.packageRoot, wsbShare: false }).unregister(registered.name);
|
|
107
|
-
console.log(forgot || registered ? 'Removed ' + dir + ' from your projects (nothing in the folder was touched).' : dir + ' was not in your projects.');
|
|
108
|
-
return 0;
|
|
109
|
-
}
|
|
110
|
-
case 'include':
|
|
111
|
-
case 'exclude': {
|
|
112
|
-
const dir = path.resolve(value);
|
|
113
|
-
const changed = action === 'exclude' ? addToList(ctx, ['projects', 'exclude'], dir) : removeFromList(ctx, ['projects', 'exclude'], dir);
|
|
114
|
-
if (action === 'include')
|
|
115
|
-
rememberProject(ctx.storageRoot, dir);
|
|
116
|
-
console.log((changed ? (action === 'exclude' ? 'Excluded ' : 'Included ') + dir + '. ' + NEXT_START : 'Nothing changed.') + (action === 'include' && !settings(ctx).all ? ' projects.all is off: sandbox projects all on maps your projects at every start.' : '') + (changed ? runningNote() : ''));
|
|
117
|
-
return 0;
|
|
118
|
-
}
|
|
119
|
-
case 'all': {
|
|
120
|
-
if (value === undefined) {
|
|
121
|
-
console.log('projects.all is ' + (settings(ctx).all ? 'on' : 'off') + '.');
|
|
122
|
-
return 0;
|
|
123
|
-
}
|
|
124
|
-
setSetting(ctx, ['projects', 'all'], value === 'on');
|
|
125
|
-
console.log('projects.all is ' + value + '. ' + NEXT_START + (value === 'on' ? ' Every agent in the sandbox can then see all of those projects.' : '') + runningNote());
|
|
126
|
-
return 0;
|
|
127
|
-
}
|
|
128
|
-
case 'roots': {
|
|
129
|
-
if (!value || value === 'list') {
|
|
130
|
-
const roots = settings(ctx).roots;
|
|
131
|
-
console.log(roots.length ? roots.join('\n') : 'No project roots. Add one: sandbox projects roots add <folder>');
|
|
132
|
-
return 0;
|
|
133
|
-
}
|
|
134
|
-
if (value === 'add') {
|
|
135
|
-
const dir = checkFolder(ctx, folder, 'a project root');
|
|
136
|
-
const added = addToList(ctx, ['projects', 'roots'], dir);
|
|
137
|
-
console.log(added ? 'Added the project root ' + dir + ': every project in it (also new ones) opens without a restart. Every agent in the sandbox can see all of them. ' + NEXT_START + runningNote() : dir + ' is a root already.');
|
|
138
|
-
return 0;
|
|
139
|
-
}
|
|
140
|
-
const dir = path.resolve(folder);
|
|
141
|
-
console.log(removeFromList(ctx, ['projects', 'roots'], dir) ? 'Removed the project root ' + dir + '. ' + NEXT_START : dir + ' was not a root.');
|
|
142
|
-
return 0;
|
|
143
|
-
}
|
|
144
|
-
default: return fail('Unknown projects action "' + action + '".');
|
|
145
|
-
}
|
|
146
|
-
};
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import type { SessionStatus } from '../../core/types.js';
|
|
2
|
-
import { type NeedsRestart } from '../../host/projects.js';
|
|
3
|
-
import { type Context } from './context.js';
|
|
4
|
-
/** "2 sessions (claude in api, codex in web)". */
|
|
5
|
-
export declare const describeSessions: (sessions: Pick<SessionStatus, "harness" | "cwd" | "project">[]) => string;
|
|
6
|
-
export declare const offerRestart: (ctx: Context, needs: NeedsRestart[], then: () => Promise<number>) => Promise<number>;
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
// The last way in for a folder the running sandbox cannot show (not in a project root, no `wsb share`): restart it
|
|
2
|
-
// with that folder mapped as well. Only ever with your consent (a prompt, or --yes): it lists what will end, stops
|
|
3
|
-
// the sandbox cleanly (history and claude-mem sync back as on any close), starts it again from the same launch
|
|
4
|
-
// folder with the projects it had plus the new one, reopens the sessions it ended (continuing their conversations
|
|
5
|
-
// where the agent supports it) and then starts the new project's session.
|
|
6
|
-
import path from 'node:path';
|
|
7
|
-
import _ from 'lodash';
|
|
8
|
-
import { askYesNo } from '../../core/prompt.js';
|
|
9
|
-
import { fail, safeText, sleep } from '../../core/util.js';
|
|
10
|
-
import { currentSessions, execInSandbox } from '../../host/channel.js';
|
|
11
|
-
import { isSandboxRunning } from '../../host/platform.js';
|
|
12
|
-
import { readRegistry } from '../../host/projects.js';
|
|
13
|
-
import { hostDirFor, projectForGuestDir } from '../../shared/projects.js';
|
|
14
|
-
import { readSandboxStatus } from '../../shared/rundir.js';
|
|
15
|
-
import { watcherRunning } from '../../sync/watcher.js';
|
|
16
|
-
import { c } from '../colors.js';
|
|
17
|
-
import { working } from '../progress.js';
|
|
18
|
-
import { sandboxAlive } from './context.js';
|
|
19
|
-
/** "2 sessions (claude in api, codex in web)". */
|
|
20
|
-
export const describeSessions = (sessions) => sessions.length === 0 ? 'no sessions' : sessions.length + ' session' + (sessions.length === 1 ? '' : 's') + ' (' + sessions.map((s) => safeText(s.harness) + ' in ' + safeText(s.project ?? path.win32.basename(s.cwd))).join(', ') + ')';
|
|
21
|
-
/** The command to run again with consent, for a non-interactive terminal. */
|
|
22
|
-
const againWithYes = (ctx) => 'sandbox ' + (ctx.options.noAgent ? 'start' : ctx.options.harness ?? ctx.loaded.config.defaultHarness) + (ctx.options.terminal ? ' -t' : '') + ' --yes';
|
|
23
|
-
/** Where each running session is on this PC, so it can be reopened after the restart. */
|
|
24
|
-
const sessionsToReopen = (registry, sessions) => sessions.flatMap((s) => {
|
|
25
|
-
const project = projectForGuestDir([...registry.projects, ...registry.roots.map((r) => ({ ...r }))], s.cwd);
|
|
26
|
-
return project ? [{ harness: s.harness, hostDir: hostDirFor(project, s.cwd) }] : [];
|
|
27
|
-
});
|
|
28
|
-
/** Shuts the sandbox down and waits until it (and the background sync's final pass) is gone. */
|
|
29
|
-
const stopAndWait = async (ctx) => {
|
|
30
|
-
const status = readSandboxStatus(ctx.dataPath);
|
|
31
|
-
await working('Stopping the sandbox (history syncs back)', async () => {
|
|
32
|
-
await execInSandbox(ctx.dataPath, ['C:\\Windows\\System32\\shutdown.exe', '/s', '/t', '0'], status?.guestWorkspace ?? 'C:\\', 30, sandboxAlive).catch(() => null);
|
|
33
|
-
for (let i = 0; i < 180 && isSandboxRunning(); i++)
|
|
34
|
-
await sleep(1000);
|
|
35
|
-
if (isSandboxRunning())
|
|
36
|
-
fail('The sandbox did not shut down within 3 minutes.', 'Close its window yourself, then run the command again.');
|
|
37
|
-
// The watcher syncs history back a few seconds after the window closes; the next start needs it gone.
|
|
38
|
-
for (let i = 0; i < 60 && watcherRunning(ctx.dataPath); i++)
|
|
39
|
-
await sleep(1000);
|
|
40
|
-
});
|
|
41
|
-
};
|
|
42
|
-
export const offerRestart = async (ctx, needs, then) => {
|
|
43
|
-
const folders = needs.map((n) => n.hostDir);
|
|
44
|
-
const registry = readRegistry(ctx.storageRoot) ?? fail('The running sandbox was started by an older version, so it cannot take another folder.', 'Stop it (sandbox stop) and start it again from ' + folders[0] + '.');
|
|
45
|
-
const primary = registry.projects.find((p) => p.primary) ?? fail('The running sandbox has no launch folder on record.', 'Stop it (sandbox stop) and start it again.');
|
|
46
|
-
const sessions = currentSessions(ctx.dataPath);
|
|
47
|
-
for (const need of needs)
|
|
48
|
-
console.log(c.yellow('Windows Sandbox cannot add ' + need.hostDir + ' while it runs: ' + need.reason + '.'));
|
|
49
|
-
console.log('A restart maps ' + (needs.length === 1 ? 'it' : 'them') + ' as well (and keeps ' + registry.projects.map((p) => p.host).join(', ') + '). ' +
|
|
50
|
-
(sessions.length ? describeSessions(sessions) + ' will end' : 'No session is running') + '; your files, tools, databases and logins are kept. It takes about a minute.');
|
|
51
|
-
for (const parent of _.uniq(folders.map((f) => path.dirname(f))))
|
|
52
|
-
console.log(c.dim('No restart next time for folders in ' + parent + ': sandbox projects roots add "' + parent + '"'));
|
|
53
|
-
const interactive = Boolean(process.stdin.isTTY && process.stdout.isTTY);
|
|
54
|
-
if (!ctx.options.yes) {
|
|
55
|
-
if (!interactive)
|
|
56
|
-
fail('Not restarting without your consent.', 'Run it again with --yes to restart: ' + againWithYes(ctx));
|
|
57
|
-
if (!(await askYesNo('Restart the sandbox now?'))) {
|
|
58
|
-
console.log('Nothing changed.');
|
|
59
|
-
return 1;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
const reopen = sessionsToReopen(registry, sessions);
|
|
63
|
-
const resume = reopen.length > 0 && (ctx.options.yes || (await askYesNo('Reopen the ' + reopen.length + ' session(s) afterwards (continuing their conversations where the agent supports it)?', true)));
|
|
64
|
-
await stopAndWait(ctx);
|
|
65
|
-
// Imported here: launch.ts imports this file.
|
|
66
|
-
const { launch, openSession, readySandbox } = await import('./launch.js');
|
|
67
|
-
const { joinHere } = await import('./project.js');
|
|
68
|
-
const keep = registry.projects.filter((p) => !p.primary && p.mechanism !== 'root').map((p) => p.host);
|
|
69
|
-
const relaunch = { ...ctx, options: { ...ctx.options, workspace: primary.host, harness: ctx.options.harness ?? ctx.options.sessions[0]?.harness, terminal: false, noAgent: false, newSession: true, passthrough: [], sessions: [] } };
|
|
70
|
-
await launch(relaunch, false, { extraProjects: [...keep, ...folders], autoSession: false, waitUntilReady: true });
|
|
71
|
-
const ready = await readySandbox(ctx.dataPath);
|
|
72
|
-
if (resume) {
|
|
73
|
-
for (const s of reopen) {
|
|
74
|
-
const at = { ...ctx, options: { ...ctx.options, workspace: s.hostDir, harness: s.harness, terminal: false, newSession: true, passthrough: [], sessions: [] } };
|
|
75
|
-
try {
|
|
76
|
-
const joined = await joinHere(at, ready);
|
|
77
|
-
await openSession(at, ready, joined, { attach: false, harness: s.harness, args: ctx.loaded.config.harnesses[s.harness]?.resumeArguments ?? [], reuse: false });
|
|
78
|
-
}
|
|
79
|
-
catch (e) {
|
|
80
|
-
console.warn(c.yellow('Could not reopen ' + s.harness + ' in ' + s.hostDir + ': ' + (e instanceof Error ? e.message : String(e))));
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
return then();
|
|
85
|
-
};
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { type Context } from './context.js';
|
|
2
|
-
export declare const attach: (ctx: Context) => Promise<number>;
|
|
3
|
-
export declare const sessions: (ctx: Context) => Promise<number>;
|
|
4
|
-
export declare const status: (ctx: Context) => Promise<number>;
|
|
5
|
-
export declare const exec: (ctx: Context) => Promise<number>;
|
|
6
|
-
/** `sandbox db`: runs the sandbox's own `sbx-db` in this folder's project, which knows its database versions and ports. */
|
|
7
|
-
export declare const db: (ctx: Context) => Promise<number>;
|
|
8
|
-
/** Restarts this folder's project's sessions (--all: every session). */
|
|
9
|
-
export declare const restart: (ctx: Context) => Promise<number>;
|
|
10
|
-
export declare const stop: (ctx: Context) => Promise<number>;
|
|
11
|
-
export declare const show: (ctx: Context) => number;
|
|
12
|
-
export declare const hide: (ctx: Context) => Promise<number>;
|
|
@@ -1,257 +0,0 @@
|
|
|
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
|
-
import path from 'node:path';
|
|
5
|
-
import { spawnSync } from 'node:child_process';
|
|
6
|
-
import { select } from '@inquirer/prompts';
|
|
7
|
-
import _ from 'lodash';
|
|
8
|
-
import { askYesNo } from '../../core/prompt.js';
|
|
9
|
-
import { activeAccount } from '../../host/accounts.js';
|
|
10
|
-
import { execInSandbox, pickSession, pingSandbox, restartSessions, currentSessions, runningSessions, sessionsFirstIn } from '../../host/channel.js';
|
|
11
|
-
import { sessionViewers } from '../../host/attach.js';
|
|
12
|
-
import { insideSandbox, isSandboxRunning } from '../../host/platform.js';
|
|
13
|
-
import { NeedsRestart, readRegistry } from '../../host/projects.js';
|
|
14
|
-
import { guardedProjects, repoFindings } from '../../host/repo-guard.js';
|
|
15
|
-
import { hideSandboxWindow, showSandboxWindow } from '../../host/window.js';
|
|
16
|
-
import { isWithin, projectForGuestDir } from '../../shared/projects.js';
|
|
17
|
-
import { listProjectStatus, listSessions, readSandboxStatus } from '../../shared/rundir.js';
|
|
18
|
-
import { watcherRunning } from '../../sync/watcher.js';
|
|
19
|
-
import { errMsg, fail, safeText, sleep } from '../../core/util.js';
|
|
20
|
-
import { printJson, requireOnPc, requireRunning, sandboxAlive, table } from './context.js';
|
|
21
|
-
import { attachHere, readySandbox } from './launch.js';
|
|
22
|
-
import { hereDir, joinHere, locateHere, provisionJoined } from './project.js';
|
|
23
|
-
import { working } from '../progress.js';
|
|
24
|
-
import { ago, c, shortenMiddle, termWidth } from '../colors.js';
|
|
25
|
-
const viewerText = (v) => (v === undefined ? '-' : v === null ? 'unknown (older session)' : v.remote + ' here, ' + (v.viewers - v.remote) + ' in sandbox');
|
|
26
|
-
const projectOf = (projects, s) => s.project ?? projectForGuestDir(projects, s.cwd)?.name ?? '-';
|
|
27
|
-
export const attach = async (ctx) => {
|
|
28
|
-
requireOnPc('attach');
|
|
29
|
-
requireRunning('Start one with: sandbox claude --terminal');
|
|
30
|
-
const ready = await readySandbox(ctx.dataPath);
|
|
31
|
-
const id = ctx.options.positionals[0];
|
|
32
|
-
if (!id && runningSessions(ctx.dataPath).length === 0)
|
|
33
|
-
await sleep(1500);
|
|
34
|
-
const here = locateHere(ctx, ready);
|
|
35
|
-
if (id)
|
|
36
|
-
return attachHere(ctx, pickSession(ctx.dataPath, id));
|
|
37
|
-
// Several sessions: choose, this folder's project first (the newest is the default).
|
|
38
|
-
const running = sessionsFirstIn(runningSessions(ctx.dataPath), here.guestDir);
|
|
39
|
-
if (running.length > 1 && process.stdin.isTTY && process.stdout.isTTY) {
|
|
40
|
-
const projects = readRegistry(ctx.storageRoot)?.projects ?? [];
|
|
41
|
-
const chosen = await select({
|
|
42
|
-
message: 'Which session?' + (here.project ? ' (' + here.project.name + ' first)' : ''),
|
|
43
|
-
choices: running.map((s) => ({ value: s.id, name: (here.guestDir && isWithin(here.guestDir, s.cwd) ? '* ' : ' ') + safeText(s.harness).padEnd(9) + ' ' + safeText(projectOf(projects, s)).padEnd(16) + ' ' + ago(s.startedAt).padEnd(11) + ' ' + s.id })),
|
|
44
|
-
});
|
|
45
|
-
return attachHere(ctx, pickSession(ctx.dataPath, chosen));
|
|
46
|
-
}
|
|
47
|
-
return attachHere(ctx, pickSession(ctx.dataPath, undefined, here.guestDir));
|
|
48
|
-
};
|
|
49
|
-
/** Sessions with who is watching them; `here` marks the ones in the project of the current folder. */
|
|
50
|
-
const listedSessions = async (ctx) => {
|
|
51
|
-
// Who is attached comes from each session itself, so a terminal that was closed is never counted.
|
|
52
|
-
const live = isSandboxRunning();
|
|
53
|
-
// Only this sandbox's sessions are asked (and at most MAX_QUERIED_SESSIONS): the sandbox writes these files.
|
|
54
|
-
const ask = new Set(live ? currentSessions(ctx.dataPath).map((s) => s.id) : []);
|
|
55
|
-
const here = live ? locateHere(ctx, readSandboxStatus(ctx.dataPath)) : { guestDir: null };
|
|
56
|
-
const projects = readRegistry(ctx.storageRoot)?.projects ?? [];
|
|
57
|
-
return Promise.all(listSessions(ctx.dataPath).map(async (s) => ({
|
|
58
|
-
...s, projectName: projectOf(projects, s), here: Boolean(here.guestDir && isWithin(here.guestDir, s.cwd)),
|
|
59
|
-
...(ask.has(s.id) ? { viewers: await sessionViewers(s) } : {}),
|
|
60
|
-
})));
|
|
61
|
-
};
|
|
62
|
-
export const sessions = async (ctx) => {
|
|
63
|
-
const list = await listedSessions(ctx);
|
|
64
|
-
if (printJson(ctx, list.map((s) => _.omit(s, 'attach'))))
|
|
65
|
-
return 0;
|
|
66
|
-
if (list.length === 0) {
|
|
67
|
-
console.log('No sessions. Start one with: sandbox claude');
|
|
68
|
-
return 0;
|
|
69
|
-
}
|
|
70
|
-
// This folder's project first, newest first within each group; harness, cwd and times are written by the sandbox.
|
|
71
|
-
const ordered = [..._.sortBy(list.filter((s) => s.here), (s) => s.startedAt).reverse(), ..._.sortBy(list.filter((s) => !s.here), (s) => s.startedAt).reverse()];
|
|
72
|
-
const folderWidth = Math.max(16, termWidth() - 80);
|
|
73
|
-
table([['', 'ID', 'AGENT', 'PROJECT', 'STATE', 'ATTACHED', 'FOLDER', 'STARTED'], ...ordered.map((s) => [
|
|
74
|
-
s.here ? '*' : '', s.id, safeText(s.harness), safeText(s.projectName ?? '-'), s.phase + (s.exitCode !== undefined ? ' (' + s.exitCode + ')' : ''), viewerText(s.viewers), shortenMiddle(safeText(s.cwd), folderWidth), ago(s.startedAt),
|
|
75
|
-
])]);
|
|
76
|
-
if (list.some((s) => s.here))
|
|
77
|
-
console.log(c.dim('* = the project of this folder'));
|
|
78
|
-
return 0;
|
|
79
|
-
};
|
|
80
|
-
/** Running databases by port, from the sandbox's own `sbx-db list` (best effort: unknown when it does not answer). */
|
|
81
|
-
const runningPorts = async (ctx, cwd) => {
|
|
82
|
-
try {
|
|
83
|
-
const r = await execInSandbox(ctx.dataPath, ['sbx-db', 'list'], cwd, 30, sandboxAlive);
|
|
84
|
-
return new Set((r.stdout ?? '').split(/\r?\n/).filter((l) => /\brunning\b/.test(l)).map((l) => Number(/port (\d+)/.exec(l)?.[1])).filter((n) => n > 0));
|
|
85
|
-
}
|
|
86
|
-
catch {
|
|
87
|
-
return null;
|
|
88
|
-
}
|
|
89
|
-
};
|
|
90
|
-
export const status = async (ctx) => {
|
|
91
|
-
const running = isSandboxRunning();
|
|
92
|
-
const sandbox = readSandboxStatus(ctx.dataPath);
|
|
93
|
-
const registry = running ? readRegistry(ctx.storageRoot) : null;
|
|
94
|
-
const ready = running && sandbox?.phase === 'ready';
|
|
95
|
-
const daemon = ready ? await pingSandbox(ctx.dataPath, sandboxAlive).then((r) => r.message, (e) => 'no answer (' + errMsg(e) + ')') : '-';
|
|
96
|
-
const here = running ? locateHere(ctx, sandbox) : { project: null, guestDir: null };
|
|
97
|
-
const sessionList = running ? await listedSessions(ctx) : [];
|
|
98
|
-
const provisioning = running ? listProjectStatus(ctx.dataPath) : [];
|
|
99
|
-
const ports = ready && sandbox ? await runningPorts(ctx, sandbox.guestWorkspace) : null;
|
|
100
|
-
const findings = repoFindings(ctx.dataPath);
|
|
101
|
-
const startedAt = Number(/^(\d+)-/.exec(registry?.launchId ?? sandbox?.launchId ?? '')?.[1]) || null;
|
|
102
|
-
const projects = (registry?.projects ?? []).map((p) => {
|
|
103
|
-
const prov = provisioning.find((s) => s.name.toLowerCase() === p.name.toLowerCase());
|
|
104
|
-
const own = sessionList.filter((s) => s.phase === 'running' && projectForGuestDir(registry?.projects ?? [], s.cwd)?.name === p.name);
|
|
105
|
-
return {
|
|
106
|
-
name: p.name, host: p.host, guest: p.guest, mechanism: p.mechanism, here: here.project?.name === p.name,
|
|
107
|
-
setup: prov ? { phase: prov.phase, message: safeText(prov.message) } : { phase: 'not set up yet', message: 'set up when you first start a session or command there' },
|
|
108
|
-
databases: (prov?.databases ?? []).map((d) => ({ database: safeText(d.database), port: d.port, state: ports ? (ports.has(d.port) ? 'running' : 'stopped') : 'unknown' })),
|
|
109
|
-
sessions: own.map((s) => ({ id: s.id, harness: safeText(s.harness), viewers: viewerText(s.viewers), started: s.startedAt })),
|
|
110
|
-
// With several guarded folders each finding starts with its folder.
|
|
111
|
-
repoGuard: findings.filter((f) => f.detail.toLowerCase().startsWith(p.host.toLowerCase() + ':')).map((f) => f.kind + ': ' + safeText(f.detail)),
|
|
112
|
-
};
|
|
113
|
-
});
|
|
114
|
-
const info = {
|
|
115
|
-
sandbox: {
|
|
116
|
-
running, phase: running ? sandbox?.phase ?? 'unknown' : 'stopped', message: sandbox?.message, headless: sandbox?.headless,
|
|
117
|
-
uptime: running && startedAt ? ago(startedAt).replace(' ago', '') : null, daemon, account: activeAccount(ctx.dataPath), syncWatcher: watcherRunning(ctx.dataPath),
|
|
118
|
-
},
|
|
119
|
-
here: { folder: hereDir(ctx), project: here.project?.name ?? null, guest: here.guestDir },
|
|
120
|
-
roots: registry?.roots ?? [],
|
|
121
|
-
projects,
|
|
122
|
-
otherSessions: sessionList.filter((s) => s.phase === 'running' && !projects.some((p) => p.sessions.some((x) => x.id === s.id))).map((s) => ({ id: s.id, harness: safeText(s.harness), cwd: safeText(s.cwd) })),
|
|
123
|
-
repoGuard: { guarded: guardedProjects(ctx.dataPath).length, findings: findings.map((f) => f.kind + ': ' + f.detail) },
|
|
124
|
-
};
|
|
125
|
-
if (printJson(ctx, info))
|
|
126
|
-
return 0;
|
|
127
|
-
const yesNo = (v) => (typeof v === 'boolean' ? (v ? 'yes' : 'no') : String(v ?? '-'));
|
|
128
|
-
table(Object.entries(info.sandbox).map(([k, v]) => [_.startCase(k), safeText(yesNo(v))]));
|
|
129
|
-
if (!running)
|
|
130
|
-
return 0;
|
|
131
|
-
console.log('\n' + c.bold('Projects') + c.dim(' (* = this folder: ' + info.here.folder + (info.here.project ? '' : ', not in this sandbox') + ')'));
|
|
132
|
-
for (const p of projects) {
|
|
133
|
-
console.log((p.here ? '* ' : ' ') + c.bold(p.name) + ' ' + p.host + ' -> ' + p.guest + c.dim(' (' + (p.mechanism === 'launch' ? 'started from here' : p.mechanism === 'root' ? 'in a project root' : p.mechanism === 'boot' ? 'mapped at start' : 'wsb share') + ')'));
|
|
134
|
-
console.log(' setup: ' + p.setup.phase + (p.setup.phase === 'ready' ? '' : ' - ' + shortenMiddle(p.setup.message, termWidth() - 20)));
|
|
135
|
-
if (p.databases.length)
|
|
136
|
-
console.log(' databases: ' + p.databases.map((d) => d.database + ' :' + d.port + ' ' + d.state).join(', '));
|
|
137
|
-
for (const s of p.sessions)
|
|
138
|
-
console.log(' session ' + s.id + ' ' + s.harness + ' ' + s.viewers + ' ' + ago(s.started));
|
|
139
|
-
for (const f of p.repoGuard)
|
|
140
|
-
console.log(' ' + c.yellow('guard: ' + f));
|
|
141
|
-
}
|
|
142
|
-
for (const r of info.roots)
|
|
143
|
-
console.log(' root ' + r.host + ' -> ' + r.guest + c.dim(' (every project in it opens without a restart)'));
|
|
144
|
-
for (const s of info.otherSessions)
|
|
145
|
-
console.log(' session ' + s.id + ' ' + s.harness + ' ' + s.cwd);
|
|
146
|
-
console.log('\n' + c.bold('Repo guard') + ' ' + info.repoGuard.guarded + ' folder(s) guarded; ' + (findings.length ? c.yellow(findings.length + ' change(s) neutralised:') : 'nothing from the sandbox needed neutralising'));
|
|
147
|
-
for (const f of info.repoGuard.findings.slice(-10))
|
|
148
|
-
console.log(' ' + c.yellow(safeText(f)));
|
|
149
|
-
return 0;
|
|
150
|
-
};
|
|
151
|
-
/** What a command run in the sandbox printed (text from the sandbox: through safeText), or why it failed. */
|
|
152
|
-
const printExecResult = (result) => {
|
|
153
|
-
if (result.stdout)
|
|
154
|
-
process.stdout.write(safeText(result.stdout));
|
|
155
|
-
if (result.stderr)
|
|
156
|
-
process.stderr.write(safeText(result.stderr));
|
|
157
|
-
if (!result.ok && !result.stdout && !result.stderr)
|
|
158
|
-
console.error(safeText(result.message));
|
|
159
|
-
};
|
|
160
|
-
/** The guest folder for this folder, joining the running sandbox (and setting the project up) when needed. */
|
|
161
|
-
const guestFolderHere = async (ctx, what) => {
|
|
162
|
-
const ready = await readySandbox(ctx.dataPath);
|
|
163
|
-
try {
|
|
164
|
-
const joined = await joinHere(ctx, ready);
|
|
165
|
-
for (const note of joined.notes)
|
|
166
|
-
console.error(note);
|
|
167
|
-
await provisionJoined(ctx, joined);
|
|
168
|
-
return joined.guestDir;
|
|
169
|
-
}
|
|
170
|
-
catch (e) {
|
|
171
|
-
if (!(e instanceof NeedsRestart))
|
|
172
|
-
throw e;
|
|
173
|
-
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 "' + path.dirname(e.hostDir) + '"');
|
|
174
|
-
}
|
|
175
|
-
};
|
|
176
|
-
export const exec = async (ctx) => {
|
|
177
|
-
const command = [...ctx.options.positionals, ...ctx.options.passthrough];
|
|
178
|
-
if (command.length === 0)
|
|
179
|
-
fail('No command given.', 'Usage: sandbox exec [--timeout <s>] -- <command> [args...]');
|
|
180
|
-
requireOnPc('exec');
|
|
181
|
-
requireRunning();
|
|
182
|
-
const cwd = await guestFolderHere(ctx, 'exec');
|
|
183
|
-
const result = await execInSandbox(ctx.dataPath, command, cwd, ctx.options.timeout, sandboxAlive);
|
|
184
|
-
if (!printJson(ctx, result))
|
|
185
|
-
printExecResult(result);
|
|
186
|
-
return result.exitCode ?? 1;
|
|
187
|
-
};
|
|
188
|
-
/** `sandbox db`: runs the sandbox's own `sbx-db` in this folder's project, which knows its database versions and ports. */
|
|
189
|
-
export const db = async (ctx) => {
|
|
190
|
-
const [action = 'list', name] = ctx.options.positionals;
|
|
191
|
-
if (!['list', 'start', 'stop'].includes(action))
|
|
192
|
-
fail('Unknown db action "' + action + '".', 'Use: sandbox db (list) or sandbox db start|stop <postgres|mysql|mongodb|redis|dynamodb>');
|
|
193
|
-
if (action !== 'list' && !name)
|
|
194
|
-
fail('Which database?', 'Usage: sandbox db ' + action + ' <postgres|mysql|mongodb|redis|dynamodb>');
|
|
195
|
-
// Already inside the sandbox: run the database tool here instead of asking the sandbox from outside.
|
|
196
|
-
if (insideSandbox())
|
|
197
|
-
return spawnSync(process.execPath, [path.join(ctx.packageRoot, 'dist', 'runtime', 'db.js'), action, ...(name ? [name] : [])], { stdio: 'inherit', windowsHide: true }).status ?? 1;
|
|
198
|
-
requireRunning('Start one with: sandbox start --database <name>');
|
|
199
|
-
const cwd = await guestFolderHere(ctx, 'db');
|
|
200
|
-
// Starting can download the database the first time.
|
|
201
|
-
const result = await working((action === 'list' ? 'Asking' : action === 'start' ? 'Starting' : 'Stopping') + ' the database' + (name ? ' ' + name : 's') + ' in the sandbox', () => execInSandbox(ctx.dataPath, ['sbx-db', action, ...(name ? [name] : [])], cwd, 1800, sandboxAlive));
|
|
202
|
-
printExecResult(result);
|
|
203
|
-
return result.exitCode ?? 1;
|
|
204
|
-
};
|
|
205
|
-
/** Restarts this folder's project's sessions (--all: every session). */
|
|
206
|
-
export const restart = async (ctx) => {
|
|
207
|
-
requireOnPc('restart');
|
|
208
|
-
requireRunning();
|
|
209
|
-
const here = locateHere(ctx, readSandboxStatus(ctx.dataPath));
|
|
210
|
-
const scope = ctx.options.all || !here.project ? undefined : here.project.guest;
|
|
211
|
-
if (!scope && !ctx.options.all)
|
|
212
|
-
console.log(c.dim(hereDir(ctx) + ' is not a project of the running sandbox: restarting every session.'));
|
|
213
|
-
console.log(safeText((await working('Restarting the agents' + (scope ? ' of ' + here.project?.name : ''), () => restartSessions(ctx.dataPath, ctx.options.harness ?? null, sandboxAlive, scope))).message));
|
|
214
|
-
return 0;
|
|
215
|
-
};
|
|
216
|
-
export const stop = async (ctx) => {
|
|
217
|
-
requireOnPc('stop');
|
|
218
|
-
if (!isSandboxRunning()) {
|
|
219
|
-
console.log('No Windows Sandbox is running.');
|
|
220
|
-
return 0;
|
|
221
|
-
}
|
|
222
|
-
const sandbox = readSandboxStatus(ctx.dataPath) ?? fail('This sandbox was not started by this tool.', 'Close its window instead.');
|
|
223
|
-
// Stopping ends every project's sessions, not just this folder's: say which, and ask when others would end too.
|
|
224
|
-
const here = locateHere(ctx, sandbox);
|
|
225
|
-
const running = currentSessions(ctx.dataPath);
|
|
226
|
-
const others = running.filter((s) => !(here.guestDir && isWithin(here.project?.guest ?? here.guestDir, s.cwd)));
|
|
227
|
-
if (running.length)
|
|
228
|
-
console.log('Stopping ends ' + running.length + ' session(s): ' + running.map((s) => safeText(s.harness) + ' in ' + safeText(s.project ?? path.win32.basename(s.cwd))).join(', ') + '.');
|
|
229
|
-
if (others.length && !ctx.options.yes) {
|
|
230
|
-
// A script must never end other projects' sessions by accident: without a terminal to ask in, it needs --yes.
|
|
231
|
-
const interactive = process.stdin.isTTY && process.stdout.isTTY;
|
|
232
|
-
if (!interactive)
|
|
233
|
-
fail(others.length + ' of these sessions belong to other projects, so the sandbox was not stopped.', 'Stop it anyway with: sandbox stop --yes');
|
|
234
|
-
if (!(await askYesNo(others.length + ' of them belong to other projects. Stop the whole sandbox?'))) {
|
|
235
|
-
console.log('Nothing changed.');
|
|
236
|
-
return 1;
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
await working('Asking the sandbox to shut down', () => execInSandbox(ctx.dataPath, ['C:\\Windows\\System32\\shutdown.exe', '/s', '/t', '2'], sandbox.guestWorkspace, 30, sandboxAlive));
|
|
240
|
-
console.log('Sandbox is shutting down; history and claude-mem sync back when it closes.');
|
|
241
|
-
return 0;
|
|
242
|
-
};
|
|
243
|
-
export const show = (ctx) => {
|
|
244
|
-
requireOnPc('show');
|
|
245
|
-
requireRunning();
|
|
246
|
-
if (!showSandboxWindow(ctx.storageRoot))
|
|
247
|
-
fail('Could not find the Windows Sandbox window.', 'It may still be starting; try again in a few seconds.');
|
|
248
|
-
return 0;
|
|
249
|
-
};
|
|
250
|
-
export const hide = async (ctx) => {
|
|
251
|
-
requireOnPc('hide');
|
|
252
|
-
requireRunning();
|
|
253
|
-
if (!(await hideSandboxWindow(ctx.storageRoot, 5)))
|
|
254
|
-
fail('Could not find a visible Windows Sandbox window.', 'It may already be hidden (sbx-show brings it back).');
|
|
255
|
-
console.log('Sandbox window hidden. Bring it back with: sbx-show');
|
|
256
|
-
return 0;
|
|
257
|
-
};
|