windows-development-sandbox 1.4.1 → 1.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config.example.json +3 -1
- package/dist/api.js +27 -16
- package/dist/cli/args.d.ts +4 -6
- package/dist/cli/args.js +67 -34
- package/dist/cli/argv.d.ts +9 -0
- package/dist/cli/argv.js +22 -0
- package/dist/cli/commands/accounts.d.ts +1 -1
- package/dist/cli/commands/accounts.js +42 -27
- package/dist/cli/commands/agent-commands.d.ts +3 -3
- package/dist/cli/commands/agent-commands.js +27 -18
- package/dist/cli/commands/context.d.ts +9 -11
- package/dist/cli/commands/context.js +35 -32
- package/dist/cli/commands/data/clean.d.ts +2 -2
- package/dist/cli/commands/data/clean.js +27 -11
- package/dist/cli/commands/data/collect.d.ts +6 -3
- package/dist/cli/commands/data/collect.js +46 -15
- package/dist/cli/commands/data/index.d.ts +2 -2
- package/dist/cli/commands/data/index.js +30 -12
- package/dist/cli/commands/data/remove.d.ts +1 -1
- package/dist/cli/commands/data/remove.js +4 -4
- package/dist/cli/commands/index.d.ts +5 -4
- package/dist/cli/commands/index.js +5 -4
- package/dist/cli/commands/launch/add-root.d.ts +7 -0
- package/dist/cli/commands/launch/add-root.js +64 -0
- package/dist/cli/commands/launch/boot-progress.d.ts +7 -0
- package/dist/cli/commands/launch/boot-progress.js +48 -0
- package/dist/cli/commands/launch/boot-wants.d.ts +11 -0
- package/dist/cli/commands/launch/boot-wants.js +48 -0
- package/dist/cli/commands/launch/first-start.d.ts +10 -0
- package/dist/cli/commands/launch/first-start.js +53 -0
- package/dist/cli/commands/launch/index.d.ts +6 -0
- package/dist/cli/commands/launch/index.js +6 -0
- package/dist/cli/commands/launch/launch.d.ts +8 -0
- package/dist/cli/commands/launch/launch.js +211 -0
- package/dist/cli/commands/launch/prepare.d.ts +23 -0
- package/dist/cli/commands/launch/prepare.js +109 -0
- package/dist/cli/commands/launch/running.d.ts +45 -0
- package/dist/cli/commands/launch/running.js +218 -0
- package/dist/cli/commands/launch/summary.d.ts +8 -0
- package/dist/cli/commands/launch/summary.js +98 -0
- package/dist/cli/commands/maintenance/audit.d.ts +3 -0
- package/dist/cli/commands/maintenance/audit.js +58 -0
- package/dist/cli/commands/maintenance/clean.d.ts +2 -0
- package/dist/cli/commands/maintenance/clean.js +10 -0
- package/dist/cli/commands/maintenance/config.d.ts +2 -0
- package/dist/cli/commands/maintenance/config.js +145 -0
- package/dist/cli/commands/maintenance/doctor.d.ts +2 -0
- package/dist/cli/commands/maintenance/doctor.js +52 -0
- package/dist/cli/commands/maintenance/host-claude.d.ts +2 -0
- package/dist/cli/commands/maintenance/host-claude.js +4 -0
- package/dist/cli/commands/maintenance/index.d.ts +8 -0
- package/dist/cli/commands/maintenance/index.js +9 -0
- package/dist/cli/commands/maintenance/logs.d.ts +2 -0
- package/dist/cli/commands/maintenance/logs.js +44 -0
- package/dist/cli/commands/maintenance/sync.d.ts +2 -0
- package/dist/cli/commands/maintenance/sync.js +12 -0
- package/dist/cli/commands/maintenance/watch.d.ts +3 -0
- package/dist/cli/commands/maintenance/watch.js +6 -0
- package/dist/cli/commands/projects/describe-sessions.d.ts +3 -0
- package/dist/cli/commands/projects/describe-sessions.js +15 -0
- package/dist/cli/commands/projects/here.d.ts +38 -0
- package/dist/cli/commands/projects/here.js +145 -0
- package/dist/cli/commands/projects/index.d.ts +4 -0
- package/dist/cli/commands/projects/index.js +4 -0
- package/dist/cli/commands/projects/projects.d.ts +14 -0
- package/dist/cli/commands/projects/projects.js +213 -0
- package/dist/cli/commands/projects/restart.d.ts +15 -0
- package/dist/cli/commands/projects/restart.js +149 -0
- package/dist/cli/commands/registry.d.ts +3 -0
- package/dist/cli/commands/registry.js +34 -0
- package/dist/cli/commands/repair/checks.js +105 -29
- package/dist/cli/commands/repair/finders.d.ts +13 -10
- package/dist/cli/commands/repair/finders.js +63 -43
- package/dist/cli/commands/repair/index.d.ts +4 -4
- package/dist/cli/commands/repair/index.js +47 -21
- package/dist/cli/commands/repair/types.d.ts +2 -2
- package/dist/cli/commands/repair/types.js +7 -2
- package/dist/cli/commands/sessions/attach.d.ts +2 -0
- package/dist/cli/commands/sessions/attach.js +45 -0
- package/dist/cli/commands/sessions/control.d.ts +4 -0
- package/dist/cli/commands/sessions/control.js +62 -0
- package/dist/cli/commands/sessions/exec.d.ts +6 -0
- package/dist/cli/commands/sessions/exec.js +72 -0
- package/dist/cli/commands/sessions/index.d.ts +6 -0
- package/dist/cli/commands/sessions/index.js +9 -0
- package/dist/cli/commands/sessions/list.d.ts +15 -0
- package/dist/cli/commands/sessions/list.js +65 -0
- package/dist/cli/commands/sessions/status.d.ts +2 -0
- package/dist/cli/commands/sessions/status.js +153 -0
- package/dist/cli/commands/sessions/window.d.ts +3 -0
- package/dist/cli/commands/sessions/window.js +18 -0
- package/dist/cli/commands/setup/checks.d.ts +4 -4
- package/dist/cli/commands/setup/checks.js +36 -19
- package/dist/cli/commands/setup/facts.d.ts +6 -6
- package/dist/cli/commands/setup/facts.js +23 -11
- package/dist/cli/commands/setup/index.d.ts +1 -1
- package/dist/cli/commands/setup/index.js +25 -12
- package/dist/cli/commands/user-config.d.ts +5 -5
- package/dist/cli/commands/user-config.js +14 -12
- package/dist/cli/history.d.ts +5 -4
- package/dist/cli/history.js +23 -11
- package/dist/cli/index.d.ts +4 -14
- package/dist/cli/index.js +27 -77
- package/dist/cli/manifest.d.ts +464 -10
- package/dist/cli/manifest.js +327 -53
- package/dist/cli/menu/apps.d.ts +7 -5
- package/dist/cli/menu/apps.js +64 -16
- package/dist/cli/menu/command-fields.d.ts +15 -0
- package/dist/cli/menu/command-fields.js +23 -0
- package/dist/cli/menu/command-form.d.ts +3 -5
- package/dist/cli/menu/command-form.js +116 -48
- package/dist/cli/menu/home.d.ts +22 -0
- package/dist/cli/menu/home.js +72 -0
- package/dist/cli/menu/index.d.ts +2 -24
- package/dist/cli/menu/index.js +4 -178
- package/dist/cli/menu/menu.d.ts +23 -0
- package/dist/cli/menu/menu.js +185 -0
- package/dist/cli/menu/settings/categories.d.ts +2 -2
- package/dist/cli/menu/settings/categories.js +123 -20
- package/dist/cli/menu/settings/collections/collection-editor.d.ts +23 -0
- package/dist/cli/menu/settings/collections/collection-editor.js +89 -0
- package/dist/cli/menu/settings/collections/map-editor.d.ts +10 -0
- package/dist/cli/menu/settings/collections/map-editor.js +34 -0
- package/dist/cli/menu/settings/collections/object-list-editor.d.ts +10 -0
- package/dist/cli/menu/settings/collections/object-list-editor.js +23 -0
- package/dist/cli/menu/settings/collections/object-map-editor.d.ts +10 -0
- package/dist/cli/menu/settings/collections/object-map-editor.js +35 -0
- package/dist/cli/menu/settings/collections/string-list-editor.d.ts +12 -0
- package/dist/cli/menu/settings/collections/string-list-editor.js +39 -0
- package/dist/cli/menu/settings/config-file.d.ts +2 -2
- package/dist/cli/menu/settings/config-file.js +42 -19
- package/dist/cli/menu/settings/editor-actions.d.ts +2 -0
- package/dist/cli/menu/settings/editor-actions.js +2 -0
- package/dist/cli/menu/settings/format.d.ts +5 -0
- package/dist/cli/menu/settings/format.js +39 -0
- package/dist/cli/menu/settings/index.d.ts +1 -29
- package/dist/cli/menu/settings/index.js +1 -133
- package/dist/cli/menu/settings/object-editor.d.ts +12 -0
- package/dist/cli/menu/settings/object-editor.js +86 -0
- package/dist/cli/menu/settings/schema-node.d.ts +3 -1
- package/dist/cli/menu/settings/schema-node.js +71 -24
- package/dist/cli/menu/settings/settings-editor.d.ts +30 -0
- package/dist/cli/menu/settings/settings-editor.js +176 -0
- package/dist/cli/menu/settings/{editors.d.ts → value-editor.d.ts} +2 -13
- package/dist/cli/menu/settings/value-editor.js +137 -0
- package/dist/cli/menu/several.d.ts +4 -4
- package/dist/cli/menu/several.js +61 -20
- package/dist/cli/{colors.d.ts → output/colors.d.ts} +8 -8
- package/dist/cli/{colors.js → output/colors.js} +32 -14
- package/dist/cli/output/index.d.ts +3 -0
- package/dist/cli/output/index.js +3 -0
- package/dist/cli/output/print.d.ts +5 -0
- package/dist/cli/output/print.js +14 -0
- package/dist/cli/{progress.d.ts → output/progress.d.ts} +5 -5
- package/dist/cli/{progress.js → output/progress.js} +42 -19
- package/dist/cli/report.d.ts +2 -0
- package/dist/cli/report.js +20 -0
- package/dist/cli/tui/app.d.ts +6 -16
- package/dist/cli/tui/app.js +28 -8
- package/dist/cli/tui/dialogs/confirm-screen.d.ts +20 -0
- package/dist/cli/tui/dialogs/confirm-screen.js +50 -0
- package/dist/cli/tui/dialogs/message-screen.d.ts +17 -0
- package/dist/cli/tui/dialogs/message-screen.js +55 -0
- package/dist/cli/tui/dialogs/paragraphs.d.ts +2 -0
- package/dist/cli/tui/dialogs/paragraphs.js +5 -0
- package/dist/cli/tui/dialogs/text-screen.d.ts +26 -0
- package/dist/cli/tui/dialogs/text-screen.js +107 -0
- package/dist/cli/tui/frame.js +3 -1
- package/dist/cli/tui/index.d.ts +7 -3
- package/dist/cli/tui/index.js +4 -2
- package/dist/cli/tui/list/list-screen.d.ts +29 -0
- package/dist/cli/tui/{list-screen.js → list/list-screen.js} +86 -23
- package/dist/cli/tui/{list-screen.d.ts → list/list-types.d.ts} +0 -28
- package/dist/cli/tui/screen.d.ts +14 -0
- package/dist/cli/tui/terminal.js +34 -10
- package/dist/cli/tui/text.d.ts +2 -1
- package/dist/cli/tui/text.js +37 -7
- package/dist/cli/tui/theme.js +27 -9
- package/dist/cli/validate.d.ts +8 -8
- package/dist/cli/validate.js +32 -21
- package/dist/core/config/defaults.d.ts +2 -0
- package/dist/core/config/defaults.js +203 -0
- package/dist/core/config/index.d.ts +2 -0
- package/dist/core/config/index.js +3 -0
- package/dist/core/{config.d.ts → config/loader.d.ts} +1 -2
- package/dist/core/config/loader.js +47 -0
- package/dist/core/{detect-databases.js → detect/databases.js} +111 -23
- package/dist/core/detect/index.d.ts +4 -0
- package/dist/core/detect/index.js +4 -0
- package/dist/core/{detect-pwsh.d.ts → detect/pwsh.d.ts} +1 -1
- package/dist/core/{detect-pwsh.js → detect/pwsh.js} +25 -11
- package/dist/core/{detect-toolchains.d.ts → detect/toolchains.d.ts} +1 -1
- package/dist/core/{detect-toolchains.js → detect/toolchains.js} +42 -5
- package/dist/{guest/toolchains → core/detect}/versions.js +28 -12
- package/dist/core/disk.d.ts +2 -0
- package/dist/core/disk.js +46 -3
- package/dist/core/local-config/boot-wants.d.ts +45 -0
- package/dist/core/local-config/boot-wants.js +120 -0
- package/dist/core/local-config/file.d.ts +3 -0
- package/dist/core/local-config/file.js +16 -0
- package/dist/core/local-config/index.d.ts +5 -0
- package/dist/core/local-config/index.js +7 -0
- package/dist/core/{local-config.d.ts → local-config/overrides.d.ts} +3 -18
- package/dist/core/{local-config.js → local-config/overrides.js} +45 -52
- package/dist/core/local-config/policy.d.ts +19 -0
- package/dist/core/local-config/policy.js +45 -0
- package/dist/core/local-config/trust.d.ts +13 -0
- package/dist/core/local-config/trust.js +43 -0
- package/dist/core/package-info.d.ts +4 -0
- package/dist/core/package-info.js +13 -0
- package/dist/core/run/guest-workspace.d.ts +23 -0
- package/dist/core/run/guest-workspace.js +47 -0
- package/dist/core/run/index.d.ts +3 -0
- package/dist/core/run/index.js +3 -0
- package/dist/core/run/resolve-run.d.ts +3 -0
- package/dist/core/run/resolve-run.js +202 -0
- package/dist/core/run/versions.d.ts +13 -0
- package/dist/core/run/versions.js +65 -0
- package/dist/core/safe-paths.js +17 -5
- package/dist/core/schema/apps.d.ts +4 -4
- package/dist/core/schema/apps.js +55 -21
- package/dist/core/schema/common.d.ts +13 -10
- package/dist/core/schema/common.js +16 -10
- package/dist/core/schema/config.d.ts +15 -10
- package/dist/core/schema/config.js +78 -53
- package/dist/core/schema/databases.d.ts +4 -3
- package/dist/core/schema/databases.js +16 -12
- package/dist/core/schema/harness.d.ts +1 -1
- package/dist/core/schema/harness.js +17 -7
- package/dist/core/schema/index.d.ts +6 -0
- package/dist/core/schema/index.js +8 -0
- package/dist/core/schema/json-schema.js +10 -5
- package/dist/core/schema/profile.d.ts +4 -4
- package/dist/core/schema/profile.js +37 -17
- package/dist/core/schema/projects.d.ts +1 -1
- package/dist/core/schema/projects.js +16 -6
- package/dist/core/schema/sandbox.d.ts +11 -11
- package/dist/core/schema/sandbox.js +101 -37
- package/dist/core/schema/toolchains.d.ts +6 -1
- package/dist/core/schema/toolchains.js +84 -34
- package/dist/core/types.d.ts +19 -9
- package/dist/core/util/errors.d.ts +8 -0
- package/dist/core/util/errors.js +14 -0
- package/dist/core/util/fs.d.ts +8 -0
- package/dist/core/util/fs.js +40 -0
- package/dist/core/util/index.d.ts +7 -0
- package/dist/core/util/index.js +7 -0
- package/dist/core/util/jsonc.d.ts +6 -0
- package/dist/core/util/jsonc.js +25 -0
- package/dist/core/util/links.d.ts +10 -0
- package/dist/core/util/links.js +39 -0
- package/dist/core/util/paths.d.ts +7 -0
- package/dist/core/util/paths.js +33 -0
- package/dist/core/util/process.d.ts +15 -0
- package/dist/core/util/process.js +54 -0
- package/dist/core/util/text.d.ts +8 -0
- package/dist/core/util/text.js +8 -0
- package/dist/guest/{setup/agents.js → agents/agent-installer.js} +24 -4
- package/dist/guest/apps/after-install.d.ts +3 -0
- package/dist/guest/apps/after-install.js +47 -0
- package/dist/guest/apps/app-installer.d.ts +22 -0
- package/dist/guest/apps/app-installer.js +116 -0
- package/dist/guest/apps/find-exe.d.ts +5 -0
- package/dist/guest/apps/find-exe.js +41 -0
- package/dist/guest/apps/index.d.ts +3 -10
- package/dist/guest/apps/index.js +6 -206
- package/dist/guest/apps/resolvers.js +37 -9
- package/dist/guest/apps/shortcuts.d.ts +6 -0
- package/dist/guest/apps/shortcuts.js +28 -0
- package/dist/guest/apps/sources.d.ts +4 -0
- package/dist/guest/apps/sources.js +17 -0
- package/dist/guest/apps/unpack.d.ts +3 -0
- package/dist/guest/apps/unpack.js +47 -0
- package/dist/guest/{audit-parse.js → audit/parse.js} +39 -3
- package/dist/guest/{audit.d.ts → audit/process-audit.d.ts} +3 -1
- package/dist/guest/{audit.js → audit/process-audit.js} +33 -8
- package/dist/guest/boot/boot-env.d.ts +4 -0
- package/dist/guest/{boot-env.js → boot/boot-env.js} +7 -5
- package/dist/guest/boot/boot.d.ts +1 -0
- package/dist/guest/{main.js → boot/boot.js} +96 -50
- package/dist/guest/{guide.js → boot/guide.js} +32 -7
- package/dist/guest/{project-env.d.ts → boot/project-env.d.ts} +3 -3
- package/dist/guest/{project-env.js → boot/project-env.js} +12 -4
- package/dist/guest/boot/project-status.d.ts +5 -0
- package/dist/guest/boot/project-status.js +28 -0
- package/dist/guest/daemon/daemon.d.ts +1 -0
- package/dist/guest/daemon/daemon.js +51 -0
- package/dist/guest/daemon/exec.js +18 -6
- package/dist/guest/daemon/{shutdown.js → idle-shutdown.js} +5 -4
- package/dist/guest/daemon/{project.d.ts → project-provisioner.d.ts} +3 -3
- package/dist/guest/daemon/{project.js → project-provisioner.js} +60 -22
- package/dist/guest/daemon/relays.js +5 -3
- package/dist/guest/daemon/{session.js → sessions.js} +84 -24
- package/dist/guest/daemon/state.d.ts +4 -1
- package/dist/guest/daemon/state.js +34 -20
- package/dist/guest/databases/database-server.d.ts +13 -0
- package/dist/guest/databases/database-server.js +35 -0
- package/dist/guest/databases/dynamodb.d.ts +12 -0
- package/dist/guest/databases/dynamodb.js +81 -0
- package/dist/guest/databases/index.d.ts +2 -0
- package/dist/guest/databases/index.js +2 -0
- package/dist/guest/databases/mongodb.d.ts +7 -0
- package/dist/guest/databases/mongodb.js +46 -0
- package/dist/guest/databases/mysql.d.ts +7 -0
- package/dist/guest/databases/mysql.js +59 -0
- package/dist/guest/databases/names.d.ts +5 -0
- package/dist/guest/databases/names.js +8 -0
- package/dist/guest/databases/postgres.d.ts +9 -0
- package/dist/guest/databases/postgres.js +85 -0
- package/dist/guest/databases/redis.d.ts +7 -0
- package/dist/guest/databases/redis.js +25 -0
- package/dist/guest/databases/registry.d.ts +5 -0
- package/dist/guest/databases/registry.js +51 -0
- package/dist/guest/databases/sbx-db.d.ts +1 -0
- package/dist/guest/{db.js → databases/sbx-db.js} +13 -13
- package/dist/guest/{toolchains/databases → databases}/server.d.ts +5 -5
- package/dist/guest/{toolchains/databases → databases}/server.js +18 -13
- package/dist/guest/entries/daemon.js +16 -0
- package/dist/guest/entries/db.js +10 -0
- package/dist/guest/entries/gitguard.js +20 -0
- package/dist/guest/entries/main.d.ts +1 -0
- package/dist/guest/entries/main.js +24 -0
- package/dist/guest/entries/netproxy.d.ts +1 -0
- package/dist/guest/entries/netproxy.js +7 -0
- package/dist/guest/entries/view.d.ts +1 -0
- package/dist/guest/entries/view.js +11 -0
- package/dist/guest/{gitguard.js → git/decision.js} +49 -26
- package/dist/guest/network/addresses.d.ts +2 -0
- package/dist/guest/network/addresses.js +6 -0
- package/dist/guest/{setup/network.d.ts → network/allow-only.d.ts} +0 -10
- package/dist/guest/network/allow-only.js +84 -0
- package/dist/guest/network/firewall.d.ts +9 -0
- package/dist/guest/{setup/network.js → network/firewall.js} +58 -63
- package/dist/guest/network/proxy-server.d.ts +2 -0
- package/dist/guest/{netproxy.js → network/proxy-server.js} +37 -18
- package/dist/guest/{helpers.d.ts → runtime/csc.d.ts} +1 -1
- package/dist/guest/{helpers.js → runtime/csc.js} +7 -2
- package/dist/guest/runtime/fs.d.ts +2 -0
- package/dist/guest/runtime/fs.js +6 -0
- package/dist/guest/runtime/log.d.ts +3 -0
- package/dist/guest/runtime/log.js +22 -0
- package/dist/guest/runtime/paths.d.ts +13 -0
- package/dist/guest/runtime/paths.js +14 -0
- package/dist/guest/{ports.js → runtime/ports.js} +8 -2
- package/dist/guest/runtime/process.d.ts +15 -0
- package/dist/guest/runtime/process.js +59 -0
- package/dist/guest/{project-context.js → runtime/project-context.js} +1 -1
- package/dist/guest/runtime/session.d.ts +5 -0
- package/dist/guest/runtime/session.js +10 -0
- package/dist/guest/runtime/status.d.ts +7 -0
- package/dist/guest/runtime/status.js +57 -0
- package/dist/guest/{cmdline.js → sessions/cmdline.js} +10 -4
- package/dist/guest/{ptyhost.js → sessions/pty-host.js} +12 -5
- package/dist/guest/{view.js → sessions/viewer.js} +8 -11
- package/dist/guest/setup/claude-mem.d.ts +10 -0
- package/dist/guest/setup/{claude.js → claude-mem.js} +18 -78
- package/dist/guest/setup/{claude.d.ts → claude-profile.d.ts} +0 -10
- package/dist/guest/setup/claude-profile.js +89 -0
- package/dist/guest/setup/desktop.d.ts +2 -0
- package/dist/guest/setup/desktop.js +32 -0
- package/dist/guest/setup/environment.js +28 -5
- package/dist/guest/setup/{user.d.ts → git-identity.d.ts} +0 -2
- package/dist/guest/setup/git-identity.js +34 -0
- package/dist/guest/{gitrules.d.ts → setup/git-rules.d.ts} +1 -1
- package/dist/guest/setup/git-rules.js +50 -0
- package/dist/guest/setup/hooks.js +22 -5
- package/dist/guest/setup/{policy.js → managed-policy.js} +2 -2
- package/dist/guest/toolchains/catalogue.d.ts +4 -4
- package/dist/guest/toolchains/catalogue.js +30 -7
- package/dist/guest/toolchains/detect.d.ts +12 -0
- package/dist/guest/toolchains/detect.js +54 -0
- package/dist/guest/toolchains/index.d.ts +3 -17
- package/dist/guest/toolchains/index.js +1 -106
- package/dist/guest/toolchains/install.d.ts +20 -0
- package/dist/guest/toolchains/install.js +29 -0
- package/dist/guest/toolchains/languages/go.d.ts +3 -0
- package/dist/guest/toolchains/{go.js → languages/go.js} +27 -9
- package/dist/guest/toolchains/languages/java.d.ts +8 -0
- package/dist/guest/toolchains/{java.js → languages/java.js} +57 -18
- package/dist/guest/toolchains/languages/node.d.ts +3 -0
- package/dist/guest/toolchains/{node.js → languages/node.js} +51 -18
- package/dist/guest/toolchains/languages/php.d.ts +3 -0
- package/dist/guest/toolchains/{scripting → languages}/php.js +36 -11
- package/dist/guest/toolchains/languages/python-tools.d.ts +3 -0
- package/dist/guest/toolchains/languages/python-tools.js +12 -0
- package/dist/guest/toolchains/languages/python.d.ts +3 -0
- package/dist/guest/toolchains/{python.js → languages/python.js} +29 -16
- package/dist/guest/toolchains/languages/ruby.d.ts +3 -0
- package/dist/guest/toolchains/{scripting → languages}/ruby.js +28 -10
- package/dist/guest/toolchains/leftovers.d.ts +1 -1
- package/dist/guest/toolchains/leftovers.js +13 -11
- package/dist/guest/toolchains/managers.d.ts +6 -6
- package/dist/guest/toolchains/managers.js +38 -17
- package/dist/guest/toolchains/native/binstall.d.ts +3 -2
- package/dist/guest/toolchains/native/binstall.js +20 -8
- package/dist/guest/toolchains/native/cpp.d.ts +2 -2
- package/dist/guest/toolchains/native/cpp.js +23 -8
- package/dist/guest/toolchains/native/dotnet.d.ts +5 -3
- package/dist/guest/toolchains/native/dotnet.js +72 -24
- package/dist/guest/toolchains/native/mesa.d.ts +2 -2
- package/dist/guest/toolchains/native/mesa.js +27 -10
- package/dist/guest/toolchains/native/msvc/environment.d.ts +4 -4
- package/dist/guest/toolchains/native/msvc/environment.js +30 -16
- package/dist/guest/toolchains/native/msvc/index.d.ts +3 -3
- package/dist/guest/toolchains/native/msvc/index.js +10 -8
- package/dist/guest/toolchains/native/msvc/packages.d.ts +1 -1
- package/dist/guest/toolchains/native/msvc/packages.js +69 -23
- package/dist/guest/toolchains/native/msvc/tree.d.ts +6 -6
- package/dist/guest/toolchains/native/msvc/tree.js +15 -9
- package/dist/guest/toolchains/native/rust-extras.d.ts +23 -0
- package/dist/guest/toolchains/native/rust-extras.js +100 -0
- package/dist/guest/toolchains/native/rust.d.ts +2 -2
- package/dist/guest/toolchains/native/rust.js +41 -10
- package/dist/guest/toolchains/{scripting → native}/vcruntime.d.ts +2 -2
- package/dist/guest/toolchains/{scripting → native}/vcruntime.js +17 -7
- package/dist/guest/toolchains/package-ledger.d.ts +17 -0
- package/dist/guest/toolchains/package-ledger.js +54 -0
- package/dist/guest/toolchains/plan.d.ts +3 -24
- package/dist/guest/toolchains/plan.js +99 -111
- package/dist/guest/toolchains/runtimes.d.ts +6 -6
- package/dist/guest/toolchains/runtimes.js +31 -13
- package/dist/guest/toolchains/scheduler.d.ts +22 -0
- package/dist/guest/toolchains/scheduler.js +123 -0
- package/dist/guest/toolchains/setup.d.ts +10 -0
- package/dist/guest/toolchains/setup.js +22 -0
- package/dist/guest/toolchains/state-file.d.ts +3 -0
- package/dist/guest/toolchains/state-file.js +10 -0
- package/dist/guest/toolchains/step.d.ts +24 -0
- package/dist/guest/toolchains/step.js +1 -0
- package/dist/guest/toolchains/tool-env.d.ts +12 -0
- package/dist/guest/toolchains/tool-env.js +16 -0
- package/dist/guest/toolchains/tools/cli.d.ts +10 -0
- package/dist/guest/toolchains/{cli.js → tools/cli.js} +35 -15
- package/dist/guest/toolchains/tools/git.d.ts +3 -0
- package/dist/guest/toolchains/{git.js → tools/git.js} +38 -15
- package/dist/guest/toolchains/tools/pwsh.d.ts +4 -0
- package/dist/guest/toolchains/{pwsh.js → tools/pwsh.js} +14 -7
- package/dist/guest/toolchains/{vscode-profile.d.ts → tools/vscode-profile.d.ts} +6 -6
- package/dist/guest/toolchains/{vscode-profile.js → tools/vscode-profile.js} +28 -12
- package/dist/guest/toolchains/{vscode.d.ts → tools/vscode.d.ts} +6 -6
- package/dist/guest/toolchains/{vscode.js → tools/vscode.js} +67 -21
- package/dist/guest/toolchains/version-cache.d.ts +16 -0
- package/dist/guest/toolchains/version-cache.js +67 -0
- package/dist/host/agent-commands/commands.d.ts +13 -0
- package/dist/host/agent-commands/commands.js +33 -0
- package/dist/host/agent-commands/forwarders.d.ts +7 -0
- package/dist/host/agent-commands/forwarders.js +31 -0
- package/dist/host/agent-commands/index.d.ts +4 -0
- package/dist/host/agent-commands/index.js +4 -0
- package/dist/host/agent-commands/reconcile.d.ts +12 -0
- package/dist/host/agent-commands/reconcile.js +69 -0
- package/dist/host/agent-commands/user-path.d.ts +2 -0
- package/dist/host/agent-commands/user-path.js +33 -0
- package/dist/host/audit/collect.d.ts +2 -2
- package/dist/host/audit/collect.js +59 -22
- package/dist/host/audit/log.d.ts +2 -2
- package/dist/host/audit/log.js +24 -8
- package/dist/host/{attach.d.ts → channel/attach.d.ts} +2 -2
- package/dist/host/{attach.js → channel/attach.js} +33 -15
- package/dist/host/channel/channel.d.ts +51 -0
- package/dist/host/channel/channel.js +196 -0
- package/dist/host/channel/index.d.ts +2 -0
- package/dist/host/channel/index.js +2 -0
- package/dist/host/guard/agent-files.d.ts +7 -0
- package/dist/host/guard/agent-files.js +103 -0
- package/dist/host/guard/commands.d.ts +10 -0
- package/dist/host/guard/commands.js +123 -0
- package/dist/host/guard/file-hash.d.ts +4 -0
- package/dist/host/guard/file-hash.js +37 -0
- package/dist/host/guard/git-config.d.ts +5 -0
- package/dist/host/guard/git-config.js +62 -0
- package/dist/host/guard/git-dirs.d.ts +12 -0
- package/dist/host/guard/git-dirs.js +53 -0
- package/dist/host/guard/index.d.ts +5 -0
- package/dist/host/guard/index.js +4 -0
- package/dist/host/guard/mark-of-the-web.d.ts +8 -0
- package/dist/host/guard/mark-of-the-web.js +74 -0
- package/dist/host/guard/nested-repos.d.ts +14 -0
- package/dist/host/guard/nested-repos.js +88 -0
- package/dist/host/guard/quarantine.d.ts +3 -0
- package/dist/host/guard/quarantine.js +24 -0
- package/dist/host/guard/repo-guard.d.ts +10 -0
- package/dist/host/guard/repo-guard.js +36 -0
- package/dist/host/guard/store.d.ts +40 -0
- package/dist/host/guard/store.js +145 -0
- package/dist/host/guard/types.d.ts +27 -0
- package/dist/host/guard/types.js +3 -0
- package/dist/host/guard/watch-state.d.ts +9 -0
- package/dist/host/guard/watch-state.js +26 -0
- package/dist/host/launch/boot-projects.d.ts +17 -0
- package/dist/host/launch/{projects.js → boot-projects.js} +22 -13
- package/dist/host/{database-plan.d.ts → launch/database-plan.d.ts} +5 -5
- package/dist/host/{database-plan.js → launch/database-plan.js} +24 -13
- package/dist/host/launch/generate.d.ts +4 -0
- package/dist/host/launch/generate.js +77 -0
- package/dist/host/launch/index.d.ts +10 -0
- package/dist/host/launch/index.js +10 -0
- package/dist/host/launch/mappings.d.ts +5 -5
- package/dist/host/launch/mappings.js +37 -24
- package/dist/host/launch/pc-scan.d.ts +5 -0
- package/dist/host/{pc-scan.js → launch/pc-scan.js} +20 -13
- package/dist/host/launch/project-scan.d.ts +7 -0
- package/dist/host/{project-scan.js → launch/project-scan.js} +29 -21
- package/dist/host/launch/session-file.d.ts +23 -0
- package/dist/host/launch/session-file.js +73 -0
- package/dist/host/launch/stage.d.ts +5 -5
- package/dist/host/launch/stage.js +14 -13
- package/dist/host/launch/toolchains.d.ts +4 -0
- package/dist/host/launch/toolchains.js +11 -0
- package/dist/host/launch/{wsb.d.ts → wsb-file.d.ts} +4 -2
- package/dist/host/launch/wsb-file.js +56 -0
- package/dist/host/life/crash-report.d.ts +8 -0
- package/dist/host/life/crash-report.js +87 -0
- package/dist/host/life/index.d.ts +6 -0
- package/dist/host/life/index.js +6 -0
- package/dist/host/life/keep-awake.d.ts +10 -0
- package/dist/host/life/keep-awake.js +29 -0
- package/dist/host/life/life-record.d.ts +48 -0
- package/dist/host/life/life-record.js +76 -0
- package/dist/host/life/stop-events.d.ts +27 -0
- package/dist/host/life/stop-events.js +96 -0
- package/dist/host/life/stop-warning.d.ts +4 -0
- package/dist/host/life/stop-warning.js +25 -0
- package/dist/host/life/windows-update.d.ts +3 -0
- package/dist/host/life/windows-update.js +11 -0
- package/dist/host/native.d.ts +4 -0
- package/dist/host/native.js +11 -0
- package/dist/host/network/index.d.ts +1 -0
- package/dist/host/network/index.js +1 -0
- package/dist/host/{port-forward.d.ts → network/port-forward.d.ts} +1 -1
- package/dist/host/{port-forward.js → network/port-forward.js} +16 -10
- package/dist/host/profile/accounts.d.ts +37 -0
- package/dist/host/profile/accounts.js +146 -0
- package/dist/host/profile/claude-login.d.ts +22 -0
- package/dist/host/profile/claude-login.js +57 -0
- package/dist/host/{claude-profile.d.ts → profile/claude-profile.d.ts} +9 -9
- package/dist/host/{claude-profile.js → profile/claude-profile.js} +32 -22
- package/dist/host/profile/index.d.ts +7 -0
- package/dist/host/profile/index.js +7 -0
- package/dist/host/profile/personalize.d.ts +2 -0
- package/dist/host/profile/personalize.js +127 -0
- package/dist/host/profile/reg-file.d.ts +8 -0
- package/dist/host/profile/reg-file.js +45 -0
- package/dist/host/profile/secret-files.d.ts +2 -0
- package/dist/host/profile/secret-files.js +25 -0
- package/dist/host/profile/secret-patterns.d.ts +6 -0
- package/dist/host/profile/secret-patterns.js +128 -0
- package/dist/host/profile/secrets.d.ts +12 -0
- package/dist/host/profile/secrets.js +100 -0
- package/dist/host/projects/index.d.ts +4 -0
- package/dist/host/projects/index.js +4 -0
- package/dist/host/{join.d.ts → projects/join.d.ts} +12 -9
- package/dist/host/{join.js → projects/join.js} +62 -33
- package/dist/host/projects/known.d.ts +28 -0
- package/dist/host/projects/known.js +55 -0
- package/dist/host/projects/mapper.d.ts +29 -0
- package/dist/host/projects/mapper.js +88 -0
- package/dist/host/projects/registry.d.ts +83 -0
- package/dist/host/projects/registry.js +136 -0
- package/dist/host/sandbox/doctor.d.ts +2 -0
- package/dist/host/sandbox/doctor.js +42 -0
- package/dist/host/sandbox/host-claude.d.ts +1 -0
- package/dist/host/sandbox/host-claude.js +26 -0
- package/dist/host/sandbox/index.d.ts +6 -0
- package/dist/host/sandbox/index.js +6 -0
- package/dist/host/{platform.d.ts → sandbox/platform.d.ts} +0 -5
- package/dist/host/sandbox/platform.js +60 -0
- package/dist/host/sandbox/probe.d.ts +3 -0
- package/dist/host/sandbox/probe.js +47 -0
- package/dist/host/{window.js → sandbox/window.js} +7 -5
- package/dist/host/{wsb.js → sandbox/wsb-cli.js} +31 -8
- package/dist/host/{cleanup.js → storage/cleanup.js} +27 -12
- package/dist/host/storage/index.d.ts +2 -0
- package/dist/host/storage/index.js +2 -0
- package/dist/host/storage/state-files.d.ts +4 -0
- package/dist/host/storage/state-files.js +10 -0
- package/dist/host/test-guard.js +1 -1
- package/dist/host/tools/conpty.d.ts +8 -0
- package/dist/host/tools/conpty.js +58 -0
- package/dist/host/tools/index.d.ts +2 -0
- package/dist/host/tools/index.js +2 -0
- package/dist/host/{terminal.d.ts → tools/windows-terminal.d.ts} +2 -10
- package/dist/host/{terminal.js → tools/windows-terminal.js} +33 -57
- package/dist/host/workspace-view/active-views.d.ts +3 -0
- package/dist/host/workspace-view/active-views.js +22 -0
- package/dist/host/workspace-view/index.d.ts +2 -18
- package/dist/host/workspace-view/index.js +2 -49
- package/dist/host/workspace-view/plan.d.ts +16 -0
- package/dist/host/workspace-view/plan.js +50 -0
- package/dist/host/workspace-view/rules.js +10 -3
- package/dist/host/workspace-view/view-state.d.ts +10 -0
- package/dist/host/workspace-view/view-state.js +31 -0
- package/dist/host/workspace-view/view.d.ts +1 -0
- package/dist/host/workspace-view/view.js +51 -55
- package/dist/runtime/daemon.js +4220 -1968
- package/dist/runtime/db.js +2134 -849
- package/dist/runtime/gitguard.js +29 -11
- package/dist/runtime/main.js +4687 -2243
- package/dist/runtime/netproxy.js +1644 -420
- package/dist/runtime/view.js +1356 -428
- package/dist/selftest/accounts.test.d.ts +1 -1
- package/dist/selftest/accounts.test.js +20 -17
- package/dist/selftest/agent-commands.test.d.ts +1 -1
- package/dist/selftest/agent-commands.test.js +9 -5
- package/dist/selftest/audit.test.d.ts +1 -1
- package/dist/selftest/audit.test.js +46 -13
- package/dist/selftest/channel.test.d.ts +1 -1
- package/dist/selftest/channel.test.js +63 -16
- package/dist/selftest/cli.test.d.ts +1 -1
- package/dist/selftest/cli.test.js +68 -16
- package/dist/selftest/cmdline.test.d.ts +1 -1
- package/dist/selftest/cmdline.test.js +36 -7
- package/dist/selftest/config.test.d.ts +1 -1
- package/dist/selftest/config.test.js +12 -5
- package/dist/selftest/data.test.d.ts +1 -1
- package/dist/selftest/data.test.js +35 -6
- package/dist/selftest/detect.test.d.ts +1 -1
- package/dist/selftest/detect.test.js +22 -9
- package/dist/selftest/generate.test.d.ts +1 -1
- package/dist/selftest/generate.test.js +33 -9
- package/dist/selftest/git-access.test.d.ts +1 -1
- package/dist/selftest/git-access.test.js +42 -4
- package/dist/selftest/guest-boot.test.d.ts +1 -1
- package/dist/selftest/guest-boot.test.js +25 -7
- package/dist/selftest/host-sim.test.d.ts +1 -1
- package/dist/selftest/host-sim.test.js +27 -3
- package/dist/selftest/hostile-input.test.d.ts +1 -1
- package/dist/selftest/hostile-input.test.js +5 -5
- package/dist/selftest/index.d.ts +1 -1
- package/dist/selftest/index.js +72 -16
- package/dist/selftest/layout.test.d.ts +2 -0
- package/dist/selftest/layout.test.js +131 -0
- package/dist/selftest/links.test.d.ts +1 -1
- package/dist/selftest/links.test.js +16 -11
- package/dist/selftest/live-daemon.test.d.ts +1 -1
- package/dist/selftest/live-daemon.test.js +20 -8
- package/dist/selftest/live-git.test.d.ts +1 -1
- package/dist/selftest/live-git.test.js +13 -4
- package/dist/selftest/live-network.test.d.ts +1 -1
- package/dist/selftest/live-network.test.js +24 -9
- package/dist/selftest/live-projects.test.d.ts +1 -1
- package/dist/selftest/live-projects.test.js +47 -20
- package/dist/selftest/live-terminal.test.d.ts +1 -1
- package/dist/selftest/live-terminal.test.js +41 -15
- package/dist/selftest/local-config.test.d.ts +1 -1
- package/dist/selftest/local-config.test.js +64 -16
- package/dist/selftest/mirror.test.d.ts +1 -1
- package/dist/selftest/mirror.test.js +102 -32
- package/dist/selftest/network.test.d.ts +1 -1
- package/dist/selftest/network.test.js +17 -8
- package/dist/selftest/personalization.test.d.ts +1 -1
- package/dist/selftest/personalization.test.js +12 -5
- package/dist/selftest/projects.test.d.ts +1 -1
- package/dist/selftest/projects.test.js +280 -85
- package/dist/selftest/repair.test.d.ts +1 -1
- package/dist/selftest/repair.test.js +17 -5
- package/dist/selftest/repo-guard.test.d.ts +1 -1
- package/dist/selftest/repo-guard.test.js +21 -20
- package/dist/selftest/secrets.test.d.ts +1 -1
- package/dist/selftest/secrets.test.js +57 -13
- package/dist/selftest/setup.test.d.ts +1 -1
- package/dist/selftest/setup.test.js +25 -5
- package/dist/selftest/{fixtures.d.ts → support/fixtures.d.ts} +5 -3
- package/dist/selftest/{fixtures.js → support/fixtures.js} +95 -17
- package/dist/selftest/{harness.js → support/harness.js} +24 -7
- package/dist/selftest/{live.d.ts → support/live.d.ts} +2 -2
- package/dist/selftest/{live.js → support/live.js} +34 -10
- package/dist/selftest/support/suite.js +1 -0
- package/dist/selftest/sync.test.d.ts +1 -1
- package/dist/selftest/sync.test.js +64 -26
- package/dist/selftest/test-guard.test.d.ts +1 -1
- package/dist/selftest/test-guard.test.js +43 -15
- package/dist/selftest/toolchains.test.d.ts +1 -1
- package/dist/selftest/toolchains.test.js +135 -36
- package/dist/selftest/workspace-view.test.d.ts +1 -1
- package/dist/selftest/workspace-view.test.js +48 -11
- package/dist/selftest/workspace.test.d.ts +1 -1
- package/dist/selftest/workspace.test.js +13 -4
- package/dist/shared/{apps.d.ts → apps/catalogue.d.ts} +1 -11
- package/dist/shared/apps/catalogue.js +768 -0
- package/dist/shared/apps/index.d.ts +2 -0
- package/dist/shared/apps/index.js +2 -0
- package/dist/shared/apps/selection.d.ts +11 -0
- package/dist/shared/apps/selection.js +40 -0
- package/dist/shared/channel/index.d.ts +2 -0
- package/dist/shared/channel/index.js +2 -0
- package/dist/shared/channel/run-dir.d.ts +30 -0
- package/dist/shared/channel/run-dir.js +84 -0
- package/dist/shared/{schema.d.ts → channel/schema.d.ts} +38 -21
- package/dist/shared/{schema.js → channel/schema.js} +62 -35
- package/dist/shared/download/archive.d.ts +13 -0
- package/dist/shared/download/archive.js +57 -0
- package/dist/shared/download/downloader.d.ts +35 -0
- package/dist/shared/download/downloader.js +110 -0
- package/dist/shared/download/github.d.ts +16 -0
- package/dist/shared/download/github.js +74 -0
- package/dist/shared/download/http.d.ts +5 -0
- package/dist/shared/download/http.js +30 -0
- package/dist/shared/download/index.d.ts +5 -0
- package/dist/shared/download/index.js +5 -0
- package/dist/shared/download/spawn.d.ts +2 -0
- package/dist/shared/download/spawn.js +7 -0
- package/dist/shared/io/index.d.ts +3 -0
- package/dist/shared/io/index.js +3 -0
- package/dist/shared/io/json-file.d.ts +10 -0
- package/dist/shared/io/json-file.js +21 -0
- package/dist/shared/io/json.d.ts +13 -0
- package/dist/shared/io/json.js +49 -0
- package/dist/shared/{safe-remove.js → io/safe-remove.js} +32 -7
- package/dist/shared/{netrules.js → network/firewall-rules.js} +36 -5
- package/dist/shared/network/index.d.ts +2 -0
- package/dist/shared/network/index.js +2 -0
- package/dist/shared/{netpolicy.js → network/policy.js} +66 -11
- package/dist/shared/{paths.js → paths/claude-paths.js} +12 -2
- package/dist/shared/{guest-paths.d.ts → paths/guest-paths.d.ts} +6 -12
- package/dist/shared/{guest-paths.js → paths/guest-paths.js} +53 -36
- package/dist/shared/paths/index.d.ts +3 -0
- package/dist/shared/paths/index.js +3 -0
- package/dist/shared/{projects.js → paths/projects.js} +13 -3
- package/dist/shared/pty/client.d.ts +21 -0
- package/dist/shared/pty/client.js +79 -0
- package/dist/shared/{console-input.js → pty/console-input.js} +26 -6
- package/dist/shared/pty/index.d.ts +6 -0
- package/dist/shared/pty/index.js +6 -0
- package/dist/shared/pty/input-joiner.d.ts +15 -0
- package/dist/shared/pty/input-joiner.js +44 -0
- package/dist/shared/pty/output-filter.d.ts +13 -0
- package/dist/shared/pty/output-filter.js +140 -0
- package/dist/shared/pty/protocol.d.ts +36 -0
- package/dist/shared/pty/protocol.js +60 -0
- package/dist/shared/pty/terminal.d.ts +24 -0
- package/dist/shared/pty/terminal.js +147 -0
- package/dist/shared/test-guard.js +3 -1
- package/dist/sync/claude-mem.d.ts +1 -1
- package/dist/sync/claude-mem.js +9 -4
- package/dist/sync/history.d.ts +1 -29
- package/dist/sync/history.js +57 -45
- package/dist/sync/index.d.ts +5 -0
- package/dist/sync/index.js +5 -0
- package/dist/sync/sync-cycle.d.ts +18 -0
- package/dist/sync/sync-cycle.js +85 -0
- package/dist/sync/sync-state.d.ts +32 -0
- package/dist/sync/sync-state.js +37 -0
- package/dist/sync/watcher.d.ts +0 -18
- package/dist/sync/watcher.js +66 -100
- package/native/keep-awake.ps1 +8 -0
- package/native/power.cs +23 -0
- package/native/stop-events.ps1 +38 -0
- package/package.json +11 -3
- package/sandbox/linkgate.cs +98 -0
- package/sandbox/memlog.ps1 +15 -6
- package/schemas/config.schema.json +34 -1
- package/schemas/sandbox-config.schema.json +34 -1
- package/dist/cli/boot-progress.d.ts +0 -22
- package/dist/cli/boot-progress.js +0 -59
- package/dist/cli/commands/launch.d.ts +0 -32
- package/dist/cli/commands/launch.js +0 -421
- package/dist/cli/commands/maintenance.d.ts +0 -10
- package/dist/cli/commands/maintenance.js +0 -220
- package/dist/cli/commands/project.d.ts +0 -33
- package/dist/cli/commands/project.js +0 -102
- package/dist/cli/commands/projects.d.ts +0 -14
- package/dist/cli/commands/projects.js +0 -146
- package/dist/cli/commands/restart.d.ts +0 -6
- package/dist/cli/commands/restart.js +0 -95
- package/dist/cli/commands/sessions.d.ts +0 -12
- package/dist/cli/commands/sessions.js +0 -258
- package/dist/cli/menu/settings/editors.js +0 -305
- package/dist/cli/tui/dialogs.d.ts +0 -57
- package/dist/cli/tui/dialogs.js +0 -162
- package/dist/core/config.js +0 -109
- package/dist/core/project-policy.d.ts +0 -62
- package/dist/core/project-policy.js +0 -121
- package/dist/core/schema.d.ts +0 -6
- package/dist/core/schema.js +0 -8
- package/dist/core/util.d.ts +0 -62
- package/dist/core/util.js +0 -156
- package/dist/core/workspace.d.ts +0 -35
- package/dist/core/workspace.js +0 -206
- package/dist/guest/boot-env.d.ts +0 -4
- package/dist/guest/daemon.js +0 -57
- package/dist/guest/env.d.ts +0 -56
- package/dist/guest/env.js +0 -115
- package/dist/guest/gitrules.js +0 -11
- package/dist/guest/project-status.d.ts +0 -5
- package/dist/guest/project-status.js +0 -17
- package/dist/guest/setup/user.js +0 -51
- package/dist/guest/toolchains/cli.d.ts +0 -10
- package/dist/guest/toolchains/common.d.ts +0 -54
- package/dist/guest/toolchains/common.js +0 -147
- package/dist/guest/toolchains/databases/dynamodb.d.ts +0 -8
- package/dist/guest/toolchains/databases/dynamodb.js +0 -52
- package/dist/guest/toolchains/databases/index.d.ts +0 -6
- package/dist/guest/toolchains/databases/index.js +0 -62
- package/dist/guest/toolchains/databases/mongodb.d.ts +0 -3
- package/dist/guest/toolchains/databases/mongodb.js +0 -31
- package/dist/guest/toolchains/databases/mysql.d.ts +0 -3
- package/dist/guest/toolchains/databases/mysql.js +0 -38
- package/dist/guest/toolchains/databases/postgres.d.ts +0 -5
- package/dist/guest/toolchains/databases/postgres.js +0 -38
- package/dist/guest/toolchains/databases/redis.d.ts +0 -3
- package/dist/guest/toolchains/databases/redis.js +0 -16
- package/dist/guest/toolchains/git.d.ts +0 -3
- package/dist/guest/toolchains/go.d.ts +0 -3
- package/dist/guest/toolchains/java.d.ts +0 -8
- package/dist/guest/toolchains/node.d.ts +0 -3
- package/dist/guest/toolchains/pwsh.d.ts +0 -4
- package/dist/guest/toolchains/python.d.ts +0 -3
- package/dist/guest/toolchains/scripting/php.d.ts +0 -3
- package/dist/guest/toolchains/scripting/ruby.d.ts +0 -3
- package/dist/host/accounts.d.ts +0 -32
- package/dist/host/accounts.js +0 -128
- package/dist/host/agent-commands.d.ts +0 -25
- package/dist/host/agent-commands.js +0 -145
- package/dist/host/channel.d.ts +0 -38
- package/dist/host/channel.js +0 -163
- package/dist/host/generate.d.ts +0 -13
- package/dist/host/generate.js +0 -115
- package/dist/host/launch/projects.d.ts +0 -17
- package/dist/host/launch/wsb.js +0 -34
- package/dist/host/motw.d.ts +0 -17
- package/dist/host/motw.js +0 -74
- package/dist/host/pc-scan.d.ts +0 -6
- package/dist/host/personalize.d.ts +0 -10
- package/dist/host/personalize.js +0 -97
- package/dist/host/platform.js +0 -129
- package/dist/host/project-scan.d.ts +0 -7
- package/dist/host/projects.d.ts +0 -123
- package/dist/host/projects.js +0 -196
- package/dist/host/repo-guard.d.ts +0 -43
- package/dist/host/repo-guard.js +0 -347
- package/dist/host/secrets.d.ts +0 -14
- package/dist/host/secrets.js +0 -133
- package/dist/host/stops.d.ts +0 -67
- package/dist/host/stops.js +0 -126
- package/dist/shared/apps.js +0 -114
- package/dist/shared/download.d.ts +0 -63
- package/dist/shared/download.js +0 -238
- package/dist/shared/pty-client.d.ts +0 -108
- package/dist/shared/pty-client.js +0 -406
- package/dist/shared/rundir.d.ts +0 -41
- package/dist/shared/rundir.js +0 -96
- /package/dist/{guest/daemon.d.ts → cli/tui/list/list-types.js} +0 -0
- /package/dist/{guest/db.d.ts → cli/tui/screen.js} +0 -0
- /package/dist/core/{detect-databases.d.ts → detect/databases.d.ts} +0 -0
- /package/dist/{guest/toolchains → core/detect}/versions.d.ts +0 -0
- /package/dist/guest/{setup/agents.d.ts → agents/agent-installer.d.ts} +0 -0
- /package/dist/guest/{audit-parse.d.ts → audit/parse.d.ts} +0 -0
- /package/dist/guest/{guide.d.ts → boot/guide.d.ts} +0 -0
- /package/dist/guest/daemon/{shutdown.d.ts → idle-shutdown.d.ts} +0 -0
- /package/dist/guest/daemon/{session.d.ts → sessions.d.ts} +0 -0
- /package/dist/guest/{main.d.ts → entries/daemon.d.ts} +0 -0
- /package/dist/guest/{netproxy.d.ts → entries/db.d.ts} +0 -0
- /package/dist/{selftest/suite.js → guest/entries/gitguard.d.ts} +0 -0
- /package/dist/guest/{gitguard.d.ts → git/decision.d.ts} +0 -0
- /package/dist/guest/{ports.d.ts → runtime/ports.d.ts} +0 -0
- /package/dist/guest/{project-context.d.ts → runtime/project-context.d.ts} +0 -0
- /package/dist/guest/{cmdline.d.ts → sessions/cmdline.d.ts} +0 -0
- /package/dist/guest/{ptyhost.d.ts → sessions/pty-host.d.ts} +0 -0
- /package/dist/guest/{view.d.ts → sessions/viewer.d.ts} +0 -0
- /package/dist/guest/setup/{policy.d.ts → managed-policy.d.ts} +0 -0
- /package/dist/host/{window.d.ts → sandbox/window.d.ts} +0 -0
- /package/dist/host/{wsb.d.ts → sandbox/wsb-cli.d.ts} +0 -0
- /package/dist/host/{cleanup.d.ts → storage/cleanup.d.ts} +0 -0
- /package/dist/selftest/{harness.d.ts → support/harness.d.ts} +0 -0
- /package/dist/selftest/{suite.d.ts → support/suite.d.ts} +0 -0
- /package/dist/shared/{safe-remove.d.ts → io/safe-remove.d.ts} +0 -0
- /package/dist/shared/{netrules.d.ts → network/firewall-rules.d.ts} +0 -0
- /package/dist/shared/{netpolicy.d.ts → network/policy.d.ts} +0 -0
- /package/dist/shared/{paths.d.ts → paths/claude-paths.d.ts} +0 -0
- /package/dist/shared/{projects.d.ts → paths/projects.d.ts} +0 -0
- /package/dist/shared/{console-input.d.ts → pty/console-input.d.ts} +0 -0
|
@@ -1,220 +0,0 @@
|
|
|
1
|
-
// sync, logs, clean, config, doctor, host-claude and the internal sync watcher.
|
|
2
|
-
import fs from 'node:fs';
|
|
3
|
-
import path from 'node:path';
|
|
4
|
-
import { pathToFileURL } from 'node:url';
|
|
5
|
-
import _ from 'lodash';
|
|
6
|
-
import { DEFAULTS, userConfigPath, userDir } from '../../core/config.js';
|
|
7
|
-
import { allowedAnswer, allowStorePath, applyOverrides, describeOverrides, isTrusted, LOCAL_CONFIG_NAME, loosenedRequests, normalizeOverrides, OUTSIDE_FOLDER, outsideKey, outsideMappings, readLocalConfig, trustStorePath } from '../../core/local-config.js';
|
|
8
|
-
import { guestWorkspaceOf, previewGuest } from '../../core/workspace.js';
|
|
9
|
-
import { assertNoLinks, dirExists, expandPath, fail, plainText, safeText, sleep, writeJson } from '../../core/util.js';
|
|
10
|
-
import { humanBytes } from '../../core/disk.js';
|
|
11
|
-
import { AuditLog } from '../../host/audit/log.js';
|
|
12
|
-
import { readKnown, readRegistry } from '../../host/projects.js';
|
|
13
|
-
import { detectWsb } from '../../host/wsb.js';
|
|
14
|
-
import { describePrune, pruneStorage } from '../../host/cleanup.js';
|
|
15
|
-
import { doctorRows, hostClaude, insideSandbox, isSandboxRunning } from '../../host/platform.js';
|
|
16
|
-
import { readSandboxStatus } from '../../shared/rundir.js';
|
|
17
|
-
import { syncBack, watch } from '../../sync/watcher.js';
|
|
18
|
-
import { printJson, table } from './context.js';
|
|
19
|
-
import { c } from '../colors.js';
|
|
20
|
-
export const sync = (ctx) => {
|
|
21
|
-
const running = isSandboxRunning();
|
|
22
|
-
const result = syncBack(ctx.dataPath, !running);
|
|
23
|
-
console.log('History: ' + result.history + ' item(s) synced back. claude-mem: ' + result.claudeMem + (running ? ' (claude-mem syncs when the sandbox closes)' : ''));
|
|
24
|
-
return 0;
|
|
25
|
-
};
|
|
26
|
-
const newestLog = (dir) => {
|
|
27
|
-
if (!fs.existsSync(dir))
|
|
28
|
-
return null;
|
|
29
|
-
const logs = fs.readdirSync(dir).filter((f) => /^(guest|daemon|bootstrap)-.*\.log$/.test(f) && fs.lstatSync(path.join(dir, f)).isFile());
|
|
30
|
-
const newest = _.maxBy(logs, (f) => fs.statSync(path.join(dir, f)).mtimeMs);
|
|
31
|
-
return newest ? path.join(dir, newest) : null;
|
|
32
|
-
};
|
|
33
|
-
export const logs = async (ctx) => {
|
|
34
|
-
const dir = path.join(ctx.dataPath, 'logs');
|
|
35
|
-
// The sandbox writes this folder: never read through a link it planted there.
|
|
36
|
-
assertNoLinks(ctx.dataPath, dir);
|
|
37
|
-
const file = newestLog(dir) ?? fail('No sandbox logs yet in ' + dir + '.', 'Logs appear after the first start (sandbox claude).');
|
|
38
|
-
console.log('== ' + file + ' ==');
|
|
39
|
-
let printed = 0;
|
|
40
|
-
// The log is written inside the sandbox: read only its tail, and make it safe for your terminal.
|
|
41
|
-
const print = () => {
|
|
42
|
-
const size = fs.statSync(file).size;
|
|
43
|
-
const from = printed === 0 ? Math.max(0, size - 64 * 1024) : printed;
|
|
44
|
-
if (size <= from)
|
|
45
|
-
return;
|
|
46
|
-
const fd = fs.openSync(file, 'r');
|
|
47
|
-
const buffer = Buffer.alloc(Math.min(size - from, 4 * 1024 * 1024));
|
|
48
|
-
fs.readSync(fd, buffer, 0, buffer.length, from);
|
|
49
|
-
fs.closeSync(fd);
|
|
50
|
-
const text = safeText(buffer.toString('utf8'));
|
|
51
|
-
process.stdout.write(printed === 0 ? text.split('\n').slice(-120).join('\n') : text);
|
|
52
|
-
printed = from + buffer.length;
|
|
53
|
-
};
|
|
54
|
-
print();
|
|
55
|
-
if (ctx.options.follow)
|
|
56
|
-
console.error('(following; Ctrl+C to stop)');
|
|
57
|
-
while (ctx.options.follow) {
|
|
58
|
-
await sleep(1000);
|
|
59
|
-
print();
|
|
60
|
-
}
|
|
61
|
-
return 0;
|
|
62
|
-
};
|
|
63
|
-
export const clean = (ctx) => {
|
|
64
|
-
const running = isSandboxRunning() ? readSandboxStatus(ctx.dataPath)?.launchId : undefined;
|
|
65
|
-
console.log('Cleanup: ' + describePrune(pruneStorage(ctx.storageRoot, { launchDays: ctx.options.days, keep: _.compact([running]) })));
|
|
66
|
-
return 0;
|
|
67
|
-
};
|
|
68
|
-
const initConfig = () => {
|
|
69
|
-
const file = userConfigPath();
|
|
70
|
-
if (fs.existsSync(file))
|
|
71
|
-
fail(file + ' already exists.');
|
|
72
|
-
fs.mkdirSync(path.join(userDir(), 'hooks', 'pre-agent'), { recursive: true });
|
|
73
|
-
// The schema sits next to the file (a local path), so editors trust it and show docs and autocomplete.
|
|
74
|
-
writeJson(file, { $schema: './config.schema.json', ...DEFAULTS });
|
|
75
|
-
console.log('Created ' + file + '. It lists every setting with its default; delete the ones you do not change.');
|
|
76
|
-
console.log('Your own hook scripts go in ' + path.join(userDir(), 'hooks') + '\\{pre-provision,pre-agent,post-agent}.');
|
|
77
|
-
console.log('For editor help in every project\'s .sandbox-config.json, run: sandbox config schema');
|
|
78
|
-
return 0;
|
|
79
|
-
};
|
|
80
|
-
/**
|
|
81
|
-
* VS Code setting that maps every .sandbox-config.json (and the user config) to the local schema files, so project
|
|
82
|
-
* files need no "$schema" line and nothing is fetched from the internet (remote schemas need trusting).
|
|
83
|
-
*/
|
|
84
|
-
const printSchemaSettings = () => {
|
|
85
|
-
const url = (name) => pathToFileURL(path.join(userDir(), name)).href;
|
|
86
|
-
const setting = {
|
|
87
|
-
'json.schemas': [
|
|
88
|
-
{ fileMatch: ['**/.sandbox-config.json'], url: url('sandbox-config.schema.json') },
|
|
89
|
-
{ fileMatch: ['**/.agent-sandbox/config.json'], url: url('config.schema.json') },
|
|
90
|
-
],
|
|
91
|
-
};
|
|
92
|
-
console.log('Add this to your VS Code settings.json (Ctrl+Shift+P > "Preferences: Open User Settings (JSON)"):\n');
|
|
93
|
-
console.log(JSON.stringify(setting, null, 2).slice(2, -2));
|
|
94
|
-
console.log('\nThe schema files live in ' + userDir() + ' and are refreshed whenever the sandbox command runs.');
|
|
95
|
-
return 0;
|
|
96
|
-
};
|
|
97
|
-
/**
|
|
98
|
-
* `sandbox config check`: the folder's .sandbox-config.json validated and described (risky settings flagged, approval
|
|
99
|
-
* state), without launching. Fails with the same message a launch would give when the file is not valid.
|
|
100
|
-
*/
|
|
101
|
-
const checkLocalConfig = (ctx) => {
|
|
102
|
-
const dir = path.resolve(ctx.options.workspace ?? process.cwd());
|
|
103
|
-
const file = readLocalConfig(dir);
|
|
104
|
-
if (!file) {
|
|
105
|
-
console.log('No ' + LOCAL_CONFIG_NAME + ' in ' + dir + '; the sandbox uses your own settings only.');
|
|
106
|
-
return 0;
|
|
107
|
-
}
|
|
108
|
-
const overrides = normalizeOverrides(file.data, dir, file.path);
|
|
109
|
-
const approved = isTrusted(trustStorePath(ctx.storageRoot), file.path, file.hash);
|
|
110
|
-
console.log(file.path + ': valid. ' + (approved ? 'Approved (this exact version).' : 'Not approved yet: the next launch asks you.') + '\n');
|
|
111
|
-
for (const line of describeOverrides(overrides, dir))
|
|
112
|
-
console.log(' ' + safeText(line));
|
|
113
|
-
// What a launch from here would do with each folder and each looser setting, without launching.
|
|
114
|
-
const config = ctx.loaded.config;
|
|
115
|
-
const store = allowStorePath(ctx.storageRoot);
|
|
116
|
-
const workspaceGuest = guestWorkspaceOf(applyOverrides(config, overrides), dir).guest;
|
|
117
|
-
const outside = outsideMappings(dir, overrides.mappings);
|
|
118
|
-
const policy = config.projects.allowOutsideMappings;
|
|
119
|
-
const rows = (overrides.mappings ?? []).map((m) => {
|
|
120
|
-
const where = previewGuest(m, dir, workspaceGuest);
|
|
121
|
-
const status = !dirExists(m.host) ? (m.optional ? 'not on this PC: skipped' : c.red('the folder does not exist: create it, fix the path, or add "optional": true'))
|
|
122
|
-
: !outside.includes(m) ? (m.guest ? 'inside the project' : 'inside the project (already in the sandbox there)')
|
|
123
|
-
: policy === true ? 'outside the project, allowed (projects.allowOutsideMappings is true)'
|
|
124
|
-
: policy === false ? c.red('outside the project: refused (projects.allowOutsideMappings is false)')
|
|
125
|
-
: allowedAnswer(store, file.path, OUTSIDE_FOLDER, outsideKey(m)) === true ? 'outside the project, allowed (you said yes)'
|
|
126
|
-
: c.yellow('outside the project: the next interactive launch asks you');
|
|
127
|
-
return [(m.readOnly ? 'ro ' : 'rw ') + safeText(m.host), '-> ' + safeText(where.guest), status];
|
|
128
|
-
});
|
|
129
|
-
if (rows.length) {
|
|
130
|
-
console.log('\nFolders (where they appear in the sandbox):');
|
|
131
|
-
table(rows);
|
|
132
|
-
}
|
|
133
|
-
for (const m of overrides.mappings ?? []) {
|
|
134
|
-
const note = dirExists(m.host) ? previewGuest(m, dir, workspaceGuest).note : null;
|
|
135
|
-
if (note)
|
|
136
|
-
console.log(' ' + safeText(note));
|
|
137
|
-
}
|
|
138
|
-
const looser = loosenedRequests(config, overrides);
|
|
139
|
-
if (looser.length)
|
|
140
|
-
console.log('\nLooser than your settings (used only if you allow it for this project):');
|
|
141
|
-
for (const a of looser) {
|
|
142
|
-
const answer = allowedAnswer(store, file.path, a.key, a.wanted);
|
|
143
|
-
console.log(' ' + a.key + ' = ' + JSON.stringify(a.wanted) + ': ' + (answer === true ? 'allowed (you said yes)' : answer === false ? 'not used (you said no)' : 'the next interactive launch asks you'));
|
|
144
|
-
}
|
|
145
|
-
return 0;
|
|
146
|
-
};
|
|
147
|
-
export const config = (ctx) => {
|
|
148
|
-
const [action = 'summary'] = ctx.options.positionals;
|
|
149
|
-
switch (action) {
|
|
150
|
-
case 'summary':
|
|
151
|
-
table([
|
|
152
|
-
['Settings file', ctx.loaded.configPath ?? userConfigPath() + ' (does not exist yet; sandbox config init creates it)'],
|
|
153
|
-
['Default agent', ctx.loaded.config.defaultHarness],
|
|
154
|
-
['Storage', ctx.storageRoot],
|
|
155
|
-
['Memory', String(ctx.loaded.config.sandbox.memoryMb) + (ctx.loaded.config.sandbox.memoryMb === 'auto' ? '' : ' MB')],
|
|
156
|
-
]);
|
|
157
|
-
console.log('\nChange settings in the menu (sandbox > Settings). All of them as JSON: sandbox config show');
|
|
158
|
-
return 0;
|
|
159
|
-
case 'path':
|
|
160
|
-
console.log(ctx.loaded.configPath ?? userConfigPath() + ' (does not exist yet)');
|
|
161
|
-
return 0;
|
|
162
|
-
case 'init': return initConfig();
|
|
163
|
-
case 'show':
|
|
164
|
-
console.log(JSON.stringify(ctx.loaded.config, null, 2));
|
|
165
|
-
return 0;
|
|
166
|
-
case 'schema': return printSchemaSettings();
|
|
167
|
-
case 'check': return checkLocalConfig(ctx);
|
|
168
|
-
default: fail('Unknown config action "' + action + '".', 'Use one of: sandbox config show | path | init | schema | check');
|
|
169
|
-
}
|
|
170
|
-
};
|
|
171
|
-
export const doctor = (ctx) => {
|
|
172
|
-
const rows = doctorRows(ctx.loaded.config, ctx.options.harness ?? ctx.loaded.config.defaultHarness, ctx.storageRoot, ctx.loaded.configPath);
|
|
173
|
-
// Inside a sandbox the feature and "running" rows describe the sandbox itself, and the host rows describe nothing useful.
|
|
174
|
-
if (insideSandbox()) {
|
|
175
|
-
table([['Where', 'inside a Windows Sandbox started by this tool (run doctor on your PC to check the PC)'], ...rows.filter(([name]) => name === 'Config file')]);
|
|
176
|
-
return 0;
|
|
177
|
-
}
|
|
178
|
-
// Several projects: the roots mapped at every start, what the running sandbox has, and whether wsb share is there.
|
|
179
|
-
const p = ctx.loaded.config.projects;
|
|
180
|
-
const registry = isSandboxRunning() ? readRegistry(ctx.storageRoot) : null;
|
|
181
|
-
const wsb = p.wsbShare ? detectWsb() : null;
|
|
182
|
-
table([
|
|
183
|
-
...rows,
|
|
184
|
-
['Project roots', p.roots.length ? p.roots.map((r) => expandPath(r, ctx.loaded.base)).join(', ') : 'none (sandbox projects roots add <folder>)'],
|
|
185
|
-
['All projects', p.all ? 'on: ' + readKnown(ctx.storageRoot).length + ' known project(s) mapped at every start (' + p.exclude.length + ' excluded)' : 'off'],
|
|
186
|
-
['Projects running', registry ? registry.projects.map((x) => x.name + ' (' + x.mechanism + ')').join(', ') : '-'],
|
|
187
|
-
['wsb share', !p.wsbShare ? 'off (projects.wsbShare)' : wsb ? 'available: ' + wsb.exe + (wsb.version ? ' ' + wsb.version : '') + ' (untested; a failure offers a restart instead)' : 'not on this Windows (needs Windows 11 24H2+ with the updated Windows Sandbox): folders outside your roots need a restart'],
|
|
188
|
-
]);
|
|
189
|
-
return 0;
|
|
190
|
-
};
|
|
191
|
-
export const claudeHost = (ctx) => hostClaude(ctx.storageRoot, ctx.options.personal, ctx.options.passthrough);
|
|
192
|
-
export const watcher = (ctx) => watch(ctx.dataPath);
|
|
193
|
-
const KINDS = ['proc', 'file', 'session', 'guard', 'note'];
|
|
194
|
-
const KIND_LABEL = { proc: 'program', file: 'file', session: 'session', guard: 'GUARD', note: 'note' };
|
|
195
|
-
/** `sandbox audit`: the audit log of the last days (audit.enabled), newest last. */
|
|
196
|
-
export const audit = async (ctx) => {
|
|
197
|
-
const settings = ctx.loaded.config.audit;
|
|
198
|
-
const kind = ctx.options.kind;
|
|
199
|
-
if (kind && !KINDS.includes(kind))
|
|
200
|
-
fail('Unknown kind "' + kind + '".', 'Use one of: ' + KINDS.join(', '));
|
|
201
|
-
const log = new AuditLog(AuditLog.dirFor(ctx.storageRoot, ctx.dataPath), settings);
|
|
202
|
-
const events = log.read({ days: ctx.options.days, kinds: kind ? [kind] : undefined, grep: ctx.options.grep });
|
|
203
|
-
if (printJson(ctx, events))
|
|
204
|
-
return 0;
|
|
205
|
-
if (!events.length) {
|
|
206
|
-
console.log(settings.enabled ? 'Nothing in the audit log for the last ' + ctx.options.days + ' day(s).' : 'The audit log is off. Turn it on in the menu (Settings > Security & privacy > Audit log) or with audit.enabled in your config.');
|
|
207
|
-
return 0;
|
|
208
|
-
}
|
|
209
|
-
for (const e of events) {
|
|
210
|
-
// What the sandbox reported is text from the sandbox: no control codes reach your terminal.
|
|
211
|
-
const [p, cmd, parent, dir, act] = [e.p, e.c, e.pp, e.w, e.a].map((v) => plainText(v ?? ''));
|
|
212
|
-
const what = e.k === 'proc' ? (cmd || p) + (parent ? c.dim(' <- ' + path.win32.basename(parent)) : '')
|
|
213
|
-
: e.k === 'file' ? act + ' ' + p + c.dim(' in ' + dir)
|
|
214
|
-
: e.k === 'session' ? act + ' ' + p + c.dim(' ' + dir + ' ' + cmd)
|
|
215
|
-
: p;
|
|
216
|
-
console.log(c.dim(new Date(e.t).toLocaleString()) + ' ' + (e.k === 'guard' ? c.yellow(KIND_LABEL[e.k].padEnd(8)) : KIND_LABEL[e.k].padEnd(8)) + what + (e.n && e.n > 1 ? c.dim(' x' + e.n) : ''));
|
|
217
|
-
}
|
|
218
|
-
console.log(c.dim('\n' + events.length + ' event(s); the log takes ' + humanBytes(log.bytes()) + ' (' + AuditLog.dirFor(ctx.storageRoot, ctx.dataPath) + ').'));
|
|
219
|
-
return 0;
|
|
220
|
-
};
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import type { SandboxStatus } from '../../core/types.js';
|
|
2
|
-
import { type Missing } from '../../core/project-policy.js';
|
|
3
|
-
import { type RegistryEntry } from '../../host/projects.js';
|
|
4
|
-
import type { ProjectSpecT } from '../../shared/schema.js';
|
|
5
|
-
import { type Context } from './context.js';
|
|
6
|
-
/** The folder the command is about: --workspace, else the current one. */
|
|
7
|
-
export declare const hereDir: (ctx: Context) => string;
|
|
8
|
-
export interface Located {
|
|
9
|
-
project: RegistryEntry | null;
|
|
10
|
-
guestDir: string | null;
|
|
11
|
-
}
|
|
12
|
-
/** Where this folder is in the running sandbox, if it is in it at all (nothing is registered). */
|
|
13
|
-
export declare const locateHere: (ctx: Context, status: SandboxStatus | null) => Located;
|
|
14
|
-
export interface Joined {
|
|
15
|
-
project: RegistryEntry | null;
|
|
16
|
-
guestDir: string;
|
|
17
|
-
spec: ProjectSpecT | null;
|
|
18
|
-
harness: string | null;
|
|
19
|
-
notes: string[];
|
|
20
|
-
}
|
|
21
|
-
/** restart.ts: the sandbox was restarted for a project in this command. */
|
|
22
|
-
export declare const markRestarted: () => void;
|
|
23
|
-
export declare const joinHere: (ctx: Context, status: SandboxStatus, o?: {
|
|
24
|
-
noRestart?: boolean;
|
|
25
|
-
}) => Promise<Joined>;
|
|
26
|
-
/** The command that restarts the running sandbox with this folder's boot wishes (consent given by --yes). */
|
|
27
|
-
export declare const restartCommand: (ctx: Context, host: string) => string;
|
|
28
|
-
/** Joined without what it wants at boot: what is missing, how to restart with it, and how to always have it. */
|
|
29
|
-
export declare const missingNotes: (ctx: Context, name: string, host: string, missing: Missing, shown?: boolean) => string[];
|
|
30
|
-
/** Waits until the sandbox has set a project up, with its progress on a spinner (plain lines without a terminal). */
|
|
31
|
-
export declare const provisionJoined: (ctx: Context, joined: Joined) => Promise<void>;
|
|
32
|
-
/** joinHere, then (for another project) waits until the sandbox has set it up. */
|
|
33
|
-
export declare const readyHere: (ctx: Context, status: SandboxStatus) => Promise<Joined>;
|
|
@@ -1,102 +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 { select } from '@inquirer/prompts';
|
|
6
|
-
import { describeMissing, missingTip } from '../../core/project-policy.js';
|
|
7
|
-
import { askYesNo } from '../../core/prompt.js';
|
|
8
|
-
import { isInsideOrEqual } from '../../core/util.js';
|
|
9
|
-
import { resolveRun } from '../../core/workspace.js';
|
|
10
|
-
import { currentSessions, prepareProject } from '../../host/channel.js';
|
|
11
|
-
import { projectHere, readRegistry } from '../../host/projects.js';
|
|
12
|
-
import { joinRunning } from '../../host/join.js';
|
|
13
|
-
import { c } from '../colors.js';
|
|
14
|
-
import { working } from '../progress.js';
|
|
15
|
-
import { describeSessions } from './restart.js';
|
|
16
|
-
import { guestPathFor, sandboxAlive } from './context.js';
|
|
17
|
-
/** The folder the command is about: --workspace, else the current one. */
|
|
18
|
-
export const hereDir = (ctx) => path.resolve(ctx.options.workspace ?? process.cwd());
|
|
19
|
-
/** Where this folder is in the running sandbox, if it is in it at all (nothing is registered). */
|
|
20
|
-
export const locateHere = (ctx, status) => {
|
|
21
|
-
const dir = hereDir(ctx);
|
|
22
|
-
const here = projectHere(ctx.storageRoot, dir);
|
|
23
|
-
if (here)
|
|
24
|
-
return here;
|
|
25
|
-
// A sandbox started before projects existed: only its launch folder.
|
|
26
|
-
if (!readRegistry(ctx.storageRoot) && status && isInsideOrEqual(status.workspaceHost, dir))
|
|
27
|
-
return { project: null, guestDir: guestPathFor(dir, status.workspaceHost, status.guestWorkspace) };
|
|
28
|
-
return { project: null, guestDir: null };
|
|
29
|
-
};
|
|
30
|
-
/**
|
|
31
|
-
* Makes this folder a project of the running sandbox (nothing to do for the launch folder and projects already in
|
|
32
|
-
* it): its .sandbox-config.json is approved like at a launch, its protections are checked, and it is made visible.
|
|
33
|
-
* Throws NeedsRestart (host/projects.ts) when that is impossible without a restart.
|
|
34
|
-
*/
|
|
35
|
-
let restartedOnce = false;
|
|
36
|
-
/** restart.ts: the sandbox was restarted for a project in this command. */
|
|
37
|
-
export const markRestarted = () => { restartedOnce = true; };
|
|
38
|
-
export const joinHere = async (ctx, status, o = {}) => {
|
|
39
|
-
const { options, loaded, packageRoot, storageRoot, dataPath } = ctx;
|
|
40
|
-
const dir = hereDir(ctx);
|
|
41
|
-
// A sandbox started before projects existed: only its launch folder (guestPathFor explains why otherwise).
|
|
42
|
-
if (!readRegistry(storageRoot))
|
|
43
|
-
return { project: null, guestDir: guestPathFor(dir, status.workspaceHost, status.guestWorkspace), spec: null, harness: null, notes: [] };
|
|
44
|
-
let shown = false;
|
|
45
|
-
const joined = await joinRunning({
|
|
46
|
-
storageRoot, dataPath, packageRoot, hostDir: dir, wsbShare: loaded.config.projects.wsbShare,
|
|
47
|
-
resolve: (root) => resolveRun({
|
|
48
|
-
packageRoot, loaded, cwd: root, workspace: root, harness: options.harness, noAgent: options.noAgent,
|
|
49
|
-
noLocalConfig: options.noLocalConfig, trustConfig: options.trustConfig, scripts: options.scripts, databases: options.databases,
|
|
50
|
-
nodeVersion: options.node, pythonVersion: options.python, ask: askYesNo,
|
|
51
|
-
}),
|
|
52
|
-
// Something it wants only comes with a restart: --yes restarts, a terminal asks, anything else continues.
|
|
53
|
-
decide: async (name, missing) => {
|
|
54
|
-
// Once per command: what a restart could not give (see the launch notes) never restarts it again.
|
|
55
|
-
if (o.noRestart || restartedOnce)
|
|
56
|
-
return 'continue';
|
|
57
|
-
if (options.yes)
|
|
58
|
-
return 'restart';
|
|
59
|
-
if (!process.stdin.isTTY || !process.stdout.isTTY)
|
|
60
|
-
return 'continue';
|
|
61
|
-
console.log(c.yellow(describeMissing(name, missing)));
|
|
62
|
-
shown = true;
|
|
63
|
-
const sessions = currentSessions(dataPath);
|
|
64
|
-
return select({
|
|
65
|
-
message: 'What now?',
|
|
66
|
-
choices: [
|
|
67
|
-
{ name: 'Continue anyway (join without them)', value: 'continue' },
|
|
68
|
-
{ name: 'Restart with them (' + (sessions.length ? describeSessions(sessions) + ' will end' : 'no session is running') + ')', value: 'restart' },
|
|
69
|
-
{ name: 'Cancel', value: 'cancel' },
|
|
70
|
-
],
|
|
71
|
-
default: 'continue',
|
|
72
|
-
});
|
|
73
|
-
},
|
|
74
|
-
});
|
|
75
|
-
const harness = joined.run && joined.run.harnessName !== 'none' ? joined.run.harnessName : null;
|
|
76
|
-
const notes = joined.missing ? [...joined.notes, ...missingNotes(ctx, joined.project.name, joined.project.host, joined.missing, shown)] : joined.notes;
|
|
77
|
-
return { project: joined.project, guestDir: joined.guestDir, spec: joined.spec, harness, notes };
|
|
78
|
-
};
|
|
79
|
-
/** The command that restarts the running sandbox with this folder's boot wishes (consent given by --yes). */
|
|
80
|
-
export const restartCommand = (ctx, host) => 'sandbox ' + (ctx.options.noAgent ? 'start' : ctx.options.harness ?? ctx.loaded.config.defaultHarness) + ' --workspace "' + host + '" --yes';
|
|
81
|
-
/** Joined without what it wants at boot: what is missing, how to restart with it, and how to always have it. */
|
|
82
|
-
export const missingNotes = (ctx, name, host, missing, shown = false) => [
|
|
83
|
-
...(shown ? [] : [c.yellow(describeMissing(name, missing))]),
|
|
84
|
-
'Joined without them. To restart the sandbox with them (its sessions end): ' + restartCommand(ctx, host),
|
|
85
|
-
c.dim(missingTip(missing)),
|
|
86
|
-
];
|
|
87
|
-
/** Waits until the sandbox has set a project up, with its progress on a spinner (plain lines without a terminal). */
|
|
88
|
-
export const provisionJoined = async (ctx, joined) => {
|
|
89
|
-
if (!joined.spec)
|
|
90
|
-
return;
|
|
91
|
-
const spec = joined.spec;
|
|
92
|
-
let step = 'starting';
|
|
93
|
-
await working(() => 'Setting up ' + spec.name + ' in the running sandbox: ' + step, () => prepareProject(ctx.dataPath, spec, sandboxAlive, (m) => { step = m; }));
|
|
94
|
-
};
|
|
95
|
-
/** joinHere, then (for another project) waits until the sandbox has set it up. */
|
|
96
|
-
export const readyHere = async (ctx, status) => {
|
|
97
|
-
const joined = await joinHere(ctx, status);
|
|
98
|
-
for (const note of joined.notes)
|
|
99
|
-
console.log(note);
|
|
100
|
-
await provisionJoined(ctx, joined);
|
|
101
|
-
return joined;
|
|
102
|
-
};
|
|
@@ -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,95 +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 { missingTip } from '../../core/project-policy.js';
|
|
9
|
-
import { askYesNo } from '../../core/prompt.js';
|
|
10
|
-
import { fail, safeText, sleep } from '../../core/util.js';
|
|
11
|
-
import { currentSessions, execInSandbox } from '../../host/channel.js';
|
|
12
|
-
import { isSandboxRunning } from '../../host/platform.js';
|
|
13
|
-
import { readRegistry } from '../../host/projects.js';
|
|
14
|
-
import { hostDirFor, projectForGuestDir } from '../../shared/projects.js';
|
|
15
|
-
import { readSandboxStatus } from '../../shared/rundir.js';
|
|
16
|
-
import { watcherRunning } from '../../sync/watcher.js';
|
|
17
|
-
import { c } from '../colors.js';
|
|
18
|
-
import { working } from '../progress.js';
|
|
19
|
-
import { sandboxAlive } from './context.js';
|
|
20
|
-
/** "2 sessions (claude in api, codex in web)". */
|
|
21
|
-
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(', ') + ')';
|
|
22
|
-
/** The command to run again with consent, for a non-interactive terminal. */
|
|
23
|
-
const againWithYes = (ctx) => 'sandbox ' + (ctx.options.noAgent ? 'start' : ctx.options.harness ?? ctx.loaded.config.defaultHarness) + (ctx.options.terminal ? ' -t' : '') + ' --yes';
|
|
24
|
-
/** Where each running session is on this PC, so it can be reopened after the restart. */
|
|
25
|
-
const sessionsToReopen = (registry, sessions) => sessions.flatMap((s) => {
|
|
26
|
-
const project = projectForGuestDir([...registry.projects, ...registry.roots.map((r) => ({ ...r }))], s.cwd);
|
|
27
|
-
return project ? [{ harness: s.harness, hostDir: hostDirFor(project, s.cwd) }] : [];
|
|
28
|
-
});
|
|
29
|
-
/** Shuts the sandbox down and waits until it (and the background sync's final pass) is gone. */
|
|
30
|
-
const stopAndWait = async (ctx) => {
|
|
31
|
-
const status = readSandboxStatus(ctx.dataPath);
|
|
32
|
-
await working('Stopping the sandbox (history syncs back)', async () => {
|
|
33
|
-
await execInSandbox(ctx.dataPath, ['C:\\Windows\\System32\\shutdown.exe', '/s', '/t', '0'], status?.guestWorkspace ?? 'C:\\', 30, sandboxAlive).catch(() => null);
|
|
34
|
-
for (let i = 0; i < 180 && isSandboxRunning(); i++)
|
|
35
|
-
await sleep(1000);
|
|
36
|
-
if (isSandboxRunning())
|
|
37
|
-
fail('The sandbox did not shut down within 3 minutes.', 'Close its window yourself, then run the command again.');
|
|
38
|
-
// The watcher syncs history back a few seconds after the window closes; the next start needs it gone.
|
|
39
|
-
for (let i = 0; i < 60 && watcherRunning(ctx.dataPath); i++)
|
|
40
|
-
await sleep(1000);
|
|
41
|
-
});
|
|
42
|
-
};
|
|
43
|
-
export const offerRestart = async (ctx, needs, then) => {
|
|
44
|
-
const folders = needs.map((n) => n.hostDir);
|
|
45
|
-
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] + '.');
|
|
46
|
-
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.');
|
|
47
|
-
const sessions = currentSessions(ctx.dataPath);
|
|
48
|
-
// A project that only wants boot settings or folders: you already chose the restart (or gave --yes) when asked.
|
|
49
|
-
const hidden = needs.filter((n) => !n.missing);
|
|
50
|
-
for (const need of hidden)
|
|
51
|
-
console.log(c.yellow('Windows Sandbox cannot add ' + need.hostDir + ' while it runs: ' + need.reason + '.'));
|
|
52
|
-
console.log((hidden.length ? 'A restart maps ' + (hidden.length === 1 ? 'it' : 'them') + ' as well' : 'Restarting with what ' + needs.map((n) => path.basename(n.hostDir)).join(', ') + ' wants') +
|
|
53
|
-
' (and keeps ' + registry.projects.map((p) => p.host).join(', ') + '). ' +
|
|
54
|
-
(sessions.length ? describeSessions(sessions) + ' will end' : 'No session is running') + '; your files, tools, databases and logins are kept. It takes about a minute.');
|
|
55
|
-
for (const parent of _.uniq(hidden.map((n) => path.dirname(n.hostDir))))
|
|
56
|
-
console.log(c.dim('No restart next time for folders in ' + parent + ': sandbox projects roots add "' + parent + '"'));
|
|
57
|
-
for (const need of needs)
|
|
58
|
-
if (need.missing)
|
|
59
|
-
console.log(c.dim(missingTip(need.missing)));
|
|
60
|
-
const interactive = Boolean(process.stdin.isTTY && process.stdout.isTTY);
|
|
61
|
-
if (!ctx.options.yes && hidden.length) {
|
|
62
|
-
if (!interactive)
|
|
63
|
-
fail('Not restarting without your consent.', 'Run it again with --yes to restart: ' + againWithYes(ctx));
|
|
64
|
-
if (!(await askYesNo('Restart the sandbox now?'))) {
|
|
65
|
-
console.log('Nothing changed.');
|
|
66
|
-
return 1;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
const reopen = sessionsToReopen(registry, sessions);
|
|
70
|
-
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)));
|
|
71
|
-
await stopAndWait(ctx);
|
|
72
|
-
// Imported here: launch.ts imports this file (and project.ts imports describeSessions).
|
|
73
|
-
const { launch, openSession, readySandbox } = await import('./launch.js');
|
|
74
|
-
const { joinHere, markRestarted } = await import('./project.js');
|
|
75
|
-
markRestarted();
|
|
76
|
-
const keep = registry.projects.filter((p) => !p.primary && p.mechanism !== 'root').map((p) => p.host);
|
|
77
|
-
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: [] } };
|
|
78
|
-
await launch(relaunch, false, { extraProjects: [...keep, ...folders], autoSession: false, waitUntilReady: true });
|
|
79
|
-
const ready = await readySandbox(ctx.dataPath);
|
|
80
|
-
if (resume) {
|
|
81
|
-
for (const s of reopen) {
|
|
82
|
-
const at = { ...ctx, options: { ...ctx.options, workspace: s.hostDir, harness: s.harness, terminal: false, newSession: true, passthrough: [], sessions: [] } };
|
|
83
|
-
try {
|
|
84
|
-
const joined = await joinHere(at, ready, { noRestart: true });
|
|
85
|
-
for (const note of joined.notes)
|
|
86
|
-
console.log(note);
|
|
87
|
-
await openSession(at, ready, joined, { attach: false, harness: s.harness, args: ctx.loaded.config.harnesses[s.harness]?.resumeArguments ?? [], reuse: false });
|
|
88
|
-
}
|
|
89
|
-
catch (e) {
|
|
90
|
-
console.warn(c.yellow('Could not reopen ' + s.harness + ' in ' + s.hostDir + ': ' + (e instanceof Error ? e.message : String(e))));
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
return then();
|
|
95
|
-
};
|
|
@@ -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>;
|