windows-development-sandbox 1.4.1 → 1.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config.example.json +3 -1
- package/dist/api.js +27 -16
- package/dist/cli/args.d.ts +4 -6
- package/dist/cli/args.js +67 -34
- package/dist/cli/argv.d.ts +9 -0
- package/dist/cli/argv.js +22 -0
- package/dist/cli/commands/accounts.d.ts +1 -1
- package/dist/cli/commands/accounts.js +42 -27
- package/dist/cli/commands/agent-commands.d.ts +3 -3
- package/dist/cli/commands/agent-commands.js +27 -18
- package/dist/cli/commands/context.d.ts +9 -11
- package/dist/cli/commands/context.js +35 -32
- package/dist/cli/commands/data/clean.d.ts +2 -2
- package/dist/cli/commands/data/clean.js +27 -11
- package/dist/cli/commands/data/collect.d.ts +6 -3
- package/dist/cli/commands/data/collect.js +46 -15
- package/dist/cli/commands/data/index.d.ts +2 -2
- package/dist/cli/commands/data/index.js +30 -12
- package/dist/cli/commands/data/remove.d.ts +1 -1
- package/dist/cli/commands/data/remove.js +4 -4
- package/dist/cli/commands/index.d.ts +5 -4
- package/dist/cli/commands/index.js +5 -4
- package/dist/cli/commands/launch/add-root.d.ts +7 -0
- package/dist/cli/commands/launch/add-root.js +64 -0
- package/dist/cli/commands/launch/boot-progress.d.ts +7 -0
- package/dist/cli/commands/launch/boot-progress.js +48 -0
- package/dist/cli/commands/launch/boot-wants.d.ts +11 -0
- package/dist/cli/commands/launch/boot-wants.js +48 -0
- package/dist/cli/commands/launch/first-start.d.ts +10 -0
- package/dist/cli/commands/launch/first-start.js +53 -0
- package/dist/cli/commands/launch/index.d.ts +6 -0
- package/dist/cli/commands/launch/index.js +6 -0
- package/dist/cli/commands/launch/launch.d.ts +8 -0
- package/dist/cli/commands/launch/launch.js +211 -0
- package/dist/cli/commands/launch/prepare.d.ts +23 -0
- package/dist/cli/commands/launch/prepare.js +109 -0
- package/dist/cli/commands/launch/running.d.ts +45 -0
- package/dist/cli/commands/launch/running.js +218 -0
- package/dist/cli/commands/launch/summary.d.ts +8 -0
- package/dist/cli/commands/launch/summary.js +98 -0
- package/dist/cli/commands/maintenance/audit.d.ts +3 -0
- package/dist/cli/commands/maintenance/audit.js +58 -0
- package/dist/cli/commands/maintenance/clean.d.ts +2 -0
- package/dist/cli/commands/maintenance/clean.js +10 -0
- package/dist/cli/commands/maintenance/config.d.ts +2 -0
- package/dist/cli/commands/maintenance/config.js +145 -0
- package/dist/cli/commands/maintenance/doctor.d.ts +2 -0
- package/dist/cli/commands/maintenance/doctor.js +52 -0
- package/dist/cli/commands/maintenance/host-claude.d.ts +2 -0
- package/dist/cli/commands/maintenance/host-claude.js +4 -0
- package/dist/cli/commands/maintenance/index.d.ts +8 -0
- package/dist/cli/commands/maintenance/index.js +9 -0
- package/dist/cli/commands/maintenance/logs.d.ts +2 -0
- package/dist/cli/commands/maintenance/logs.js +44 -0
- package/dist/cli/commands/maintenance/sync.d.ts +2 -0
- package/dist/cli/commands/maintenance/sync.js +12 -0
- package/dist/cli/commands/maintenance/watch.d.ts +3 -0
- package/dist/cli/commands/maintenance/watch.js +6 -0
- package/dist/cli/commands/projects/describe-sessions.d.ts +3 -0
- package/dist/cli/commands/projects/describe-sessions.js +15 -0
- package/dist/cli/commands/projects/here.d.ts +38 -0
- package/dist/cli/commands/projects/here.js +145 -0
- package/dist/cli/commands/projects/index.d.ts +4 -0
- package/dist/cli/commands/projects/index.js +4 -0
- package/dist/cli/commands/projects/projects.d.ts +14 -0
- package/dist/cli/commands/projects/projects.js +213 -0
- package/dist/cli/commands/projects/restart.d.ts +15 -0
- package/dist/cli/commands/projects/restart.js +149 -0
- package/dist/cli/commands/registry.d.ts +3 -0
- package/dist/cli/commands/registry.js +34 -0
- package/dist/cli/commands/repair/checks.js +105 -29
- package/dist/cli/commands/repair/finders.d.ts +13 -10
- package/dist/cli/commands/repair/finders.js +63 -43
- package/dist/cli/commands/repair/index.d.ts +4 -4
- package/dist/cli/commands/repair/index.js +47 -21
- package/dist/cli/commands/repair/types.d.ts +2 -2
- package/dist/cli/commands/repair/types.js +7 -2
- package/dist/cli/commands/sessions/attach.d.ts +2 -0
- package/dist/cli/commands/sessions/attach.js +45 -0
- package/dist/cli/commands/sessions/control.d.ts +4 -0
- package/dist/cli/commands/sessions/control.js +62 -0
- package/dist/cli/commands/sessions/exec.d.ts +6 -0
- package/dist/cli/commands/sessions/exec.js +72 -0
- package/dist/cli/commands/sessions/index.d.ts +6 -0
- package/dist/cli/commands/sessions/index.js +9 -0
- package/dist/cli/commands/sessions/list.d.ts +15 -0
- package/dist/cli/commands/sessions/list.js +65 -0
- package/dist/cli/commands/sessions/status.d.ts +2 -0
- package/dist/cli/commands/sessions/status.js +153 -0
- package/dist/cli/commands/sessions/window.d.ts +3 -0
- package/dist/cli/commands/sessions/window.js +18 -0
- package/dist/cli/commands/setup/checks.d.ts +4 -4
- package/dist/cli/commands/setup/checks.js +36 -19
- package/dist/cli/commands/setup/facts.d.ts +6 -6
- package/dist/cli/commands/setup/facts.js +23 -11
- package/dist/cli/commands/setup/index.d.ts +1 -1
- package/dist/cli/commands/setup/index.js +25 -12
- package/dist/cli/commands/user-config.d.ts +5 -5
- package/dist/cli/commands/user-config.js +14 -12
- package/dist/cli/history.d.ts +5 -4
- package/dist/cli/history.js +23 -11
- package/dist/cli/index.d.ts +4 -14
- package/dist/cli/index.js +27 -77
- package/dist/cli/manifest.d.ts +464 -10
- package/dist/cli/manifest.js +327 -53
- package/dist/cli/menu/apps.d.ts +7 -5
- package/dist/cli/menu/apps.js +64 -16
- package/dist/cli/menu/command-fields.d.ts +15 -0
- package/dist/cli/menu/command-fields.js +23 -0
- package/dist/cli/menu/command-form.d.ts +3 -5
- package/dist/cli/menu/command-form.js +116 -48
- package/dist/cli/menu/home.d.ts +22 -0
- package/dist/cli/menu/home.js +72 -0
- package/dist/cli/menu/index.d.ts +2 -24
- package/dist/cli/menu/index.js +4 -178
- package/dist/cli/menu/menu.d.ts +23 -0
- package/dist/cli/menu/menu.js +185 -0
- package/dist/cli/menu/settings/categories.d.ts +2 -2
- package/dist/cli/menu/settings/categories.js +123 -20
- package/dist/cli/menu/settings/collections/collection-editor.d.ts +23 -0
- package/dist/cli/menu/settings/collections/collection-editor.js +89 -0
- package/dist/cli/menu/settings/collections/map-editor.d.ts +10 -0
- package/dist/cli/menu/settings/collections/map-editor.js +34 -0
- package/dist/cli/menu/settings/collections/object-list-editor.d.ts +10 -0
- package/dist/cli/menu/settings/collections/object-list-editor.js +23 -0
- package/dist/cli/menu/settings/collections/object-map-editor.d.ts +10 -0
- package/dist/cli/menu/settings/collections/object-map-editor.js +35 -0
- package/dist/cli/menu/settings/collections/string-list-editor.d.ts +12 -0
- package/dist/cli/menu/settings/collections/string-list-editor.js +39 -0
- package/dist/cli/menu/settings/config-file.d.ts +2 -2
- package/dist/cli/menu/settings/config-file.js +42 -19
- package/dist/cli/menu/settings/editor-actions.d.ts +2 -0
- package/dist/cli/menu/settings/editor-actions.js +2 -0
- package/dist/cli/menu/settings/format.d.ts +5 -0
- package/dist/cli/menu/settings/format.js +39 -0
- package/dist/cli/menu/settings/index.d.ts +1 -29
- package/dist/cli/menu/settings/index.js +1 -133
- package/dist/cli/menu/settings/object-editor.d.ts +12 -0
- package/dist/cli/menu/settings/object-editor.js +86 -0
- package/dist/cli/menu/settings/schema-node.d.ts +3 -1
- package/dist/cli/menu/settings/schema-node.js +71 -24
- package/dist/cli/menu/settings/settings-editor.d.ts +30 -0
- package/dist/cli/menu/settings/settings-editor.js +176 -0
- package/dist/cli/menu/settings/{editors.d.ts → value-editor.d.ts} +2 -13
- package/dist/cli/menu/settings/value-editor.js +137 -0
- package/dist/cli/menu/several.d.ts +4 -4
- package/dist/cli/menu/several.js +61 -20
- package/dist/cli/{colors.d.ts → output/colors.d.ts} +8 -8
- package/dist/cli/{colors.js → output/colors.js} +32 -14
- package/dist/cli/output/index.d.ts +3 -0
- package/dist/cli/output/index.js +3 -0
- package/dist/cli/output/print.d.ts +5 -0
- package/dist/cli/output/print.js +14 -0
- package/dist/cli/{progress.d.ts → output/progress.d.ts} +5 -5
- package/dist/cli/{progress.js → output/progress.js} +42 -19
- package/dist/cli/report.d.ts +2 -0
- package/dist/cli/report.js +20 -0
- package/dist/cli/tui/app.d.ts +6 -16
- package/dist/cli/tui/app.js +28 -8
- package/dist/cli/tui/dialogs/confirm-screen.d.ts +20 -0
- package/dist/cli/tui/dialogs/confirm-screen.js +50 -0
- package/dist/cli/tui/dialogs/message-screen.d.ts +17 -0
- package/dist/cli/tui/dialogs/message-screen.js +55 -0
- package/dist/cli/tui/dialogs/paragraphs.d.ts +2 -0
- package/dist/cli/tui/dialogs/paragraphs.js +5 -0
- package/dist/cli/tui/dialogs/text-screen.d.ts +26 -0
- package/dist/cli/tui/dialogs/text-screen.js +107 -0
- package/dist/cli/tui/frame.js +3 -1
- package/dist/cli/tui/index.d.ts +7 -3
- package/dist/cli/tui/index.js +4 -2
- package/dist/cli/tui/list/list-screen.d.ts +29 -0
- package/dist/cli/tui/{list-screen.js → list/list-screen.js} +86 -23
- package/dist/cli/tui/{list-screen.d.ts → list/list-types.d.ts} +0 -28
- package/dist/cli/tui/screen.d.ts +14 -0
- package/dist/cli/tui/terminal.js +34 -10
- package/dist/cli/tui/text.d.ts +2 -1
- package/dist/cli/tui/text.js +37 -7
- package/dist/cli/tui/theme.js +27 -9
- package/dist/cli/validate.d.ts +8 -8
- package/dist/cli/validate.js +32 -21
- package/dist/core/config/defaults.d.ts +2 -0
- package/dist/core/config/defaults.js +203 -0
- package/dist/core/config/index.d.ts +2 -0
- package/dist/core/config/index.js +3 -0
- package/dist/core/{config.d.ts → config/loader.d.ts} +1 -2
- package/dist/core/config/loader.js +47 -0
- package/dist/core/{detect-databases.js → detect/databases.js} +111 -23
- package/dist/core/detect/index.d.ts +4 -0
- package/dist/core/detect/index.js +4 -0
- package/dist/core/{detect-pwsh.d.ts → detect/pwsh.d.ts} +1 -1
- package/dist/core/{detect-pwsh.js → detect/pwsh.js} +25 -11
- package/dist/core/{detect-toolchains.d.ts → detect/toolchains.d.ts} +1 -1
- package/dist/core/{detect-toolchains.js → detect/toolchains.js} +42 -5
- package/dist/{guest/toolchains → core/detect}/versions.js +28 -12
- package/dist/core/disk.d.ts +2 -0
- package/dist/core/disk.js +46 -3
- package/dist/core/local-config/boot-wants.d.ts +45 -0
- package/dist/core/local-config/boot-wants.js +120 -0
- package/dist/core/local-config/file.d.ts +3 -0
- package/dist/core/local-config/file.js +16 -0
- package/dist/core/local-config/index.d.ts +5 -0
- package/dist/core/local-config/index.js +7 -0
- package/dist/core/{local-config.d.ts → local-config/overrides.d.ts} +3 -18
- package/dist/core/{local-config.js → local-config/overrides.js} +45 -52
- package/dist/core/local-config/policy.d.ts +19 -0
- package/dist/core/local-config/policy.js +45 -0
- package/dist/core/local-config/trust.d.ts +13 -0
- package/dist/core/local-config/trust.js +43 -0
- package/dist/core/package-info.d.ts +4 -0
- package/dist/core/package-info.js +13 -0
- package/dist/core/run/guest-workspace.d.ts +23 -0
- package/dist/core/run/guest-workspace.js +47 -0
- package/dist/core/run/index.d.ts +3 -0
- package/dist/core/run/index.js +3 -0
- package/dist/core/run/resolve-run.d.ts +3 -0
- package/dist/core/run/resolve-run.js +202 -0
- package/dist/core/run/versions.d.ts +13 -0
- package/dist/core/run/versions.js +65 -0
- package/dist/core/safe-paths.js +17 -5
- package/dist/core/schema/apps.d.ts +4 -4
- package/dist/core/schema/apps.js +55 -21
- package/dist/core/schema/common.d.ts +13 -10
- package/dist/core/schema/common.js +16 -10
- package/dist/core/schema/config.d.ts +15 -10
- package/dist/core/schema/config.js +78 -53
- package/dist/core/schema/databases.d.ts +4 -3
- package/dist/core/schema/databases.js +16 -12
- package/dist/core/schema/harness.d.ts +1 -1
- package/dist/core/schema/harness.js +17 -7
- package/dist/core/schema/index.d.ts +6 -0
- package/dist/core/schema/index.js +8 -0
- package/dist/core/schema/json-schema.js +10 -5
- package/dist/core/schema/profile.d.ts +4 -4
- package/dist/core/schema/profile.js +37 -17
- package/dist/core/schema/projects.d.ts +1 -1
- package/dist/core/schema/projects.js +16 -6
- package/dist/core/schema/sandbox.d.ts +11 -11
- package/dist/core/schema/sandbox.js +101 -37
- package/dist/core/schema/toolchains.d.ts +6 -1
- package/dist/core/schema/toolchains.js +84 -34
- package/dist/core/types.d.ts +19 -9
- package/dist/core/util/errors.d.ts +8 -0
- package/dist/core/util/errors.js +14 -0
- package/dist/core/util/fs.d.ts +8 -0
- package/dist/core/util/fs.js +40 -0
- package/dist/core/util/index.d.ts +7 -0
- package/dist/core/util/index.js +7 -0
- package/dist/core/util/jsonc.d.ts +6 -0
- package/dist/core/util/jsonc.js +25 -0
- package/dist/core/util/links.d.ts +10 -0
- package/dist/core/util/links.js +39 -0
- package/dist/core/util/paths.d.ts +7 -0
- package/dist/core/util/paths.js +33 -0
- package/dist/core/util/process.d.ts +15 -0
- package/dist/core/util/process.js +54 -0
- package/dist/core/util/text.d.ts +8 -0
- package/dist/core/util/text.js +8 -0
- package/dist/guest/{setup/agents.js → agents/agent-installer.js} +24 -4
- package/dist/guest/apps/after-install.d.ts +3 -0
- package/dist/guest/apps/after-install.js +47 -0
- package/dist/guest/apps/app-installer.d.ts +22 -0
- package/dist/guest/apps/app-installer.js +116 -0
- package/dist/guest/apps/find-exe.d.ts +5 -0
- package/dist/guest/apps/find-exe.js +41 -0
- package/dist/guest/apps/index.d.ts +3 -10
- package/dist/guest/apps/index.js +6 -206
- package/dist/guest/apps/resolvers.js +37 -9
- package/dist/guest/apps/shortcuts.d.ts +6 -0
- package/dist/guest/apps/shortcuts.js +28 -0
- package/dist/guest/apps/sources.d.ts +4 -0
- package/dist/guest/apps/sources.js +17 -0
- package/dist/guest/apps/unpack.d.ts +3 -0
- package/dist/guest/apps/unpack.js +47 -0
- package/dist/guest/{audit-parse.js → audit/parse.js} +39 -3
- package/dist/guest/{audit.d.ts → audit/process-audit.d.ts} +3 -1
- package/dist/guest/{audit.js → audit/process-audit.js} +33 -8
- package/dist/guest/boot/boot-env.d.ts +4 -0
- package/dist/guest/{boot-env.js → boot/boot-env.js} +7 -5
- package/dist/guest/boot/boot.d.ts +1 -0
- package/dist/guest/{main.js → boot/boot.js} +96 -50
- package/dist/guest/{guide.js → boot/guide.js} +32 -7
- package/dist/guest/{project-env.d.ts → boot/project-env.d.ts} +3 -3
- package/dist/guest/{project-env.js → boot/project-env.js} +12 -4
- package/dist/guest/boot/project-status.d.ts +5 -0
- package/dist/guest/boot/project-status.js +28 -0
- package/dist/guest/daemon/daemon.d.ts +1 -0
- package/dist/guest/daemon/daemon.js +51 -0
- package/dist/guest/daemon/exec.js +18 -6
- package/dist/guest/daemon/{shutdown.js → idle-shutdown.js} +5 -4
- package/dist/guest/daemon/{project.d.ts → project-provisioner.d.ts} +3 -3
- package/dist/guest/daemon/{project.js → project-provisioner.js} +60 -22
- package/dist/guest/daemon/relays.js +5 -3
- package/dist/guest/daemon/{session.js → sessions.js} +84 -24
- package/dist/guest/daemon/state.d.ts +4 -1
- package/dist/guest/daemon/state.js +34 -20
- package/dist/guest/databases/database-server.d.ts +13 -0
- package/dist/guest/databases/database-server.js +35 -0
- package/dist/guest/databases/dynamodb.d.ts +12 -0
- package/dist/guest/databases/dynamodb.js +81 -0
- package/dist/guest/databases/index.d.ts +2 -0
- package/dist/guest/databases/index.js +2 -0
- package/dist/guest/databases/mongodb.d.ts +7 -0
- package/dist/guest/databases/mongodb.js +46 -0
- package/dist/guest/databases/mysql.d.ts +7 -0
- package/dist/guest/databases/mysql.js +59 -0
- package/dist/guest/databases/names.d.ts +5 -0
- package/dist/guest/databases/names.js +8 -0
- package/dist/guest/databases/postgres.d.ts +9 -0
- package/dist/guest/databases/postgres.js +85 -0
- package/dist/guest/databases/redis.d.ts +7 -0
- package/dist/guest/databases/redis.js +25 -0
- package/dist/guest/databases/registry.d.ts +5 -0
- package/dist/guest/databases/registry.js +51 -0
- package/dist/guest/databases/sbx-db.d.ts +1 -0
- package/dist/guest/{db.js → databases/sbx-db.js} +13 -13
- package/dist/guest/{toolchains/databases → databases}/server.d.ts +5 -5
- package/dist/guest/{toolchains/databases → databases}/server.js +18 -13
- package/dist/guest/entries/daemon.js +16 -0
- package/dist/guest/entries/db.js +10 -0
- package/dist/guest/entries/gitguard.js +20 -0
- package/dist/guest/entries/main.d.ts +1 -0
- package/dist/guest/entries/main.js +24 -0
- package/dist/guest/entries/netproxy.d.ts +1 -0
- package/dist/guest/entries/netproxy.js +7 -0
- package/dist/guest/entries/view.d.ts +1 -0
- package/dist/guest/entries/view.js +11 -0
- package/dist/guest/{gitguard.js → git/decision.js} +49 -26
- package/dist/guest/network/addresses.d.ts +2 -0
- package/dist/guest/network/addresses.js +6 -0
- package/dist/guest/{setup/network.d.ts → network/allow-only.d.ts} +0 -10
- package/dist/guest/network/allow-only.js +84 -0
- package/dist/guest/network/firewall.d.ts +9 -0
- package/dist/guest/{setup/network.js → network/firewall.js} +58 -63
- package/dist/guest/network/proxy-server.d.ts +2 -0
- package/dist/guest/{netproxy.js → network/proxy-server.js} +37 -18
- package/dist/guest/{helpers.d.ts → runtime/csc.d.ts} +1 -1
- package/dist/guest/{helpers.js → runtime/csc.js} +7 -2
- package/dist/guest/runtime/fs.d.ts +2 -0
- package/dist/guest/runtime/fs.js +6 -0
- package/dist/guest/runtime/log.d.ts +3 -0
- package/dist/guest/runtime/log.js +22 -0
- package/dist/guest/runtime/paths.d.ts +13 -0
- package/dist/guest/runtime/paths.js +14 -0
- package/dist/guest/{ports.js → runtime/ports.js} +8 -2
- package/dist/guest/runtime/process.d.ts +15 -0
- package/dist/guest/runtime/process.js +59 -0
- package/dist/guest/{project-context.js → runtime/project-context.js} +1 -1
- package/dist/guest/runtime/session.d.ts +5 -0
- package/dist/guest/runtime/session.js +10 -0
- package/dist/guest/runtime/status.d.ts +7 -0
- package/dist/guest/runtime/status.js +57 -0
- package/dist/guest/{cmdline.js → sessions/cmdline.js} +10 -4
- package/dist/guest/{ptyhost.js → sessions/pty-host.js} +12 -5
- package/dist/guest/{view.js → sessions/viewer.js} +8 -11
- package/dist/guest/setup/claude-mem.d.ts +10 -0
- package/dist/guest/setup/{claude.js → claude-mem.js} +18 -78
- package/dist/guest/setup/{claude.d.ts → claude-profile.d.ts} +0 -10
- package/dist/guest/setup/claude-profile.js +89 -0
- package/dist/guest/setup/desktop.d.ts +2 -0
- package/dist/guest/setup/desktop.js +32 -0
- package/dist/guest/setup/environment.js +28 -5
- package/dist/guest/setup/{user.d.ts → git-identity.d.ts} +0 -2
- package/dist/guest/setup/git-identity.js +34 -0
- package/dist/guest/{gitrules.d.ts → setup/git-rules.d.ts} +1 -1
- package/dist/guest/setup/git-rules.js +50 -0
- package/dist/guest/setup/hooks.js +22 -5
- package/dist/guest/setup/{policy.js → managed-policy.js} +2 -2
- package/dist/guest/toolchains/catalogue.d.ts +4 -4
- package/dist/guest/toolchains/catalogue.js +30 -7
- package/dist/guest/toolchains/detect.d.ts +12 -0
- package/dist/guest/toolchains/detect.js +54 -0
- package/dist/guest/toolchains/index.d.ts +3 -17
- package/dist/guest/toolchains/index.js +1 -106
- package/dist/guest/toolchains/install.d.ts +20 -0
- package/dist/guest/toolchains/install.js +29 -0
- package/dist/guest/toolchains/languages/go.d.ts +3 -0
- package/dist/guest/toolchains/{go.js → languages/go.js} +27 -9
- package/dist/guest/toolchains/languages/java.d.ts +8 -0
- package/dist/guest/toolchains/{java.js → languages/java.js} +57 -18
- package/dist/guest/toolchains/languages/node.d.ts +3 -0
- package/dist/guest/toolchains/{node.js → languages/node.js} +51 -18
- package/dist/guest/toolchains/languages/php.d.ts +3 -0
- package/dist/guest/toolchains/{scripting → languages}/php.js +36 -11
- package/dist/guest/toolchains/languages/python-tools.d.ts +3 -0
- package/dist/guest/toolchains/languages/python-tools.js +12 -0
- package/dist/guest/toolchains/languages/python.d.ts +3 -0
- package/dist/guest/toolchains/{python.js → languages/python.js} +29 -16
- package/dist/guest/toolchains/languages/ruby.d.ts +3 -0
- package/dist/guest/toolchains/{scripting → languages}/ruby.js +28 -10
- package/dist/guest/toolchains/leftovers.d.ts +1 -1
- package/dist/guest/toolchains/leftovers.js +13 -11
- package/dist/guest/toolchains/managers.d.ts +6 -6
- package/dist/guest/toolchains/managers.js +38 -17
- package/dist/guest/toolchains/native/binstall.d.ts +3 -2
- package/dist/guest/toolchains/native/binstall.js +20 -8
- package/dist/guest/toolchains/native/cpp.d.ts +2 -2
- package/dist/guest/toolchains/native/cpp.js +23 -8
- package/dist/guest/toolchains/native/dotnet.d.ts +5 -3
- package/dist/guest/toolchains/native/dotnet.js +72 -24
- package/dist/guest/toolchains/native/mesa.d.ts +2 -2
- package/dist/guest/toolchains/native/mesa.js +27 -10
- package/dist/guest/toolchains/native/msvc/environment.d.ts +4 -4
- package/dist/guest/toolchains/native/msvc/environment.js +30 -16
- package/dist/guest/toolchains/native/msvc/index.d.ts +3 -3
- package/dist/guest/toolchains/native/msvc/index.js +10 -8
- package/dist/guest/toolchains/native/msvc/packages.d.ts +1 -1
- package/dist/guest/toolchains/native/msvc/packages.js +69 -23
- package/dist/guest/toolchains/native/msvc/tree.d.ts +6 -6
- package/dist/guest/toolchains/native/msvc/tree.js +15 -9
- package/dist/guest/toolchains/native/rust-extras.d.ts +23 -0
- package/dist/guest/toolchains/native/rust-extras.js +100 -0
- package/dist/guest/toolchains/native/rust.d.ts +2 -2
- package/dist/guest/toolchains/native/rust.js +41 -10
- package/dist/guest/toolchains/{scripting → native}/vcruntime.d.ts +2 -2
- package/dist/guest/toolchains/{scripting → native}/vcruntime.js +17 -7
- package/dist/guest/toolchains/package-ledger.d.ts +17 -0
- package/dist/guest/toolchains/package-ledger.js +54 -0
- package/dist/guest/toolchains/plan.d.ts +3 -24
- package/dist/guest/toolchains/plan.js +99 -111
- package/dist/guest/toolchains/runtimes.d.ts +6 -6
- package/dist/guest/toolchains/runtimes.js +31 -13
- package/dist/guest/toolchains/scheduler.d.ts +22 -0
- package/dist/guest/toolchains/scheduler.js +123 -0
- package/dist/guest/toolchains/setup.d.ts +10 -0
- package/dist/guest/toolchains/setup.js +22 -0
- package/dist/guest/toolchains/state-file.d.ts +3 -0
- package/dist/guest/toolchains/state-file.js +10 -0
- package/dist/guest/toolchains/step.d.ts +24 -0
- package/dist/guest/toolchains/step.js +1 -0
- package/dist/guest/toolchains/tool-env.d.ts +12 -0
- package/dist/guest/toolchains/tool-env.js +16 -0
- package/dist/guest/toolchains/tools/cli.d.ts +10 -0
- package/dist/guest/toolchains/{cli.js → tools/cli.js} +35 -15
- package/dist/guest/toolchains/tools/git.d.ts +3 -0
- package/dist/guest/toolchains/{git.js → tools/git.js} +38 -15
- package/dist/guest/toolchains/tools/pwsh.d.ts +4 -0
- package/dist/guest/toolchains/{pwsh.js → tools/pwsh.js} +14 -7
- package/dist/guest/toolchains/{vscode-profile.d.ts → tools/vscode-profile.d.ts} +6 -6
- package/dist/guest/toolchains/{vscode-profile.js → tools/vscode-profile.js} +28 -12
- package/dist/guest/toolchains/{vscode.d.ts → tools/vscode.d.ts} +6 -6
- package/dist/guest/toolchains/{vscode.js → tools/vscode.js} +67 -21
- package/dist/guest/toolchains/version-cache.d.ts +16 -0
- package/dist/guest/toolchains/version-cache.js +67 -0
- package/dist/host/agent-commands/commands.d.ts +13 -0
- package/dist/host/agent-commands/commands.js +33 -0
- package/dist/host/agent-commands/forwarders.d.ts +7 -0
- package/dist/host/agent-commands/forwarders.js +31 -0
- package/dist/host/agent-commands/index.d.ts +4 -0
- package/dist/host/agent-commands/index.js +4 -0
- package/dist/host/agent-commands/reconcile.d.ts +12 -0
- package/dist/host/agent-commands/reconcile.js +69 -0
- package/dist/host/agent-commands/user-path.d.ts +2 -0
- package/dist/host/agent-commands/user-path.js +33 -0
- package/dist/host/audit/collect.d.ts +2 -2
- package/dist/host/audit/collect.js +59 -22
- package/dist/host/audit/log.d.ts +2 -2
- package/dist/host/audit/log.js +24 -8
- package/dist/host/{attach.d.ts → channel/attach.d.ts} +2 -2
- package/dist/host/{attach.js → channel/attach.js} +33 -15
- package/dist/host/channel/channel.d.ts +51 -0
- package/dist/host/channel/channel.js +196 -0
- package/dist/host/channel/index.d.ts +2 -0
- package/dist/host/channel/index.js +2 -0
- package/dist/host/guard/agent-files.d.ts +7 -0
- package/dist/host/guard/agent-files.js +103 -0
- package/dist/host/guard/commands.d.ts +10 -0
- package/dist/host/guard/commands.js +123 -0
- package/dist/host/guard/file-hash.d.ts +4 -0
- package/dist/host/guard/file-hash.js +37 -0
- package/dist/host/guard/git-config.d.ts +5 -0
- package/dist/host/guard/git-config.js +62 -0
- package/dist/host/guard/git-dirs.d.ts +12 -0
- package/dist/host/guard/git-dirs.js +53 -0
- package/dist/host/guard/index.d.ts +5 -0
- package/dist/host/guard/index.js +4 -0
- package/dist/host/guard/mark-of-the-web.d.ts +8 -0
- package/dist/host/guard/mark-of-the-web.js +74 -0
- package/dist/host/guard/nested-repos.d.ts +14 -0
- package/dist/host/guard/nested-repos.js +88 -0
- package/dist/host/guard/quarantine.d.ts +3 -0
- package/dist/host/guard/quarantine.js +24 -0
- package/dist/host/guard/repo-guard.d.ts +10 -0
- package/dist/host/guard/repo-guard.js +36 -0
- package/dist/host/guard/store.d.ts +40 -0
- package/dist/host/guard/store.js +145 -0
- package/dist/host/guard/types.d.ts +27 -0
- package/dist/host/guard/types.js +3 -0
- package/dist/host/guard/watch-state.d.ts +9 -0
- package/dist/host/guard/watch-state.js +26 -0
- package/dist/host/launch/boot-projects.d.ts +17 -0
- package/dist/host/launch/{projects.js → boot-projects.js} +22 -13
- package/dist/host/{database-plan.d.ts → launch/database-plan.d.ts} +5 -5
- package/dist/host/{database-plan.js → launch/database-plan.js} +24 -13
- package/dist/host/launch/generate.d.ts +4 -0
- package/dist/host/launch/generate.js +77 -0
- package/dist/host/launch/index.d.ts +10 -0
- package/dist/host/launch/index.js +10 -0
- package/dist/host/launch/mappings.d.ts +5 -5
- package/dist/host/launch/mappings.js +37 -24
- package/dist/host/launch/pc-scan.d.ts +5 -0
- package/dist/host/{pc-scan.js → launch/pc-scan.js} +20 -13
- package/dist/host/launch/project-scan.d.ts +7 -0
- package/dist/host/{project-scan.js → launch/project-scan.js} +29 -21
- package/dist/host/launch/session-file.d.ts +23 -0
- package/dist/host/launch/session-file.js +73 -0
- package/dist/host/launch/stage.d.ts +5 -5
- package/dist/host/launch/stage.js +14 -13
- package/dist/host/launch/toolchains.d.ts +4 -0
- package/dist/host/launch/toolchains.js +11 -0
- package/dist/host/launch/{wsb.d.ts → wsb-file.d.ts} +4 -2
- package/dist/host/launch/wsb-file.js +56 -0
- package/dist/host/life/crash-report.d.ts +8 -0
- package/dist/host/life/crash-report.js +87 -0
- package/dist/host/life/index.d.ts +6 -0
- package/dist/host/life/index.js +6 -0
- package/dist/host/life/keep-awake.d.ts +10 -0
- package/dist/host/life/keep-awake.js +29 -0
- package/dist/host/life/life-record.d.ts +48 -0
- package/dist/host/life/life-record.js +76 -0
- package/dist/host/life/stop-events.d.ts +27 -0
- package/dist/host/life/stop-events.js +96 -0
- package/dist/host/life/stop-warning.d.ts +4 -0
- package/dist/host/life/stop-warning.js +25 -0
- package/dist/host/life/windows-update.d.ts +3 -0
- package/dist/host/life/windows-update.js +11 -0
- package/dist/host/native.d.ts +4 -0
- package/dist/host/native.js +11 -0
- package/dist/host/network/index.d.ts +1 -0
- package/dist/host/network/index.js +1 -0
- package/dist/host/{port-forward.d.ts → network/port-forward.d.ts} +1 -1
- package/dist/host/{port-forward.js → network/port-forward.js} +16 -10
- package/dist/host/profile/accounts.d.ts +37 -0
- package/dist/host/profile/accounts.js +146 -0
- package/dist/host/profile/claude-login.d.ts +22 -0
- package/dist/host/profile/claude-login.js +57 -0
- package/dist/host/{claude-profile.d.ts → profile/claude-profile.d.ts} +9 -9
- package/dist/host/{claude-profile.js → profile/claude-profile.js} +32 -22
- package/dist/host/profile/index.d.ts +7 -0
- package/dist/host/profile/index.js +7 -0
- package/dist/host/profile/personalize.d.ts +2 -0
- package/dist/host/profile/personalize.js +127 -0
- package/dist/host/profile/reg-file.d.ts +8 -0
- package/dist/host/profile/reg-file.js +45 -0
- package/dist/host/profile/secret-files.d.ts +2 -0
- package/dist/host/profile/secret-files.js +25 -0
- package/dist/host/profile/secret-patterns.d.ts +6 -0
- package/dist/host/profile/secret-patterns.js +128 -0
- package/dist/host/profile/secrets.d.ts +12 -0
- package/dist/host/profile/secrets.js +100 -0
- package/dist/host/projects/index.d.ts +4 -0
- package/dist/host/projects/index.js +4 -0
- package/dist/host/{join.d.ts → projects/join.d.ts} +12 -9
- package/dist/host/{join.js → projects/join.js} +62 -33
- package/dist/host/projects/known.d.ts +28 -0
- package/dist/host/projects/known.js +55 -0
- package/dist/host/projects/mapper.d.ts +29 -0
- package/dist/host/projects/mapper.js +88 -0
- package/dist/host/projects/registry.d.ts +83 -0
- package/dist/host/projects/registry.js +136 -0
- package/dist/host/sandbox/doctor.d.ts +2 -0
- package/dist/host/sandbox/doctor.js +42 -0
- package/dist/host/sandbox/host-claude.d.ts +1 -0
- package/dist/host/sandbox/host-claude.js +26 -0
- package/dist/host/sandbox/index.d.ts +6 -0
- package/dist/host/sandbox/index.js +6 -0
- package/dist/host/{platform.d.ts → sandbox/platform.d.ts} +0 -5
- package/dist/host/sandbox/platform.js +60 -0
- package/dist/host/sandbox/probe.d.ts +3 -0
- package/dist/host/sandbox/probe.js +47 -0
- package/dist/host/{window.js → sandbox/window.js} +7 -5
- package/dist/host/{wsb.js → sandbox/wsb-cli.js} +31 -8
- package/dist/host/{cleanup.js → storage/cleanup.js} +27 -12
- package/dist/host/storage/index.d.ts +2 -0
- package/dist/host/storage/index.js +2 -0
- package/dist/host/storage/state-files.d.ts +4 -0
- package/dist/host/storage/state-files.js +10 -0
- package/dist/host/test-guard.js +1 -1
- package/dist/host/tools/conpty.d.ts +8 -0
- package/dist/host/tools/conpty.js +58 -0
- package/dist/host/tools/index.d.ts +2 -0
- package/dist/host/tools/index.js +2 -0
- package/dist/host/{terminal.d.ts → tools/windows-terminal.d.ts} +2 -10
- package/dist/host/{terminal.js → tools/windows-terminal.js} +33 -57
- package/dist/host/workspace-view/active-views.d.ts +3 -0
- package/dist/host/workspace-view/active-views.js +22 -0
- package/dist/host/workspace-view/index.d.ts +2 -18
- package/dist/host/workspace-view/index.js +2 -49
- package/dist/host/workspace-view/plan.d.ts +16 -0
- package/dist/host/workspace-view/plan.js +50 -0
- package/dist/host/workspace-view/rules.js +10 -3
- package/dist/host/workspace-view/view-state.d.ts +10 -0
- package/dist/host/workspace-view/view-state.js +31 -0
- package/dist/host/workspace-view/view.d.ts +1 -0
- package/dist/host/workspace-view/view.js +51 -55
- package/dist/runtime/daemon.js +4220 -1968
- package/dist/runtime/db.js +2134 -849
- package/dist/runtime/gitguard.js +29 -11
- package/dist/runtime/main.js +4687 -2243
- package/dist/runtime/netproxy.js +1644 -420
- package/dist/runtime/view.js +1356 -428
- package/dist/selftest/accounts.test.d.ts +1 -1
- package/dist/selftest/accounts.test.js +20 -17
- package/dist/selftest/agent-commands.test.d.ts +1 -1
- package/dist/selftest/agent-commands.test.js +9 -5
- package/dist/selftest/audit.test.d.ts +1 -1
- package/dist/selftest/audit.test.js +46 -13
- package/dist/selftest/channel.test.d.ts +1 -1
- package/dist/selftest/channel.test.js +63 -16
- package/dist/selftest/cli.test.d.ts +1 -1
- package/dist/selftest/cli.test.js +68 -16
- package/dist/selftest/cmdline.test.d.ts +1 -1
- package/dist/selftest/cmdline.test.js +36 -7
- package/dist/selftest/config.test.d.ts +1 -1
- package/dist/selftest/config.test.js +12 -5
- package/dist/selftest/data.test.d.ts +1 -1
- package/dist/selftest/data.test.js +35 -6
- package/dist/selftest/detect.test.d.ts +1 -1
- package/dist/selftest/detect.test.js +22 -9
- package/dist/selftest/generate.test.d.ts +1 -1
- package/dist/selftest/generate.test.js +33 -9
- package/dist/selftest/git-access.test.d.ts +1 -1
- package/dist/selftest/git-access.test.js +42 -4
- package/dist/selftest/guest-boot.test.d.ts +1 -1
- package/dist/selftest/guest-boot.test.js +25 -7
- package/dist/selftest/host-sim.test.d.ts +1 -1
- package/dist/selftest/host-sim.test.js +27 -3
- package/dist/selftest/hostile-input.test.d.ts +1 -1
- package/dist/selftest/hostile-input.test.js +5 -5
- package/dist/selftest/index.d.ts +1 -1
- package/dist/selftest/index.js +72 -16
- package/dist/selftest/layout.test.d.ts +2 -0
- package/dist/selftest/layout.test.js +131 -0
- package/dist/selftest/links.test.d.ts +1 -1
- package/dist/selftest/links.test.js +16 -11
- package/dist/selftest/live-daemon.test.d.ts +1 -1
- package/dist/selftest/live-daemon.test.js +20 -8
- package/dist/selftest/live-git.test.d.ts +1 -1
- package/dist/selftest/live-git.test.js +13 -4
- package/dist/selftest/live-network.test.d.ts +1 -1
- package/dist/selftest/live-network.test.js +24 -9
- package/dist/selftest/live-projects.test.d.ts +1 -1
- package/dist/selftest/live-projects.test.js +47 -20
- package/dist/selftest/live-terminal.test.d.ts +1 -1
- package/dist/selftest/live-terminal.test.js +41 -15
- package/dist/selftest/local-config.test.d.ts +1 -1
- package/dist/selftest/local-config.test.js +64 -16
- package/dist/selftest/mirror.test.d.ts +1 -1
- package/dist/selftest/mirror.test.js +102 -32
- package/dist/selftest/network.test.d.ts +1 -1
- package/dist/selftest/network.test.js +17 -8
- package/dist/selftest/personalization.test.d.ts +1 -1
- package/dist/selftest/personalization.test.js +12 -5
- package/dist/selftest/projects.test.d.ts +1 -1
- package/dist/selftest/projects.test.js +280 -85
- package/dist/selftest/repair.test.d.ts +1 -1
- package/dist/selftest/repair.test.js +17 -5
- package/dist/selftest/repo-guard.test.d.ts +1 -1
- package/dist/selftest/repo-guard.test.js +21 -20
- package/dist/selftest/secrets.test.d.ts +1 -1
- package/dist/selftest/secrets.test.js +57 -13
- package/dist/selftest/setup.test.d.ts +1 -1
- package/dist/selftest/setup.test.js +25 -5
- package/dist/selftest/{fixtures.d.ts → support/fixtures.d.ts} +5 -3
- package/dist/selftest/{fixtures.js → support/fixtures.js} +95 -17
- package/dist/selftest/{harness.js → support/harness.js} +24 -7
- package/dist/selftest/{live.d.ts → support/live.d.ts} +2 -2
- package/dist/selftest/{live.js → support/live.js} +34 -10
- package/dist/selftest/support/suite.js +1 -0
- package/dist/selftest/sync.test.d.ts +1 -1
- package/dist/selftest/sync.test.js +64 -26
- package/dist/selftest/test-guard.test.d.ts +1 -1
- package/dist/selftest/test-guard.test.js +43 -15
- package/dist/selftest/toolchains.test.d.ts +1 -1
- package/dist/selftest/toolchains.test.js +135 -36
- package/dist/selftest/workspace-view.test.d.ts +1 -1
- package/dist/selftest/workspace-view.test.js +48 -11
- package/dist/selftest/workspace.test.d.ts +1 -1
- package/dist/selftest/workspace.test.js +13 -4
- package/dist/shared/{apps.d.ts → apps/catalogue.d.ts} +1 -11
- package/dist/shared/apps/catalogue.js +768 -0
- package/dist/shared/apps/index.d.ts +2 -0
- package/dist/shared/apps/index.js +2 -0
- package/dist/shared/apps/selection.d.ts +11 -0
- package/dist/shared/apps/selection.js +40 -0
- package/dist/shared/channel/index.d.ts +2 -0
- package/dist/shared/channel/index.js +2 -0
- package/dist/shared/channel/run-dir.d.ts +30 -0
- package/dist/shared/channel/run-dir.js +84 -0
- package/dist/shared/{schema.d.ts → channel/schema.d.ts} +38 -21
- package/dist/shared/{schema.js → channel/schema.js} +62 -35
- package/dist/shared/download/archive.d.ts +13 -0
- package/dist/shared/download/archive.js +57 -0
- package/dist/shared/download/downloader.d.ts +35 -0
- package/dist/shared/download/downloader.js +110 -0
- package/dist/shared/download/github.d.ts +16 -0
- package/dist/shared/download/github.js +74 -0
- package/dist/shared/download/http.d.ts +5 -0
- package/dist/shared/download/http.js +30 -0
- package/dist/shared/download/index.d.ts +5 -0
- package/dist/shared/download/index.js +5 -0
- package/dist/shared/download/spawn.d.ts +2 -0
- package/dist/shared/download/spawn.js +7 -0
- package/dist/shared/io/index.d.ts +3 -0
- package/dist/shared/io/index.js +3 -0
- package/dist/shared/io/json-file.d.ts +10 -0
- package/dist/shared/io/json-file.js +21 -0
- package/dist/shared/io/json.d.ts +13 -0
- package/dist/shared/io/json.js +49 -0
- package/dist/shared/{safe-remove.js → io/safe-remove.js} +32 -7
- package/dist/shared/{netrules.js → network/firewall-rules.js} +36 -5
- package/dist/shared/network/index.d.ts +2 -0
- package/dist/shared/network/index.js +2 -0
- package/dist/shared/{netpolicy.js → network/policy.js} +66 -11
- package/dist/shared/{paths.js → paths/claude-paths.js} +12 -2
- package/dist/shared/{guest-paths.d.ts → paths/guest-paths.d.ts} +6 -12
- package/dist/shared/{guest-paths.js → paths/guest-paths.js} +53 -36
- package/dist/shared/paths/index.d.ts +3 -0
- package/dist/shared/paths/index.js +3 -0
- package/dist/shared/{projects.js → paths/projects.js} +13 -3
- package/dist/shared/pty/client.d.ts +21 -0
- package/dist/shared/pty/client.js +79 -0
- package/dist/shared/{console-input.js → pty/console-input.js} +26 -6
- package/dist/shared/pty/index.d.ts +6 -0
- package/dist/shared/pty/index.js +6 -0
- package/dist/shared/pty/input-joiner.d.ts +15 -0
- package/dist/shared/pty/input-joiner.js +44 -0
- package/dist/shared/pty/output-filter.d.ts +13 -0
- package/dist/shared/pty/output-filter.js +140 -0
- package/dist/shared/pty/protocol.d.ts +36 -0
- package/dist/shared/pty/protocol.js +60 -0
- package/dist/shared/pty/terminal.d.ts +24 -0
- package/dist/shared/pty/terminal.js +147 -0
- package/dist/shared/test-guard.js +3 -1
- package/dist/sync/claude-mem.d.ts +1 -1
- package/dist/sync/claude-mem.js +9 -4
- package/dist/sync/history.d.ts +1 -29
- package/dist/sync/history.js +57 -45
- package/dist/sync/index.d.ts +5 -0
- package/dist/sync/index.js +5 -0
- package/dist/sync/sync-cycle.d.ts +18 -0
- package/dist/sync/sync-cycle.js +85 -0
- package/dist/sync/sync-state.d.ts +32 -0
- package/dist/sync/sync-state.js +37 -0
- package/dist/sync/watcher.d.ts +0 -18
- package/dist/sync/watcher.js +66 -100
- package/native/keep-awake.ps1 +8 -0
- package/native/power.cs +23 -0
- package/native/stop-events.ps1 +38 -0
- package/package.json +11 -3
- package/sandbox/linkgate.cs +98 -0
- package/sandbox/memlog.ps1 +15 -6
- package/schemas/config.schema.json +34 -1
- package/schemas/sandbox-config.schema.json +34 -1
- package/dist/cli/boot-progress.d.ts +0 -22
- package/dist/cli/boot-progress.js +0 -59
- package/dist/cli/commands/launch.d.ts +0 -32
- package/dist/cli/commands/launch.js +0 -421
- package/dist/cli/commands/maintenance.d.ts +0 -10
- package/dist/cli/commands/maintenance.js +0 -220
- package/dist/cli/commands/project.d.ts +0 -33
- package/dist/cli/commands/project.js +0 -102
- package/dist/cli/commands/projects.d.ts +0 -14
- package/dist/cli/commands/projects.js +0 -146
- package/dist/cli/commands/restart.d.ts +0 -6
- package/dist/cli/commands/restart.js +0 -95
- package/dist/cli/commands/sessions.d.ts +0 -12
- package/dist/cli/commands/sessions.js +0 -258
- package/dist/cli/menu/settings/editors.js +0 -305
- package/dist/cli/tui/dialogs.d.ts +0 -57
- package/dist/cli/tui/dialogs.js +0 -162
- package/dist/core/config.js +0 -109
- package/dist/core/project-policy.d.ts +0 -62
- package/dist/core/project-policy.js +0 -121
- package/dist/core/schema.d.ts +0 -6
- package/dist/core/schema.js +0 -8
- package/dist/core/util.d.ts +0 -62
- package/dist/core/util.js +0 -156
- package/dist/core/workspace.d.ts +0 -35
- package/dist/core/workspace.js +0 -206
- package/dist/guest/boot-env.d.ts +0 -4
- package/dist/guest/daemon.js +0 -57
- package/dist/guest/env.d.ts +0 -56
- package/dist/guest/env.js +0 -115
- package/dist/guest/gitrules.js +0 -11
- package/dist/guest/project-status.d.ts +0 -5
- package/dist/guest/project-status.js +0 -17
- package/dist/guest/setup/user.js +0 -51
- package/dist/guest/toolchains/cli.d.ts +0 -10
- package/dist/guest/toolchains/common.d.ts +0 -54
- package/dist/guest/toolchains/common.js +0 -147
- package/dist/guest/toolchains/databases/dynamodb.d.ts +0 -8
- package/dist/guest/toolchains/databases/dynamodb.js +0 -52
- package/dist/guest/toolchains/databases/index.d.ts +0 -6
- package/dist/guest/toolchains/databases/index.js +0 -62
- package/dist/guest/toolchains/databases/mongodb.d.ts +0 -3
- package/dist/guest/toolchains/databases/mongodb.js +0 -31
- package/dist/guest/toolchains/databases/mysql.d.ts +0 -3
- package/dist/guest/toolchains/databases/mysql.js +0 -38
- package/dist/guest/toolchains/databases/postgres.d.ts +0 -5
- package/dist/guest/toolchains/databases/postgres.js +0 -38
- package/dist/guest/toolchains/databases/redis.d.ts +0 -3
- package/dist/guest/toolchains/databases/redis.js +0 -16
- package/dist/guest/toolchains/git.d.ts +0 -3
- package/dist/guest/toolchains/go.d.ts +0 -3
- package/dist/guest/toolchains/java.d.ts +0 -8
- package/dist/guest/toolchains/node.d.ts +0 -3
- package/dist/guest/toolchains/pwsh.d.ts +0 -4
- package/dist/guest/toolchains/python.d.ts +0 -3
- package/dist/guest/toolchains/scripting/php.d.ts +0 -3
- package/dist/guest/toolchains/scripting/ruby.d.ts +0 -3
- package/dist/host/accounts.d.ts +0 -32
- package/dist/host/accounts.js +0 -128
- package/dist/host/agent-commands.d.ts +0 -25
- package/dist/host/agent-commands.js +0 -145
- package/dist/host/channel.d.ts +0 -38
- package/dist/host/channel.js +0 -163
- package/dist/host/generate.d.ts +0 -13
- package/dist/host/generate.js +0 -115
- package/dist/host/launch/projects.d.ts +0 -17
- package/dist/host/launch/wsb.js +0 -34
- package/dist/host/motw.d.ts +0 -17
- package/dist/host/motw.js +0 -74
- package/dist/host/pc-scan.d.ts +0 -6
- package/dist/host/personalize.d.ts +0 -10
- package/dist/host/personalize.js +0 -97
- package/dist/host/platform.js +0 -129
- package/dist/host/project-scan.d.ts +0 -7
- package/dist/host/projects.d.ts +0 -123
- package/dist/host/projects.js +0 -196
- package/dist/host/repo-guard.d.ts +0 -43
- package/dist/host/repo-guard.js +0 -347
- package/dist/host/secrets.d.ts +0 -14
- package/dist/host/secrets.js +0 -133
- package/dist/host/stops.d.ts +0 -67
- package/dist/host/stops.js +0 -126
- package/dist/shared/apps.js +0 -114
- package/dist/shared/download.d.ts +0 -63
- package/dist/shared/download.js +0 -238
- package/dist/shared/pty-client.d.ts +0 -108
- package/dist/shared/pty-client.js +0 -406
- package/dist/shared/rundir.d.ts +0 -41
- package/dist/shared/rundir.js +0 -96
- /package/dist/{guest/daemon.d.ts → cli/tui/list/list-types.js} +0 -0
- /package/dist/{guest/db.d.ts → cli/tui/screen.js} +0 -0
- /package/dist/core/{detect-databases.d.ts → detect/databases.d.ts} +0 -0
- /package/dist/{guest/toolchains → core/detect}/versions.d.ts +0 -0
- /package/dist/guest/{setup/agents.d.ts → agents/agent-installer.d.ts} +0 -0
- /package/dist/guest/{audit-parse.d.ts → audit/parse.d.ts} +0 -0
- /package/dist/guest/{guide.d.ts → boot/guide.d.ts} +0 -0
- /package/dist/guest/daemon/{shutdown.d.ts → idle-shutdown.d.ts} +0 -0
- /package/dist/guest/daemon/{session.d.ts → sessions.d.ts} +0 -0
- /package/dist/guest/{main.d.ts → entries/daemon.d.ts} +0 -0
- /package/dist/guest/{netproxy.d.ts → entries/db.d.ts} +0 -0
- /package/dist/{selftest/suite.js → guest/entries/gitguard.d.ts} +0 -0
- /package/dist/guest/{gitguard.d.ts → git/decision.d.ts} +0 -0
- /package/dist/guest/{ports.d.ts → runtime/ports.d.ts} +0 -0
- /package/dist/guest/{project-context.d.ts → runtime/project-context.d.ts} +0 -0
- /package/dist/guest/{cmdline.d.ts → sessions/cmdline.d.ts} +0 -0
- /package/dist/guest/{ptyhost.d.ts → sessions/pty-host.d.ts} +0 -0
- /package/dist/guest/{view.d.ts → sessions/viewer.d.ts} +0 -0
- /package/dist/guest/setup/{policy.d.ts → managed-policy.d.ts} +0 -0
- /package/dist/host/{window.d.ts → sandbox/window.d.ts} +0 -0
- /package/dist/host/{wsb.d.ts → sandbox/wsb-cli.d.ts} +0 -0
- /package/dist/host/{cleanup.d.ts → storage/cleanup.d.ts} +0 -0
- /package/dist/selftest/{harness.d.ts → support/harness.d.ts} +0 -0
- /package/dist/selftest/{suite.d.ts → support/suite.d.ts} +0 -0
- /package/dist/shared/{safe-remove.d.ts → io/safe-remove.d.ts} +0 -0
- /package/dist/shared/{netrules.d.ts → network/firewall-rules.d.ts} +0 -0
- /package/dist/shared/{netpolicy.d.ts → network/policy.d.ts} +0 -0
- /package/dist/shared/{paths.d.ts → paths/claude-paths.d.ts} +0 -0
- /package/dist/shared/{projects.d.ts → paths/projects.d.ts} +0 -0
- /package/dist/shared/{console-input.d.ts → pty/console-input.d.ts} +0 -0
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
// `launch` / `generate`, and what sandbox claude runs: start a sandbox, or another session in the running one. From a
|
|
2
|
+
// folder the running sandbox does not have yet, the folder joins it (no restart) when it can, and otherwise a
|
|
3
|
+
// restart that adds it is offered (restart.ts).
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import _ from 'lodash';
|
|
6
|
+
import { generateSandbox } from '../../../host/launch/index.js';
|
|
7
|
+
import { findSecretFiles } from '../../../host/profile/index.js';
|
|
8
|
+
import { RepoGuardStore } from '../../../host/guard/index.js';
|
|
9
|
+
import { assertCanLaunch, isSandboxRunning, spawnDetached, startSandbox, probeHost, hideSandboxWindow, } from '../../../host/sandbox/index.js';
|
|
10
|
+
import { KnownProjects, ProjectRegistry } from '../../../host/projects/index.js';
|
|
11
|
+
import { LifeRecord } from '../../../host/life/index.js';
|
|
12
|
+
import { isWithin } from '../../../shared/paths/index.js';
|
|
13
|
+
import { watcherRunning } from '../../../sync/index.js';
|
|
14
|
+
import { protectionsOf } from '../../../core/local-config/index.js';
|
|
15
|
+
import { errMsg } from '../../../core/util/index.js';
|
|
16
|
+
import { askYesNo } from '../../../core/prompt.js';
|
|
17
|
+
import { resolveRun } from '../../../core/run/index.js';
|
|
18
|
+
import { c, table } from '../../output/index.js';
|
|
19
|
+
import { syncAgentCommands } from '../agent-commands.js';
|
|
20
|
+
import { requireOnPc } from '../context.js';
|
|
21
|
+
import { joinHere } from '../projects/index.js';
|
|
22
|
+
import { startIntoRunning, launchIntoRunning, contextFor, waitForBoot, attachHere, waitForStart, openSession, readySandbox, } from './running.js';
|
|
23
|
+
import { maybeAddRoot } from './add-root.js';
|
|
24
|
+
import { prepare, firstBootNotice } from './prepare.js';
|
|
25
|
+
import { bootWantsFor } from './boot-wants.js';
|
|
26
|
+
import { launchSummary } from './summary.js';
|
|
27
|
+
/** One launch (or `generate`): from the command line to a started sandbox, a session in it, or the written files. */
|
|
28
|
+
class Launcher {
|
|
29
|
+
ctx;
|
|
30
|
+
generateOnly;
|
|
31
|
+
extras;
|
|
32
|
+
options;
|
|
33
|
+
constructor(ctx, generateOnly, extras) {
|
|
34
|
+
this.ctx = ctx;
|
|
35
|
+
this.generateOnly = generateOnly;
|
|
36
|
+
this.extras = extras;
|
|
37
|
+
this.options = ctx.options;
|
|
38
|
+
}
|
|
39
|
+
async run() {
|
|
40
|
+
const { options, generateOnly } = this;
|
|
41
|
+
// attach.auto: an agent started from an interactive terminal attaches it, as with -t.
|
|
42
|
+
if (this.ctx.loaded.config.attach.auto && !options.noAgent && process.stdin.isTTY && process.stdout.isTTY)
|
|
43
|
+
options.terminal = true;
|
|
44
|
+
if (!generateOnly)
|
|
45
|
+
requireOnPc('launch');
|
|
46
|
+
if (!generateOnly)
|
|
47
|
+
this.syncAgentCommands();
|
|
48
|
+
if (!generateOnly && isSandboxRunning())
|
|
49
|
+
return options.noAgent ? startIntoRunning(this.ctx, RELAUNCHER) : launchIntoRunning(this.ctx, RELAUNCHER);
|
|
50
|
+
if (options.sessions.length)
|
|
51
|
+
return this.launchSessions();
|
|
52
|
+
return this.launchHere();
|
|
53
|
+
}
|
|
54
|
+
/** agentCommands (Beta) follows the config: a setting changed in the file takes effect here too. Never blocks. */
|
|
55
|
+
syncAgentCommands() {
|
|
56
|
+
try {
|
|
57
|
+
syncAgentCommands(this.ctx, this.ctx.loaded.config);
|
|
58
|
+
}
|
|
59
|
+
catch (e) {
|
|
60
|
+
console.warn('Agent commands (Beta): ' + errMsg(e));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Several sessions: the sandbox starts from the first one's folder with the others' folders mapped too, then they
|
|
65
|
+
* all open in it (each project is set up on demand, in parallel). One --session is an ordinary launch.
|
|
66
|
+
*/
|
|
67
|
+
async launchSessions() {
|
|
68
|
+
const { ctx, generateOnly, extras } = this;
|
|
69
|
+
const wants = this.options.sessions;
|
|
70
|
+
if (wants.length === 1)
|
|
71
|
+
return launch(contextFor(ctx, wants[0]), generateOnly, extras);
|
|
72
|
+
const first = contextFor(ctx, wants[0]);
|
|
73
|
+
const others = _.uniqBy(wants
|
|
74
|
+
.slice(1)
|
|
75
|
+
.map((w) => w.folder)
|
|
76
|
+
.filter((f) => !isWithin(wants[0].folder, f)), (f) => f.toLowerCase());
|
|
77
|
+
const started = await launch({ ...first, options: { ...first.options, terminal: false } }, generateOnly, {
|
|
78
|
+
...extras,
|
|
79
|
+
extraProjects: [...(extras.extraProjects ?? []), ...others],
|
|
80
|
+
autoSession: false,
|
|
81
|
+
waitUntilReady: true,
|
|
82
|
+
});
|
|
83
|
+
return generateOnly || started !== 0 ? started : launchIntoRunning(ctx, RELAUNCHER);
|
|
84
|
+
}
|
|
85
|
+
resolve() {
|
|
86
|
+
const { options } = this;
|
|
87
|
+
return resolveRun({
|
|
88
|
+
packageRoot: this.ctx.packageRoot,
|
|
89
|
+
loaded: this.ctx.loaded,
|
|
90
|
+
cwd: process.cwd(),
|
|
91
|
+
workspace: options.workspace,
|
|
92
|
+
harness: options.harness,
|
|
93
|
+
noAgent: options.noAgent,
|
|
94
|
+
noLocalConfig: options.noLocalConfig,
|
|
95
|
+
trustConfig: options.trustConfig,
|
|
96
|
+
scripts: options.scripts,
|
|
97
|
+
databases: options.databases,
|
|
98
|
+
headless: options.headless,
|
|
99
|
+
nodeVersion: options.node,
|
|
100
|
+
pythonVersion: options.python,
|
|
101
|
+
ask: askYesNo,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
/** One sandbox for this folder: resolve, prepare, write the launch files, then (unless generate) start it. */
|
|
105
|
+
async launchHere() {
|
|
106
|
+
const { ctx, generateOnly, extras } = this;
|
|
107
|
+
const run = await this.resolve();
|
|
108
|
+
const { config } = run;
|
|
109
|
+
if (!generateOnly)
|
|
110
|
+
assertCanLaunch();
|
|
111
|
+
if (!generateOnly && !extras.extraProjects)
|
|
112
|
+
await maybeAddRoot(ctx, run);
|
|
113
|
+
const prepared = generateOnly ? null : await prepare(ctx, run);
|
|
114
|
+
const bootWants = await bootWantsFor(ctx, run, extras.extraProjects);
|
|
115
|
+
const generated = generateSandbox({
|
|
116
|
+
packageRoot: ctx.packageRoot,
|
|
117
|
+
run,
|
|
118
|
+
harnessArgs: this.options.passthrough,
|
|
119
|
+
probe: probeHost(config, run.harnessName),
|
|
120
|
+
extraProjects: extras.extraProjects,
|
|
121
|
+
autoSession: extras.autoSession,
|
|
122
|
+
bootWants: bootWants.wants,
|
|
123
|
+
});
|
|
124
|
+
const notes = [...run.notes, ...bootWants.notes, ...generated.projects.notes, ...generated.mappingNotes];
|
|
125
|
+
for (const note of notes)
|
|
126
|
+
console.log(note);
|
|
127
|
+
this.warnSecretFiles(run);
|
|
128
|
+
table(launchSummary(run, generated, prepared));
|
|
129
|
+
if (generateOnly)
|
|
130
|
+
return 0;
|
|
131
|
+
this.record(run, generated);
|
|
132
|
+
startSandbox(generated.wsbPath);
|
|
133
|
+
this.startWatcher();
|
|
134
|
+
return this.afterStart(run, generated);
|
|
135
|
+
}
|
|
136
|
+
warnSecretFiles(run) {
|
|
137
|
+
const secretFiles = run.config.secrets.warnFiles ? findSecretFiles(run.workspaceHost) : [];
|
|
138
|
+
if (!secretFiles.length)
|
|
139
|
+
return;
|
|
140
|
+
const shown = secretFiles.slice(0, 12).join(', ') + (secretFiles.length > 12 ? ', ...' : '');
|
|
141
|
+
console.warn(c.yellow('Heads-up: the agent can read these files in your workspace, which often hold secrets: ' +
|
|
142
|
+
shown +
|
|
143
|
+
'. Move real credentials out of the folder (or use test ones). Silence with secrets.warnFiles = false.'));
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Every folder the sandbox can write is snapshotted before it starts (the guard compares against this), and the
|
|
147
|
+
* projects it starts with are recorded host-side for the commands that run later.
|
|
148
|
+
*/
|
|
149
|
+
record(run, generated) {
|
|
150
|
+
const { dataPath, storageRoot } = this.ctx;
|
|
151
|
+
const { config } = run;
|
|
152
|
+
const { roots, projects } = generated.projects;
|
|
153
|
+
new RepoGuardStore(dataPath).save(run.workspaceHost, projects.map((p) => p.host), roots.map((r) => r.host));
|
|
154
|
+
new ProjectRegistry(storageRoot).start({
|
|
155
|
+
launchId: generated.launchId,
|
|
156
|
+
protections: protectionsOf(generated.bootConfig),
|
|
157
|
+
primary: { host: run.workspaceHost, guest: config.guestWorkspace },
|
|
158
|
+
roots,
|
|
159
|
+
boot: projects,
|
|
160
|
+
atBoot: { memoryMb: generated.memoryMb, mappings: generated.mappings, widened: generated.widened },
|
|
161
|
+
});
|
|
162
|
+
new KnownProjects(storageRoot).remember(run.workspaceHost);
|
|
163
|
+
new LifeRecord(storageRoot, dataPath).start(config.sandbox.keepAwake);
|
|
164
|
+
}
|
|
165
|
+
/** Absolute: the watcher runs from another folder, and a relative --config there would make it exit silently. */
|
|
166
|
+
startWatcher() {
|
|
167
|
+
const { config } = this.options;
|
|
168
|
+
if (!watcherRunning(this.ctx.dataPath))
|
|
169
|
+
spawnDetached(this.ctx.entry, ['_watch', ...(config ? ['--config', path.resolve(config)] : [])]);
|
|
170
|
+
}
|
|
171
|
+
/** Waits for the boot and attaches when asked to; otherwise says where the agent opens. */
|
|
172
|
+
async afterStart(run, generated) {
|
|
173
|
+
const { ctx, options, extras } = this;
|
|
174
|
+
const { dataPath, storageRoot } = ctx;
|
|
175
|
+
const { config } = run;
|
|
176
|
+
// Hiding runs alongside; a failure to find the window must never break the launch or an attach.
|
|
177
|
+
const hidden = config.sandbox.headless ? hideSandboxWindow(storageRoot).catch(() => false) : null;
|
|
178
|
+
const headsUp = firstBootNotice(dataPath, generated, config);
|
|
179
|
+
if (options.terminal || options.noAgent || extras.waitUntilReady) {
|
|
180
|
+
if (headsUp)
|
|
181
|
+
console.log(headsUp);
|
|
182
|
+
await waitForBoot(dataPath, generated.launchId, Boolean(headsUp));
|
|
183
|
+
if (extras.waitUntilReady)
|
|
184
|
+
return 0;
|
|
185
|
+
// Without an agent there is no session to attach to: the sandbox itself is the result.
|
|
186
|
+
if (options.noAgent) {
|
|
187
|
+
console.log('Sandbox ready. Its window has a terminal in ' +
|
|
188
|
+
config.guestWorkspace +
|
|
189
|
+
'; from here: sandbox exec -- <command>, sandbox stop.');
|
|
190
|
+
return 0;
|
|
191
|
+
}
|
|
192
|
+
return attachHere(ctx, await waitForStart(ctx, generated.launchId, 'Starting ' + run.harnessName));
|
|
193
|
+
}
|
|
194
|
+
if (headsUp)
|
|
195
|
+
console.log(headsUp + '\nFollow along: sandbox logs -f');
|
|
196
|
+
if (hidden)
|
|
197
|
+
console.log((await hidden)
|
|
198
|
+
? 'Sandbox running headless. Open the window: sbx-show Attach here: sandbox claude -t'
|
|
199
|
+
: 'Could not find the sandbox window to hide (it may still be starting); run sandbox hide in a moment.');
|
|
200
|
+
else
|
|
201
|
+
console.log('Sandbox starting. ' +
|
|
202
|
+
run.harnessName +
|
|
203
|
+
' opens in Windows Terminal inside it. Attach here any time: sandbox claude -t');
|
|
204
|
+
return 0;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
export function launch(ctx, generateOnly = false, extras = {}) {
|
|
208
|
+
return new Launcher(ctx, generateOnly, extras).run();
|
|
209
|
+
}
|
|
210
|
+
/** What a restart (restart.ts) uses to start the sandbox again and reopen its sessions. */
|
|
211
|
+
const RELAUNCHER = { launch, readySandbox, joinHere, openSession };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Config, ResolvedRun } from '../../../core/types.js';
|
|
2
|
+
import { type Context } from '../context.js';
|
|
3
|
+
/** Nothing has been installed into this data set yet: the first start downloads every toolchain once. */
|
|
4
|
+
export declare function firstBoot(dataPath: string): boolean;
|
|
5
|
+
/** The first-start heads-up (also when this project needs tools not downloaded yet), or null. */
|
|
6
|
+
export declare function firstBootNotice(dataPath: string, generated: {
|
|
7
|
+
toolchains: Record<string, {
|
|
8
|
+
on: boolean;
|
|
9
|
+
}>;
|
|
10
|
+
databases: {
|
|
11
|
+
database: string;
|
|
12
|
+
}[];
|
|
13
|
+
}, config: Config): string | null;
|
|
14
|
+
/** What prepare did, for the launch summary. */
|
|
15
|
+
export interface Prepared {
|
|
16
|
+
readonly account: string | null;
|
|
17
|
+
readonly terminal: string;
|
|
18
|
+
readonly history: string;
|
|
19
|
+
readonly pruned: string;
|
|
20
|
+
readonly filter: string;
|
|
21
|
+
}
|
|
22
|
+
/** Everything a real launch does before the sandbox starts (skipped by `generate`, which only writes files). */
|
|
23
|
+
export declare function prepare(ctx: Context, run: ResolvedRun): Promise<Prepared>;
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import { AccountStore } from '../../../host/profile/index.js';
|
|
4
|
+
import { SandboxChannel } from '../../../host/channel/index.js';
|
|
5
|
+
import { describePrune, pruneStorage } from '../../../host/storage/index.js';
|
|
6
|
+
import { RepoGuardStore, readDataSize, saveMarkedProjects } from '../../../host/guard/index.js';
|
|
7
|
+
import { ensureConpty, ensureTerminal } from '../../../host/tools/index.js';
|
|
8
|
+
import { planView, viewSkipped, saveActiveViews, WorkspaceView } from '../../../host/workspace-view/index.js';
|
|
9
|
+
import { saveForwards } from '../../../host/network/index.js';
|
|
10
|
+
import { saveAuditSettings } from '../../../host/audit/collect.js';
|
|
11
|
+
import { humanBytes } from '../../../core/disk.js';
|
|
12
|
+
import { syncBeforeLaunch, watcherRunning } from '../../../sync/index.js';
|
|
13
|
+
import { errMsg } from '../../../core/util/index.js';
|
|
14
|
+
import { c, working } from '../../output/index.js';
|
|
15
|
+
import { firstStartNotice, pendingDownloads } from './first-start.js';
|
|
16
|
+
import { LifeRecord, UPDATE_RESTART_WARNING, updateRestartPending } from '../../../host/life/index.js';
|
|
17
|
+
/** Nothing has been installed into this data set yet: the first start downloads every toolchain once. */
|
|
18
|
+
export function firstBoot(dataPath) {
|
|
19
|
+
return !fs.existsSync(path.join(dataPath, 'tools', 'resolved-versions.json'));
|
|
20
|
+
}
|
|
21
|
+
/** The first-start heads-up (also when this project needs tools not downloaded yet), or null. */
|
|
22
|
+
export function firstBootNotice(dataPath, generated, config) {
|
|
23
|
+
const wanted = [
|
|
24
|
+
'node',
|
|
25
|
+
...Object.entries(generated.toolchains)
|
|
26
|
+
.filter(([, d]) => d.on)
|
|
27
|
+
.map(([name]) => name),
|
|
28
|
+
...(config.toolchains.vscode.enabled ? ['vscode'] : []),
|
|
29
|
+
...generated.databases.map((d) => d.database),
|
|
30
|
+
];
|
|
31
|
+
return firstStartNotice(firstBoot(dataPath), pendingDownloads(wanted, (dir) => fs.existsSync(path.join(dataPath, 'tools', dir))));
|
|
32
|
+
}
|
|
33
|
+
function syncSummary(config, dataPath, workspaceHost) {
|
|
34
|
+
try {
|
|
35
|
+
const s = syncBeforeLaunch(config, dataPath, workspaceHost);
|
|
36
|
+
return s.history + ' file(s) of history in, claude-mem ' + s.claudeMem;
|
|
37
|
+
}
|
|
38
|
+
catch (e) {
|
|
39
|
+
return 'FAILED: ' + errMsg(e);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* workspaceFilter: brings the project's filtered view in step before the sandbox maps it, and tells the background
|
|
44
|
+
* watcher to keep it in step while the sandbox runs. Returns the line for the launch table.
|
|
45
|
+
*/
|
|
46
|
+
async function prepareWorkspaceView(ctx, run) {
|
|
47
|
+
const plan = planView(run.config, ctx.storageRoot, run.workspaceHost);
|
|
48
|
+
saveActiveViews(ctx.storageRoot, ctx.dataPath, plan ? [plan.options] : []);
|
|
49
|
+
saveForwards(ctx.storageRoot, ctx.dataPath, run.config.sandbox.networking ? run.config.network.forwardPorts : []);
|
|
50
|
+
saveAuditSettings(ctx.storageRoot, ctx.dataPath, { ...run.config.audit, projects: [run.workspaceHost] });
|
|
51
|
+
saveMarkedProjects(ctx.storageRoot, ctx.dataPath, run.config.storage.markSandboxFiles ? [run.workspaceHost] : []);
|
|
52
|
+
const size = readDataSize(ctx.storageRoot, ctx.dataPath);
|
|
53
|
+
const limit = run.config.storage.warnDataGb;
|
|
54
|
+
if (limit > 0 && size && size.bytes > limit * 1024 ** 3)
|
|
55
|
+
console.warn(c.yellow('The persisted data takes ' +
|
|
56
|
+
humanBytes(size.bytes) +
|
|
57
|
+
' (more than storage.warnDataGb, ' +
|
|
58
|
+
limit +
|
|
59
|
+
' GB). See what: sandbox data; free space: sandbox data clean <what>.'));
|
|
60
|
+
if (!plan)
|
|
61
|
+
return (viewSkipped(run.config, run.workspaceHost) ??
|
|
62
|
+
'off (git-ignored files are visible in the sandbox; workspaceFilter.enabled keeps them out)');
|
|
63
|
+
const stats = await working('Preparing the workspace without its git-ignored files', () => new WorkspaceView(plan.options).prepare());
|
|
64
|
+
return ('on: git-ignored files stay on this PC' +
|
|
65
|
+
(stats.toView || stats.toHost
|
|
66
|
+
? ' (' +
|
|
67
|
+
stats.toView +
|
|
68
|
+
' copied in, ' +
|
|
69
|
+
stats.toHost +
|
|
70
|
+
' out' +
|
|
71
|
+
(stats.conflicts ? ', ' + stats.conflicts + ' conflicts kept next to the file' : '') +
|
|
72
|
+
')'
|
|
73
|
+
: '') +
|
|
74
|
+
'; ' +
|
|
75
|
+
plan.options.view);
|
|
76
|
+
}
|
|
77
|
+
/** Everything a real launch does before the sandbox starts (skipped by `generate`, which only writes files). */
|
|
78
|
+
export async function prepare(ctx, run) {
|
|
79
|
+
const { options, dataPath, storageRoot } = ctx;
|
|
80
|
+
const { config } = run;
|
|
81
|
+
const accounts = new AccountStore(storageRoot);
|
|
82
|
+
const account = options.account ?? accounts.defaultName();
|
|
83
|
+
if (account && run.harnessName === 'claude' && account !== accounts.activeFor(dataPath))
|
|
84
|
+
accounts.activate(dataPath, account);
|
|
85
|
+
const terminal = config.provisioning.terminal.enabled
|
|
86
|
+
? await ensureTerminal(dataPath, config.provisioning.refresh, { pwsh: config.toolchains.pwsh.enabled !== false })
|
|
87
|
+
: { exe: null, message: 'disabled' };
|
|
88
|
+
const conpty = config.provisioning.conpty.enabled ? await ensureConpty(dataPath, config.provisioning.refresh) : 'off';
|
|
89
|
+
const history = syncSummary(config, dataPath, run.workspaceHost);
|
|
90
|
+
const guarded = new RepoGuardStore(dataPath).check();
|
|
91
|
+
if (guarded.length)
|
|
92
|
+
console.warn(c.yellow('SECURITY: neutralised ' +
|
|
93
|
+
guarded.length +
|
|
94
|
+
' change(s) the last sandbox made that could run code on this PC (see sandbox status).'));
|
|
95
|
+
const stopped = new LifeRecord(storageRoot, dataPath).lastStopWarning(watcherRunning(dataPath));
|
|
96
|
+
if (stopped)
|
|
97
|
+
console.warn(c.yellow(stopped));
|
|
98
|
+
if (updateRestartPending())
|
|
99
|
+
console.warn(c.yellow(UPDATE_RESTART_WARNING));
|
|
100
|
+
new SandboxChannel(dataPath).reset();
|
|
101
|
+
const filter = await prepareWorkspaceView(ctx, run);
|
|
102
|
+
return {
|
|
103
|
+
account,
|
|
104
|
+
terminal: terminal.message + '; pseudo console: ' + conpty,
|
|
105
|
+
history,
|
|
106
|
+
pruned: describePrune(pruneStorage(storageRoot)),
|
|
107
|
+
filter,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { attachTerminal } from '../../../host/channel/index.js';
|
|
2
|
+
import type { SandboxStatus, SessionStatus } from '../../../core/types.js';
|
|
3
|
+
import type { Context } from '../context.js';
|
|
4
|
+
import { type Joined, type Relauncher } from '../projects/index.js';
|
|
5
|
+
/** How openSession starts a session; restart.ts reopens sessions with reuse off and the agent's resume arguments. */
|
|
6
|
+
export interface OpenSessionOptions {
|
|
7
|
+
readonly attach: boolean;
|
|
8
|
+
readonly harness?: string;
|
|
9
|
+
readonly args?: string[];
|
|
10
|
+
readonly reuse?: boolean;
|
|
11
|
+
}
|
|
12
|
+
/** A session to open: an agent (the default one when not given), a folder, arguments of its own. */
|
|
13
|
+
interface Want {
|
|
14
|
+
readonly harness?: string;
|
|
15
|
+
readonly folder: string;
|
|
16
|
+
readonly args?: string[];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Attaches this terminal; with attach.autoHide the sandbox window hides meanwhile (best effort, never fails the
|
|
20
|
+
* attach).
|
|
21
|
+
*/
|
|
22
|
+
export declare function attachHere(ctx: Context, session: Parameters<typeof attachTerminal>[0]): Promise<number>;
|
|
23
|
+
/** The sandbox writes sandbox.json a few seconds into its boot; a second launch right after the first waits for it. */
|
|
24
|
+
export declare function runningSandboxStatus(dataPath: string): Promise<SandboxStatus>;
|
|
25
|
+
/**
|
|
26
|
+
* Waits for the boot with its current step and what it sets up on one line (plain lines without a terminal).
|
|
27
|
+
* timed: say how long it took (a first start, where that is worth knowing).
|
|
28
|
+
*/
|
|
29
|
+
export declare function waitForBoot(dataPath: string, launchId: string | null, timed?: boolean): Promise<SandboxStatus>;
|
|
30
|
+
/** The running sandbox, once it is ready. */
|
|
31
|
+
export declare function readySandbox(dataPath: string): Promise<SandboxStatus>;
|
|
32
|
+
/** Waits for a session to start (its project's setup, the agent's install) with its progress on a spinner. */
|
|
33
|
+
export declare function waitForStart(ctx: Context, requestId: string, what: string): Promise<SessionStatus>;
|
|
34
|
+
/**
|
|
35
|
+
* Starts (or picks back up) a session in the folder `joined` describes. attach: show it in this terminal.
|
|
36
|
+
* Exported for restart.ts, which reopens the sessions a restart ended.
|
|
37
|
+
*/
|
|
38
|
+
export declare function openSession(ctx: Context, ready: SandboxStatus, joined: Joined, o: OpenSessionOptions): Promise<number>;
|
|
39
|
+
/** The same command, for one of its sessions (its folder, agent, and the arguments after -- plus its own). */
|
|
40
|
+
export declare function contextFor(ctx: Context, want: Want): Context;
|
|
41
|
+
/** A sandbox is already running: open the sessions in it (new tabs inside; optionally attach here). */
|
|
42
|
+
export declare function launchIntoRunning(ctx: Context, relauncher: Relauncher): Promise<number>;
|
|
43
|
+
/** `sandbox start` while one runs: this folder joins it (set up, no agent), or a restart that adds it is offered. */
|
|
44
|
+
export declare function startIntoRunning(ctx: Context, relauncher: Relauncher): Promise<number>;
|
|
45
|
+
export {};
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
// A sandbox that is already running: wait for it, open sessions in it, attach this terminal to one.
|
|
2
|
+
import _ from 'lodash';
|
|
3
|
+
import { attachTerminal, findUnwatchedSession, SandboxChannel } from '../../../host/channel/index.js';
|
|
4
|
+
import { insideSandbox, hideSandboxWindow, showSandboxWindow } from '../../../host/sandbox/index.js';
|
|
5
|
+
import { NeedsRestart } from '../../../host/projects/index.js';
|
|
6
|
+
import { RunDir } from '../../../shared/channel/index.js';
|
|
7
|
+
import { errMsg, fail, sleep } from '../../../core/util/index.js';
|
|
8
|
+
import { c, follow, working, table } from '../../output/index.js';
|
|
9
|
+
import { bootLine, readyIn, stillWorking } from './boot-progress.js';
|
|
10
|
+
import { hereDir, joinHere, readyHere, offerRestart } from '../projects/index.js';
|
|
11
|
+
/** How long a session may take to start (its project's setup, the agent's install). */
|
|
12
|
+
const SESSION_START_MS = 60 * 60 * 1000;
|
|
13
|
+
/**
|
|
14
|
+
* Attaches this terminal; with attach.autoHide the sandbox window hides meanwhile (best effort, never fails the
|
|
15
|
+
* attach).
|
|
16
|
+
*/
|
|
17
|
+
export function attachHere(ctx, session) {
|
|
18
|
+
if (ctx.loaded.config.attach.autoHide && !insideSandbox())
|
|
19
|
+
void hideSandboxWindow(ctx.storageRoot, 120).catch(() => false);
|
|
20
|
+
return attachTerminal(session);
|
|
21
|
+
}
|
|
22
|
+
/** The sandbox writes sandbox.json a few seconds into its boot; a second launch right after the first waits for it. */
|
|
23
|
+
export async function runningSandboxStatus(dataPath) {
|
|
24
|
+
const run = new RunDir(dataPath);
|
|
25
|
+
for (let i = 0; i < 60; i++) {
|
|
26
|
+
const status = run.readSandboxStatus();
|
|
27
|
+
if (status)
|
|
28
|
+
return status;
|
|
29
|
+
await sleep(1000);
|
|
30
|
+
}
|
|
31
|
+
return fail('A Windows Sandbox is running that this tool did not start (or that uses another storage.dataName).', 'Close that sandbox window first, then run sandbox claude again.');
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Waits for the boot with its current step and what it sets up on one line (plain lines without a terminal).
|
|
35
|
+
* timed: say how long it took (a first start, where that is worth knowing).
|
|
36
|
+
*/
|
|
37
|
+
export async function waitForBoot(dataPath, launchId, timed = false) {
|
|
38
|
+
let status = null;
|
|
39
|
+
const start = Date.now();
|
|
40
|
+
const ready = await follow(() => bootLine(status), () => new SandboxChannel(dataPath).waitForReady(launchId, () => undefined, (s) => {
|
|
41
|
+
if (s.phase !== 'failed')
|
|
42
|
+
status = s;
|
|
43
|
+
}), { stall: stillWorking });
|
|
44
|
+
if (timed)
|
|
45
|
+
console.log(readyIn(Date.now() - start));
|
|
46
|
+
return ready;
|
|
47
|
+
}
|
|
48
|
+
/** The running sandbox, once it is ready. */
|
|
49
|
+
export async function readySandbox(dataPath) {
|
|
50
|
+
const status = await runningSandboxStatus(dataPath);
|
|
51
|
+
return status.phase === 'ready' ? status : waitForBoot(dataPath, status.launchId);
|
|
52
|
+
}
|
|
53
|
+
/** Waits for a session to start (its project's setup, the agent's install) with its progress on a spinner. */
|
|
54
|
+
export function waitForStart(ctx, requestId, what) {
|
|
55
|
+
let step = 'starting';
|
|
56
|
+
const shown = () => ({ line: what + ': ' + step, key: step, what: step });
|
|
57
|
+
return follow(shown, () => new SandboxChannel(ctx.dataPath).waitForSession(requestId, SESSION_START_MS, (m) => {
|
|
58
|
+
step = m;
|
|
59
|
+
}), { stall: stillWorking });
|
|
60
|
+
}
|
|
61
|
+
/** Asks the sandbox for a session; the agent's definition goes along (the sandbox may have booted with another). */
|
|
62
|
+
function requestSession(ctx, channel, harness, args, joined) {
|
|
63
|
+
const harnessSpec = ctx.loaded.config.harnesses[harness];
|
|
64
|
+
return channel.requestSession(harness, args, joined.guestDir, {
|
|
65
|
+
...(joined.spec ? { project: joined.spec } : {}),
|
|
66
|
+
...(harnessSpec ? { harnessSpec } : {}),
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Starts (or picks back up) a session in the folder `joined` describes. attach: show it in this terminal.
|
|
71
|
+
* Exported for restart.ts, which reopens the sessions a restart ended.
|
|
72
|
+
*/
|
|
73
|
+
export async function openSession(ctx, ready, joined, o) {
|
|
74
|
+
const { options, loaded, dataPath } = ctx;
|
|
75
|
+
const cwd = joined.guestDir;
|
|
76
|
+
const harness = o.harness ?? options.harness ?? joined.harness ?? loaded.config.defaultHarness;
|
|
77
|
+
const args = o.args ?? options.passthrough;
|
|
78
|
+
// -t with nothing new for the agent: pick up this folder's session if no terminal on this PC shows it (its tab was
|
|
79
|
+
// closed, or you detached). Someone already attached, --new, or agent arguments: a new session, as before.
|
|
80
|
+
const reuse = (o.reuse ?? true) && o.attach && !options.newSession && args.length === 0 && loaded.config.attach.reuseSession;
|
|
81
|
+
const existing = reuse ? await findUnwatchedSession(dataPath, harness, cwd) : null;
|
|
82
|
+
if (existing) {
|
|
83
|
+
console.log('Reattaching to ' +
|
|
84
|
+
harness +
|
|
85
|
+
' session ' +
|
|
86
|
+
existing.id +
|
|
87
|
+
' in ' +
|
|
88
|
+
cwd +
|
|
89
|
+
' (no other terminal is attached; --new starts another).');
|
|
90
|
+
return attachHere(ctx, existing);
|
|
91
|
+
}
|
|
92
|
+
console.log(joined.spec
|
|
93
|
+
? 'Starting ' +
|
|
94
|
+
harness +
|
|
95
|
+
' for ' +
|
|
96
|
+
joined.project?.host +
|
|
97
|
+
' in the running sandbox (' +
|
|
98
|
+
cwd +
|
|
99
|
+
'; the first time sets up what it needs).'
|
|
100
|
+
: 'Sandbox already running: starting another ' + harness + ' session in ' + cwd);
|
|
101
|
+
const requestId = requestSession(ctx, new SandboxChannel(dataPath), harness, args, joined);
|
|
102
|
+
const session = await waitForStart(ctx, requestId, 'Starting ' + harness + ' in ' + cwd);
|
|
103
|
+
if (o.attach)
|
|
104
|
+
return attachHere(ctx, session);
|
|
105
|
+
console.log('Session ' +
|
|
106
|
+
session.id +
|
|
107
|
+
' opened in a new tab inside the sandbox. Attach here with: sandbox attach ' +
|
|
108
|
+
session.id +
|
|
109
|
+
(ready.headless ? ' (headless: sbx-show opens the window)' : ''));
|
|
110
|
+
return 0;
|
|
111
|
+
}
|
|
112
|
+
/** The sessions a launch asks for: each --session, else one (the agent, in this folder). */
|
|
113
|
+
function wantedSessions(ctx) {
|
|
114
|
+
return ctx.options.sessions.length ? ctx.options.sessions : [{ harness: ctx.options.harness, folder: hereDir(ctx) }];
|
|
115
|
+
}
|
|
116
|
+
/** The same command, for one of its sessions (its folder, agent, and the arguments after -- plus its own). */
|
|
117
|
+
export function contextFor(ctx, want) {
|
|
118
|
+
return {
|
|
119
|
+
...ctx,
|
|
120
|
+
options: {
|
|
121
|
+
...ctx.options,
|
|
122
|
+
workspace: want.folder,
|
|
123
|
+
harness: want.harness,
|
|
124
|
+
sessions: [],
|
|
125
|
+
passthrough: [...ctx.options.passthrough, ...(want.args ?? [])],
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Several sessions at once: all requested together (projects set up in parallel), then listed; -t attaches the first.
|
|
131
|
+
*/
|
|
132
|
+
async function openSessions(ctx, ready, list) {
|
|
133
|
+
const { loaded, options } = ctx;
|
|
134
|
+
const channel = new SandboxChannel(ctx.dataPath);
|
|
135
|
+
const requests = list.map(({ ctx: at, joined }) => {
|
|
136
|
+
const harness = at.options.harness ?? joined.harness ?? loaded.config.defaultHarness;
|
|
137
|
+
const id = requestSession(ctx, channel, harness, at.options.passthrough, joined);
|
|
138
|
+
return { id, harness, folder: at.options.workspace ?? joined.guestDir, cwd: joined.guestDir };
|
|
139
|
+
});
|
|
140
|
+
let started = 0;
|
|
141
|
+
const results = await working(() => 'Starting ' + requests.length + ' sessions (' + started + ' running)', () => Promise.allSettled(requests.map(async (r) => {
|
|
142
|
+
const s = await channel.waitForSession(r.id, SESSION_START_MS, () => undefined);
|
|
143
|
+
started++;
|
|
144
|
+
return s;
|
|
145
|
+
})));
|
|
146
|
+
table([
|
|
147
|
+
['SESSION', 'AGENT', 'FOLDER', ''],
|
|
148
|
+
...requests.map((r, i) => {
|
|
149
|
+
const result = results[i];
|
|
150
|
+
return [
|
|
151
|
+
r.id,
|
|
152
|
+
r.harness,
|
|
153
|
+
r.folder,
|
|
154
|
+
result.status === 'fulfilled' ? 'running sandbox attach ' + r.id : c.red('FAILED: ' + errMsg(result.reason)),
|
|
155
|
+
];
|
|
156
|
+
}),
|
|
157
|
+
]);
|
|
158
|
+
const first = results.find((r) => r.status === 'fulfilled');
|
|
159
|
+
if (options.terminal && first)
|
|
160
|
+
return attachHere(ctx, first.value);
|
|
161
|
+
if (!first)
|
|
162
|
+
return 1;
|
|
163
|
+
console.log('Each has its own tab inside the sandbox' +
|
|
164
|
+
(ready.headless ? ' (headless: sbx-show opens the window)' : '') +
|
|
165
|
+
'. Attach to any of them, from any terminal: sandbox attach');
|
|
166
|
+
return results.every((r) => r.status === 'fulfilled') ? 0 : 1;
|
|
167
|
+
}
|
|
168
|
+
/** A sandbox is already running: open the sessions in it (new tabs inside; optionally attach here). */
|
|
169
|
+
export async function launchIntoRunning(ctx, relauncher) {
|
|
170
|
+
const ready = await readySandbox(ctx.dataPath);
|
|
171
|
+
// Every folder joins first: when one needs a restart, nothing has been started that the restart would end.
|
|
172
|
+
const joined = [];
|
|
173
|
+
const needs = [];
|
|
174
|
+
for (const want of wantedSessions(ctx)) {
|
|
175
|
+
const at = ctx.options.sessions.length ? contextFor(ctx, want) : ctx;
|
|
176
|
+
try {
|
|
177
|
+
joined.push({ ctx: at, joined: await joinHere(at, ready) });
|
|
178
|
+
}
|
|
179
|
+
catch (e) {
|
|
180
|
+
if (!(e instanceof NeedsRestart))
|
|
181
|
+
throw e;
|
|
182
|
+
if (!needs.some((n) => n.hostDir.toLowerCase() === e.hostDir.toLowerCase()))
|
|
183
|
+
needs.push(e);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
if (needs.length)
|
|
187
|
+
return offerRestart(ctx, needs, () => launchIntoRunning(ctx, relauncher), relauncher);
|
|
188
|
+
for (const note of _.uniq(joined.flatMap((j) => j.joined.notes)))
|
|
189
|
+
console.log(note);
|
|
190
|
+
if (joined.length === 1)
|
|
191
|
+
return openSession(joined[0].ctx, ready, joined[0].joined, { attach: ctx.options.terminal });
|
|
192
|
+
return openSessions(ctx, ready, joined);
|
|
193
|
+
}
|
|
194
|
+
/** `sandbox start` while one runs: this folder joins it (set up, no agent), or a restart that adds it is offered. */
|
|
195
|
+
export async function startIntoRunning(ctx, relauncher) {
|
|
196
|
+
const ready = await readySandbox(ctx.dataPath);
|
|
197
|
+
let joined;
|
|
198
|
+
try {
|
|
199
|
+
joined = await readyHere(ctx, ready);
|
|
200
|
+
}
|
|
201
|
+
catch (e) {
|
|
202
|
+
if (e instanceof NeedsRestart)
|
|
203
|
+
return offerRestart(ctx, [e], () => startIntoRunning(ctx, relauncher), relauncher);
|
|
204
|
+
throw e;
|
|
205
|
+
}
|
|
206
|
+
const where = joined.spec
|
|
207
|
+
? ' This folder is ready in it as ' +
|
|
208
|
+
joined.guestDir +
|
|
209
|
+
' (sbx-shell ' +
|
|
210
|
+
joined.spec.name +
|
|
211
|
+
' opens a terminal there inside).'
|
|
212
|
+
: '';
|
|
213
|
+
console.log('A sandbox is already running' +
|
|
214
|
+
(showSandboxWindow(ctx.storageRoot) ? '; its window is in front now.' : '.') +
|
|
215
|
+
where +
|
|
216
|
+
' Start an agent in it with sandbox claude (or sandbox <agent>); stop it with sandbox stop.');
|
|
217
|
+
return 0;
|
|
218
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Generated, ResolvedRun } from '../../../core/types.js';
|
|
2
|
+
import type { Prepared } from './prepare.js';
|
|
3
|
+
/** What generateSandbox returned. */
|
|
4
|
+
export type GeneratedSandbox = Generated & {
|
|
5
|
+
readonly personalization: string;
|
|
6
|
+
};
|
|
7
|
+
/** The launch summary rows, in the order they are printed. */
|
|
8
|
+
export declare function launchSummary(run: ResolvedRun, generated: GeneratedSandbox, prepared: Prepared | null): string[][];
|