windows-development-sandbox 1.4.0 → 1.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.sandbox-config.example.json +2 -1
- package/config.example.json +4 -1
- package/dist/api.js +27 -16
- package/dist/cli/args.d.ts +4 -6
- package/dist/cli/args.js +67 -34
- package/dist/cli/argv.d.ts +9 -0
- package/dist/cli/argv.js +22 -0
- package/dist/cli/commands/accounts.d.ts +1 -1
- package/dist/cli/commands/accounts.js +42 -27
- package/dist/cli/commands/agent-commands.d.ts +3 -3
- package/dist/cli/commands/agent-commands.js +27 -18
- package/dist/cli/commands/context.d.ts +9 -11
- package/dist/cli/commands/context.js +35 -32
- package/dist/cli/commands/data/clean.d.ts +2 -2
- package/dist/cli/commands/data/clean.js +27 -11
- package/dist/cli/commands/data/collect.d.ts +6 -3
- package/dist/cli/commands/data/collect.js +46 -15
- package/dist/cli/commands/data/index.d.ts +2 -2
- package/dist/cli/commands/data/index.js +30 -12
- package/dist/cli/commands/data/remove.d.ts +1 -1
- package/dist/cli/commands/data/remove.js +4 -4
- package/dist/cli/commands/index.d.ts +5 -4
- package/dist/cli/commands/index.js +5 -4
- package/dist/cli/commands/launch/add-root.d.ts +7 -0
- package/dist/cli/commands/launch/add-root.js +64 -0
- package/dist/cli/commands/launch/boot-progress.d.ts +7 -0
- package/dist/cli/commands/launch/boot-progress.js +48 -0
- package/dist/cli/commands/launch/boot-wants.d.ts +11 -0
- package/dist/cli/commands/launch/boot-wants.js +48 -0
- package/dist/cli/commands/launch/first-start.d.ts +10 -0
- package/dist/cli/commands/launch/first-start.js +53 -0
- package/dist/cli/commands/launch/index.d.ts +6 -0
- package/dist/cli/commands/launch/index.js +6 -0
- package/dist/cli/commands/launch/launch.d.ts +8 -0
- package/dist/cli/commands/launch/launch.js +211 -0
- package/dist/cli/commands/launch/prepare.d.ts +23 -0
- package/dist/cli/commands/launch/prepare.js +109 -0
- package/dist/cli/commands/launch/running.d.ts +45 -0
- package/dist/cli/commands/launch/running.js +218 -0
- package/dist/cli/commands/launch/summary.d.ts +8 -0
- package/dist/cli/commands/launch/summary.js +98 -0
- package/dist/cli/commands/maintenance/audit.d.ts +3 -0
- package/dist/cli/commands/maintenance/audit.js +58 -0
- package/dist/cli/commands/maintenance/clean.d.ts +2 -0
- package/dist/cli/commands/maintenance/clean.js +10 -0
- package/dist/cli/commands/maintenance/config.d.ts +2 -0
- package/dist/cli/commands/maintenance/config.js +145 -0
- package/dist/cli/commands/maintenance/doctor.d.ts +2 -0
- package/dist/cli/commands/maintenance/doctor.js +52 -0
- package/dist/cli/commands/maintenance/host-claude.d.ts +2 -0
- package/dist/cli/commands/maintenance/host-claude.js +4 -0
- package/dist/cli/commands/maintenance/index.d.ts +8 -0
- package/dist/cli/commands/maintenance/index.js +9 -0
- package/dist/cli/commands/maintenance/logs.d.ts +2 -0
- package/dist/cli/commands/maintenance/logs.js +44 -0
- package/dist/cli/commands/maintenance/sync.d.ts +2 -0
- package/dist/cli/commands/maintenance/sync.js +12 -0
- package/dist/cli/commands/maintenance/watch.d.ts +3 -0
- package/dist/cli/commands/maintenance/watch.js +6 -0
- package/dist/cli/commands/projects/describe-sessions.d.ts +3 -0
- package/dist/cli/commands/projects/describe-sessions.js +15 -0
- package/dist/cli/commands/projects/here.d.ts +38 -0
- package/dist/cli/commands/projects/here.js +145 -0
- package/dist/cli/commands/projects/index.d.ts +4 -0
- package/dist/cli/commands/projects/index.js +4 -0
- package/dist/cli/commands/projects/projects.d.ts +14 -0
- package/dist/cli/commands/projects/projects.js +213 -0
- package/dist/cli/commands/projects/restart.d.ts +15 -0
- package/dist/cli/commands/projects/restart.js +149 -0
- package/dist/cli/commands/registry.d.ts +3 -0
- package/dist/cli/commands/registry.js +34 -0
- package/dist/cli/commands/repair/checks.js +105 -29
- package/dist/cli/commands/repair/finders.d.ts +13 -10
- package/dist/cli/commands/repair/finders.js +63 -43
- package/dist/cli/commands/repair/index.d.ts +4 -4
- package/dist/cli/commands/repair/index.js +47 -21
- package/dist/cli/commands/repair/types.d.ts +2 -2
- package/dist/cli/commands/repair/types.js +7 -2
- package/dist/cli/commands/sessions/attach.d.ts +2 -0
- package/dist/cli/commands/sessions/attach.js +45 -0
- package/dist/cli/commands/sessions/control.d.ts +4 -0
- package/dist/cli/commands/sessions/control.js +62 -0
- package/dist/cli/commands/sessions/exec.d.ts +6 -0
- package/dist/cli/commands/sessions/exec.js +72 -0
- package/dist/cli/commands/sessions/index.d.ts +6 -0
- package/dist/cli/commands/sessions/index.js +9 -0
- package/dist/cli/commands/sessions/list.d.ts +15 -0
- package/dist/cli/commands/sessions/list.js +65 -0
- package/dist/cli/commands/sessions/status.d.ts +2 -0
- package/dist/cli/commands/sessions/status.js +153 -0
- package/dist/cli/commands/sessions/window.d.ts +3 -0
- package/dist/cli/commands/sessions/window.js +18 -0
- package/dist/cli/commands/setup/checks.d.ts +4 -4
- package/dist/cli/commands/setup/checks.js +36 -19
- package/dist/cli/commands/setup/facts.d.ts +6 -6
- package/dist/cli/commands/setup/facts.js +23 -11
- package/dist/cli/commands/setup/index.d.ts +1 -1
- package/dist/cli/commands/setup/index.js +25 -12
- package/dist/cli/commands/user-config.d.ts +5 -5
- package/dist/cli/commands/user-config.js +14 -12
- package/dist/cli/history.d.ts +5 -4
- package/dist/cli/history.js +23 -11
- package/dist/cli/index.d.ts +4 -14
- package/dist/cli/index.js +27 -77
- package/dist/cli/manifest.d.ts +464 -10
- package/dist/cli/manifest.js +328 -54
- package/dist/cli/menu/apps.d.ts +7 -5
- package/dist/cli/menu/apps.js +64 -16
- package/dist/cli/menu/command-fields.d.ts +15 -0
- package/dist/cli/menu/command-fields.js +23 -0
- package/dist/cli/menu/command-form.d.ts +3 -5
- package/dist/cli/menu/command-form.js +116 -48
- package/dist/cli/menu/home.d.ts +22 -0
- package/dist/cli/menu/home.js +72 -0
- package/dist/cli/menu/index.d.ts +2 -24
- package/dist/cli/menu/index.js +4 -178
- package/dist/cli/menu/menu.d.ts +23 -0
- package/dist/cli/menu/menu.js +185 -0
- package/dist/cli/menu/settings/categories.d.ts +2 -2
- package/dist/cli/menu/settings/categories.js +123 -20
- package/dist/cli/menu/settings/collections/collection-editor.d.ts +23 -0
- package/dist/cli/menu/settings/collections/collection-editor.js +89 -0
- package/dist/cli/menu/settings/collections/map-editor.d.ts +10 -0
- package/dist/cli/menu/settings/collections/map-editor.js +34 -0
- package/dist/cli/menu/settings/collections/object-list-editor.d.ts +10 -0
- package/dist/cli/menu/settings/collections/object-list-editor.js +23 -0
- package/dist/cli/menu/settings/collections/object-map-editor.d.ts +10 -0
- package/dist/cli/menu/settings/collections/object-map-editor.js +35 -0
- package/dist/cli/menu/settings/collections/string-list-editor.d.ts +12 -0
- package/dist/cli/menu/settings/collections/string-list-editor.js +39 -0
- package/dist/cli/menu/settings/config-file.d.ts +2 -2
- package/dist/cli/menu/settings/config-file.js +42 -19
- package/dist/cli/menu/settings/editor-actions.d.ts +2 -0
- package/dist/cli/menu/settings/editor-actions.js +2 -0
- package/dist/cli/menu/settings/format.d.ts +5 -0
- package/dist/cli/menu/settings/format.js +39 -0
- package/dist/cli/menu/settings/index.d.ts +1 -29
- package/dist/cli/menu/settings/index.js +1 -133
- package/dist/cli/menu/settings/object-editor.d.ts +12 -0
- package/dist/cli/menu/settings/object-editor.js +86 -0
- package/dist/cli/menu/settings/schema-node.d.ts +3 -1
- package/dist/cli/menu/settings/schema-node.js +71 -24
- package/dist/cli/menu/settings/settings-editor.d.ts +30 -0
- package/dist/cli/menu/settings/settings-editor.js +176 -0
- package/dist/cli/menu/settings/{editors.d.ts → value-editor.d.ts} +2 -13
- package/dist/cli/menu/settings/value-editor.js +137 -0
- package/dist/cli/menu/several.d.ts +4 -4
- package/dist/cli/menu/several.js +61 -20
- package/dist/cli/{colors.d.ts → output/colors.d.ts} +8 -8
- package/dist/cli/{colors.js → output/colors.js} +32 -14
- package/dist/cli/output/index.d.ts +3 -0
- package/dist/cli/output/index.js +3 -0
- package/dist/cli/output/print.d.ts +5 -0
- package/dist/cli/output/print.js +14 -0
- package/dist/cli/output/progress.d.ts +24 -0
- package/dist/cli/output/progress.js +124 -0
- package/dist/cli/report.d.ts +2 -0
- package/dist/cli/report.js +20 -0
- package/dist/cli/tui/app.d.ts +6 -16
- package/dist/cli/tui/app.js +28 -8
- package/dist/cli/tui/dialogs/confirm-screen.d.ts +20 -0
- package/dist/cli/tui/dialogs/confirm-screen.js +50 -0
- package/dist/cli/tui/dialogs/message-screen.d.ts +17 -0
- package/dist/cli/tui/dialogs/message-screen.js +55 -0
- package/dist/cli/tui/dialogs/paragraphs.d.ts +2 -0
- package/dist/cli/tui/dialogs/paragraphs.js +5 -0
- package/dist/cli/tui/dialogs/text-screen.d.ts +26 -0
- package/dist/cli/tui/dialogs/text-screen.js +107 -0
- package/dist/cli/tui/frame.js +3 -1
- package/dist/cli/tui/index.d.ts +7 -3
- package/dist/cli/tui/index.js +4 -2
- package/dist/cli/tui/list/list-screen.d.ts +29 -0
- package/dist/cli/tui/{list-screen.js → list/list-screen.js} +86 -23
- package/dist/cli/tui/{list-screen.d.ts → list/list-types.d.ts} +0 -28
- package/dist/cli/tui/screen.d.ts +14 -0
- package/dist/cli/tui/terminal.js +34 -10
- package/dist/cli/tui/text.d.ts +2 -1
- package/dist/cli/tui/text.js +37 -7
- package/dist/cli/tui/theme.js +27 -9
- package/dist/cli/validate.d.ts +8 -8
- package/dist/cli/validate.js +32 -21
- package/dist/core/config/defaults.d.ts +2 -0
- package/dist/core/config/defaults.js +203 -0
- package/dist/core/config/index.d.ts +2 -0
- package/dist/core/config/index.js +3 -0
- package/dist/core/{config.d.ts → config/loader.d.ts} +1 -2
- package/dist/core/config/loader.js +47 -0
- package/dist/core/{detect-databases.js → detect/databases.js} +111 -23
- package/dist/core/detect/index.d.ts +4 -0
- package/dist/core/detect/index.js +4 -0
- package/dist/core/{detect-pwsh.d.ts → detect/pwsh.d.ts} +1 -1
- package/dist/core/{detect-pwsh.js → detect/pwsh.js} +25 -11
- package/dist/core/{detect-toolchains.d.ts → detect/toolchains.d.ts} +1 -1
- package/dist/core/{detect-toolchains.js → detect/toolchains.js} +42 -5
- package/dist/{guest/toolchains → core/detect}/versions.js +28 -12
- package/dist/core/disk.d.ts +2 -0
- package/dist/core/disk.js +46 -3
- package/dist/core/local-config/boot-wants.d.ts +45 -0
- package/dist/core/local-config/boot-wants.js +120 -0
- package/dist/core/local-config/file.d.ts +3 -0
- package/dist/core/local-config/file.js +16 -0
- package/dist/core/local-config/index.d.ts +5 -0
- package/dist/core/local-config/index.js +7 -0
- package/dist/core/{local-config.d.ts → local-config/overrides.d.ts} +11 -11
- package/dist/core/{local-config.js → local-config/overrides.js} +53 -54
- package/dist/core/{project-policy.d.ts → local-config/policy.d.ts} +7 -3
- package/dist/core/{project-policy.js → local-config/policy.js} +16 -6
- package/dist/core/local-config/trust.d.ts +13 -0
- package/dist/core/local-config/trust.js +43 -0
- package/dist/core/package-info.d.ts +4 -0
- package/dist/core/package-info.js +13 -0
- package/dist/core/run/guest-workspace.d.ts +23 -0
- package/dist/core/run/guest-workspace.js +47 -0
- package/dist/core/run/index.d.ts +3 -0
- package/dist/core/run/index.js +3 -0
- package/dist/core/run/resolve-run.d.ts +3 -0
- package/dist/core/run/resolve-run.js +202 -0
- package/dist/core/run/versions.d.ts +13 -0
- package/dist/core/run/versions.js +65 -0
- package/dist/core/safe-paths.js +17 -5
- package/dist/core/schema/apps.d.ts +4 -4
- package/dist/core/schema/apps.js +55 -21
- package/dist/core/schema/common.d.ts +13 -10
- package/dist/core/schema/common.js +16 -10
- package/dist/core/schema/config.d.ts +18 -12
- package/dist/core/schema/config.js +78 -53
- package/dist/core/schema/databases.d.ts +4 -3
- package/dist/core/schema/databases.js +16 -12
- package/dist/core/schema/harness.d.ts +1 -1
- package/dist/core/schema/harness.js +17 -7
- package/dist/core/schema/index.d.ts +6 -0
- package/dist/core/schema/index.js +8 -0
- package/dist/core/schema/json-schema.js +10 -5
- package/dist/core/schema/profile.d.ts +4 -4
- package/dist/core/schema/profile.js +37 -17
- package/dist/core/schema/projects.d.ts +2 -1
- package/dist/core/schema/projects.js +16 -5
- package/dist/core/schema/sandbox.d.ts +12 -12
- package/dist/core/schema/sandbox.js +101 -37
- package/dist/core/schema/toolchains.d.ts +6 -1
- package/dist/core/schema/toolchains.js +84 -34
- package/dist/core/types.d.ts +36 -9
- package/dist/core/util/errors.d.ts +8 -0
- package/dist/core/util/errors.js +14 -0
- package/dist/core/util/fs.d.ts +8 -0
- package/dist/core/util/fs.js +40 -0
- package/dist/core/util/index.d.ts +7 -0
- package/dist/core/util/index.js +7 -0
- package/dist/core/util/jsonc.d.ts +6 -0
- package/dist/core/util/jsonc.js +25 -0
- package/dist/core/util/links.d.ts +10 -0
- package/dist/core/util/links.js +39 -0
- package/dist/core/util/paths.d.ts +7 -0
- package/dist/core/util/paths.js +33 -0
- package/dist/core/util/process.d.ts +15 -0
- package/dist/core/util/process.js +54 -0
- package/dist/core/util/text.d.ts +8 -0
- package/dist/core/util/text.js +8 -0
- package/dist/guest/{setup/agents.js → agents/agent-installer.js} +24 -4
- package/dist/guest/apps/after-install.d.ts +3 -0
- package/dist/guest/apps/after-install.js +47 -0
- package/dist/guest/apps/app-installer.d.ts +22 -0
- package/dist/guest/apps/app-installer.js +116 -0
- package/dist/guest/apps/find-exe.d.ts +5 -0
- package/dist/guest/apps/find-exe.js +41 -0
- package/dist/guest/apps/index.d.ts +3 -10
- package/dist/guest/apps/index.js +6 -206
- package/dist/guest/apps/resolvers.js +37 -9
- package/dist/guest/apps/shortcuts.d.ts +6 -0
- package/dist/guest/apps/shortcuts.js +28 -0
- package/dist/guest/apps/sources.d.ts +4 -0
- package/dist/guest/apps/sources.js +17 -0
- package/dist/guest/apps/unpack.d.ts +3 -0
- package/dist/guest/apps/unpack.js +47 -0
- package/dist/guest/{audit-parse.js → audit/parse.js} +39 -3
- package/dist/guest/{audit.d.ts → audit/process-audit.d.ts} +3 -1
- package/dist/guest/{audit.js → audit/process-audit.js} +33 -8
- package/dist/guest/boot/boot-env.d.ts +4 -0
- package/dist/guest/{boot-env.js → boot/boot-env.js} +7 -5
- package/dist/guest/boot/boot.d.ts +1 -0
- package/dist/guest/{main.js → boot/boot.js} +100 -50
- package/dist/guest/{guide.js → boot/guide.js} +32 -7
- package/dist/guest/{project-env.d.ts → boot/project-env.d.ts} +3 -3
- package/dist/guest/{project-env.js → boot/project-env.js} +12 -4
- package/dist/guest/boot/project-status.d.ts +5 -0
- package/dist/guest/boot/project-status.js +28 -0
- package/dist/guest/daemon/daemon.d.ts +1 -0
- package/dist/guest/daemon/daemon.js +51 -0
- package/dist/guest/daemon/exec.js +18 -6
- package/dist/guest/daemon/{shutdown.js → idle-shutdown.js} +5 -4
- package/dist/guest/daemon/{project.d.ts → project-provisioner.d.ts} +3 -3
- package/dist/guest/daemon/{project.js → project-provisioner.js} +60 -22
- package/dist/guest/daemon/relays.js +5 -3
- package/dist/guest/daemon/{session.js → sessions.js} +84 -24
- package/dist/guest/daemon/state.d.ts +4 -1
- package/dist/guest/daemon/state.js +34 -20
- package/dist/guest/databases/database-server.d.ts +13 -0
- package/dist/guest/databases/database-server.js +35 -0
- package/dist/guest/databases/dynamodb.d.ts +12 -0
- package/dist/guest/databases/dynamodb.js +81 -0
- package/dist/guest/databases/index.d.ts +2 -0
- package/dist/guest/databases/index.js +2 -0
- package/dist/guest/databases/mongodb.d.ts +7 -0
- package/dist/guest/databases/mongodb.js +46 -0
- package/dist/guest/databases/mysql.d.ts +7 -0
- package/dist/guest/databases/mysql.js +59 -0
- package/dist/guest/databases/names.d.ts +5 -0
- package/dist/guest/databases/names.js +8 -0
- package/dist/guest/databases/postgres.d.ts +9 -0
- package/dist/guest/databases/postgres.js +85 -0
- package/dist/guest/databases/redis.d.ts +7 -0
- package/dist/guest/databases/redis.js +25 -0
- package/dist/guest/databases/registry.d.ts +5 -0
- package/dist/guest/databases/registry.js +51 -0
- package/dist/guest/databases/sbx-db.d.ts +1 -0
- package/dist/guest/{db.js → databases/sbx-db.js} +13 -13
- package/dist/guest/{toolchains/databases → databases}/server.d.ts +5 -5
- package/dist/guest/{toolchains/databases → databases}/server.js +18 -13
- package/dist/guest/entries/daemon.js +16 -0
- package/dist/guest/entries/db.js +10 -0
- package/dist/guest/entries/gitguard.js +20 -0
- package/dist/guest/entries/main.d.ts +1 -0
- package/dist/guest/entries/main.js +24 -0
- package/dist/guest/entries/netproxy.d.ts +1 -0
- package/dist/guest/entries/netproxy.js +7 -0
- package/dist/guest/entries/view.d.ts +1 -0
- package/dist/guest/entries/view.js +11 -0
- package/dist/guest/{gitguard.js → git/decision.js} +49 -26
- package/dist/guest/network/addresses.d.ts +2 -0
- package/dist/guest/network/addresses.js +6 -0
- package/dist/guest/{setup/network.d.ts → network/allow-only.d.ts} +0 -10
- package/dist/guest/network/allow-only.js +84 -0
- package/dist/guest/network/firewall.d.ts +9 -0
- package/dist/guest/{setup/network.js → network/firewall.js} +58 -63
- package/dist/guest/network/proxy-server.d.ts +2 -0
- package/dist/guest/{netproxy.js → network/proxy-server.js} +37 -18
- package/dist/guest/{helpers.d.ts → runtime/csc.d.ts} +1 -1
- package/dist/guest/{helpers.js → runtime/csc.js} +7 -2
- package/dist/guest/runtime/fs.d.ts +2 -0
- package/dist/guest/runtime/fs.js +6 -0
- package/dist/guest/runtime/log.d.ts +3 -0
- package/dist/guest/runtime/log.js +22 -0
- package/dist/guest/runtime/paths.d.ts +13 -0
- package/dist/guest/runtime/paths.js +14 -0
- package/dist/guest/{ports.js → runtime/ports.js} +8 -2
- package/dist/guest/runtime/process.d.ts +15 -0
- package/dist/guest/runtime/process.js +59 -0
- package/dist/guest/{project-context.js → runtime/project-context.js} +1 -1
- package/dist/guest/runtime/session.d.ts +5 -0
- package/dist/guest/runtime/session.js +10 -0
- package/dist/guest/runtime/status.d.ts +7 -0
- package/dist/guest/runtime/status.js +57 -0
- package/dist/guest/{cmdline.js → sessions/cmdline.js} +10 -4
- package/dist/guest/{ptyhost.js → sessions/pty-host.js} +12 -5
- package/dist/guest/{view.js → sessions/viewer.js} +8 -11
- package/dist/guest/setup/claude-mem.d.ts +10 -0
- package/dist/guest/setup/{claude.js → claude-mem.js} +18 -78
- package/dist/guest/setup/{claude.d.ts → claude-profile.d.ts} +0 -10
- package/dist/guest/setup/claude-profile.js +89 -0
- package/dist/guest/setup/desktop.d.ts +2 -0
- package/dist/guest/setup/desktop.js +32 -0
- package/dist/guest/setup/environment.js +28 -5
- package/dist/guest/setup/{user.d.ts → git-identity.d.ts} +0 -2
- package/dist/guest/setup/git-identity.js +34 -0
- package/dist/guest/{gitrules.d.ts → setup/git-rules.d.ts} +1 -1
- package/dist/guest/setup/git-rules.js +50 -0
- package/dist/guest/setup/hooks.js +22 -5
- package/dist/guest/setup/{policy.js → managed-policy.js} +2 -2
- package/dist/guest/toolchains/catalogue.d.ts +4 -4
- package/dist/guest/toolchains/catalogue.js +30 -7
- package/dist/guest/toolchains/detect.d.ts +12 -0
- package/dist/guest/toolchains/detect.js +54 -0
- package/dist/guest/toolchains/index.d.ts +3 -17
- package/dist/guest/toolchains/index.js +1 -80
- package/dist/guest/toolchains/install.d.ts +20 -0
- package/dist/guest/toolchains/install.js +29 -0
- package/dist/guest/toolchains/languages/go.d.ts +3 -0
- package/dist/guest/toolchains/{go.js → languages/go.js} +27 -9
- package/dist/guest/toolchains/languages/java.d.ts +8 -0
- package/dist/guest/toolchains/{java.js → languages/java.js} +57 -18
- package/dist/guest/toolchains/languages/node.d.ts +3 -0
- package/dist/guest/toolchains/{node.js → languages/node.js} +51 -18
- package/dist/guest/toolchains/languages/php.d.ts +3 -0
- package/dist/guest/toolchains/{scripting → languages}/php.js +36 -11
- package/dist/guest/toolchains/languages/python-tools.d.ts +3 -0
- package/dist/guest/toolchains/languages/python-tools.js +12 -0
- package/dist/guest/toolchains/languages/python.d.ts +3 -0
- package/dist/guest/toolchains/{python.js → languages/python.js} +29 -16
- package/dist/guest/toolchains/languages/ruby.d.ts +3 -0
- package/dist/guest/toolchains/{scripting → languages}/ruby.js +28 -10
- package/dist/guest/toolchains/leftovers.d.ts +1 -1
- package/dist/guest/toolchains/leftovers.js +13 -11
- package/dist/guest/toolchains/managers.d.ts +6 -6
- package/dist/guest/toolchains/managers.js +38 -17
- package/dist/guest/toolchains/native/binstall.d.ts +3 -2
- package/dist/guest/toolchains/native/binstall.js +20 -8
- package/dist/guest/toolchains/native/cpp.d.ts +2 -2
- package/dist/guest/toolchains/native/cpp.js +23 -8
- package/dist/guest/toolchains/native/dotnet.d.ts +5 -3
- package/dist/guest/toolchains/native/dotnet.js +72 -24
- package/dist/guest/toolchains/native/mesa.d.ts +2 -2
- package/dist/guest/toolchains/native/mesa.js +27 -10
- package/dist/guest/toolchains/native/msvc/environment.d.ts +4 -4
- package/dist/guest/toolchains/native/msvc/environment.js +30 -16
- package/dist/guest/toolchains/native/msvc/index.d.ts +3 -3
- package/dist/guest/toolchains/native/msvc/index.js +10 -8
- package/dist/guest/toolchains/native/msvc/packages.d.ts +1 -1
- package/dist/guest/toolchains/native/msvc/packages.js +69 -23
- package/dist/guest/toolchains/native/msvc/tree.d.ts +6 -6
- package/dist/guest/toolchains/native/msvc/tree.js +15 -9
- package/dist/guest/toolchains/native/rust-extras.d.ts +23 -0
- package/dist/guest/toolchains/native/rust-extras.js +100 -0
- package/dist/guest/toolchains/native/rust.d.ts +2 -2
- package/dist/guest/toolchains/native/rust.js +41 -10
- package/dist/guest/toolchains/{scripting → native}/vcruntime.d.ts +2 -2
- package/dist/guest/toolchains/{scripting → native}/vcruntime.js +17 -7
- package/dist/guest/toolchains/package-ledger.d.ts +17 -0
- package/dist/guest/toolchains/package-ledger.js +54 -0
- package/dist/guest/toolchains/plan.d.ts +3 -24
- package/dist/guest/toolchains/plan.js +99 -111
- package/dist/guest/toolchains/runtimes.d.ts +6 -6
- package/dist/guest/toolchains/runtimes.js +31 -13
- package/dist/guest/toolchains/scheduler.d.ts +22 -0
- package/dist/guest/toolchains/scheduler.js +123 -0
- package/dist/guest/toolchains/setup.d.ts +10 -0
- package/dist/guest/toolchains/setup.js +22 -0
- package/dist/guest/toolchains/state-file.d.ts +3 -0
- package/dist/guest/toolchains/state-file.js +10 -0
- package/dist/guest/toolchains/step.d.ts +24 -0
- package/dist/guest/toolchains/step.js +1 -0
- package/dist/guest/toolchains/tool-env.d.ts +12 -0
- package/dist/guest/toolchains/tool-env.js +16 -0
- package/dist/guest/toolchains/tools/cli.d.ts +10 -0
- package/dist/guest/toolchains/{cli.js → tools/cli.js} +35 -15
- package/dist/guest/toolchains/tools/git.d.ts +3 -0
- package/dist/guest/toolchains/{git.js → tools/git.js} +38 -15
- package/dist/guest/toolchains/tools/pwsh.d.ts +4 -0
- package/dist/guest/toolchains/{pwsh.js → tools/pwsh.js} +14 -7
- package/dist/guest/toolchains/{vscode-profile.d.ts → tools/vscode-profile.d.ts} +6 -6
- package/dist/guest/toolchains/{vscode-profile.js → tools/vscode-profile.js} +28 -12
- package/dist/guest/toolchains/{vscode.d.ts → tools/vscode.d.ts} +6 -6
- package/dist/guest/toolchains/{vscode.js → tools/vscode.js} +67 -21
- package/dist/guest/toolchains/version-cache.d.ts +16 -0
- package/dist/guest/toolchains/version-cache.js +67 -0
- package/dist/host/agent-commands/commands.d.ts +13 -0
- package/dist/host/agent-commands/commands.js +33 -0
- package/dist/host/agent-commands/forwarders.d.ts +7 -0
- package/dist/host/agent-commands/forwarders.js +31 -0
- package/dist/host/agent-commands/index.d.ts +4 -0
- package/dist/host/agent-commands/index.js +4 -0
- package/dist/host/agent-commands/reconcile.d.ts +12 -0
- package/dist/host/agent-commands/reconcile.js +69 -0
- package/dist/host/agent-commands/user-path.d.ts +2 -0
- package/dist/host/agent-commands/user-path.js +33 -0
- package/dist/host/audit/collect.d.ts +2 -2
- package/dist/host/audit/collect.js +59 -22
- package/dist/host/audit/log.d.ts +2 -2
- package/dist/host/audit/log.js +24 -8
- package/dist/host/{attach.d.ts → channel/attach.d.ts} +2 -2
- package/dist/host/{attach.js → channel/attach.js} +33 -15
- package/dist/host/channel/channel.d.ts +51 -0
- package/dist/host/channel/channel.js +196 -0
- package/dist/host/channel/index.d.ts +2 -0
- package/dist/host/channel/index.js +2 -0
- package/dist/host/guard/agent-files.d.ts +7 -0
- package/dist/host/guard/agent-files.js +103 -0
- package/dist/host/guard/commands.d.ts +10 -0
- package/dist/host/guard/commands.js +123 -0
- package/dist/host/guard/file-hash.d.ts +4 -0
- package/dist/host/guard/file-hash.js +37 -0
- package/dist/host/guard/git-config.d.ts +5 -0
- package/dist/host/guard/git-config.js +62 -0
- package/dist/host/guard/git-dirs.d.ts +12 -0
- package/dist/host/guard/git-dirs.js +53 -0
- package/dist/host/guard/index.d.ts +5 -0
- package/dist/host/guard/index.js +4 -0
- package/dist/host/guard/mark-of-the-web.d.ts +8 -0
- package/dist/host/guard/mark-of-the-web.js +74 -0
- package/dist/host/guard/nested-repos.d.ts +14 -0
- package/dist/host/guard/nested-repos.js +88 -0
- package/dist/host/guard/quarantine.d.ts +3 -0
- package/dist/host/guard/quarantine.js +24 -0
- package/dist/host/guard/repo-guard.d.ts +10 -0
- package/dist/host/guard/repo-guard.js +36 -0
- package/dist/host/guard/store.d.ts +40 -0
- package/dist/host/guard/store.js +145 -0
- package/dist/host/guard/types.d.ts +27 -0
- package/dist/host/guard/types.js +3 -0
- package/dist/host/guard/watch-state.d.ts +9 -0
- package/dist/host/guard/watch-state.js +26 -0
- package/dist/host/launch/boot-projects.d.ts +17 -0
- package/dist/host/launch/{projects.js → boot-projects.js} +27 -12
- package/dist/host/{database-plan.d.ts → launch/database-plan.d.ts} +5 -5
- package/dist/host/{database-plan.js → launch/database-plan.js} +24 -13
- package/dist/host/launch/generate.d.ts +4 -0
- package/dist/host/launch/generate.js +77 -0
- package/dist/host/launch/index.d.ts +10 -0
- package/dist/host/launch/index.js +10 -0
- package/dist/host/launch/mappings.d.ts +7 -2
- package/dist/host/launch/mappings.js +83 -24
- package/dist/host/launch/pc-scan.d.ts +5 -0
- package/dist/host/{pc-scan.js → launch/pc-scan.js} +20 -13
- package/dist/host/launch/project-scan.d.ts +7 -0
- package/dist/host/{project-scan.js → launch/project-scan.js} +29 -21
- package/dist/host/launch/session-file.d.ts +23 -0
- package/dist/host/launch/session-file.js +73 -0
- package/dist/host/launch/stage.d.ts +5 -5
- package/dist/host/launch/stage.js +14 -13
- package/dist/host/launch/toolchains.d.ts +4 -0
- package/dist/host/launch/toolchains.js +11 -0
- package/dist/host/launch/{wsb.d.ts → wsb-file.d.ts} +4 -2
- package/dist/host/launch/wsb-file.js +56 -0
- package/dist/host/life/crash-report.d.ts +8 -0
- package/dist/host/life/crash-report.js +87 -0
- package/dist/host/life/index.d.ts +6 -0
- package/dist/host/life/index.js +6 -0
- package/dist/host/life/keep-awake.d.ts +10 -0
- package/dist/host/life/keep-awake.js +29 -0
- package/dist/host/life/life-record.d.ts +48 -0
- package/dist/host/life/life-record.js +76 -0
- package/dist/host/life/stop-events.d.ts +27 -0
- package/dist/host/life/stop-events.js +96 -0
- package/dist/host/life/stop-warning.d.ts +4 -0
- package/dist/host/life/stop-warning.js +25 -0
- package/dist/host/life/windows-update.d.ts +3 -0
- package/dist/host/life/windows-update.js +11 -0
- package/dist/host/native.d.ts +4 -0
- package/dist/host/native.js +11 -0
- package/dist/host/network/index.d.ts +1 -0
- package/dist/host/network/index.js +1 -0
- package/dist/host/{port-forward.d.ts → network/port-forward.d.ts} +1 -1
- package/dist/host/{port-forward.js → network/port-forward.js} +16 -10
- package/dist/host/profile/accounts.d.ts +37 -0
- package/dist/host/profile/accounts.js +146 -0
- package/dist/host/profile/claude-login.d.ts +22 -0
- package/dist/host/profile/claude-login.js +57 -0
- package/dist/host/{claude-profile.d.ts → profile/claude-profile.d.ts} +9 -9
- package/dist/host/{claude-profile.js → profile/claude-profile.js} +32 -22
- package/dist/host/profile/index.d.ts +7 -0
- package/dist/host/profile/index.js +7 -0
- package/dist/host/profile/personalize.d.ts +2 -0
- package/dist/host/profile/personalize.js +127 -0
- package/dist/host/profile/reg-file.d.ts +8 -0
- package/dist/host/profile/reg-file.js +45 -0
- package/dist/host/profile/secret-files.d.ts +2 -0
- package/dist/host/profile/secret-files.js +25 -0
- package/dist/host/profile/secret-patterns.d.ts +6 -0
- package/dist/host/profile/secret-patterns.js +128 -0
- package/dist/host/profile/secrets.d.ts +12 -0
- package/dist/host/profile/secrets.js +100 -0
- package/dist/host/projects/index.d.ts +4 -0
- package/dist/host/projects/index.js +4 -0
- package/dist/host/projects/join.d.ts +38 -0
- package/dist/host/projects/join.js +119 -0
- package/dist/host/projects/known.d.ts +28 -0
- package/dist/host/projects/known.js +55 -0
- package/dist/host/projects/mapper.d.ts +29 -0
- package/dist/host/projects/mapper.js +88 -0
- package/dist/host/projects/registry.d.ts +83 -0
- package/dist/host/projects/registry.js +136 -0
- package/dist/host/sandbox/doctor.d.ts +2 -0
- package/dist/host/sandbox/doctor.js +42 -0
- package/dist/host/sandbox/host-claude.d.ts +1 -0
- package/dist/host/sandbox/host-claude.js +26 -0
- package/dist/host/sandbox/index.d.ts +6 -0
- package/dist/host/sandbox/index.js +6 -0
- package/dist/host/{platform.d.ts → sandbox/platform.d.ts} +0 -5
- package/dist/host/sandbox/platform.js +60 -0
- package/dist/host/sandbox/probe.d.ts +3 -0
- package/dist/host/sandbox/probe.js +47 -0
- package/dist/host/{window.js → sandbox/window.js} +7 -5
- package/dist/host/{wsb.js → sandbox/wsb-cli.js} +31 -8
- package/dist/host/{cleanup.js → storage/cleanup.js} +27 -12
- package/dist/host/storage/index.d.ts +2 -0
- package/dist/host/storage/index.js +2 -0
- package/dist/host/storage/state-files.d.ts +4 -0
- package/dist/host/storage/state-files.js +10 -0
- package/dist/host/test-guard.js +1 -1
- package/dist/host/tools/conpty.d.ts +8 -0
- package/dist/host/tools/conpty.js +58 -0
- package/dist/host/tools/index.d.ts +2 -0
- package/dist/host/tools/index.js +2 -0
- package/dist/host/{terminal.d.ts → tools/windows-terminal.d.ts} +2 -10
- package/dist/host/{terminal.js → tools/windows-terminal.js} +33 -57
- package/dist/host/workspace-view/active-views.d.ts +3 -0
- package/dist/host/workspace-view/active-views.js +22 -0
- package/dist/host/workspace-view/index.d.ts +2 -18
- package/dist/host/workspace-view/index.js +2 -49
- package/dist/host/workspace-view/plan.d.ts +16 -0
- package/dist/host/workspace-view/plan.js +50 -0
- package/dist/host/workspace-view/rules.js +10 -3
- package/dist/host/workspace-view/view-state.d.ts +10 -0
- package/dist/host/workspace-view/view-state.js +31 -0
- package/dist/host/workspace-view/view.d.ts +1 -0
- package/dist/host/workspace-view/view.js +51 -55
- package/dist/runtime/daemon.js +4232 -1918
- package/dist/runtime/db.js +2145 -830
- package/dist/runtime/gitguard.js +29 -11
- package/dist/runtime/main.js +4760 -2155
- package/dist/runtime/netproxy.js +1654 -418
- package/dist/runtime/view.js +1515 -453
- package/dist/selftest/accounts.test.d.ts +1 -1
- package/dist/selftest/accounts.test.js +20 -17
- package/dist/selftest/agent-commands.test.d.ts +1 -1
- package/dist/selftest/agent-commands.test.js +9 -5
- package/dist/selftest/audit.test.d.ts +1 -1
- package/dist/selftest/audit.test.js +46 -13
- package/dist/selftest/channel.test.d.ts +1 -1
- package/dist/selftest/channel.test.js +91 -8
- package/dist/selftest/cli.test.d.ts +1 -1
- package/dist/selftest/cli.test.js +68 -16
- package/dist/selftest/cmdline.test.d.ts +1 -1
- package/dist/selftest/cmdline.test.js +36 -7
- package/dist/selftest/config.test.d.ts +1 -1
- package/dist/selftest/config.test.js +12 -5
- package/dist/selftest/data.test.d.ts +1 -1
- package/dist/selftest/data.test.js +35 -6
- package/dist/selftest/detect.test.d.ts +1 -1
- package/dist/selftest/detect.test.js +22 -9
- package/dist/selftest/generate.test.d.ts +1 -1
- package/dist/selftest/generate.test.js +33 -9
- package/dist/selftest/git-access.test.d.ts +1 -1
- package/dist/selftest/git-access.test.js +42 -4
- package/dist/selftest/guest-boot.test.d.ts +1 -1
- package/dist/selftest/guest-boot.test.js +25 -7
- package/dist/selftest/host-sim.test.d.ts +1 -1
- package/dist/selftest/host-sim.test.js +27 -3
- package/dist/selftest/hostile-input.test.d.ts +1 -1
- package/dist/selftest/hostile-input.test.js +5 -5
- package/dist/selftest/index.d.ts +1 -1
- package/dist/selftest/index.js +73 -16
- package/dist/selftest/layout.test.d.ts +2 -0
- package/dist/selftest/layout.test.js +131 -0
- package/dist/selftest/links.test.d.ts +1 -1
- package/dist/selftest/links.test.js +16 -11
- package/dist/selftest/live-daemon.test.d.ts +1 -1
- package/dist/selftest/live-daemon.test.js +20 -8
- package/dist/selftest/live-git.test.d.ts +1 -1
- package/dist/selftest/live-git.test.js +13 -4
- package/dist/selftest/live-network.test.d.ts +1 -1
- package/dist/selftest/live-network.test.js +24 -9
- package/dist/selftest/live-projects.test.d.ts +1 -1
- package/dist/selftest/live-projects.test.js +47 -20
- package/dist/selftest/live-terminal.test.d.ts +2 -0
- package/dist/selftest/live-terminal.test.js +195 -0
- package/dist/selftest/local-config.test.d.ts +1 -1
- package/dist/selftest/local-config.test.js +88 -15
- package/dist/selftest/mirror.test.d.ts +1 -1
- package/dist/selftest/mirror.test.js +118 -19
- package/dist/selftest/network.test.d.ts +1 -1
- package/dist/selftest/network.test.js +17 -8
- package/dist/selftest/personalization.test.d.ts +1 -1
- package/dist/selftest/personalization.test.js +12 -5
- package/dist/selftest/projects.test.d.ts +1 -1
- package/dist/selftest/projects.test.js +336 -72
- package/dist/selftest/repair.test.d.ts +1 -1
- package/dist/selftest/repair.test.js +17 -5
- package/dist/selftest/repo-guard.test.d.ts +1 -1
- package/dist/selftest/repo-guard.test.js +21 -20
- package/dist/selftest/secrets.test.d.ts +1 -1
- package/dist/selftest/secrets.test.js +57 -13
- package/dist/selftest/setup.test.d.ts +1 -1
- package/dist/selftest/setup.test.js +25 -5
- package/dist/selftest/{fixtures.d.ts → support/fixtures.d.ts} +7 -4
- package/dist/selftest/{fixtures.js → support/fixtures.js} +95 -17
- package/dist/selftest/{harness.js → support/harness.js} +24 -7
- package/dist/selftest/{live.d.ts → support/live.d.ts} +2 -2
- package/dist/selftest/{live.js → support/live.js} +34 -10
- package/dist/selftest/support/suite.js +1 -0
- package/dist/selftest/sync.test.d.ts +1 -1
- package/dist/selftest/sync.test.js +64 -26
- package/dist/selftest/test-guard.test.d.ts +1 -1
- package/dist/selftest/test-guard.test.js +43 -15
- package/dist/selftest/toolchains.test.d.ts +1 -1
- package/dist/selftest/toolchains.test.js +135 -36
- package/dist/selftest/workspace-view.test.d.ts +1 -1
- package/dist/selftest/workspace-view.test.js +48 -11
- package/dist/selftest/workspace.test.d.ts +1 -1
- package/dist/selftest/workspace.test.js +13 -4
- package/dist/shared/{apps.d.ts → apps/catalogue.d.ts} +1 -11
- package/dist/shared/apps/catalogue.js +768 -0
- package/dist/shared/apps/index.d.ts +2 -0
- package/dist/shared/apps/index.js +2 -0
- package/dist/shared/apps/selection.d.ts +11 -0
- package/dist/shared/apps/selection.js +40 -0
- package/dist/shared/channel/index.d.ts +2 -0
- package/dist/shared/channel/index.js +2 -0
- package/dist/shared/channel/run-dir.d.ts +30 -0
- package/dist/shared/channel/run-dir.js +84 -0
- package/dist/shared/{schema.d.ts → channel/schema.d.ts} +60 -19
- package/dist/shared/channel/schema.js +131 -0
- package/dist/shared/download/archive.d.ts +13 -0
- package/dist/shared/download/archive.js +57 -0
- package/dist/shared/download/downloader.d.ts +35 -0
- package/dist/shared/download/downloader.js +110 -0
- package/dist/shared/download/github.d.ts +16 -0
- package/dist/shared/download/github.js +74 -0
- package/dist/shared/download/http.d.ts +5 -0
- package/dist/shared/download/http.js +30 -0
- package/dist/shared/download/index.d.ts +5 -0
- package/dist/shared/download/index.js +5 -0
- package/dist/shared/download/spawn.d.ts +2 -0
- package/dist/shared/download/spawn.js +7 -0
- package/dist/shared/io/index.d.ts +3 -0
- package/dist/shared/io/index.js +3 -0
- package/dist/shared/io/json-file.d.ts +10 -0
- package/dist/shared/io/json-file.js +21 -0
- package/dist/shared/io/json.d.ts +13 -0
- package/dist/shared/io/json.js +49 -0
- package/dist/shared/{safe-remove.js → io/safe-remove.js} +32 -7
- package/dist/shared/{netrules.js → network/firewall-rules.js} +36 -5
- package/dist/shared/network/index.d.ts +2 -0
- package/dist/shared/network/index.js +2 -0
- package/dist/shared/{netpolicy.js → network/policy.js} +66 -11
- package/dist/shared/{paths.js → paths/claude-paths.js} +12 -2
- package/dist/shared/{guest-paths.d.ts → paths/guest-paths.d.ts} +21 -0
- package/dist/shared/paths/guest-paths.js +146 -0
- package/dist/shared/paths/index.d.ts +3 -0
- package/dist/shared/paths/index.js +3 -0
- package/dist/shared/{projects.d.ts → paths/projects.d.ts} +27 -4
- package/dist/shared/paths/projects.js +136 -0
- package/dist/shared/pty/client.d.ts +21 -0
- package/dist/shared/pty/client.js +79 -0
- package/dist/shared/pty/console-input.d.ts +11 -0
- package/dist/shared/pty/console-input.js +81 -0
- package/dist/shared/pty/index.d.ts +6 -0
- package/dist/shared/pty/index.js +6 -0
- package/dist/shared/pty/input-joiner.d.ts +15 -0
- package/dist/shared/pty/input-joiner.js +44 -0
- package/dist/shared/pty/output-filter.d.ts +13 -0
- package/dist/shared/pty/output-filter.js +140 -0
- package/dist/shared/pty/protocol.d.ts +36 -0
- package/dist/shared/pty/protocol.js +60 -0
- package/dist/shared/pty/terminal.d.ts +24 -0
- package/dist/shared/pty/terminal.js +147 -0
- package/dist/shared/test-guard.js +3 -1
- package/dist/sync/claude-mem.d.ts +1 -1
- package/dist/sync/claude-mem.js +9 -4
- package/dist/sync/history.d.ts +1 -29
- package/dist/sync/history.js +57 -45
- package/dist/sync/index.d.ts +5 -0
- package/dist/sync/index.js +5 -0
- package/dist/sync/sync-cycle.d.ts +18 -0
- package/dist/sync/sync-cycle.js +85 -0
- package/dist/sync/sync-state.d.ts +32 -0
- package/dist/sync/sync-state.js +37 -0
- package/dist/sync/watcher.d.ts +0 -18
- package/dist/sync/watcher.js +66 -100
- package/native/keep-awake.ps1 +8 -0
- package/native/power.cs +23 -0
- package/native/stop-events.ps1 +38 -0
- package/package.json +11 -3
- package/sandbox/linkgate.cs +98 -0
- package/sandbox/memlog.ps1 +15 -6
- package/sandbox/ptyhost.cs +60 -3
- package/schemas/config.schema.json +48 -1
- package/schemas/sandbox-config.schema.json +37 -3
- package/dist/cli/commands/launch.d.ts +0 -29
- package/dist/cli/commands/launch.js +0 -366
- package/dist/cli/commands/maintenance.d.ts +0 -10
- package/dist/cli/commands/maintenance.js +0 -187
- package/dist/cli/commands/project.d.ts +0 -29
- package/dist/cli/commands/project.js +0 -63
- package/dist/cli/commands/projects.d.ts +0 -14
- package/dist/cli/commands/projects.js +0 -146
- package/dist/cli/commands/restart.d.ts +0 -6
- package/dist/cli/commands/restart.js +0 -85
- package/dist/cli/commands/sessions.d.ts +0 -12
- package/dist/cli/commands/sessions.js +0 -257
- package/dist/cli/menu/settings/editors.js +0 -305
- package/dist/cli/progress.d.ts +0 -9
- package/dist/cli/progress.js +0 -49
- package/dist/cli/tui/dialogs.d.ts +0 -57
- package/dist/cli/tui/dialogs.js +0 -162
- package/dist/core/config.js +0 -109
- package/dist/core/schema.d.ts +0 -6
- package/dist/core/schema.js +0 -8
- package/dist/core/util.d.ts +0 -62
- package/dist/core/util.js +0 -156
- package/dist/core/workspace.d.ts +0 -18
- package/dist/core/workspace.js +0 -145
- package/dist/guest/boot-env.d.ts +0 -4
- package/dist/guest/daemon.js +0 -57
- package/dist/guest/env.d.ts +0 -52
- package/dist/guest/env.js +0 -103
- package/dist/guest/gitrules.js +0 -11
- package/dist/guest/project-status.d.ts +0 -5
- package/dist/guest/project-status.js +0 -17
- package/dist/guest/setup/user.js +0 -51
- package/dist/guest/toolchains/cli.d.ts +0 -10
- package/dist/guest/toolchains/common.d.ts +0 -54
- package/dist/guest/toolchains/common.js +0 -147
- package/dist/guest/toolchains/databases/dynamodb.d.ts +0 -8
- package/dist/guest/toolchains/databases/dynamodb.js +0 -52
- package/dist/guest/toolchains/databases/index.d.ts +0 -6
- package/dist/guest/toolchains/databases/index.js +0 -62
- package/dist/guest/toolchains/databases/mongodb.d.ts +0 -3
- package/dist/guest/toolchains/databases/mongodb.js +0 -31
- package/dist/guest/toolchains/databases/mysql.d.ts +0 -3
- package/dist/guest/toolchains/databases/mysql.js +0 -38
- package/dist/guest/toolchains/databases/postgres.d.ts +0 -5
- package/dist/guest/toolchains/databases/postgres.js +0 -38
- package/dist/guest/toolchains/databases/redis.d.ts +0 -3
- package/dist/guest/toolchains/databases/redis.js +0 -16
- package/dist/guest/toolchains/git.d.ts +0 -3
- package/dist/guest/toolchains/go.d.ts +0 -3
- package/dist/guest/toolchains/java.d.ts +0 -8
- package/dist/guest/toolchains/node.d.ts +0 -3
- package/dist/guest/toolchains/pwsh.d.ts +0 -4
- package/dist/guest/toolchains/python.d.ts +0 -3
- package/dist/guest/toolchains/scripting/php.d.ts +0 -3
- package/dist/guest/toolchains/scripting/ruby.d.ts +0 -3
- package/dist/host/accounts.d.ts +0 -32
- package/dist/host/accounts.js +0 -128
- package/dist/host/agent-commands.d.ts +0 -25
- package/dist/host/agent-commands.js +0 -145
- package/dist/host/channel.d.ts +0 -38
- package/dist/host/channel.js +0 -162
- package/dist/host/generate.d.ts +0 -13
- package/dist/host/generate.js +0 -108
- package/dist/host/join.d.ts +0 -28
- package/dist/host/join.js +0 -76
- package/dist/host/launch/projects.d.ts +0 -15
- package/dist/host/launch/wsb.js +0 -34
- package/dist/host/motw.d.ts +0 -17
- package/dist/host/motw.js +0 -74
- package/dist/host/pc-scan.d.ts +0 -6
- package/dist/host/personalize.d.ts +0 -10
- package/dist/host/personalize.js +0 -97
- package/dist/host/platform.js +0 -129
- package/dist/host/project-scan.d.ts +0 -7
- package/dist/host/projects.d.ts +0 -100
- package/dist/host/projects.js +0 -147
- package/dist/host/repo-guard.d.ts +0 -43
- package/dist/host/repo-guard.js +0 -347
- package/dist/host/secrets.d.ts +0 -14
- package/dist/host/secrets.js +0 -133
- package/dist/host/stops.d.ts +0 -67
- package/dist/host/stops.js +0 -126
- package/dist/shared/apps.js +0 -114
- package/dist/shared/download.d.ts +0 -60
- package/dist/shared/download.js +0 -215
- package/dist/shared/guest-paths.js +0 -61
- package/dist/shared/projects.js +0 -67
- package/dist/shared/pty-client.d.ts +0 -91
- package/dist/shared/pty-client.js +0 -349
- package/dist/shared/rundir.d.ts +0 -41
- package/dist/shared/rundir.js +0 -96
- package/dist/shared/schema.js +0 -92
- /package/dist/{guest/daemon.d.ts → cli/tui/list/list-types.js} +0 -0
- /package/dist/{guest/db.d.ts → cli/tui/screen.js} +0 -0
- /package/dist/core/{detect-databases.d.ts → detect/databases.d.ts} +0 -0
- /package/dist/{guest/toolchains → core/detect}/versions.d.ts +0 -0
- /package/dist/guest/{setup/agents.d.ts → agents/agent-installer.d.ts} +0 -0
- /package/dist/guest/{audit-parse.d.ts → audit/parse.d.ts} +0 -0
- /package/dist/guest/{guide.d.ts → boot/guide.d.ts} +0 -0
- /package/dist/guest/daemon/{shutdown.d.ts → idle-shutdown.d.ts} +0 -0
- /package/dist/guest/daemon/{session.d.ts → sessions.d.ts} +0 -0
- /package/dist/guest/{main.d.ts → entries/daemon.d.ts} +0 -0
- /package/dist/guest/{netproxy.d.ts → entries/db.d.ts} +0 -0
- /package/dist/{selftest/suite.js → guest/entries/gitguard.d.ts} +0 -0
- /package/dist/guest/{gitguard.d.ts → git/decision.d.ts} +0 -0
- /package/dist/guest/{ports.d.ts → runtime/ports.d.ts} +0 -0
- /package/dist/guest/{project-context.d.ts → runtime/project-context.d.ts} +0 -0
- /package/dist/guest/{cmdline.d.ts → sessions/cmdline.d.ts} +0 -0
- /package/dist/guest/{ptyhost.d.ts → sessions/pty-host.d.ts} +0 -0
- /package/dist/guest/{view.d.ts → sessions/viewer.d.ts} +0 -0
- /package/dist/guest/setup/{policy.d.ts → managed-policy.d.ts} +0 -0
- /package/dist/host/{window.d.ts → sandbox/window.d.ts} +0 -0
- /package/dist/host/{wsb.d.ts → sandbox/wsb-cli.d.ts} +0 -0
- /package/dist/host/{cleanup.d.ts → storage/cleanup.d.ts} +0 -0
- /package/dist/selftest/{harness.d.ts → support/harness.d.ts} +0 -0
- /package/dist/selftest/{suite.d.ts → support/suite.d.ts} +0 -0
- /package/dist/shared/{safe-remove.d.ts → io/safe-remove.d.ts} +0 -0
- /package/dist/shared/{netrules.d.ts → network/firewall-rules.d.ts} +0 -0
- /package/dist/shared/{netpolicy.d.ts → network/policy.d.ts} +0 -0
- /package/dist/shared/{paths.d.ts → paths/claude-paths.d.ts} +0 -0
|
@@ -1,366 +0,0 @@
|
|
|
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 fs from 'node:fs';
|
|
6
|
-
import { select } from '@inquirer/prompts';
|
|
7
|
-
import { activateAccount, activeAccount, defaultAccount } from '../../host/accounts.js';
|
|
8
|
-
import { attachTerminal, findUnwatchedSession } from '../../host/attach.js';
|
|
9
|
-
import { requestSession, resetRunDir, waitForReady, waitForSession } from '../../host/channel.js';
|
|
10
|
-
import { describePrune, pruneStorage } from '../../host/cleanup.js';
|
|
11
|
-
import { generateSandbox } from '../../host/generate.js';
|
|
12
|
-
import { findSecretFiles } from '../../host/secrets.js';
|
|
13
|
-
import { checkRepo, saveRepoSnapshot } from '../../host/repo-guard.js';
|
|
14
|
-
import { assertCanLaunch, insideSandbox, isSandboxRunning, probeHost, spawnDetached, startSandbox } from '../../host/platform.js';
|
|
15
|
-
import { NeedsRestart, rememberProject, startRegistry } from '../../host/projects.js';
|
|
16
|
-
import { ensureConpty, ensureTerminal } from '../../host/terminal.js';
|
|
17
|
-
import { planView, saveActiveViews, viewSkipped, WorkspaceView } from '../../host/workspace-view/index.js';
|
|
18
|
-
import { saveForwards } from '../../host/port-forward.js';
|
|
19
|
-
import { saveAuditSettings } from '../../host/audit/collect.js';
|
|
20
|
-
import { readDataSize, saveMarkedProjects } from '../../host/motw.js';
|
|
21
|
-
import { humanBytes } from '../../core/disk.js';
|
|
22
|
-
import { hideSandboxWindow, showSandboxWindow } from '../../host/window.js';
|
|
23
|
-
import { readSandboxStatus } from '../../shared/rundir.js';
|
|
24
|
-
import { isWithin } from '../../shared/projects.js';
|
|
25
|
-
import { syncBeforeLaunch, watcherRunning } from '../../sync/watcher.js';
|
|
26
|
-
import { protectionsOf } from '../../core/project-policy.js';
|
|
27
|
-
import { assertSafeMapping, assertSafeWorkspace } from '../../core/safe-paths.js';
|
|
28
|
-
import { errMsg, fail, isRootPath, sleep } from '../../core/util.js';
|
|
29
|
-
import { syncAgentCommands } from './agent-commands.js';
|
|
30
|
-
import { askYesNo } from '../../core/prompt.js';
|
|
31
|
-
import { resolveRun } from '../../core/workspace.js';
|
|
32
|
-
import { c } from '../colors.js';
|
|
33
|
-
import { working } from '../progress.js';
|
|
34
|
-
import { requireOnPc, sandboxAlive, table } from './context.js';
|
|
35
|
-
import _ from 'lodash';
|
|
36
|
-
import { hereDir, joinHere, readyHere } from './project.js';
|
|
37
|
-
import { offerRestart } from './restart.js';
|
|
38
|
-
import { addToList, setSetting } from './user-config.js';
|
|
39
|
-
import { lastStopWarning, startLife, UPDATE_RESTART_WARNING, updateRestartPending } from '../../host/stops.js';
|
|
40
|
-
/** Attaches this terminal; with attach.autoHide the sandbox window hides meanwhile (best effort, never fails the attach). */
|
|
41
|
-
export const attachHere = (ctx, session) => {
|
|
42
|
-
if (ctx.loaded.config.attach.autoHide && !insideSandbox())
|
|
43
|
-
void hideSandboxWindow(ctx.storageRoot, 120).catch(() => false);
|
|
44
|
-
return attachTerminal(session);
|
|
45
|
-
};
|
|
46
|
-
/** Nothing has been installed into this data set yet: the first start downloads every toolchain once. */
|
|
47
|
-
const firstBoot = (dataPath) => !fs.existsSync(path.join(dataPath, 'tools', 'resolved-versions.json'));
|
|
48
|
-
const FIRST_BOOT = 'First start for this storage: the sandbox downloads and installs the toolchains, databases and agent this project needs.\n' +
|
|
49
|
-
'That takes a few minutes, once. Everything is kept, so every later start reuses it and takes seconds.';
|
|
50
|
-
/** The sandbox writes sandbox.json a few seconds into its boot; a second launch right after the first waits for it. */
|
|
51
|
-
export const runningSandboxStatus = async (dataPath) => {
|
|
52
|
-
for (let i = 0; i < 60; i++) {
|
|
53
|
-
const status = readSandboxStatus(dataPath);
|
|
54
|
-
if (status)
|
|
55
|
-
return status;
|
|
56
|
-
await sleep(1000);
|
|
57
|
-
}
|
|
58
|
-
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.');
|
|
59
|
-
};
|
|
60
|
-
/** Waits for the boot with its current step on a spinner (plain lines without a terminal). */
|
|
61
|
-
export const waitForBoot = (dataPath, launchId) => {
|
|
62
|
-
let step = 'starting Windows Sandbox';
|
|
63
|
-
return working(() => 'Waiting for the sandbox: ' + step, () => waitForReady(dataPath, launchId, sandboxAlive, (m) => { step = m; }));
|
|
64
|
-
};
|
|
65
|
-
/** The running sandbox, once it is ready. */
|
|
66
|
-
export const readySandbox = async (dataPath) => {
|
|
67
|
-
const status = await runningSandboxStatus(dataPath);
|
|
68
|
-
return status.phase === 'ready' ? status : waitForBoot(dataPath, status.launchId);
|
|
69
|
-
};
|
|
70
|
-
/** Waits for a session to start (its project's setup, the agent's install) with its progress on a spinner. */
|
|
71
|
-
const waitForStart = (ctx, requestId, what) => {
|
|
72
|
-
let step = 'starting';
|
|
73
|
-
return working(() => what + ': ' + step, () => waitForSession(ctx.dataPath, requestId, sandboxAlive, 60 * 60 * 1000, (m) => { step = m; }));
|
|
74
|
-
};
|
|
75
|
-
/**
|
|
76
|
-
* Starts (or picks back up) a session in the folder `joined` describes. attach: show it in this terminal.
|
|
77
|
-
* Exported for restart.ts, which reopens the sessions a restart ended.
|
|
78
|
-
*/
|
|
79
|
-
export const openSession = async (ctx, ready, joined, o) => {
|
|
80
|
-
const { options, loaded, dataPath } = ctx;
|
|
81
|
-
const cwd = joined.guestDir;
|
|
82
|
-
const harness = o.harness ?? options.harness ?? joined.harness ?? loaded.config.defaultHarness;
|
|
83
|
-
const args = o.args ?? options.passthrough;
|
|
84
|
-
// -t with nothing new for the agent: pick up this folder's session if no terminal on this PC shows it (its tab was
|
|
85
|
-
// closed, or you detached). Someone already attached, --new, or agent arguments: a new session, as before.
|
|
86
|
-
const reuse = (o.reuse ?? true) && o.attach && !options.newSession && args.length === 0 && loaded.config.attach.reuseSession;
|
|
87
|
-
const existing = reuse ? await findUnwatchedSession(dataPath, harness, cwd) : null;
|
|
88
|
-
if (existing) {
|
|
89
|
-
console.log('Reattaching to ' + harness + ' session ' + existing.id + ' in ' + cwd + ' (no other terminal is attached; --new starts another).');
|
|
90
|
-
return attachHere(ctx, existing);
|
|
91
|
-
}
|
|
92
|
-
console.log(joined.spec
|
|
93
|
-
? 'Starting ' + harness + ' for ' + joined.project?.host + ' in the running sandbox (' + cwd + '; the first time sets up what it needs).'
|
|
94
|
-
: 'Sandbox already running: starting another ' + harness + ' session in ' + cwd);
|
|
95
|
-
// The agent's definition goes along: the sandbox may have booted with another agent.
|
|
96
|
-
const harnessSpec = loaded.config.harnesses[harness];
|
|
97
|
-
const requestId = requestSession(dataPath, harness, args, cwd, { ...(joined.spec ? { project: joined.spec } : {}), ...(harnessSpec ? { harnessSpec } : {}) });
|
|
98
|
-
const session = await waitForStart(ctx, requestId, 'Starting ' + harness + ' in ' + cwd);
|
|
99
|
-
if (o.attach)
|
|
100
|
-
return attachHere(ctx, session);
|
|
101
|
-
console.log('Session ' + session.id + ' opened in a new tab inside the sandbox. Attach here with: sandbox attach ' + session.id + (ready.headless ? ' (headless: sbx-show opens the window)' : ''));
|
|
102
|
-
return 0;
|
|
103
|
-
};
|
|
104
|
-
/** The sessions a launch asks for: each --session, else one (the agent, in this folder). */
|
|
105
|
-
const wantedSessions = (ctx) => ctx.options.sessions.length ? ctx.options.sessions : [{ harness: ctx.options.harness, folder: hereDir(ctx) }];
|
|
106
|
-
/** The same command, for one of its sessions (its folder, agent, and the arguments after -- plus its own). */
|
|
107
|
-
const contextFor = (ctx, want) => ({ ...ctx, options: { ...ctx.options, workspace: want.folder, harness: want.harness, sessions: [], passthrough: [...ctx.options.passthrough, ...(want.args ?? [])] } });
|
|
108
|
-
/** Several sessions at once: all requested together (projects set up in parallel), then listed; -t attaches the first. */
|
|
109
|
-
const openSessions = async (ctx, ready, list) => {
|
|
110
|
-
const { dataPath, loaded, options } = ctx;
|
|
111
|
-
const requests = list.map(({ ctx: at, joined }) => {
|
|
112
|
-
const harness = at.options.harness ?? joined.harness ?? loaded.config.defaultHarness;
|
|
113
|
-
const harnessSpec = loaded.config.harnesses[harness];
|
|
114
|
-
const id = requestSession(dataPath, harness, at.options.passthrough, joined.guestDir, { ...(joined.spec ? { project: joined.spec } : {}), ...(harnessSpec ? { harnessSpec } : {}) });
|
|
115
|
-
return { id, harness, folder: at.options.workspace ?? joined.guestDir, cwd: joined.guestDir };
|
|
116
|
-
});
|
|
117
|
-
let started = 0;
|
|
118
|
-
const results = await working(() => 'Starting ' + requests.length + ' sessions (' + started + ' running)', () => Promise.allSettled(requests.map(async (r) => {
|
|
119
|
-
const s = await waitForSession(dataPath, r.id, sandboxAlive, 60 * 60 * 1000, () => undefined);
|
|
120
|
-
started++;
|
|
121
|
-
return s;
|
|
122
|
-
})));
|
|
123
|
-
table([['SESSION', 'AGENT', 'FOLDER', ''], ...requests.map((r, i) => {
|
|
124
|
-
const result = results[i];
|
|
125
|
-
return [r.id, r.harness, r.folder, result.status === 'fulfilled' ? 'running sandbox attach ' + r.id : c.red('FAILED: ' + errMsg(result.reason))];
|
|
126
|
-
})]);
|
|
127
|
-
const first = results.find((r) => r.status === 'fulfilled');
|
|
128
|
-
if (options.terminal && first)
|
|
129
|
-
return attachHere(ctx, first.value);
|
|
130
|
-
if (!first)
|
|
131
|
-
return 1;
|
|
132
|
-
console.log('Each has its own tab inside the sandbox' + (ready.headless ? ' (headless: sbx-show opens the window)' : '') + '. Attach to any of them, from any terminal: sandbox attach');
|
|
133
|
-
return results.every((r) => r.status === 'fulfilled') ? 0 : 1;
|
|
134
|
-
};
|
|
135
|
-
/** A sandbox is already running: open the sessions in it (new tabs inside; optionally attach here). */
|
|
136
|
-
const launchIntoRunning = async (ctx) => {
|
|
137
|
-
const ready = await readySandbox(ctx.dataPath);
|
|
138
|
-
const wants = wantedSessions(ctx);
|
|
139
|
-
// Every folder joins first: when one needs a restart, nothing has been started that the restart would end.
|
|
140
|
-
const joined = [];
|
|
141
|
-
const needs = [];
|
|
142
|
-
for (const want of wants) {
|
|
143
|
-
const at = ctx.options.sessions.length ? contextFor(ctx, want) : ctx;
|
|
144
|
-
try {
|
|
145
|
-
joined.push({ ctx: at, joined: await joinHere(at, ready) });
|
|
146
|
-
}
|
|
147
|
-
catch (e) {
|
|
148
|
-
if (!(e instanceof NeedsRestart))
|
|
149
|
-
throw e;
|
|
150
|
-
if (!needs.some((n) => n.hostDir.toLowerCase() === e.hostDir.toLowerCase()))
|
|
151
|
-
needs.push(e);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
if (needs.length)
|
|
155
|
-
return offerRestart(ctx, needs, () => launchIntoRunning(ctx));
|
|
156
|
-
for (const note of _.uniq(joined.flatMap((j) => j.joined.notes)))
|
|
157
|
-
console.log(note);
|
|
158
|
-
if (joined.length === 1)
|
|
159
|
-
return openSession(joined[0].ctx, ready, joined[0].joined, { attach: ctx.options.terminal });
|
|
160
|
-
return openSessions(ctx, ready, joined);
|
|
161
|
-
};
|
|
162
|
-
/** `sandbox start` while one runs: this folder joins it (set up, no agent), or a restart that adds it is offered. */
|
|
163
|
-
const startIntoRunning = async (ctx) => {
|
|
164
|
-
const ready = await readySandbox(ctx.dataPath);
|
|
165
|
-
let joined;
|
|
166
|
-
try {
|
|
167
|
-
joined = await readyHere(ctx, ready);
|
|
168
|
-
}
|
|
169
|
-
catch (e) {
|
|
170
|
-
if (e instanceof NeedsRestart)
|
|
171
|
-
return offerRestart(ctx, [e], () => startIntoRunning(ctx));
|
|
172
|
-
throw e;
|
|
173
|
-
}
|
|
174
|
-
const where = joined.spec ? ' This folder is ready in it as ' + joined.guestDir + ' (sbx-shell ' + joined.spec.name + ' opens a terminal there inside).' : '';
|
|
175
|
-
console.log('A sandbox is already running' + (showSandboxWindow(ctx.storageRoot) ? '; its window is in front now.' : '.') + where + ' Start an agent in it with sandbox claude (or sandbox <agent>); stop it with sandbox stop.');
|
|
176
|
-
return 0;
|
|
177
|
-
};
|
|
178
|
-
const syncSummary = (config, dataPath, workspaceHost) => {
|
|
179
|
-
try {
|
|
180
|
-
const s = syncBeforeLaunch(config, dataPath, workspaceHost);
|
|
181
|
-
return s.history + ' file(s) of history in, claude-mem ' + s.claudeMem;
|
|
182
|
-
}
|
|
183
|
-
catch (e) {
|
|
184
|
-
return 'FAILED: ' + errMsg(e);
|
|
185
|
-
}
|
|
186
|
-
};
|
|
187
|
-
/**
|
|
188
|
-
* Asked once per parent folder: map it at every start (a project root), so the projects next to this one open in the
|
|
189
|
-
* running sandbox without a restart. The answer is saved to your config.
|
|
190
|
-
*/
|
|
191
|
-
const maybeAddRoot = async (ctx, run) => {
|
|
192
|
-
const { projects } = run.config;
|
|
193
|
-
const parent = path.dirname(run.workspaceHost);
|
|
194
|
-
if (!projects.askToAddRoot || ctx.options.yes || !process.stdin.isTTY || !process.stdout.isTTY)
|
|
195
|
-
return;
|
|
196
|
-
if (projects.roots.some((r) => isWithin(r, run.workspaceHost)) || projects.declinedRoots.some((d) => isWithin(d, parent) && isWithin(parent, d)))
|
|
197
|
-
return;
|
|
198
|
-
if (isRootPath(parent))
|
|
199
|
-
return;
|
|
200
|
-
try {
|
|
201
|
-
assertSafeWorkspace(parent, ctx.packageRoot, run.storageRoot);
|
|
202
|
-
assertSafeMapping(parent, ctx.packageRoot, run.storageRoot);
|
|
203
|
-
}
|
|
204
|
-
catch {
|
|
205
|
-
return;
|
|
206
|
-
}
|
|
207
|
-
const answer = await select({
|
|
208
|
-
message: 'Map ' + parent + ' at every start, so other projects there (also new ones) open in the running sandbox without a restart? Agents in the sandbox can then see every project in it.',
|
|
209
|
-
choices: [
|
|
210
|
-
{ name: 'Yes, from now on', value: 'yes' },
|
|
211
|
-
{ name: 'No (and do not ask again for this folder)', value: 'no' },
|
|
212
|
-
{ name: 'Never ask this again', value: 'never' },
|
|
213
|
-
],
|
|
214
|
-
});
|
|
215
|
-
if (answer === 'yes') {
|
|
216
|
-
addToList(ctx, ['projects', 'roots'], parent);
|
|
217
|
-
run.config.projects.roots.push(parent);
|
|
218
|
-
console.log('Added ' + parent + ' to projects.roots (sandbox projects roots remove ' + parent + ' undoes it).');
|
|
219
|
-
}
|
|
220
|
-
if (answer === 'no')
|
|
221
|
-
addToList(ctx, ['projects', 'declinedRoots'], parent);
|
|
222
|
-
if (answer === 'never')
|
|
223
|
-
setSetting(ctx, ['projects', 'askToAddRoot'], false);
|
|
224
|
-
};
|
|
225
|
-
/**
|
|
226
|
-
* workspaceFilter: brings the project's filtered view in step before the sandbox maps it, and tells the background
|
|
227
|
-
* watcher to keep it in step while the sandbox runs. Returns the line for the launch table.
|
|
228
|
-
*/
|
|
229
|
-
const prepareWorkspaceView = async (ctx, run) => {
|
|
230
|
-
const plan = planView(run.config, ctx.storageRoot, run.workspaceHost);
|
|
231
|
-
saveActiveViews(ctx.storageRoot, ctx.dataPath, plan ? [plan.options] : []);
|
|
232
|
-
saveForwards(ctx.storageRoot, ctx.dataPath, run.config.sandbox.networking ? run.config.network.forwardPorts : []);
|
|
233
|
-
saveAuditSettings(ctx.storageRoot, ctx.dataPath, { ...run.config.audit, projects: [run.workspaceHost] });
|
|
234
|
-
saveMarkedProjects(ctx.storageRoot, ctx.dataPath, run.config.storage.markSandboxFiles ? [run.workspaceHost] : []);
|
|
235
|
-
const size = readDataSize(ctx.storageRoot, ctx.dataPath);
|
|
236
|
-
const limit = run.config.storage.warnDataGb;
|
|
237
|
-
if (limit > 0 && size && size.bytes > limit * 1024 ** 3)
|
|
238
|
-
console.warn(c.yellow('The persisted data takes ' + humanBytes(size.bytes) + ' (more than storage.warnDataGb, ' + limit + ' GB). See what: sandbox data; free space: sandbox data clean <what>.'));
|
|
239
|
-
if (!plan)
|
|
240
|
-
return viewSkipped(run.config, run.workspaceHost) ?? 'off (git-ignored files are visible in the sandbox; workspaceFilter.enabled keeps them out)';
|
|
241
|
-
const stats = await working('Preparing the workspace without its git-ignored files', () => new WorkspaceView(plan.options).prepare());
|
|
242
|
-
return 'on: git-ignored files stay on this PC' + (stats.toView || stats.toHost ? ' (' + stats.toView + ' copied in, ' + stats.toHost + ' out' + (stats.conflicts ? ', ' + stats.conflicts + ' conflicts kept next to the file' : '') + ')' : '') + '; ' + plan.options.view;
|
|
243
|
-
};
|
|
244
|
-
/** Everything a real launch does before the sandbox starts (skipped by `generate`, which only writes files). */
|
|
245
|
-
const prepare = async (ctx, run) => {
|
|
246
|
-
const { options, dataPath, storageRoot } = ctx;
|
|
247
|
-
const { config } = run;
|
|
248
|
-
const account = options.account ?? defaultAccount(storageRoot);
|
|
249
|
-
if (account && run.harnessName === 'claude' && account !== activeAccount(dataPath))
|
|
250
|
-
activateAccount(storageRoot, dataPath, account);
|
|
251
|
-
const terminal = config.provisioning.terminal.enabled ? await ensureTerminal(dataPath, config.provisioning.refresh, { pwsh: config.toolchains.pwsh.enabled !== false }) : { exe: null, message: 'disabled' };
|
|
252
|
-
const conpty = config.provisioning.conpty.enabled ? await ensureConpty(dataPath, config.provisioning.refresh) : 'off';
|
|
253
|
-
const history = syncSummary(config, dataPath, run.workspaceHost);
|
|
254
|
-
const guarded = checkRepo(dataPath);
|
|
255
|
-
if (guarded.length)
|
|
256
|
-
console.warn(c.yellow('SECURITY: neutralised ' + guarded.length + ' change(s) the last sandbox made that could run code on this PC (see sandbox status).'));
|
|
257
|
-
const stopped = lastStopWarning(storageRoot, dataPath, watcherRunning(dataPath));
|
|
258
|
-
if (stopped)
|
|
259
|
-
console.warn(c.yellow(stopped));
|
|
260
|
-
if (updateRestartPending())
|
|
261
|
-
console.warn(c.yellow(UPDATE_RESTART_WARNING));
|
|
262
|
-
resetRunDir(dataPath);
|
|
263
|
-
const filter = await prepareWorkspaceView(ctx, run);
|
|
264
|
-
return { account, terminal: terminal.message + '; pseudo console: ' + conpty, history, pruned: describePrune(pruneStorage(storageRoot)), filter };
|
|
265
|
-
};
|
|
266
|
-
export const launch = async (ctx, generateOnly = false, extras = {}) => {
|
|
267
|
-
const { options, loaded, packageRoot, dataPath, storageRoot } = ctx;
|
|
268
|
-
// attach.auto: an agent started from an interactive terminal attaches it, as with -t.
|
|
269
|
-
if (loaded.config.attach.auto && !options.noAgent && process.stdin.isTTY && process.stdout.isTTY)
|
|
270
|
-
options.terminal = true;
|
|
271
|
-
if (!generateOnly)
|
|
272
|
-
requireOnPc('launch');
|
|
273
|
-
// agentCommands (Beta) follows the config: a setting changed in the file takes effect here too. Never blocks a launch.
|
|
274
|
-
if (!generateOnly) {
|
|
275
|
-
try {
|
|
276
|
-
syncAgentCommands(ctx, loaded.config);
|
|
277
|
-
}
|
|
278
|
-
catch (e) {
|
|
279
|
-
console.warn('Agent commands (Beta): ' + errMsg(e));
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
if (!generateOnly && isSandboxRunning())
|
|
283
|
-
return options.noAgent ? startIntoRunning(ctx) : launchIntoRunning(ctx);
|
|
284
|
-
// Several sessions: the sandbox starts from the first one's folder with the others' folders mapped too, then
|
|
285
|
-
// they all open in it (each project is set up on demand, in parallel). One --session is an ordinary launch.
|
|
286
|
-
const wants = options.sessions;
|
|
287
|
-
if (wants.length === 1)
|
|
288
|
-
return launch(contextFor(ctx, wants[0]), generateOnly, extras);
|
|
289
|
-
if (wants.length > 1) {
|
|
290
|
-
const first = contextFor(ctx, wants[0]);
|
|
291
|
-
const others = _.uniqBy(wants.slice(1).map((w) => w.folder).filter((f) => !isWithin(wants[0].folder, f)), (f) => f.toLowerCase());
|
|
292
|
-
const started = await launch({ ...first, options: { ...first.options, terminal: false } }, generateOnly, { ...extras, extraProjects: [...(extras.extraProjects ?? []), ...others], autoSession: false, waitUntilReady: true });
|
|
293
|
-
return generateOnly || started !== 0 ? started : launchIntoRunning(ctx);
|
|
294
|
-
}
|
|
295
|
-
const run = await resolveRun({
|
|
296
|
-
packageRoot, loaded, cwd: process.cwd(), workspace: options.workspace, harness: options.harness, noAgent: options.noAgent,
|
|
297
|
-
noLocalConfig: options.noLocalConfig, trustConfig: options.trustConfig, scripts: options.scripts, databases: options.databases, headless: options.headless,
|
|
298
|
-
nodeVersion: options.node, pythonVersion: options.python, ask: askYesNo,
|
|
299
|
-
});
|
|
300
|
-
const { config } = run;
|
|
301
|
-
if (!generateOnly)
|
|
302
|
-
assertCanLaunch();
|
|
303
|
-
if (!generateOnly && !extras.extraProjects)
|
|
304
|
-
await maybeAddRoot(ctx, run);
|
|
305
|
-
const prepared = generateOnly ? null : await prepare(ctx, run);
|
|
306
|
-
const generated = generateSandbox({ packageRoot, run, harnessArgs: options.passthrough, probe: probeHost(config, run.harnessName), extraProjects: extras.extraProjects, autoSession: extras.autoSession });
|
|
307
|
-
for (const note of [...run.notes, ...generated.projects.notes])
|
|
308
|
-
console.log(note);
|
|
309
|
-
const secretFiles = config.secrets.warnFiles ? findSecretFiles(run.workspaceHost) : [];
|
|
310
|
-
if (secretFiles.length) {
|
|
311
|
-
const shown = secretFiles.slice(0, 12).join(', ') + (secretFiles.length > 12 ? ', ...' : '');
|
|
312
|
-
console.warn(c.yellow('Heads-up: the agent can read these files in your workspace, which often hold secrets: ' + shown + '. Move real credentials out of the folder (or use test ones). Silence with secrets.warnFiles = false.'));
|
|
313
|
-
}
|
|
314
|
-
const { roots, projects } = generated.projects;
|
|
315
|
-
table([
|
|
316
|
-
['Workspace', run.workspaceHost + ' -> ' + config.guestWorkspace + (config.readOnly ? ' (read-only)' : '')],
|
|
317
|
-
['Agent', run.harnessName + (prepared?.account ? ' (account: ' + prepared.account + ')' : '') + ' Memory: ' + generated.memoryMb + ' MB CPU: ' + (config.sandbox.cpuLimit === 'none' ? 'all' : 'max ' + config.sandbox.cpuLimit + '%') + ' Network: ' + config.sandbox.networking + (config.sandbox.headless ? ' HEADLESS' : '')],
|
|
318
|
-
['Node', run.versions.node.spec + ' (' + run.versions.node.source + ') Python: ' + run.versions.python.spec + ' (' + run.versions.python.source + ')'],
|
|
319
|
-
...(prepared ? [['Ignored files', prepared.filter], ['Terminal', prepared.terminal], ['History', prepared.history], ['Cleanup', prepared.pruned]] : []),
|
|
320
|
-
['Toolchains', Object.entries(generated.toolchains).filter(([, d]) => d.on).map(([name, d]) => name + ' (' + d.reason + ')').join(', ') || 'Node only (nothing else used by this project)'],
|
|
321
|
-
...(generated.databases.length
|
|
322
|
-
? generated.databases.map((d, i) => [i ? '' : 'Databases', d.database + (d.database === 'sqlserver' ? ' (cannot run in the sandbox; use Postgres or SQLite for local work)' : ' on port ' + d.port) + ' because ' + d.reasons[0] + (d.reasons.length > 1 ? ' (+' + (d.reasons.length - 1) + ' more)' : '')])
|
|
323
|
-
: [['Databases', 'none needed (databases.<name>.enabled = true adds one)']]),
|
|
324
|
-
['Desktop', generated.personalization],
|
|
325
|
-
['Claude', generated.profile.staged.length ? generated.profile.staged.join(', ') + (generated.profile.credentials ? ' (INCLUDING YOUR LOGIN)' : '') : 'no settings copied'],
|
|
326
|
-
['Secrets', !config.secrets.strip ? 'NOT stripped (secrets.strip is off)' : generated.profile.secretsRemoved.length ? 'kept on this PC: ' + generated.profile.secretsRemoved.join(', ') + ' (secrets.allow lets one through)' : 'none found in what is copied'],
|
|
327
|
-
...roots.map((r, i) => [i ? '' : 'Project roots', r.host + ' -> ' + r.guest + ' (every project in it opens without a restart)']),
|
|
328
|
-
...projects.map((p, i) => [i ? '' : 'Projects', p.host + ' -> ' + p.guest]),
|
|
329
|
-
...generated.mappings.slice(3).filter((m) => ![...roots, ...projects].some((p) => p.guest === m.guest)).map((m) => [' map ' + (m.readOnly ? 'ro' : 'rw'), m.host + ' -> ' + m.guest]),
|
|
330
|
-
['Generated', generated.wsbPath],
|
|
331
|
-
]);
|
|
332
|
-
if (generateOnly)
|
|
333
|
-
return 0;
|
|
334
|
-
// Every folder the sandbox can write is snapshotted before it starts (the guard compares against this), and the
|
|
335
|
-
// projects it starts with are recorded host-side for the commands that run later.
|
|
336
|
-
saveRepoSnapshot(dataPath, run.workspaceHost, projects.map((p) => p.host), roots.map((r) => r.host));
|
|
337
|
-
startRegistry(storageRoot, { launchId: generated.launchId, protections: protectionsOf(config), primary: { host: run.workspaceHost, guest: config.guestWorkspace }, roots, boot: projects });
|
|
338
|
-
rememberProject(storageRoot, run.workspaceHost);
|
|
339
|
-
startLife(storageRoot, dataPath, config.sandbox.keepAwake);
|
|
340
|
-
startSandbox(generated.wsbPath);
|
|
341
|
-
// Absolute: the watcher runs from another folder, and a relative --config there would make it exit silently.
|
|
342
|
-
if (!watcherRunning(dataPath))
|
|
343
|
-
spawnDetached(ctx.entry, ['_watch', ...(options.config ? ['--config', path.resolve(options.config)] : [])]);
|
|
344
|
-
// Hiding runs alongside; a failure to find the window must never break the launch or an attach.
|
|
345
|
-
const hidden = config.sandbox.headless ? hideSandboxWindow(storageRoot).catch(() => false) : null;
|
|
346
|
-
if (options.terminal || options.noAgent || extras.waitUntilReady) {
|
|
347
|
-
if (firstBoot(dataPath))
|
|
348
|
-
console.log(FIRST_BOOT);
|
|
349
|
-
await waitForBoot(dataPath, generated.launchId);
|
|
350
|
-
if (extras.waitUntilReady)
|
|
351
|
-
return 0;
|
|
352
|
-
// Without an agent there is no session to attach to: the sandbox itself is the result.
|
|
353
|
-
if (options.noAgent) {
|
|
354
|
-
console.log('Sandbox ready. Its window has a terminal in ' + config.guestWorkspace + '; from here: sandbox exec -- <command>, sandbox stop.');
|
|
355
|
-
return 0;
|
|
356
|
-
}
|
|
357
|
-
return attachHere(ctx, await waitForStart(ctx, generated.launchId, 'Starting ' + run.harnessName));
|
|
358
|
-
}
|
|
359
|
-
if (firstBoot(dataPath))
|
|
360
|
-
console.log(FIRST_BOOT);
|
|
361
|
-
if (hidden)
|
|
362
|
-
console.log(await hidden ? 'Sandbox running headless. Open the window: sbx-show Attach here: sandbox claude -t' : 'Could not find the sandbox window to hide (it may still be starting); run sandbox hide in a moment.');
|
|
363
|
-
else
|
|
364
|
-
console.log('Sandbox starting. ' + run.harnessName + ' opens in Windows Terminal inside it. Attach here any time: sandbox claude -t');
|
|
365
|
-
return 0;
|
|
366
|
-
};
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { type Context } from './context.js';
|
|
2
|
-
export declare const sync: (ctx: Context) => number;
|
|
3
|
-
export declare const logs: (ctx: Context) => Promise<number>;
|
|
4
|
-
export declare const clean: (ctx: Context) => number;
|
|
5
|
-
export declare const config: (ctx: Context) => number;
|
|
6
|
-
export declare const doctor: (ctx: Context) => number;
|
|
7
|
-
export declare const claudeHost: (ctx: Context) => number;
|
|
8
|
-
export declare const watcher: (ctx: Context) => Promise<void>;
|
|
9
|
-
/** `sandbox audit`: the audit log of the last days (audit.enabled), newest last. */
|
|
10
|
-
export declare const audit: (ctx: Context) => Promise<number>;
|
|
@@ -1,187 +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 { describeOverrides, isTrusted, LOCAL_CONFIG_NAME, normalizeOverrides, readLocalConfig, trustStorePath } from '../../core/local-config.js';
|
|
8
|
-
import { assertNoLinks, expandPath, fail, plainText, safeText, sleep, writeJson } from '../../core/util.js';
|
|
9
|
-
import { humanBytes } from '../../core/disk.js';
|
|
10
|
-
import { AuditLog } from '../../host/audit/log.js';
|
|
11
|
-
import { readKnown, readRegistry } from '../../host/projects.js';
|
|
12
|
-
import { detectWsb } from '../../host/wsb.js';
|
|
13
|
-
import { describePrune, pruneStorage } from '../../host/cleanup.js';
|
|
14
|
-
import { doctorRows, hostClaude, insideSandbox, isSandboxRunning } from '../../host/platform.js';
|
|
15
|
-
import { readSandboxStatus } from '../../shared/rundir.js';
|
|
16
|
-
import { syncBack, watch } from '../../sync/watcher.js';
|
|
17
|
-
import { printJson, table } from './context.js';
|
|
18
|
-
import { c } from '../colors.js';
|
|
19
|
-
export const sync = (ctx) => {
|
|
20
|
-
const running = isSandboxRunning();
|
|
21
|
-
const result = syncBack(ctx.dataPath, !running);
|
|
22
|
-
console.log('History: ' + result.history + ' item(s) synced back. claude-mem: ' + result.claudeMem + (running ? ' (claude-mem syncs when the sandbox closes)' : ''));
|
|
23
|
-
return 0;
|
|
24
|
-
};
|
|
25
|
-
const newestLog = (dir) => {
|
|
26
|
-
if (!fs.existsSync(dir))
|
|
27
|
-
return null;
|
|
28
|
-
const logs = fs.readdirSync(dir).filter((f) => /^(guest|daemon|bootstrap)-.*\.log$/.test(f) && fs.lstatSync(path.join(dir, f)).isFile());
|
|
29
|
-
const newest = _.maxBy(logs, (f) => fs.statSync(path.join(dir, f)).mtimeMs);
|
|
30
|
-
return newest ? path.join(dir, newest) : null;
|
|
31
|
-
};
|
|
32
|
-
export const logs = async (ctx) => {
|
|
33
|
-
const dir = path.join(ctx.dataPath, 'logs');
|
|
34
|
-
// The sandbox writes this folder: never read through a link it planted there.
|
|
35
|
-
assertNoLinks(ctx.dataPath, dir);
|
|
36
|
-
const file = newestLog(dir) ?? fail('No sandbox logs yet in ' + dir + '.', 'Logs appear after the first start (sandbox claude).');
|
|
37
|
-
console.log('== ' + file + ' ==');
|
|
38
|
-
let printed = 0;
|
|
39
|
-
// The log is written inside the sandbox: read only its tail, and make it safe for your terminal.
|
|
40
|
-
const print = () => {
|
|
41
|
-
const size = fs.statSync(file).size;
|
|
42
|
-
const from = printed === 0 ? Math.max(0, size - 64 * 1024) : printed;
|
|
43
|
-
if (size <= from)
|
|
44
|
-
return;
|
|
45
|
-
const fd = fs.openSync(file, 'r');
|
|
46
|
-
const buffer = Buffer.alloc(Math.min(size - from, 4 * 1024 * 1024));
|
|
47
|
-
fs.readSync(fd, buffer, 0, buffer.length, from);
|
|
48
|
-
fs.closeSync(fd);
|
|
49
|
-
const text = safeText(buffer.toString('utf8'));
|
|
50
|
-
process.stdout.write(printed === 0 ? text.split('\n').slice(-120).join('\n') : text);
|
|
51
|
-
printed = from + buffer.length;
|
|
52
|
-
};
|
|
53
|
-
print();
|
|
54
|
-
if (ctx.options.follow)
|
|
55
|
-
console.error('(following; Ctrl+C to stop)');
|
|
56
|
-
while (ctx.options.follow) {
|
|
57
|
-
await sleep(1000);
|
|
58
|
-
print();
|
|
59
|
-
}
|
|
60
|
-
return 0;
|
|
61
|
-
};
|
|
62
|
-
export const clean = (ctx) => {
|
|
63
|
-
const running = isSandboxRunning() ? readSandboxStatus(ctx.dataPath)?.launchId : undefined;
|
|
64
|
-
console.log('Cleanup: ' + describePrune(pruneStorage(ctx.storageRoot, { launchDays: ctx.options.days, keep: _.compact([running]) })));
|
|
65
|
-
return 0;
|
|
66
|
-
};
|
|
67
|
-
const initConfig = () => {
|
|
68
|
-
const file = userConfigPath();
|
|
69
|
-
if (fs.existsSync(file))
|
|
70
|
-
fail(file + ' already exists.');
|
|
71
|
-
fs.mkdirSync(path.join(userDir(), 'hooks', 'pre-agent'), { recursive: true });
|
|
72
|
-
// The schema sits next to the file (a local path), so editors trust it and show docs and autocomplete.
|
|
73
|
-
writeJson(file, { $schema: './config.schema.json', ...DEFAULTS });
|
|
74
|
-
console.log('Created ' + file + '. It lists every setting with its default; delete the ones you do not change.');
|
|
75
|
-
console.log('Your own hook scripts go in ' + path.join(userDir(), 'hooks') + '\\{pre-provision,pre-agent,post-agent}.');
|
|
76
|
-
console.log('For editor help in every project\'s .sandbox-config.json, run: sandbox config schema');
|
|
77
|
-
return 0;
|
|
78
|
-
};
|
|
79
|
-
/**
|
|
80
|
-
* VS Code setting that maps every .sandbox-config.json (and the user config) to the local schema files, so project
|
|
81
|
-
* files need no "$schema" line and nothing is fetched from the internet (remote schemas need trusting).
|
|
82
|
-
*/
|
|
83
|
-
const printSchemaSettings = () => {
|
|
84
|
-
const url = (name) => pathToFileURL(path.join(userDir(), name)).href;
|
|
85
|
-
const setting = {
|
|
86
|
-
'json.schemas': [
|
|
87
|
-
{ fileMatch: ['**/.sandbox-config.json'], url: url('sandbox-config.schema.json') },
|
|
88
|
-
{ fileMatch: ['**/.agent-sandbox/config.json'], url: url('config.schema.json') },
|
|
89
|
-
],
|
|
90
|
-
};
|
|
91
|
-
console.log('Add this to your VS Code settings.json (Ctrl+Shift+P > "Preferences: Open User Settings (JSON)"):\n');
|
|
92
|
-
console.log(JSON.stringify(setting, null, 2).slice(2, -2));
|
|
93
|
-
console.log('\nThe schema files live in ' + userDir() + ' and are refreshed whenever the sandbox command runs.');
|
|
94
|
-
return 0;
|
|
95
|
-
};
|
|
96
|
-
/**
|
|
97
|
-
* `sandbox config check`: the folder's .sandbox-config.json validated and described (risky settings flagged, approval
|
|
98
|
-
* state), without launching. Fails with the same message a launch would give when the file is not valid.
|
|
99
|
-
*/
|
|
100
|
-
const checkLocalConfig = (ctx) => {
|
|
101
|
-
const dir = path.resolve(ctx.options.workspace ?? process.cwd());
|
|
102
|
-
const file = readLocalConfig(dir);
|
|
103
|
-
if (!file) {
|
|
104
|
-
console.log('No ' + LOCAL_CONFIG_NAME + ' in ' + dir + '; the sandbox uses your own settings only.');
|
|
105
|
-
return 0;
|
|
106
|
-
}
|
|
107
|
-
const overrides = normalizeOverrides(file.data, dir, file.path);
|
|
108
|
-
const approved = isTrusted(trustStorePath(ctx.storageRoot), file.path, file.hash);
|
|
109
|
-
console.log(file.path + ': valid. ' + (approved ? 'Approved (this exact version).' : 'Not approved yet: the next launch asks you.') + '\n');
|
|
110
|
-
for (const line of describeOverrides(overrides))
|
|
111
|
-
console.log(' ' + safeText(line));
|
|
112
|
-
return 0;
|
|
113
|
-
};
|
|
114
|
-
export const config = (ctx) => {
|
|
115
|
-
const [action = 'summary'] = ctx.options.positionals;
|
|
116
|
-
switch (action) {
|
|
117
|
-
case 'summary':
|
|
118
|
-
table([
|
|
119
|
-
['Settings file', ctx.loaded.configPath ?? userConfigPath() + ' (does not exist yet; sandbox config init creates it)'],
|
|
120
|
-
['Default agent', ctx.loaded.config.defaultHarness],
|
|
121
|
-
['Storage', ctx.storageRoot],
|
|
122
|
-
['Memory', String(ctx.loaded.config.sandbox.memoryMb) + (ctx.loaded.config.sandbox.memoryMb === 'auto' ? '' : ' MB')],
|
|
123
|
-
]);
|
|
124
|
-
console.log('\nChange settings in the menu (sandbox > Settings). All of them as JSON: sandbox config show');
|
|
125
|
-
return 0;
|
|
126
|
-
case 'path':
|
|
127
|
-
console.log(ctx.loaded.configPath ?? userConfigPath() + ' (does not exist yet)');
|
|
128
|
-
return 0;
|
|
129
|
-
case 'init': return initConfig();
|
|
130
|
-
case 'show':
|
|
131
|
-
console.log(JSON.stringify(ctx.loaded.config, null, 2));
|
|
132
|
-
return 0;
|
|
133
|
-
case 'schema': return printSchemaSettings();
|
|
134
|
-
case 'check': return checkLocalConfig(ctx);
|
|
135
|
-
default: fail('Unknown config action "' + action + '".', 'Use one of: sandbox config show | path | init | schema | check');
|
|
136
|
-
}
|
|
137
|
-
};
|
|
138
|
-
export const doctor = (ctx) => {
|
|
139
|
-
const rows = doctorRows(ctx.loaded.config, ctx.options.harness ?? ctx.loaded.config.defaultHarness, ctx.storageRoot, ctx.loaded.configPath);
|
|
140
|
-
// Inside a sandbox the feature and "running" rows describe the sandbox itself, and the host rows describe nothing useful.
|
|
141
|
-
if (insideSandbox()) {
|
|
142
|
-
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')]);
|
|
143
|
-
return 0;
|
|
144
|
-
}
|
|
145
|
-
// Several projects: the roots mapped at every start, what the running sandbox has, and whether wsb share is there.
|
|
146
|
-
const p = ctx.loaded.config.projects;
|
|
147
|
-
const registry = isSandboxRunning() ? readRegistry(ctx.storageRoot) : null;
|
|
148
|
-
const wsb = p.wsbShare ? detectWsb() : null;
|
|
149
|
-
table([
|
|
150
|
-
...rows,
|
|
151
|
-
['Project roots', p.roots.length ? p.roots.map((r) => expandPath(r, ctx.loaded.base)).join(', ') : 'none (sandbox projects roots add <folder>)'],
|
|
152
|
-
['All projects', p.all ? 'on: ' + readKnown(ctx.storageRoot).length + ' known project(s) mapped at every start (' + p.exclude.length + ' excluded)' : 'off'],
|
|
153
|
-
['Projects running', registry ? registry.projects.map((x) => x.name + ' (' + x.mechanism + ')').join(', ') : '-'],
|
|
154
|
-
['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'],
|
|
155
|
-
]);
|
|
156
|
-
return 0;
|
|
157
|
-
};
|
|
158
|
-
export const claudeHost = (ctx) => hostClaude(ctx.storageRoot, ctx.options.personal, ctx.options.passthrough);
|
|
159
|
-
export const watcher = (ctx) => watch(ctx.dataPath);
|
|
160
|
-
const KINDS = ['proc', 'file', 'session', 'guard', 'note'];
|
|
161
|
-
const KIND_LABEL = { proc: 'program', file: 'file', session: 'session', guard: 'GUARD', note: 'note' };
|
|
162
|
-
/** `sandbox audit`: the audit log of the last days (audit.enabled), newest last. */
|
|
163
|
-
export const audit = async (ctx) => {
|
|
164
|
-
const settings = ctx.loaded.config.audit;
|
|
165
|
-
const kind = ctx.options.kind;
|
|
166
|
-
if (kind && !KINDS.includes(kind))
|
|
167
|
-
fail('Unknown kind "' + kind + '".', 'Use one of: ' + KINDS.join(', '));
|
|
168
|
-
const log = new AuditLog(AuditLog.dirFor(ctx.storageRoot, ctx.dataPath), settings);
|
|
169
|
-
const events = log.read({ days: ctx.options.days, kinds: kind ? [kind] : undefined, grep: ctx.options.grep });
|
|
170
|
-
if (printJson(ctx, events))
|
|
171
|
-
return 0;
|
|
172
|
-
if (!events.length) {
|
|
173
|
-
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.');
|
|
174
|
-
return 0;
|
|
175
|
-
}
|
|
176
|
-
for (const e of events) {
|
|
177
|
-
// What the sandbox reported is text from the sandbox: no control codes reach your terminal.
|
|
178
|
-
const [p, cmd, parent, dir, act] = [e.p, e.c, e.pp, e.w, e.a].map((v) => plainText(v ?? ''));
|
|
179
|
-
const what = e.k === 'proc' ? (cmd || p) + (parent ? c.dim(' <- ' + path.win32.basename(parent)) : '')
|
|
180
|
-
: e.k === 'file' ? act + ' ' + p + c.dim(' in ' + dir)
|
|
181
|
-
: e.k === 'session' ? act + ' ' + p + c.dim(' ' + dir + ' ' + cmd)
|
|
182
|
-
: p;
|
|
183
|
-
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) : ''));
|
|
184
|
-
}
|
|
185
|
-
console.log(c.dim('\n' + events.length + ' event(s); the log takes ' + humanBytes(log.bytes()) + ' (' + AuditLog.dirFor(ctx.storageRoot, ctx.dataPath) + ').'));
|
|
186
|
-
return 0;
|
|
187
|
-
};
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import type { SandboxStatus } from '../../core/types.js';
|
|
2
|
-
import { type RegistryEntry } from '../../host/projects.js';
|
|
3
|
-
import type { ProjectSpecT } from '../../shared/schema.js';
|
|
4
|
-
import { type Context } from './context.js';
|
|
5
|
-
/** The folder the command is about: --workspace, else the current one. */
|
|
6
|
-
export declare const hereDir: (ctx: Context) => string;
|
|
7
|
-
export interface Located {
|
|
8
|
-
project: RegistryEntry | null;
|
|
9
|
-
guestDir: string | null;
|
|
10
|
-
}
|
|
11
|
-
/** Where this folder is in the running sandbox, if it is in it at all (nothing is registered). */
|
|
12
|
-
export declare const locateHere: (ctx: Context, status: SandboxStatus | null) => Located;
|
|
13
|
-
export interface Joined {
|
|
14
|
-
project: RegistryEntry | null;
|
|
15
|
-
guestDir: string;
|
|
16
|
-
spec: ProjectSpecT | null;
|
|
17
|
-
harness: string | null;
|
|
18
|
-
notes: string[];
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Makes this folder a project of the running sandbox (nothing to do for the launch folder and projects already in
|
|
22
|
-
* it): its .sandbox-config.json is approved like at a launch, its protections are checked, and it is made visible.
|
|
23
|
-
* Throws NeedsRestart (host/projects.ts) when that is impossible without a restart.
|
|
24
|
-
*/
|
|
25
|
-
export declare const joinHere: (ctx: Context, status: SandboxStatus) => Promise<Joined>;
|
|
26
|
-
/** Waits until the sandbox has set a project up, with its progress on a spinner (plain lines without a terminal). */
|
|
27
|
-
export declare const provisionJoined: (ctx: Context, joined: Joined) => Promise<void>;
|
|
28
|
-
/** joinHere, then (for another project) waits until the sandbox has set it up. */
|
|
29
|
-
export declare const readyHere: (ctx: Context, status: SandboxStatus) => Promise<Joined>;
|