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
package/dist/host/projects.js
DELETED
|
@@ -1,196 +0,0 @@
|
|
|
1
|
-
// The projects of the running sandbox, and how another folder joins it (shared/projects.ts explains the ways in).
|
|
2
|
-
// Two host-only files under the storage folder, never in the data folder the sandbox can write:
|
|
3
|
-
// - run\projects.json: the running sandbox's projects, roots and machine-wide protections (written at launch, then
|
|
4
|
-
// as folders join);
|
|
5
|
-
// - known-projects.json: every folder this tool has started a project in (for projects.all and `sandbox projects`).
|
|
6
|
-
// Everything about HOW a folder becomes visible is behind ProjectMapper, so the mechanisms can change independently.
|
|
7
|
-
import fs from 'node:fs';
|
|
8
|
-
import path from 'node:path';
|
|
9
|
-
import { z } from 'zod';
|
|
10
|
-
import { assertSafeWorkspace } from '../core/safe-paths.js';
|
|
11
|
-
import { dirExists, fail } from '../core/util.js';
|
|
12
|
-
import { Id } from '../shared/schema.js';
|
|
13
|
-
import { readValid, writeJsonAtomic } from '../shared/rundir.js';
|
|
14
|
-
import { guestDirFor, hubName, isWithin, ownGuestFolder, PROJECTS_GUEST, projectForHostDir } from '../shared/projects.js';
|
|
15
|
-
import { detectWsb, runningSandboxId, shareFolder } from './wsb.js';
|
|
16
|
-
export { PROJECTS_GUEST };
|
|
17
|
-
const AbsolutePath = z.string().max(1024).refine((p) => path.isAbsolute(p), 'must be an absolute path');
|
|
18
|
-
const Entry = z.strictObject({
|
|
19
|
-
name: Id, host: AbsolutePath, guest: z.string().max(1024), primary: z.boolean(),
|
|
20
|
-
mechanism: z.enum(['launch', 'root', 'boot', 'wsb']), registeredAt: z.string().max(64),
|
|
21
|
-
});
|
|
22
|
-
const Registry = z.strictObject({
|
|
23
|
-
launchId: z.string().max(64),
|
|
24
|
-
/** The running sandbox's protections (core/project-policy.ts), fixed at boot. */
|
|
25
|
-
protections: z.record(z.string(), z.union([z.boolean(), z.string()])),
|
|
26
|
-
roots: z.array(z.strictObject({ host: AbsolutePath, guest: z.string().max(1024) })).max(64),
|
|
27
|
-
projects: z.array(Entry).max(1024),
|
|
28
|
-
/** What the sandbox booted with that a joining project may also want (missing in registries of 1.4.0 and older). */
|
|
29
|
-
atBoot: z.strictObject({
|
|
30
|
-
memoryMb: z.number().int().positive().nullable(),
|
|
31
|
-
mappings: z.array(z.strictObject({ host: z.string().max(1024), guest: z.string().max(1024), readOnly: z.boolean() })).max(1024),
|
|
32
|
-
/** Boot settings turned on for a project mapped at boot (setting -> project): other projects share them. */
|
|
33
|
-
widened: z.record(z.string().max(100), z.string().max(100)),
|
|
34
|
-
}).optional(),
|
|
35
|
-
});
|
|
36
|
-
const registryFile = (storageRoot) => path.join(storageRoot, 'run', 'projects.json');
|
|
37
|
-
export const readRegistry = (storageRoot) => readValid(Registry, registryFile(storageRoot));
|
|
38
|
-
const saveRegistry = (storageRoot, registry) => writeJsonAtomic(registryFile(storageRoot), registry);
|
|
39
|
-
/** At launch: the launch folder, the projects mapped with it, and the roots. */
|
|
40
|
-
export const startRegistry = (storageRoot, o) => {
|
|
41
|
-
const at = new Date().toISOString();
|
|
42
|
-
const primary = { name: hubName(o.primary.host, []), host: o.primary.host, guest: o.primary.guest, primary: true, mechanism: 'launch', registeredAt: at };
|
|
43
|
-
const names = [primary.name];
|
|
44
|
-
const boot = o.boot.map((b) => { const name = hubName(b.host, names); names.push(name); return { name, host: b.host, guest: b.guest, primary: false, mechanism: 'boot', registeredAt: at }; });
|
|
45
|
-
saveRegistry(storageRoot, { launchId: o.launchId, protections: o.protections, roots: o.roots, projects: [primary, ...boot], ...(o.atBoot ? { atBoot: o.atBoot } : {}) });
|
|
46
|
-
return primary;
|
|
47
|
-
};
|
|
48
|
-
/** Reads the memory and mapped folders back from a .wsb this tool wrote (host-only launch folder; bounded). */
|
|
49
|
-
export const parseWsbBoot = (xml) => {
|
|
50
|
-
const text = xml.slice(0, 1_000_000);
|
|
51
|
-
const unescape = (s) => s.replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/'/g, '\'').replace(/&/g, '&');
|
|
52
|
-
const mappings = [...text.matchAll(/<MappedFolder><HostFolder>([^<]{1,1024})<\/HostFolder><SandboxFolder>([^<]{1,1024})<\/SandboxFolder><ReadOnly>(true|false)<\/ReadOnly><\/MappedFolder>/g)]
|
|
53
|
-
.slice(0, 1024).map((m) => ({ host: unescape(m[1]), guest: unescape(m[2]), readOnly: m[3] === 'true' }));
|
|
54
|
-
const memory = /<MemoryInMB>(\d{1,7})<\/MemoryInMB>/.exec(text);
|
|
55
|
-
return { memoryMb: memory ? Number(memory[1]) : null, mappings, widened: {} };
|
|
56
|
-
};
|
|
57
|
-
/**
|
|
58
|
-
* What the running sandbox booted with. A sandbox started by 1.4.0 or older has no record: it is read from the .wsb in
|
|
59
|
-
* its launch folder (host-only storage) and recorded. null when neither is there.
|
|
60
|
-
*/
|
|
61
|
-
export const bootRecordOf = (storageRoot, launchPath) => {
|
|
62
|
-
const registry = readRegistry(storageRoot);
|
|
63
|
-
if (!registry)
|
|
64
|
-
return null;
|
|
65
|
-
if (registry.atBoot)
|
|
66
|
-
return registry.atBoot;
|
|
67
|
-
if (!launchPath)
|
|
68
|
-
return null;
|
|
69
|
-
let xml;
|
|
70
|
-
try {
|
|
71
|
-
xml = fs.readFileSync(path.join(launchPath, 'agent.wsb'), 'utf8');
|
|
72
|
-
}
|
|
73
|
-
catch {
|
|
74
|
-
return null;
|
|
75
|
-
}
|
|
76
|
-
const atBoot = parseWsbBoot(xml);
|
|
77
|
-
try {
|
|
78
|
-
saveRegistry(storageRoot, { ...registry, atBoot });
|
|
79
|
-
}
|
|
80
|
-
catch { /* the record is a convenience */ }
|
|
81
|
-
return atBoot;
|
|
82
|
-
};
|
|
83
|
-
/**
|
|
84
|
-
* Why a folder cannot join the running sandbox without a restart (the caller offers one). With `missing`: it could
|
|
85
|
-
* join, but you chose to restart for what it wants at boot (core/project-policy.ts).
|
|
86
|
-
*/
|
|
87
|
-
export class NeedsRestart extends Error {
|
|
88
|
-
hostDir;
|
|
89
|
-
reason;
|
|
90
|
-
missing;
|
|
91
|
-
constructor(hostDir, reason, missing) {
|
|
92
|
-
super(reason);
|
|
93
|
-
this.hostDir = hostDir;
|
|
94
|
-
this.reason = reason;
|
|
95
|
-
this.missing = missing;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
/** Roots first (instant), then `wsb share` where the Windows Sandbox CLI exists, else NeedsRestart. */
|
|
99
|
-
export const projectMapper = (o) => {
|
|
100
|
-
const registry = () => readRegistry(o.storageRoot) ?? fail('The running sandbox was started by an older version, so it cannot take another folder.', 'Stop it (sandbox stop) and start it again.');
|
|
101
|
-
const add = (reg, host, guest, mechanism, name) => {
|
|
102
|
-
const entry = { name, host, guest, primary: false, mechanism, registeredAt: new Date().toISOString() };
|
|
103
|
-
// Re-read right before writing: another terminal may have registered something meanwhile.
|
|
104
|
-
const latest = readRegistry(o.storageRoot) ?? reg;
|
|
105
|
-
const same = latest.projects.find((p) => p.host.toLowerCase() === host.toLowerCase());
|
|
106
|
-
if (same)
|
|
107
|
-
return same;
|
|
108
|
-
saveRegistry(o.storageRoot, { ...latest, projects: [...latest.projects, entry] });
|
|
109
|
-
return entry;
|
|
110
|
-
};
|
|
111
|
-
return {
|
|
112
|
-
list: () => readRegistry(o.storageRoot)?.projects ?? [],
|
|
113
|
-
register: (hostDir) => {
|
|
114
|
-
const host = path.resolve(hostDir);
|
|
115
|
-
const reg = registry();
|
|
116
|
-
const known = reg.projects.find((p) => p.host.toLowerCase() === host.toLowerCase());
|
|
117
|
-
if (known)
|
|
118
|
-
return known;
|
|
119
|
-
assertSafeWorkspace(host, o.packageRoot, o.storageRoot);
|
|
120
|
-
if (!dirExists(host))
|
|
121
|
-
fail('The folder does not exist: ' + host);
|
|
122
|
-
const name = hubName(host, reg.projects.map((p) => p.name));
|
|
123
|
-
// Inside a root: visible already (also a project created after the sandbox started).
|
|
124
|
-
const root = projectForHostDir(reg.roots, host);
|
|
125
|
-
if (root)
|
|
126
|
-
return add(reg, host, guestDirFor(root, host), 'root', name);
|
|
127
|
-
if (!o.wsbShare)
|
|
128
|
-
throw new NeedsRestart(host, 'it is not inside a project root (projects.roots), and adding folders with wsb share is off (projects.wsbShare)');
|
|
129
|
-
const wsb = (o.detect ?? detectWsb)();
|
|
130
|
-
if (!wsb?.has('share'))
|
|
131
|
-
throw new NeedsRestart(host, 'it is not inside a project root (projects.roots), and this Windows has no Windows Sandbox command line (wsb share needs Windows 11 24H2+ with the updated Windows Sandbox)');
|
|
132
|
-
const sandbox = runningSandboxId(wsb);
|
|
133
|
-
if (!sandbox.id)
|
|
134
|
-
throw new NeedsRestart(host, 'wsb share could not find the running sandbox: ' + sandbox.error);
|
|
135
|
-
// Where it is as a launch folder too (C:\Workspace\<name>), unless another project already uses that place.
|
|
136
|
-
const guest = ownGuestFolder(host, false, [...reg.projects.map((p) => p.guest), ...reg.roots.map((r) => r.guest)]);
|
|
137
|
-
const shared = shareFolder(wsb, sandbox.id, host, guest);
|
|
138
|
-
if (!shared.ok)
|
|
139
|
-
throw new NeedsRestart(host, 'wsb share failed (untested on this Windows): ' + shared.error);
|
|
140
|
-
return add(reg, host, guest, 'wsb', name);
|
|
141
|
-
},
|
|
142
|
-
unregister: (name) => {
|
|
143
|
-
const reg = registry();
|
|
144
|
-
const entry = reg.projects.find((p) => p.name.toLowerCase() === name.toLowerCase());
|
|
145
|
-
if (!entry)
|
|
146
|
-
fail('No project "' + name + '" in the running sandbox.', 'sandbox projects lists them.');
|
|
147
|
-
if (entry.primary)
|
|
148
|
-
fail(entry.host + ' is the folder the sandbox started from; it stays until the sandbox stops.');
|
|
149
|
-
saveRegistry(o.storageRoot, { ...reg, projects: reg.projects.filter((p) => p !== entry) });
|
|
150
|
-
},
|
|
151
|
-
};
|
|
152
|
-
};
|
|
153
|
-
export const projectHere = (storageRoot, hostDir) => {
|
|
154
|
-
const project = projectForHostDir(readRegistry(storageRoot)?.projects ?? [], hostDir);
|
|
155
|
-
return project ? { project, guestDir: guestDirFor(project, hostDir) } : null;
|
|
156
|
-
};
|
|
157
|
-
/** The running sandbox's root containing this folder, if any. */
|
|
158
|
-
export const rootHere = (storageRoot, hostDir) => projectForHostDir(readRegistry(storageRoot)?.roots ?? [], hostDir);
|
|
159
|
-
// ---- known projects (every folder a project was started in) ------------------------------------------------------
|
|
160
|
-
const Known = z.strictObject({ projects: z.array(z.strictObject({ host: AbsolutePath, lastUsed: z.string().max(64) })).max(2000) });
|
|
161
|
-
const knownFile = (storageRoot) => path.join(storageRoot, 'known-projects.json');
|
|
162
|
-
export const readKnown = (storageRoot) => readValid(Known, knownFile(storageRoot))?.projects ?? [];
|
|
163
|
-
export const rememberProject = (storageRoot, hostDir) => {
|
|
164
|
-
const host = path.resolve(hostDir);
|
|
165
|
-
const rest = readKnown(storageRoot).filter((p) => p.host.toLowerCase() !== host.toLowerCase());
|
|
166
|
-
try {
|
|
167
|
-
writeJsonAtomic(knownFile(storageRoot), { projects: [{ host, lastUsed: new Date().toISOString() }, ...rest].slice(0, 2000) });
|
|
168
|
-
}
|
|
169
|
-
catch { /* a convenience list */ }
|
|
170
|
-
};
|
|
171
|
-
export const forgetProject = (storageRoot, hostDir) => {
|
|
172
|
-
const host = path.resolve(hostDir);
|
|
173
|
-
const all = readKnown(storageRoot);
|
|
174
|
-
const rest = all.filter((p) => p.host.toLowerCase() !== host.toLowerCase());
|
|
175
|
-
if (rest.length !== all.length)
|
|
176
|
-
writeJsonAtomic(knownFile(storageRoot), { projects: rest });
|
|
177
|
-
return rest.length !== all.length;
|
|
178
|
-
};
|
|
179
|
-
/**
|
|
180
|
-
* projects.all: the known projects mapped at boot on their own (existing folders, not excluded, not the launch folder,
|
|
181
|
-
* not inside it or a root, which already show them). Pure apart from checking that the folders exist.
|
|
182
|
-
*/
|
|
183
|
-
export const allProjectsToMap = (known, o) => {
|
|
184
|
-
const exists = o.exists ?? dirExists;
|
|
185
|
-
const out = [];
|
|
186
|
-
for (const host of known.map((k) => path.resolve(k))) {
|
|
187
|
-
if (o.exclude.some((e) => isWithin(path.resolve(e), host)))
|
|
188
|
-
continue;
|
|
189
|
-
if (isWithin(o.primary, host) || o.roots.some((r) => isWithin(r, host)))
|
|
190
|
-
continue;
|
|
191
|
-
if (out.some((x) => isWithin(x, host) || isWithin(host, x)) || !exists(host))
|
|
192
|
-
continue;
|
|
193
|
-
out.push(host);
|
|
194
|
-
}
|
|
195
|
-
return out;
|
|
196
|
-
};
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
/** A git folder's own state: config lines, hooks, redirect files. */
|
|
2
|
-
export interface GitState {
|
|
3
|
-
config: string[];
|
|
4
|
-
hooks: Record<string, string>;
|
|
5
|
-
redirects: string[];
|
|
6
|
-
}
|
|
7
|
-
export interface RepoSnapshot extends GitState {
|
|
8
|
-
gitDir: boolean;
|
|
9
|
-
commands: Record<string, string>;
|
|
10
|
-
/** Fingerprints of AGENT_FILES (missing in snapshots of older versions: then they are not checked). */
|
|
11
|
-
agent?: Record<string, string>;
|
|
12
|
-
/** Other git folders: submodules (.git/modules/...) and repositories nested in the project, by relative path. */
|
|
13
|
-
repos?: Record<string, GitState>;
|
|
14
|
-
}
|
|
15
|
-
export interface RepoFinding {
|
|
16
|
-
kind: 'hook' | 'config' | 'git' | 'command' | 'agent';
|
|
17
|
-
detail: string;
|
|
18
|
-
}
|
|
19
|
-
export declare const snapshotRepo: (workspace: string) => RepoSnapshot;
|
|
20
|
-
/**
|
|
21
|
-
* Compares the workspace with its pre-launch snapshot and neutralises anything new that would execute on this PC.
|
|
22
|
-
* Returns what was found (and fixed). Never touches what was already there before the sandbox ran.
|
|
23
|
-
*/
|
|
24
|
-
export declare const guardRepo: (workspace: string, before: RepoSnapshot) => RepoFinding[];
|
|
25
|
-
/**
|
|
26
|
-
* At launch: every folder the sandbox will be able to write. The launch folder, projects mapped with it and every
|
|
27
|
-
* project already inside a project root are snapshotted as they are now, before the sandbox can touch them.
|
|
28
|
-
*/
|
|
29
|
-
export declare const saveRepoSnapshot: (dataPath: string, workspace: string, more?: string[], roots?: string[]) => void;
|
|
30
|
-
/**
|
|
31
|
-
* A project that joins the running sandbox: snapshotted before its first session, then guarded like the launch
|
|
32
|
-
* folder. A project already guarded keeps its first snapshot (what was there before the sandbox could touch it).
|
|
33
|
-
*/
|
|
34
|
-
export declare const addRepoSnapshot: (dataPath: string, workspace: string, o?: {
|
|
35
|
-
empty?: boolean;
|
|
36
|
-
}) => void;
|
|
37
|
-
/** The folders being guarded (for status). */
|
|
38
|
-
export declare const guardedProjects: (dataPath: string) => string[];
|
|
39
|
-
/** Re-checks every project of the current/last launch; findings are kept in a host-only file for `status`. Returns the new ones. */
|
|
40
|
-
export declare const checkRepo: (dataPath: string) => RepoFinding[];
|
|
41
|
-
export declare const repoFindings: (dataPath: string) => (RepoFinding & {
|
|
42
|
-
at?: string;
|
|
43
|
-
})[];
|
package/dist/host/repo-guard.js
DELETED
|
@@ -1,347 +0,0 @@
|
|
|
1
|
-
// Zero-click protection for the folder the sandbox shares with this PC.
|
|
2
|
-
//
|
|
3
|
-
// The agent can write the workspace. Two kinds of change there would run code on THIS PC without you doing anything
|
|
4
|
-
// unusual, so they are snapshotted before launch, re-checked every minute while the sandbox runs and when it closes,
|
|
5
|
-
// and neutralised:
|
|
6
|
-
// - git: new or changed hooks, and config that makes git run programs (core.fsmonitor, core.sshCommand, filters,
|
|
7
|
-
// include.path, ...), plus files that redirect where git reads config and hooks (commondir, config.worktree);
|
|
8
|
-
// - commands: executables dropped in the project root under the name of something you type there (node.exe,
|
|
9
|
-
// git.cmd, npm.cmd, ...), because Windows runs a program from the current folder before searching PATH;
|
|
10
|
-
// - agent and editor files: hooks, helper commands and MCP servers in .claude/ and .mcp.json, VS Code folder-open
|
|
11
|
-
// tasks and program paths, .envrc. Submodules and nested repositories get the git checks too.
|
|
12
|
-
import crypto from 'node:crypto';
|
|
13
|
-
import fs from 'node:fs';
|
|
14
|
-
import path from 'node:path';
|
|
15
|
-
import _ from 'lodash';
|
|
16
|
-
import { z } from 'zod';
|
|
17
|
-
import { parse as parseJsonc } from 'jsonc-parser';
|
|
18
|
-
import { readValid, writeFileAtomic, writeJsonAtomic } from '../shared/rundir.js';
|
|
19
|
-
import { assertTestWritable } from './test-guard.js';
|
|
20
|
-
import { dirExists, fileExists, isLink } from '../core/util.js';
|
|
21
|
-
/** Config keys that make git run a program, or load more config. */
|
|
22
|
-
const DANGEROUS_KEY = /^(fsmonitor|hookspath|sshcommand|pager|editor|askpass|program|gpgprogram|textconv|command|cmd|clean|smudge|process|driver|helper|uploadpack|receivepack|path|attributesfile|excludesfile|worktree|worktreeconfig|gitproxy|proxycommand|sendemailvalidate|tool|external|difffilter|defaultkeycommand|alternaterefscommand)\s*=/i;
|
|
23
|
-
/** Sections where any key runs a program ([pager] log = x), or where a "!" value does ([alias] st = !x). */
|
|
24
|
-
const dangerousInSection = (section, keyPart) => (section === 'pager' && keyPart.includes('=')) || (section === 'alias' && /^[^=]+=\s*"?\s*!/.test(keyPart));
|
|
25
|
-
const SECTION = /^\s*\[([^\]]*)\]\s*/;
|
|
26
|
-
const MARK = '# [agent-sandbox] disabled, added inside the sandbox: ';
|
|
27
|
-
/** Files in .git that make git read config/hooks from somewhere else. */
|
|
28
|
-
const REDIRECTS = ['commondir', 'config.worktree'];
|
|
29
|
-
/** Names you are likely to run in a project folder; with any of these extensions Windows would pick the local copy. */
|
|
30
|
-
const COMMANDS = new RegExp('^(' + [
|
|
31
|
-
// this tool's own commands (package.json "bin")
|
|
32
|
-
'sandbox', 'windows-development-sandbox', 'agent-sandbox', 'claude-sbx', 'claude-sandbox', 'codex-sbx', 'codex-sandbox', 'gemini-sbx', 'gemini-sandbox', 'claude-host', 'sbx-show', 'sbx-hide',
|
|
33
|
-
// agents
|
|
34
|
-
'claude', 'codex', 'gemini', 'opencode', 'qwen', 'crush', 'copilot', 'kilo', 'kilocode', 'amp', 'cline', 'cn', 'kimi', 'reasonix', 'codewhale', 'aider', 'cursor-agent', 'agent', 'goose',
|
|
35
|
-
// toolchains and everyday tools
|
|
36
|
-
'node', 'npm', 'npx', 'pnpm', 'pnpx', 'yarn', 'corepack', 'volta', 'nvm', 'deno', 'bun', 'bunx', 'tsc', 'git', 'gh', 'code', 'python', 'python3', 'py', 'pip', 'pip3', 'uv', 'uvx', 'pyenv', 'poetry',
|
|
37
|
-
'cargo', 'rustc', 'rustup', 'dotnet', 'nuget', 'msbuild', 'go', 'java', 'javac', 'mvn', 'mvnw', 'gradle', 'gradlew', 'ruby', 'gem', 'bundle', 'rake', 'rails', 'php', 'composer',
|
|
38
|
-
'make', 'cmake', 'ninja', 'gcc', 'g\\+\\+', 'clang', 'psql', 'mysql', 'mariadb', 'mongosh', 'redis-cli', 'docker', 'kubectl', 'terraform', 'az', 'aws',
|
|
39
|
-
'powershell', 'pwsh', 'cmd', 'where', 'tasklist', 'tar', 'curl', 'ssh', 'scp',
|
|
40
|
-
].join('|') + ')\\.(exe|com|bat|cmd|vbs|vbe|js|jse|wsf|wsh|msc|ps1)$', 'i');
|
|
41
|
-
/**
|
|
42
|
-
* Project files that tools on this PC act on by themselves: Claude Code runs a project's hooks, helpers and MCP servers,
|
|
43
|
-
* VS Code runs folder-open tasks and the programs workspace settings point at, direnv runs .envrc. For each, only the
|
|
44
|
-
* part that can run something is compared (`risky`), so the agent may still edit the rest (permissions, formatting).
|
|
45
|
-
*/
|
|
46
|
-
const AGENT_FILES = {
|
|
47
|
-
'.claude/settings.json': (d) => claudeRisk(d),
|
|
48
|
-
'.claude/settings.local.json': (d) => claudeRisk(d),
|
|
49
|
-
'.mcp.json': (_d, text) => text,
|
|
50
|
-
'.vscode/tasks.json': (d) => JSON.stringify(d).match(/"runOn"\s*:\s*"folderOpen"/) ? d : null,
|
|
51
|
-
'.vscode/settings.json': (d) => _.pickBy(_.isPlainObject(d) ? d : {}, (_v, k) => /path|executable|command|interpreter|shell|profile|args|env|exec|program|server|launch|runtime|binary/i.test(k)),
|
|
52
|
-
'.envrc': (_d, text) => text,
|
|
53
|
-
};
|
|
54
|
-
const claudeRisk = (d) => {
|
|
55
|
-
const s = (_.isPlainObject(d) ? d : {});
|
|
56
|
-
const permissions = (_.isPlainObject(s.permissions) ? s.permissions : {});
|
|
57
|
-
return { ..._.pick(s, ['hooks', 'apiKeyHelper', 'awsAuthRefresh', 'awsCredentialExport', 'otelHeadersHelper', 'statusLine', 'env', 'enableAllProjectMcpServers', 'enabledMcpjsonServers', 'disableAllHooks']), permissions: _.pick(permissions, ['defaultMode', 'additionalDirectories']) };
|
|
58
|
-
};
|
|
59
|
-
const MAX_AGENT_FILE_BYTES = 1024 * 1024;
|
|
60
|
-
/** What can run in one agent file, as a short fingerprint (null = the file is not there). */
|
|
61
|
-
const agentRisk = (workspace, rel) => {
|
|
62
|
-
const file = path.join(workspace, ...rel.split('/'));
|
|
63
|
-
if (!fs.existsSync(file))
|
|
64
|
-
return null;
|
|
65
|
-
if (isLink(file) || isLink(path.dirname(file)) || !fileExists(file))
|
|
66
|
-
return 'link-or-not-a-file';
|
|
67
|
-
if (fs.statSync(file).size > MAX_AGENT_FILE_BYTES)
|
|
68
|
-
return 'too-large-' + hash(file);
|
|
69
|
-
const text = fs.readFileSync(file, 'utf8');
|
|
70
|
-
const errors = [];
|
|
71
|
-
const data = parseJsonc(text, errors, { allowTrailingComma: true });
|
|
72
|
-
const risk = AGENT_FILES[rel](rel === '.envrc' ? null : data, text);
|
|
73
|
-
return crypto.createHash('sha256').update(JSON.stringify(risk ?? null) + (errors.length && rel !== '.envrc' && rel !== '.mcp.json' ? hash(file) : '')).digest('hex');
|
|
74
|
-
};
|
|
75
|
-
const agentSnapshot = (workspace) => Object.fromEntries(Object.keys(AGENT_FILES).flatMap((rel) => { const r = agentRisk(workspace, rel); return r ? [[rel, r]] : []; }));
|
|
76
|
-
/** SHA-256 in small chunks: a sandbox can plant a multi-gigabyte "node.exe" to exhaust this PC's memory. */
|
|
77
|
-
const hash = (file) => {
|
|
78
|
-
if (isLink(file))
|
|
79
|
-
return 'link';
|
|
80
|
-
const sum = crypto.createHash('sha256');
|
|
81
|
-
const buffer = Buffer.alloc(1 << 20);
|
|
82
|
-
let fd;
|
|
83
|
-
// A file that cannot be read (locked by a program in the sandbox) never matches the snapshot, so it is dealt with.
|
|
84
|
-
try {
|
|
85
|
-
fd = fs.openSync(file, 'r');
|
|
86
|
-
}
|
|
87
|
-
catch {
|
|
88
|
-
return 'unreadable-' + crypto.randomBytes(4).toString('hex');
|
|
89
|
-
}
|
|
90
|
-
try {
|
|
91
|
-
for (let n = fs.readSync(fd, buffer, 0, buffer.length, null); n > 0; n = fs.readSync(fd, buffer, 0, buffer.length, null))
|
|
92
|
-
sum.update(buffer.subarray(0, n));
|
|
93
|
-
}
|
|
94
|
-
finally {
|
|
95
|
-
fs.closeSync(fd);
|
|
96
|
-
}
|
|
97
|
-
return sum.digest('hex');
|
|
98
|
-
};
|
|
99
|
-
const MAX_CONFIG_BYTES = 4 * 1024 * 1024;
|
|
100
|
-
const plainGitDir = (workspace) => {
|
|
101
|
-
const dir = path.join(workspace, '.git');
|
|
102
|
-
return dirExists(dir) && !isLink(dir) ? dir : null;
|
|
103
|
-
};
|
|
104
|
-
const filesIn = (dir, accept) => dirExists(dir) && !isLink(dir)
|
|
105
|
-
? Object.fromEntries(fs.readdirSync(dir, { withFileTypes: true }).filter((e) => (e.isFile() || e.isSymbolicLink()) && accept(e.name)).map((e) => [e.name, hash(path.join(dir, e.name))]))
|
|
106
|
-
: {};
|
|
107
|
-
const configLines = (dir) => {
|
|
108
|
-
const file = path.join(dir, 'config');
|
|
109
|
-
return fileExists(file) && !isLink(file) && fs.statSync(file).size <= MAX_CONFIG_BYTES ? fs.readFileSync(file, 'utf8').split(/\r?\n/) : [];
|
|
110
|
-
};
|
|
111
|
-
const gitState = (dir) => ({
|
|
112
|
-
config: dir ? configLines(dir) : [],
|
|
113
|
-
hooks: dir ? filesIn(path.join(dir, 'hooks'), (n) => !n.endsWith('.sample')) : {},
|
|
114
|
-
redirects: dir ? REDIRECTS.filter((n) => fs.existsSync(path.join(dir, n))) : [],
|
|
115
|
-
});
|
|
116
|
-
const EMPTY_GIT = { config: [], hooks: {}, redirects: [] };
|
|
117
|
-
const MAX_OTHER_REPOS = 64;
|
|
118
|
-
const SKIP_DIRS = new Set(['node_modules', '.git', 'agent-sandbox-quarantine', 'target', 'dist', 'build', 'bin', 'obj', '.venv', 'venv']);
|
|
119
|
-
const plainDirs = (dir, limit) => {
|
|
120
|
-
try {
|
|
121
|
-
return fs.readdirSync(dir, { withFileTypes: true }).filter((e) => e.isDirectory() && !e.isSymbolicLink()).slice(0, limit).map((e) => path.join(dir, e.name));
|
|
122
|
-
}
|
|
123
|
-
catch {
|
|
124
|
-
return [];
|
|
125
|
-
}
|
|
126
|
-
};
|
|
127
|
-
/**
|
|
128
|
-
* Git folders other than the project's own: submodules (.git/modules/**) and repositories nested up to two levels deep.
|
|
129
|
-
* git runs their hooks and config too (git status in a subfolder, VS Code's repository scan). Bounded: links are never
|
|
130
|
-
* followed and at most MAX_OTHER_REPOS are looked at.
|
|
131
|
-
*/
|
|
132
|
-
const otherGitDirs = (workspace) => {
|
|
133
|
-
const found = [];
|
|
134
|
-
const main = plainGitDir(workspace);
|
|
135
|
-
// Submodules: a folder with a config and a HEAD is a git folder, and may have modules of its own.
|
|
136
|
-
const walk = (dir, depth) => {
|
|
137
|
-
for (const d of plainDirs(dir, 200)) {
|
|
138
|
-
if (found.length >= MAX_OTHER_REPOS)
|
|
139
|
-
return;
|
|
140
|
-
if (fileExists(path.join(d, 'config')) && fileExists(path.join(d, 'HEAD'))) {
|
|
141
|
-
found.push(d);
|
|
142
|
-
if (depth < 3)
|
|
143
|
-
walk(path.join(d, 'modules'), depth + 1);
|
|
144
|
-
}
|
|
145
|
-
else if (depth < 3)
|
|
146
|
-
walk(d, depth + 1);
|
|
147
|
-
}
|
|
148
|
-
};
|
|
149
|
-
if (main)
|
|
150
|
-
walk(path.join(main, 'modules'), 0);
|
|
151
|
-
for (const sub of plainDirs(workspace, 500).filter((d) => !SKIP_DIRS.has(path.basename(d).toLowerCase()))) {
|
|
152
|
-
for (const candidate of [sub, ...plainDirs(sub, 200).filter((d) => !SKIP_DIRS.has(path.basename(d).toLowerCase()))]) {
|
|
153
|
-
if (found.length >= MAX_OTHER_REPOS)
|
|
154
|
-
return found;
|
|
155
|
-
const git = plainGitDir(candidate);
|
|
156
|
-
if (git)
|
|
157
|
-
found.push(git);
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
return found;
|
|
161
|
-
};
|
|
162
|
-
const relative = (workspace, dir) => path.relative(workspace, dir).split(path.sep).join('/');
|
|
163
|
-
export const snapshotRepo = (workspace) => {
|
|
164
|
-
const dir = plainGitDir(workspace);
|
|
165
|
-
return {
|
|
166
|
-
gitDir: dir !== null,
|
|
167
|
-
...gitState(dir),
|
|
168
|
-
commands: filesIn(workspace, (n) => COMMANDS.test(n)),
|
|
169
|
-
agent: agentSnapshot(workspace),
|
|
170
|
-
repos: Object.fromEntries(otherGitDirs(workspace).map((d) => [relative(workspace, d), gitState(d)])),
|
|
171
|
-
};
|
|
172
|
-
};
|
|
173
|
-
/** Moves files into <dir>\agent-sandbox-quarantine\<time>\ and reports them. */
|
|
174
|
-
const quarantine = (from, names, into, kind) => {
|
|
175
|
-
if (names.length === 0)
|
|
176
|
-
return [];
|
|
177
|
-
const target = path.join(into, 'agent-sandbox-quarantine', String(Date.now()));
|
|
178
|
-
fs.mkdirSync(target, { recursive: true });
|
|
179
|
-
return names.map((name) => {
|
|
180
|
-
try {
|
|
181
|
-
fs.renameSync(path.join(from, name), path.join(target, name));
|
|
182
|
-
}
|
|
183
|
-
catch (e) {
|
|
184
|
-
return { kind, detail: name + ' (could not be moved: ' + e.code + '; delete it yourself before running anything here)' };
|
|
185
|
-
}
|
|
186
|
-
return { kind, detail: name + ' (moved to ' + target + ')' };
|
|
187
|
-
});
|
|
188
|
-
};
|
|
189
|
-
/** Comments out newly added config lines that make git run programs. Existing lines are never touched. */
|
|
190
|
-
const disableConfig = (dir, before) => {
|
|
191
|
-
const lines = configLines(dir);
|
|
192
|
-
const known = _.countBy(before);
|
|
193
|
-
const seen = {};
|
|
194
|
-
const findings = [];
|
|
195
|
-
let inInclude = false;
|
|
196
|
-
let section = '';
|
|
197
|
-
const fixed = lines.map((line) => {
|
|
198
|
-
const header = SECTION.exec(line);
|
|
199
|
-
if (header) {
|
|
200
|
-
section = header[1].trim().toLowerCase().split(/\s/)[0];
|
|
201
|
-
inInclude = /^include(if\s+"[^"]*")?$/i.test(header[1].trim());
|
|
202
|
-
}
|
|
203
|
-
seen[line] = (seen[line] ?? 0) + 1;
|
|
204
|
-
if (line.startsWith(MARK) || seen[line] <= (known[line] ?? 0))
|
|
205
|
-
return line;
|
|
206
|
-
// git also accepts "[core] fsmonitor = x" on one line, so look past a leading section header.
|
|
207
|
-
const keyPart = line.replace(SECTION, '').trim();
|
|
208
|
-
if (!(DANGEROUS_KEY.test(keyPart) || (inInclude && keyPart.includes('=')) || dangerousInSection(section, keyPart)))
|
|
209
|
-
return line;
|
|
210
|
-
findings.push({ kind: 'config', detail: line.trim() });
|
|
211
|
-
return MARK + line.trim();
|
|
212
|
-
});
|
|
213
|
-
if (findings.length)
|
|
214
|
-
writeFileAtomic(path.join(dir, 'config'), fixed.join('\n'));
|
|
215
|
-
const file = path.join(dir, 'config');
|
|
216
|
-
// A link or a huge file is not read at all, so say so instead of letting it pass as "nothing found".
|
|
217
|
-
const unchecked = isLink(file) ? '.git/config is a link' : lines.length === 0 && fileExists(file) && fs.statSync(file).size > MAX_CONFIG_BYTES ? '.git/config is over 4 MB' : null;
|
|
218
|
-
if (unchecked)
|
|
219
|
-
findings.push({ kind: 'git', detail: unchecked + ', so it cannot be checked. Do not run git in this folder until you have looked at it.' });
|
|
220
|
-
return findings;
|
|
221
|
-
};
|
|
222
|
-
/**
|
|
223
|
-
* Compares the workspace with its pre-launch snapshot and neutralises anything new that would execute on this PC.
|
|
224
|
-
* Returns what was found (and fixed). Never touches what was already there before the sandbox ran.
|
|
225
|
-
*/
|
|
226
|
-
export const guardRepo = (workspace, before) => {
|
|
227
|
-
assertTestWritable(workspace);
|
|
228
|
-
const findings = [];
|
|
229
|
-
const commandsNow = filesIn(workspace, (n) => COMMANDS.test(n));
|
|
230
|
-
findings.push(...quarantine(workspace, Object.keys(commandsNow).filter((n) => before.commands[n] !== commandsNow[n]), workspace, 'command'));
|
|
231
|
-
// Snapshots from before these checks existed have no baseline: checking against nothing would move your own files.
|
|
232
|
-
if (before.agent)
|
|
233
|
-
findings.push(...guardAgentFiles(workspace, before.agent));
|
|
234
|
-
if (before.repos) {
|
|
235
|
-
for (const other of otherGitDirs(workspace)) {
|
|
236
|
-
const rel = relative(workspace, other);
|
|
237
|
-
findings.push(...guardGitDir(other, before.repos[rel] ?? EMPTY_GIT).map((f) => ({ ...f, detail: rel + ': ' + f.detail })));
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
const dir = plainGitDir(workspace);
|
|
241
|
-
if (!dir) {
|
|
242
|
-
const replaced = before.gitDir && fs.existsSync(path.join(workspace, '.git'));
|
|
243
|
-
if (replaced)
|
|
244
|
-
findings.push({ kind: 'git', detail: '.git was replaced by a link or a "gitdir:" file inside the sandbox. Do not run git in ' + workspace + ' until you have checked it.' });
|
|
245
|
-
return findings;
|
|
246
|
-
}
|
|
247
|
-
findings.push(...guardGitDir(dir, before));
|
|
248
|
-
return findings;
|
|
249
|
-
};
|
|
250
|
-
const guardGitDir = (dir, before) => {
|
|
251
|
-
const hooksDir = path.join(dir, 'hooks');
|
|
252
|
-
const hooksNow = filesIn(hooksDir, (n) => !n.endsWith('.sample'));
|
|
253
|
-
return [
|
|
254
|
-
...quarantine(hooksDir, Object.keys(hooksNow).filter((n) => before.hooks[n] !== hooksNow[n]), dir, 'hook'),
|
|
255
|
-
...quarantine(dir, REDIRECTS.filter((n) => fs.existsSync(path.join(dir, n)) && !before.redirects.includes(n)), dir, 'git'),
|
|
256
|
-
...disableConfig(dir, before.config),
|
|
257
|
-
];
|
|
258
|
-
};
|
|
259
|
-
/** Agent files whose runnable part changed are moved to the quarantine folder (the rest of your edits are in there too). */
|
|
260
|
-
const guardAgentFiles = (workspace, before) => {
|
|
261
|
-
const changed = Object.keys(AGENT_FILES).filter((rel) => { const now = agentRisk(workspace, rel); return now !== null && now !== before[rel]; });
|
|
262
|
-
if (!changed.length)
|
|
263
|
-
return [];
|
|
264
|
-
const target = path.join(workspace, 'agent-sandbox-quarantine', String(Date.now()));
|
|
265
|
-
fs.mkdirSync(target, { recursive: true });
|
|
266
|
-
return changed.map((rel) => {
|
|
267
|
-
const what = rel + ' (the sandbox added something it would run on this PC: hooks, MCP servers, helper commands or tasks';
|
|
268
|
-
try {
|
|
269
|
-
fs.renameSync(path.join(workspace, ...rel.split('/')), path.join(target, rel.replace(/\//g, '_')));
|
|
270
|
-
}
|
|
271
|
-
catch (e) {
|
|
272
|
-
return { kind: 'agent', detail: what + '; could not be moved: ' + e.code + '. Check it before you open this folder in Claude Code or VS Code)' };
|
|
273
|
-
}
|
|
274
|
-
return { kind: 'agent', detail: what + '; moved to ' + target + ')' };
|
|
275
|
-
});
|
|
276
|
-
};
|
|
277
|
-
// ---- snapshot storage (host-only, next to the sync state) ---------------------------------------------------------
|
|
278
|
-
const syncDir = (dataPath) => path.join(path.dirname(path.dirname(dataPath)), 'sync');
|
|
279
|
-
const snapshotFile = (dataPath) => path.join(syncDir(dataPath), path.basename(dataPath) + '-repo.json');
|
|
280
|
-
const findingsFile = (dataPath) => path.join(syncDir(dataPath), path.basename(dataPath) + '-repo-findings.json');
|
|
281
|
-
const Finding = z.object({ kind: z.enum(['hook', 'config', 'git', 'command', 'agent']), detail: z.string().max(4096), at: z.string().max(64).optional() });
|
|
282
|
-
const GitStateSchema = z.object({ config: z.array(z.string()), hooks: z.record(z.string(), z.string()), redirects: z.array(z.string()) });
|
|
283
|
-
const Saved = z.object({
|
|
284
|
-
workspace: z.string().max(1024).refine((p) => path.isAbsolute(p)),
|
|
285
|
-
snapshot: GitStateSchema.extend({ gitDir: z.boolean(), commands: z.record(z.string(), z.string()), agent: z.record(z.string(), z.string()).optional(), repos: z.record(z.string(), GitStateSchema).optional() }),
|
|
286
|
-
});
|
|
287
|
-
const Store = z.strictObject({ projects: z.array(Saved).max(4096), roots: z.array(z.string().max(1024).refine((p) => path.isAbsolute(p))).max(64) });
|
|
288
|
-
const StoreAny = z.union([Store, Saved.transform((s) => ({ projects: [s], roots: [] }))]);
|
|
289
|
-
const readStore = (dataPath) => readValid(StoreAny, snapshotFile(dataPath)) ?? { projects: [], roots: [] };
|
|
290
|
-
const EMPTY = { gitDir: false, config: [], hooks: {}, redirects: [], commands: {}, agent: {}, repos: {} };
|
|
291
|
-
const MAX_ROOT_PROJECTS = 2000;
|
|
292
|
-
/** The folders directly inside a project root (plain folders only; links are never followed). */
|
|
293
|
-
const rootProjects = (root) => {
|
|
294
|
-
if (!dirExists(root) || isLink(root))
|
|
295
|
-
return [];
|
|
296
|
-
return fs.readdirSync(root, { withFileTypes: true }).filter((e) => e.isDirectory() && !e.isSymbolicLink()).slice(0, MAX_ROOT_PROJECTS).map((e) => path.join(root, e.name));
|
|
297
|
-
};
|
|
298
|
-
const has = (projects, workspace) => projects.some((s) => s.workspace.toLowerCase() === workspace.toLowerCase());
|
|
299
|
-
/**
|
|
300
|
-
* At launch: every folder the sandbox will be able to write. The launch folder, projects mapped with it and every
|
|
301
|
-
* project already inside a project root are snapshotted as they are now, before the sandbox can touch them.
|
|
302
|
-
*/
|
|
303
|
-
export const saveRepoSnapshot = (dataPath, workspace, more = [], roots = []) => {
|
|
304
|
-
const folders = _.uniqBy([workspace, ...more, ...roots.flatMap((r) => [r, ...rootProjects(r)])], (w) => w.toLowerCase());
|
|
305
|
-
writeJsonAtomic(snapshotFile(dataPath), { projects: folders.map((w) => ({ workspace: w, snapshot: snapshotRepo(w) })), roots });
|
|
306
|
-
};
|
|
307
|
-
/**
|
|
308
|
-
* A project that joins the running sandbox: snapshotted before its first session, then guarded like the launch
|
|
309
|
-
* folder. A project already guarded keeps its first snapshot (what was there before the sandbox could touch it).
|
|
310
|
-
*/
|
|
311
|
-
export const addRepoSnapshot = (dataPath, workspace, o = {}) => {
|
|
312
|
-
const store = readStore(dataPath);
|
|
313
|
-
// A folder inside one that is guarded already is covered by it only for its root files; it gets its own entry.
|
|
314
|
-
if (has(store.projects, workspace))
|
|
315
|
-
return;
|
|
316
|
-
writeJsonAtomic(snapshotFile(dataPath), { ...store, projects: [...store.projects, { workspace, snapshot: o.empty ? EMPTY : snapshotRepo(workspace) }] });
|
|
317
|
-
};
|
|
318
|
-
/**
|
|
319
|
-
* Folders that appeared inside a project root after the launch: the sandbox could have written them from the start,
|
|
320
|
-
* so they get an EMPTY baseline: any git hook, git config that runs programs (core.hooksPath, core.fsmonitor, ...)
|
|
321
|
-
* or planted command in them counts as added inside the sandbox and is neutralised.
|
|
322
|
-
*/
|
|
323
|
-
const discoverRootProjects = (dataPath) => {
|
|
324
|
-
const store = readStore(dataPath);
|
|
325
|
-
const found = store.roots.flatMap(rootProjects).filter((w) => !has(store.projects, w)).map((workspace) => ({ workspace, snapshot: EMPTY }));
|
|
326
|
-
if (!found.length)
|
|
327
|
-
return store.projects;
|
|
328
|
-
const projects = [...store.projects, ...found].slice(0, 4096);
|
|
329
|
-
writeJsonAtomic(snapshotFile(dataPath), { ...store, projects });
|
|
330
|
-
return projects;
|
|
331
|
-
};
|
|
332
|
-
/** The folders being guarded (for status). */
|
|
333
|
-
export const guardedProjects = (dataPath) => readStore(dataPath).projects.map((s) => s.workspace);
|
|
334
|
-
/** Re-checks every project of the current/last launch; findings are kept in a host-only file for `status`. Returns the new ones. */
|
|
335
|
-
export const checkRepo = (dataPath) => {
|
|
336
|
-
const saved = discoverRootProjects(dataPath);
|
|
337
|
-
if (!saved.length)
|
|
338
|
-
return [];
|
|
339
|
-
const old = repoFindings(dataPath);
|
|
340
|
-
// A finding that cannot be fixed (a file locked in the sandbox) is reported once, not every minute.
|
|
341
|
-
const findings = saved.flatMap((s) => guardRepo(s.workspace, s.snapshot).map((f) => (saved.length > 1 ? { ...f, detail: s.workspace + ': ' + f.detail } : f)))
|
|
342
|
-
.filter((f) => !old.some((o) => o.kind === f.kind && o.detail === f.detail));
|
|
343
|
-
if (findings.length)
|
|
344
|
-
writeJsonAtomic(findingsFile(dataPath), [...old, ...findings.map((f) => ({ ...f, at: new Date().toISOString() }))]);
|
|
345
|
-
return findings;
|
|
346
|
-
};
|
|
347
|
-
export const repoFindings = (dataPath) => readValid(z.array(Finding).max(10000), findingsFile(dataPath)) ?? [];
|
package/dist/host/secrets.d.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { Config } from '../core/types.js';
|
|
2
|
-
export type SecretsConfig = Config['secrets'];
|
|
3
|
-
export declare const isSecretName: (name: string, secrets: SecretsConfig) => boolean;
|
|
4
|
-
export declare const isSecretValue: (value: string) => boolean;
|
|
5
|
-
/** Whether a variable (name and value) may go into the sandbox. secrets.allow always wins. */
|
|
6
|
-
export declare const mayPass: (name: string, value: unknown, secrets: SecretsConfig) => boolean;
|
|
7
|
-
/** A copy of an env/headers map without the secrets; the names removed are added to `removed` (with `where`). */
|
|
8
|
-
export declare const stripVariables: (vars: unknown, secrets: SecretsConfig, where: string, removed: string[]) => unknown;
|
|
9
|
-
/** settings.json for the sandbox: secrets out of "env", credential helper commands removed. */
|
|
10
|
-
export declare const stripSettings: (settings: Record<string, unknown>, secrets: SecretsConfig, removed: string[]) => Record<string, unknown>;
|
|
11
|
-
/** Every MCP server in a .claude.json-shaped object (top level and per project). */
|
|
12
|
-
export declare const stripMcpServers: (state: Record<string, unknown>, secrets: SecretsConfig, removed: string[]) => Record<string, unknown>;
|
|
13
|
-
/** Secret-looking files in the workspace root and one folder down (skipping dependency folders). */
|
|
14
|
-
export declare const findSecretFiles: (workspace: string) => string[];
|