windows-development-sandbox 1.4.1 → 1.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config.example.json +3 -1
- package/dist/api.js +27 -16
- package/dist/cli/args.d.ts +4 -6
- package/dist/cli/args.js +67 -34
- package/dist/cli/argv.d.ts +9 -0
- package/dist/cli/argv.js +22 -0
- package/dist/cli/commands/accounts.d.ts +1 -1
- package/dist/cli/commands/accounts.js +42 -27
- package/dist/cli/commands/agent-commands.d.ts +3 -3
- package/dist/cli/commands/agent-commands.js +27 -18
- package/dist/cli/commands/context.d.ts +9 -11
- package/dist/cli/commands/context.js +35 -32
- package/dist/cli/commands/data/clean.d.ts +2 -2
- package/dist/cli/commands/data/clean.js +27 -11
- package/dist/cli/commands/data/collect.d.ts +6 -3
- package/dist/cli/commands/data/collect.js +46 -15
- package/dist/cli/commands/data/index.d.ts +2 -2
- package/dist/cli/commands/data/index.js +30 -12
- package/dist/cli/commands/data/remove.d.ts +1 -1
- package/dist/cli/commands/data/remove.js +4 -4
- package/dist/cli/commands/index.d.ts +5 -4
- package/dist/cli/commands/index.js +5 -4
- package/dist/cli/commands/launch/add-root.d.ts +7 -0
- package/dist/cli/commands/launch/add-root.js +64 -0
- package/dist/cli/commands/launch/boot-progress.d.ts +7 -0
- package/dist/cli/commands/launch/boot-progress.js +48 -0
- package/dist/cli/commands/launch/boot-wants.d.ts +11 -0
- package/dist/cli/commands/launch/boot-wants.js +48 -0
- package/dist/cli/commands/launch/first-start.d.ts +10 -0
- package/dist/cli/commands/launch/first-start.js +53 -0
- package/dist/cli/commands/launch/index.d.ts +6 -0
- package/dist/cli/commands/launch/index.js +6 -0
- package/dist/cli/commands/launch/launch.d.ts +8 -0
- package/dist/cli/commands/launch/launch.js +211 -0
- package/dist/cli/commands/launch/prepare.d.ts +23 -0
- package/dist/cli/commands/launch/prepare.js +109 -0
- package/dist/cli/commands/launch/running.d.ts +45 -0
- package/dist/cli/commands/launch/running.js +218 -0
- package/dist/cli/commands/launch/summary.d.ts +8 -0
- package/dist/cli/commands/launch/summary.js +98 -0
- package/dist/cli/commands/maintenance/audit.d.ts +3 -0
- package/dist/cli/commands/maintenance/audit.js +58 -0
- package/dist/cli/commands/maintenance/clean.d.ts +2 -0
- package/dist/cli/commands/maintenance/clean.js +10 -0
- package/dist/cli/commands/maintenance/config.d.ts +2 -0
- package/dist/cli/commands/maintenance/config.js +145 -0
- package/dist/cli/commands/maintenance/doctor.d.ts +2 -0
- package/dist/cli/commands/maintenance/doctor.js +52 -0
- package/dist/cli/commands/maintenance/host-claude.d.ts +2 -0
- package/dist/cli/commands/maintenance/host-claude.js +4 -0
- package/dist/cli/commands/maintenance/index.d.ts +8 -0
- package/dist/cli/commands/maintenance/index.js +9 -0
- package/dist/cli/commands/maintenance/logs.d.ts +2 -0
- package/dist/cli/commands/maintenance/logs.js +44 -0
- package/dist/cli/commands/maintenance/sync.d.ts +2 -0
- package/dist/cli/commands/maintenance/sync.js +12 -0
- package/dist/cli/commands/maintenance/watch.d.ts +3 -0
- package/dist/cli/commands/maintenance/watch.js +6 -0
- package/dist/cli/commands/projects/describe-sessions.d.ts +3 -0
- package/dist/cli/commands/projects/describe-sessions.js +15 -0
- package/dist/cli/commands/projects/here.d.ts +38 -0
- package/dist/cli/commands/projects/here.js +145 -0
- package/dist/cli/commands/projects/index.d.ts +4 -0
- package/dist/cli/commands/projects/index.js +4 -0
- package/dist/cli/commands/projects/projects.d.ts +14 -0
- package/dist/cli/commands/projects/projects.js +213 -0
- package/dist/cli/commands/projects/restart.d.ts +15 -0
- package/dist/cli/commands/projects/restart.js +149 -0
- package/dist/cli/commands/registry.d.ts +3 -0
- package/dist/cli/commands/registry.js +34 -0
- package/dist/cli/commands/repair/checks.js +105 -29
- package/dist/cli/commands/repair/finders.d.ts +13 -10
- package/dist/cli/commands/repair/finders.js +63 -43
- package/dist/cli/commands/repair/index.d.ts +4 -4
- package/dist/cli/commands/repair/index.js +47 -21
- package/dist/cli/commands/repair/types.d.ts +2 -2
- package/dist/cli/commands/repair/types.js +7 -2
- package/dist/cli/commands/sessions/attach.d.ts +2 -0
- package/dist/cli/commands/sessions/attach.js +45 -0
- package/dist/cli/commands/sessions/control.d.ts +4 -0
- package/dist/cli/commands/sessions/control.js +62 -0
- package/dist/cli/commands/sessions/exec.d.ts +6 -0
- package/dist/cli/commands/sessions/exec.js +72 -0
- package/dist/cli/commands/sessions/index.d.ts +6 -0
- package/dist/cli/commands/sessions/index.js +9 -0
- package/dist/cli/commands/sessions/list.d.ts +15 -0
- package/dist/cli/commands/sessions/list.js +65 -0
- package/dist/cli/commands/sessions/status.d.ts +2 -0
- package/dist/cli/commands/sessions/status.js +153 -0
- package/dist/cli/commands/sessions/window.d.ts +3 -0
- package/dist/cli/commands/sessions/window.js +18 -0
- package/dist/cli/commands/setup/checks.d.ts +4 -4
- package/dist/cli/commands/setup/checks.js +36 -19
- package/dist/cli/commands/setup/facts.d.ts +6 -6
- package/dist/cli/commands/setup/facts.js +23 -11
- package/dist/cli/commands/setup/index.d.ts +1 -1
- package/dist/cli/commands/setup/index.js +25 -12
- package/dist/cli/commands/user-config.d.ts +5 -5
- package/dist/cli/commands/user-config.js +14 -12
- package/dist/cli/history.d.ts +5 -4
- package/dist/cli/history.js +23 -11
- package/dist/cli/index.d.ts +4 -14
- package/dist/cli/index.js +27 -77
- package/dist/cli/manifest.d.ts +464 -10
- package/dist/cli/manifest.js +327 -53
- package/dist/cli/menu/apps.d.ts +7 -5
- package/dist/cli/menu/apps.js +64 -16
- package/dist/cli/menu/command-fields.d.ts +15 -0
- package/dist/cli/menu/command-fields.js +23 -0
- package/dist/cli/menu/command-form.d.ts +3 -5
- package/dist/cli/menu/command-form.js +116 -48
- package/dist/cli/menu/home.d.ts +22 -0
- package/dist/cli/menu/home.js +72 -0
- package/dist/cli/menu/index.d.ts +2 -24
- package/dist/cli/menu/index.js +4 -178
- package/dist/cli/menu/menu.d.ts +23 -0
- package/dist/cli/menu/menu.js +185 -0
- package/dist/cli/menu/settings/categories.d.ts +2 -2
- package/dist/cli/menu/settings/categories.js +123 -20
- package/dist/cli/menu/settings/collections/collection-editor.d.ts +23 -0
- package/dist/cli/menu/settings/collections/collection-editor.js +89 -0
- package/dist/cli/menu/settings/collections/map-editor.d.ts +10 -0
- package/dist/cli/menu/settings/collections/map-editor.js +34 -0
- package/dist/cli/menu/settings/collections/object-list-editor.d.ts +10 -0
- package/dist/cli/menu/settings/collections/object-list-editor.js +23 -0
- package/dist/cli/menu/settings/collections/object-map-editor.d.ts +10 -0
- package/dist/cli/menu/settings/collections/object-map-editor.js +35 -0
- package/dist/cli/menu/settings/collections/string-list-editor.d.ts +12 -0
- package/dist/cli/menu/settings/collections/string-list-editor.js +39 -0
- package/dist/cli/menu/settings/config-file.d.ts +2 -2
- package/dist/cli/menu/settings/config-file.js +42 -19
- package/dist/cli/menu/settings/editor-actions.d.ts +2 -0
- package/dist/cli/menu/settings/editor-actions.js +2 -0
- package/dist/cli/menu/settings/format.d.ts +5 -0
- package/dist/cli/menu/settings/format.js +39 -0
- package/dist/cli/menu/settings/index.d.ts +1 -29
- package/dist/cli/menu/settings/index.js +1 -133
- package/dist/cli/menu/settings/object-editor.d.ts +12 -0
- package/dist/cli/menu/settings/object-editor.js +86 -0
- package/dist/cli/menu/settings/schema-node.d.ts +3 -1
- package/dist/cli/menu/settings/schema-node.js +71 -24
- package/dist/cli/menu/settings/settings-editor.d.ts +30 -0
- package/dist/cli/menu/settings/settings-editor.js +176 -0
- package/dist/cli/menu/settings/{editors.d.ts → value-editor.d.ts} +2 -13
- package/dist/cli/menu/settings/value-editor.js +137 -0
- package/dist/cli/menu/several.d.ts +4 -4
- package/dist/cli/menu/several.js +61 -20
- package/dist/cli/{colors.d.ts → output/colors.d.ts} +8 -8
- package/dist/cli/{colors.js → output/colors.js} +32 -14
- package/dist/cli/output/index.d.ts +3 -0
- package/dist/cli/output/index.js +3 -0
- package/dist/cli/output/print.d.ts +5 -0
- package/dist/cli/output/print.js +14 -0
- package/dist/cli/{progress.d.ts → output/progress.d.ts} +5 -5
- package/dist/cli/{progress.js → output/progress.js} +42 -19
- package/dist/cli/report.d.ts +2 -0
- package/dist/cli/report.js +20 -0
- package/dist/cli/tui/app.d.ts +6 -16
- package/dist/cli/tui/app.js +28 -8
- package/dist/cli/tui/dialogs/confirm-screen.d.ts +20 -0
- package/dist/cli/tui/dialogs/confirm-screen.js +50 -0
- package/dist/cli/tui/dialogs/message-screen.d.ts +17 -0
- package/dist/cli/tui/dialogs/message-screen.js +55 -0
- package/dist/cli/tui/dialogs/paragraphs.d.ts +2 -0
- package/dist/cli/tui/dialogs/paragraphs.js +5 -0
- package/dist/cli/tui/dialogs/text-screen.d.ts +26 -0
- package/dist/cli/tui/dialogs/text-screen.js +107 -0
- package/dist/cli/tui/frame.js +3 -1
- package/dist/cli/tui/index.d.ts +7 -3
- package/dist/cli/tui/index.js +4 -2
- package/dist/cli/tui/list/list-screen.d.ts +29 -0
- package/dist/cli/tui/{list-screen.js → list/list-screen.js} +86 -23
- package/dist/cli/tui/{list-screen.d.ts → list/list-types.d.ts} +0 -28
- package/dist/cli/tui/screen.d.ts +14 -0
- package/dist/cli/tui/terminal.js +34 -10
- package/dist/cli/tui/text.d.ts +2 -1
- package/dist/cli/tui/text.js +37 -7
- package/dist/cli/tui/theme.js +27 -9
- package/dist/cli/validate.d.ts +8 -8
- package/dist/cli/validate.js +32 -21
- package/dist/core/config/defaults.d.ts +2 -0
- package/dist/core/config/defaults.js +203 -0
- package/dist/core/config/index.d.ts +2 -0
- package/dist/core/config/index.js +3 -0
- package/dist/core/{config.d.ts → config/loader.d.ts} +1 -2
- package/dist/core/config/loader.js +47 -0
- package/dist/core/{detect-databases.js → detect/databases.js} +111 -23
- package/dist/core/detect/index.d.ts +4 -0
- package/dist/core/detect/index.js +4 -0
- package/dist/core/{detect-pwsh.d.ts → detect/pwsh.d.ts} +1 -1
- package/dist/core/{detect-pwsh.js → detect/pwsh.js} +25 -11
- package/dist/core/{detect-toolchains.d.ts → detect/toolchains.d.ts} +1 -1
- package/dist/core/{detect-toolchains.js → detect/toolchains.js} +42 -5
- package/dist/{guest/toolchains → core/detect}/versions.js +28 -12
- package/dist/core/disk.d.ts +2 -0
- package/dist/core/disk.js +46 -3
- package/dist/core/local-config/boot-wants.d.ts +45 -0
- package/dist/core/local-config/boot-wants.js +120 -0
- package/dist/core/local-config/file.d.ts +3 -0
- package/dist/core/local-config/file.js +16 -0
- package/dist/core/local-config/index.d.ts +5 -0
- package/dist/core/local-config/index.js +7 -0
- package/dist/core/{local-config.d.ts → local-config/overrides.d.ts} +3 -18
- package/dist/core/{local-config.js → local-config/overrides.js} +45 -52
- package/dist/core/local-config/policy.d.ts +19 -0
- package/dist/core/local-config/policy.js +45 -0
- package/dist/core/local-config/trust.d.ts +13 -0
- package/dist/core/local-config/trust.js +43 -0
- package/dist/core/package-info.d.ts +4 -0
- package/dist/core/package-info.js +13 -0
- package/dist/core/run/guest-workspace.d.ts +23 -0
- package/dist/core/run/guest-workspace.js +47 -0
- package/dist/core/run/index.d.ts +3 -0
- package/dist/core/run/index.js +3 -0
- package/dist/core/run/resolve-run.d.ts +3 -0
- package/dist/core/run/resolve-run.js +202 -0
- package/dist/core/run/versions.d.ts +13 -0
- package/dist/core/run/versions.js +65 -0
- package/dist/core/safe-paths.js +17 -5
- package/dist/core/schema/apps.d.ts +4 -4
- package/dist/core/schema/apps.js +55 -21
- package/dist/core/schema/common.d.ts +13 -10
- package/dist/core/schema/common.js +16 -10
- package/dist/core/schema/config.d.ts +15 -10
- package/dist/core/schema/config.js +78 -53
- package/dist/core/schema/databases.d.ts +4 -3
- package/dist/core/schema/databases.js +16 -12
- package/dist/core/schema/harness.d.ts +1 -1
- package/dist/core/schema/harness.js +17 -7
- package/dist/core/schema/index.d.ts +6 -0
- package/dist/core/schema/index.js +8 -0
- package/dist/core/schema/json-schema.js +10 -5
- package/dist/core/schema/profile.d.ts +4 -4
- package/dist/core/schema/profile.js +37 -17
- package/dist/core/schema/projects.d.ts +1 -1
- package/dist/core/schema/projects.js +16 -6
- package/dist/core/schema/sandbox.d.ts +11 -11
- package/dist/core/schema/sandbox.js +101 -37
- package/dist/core/schema/toolchains.d.ts +6 -1
- package/dist/core/schema/toolchains.js +84 -34
- package/dist/core/types.d.ts +19 -9
- package/dist/core/util/errors.d.ts +8 -0
- package/dist/core/util/errors.js +14 -0
- package/dist/core/util/fs.d.ts +8 -0
- package/dist/core/util/fs.js +40 -0
- package/dist/core/util/index.d.ts +7 -0
- package/dist/core/util/index.js +7 -0
- package/dist/core/util/jsonc.d.ts +6 -0
- package/dist/core/util/jsonc.js +25 -0
- package/dist/core/util/links.d.ts +10 -0
- package/dist/core/util/links.js +39 -0
- package/dist/core/util/paths.d.ts +7 -0
- package/dist/core/util/paths.js +33 -0
- package/dist/core/util/process.d.ts +15 -0
- package/dist/core/util/process.js +54 -0
- package/dist/core/util/text.d.ts +8 -0
- package/dist/core/util/text.js +8 -0
- package/dist/guest/{setup/agents.js → agents/agent-installer.js} +24 -4
- package/dist/guest/apps/after-install.d.ts +3 -0
- package/dist/guest/apps/after-install.js +47 -0
- package/dist/guest/apps/app-installer.d.ts +22 -0
- package/dist/guest/apps/app-installer.js +116 -0
- package/dist/guest/apps/find-exe.d.ts +5 -0
- package/dist/guest/apps/find-exe.js +41 -0
- package/dist/guest/apps/index.d.ts +3 -10
- package/dist/guest/apps/index.js +6 -206
- package/dist/guest/apps/resolvers.js +37 -9
- package/dist/guest/apps/shortcuts.d.ts +6 -0
- package/dist/guest/apps/shortcuts.js +28 -0
- package/dist/guest/apps/sources.d.ts +4 -0
- package/dist/guest/apps/sources.js +17 -0
- package/dist/guest/apps/unpack.d.ts +3 -0
- package/dist/guest/apps/unpack.js +47 -0
- package/dist/guest/{audit-parse.js → audit/parse.js} +39 -3
- package/dist/guest/{audit.d.ts → audit/process-audit.d.ts} +3 -1
- package/dist/guest/{audit.js → audit/process-audit.js} +33 -8
- package/dist/guest/boot/boot-env.d.ts +4 -0
- package/dist/guest/{boot-env.js → boot/boot-env.js} +7 -5
- package/dist/guest/boot/boot.d.ts +1 -0
- package/dist/guest/{main.js → boot/boot.js} +96 -50
- package/dist/guest/{guide.js → boot/guide.js} +32 -7
- package/dist/guest/{project-env.d.ts → boot/project-env.d.ts} +3 -3
- package/dist/guest/{project-env.js → boot/project-env.js} +12 -4
- package/dist/guest/boot/project-status.d.ts +5 -0
- package/dist/guest/boot/project-status.js +28 -0
- package/dist/guest/daemon/daemon.d.ts +1 -0
- package/dist/guest/daemon/daemon.js +51 -0
- package/dist/guest/daemon/exec.js +18 -6
- package/dist/guest/daemon/{shutdown.js → idle-shutdown.js} +5 -4
- package/dist/guest/daemon/{project.d.ts → project-provisioner.d.ts} +3 -3
- package/dist/guest/daemon/{project.js → project-provisioner.js} +60 -22
- package/dist/guest/daemon/relays.js +5 -3
- package/dist/guest/daemon/{session.js → sessions.js} +84 -24
- package/dist/guest/daemon/state.d.ts +4 -1
- package/dist/guest/daemon/state.js +34 -20
- package/dist/guest/databases/database-server.d.ts +13 -0
- package/dist/guest/databases/database-server.js +35 -0
- package/dist/guest/databases/dynamodb.d.ts +12 -0
- package/dist/guest/databases/dynamodb.js +81 -0
- package/dist/guest/databases/index.d.ts +2 -0
- package/dist/guest/databases/index.js +2 -0
- package/dist/guest/databases/mongodb.d.ts +7 -0
- package/dist/guest/databases/mongodb.js +46 -0
- package/dist/guest/databases/mysql.d.ts +7 -0
- package/dist/guest/databases/mysql.js +59 -0
- package/dist/guest/databases/names.d.ts +5 -0
- package/dist/guest/databases/names.js +8 -0
- package/dist/guest/databases/postgres.d.ts +9 -0
- package/dist/guest/databases/postgres.js +85 -0
- package/dist/guest/databases/redis.d.ts +7 -0
- package/dist/guest/databases/redis.js +25 -0
- package/dist/guest/databases/registry.d.ts +5 -0
- package/dist/guest/databases/registry.js +51 -0
- package/dist/guest/databases/sbx-db.d.ts +1 -0
- package/dist/guest/{db.js → databases/sbx-db.js} +13 -13
- package/dist/guest/{toolchains/databases → databases}/server.d.ts +5 -5
- package/dist/guest/{toolchains/databases → databases}/server.js +18 -13
- package/dist/guest/entries/daemon.js +16 -0
- package/dist/guest/entries/db.js +10 -0
- package/dist/guest/entries/gitguard.js +20 -0
- package/dist/guest/entries/main.d.ts +1 -0
- package/dist/guest/entries/main.js +24 -0
- package/dist/guest/entries/netproxy.d.ts +1 -0
- package/dist/guest/entries/netproxy.js +7 -0
- package/dist/guest/entries/view.d.ts +1 -0
- package/dist/guest/entries/view.js +11 -0
- package/dist/guest/{gitguard.js → git/decision.js} +49 -26
- package/dist/guest/network/addresses.d.ts +2 -0
- package/dist/guest/network/addresses.js +6 -0
- package/dist/guest/{setup/network.d.ts → network/allow-only.d.ts} +0 -10
- package/dist/guest/network/allow-only.js +84 -0
- package/dist/guest/network/firewall.d.ts +9 -0
- package/dist/guest/{setup/network.js → network/firewall.js} +58 -63
- package/dist/guest/network/proxy-server.d.ts +2 -0
- package/dist/guest/{netproxy.js → network/proxy-server.js} +37 -18
- package/dist/guest/{helpers.d.ts → runtime/csc.d.ts} +1 -1
- package/dist/guest/{helpers.js → runtime/csc.js} +7 -2
- package/dist/guest/runtime/fs.d.ts +2 -0
- package/dist/guest/runtime/fs.js +6 -0
- package/dist/guest/runtime/log.d.ts +3 -0
- package/dist/guest/runtime/log.js +22 -0
- package/dist/guest/runtime/paths.d.ts +13 -0
- package/dist/guest/runtime/paths.js +14 -0
- package/dist/guest/{ports.js → runtime/ports.js} +8 -2
- package/dist/guest/runtime/process.d.ts +15 -0
- package/dist/guest/runtime/process.js +59 -0
- package/dist/guest/{project-context.js → runtime/project-context.js} +1 -1
- package/dist/guest/runtime/session.d.ts +5 -0
- package/dist/guest/runtime/session.js +10 -0
- package/dist/guest/runtime/status.d.ts +7 -0
- package/dist/guest/runtime/status.js +57 -0
- package/dist/guest/{cmdline.js → sessions/cmdline.js} +10 -4
- package/dist/guest/{ptyhost.js → sessions/pty-host.js} +12 -5
- package/dist/guest/{view.js → sessions/viewer.js} +8 -11
- package/dist/guest/setup/claude-mem.d.ts +10 -0
- package/dist/guest/setup/{claude.js → claude-mem.js} +18 -78
- package/dist/guest/setup/{claude.d.ts → claude-profile.d.ts} +0 -10
- package/dist/guest/setup/claude-profile.js +89 -0
- package/dist/guest/setup/desktop.d.ts +2 -0
- package/dist/guest/setup/desktop.js +32 -0
- package/dist/guest/setup/environment.js +28 -5
- package/dist/guest/setup/{user.d.ts → git-identity.d.ts} +0 -2
- package/dist/guest/setup/git-identity.js +34 -0
- package/dist/guest/{gitrules.d.ts → setup/git-rules.d.ts} +1 -1
- package/dist/guest/setup/git-rules.js +50 -0
- package/dist/guest/setup/hooks.js +22 -5
- package/dist/guest/setup/{policy.js → managed-policy.js} +2 -2
- package/dist/guest/toolchains/catalogue.d.ts +4 -4
- package/dist/guest/toolchains/catalogue.js +30 -7
- package/dist/guest/toolchains/detect.d.ts +12 -0
- package/dist/guest/toolchains/detect.js +54 -0
- package/dist/guest/toolchains/index.d.ts +3 -17
- package/dist/guest/toolchains/index.js +1 -106
- package/dist/guest/toolchains/install.d.ts +20 -0
- package/dist/guest/toolchains/install.js +29 -0
- package/dist/guest/toolchains/languages/go.d.ts +3 -0
- package/dist/guest/toolchains/{go.js → languages/go.js} +27 -9
- package/dist/guest/toolchains/languages/java.d.ts +8 -0
- package/dist/guest/toolchains/{java.js → languages/java.js} +57 -18
- package/dist/guest/toolchains/languages/node.d.ts +3 -0
- package/dist/guest/toolchains/{node.js → languages/node.js} +51 -18
- package/dist/guest/toolchains/languages/php.d.ts +3 -0
- package/dist/guest/toolchains/{scripting → languages}/php.js +36 -11
- package/dist/guest/toolchains/languages/python-tools.d.ts +3 -0
- package/dist/guest/toolchains/languages/python-tools.js +12 -0
- package/dist/guest/toolchains/languages/python.d.ts +3 -0
- package/dist/guest/toolchains/{python.js → languages/python.js} +29 -16
- package/dist/guest/toolchains/languages/ruby.d.ts +3 -0
- package/dist/guest/toolchains/{scripting → languages}/ruby.js +28 -10
- package/dist/guest/toolchains/leftovers.d.ts +1 -1
- package/dist/guest/toolchains/leftovers.js +13 -11
- package/dist/guest/toolchains/managers.d.ts +6 -6
- package/dist/guest/toolchains/managers.js +38 -17
- package/dist/guest/toolchains/native/binstall.d.ts +3 -2
- package/dist/guest/toolchains/native/binstall.js +20 -8
- package/dist/guest/toolchains/native/cpp.d.ts +2 -2
- package/dist/guest/toolchains/native/cpp.js +23 -8
- package/dist/guest/toolchains/native/dotnet.d.ts +5 -3
- package/dist/guest/toolchains/native/dotnet.js +72 -24
- package/dist/guest/toolchains/native/mesa.d.ts +2 -2
- package/dist/guest/toolchains/native/mesa.js +27 -10
- package/dist/guest/toolchains/native/msvc/environment.d.ts +4 -4
- package/dist/guest/toolchains/native/msvc/environment.js +30 -16
- package/dist/guest/toolchains/native/msvc/index.d.ts +3 -3
- package/dist/guest/toolchains/native/msvc/index.js +10 -8
- package/dist/guest/toolchains/native/msvc/packages.d.ts +1 -1
- package/dist/guest/toolchains/native/msvc/packages.js +69 -23
- package/dist/guest/toolchains/native/msvc/tree.d.ts +6 -6
- package/dist/guest/toolchains/native/msvc/tree.js +15 -9
- package/dist/guest/toolchains/native/rust-extras.d.ts +23 -0
- package/dist/guest/toolchains/native/rust-extras.js +100 -0
- package/dist/guest/toolchains/native/rust.d.ts +2 -2
- package/dist/guest/toolchains/native/rust.js +41 -10
- package/dist/guest/toolchains/{scripting → native}/vcruntime.d.ts +2 -2
- package/dist/guest/toolchains/{scripting → native}/vcruntime.js +17 -7
- package/dist/guest/toolchains/package-ledger.d.ts +17 -0
- package/dist/guest/toolchains/package-ledger.js +54 -0
- package/dist/guest/toolchains/plan.d.ts +3 -24
- package/dist/guest/toolchains/plan.js +99 -111
- package/dist/guest/toolchains/runtimes.d.ts +6 -6
- package/dist/guest/toolchains/runtimes.js +31 -13
- package/dist/guest/toolchains/scheduler.d.ts +22 -0
- package/dist/guest/toolchains/scheduler.js +123 -0
- package/dist/guest/toolchains/setup.d.ts +10 -0
- package/dist/guest/toolchains/setup.js +22 -0
- package/dist/guest/toolchains/state-file.d.ts +3 -0
- package/dist/guest/toolchains/state-file.js +10 -0
- package/dist/guest/toolchains/step.d.ts +24 -0
- package/dist/guest/toolchains/step.js +1 -0
- package/dist/guest/toolchains/tool-env.d.ts +12 -0
- package/dist/guest/toolchains/tool-env.js +16 -0
- package/dist/guest/toolchains/tools/cli.d.ts +10 -0
- package/dist/guest/toolchains/{cli.js → tools/cli.js} +35 -15
- package/dist/guest/toolchains/tools/git.d.ts +3 -0
- package/dist/guest/toolchains/{git.js → tools/git.js} +38 -15
- package/dist/guest/toolchains/tools/pwsh.d.ts +4 -0
- package/dist/guest/toolchains/{pwsh.js → tools/pwsh.js} +14 -7
- package/dist/guest/toolchains/{vscode-profile.d.ts → tools/vscode-profile.d.ts} +6 -6
- package/dist/guest/toolchains/{vscode-profile.js → tools/vscode-profile.js} +28 -12
- package/dist/guest/toolchains/{vscode.d.ts → tools/vscode.d.ts} +6 -6
- package/dist/guest/toolchains/{vscode.js → tools/vscode.js} +67 -21
- package/dist/guest/toolchains/version-cache.d.ts +16 -0
- package/dist/guest/toolchains/version-cache.js +67 -0
- package/dist/host/agent-commands/commands.d.ts +13 -0
- package/dist/host/agent-commands/commands.js +33 -0
- package/dist/host/agent-commands/forwarders.d.ts +7 -0
- package/dist/host/agent-commands/forwarders.js +31 -0
- package/dist/host/agent-commands/index.d.ts +4 -0
- package/dist/host/agent-commands/index.js +4 -0
- package/dist/host/agent-commands/reconcile.d.ts +12 -0
- package/dist/host/agent-commands/reconcile.js +69 -0
- package/dist/host/agent-commands/user-path.d.ts +2 -0
- package/dist/host/agent-commands/user-path.js +33 -0
- package/dist/host/audit/collect.d.ts +2 -2
- package/dist/host/audit/collect.js +59 -22
- package/dist/host/audit/log.d.ts +2 -2
- package/dist/host/audit/log.js +24 -8
- package/dist/host/{attach.d.ts → channel/attach.d.ts} +2 -2
- package/dist/host/{attach.js → channel/attach.js} +33 -15
- package/dist/host/channel/channel.d.ts +51 -0
- package/dist/host/channel/channel.js +196 -0
- package/dist/host/channel/index.d.ts +2 -0
- package/dist/host/channel/index.js +2 -0
- package/dist/host/guard/agent-files.d.ts +7 -0
- package/dist/host/guard/agent-files.js +103 -0
- package/dist/host/guard/commands.d.ts +10 -0
- package/dist/host/guard/commands.js +123 -0
- package/dist/host/guard/file-hash.d.ts +4 -0
- package/dist/host/guard/file-hash.js +37 -0
- package/dist/host/guard/git-config.d.ts +5 -0
- package/dist/host/guard/git-config.js +62 -0
- package/dist/host/guard/git-dirs.d.ts +12 -0
- package/dist/host/guard/git-dirs.js +53 -0
- package/dist/host/guard/index.d.ts +5 -0
- package/dist/host/guard/index.js +4 -0
- package/dist/host/guard/mark-of-the-web.d.ts +8 -0
- package/dist/host/guard/mark-of-the-web.js +74 -0
- package/dist/host/guard/nested-repos.d.ts +14 -0
- package/dist/host/guard/nested-repos.js +88 -0
- package/dist/host/guard/quarantine.d.ts +3 -0
- package/dist/host/guard/quarantine.js +24 -0
- package/dist/host/guard/repo-guard.d.ts +10 -0
- package/dist/host/guard/repo-guard.js +36 -0
- package/dist/host/guard/store.d.ts +40 -0
- package/dist/host/guard/store.js +145 -0
- package/dist/host/guard/types.d.ts +27 -0
- package/dist/host/guard/types.js +3 -0
- package/dist/host/guard/watch-state.d.ts +9 -0
- package/dist/host/guard/watch-state.js +26 -0
- package/dist/host/launch/boot-projects.d.ts +17 -0
- package/dist/host/launch/{projects.js → boot-projects.js} +22 -13
- package/dist/host/{database-plan.d.ts → launch/database-plan.d.ts} +5 -5
- package/dist/host/{database-plan.js → launch/database-plan.js} +24 -13
- package/dist/host/launch/generate.d.ts +4 -0
- package/dist/host/launch/generate.js +77 -0
- package/dist/host/launch/index.d.ts +10 -0
- package/dist/host/launch/index.js +10 -0
- package/dist/host/launch/mappings.d.ts +5 -5
- package/dist/host/launch/mappings.js +37 -24
- package/dist/host/launch/pc-scan.d.ts +5 -0
- package/dist/host/{pc-scan.js → launch/pc-scan.js} +20 -13
- package/dist/host/launch/project-scan.d.ts +7 -0
- package/dist/host/{project-scan.js → launch/project-scan.js} +29 -21
- package/dist/host/launch/session-file.d.ts +23 -0
- package/dist/host/launch/session-file.js +73 -0
- package/dist/host/launch/stage.d.ts +5 -5
- package/dist/host/launch/stage.js +14 -13
- package/dist/host/launch/toolchains.d.ts +4 -0
- package/dist/host/launch/toolchains.js +11 -0
- package/dist/host/launch/{wsb.d.ts → wsb-file.d.ts} +4 -2
- package/dist/host/launch/wsb-file.js +56 -0
- package/dist/host/life/crash-report.d.ts +8 -0
- package/dist/host/life/crash-report.js +87 -0
- package/dist/host/life/index.d.ts +6 -0
- package/dist/host/life/index.js +6 -0
- package/dist/host/life/keep-awake.d.ts +10 -0
- package/dist/host/life/keep-awake.js +29 -0
- package/dist/host/life/life-record.d.ts +48 -0
- package/dist/host/life/life-record.js +76 -0
- package/dist/host/life/stop-events.d.ts +27 -0
- package/dist/host/life/stop-events.js +96 -0
- package/dist/host/life/stop-warning.d.ts +4 -0
- package/dist/host/life/stop-warning.js +25 -0
- package/dist/host/life/windows-update.d.ts +3 -0
- package/dist/host/life/windows-update.js +11 -0
- package/dist/host/native.d.ts +4 -0
- package/dist/host/native.js +11 -0
- package/dist/host/network/index.d.ts +1 -0
- package/dist/host/network/index.js +1 -0
- package/dist/host/{port-forward.d.ts → network/port-forward.d.ts} +1 -1
- package/dist/host/{port-forward.js → network/port-forward.js} +16 -10
- package/dist/host/profile/accounts.d.ts +37 -0
- package/dist/host/profile/accounts.js +146 -0
- package/dist/host/profile/claude-login.d.ts +22 -0
- package/dist/host/profile/claude-login.js +57 -0
- package/dist/host/{claude-profile.d.ts → profile/claude-profile.d.ts} +9 -9
- package/dist/host/{claude-profile.js → profile/claude-profile.js} +32 -22
- package/dist/host/profile/index.d.ts +7 -0
- package/dist/host/profile/index.js +7 -0
- package/dist/host/profile/personalize.d.ts +2 -0
- package/dist/host/profile/personalize.js +127 -0
- package/dist/host/profile/reg-file.d.ts +8 -0
- package/dist/host/profile/reg-file.js +45 -0
- package/dist/host/profile/secret-files.d.ts +2 -0
- package/dist/host/profile/secret-files.js +25 -0
- package/dist/host/profile/secret-patterns.d.ts +6 -0
- package/dist/host/profile/secret-patterns.js +128 -0
- package/dist/host/profile/secrets.d.ts +12 -0
- package/dist/host/profile/secrets.js +100 -0
- package/dist/host/projects/index.d.ts +4 -0
- package/dist/host/projects/index.js +4 -0
- package/dist/host/{join.d.ts → projects/join.d.ts} +12 -9
- package/dist/host/{join.js → projects/join.js} +62 -33
- package/dist/host/projects/known.d.ts +28 -0
- package/dist/host/projects/known.js +55 -0
- package/dist/host/projects/mapper.d.ts +29 -0
- package/dist/host/projects/mapper.js +88 -0
- package/dist/host/projects/registry.d.ts +83 -0
- package/dist/host/projects/registry.js +136 -0
- package/dist/host/sandbox/doctor.d.ts +2 -0
- package/dist/host/sandbox/doctor.js +42 -0
- package/dist/host/sandbox/host-claude.d.ts +1 -0
- package/dist/host/sandbox/host-claude.js +26 -0
- package/dist/host/sandbox/index.d.ts +6 -0
- package/dist/host/sandbox/index.js +6 -0
- package/dist/host/{platform.d.ts → sandbox/platform.d.ts} +0 -5
- package/dist/host/sandbox/platform.js +60 -0
- package/dist/host/sandbox/probe.d.ts +3 -0
- package/dist/host/sandbox/probe.js +47 -0
- package/dist/host/{window.js → sandbox/window.js} +7 -5
- package/dist/host/{wsb.js → sandbox/wsb-cli.js} +31 -8
- package/dist/host/{cleanup.js → storage/cleanup.js} +27 -12
- package/dist/host/storage/index.d.ts +2 -0
- package/dist/host/storage/index.js +2 -0
- package/dist/host/storage/state-files.d.ts +4 -0
- package/dist/host/storage/state-files.js +10 -0
- package/dist/host/test-guard.js +1 -1
- package/dist/host/tools/conpty.d.ts +8 -0
- package/dist/host/tools/conpty.js +58 -0
- package/dist/host/tools/index.d.ts +2 -0
- package/dist/host/tools/index.js +2 -0
- package/dist/host/{terminal.d.ts → tools/windows-terminal.d.ts} +2 -10
- package/dist/host/{terminal.js → tools/windows-terminal.js} +33 -57
- package/dist/host/workspace-view/active-views.d.ts +3 -0
- package/dist/host/workspace-view/active-views.js +22 -0
- package/dist/host/workspace-view/index.d.ts +2 -18
- package/dist/host/workspace-view/index.js +2 -49
- package/dist/host/workspace-view/plan.d.ts +16 -0
- package/dist/host/workspace-view/plan.js +50 -0
- package/dist/host/workspace-view/rules.js +10 -3
- package/dist/host/workspace-view/view-state.d.ts +10 -0
- package/dist/host/workspace-view/view-state.js +31 -0
- package/dist/host/workspace-view/view.d.ts +1 -0
- package/dist/host/workspace-view/view.js +51 -55
- package/dist/runtime/daemon.js +4220 -1968
- package/dist/runtime/db.js +2134 -849
- package/dist/runtime/gitguard.js +29 -11
- package/dist/runtime/main.js +4687 -2243
- package/dist/runtime/netproxy.js +1644 -420
- package/dist/runtime/view.js +1356 -428
- package/dist/selftest/accounts.test.d.ts +1 -1
- package/dist/selftest/accounts.test.js +20 -17
- package/dist/selftest/agent-commands.test.d.ts +1 -1
- package/dist/selftest/agent-commands.test.js +9 -5
- package/dist/selftest/audit.test.d.ts +1 -1
- package/dist/selftest/audit.test.js +46 -13
- package/dist/selftest/channel.test.d.ts +1 -1
- package/dist/selftest/channel.test.js +63 -16
- package/dist/selftest/cli.test.d.ts +1 -1
- package/dist/selftest/cli.test.js +68 -16
- package/dist/selftest/cmdline.test.d.ts +1 -1
- package/dist/selftest/cmdline.test.js +36 -7
- package/dist/selftest/config.test.d.ts +1 -1
- package/dist/selftest/config.test.js +12 -5
- package/dist/selftest/data.test.d.ts +1 -1
- package/dist/selftest/data.test.js +35 -6
- package/dist/selftest/detect.test.d.ts +1 -1
- package/dist/selftest/detect.test.js +22 -9
- package/dist/selftest/generate.test.d.ts +1 -1
- package/dist/selftest/generate.test.js +33 -9
- package/dist/selftest/git-access.test.d.ts +1 -1
- package/dist/selftest/git-access.test.js +42 -4
- package/dist/selftest/guest-boot.test.d.ts +1 -1
- package/dist/selftest/guest-boot.test.js +25 -7
- package/dist/selftest/host-sim.test.d.ts +1 -1
- package/dist/selftest/host-sim.test.js +27 -3
- package/dist/selftest/hostile-input.test.d.ts +1 -1
- package/dist/selftest/hostile-input.test.js +5 -5
- package/dist/selftest/index.d.ts +1 -1
- package/dist/selftest/index.js +72 -16
- package/dist/selftest/layout.test.d.ts +2 -0
- package/dist/selftest/layout.test.js +131 -0
- package/dist/selftest/links.test.d.ts +1 -1
- package/dist/selftest/links.test.js +16 -11
- package/dist/selftest/live-daemon.test.d.ts +1 -1
- package/dist/selftest/live-daemon.test.js +20 -8
- package/dist/selftest/live-git.test.d.ts +1 -1
- package/dist/selftest/live-git.test.js +13 -4
- package/dist/selftest/live-network.test.d.ts +1 -1
- package/dist/selftest/live-network.test.js +24 -9
- package/dist/selftest/live-projects.test.d.ts +1 -1
- package/dist/selftest/live-projects.test.js +47 -20
- package/dist/selftest/live-terminal.test.d.ts +1 -1
- package/dist/selftest/live-terminal.test.js +41 -15
- package/dist/selftest/local-config.test.d.ts +1 -1
- package/dist/selftest/local-config.test.js +64 -16
- package/dist/selftest/mirror.test.d.ts +1 -1
- package/dist/selftest/mirror.test.js +102 -32
- package/dist/selftest/network.test.d.ts +1 -1
- package/dist/selftest/network.test.js +17 -8
- package/dist/selftest/personalization.test.d.ts +1 -1
- package/dist/selftest/personalization.test.js +12 -5
- package/dist/selftest/projects.test.d.ts +1 -1
- package/dist/selftest/projects.test.js +280 -85
- package/dist/selftest/repair.test.d.ts +1 -1
- package/dist/selftest/repair.test.js +17 -5
- package/dist/selftest/repo-guard.test.d.ts +1 -1
- package/dist/selftest/repo-guard.test.js +21 -20
- package/dist/selftest/secrets.test.d.ts +1 -1
- package/dist/selftest/secrets.test.js +57 -13
- package/dist/selftest/setup.test.d.ts +1 -1
- package/dist/selftest/setup.test.js +25 -5
- package/dist/selftest/{fixtures.d.ts → support/fixtures.d.ts} +5 -3
- package/dist/selftest/{fixtures.js → support/fixtures.js} +95 -17
- package/dist/selftest/{harness.js → support/harness.js} +24 -7
- package/dist/selftest/{live.d.ts → support/live.d.ts} +2 -2
- package/dist/selftest/{live.js → support/live.js} +34 -10
- package/dist/selftest/support/suite.js +1 -0
- package/dist/selftest/sync.test.d.ts +1 -1
- package/dist/selftest/sync.test.js +64 -26
- package/dist/selftest/test-guard.test.d.ts +1 -1
- package/dist/selftest/test-guard.test.js +43 -15
- package/dist/selftest/toolchains.test.d.ts +1 -1
- package/dist/selftest/toolchains.test.js +135 -36
- package/dist/selftest/workspace-view.test.d.ts +1 -1
- package/dist/selftest/workspace-view.test.js +48 -11
- package/dist/selftest/workspace.test.d.ts +1 -1
- package/dist/selftest/workspace.test.js +13 -4
- package/dist/shared/{apps.d.ts → apps/catalogue.d.ts} +1 -11
- package/dist/shared/apps/catalogue.js +768 -0
- package/dist/shared/apps/index.d.ts +2 -0
- package/dist/shared/apps/index.js +2 -0
- package/dist/shared/apps/selection.d.ts +11 -0
- package/dist/shared/apps/selection.js +40 -0
- package/dist/shared/channel/index.d.ts +2 -0
- package/dist/shared/channel/index.js +2 -0
- package/dist/shared/channel/run-dir.d.ts +30 -0
- package/dist/shared/channel/run-dir.js +84 -0
- package/dist/shared/{schema.d.ts → channel/schema.d.ts} +38 -21
- package/dist/shared/{schema.js → channel/schema.js} +62 -35
- package/dist/shared/download/archive.d.ts +13 -0
- package/dist/shared/download/archive.js +57 -0
- package/dist/shared/download/downloader.d.ts +35 -0
- package/dist/shared/download/downloader.js +110 -0
- package/dist/shared/download/github.d.ts +16 -0
- package/dist/shared/download/github.js +74 -0
- package/dist/shared/download/http.d.ts +5 -0
- package/dist/shared/download/http.js +30 -0
- package/dist/shared/download/index.d.ts +5 -0
- package/dist/shared/download/index.js +5 -0
- package/dist/shared/download/spawn.d.ts +2 -0
- package/dist/shared/download/spawn.js +7 -0
- package/dist/shared/io/index.d.ts +3 -0
- package/dist/shared/io/index.js +3 -0
- package/dist/shared/io/json-file.d.ts +10 -0
- package/dist/shared/io/json-file.js +21 -0
- package/dist/shared/io/json.d.ts +13 -0
- package/dist/shared/io/json.js +49 -0
- package/dist/shared/{safe-remove.js → io/safe-remove.js} +32 -7
- package/dist/shared/{netrules.js → network/firewall-rules.js} +36 -5
- package/dist/shared/network/index.d.ts +2 -0
- package/dist/shared/network/index.js +2 -0
- package/dist/shared/{netpolicy.js → network/policy.js} +66 -11
- package/dist/shared/{paths.js → paths/claude-paths.js} +12 -2
- package/dist/shared/{guest-paths.d.ts → paths/guest-paths.d.ts} +6 -12
- package/dist/shared/{guest-paths.js → paths/guest-paths.js} +53 -36
- package/dist/shared/paths/index.d.ts +3 -0
- package/dist/shared/paths/index.js +3 -0
- package/dist/shared/{projects.js → paths/projects.js} +13 -3
- package/dist/shared/pty/client.d.ts +21 -0
- package/dist/shared/pty/client.js +79 -0
- package/dist/shared/{console-input.js → pty/console-input.js} +26 -6
- package/dist/shared/pty/index.d.ts +6 -0
- package/dist/shared/pty/index.js +6 -0
- package/dist/shared/pty/input-joiner.d.ts +15 -0
- package/dist/shared/pty/input-joiner.js +44 -0
- package/dist/shared/pty/output-filter.d.ts +13 -0
- package/dist/shared/pty/output-filter.js +140 -0
- package/dist/shared/pty/protocol.d.ts +36 -0
- package/dist/shared/pty/protocol.js +60 -0
- package/dist/shared/pty/terminal.d.ts +24 -0
- package/dist/shared/pty/terminal.js +147 -0
- package/dist/shared/test-guard.js +3 -1
- package/dist/sync/claude-mem.d.ts +1 -1
- package/dist/sync/claude-mem.js +9 -4
- package/dist/sync/history.d.ts +1 -29
- package/dist/sync/history.js +57 -45
- package/dist/sync/index.d.ts +5 -0
- package/dist/sync/index.js +5 -0
- package/dist/sync/sync-cycle.d.ts +18 -0
- package/dist/sync/sync-cycle.js +85 -0
- package/dist/sync/sync-state.d.ts +32 -0
- package/dist/sync/sync-state.js +37 -0
- package/dist/sync/watcher.d.ts +0 -18
- package/dist/sync/watcher.js +66 -100
- package/native/keep-awake.ps1 +8 -0
- package/native/power.cs +23 -0
- package/native/stop-events.ps1 +38 -0
- package/package.json +11 -3
- package/sandbox/linkgate.cs +98 -0
- package/sandbox/memlog.ps1 +15 -6
- package/schemas/config.schema.json +34 -1
- package/schemas/sandbox-config.schema.json +34 -1
- package/dist/cli/boot-progress.d.ts +0 -22
- package/dist/cli/boot-progress.js +0 -59
- package/dist/cli/commands/launch.d.ts +0 -32
- package/dist/cli/commands/launch.js +0 -421
- package/dist/cli/commands/maintenance.d.ts +0 -10
- package/dist/cli/commands/maintenance.js +0 -220
- package/dist/cli/commands/project.d.ts +0 -33
- package/dist/cli/commands/project.js +0 -102
- package/dist/cli/commands/projects.d.ts +0 -14
- package/dist/cli/commands/projects.js +0 -146
- package/dist/cli/commands/restart.d.ts +0 -6
- package/dist/cli/commands/restart.js +0 -95
- package/dist/cli/commands/sessions.d.ts +0 -12
- package/dist/cli/commands/sessions.js +0 -258
- package/dist/cli/menu/settings/editors.js +0 -305
- package/dist/cli/tui/dialogs.d.ts +0 -57
- package/dist/cli/tui/dialogs.js +0 -162
- package/dist/core/config.js +0 -109
- package/dist/core/project-policy.d.ts +0 -62
- package/dist/core/project-policy.js +0 -121
- package/dist/core/schema.d.ts +0 -6
- package/dist/core/schema.js +0 -8
- package/dist/core/util.d.ts +0 -62
- package/dist/core/util.js +0 -156
- package/dist/core/workspace.d.ts +0 -35
- package/dist/core/workspace.js +0 -206
- package/dist/guest/boot-env.d.ts +0 -4
- package/dist/guest/daemon.js +0 -57
- package/dist/guest/env.d.ts +0 -56
- package/dist/guest/env.js +0 -115
- package/dist/guest/gitrules.js +0 -11
- package/dist/guest/project-status.d.ts +0 -5
- package/dist/guest/project-status.js +0 -17
- package/dist/guest/setup/user.js +0 -51
- package/dist/guest/toolchains/cli.d.ts +0 -10
- package/dist/guest/toolchains/common.d.ts +0 -54
- package/dist/guest/toolchains/common.js +0 -147
- package/dist/guest/toolchains/databases/dynamodb.d.ts +0 -8
- package/dist/guest/toolchains/databases/dynamodb.js +0 -52
- package/dist/guest/toolchains/databases/index.d.ts +0 -6
- package/dist/guest/toolchains/databases/index.js +0 -62
- package/dist/guest/toolchains/databases/mongodb.d.ts +0 -3
- package/dist/guest/toolchains/databases/mongodb.js +0 -31
- package/dist/guest/toolchains/databases/mysql.d.ts +0 -3
- package/dist/guest/toolchains/databases/mysql.js +0 -38
- package/dist/guest/toolchains/databases/postgres.d.ts +0 -5
- package/dist/guest/toolchains/databases/postgres.js +0 -38
- package/dist/guest/toolchains/databases/redis.d.ts +0 -3
- package/dist/guest/toolchains/databases/redis.js +0 -16
- package/dist/guest/toolchains/git.d.ts +0 -3
- package/dist/guest/toolchains/go.d.ts +0 -3
- package/dist/guest/toolchains/java.d.ts +0 -8
- package/dist/guest/toolchains/node.d.ts +0 -3
- package/dist/guest/toolchains/pwsh.d.ts +0 -4
- package/dist/guest/toolchains/python.d.ts +0 -3
- package/dist/guest/toolchains/scripting/php.d.ts +0 -3
- package/dist/guest/toolchains/scripting/ruby.d.ts +0 -3
- package/dist/host/accounts.d.ts +0 -32
- package/dist/host/accounts.js +0 -128
- package/dist/host/agent-commands.d.ts +0 -25
- package/dist/host/agent-commands.js +0 -145
- package/dist/host/channel.d.ts +0 -38
- package/dist/host/channel.js +0 -163
- package/dist/host/generate.d.ts +0 -13
- package/dist/host/generate.js +0 -115
- package/dist/host/launch/projects.d.ts +0 -17
- package/dist/host/launch/wsb.js +0 -34
- package/dist/host/motw.d.ts +0 -17
- package/dist/host/motw.js +0 -74
- package/dist/host/pc-scan.d.ts +0 -6
- package/dist/host/personalize.d.ts +0 -10
- package/dist/host/personalize.js +0 -97
- package/dist/host/platform.js +0 -129
- package/dist/host/project-scan.d.ts +0 -7
- package/dist/host/projects.d.ts +0 -123
- package/dist/host/projects.js +0 -196
- package/dist/host/repo-guard.d.ts +0 -43
- package/dist/host/repo-guard.js +0 -347
- package/dist/host/secrets.d.ts +0 -14
- package/dist/host/secrets.js +0 -133
- package/dist/host/stops.d.ts +0 -67
- package/dist/host/stops.js +0 -126
- package/dist/shared/apps.js +0 -114
- package/dist/shared/download.d.ts +0 -63
- package/dist/shared/download.js +0 -238
- package/dist/shared/pty-client.d.ts +0 -108
- package/dist/shared/pty-client.js +0 -406
- package/dist/shared/rundir.d.ts +0 -41
- package/dist/shared/rundir.js +0 -96
- /package/dist/{guest/daemon.d.ts → cli/tui/list/list-types.js} +0 -0
- /package/dist/{guest/db.d.ts → cli/tui/screen.js} +0 -0
- /package/dist/core/{detect-databases.d.ts → detect/databases.d.ts} +0 -0
- /package/dist/{guest/toolchains → core/detect}/versions.d.ts +0 -0
- /package/dist/guest/{setup/agents.d.ts → agents/agent-installer.d.ts} +0 -0
- /package/dist/guest/{audit-parse.d.ts → audit/parse.d.ts} +0 -0
- /package/dist/guest/{guide.d.ts → boot/guide.d.ts} +0 -0
- /package/dist/guest/daemon/{shutdown.d.ts → idle-shutdown.d.ts} +0 -0
- /package/dist/guest/daemon/{session.d.ts → sessions.d.ts} +0 -0
- /package/dist/guest/{main.d.ts → entries/daemon.d.ts} +0 -0
- /package/dist/guest/{netproxy.d.ts → entries/db.d.ts} +0 -0
- /package/dist/{selftest/suite.js → guest/entries/gitguard.d.ts} +0 -0
- /package/dist/guest/{gitguard.d.ts → git/decision.d.ts} +0 -0
- /package/dist/guest/{ports.d.ts → runtime/ports.d.ts} +0 -0
- /package/dist/guest/{project-context.d.ts → runtime/project-context.d.ts} +0 -0
- /package/dist/guest/{cmdline.d.ts → sessions/cmdline.d.ts} +0 -0
- /package/dist/guest/{ptyhost.d.ts → sessions/pty-host.d.ts} +0 -0
- /package/dist/guest/{view.d.ts → sessions/viewer.d.ts} +0 -0
- /package/dist/guest/setup/{policy.d.ts → managed-policy.d.ts} +0 -0
- /package/dist/host/{window.d.ts → sandbox/window.d.ts} +0 -0
- /package/dist/host/{wsb.d.ts → sandbox/wsb-cli.d.ts} +0 -0
- /package/dist/host/{cleanup.d.ts → storage/cleanup.d.ts} +0 -0
- /package/dist/selftest/{harness.d.ts → support/harness.d.ts} +0 -0
- /package/dist/selftest/{suite.d.ts → support/suite.d.ts} +0 -0
- /package/dist/shared/{safe-remove.d.ts → io/safe-remove.d.ts} +0 -0
- /package/dist/shared/{netrules.d.ts → network/firewall-rules.d.ts} +0 -0
- /package/dist/shared/{netpolicy.d.ts → network/policy.d.ts} +0 -0
- /package/dist/shared/{paths.d.ts → paths/claude-paths.d.ts} +0 -0
- /package/dist/shared/{projects.d.ts → paths/projects.d.ts} +0 -0
- /package/dist/shared/{console-input.d.ts → pty/console-input.d.ts} +0 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
// storage.markSandboxFiles: programs and scripts that appear or change in a project while a sandbox runs get Windows'
|
|
2
|
+
// "downloaded from the internet" mark (Zone.Identifier, zone 3), so SmartScreen and PowerShell's RemoteSigned policy
|
|
3
|
+
// stop a planted file from running on a double-click or a habit. Runs in the watcher; only the mark is written.
|
|
4
|
+
import fs from 'node:fs';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
/** What Windows runs when you open it (not source files such as .js or .py: those need a program you choose). */
|
|
7
|
+
export const RISKY = /\.(exe|dll|com|scr|pif|msi|msix|msp|appx|appxbundle|bat|cmd|ps1|psm1|psd1|vbs|vbe|wsf|wsh|hta|lnk|url|jar|reg|cpl|application|gadget|chm)$/i;
|
|
8
|
+
const MARK = '[ZoneTransfer]\r\nZoneId=3\r\nHostUrl=about:windows-development-sandbox\r\n';
|
|
9
|
+
/** Folders not worth watching closely (git's own files; dependency and build folders are still marked). */
|
|
10
|
+
const SKIP = /(^|[\\/])\.git([\\/]|$)/i;
|
|
11
|
+
const MAX_NAMED = 10;
|
|
12
|
+
/** Marks one file if it is a program or script (and a plain file, not a link). Returns true when it marked it. */
|
|
13
|
+
export function markFromSandbox(file) {
|
|
14
|
+
if (!RISKY.test(file) || SKIP.test(file))
|
|
15
|
+
return false;
|
|
16
|
+
try {
|
|
17
|
+
const stat = fs.lstatSync(file);
|
|
18
|
+
if (!stat.isFile())
|
|
19
|
+
return false;
|
|
20
|
+
fs.writeFileSync(file + ':Zone.Identifier', MARK);
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/** Has this file the mark? */
|
|
28
|
+
export function isMarked(file) {
|
|
29
|
+
try {
|
|
30
|
+
return fs.readFileSync(file + ':Zone.Identifier', 'utf8').includes('ZoneId=3');
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/** Watches the projects while the sandbox runs and marks what appears or changes; returns a function that stops it. */
|
|
37
|
+
export function watchAndMark(projects, note = () => undefined) {
|
|
38
|
+
const pending = new Set();
|
|
39
|
+
let timer;
|
|
40
|
+
const flush = () => {
|
|
41
|
+
timer = undefined;
|
|
42
|
+
const marked = [...pending].filter(markFromSandbox);
|
|
43
|
+
pending.clear();
|
|
44
|
+
if (marked.length)
|
|
45
|
+
note('marked as from the sandbox (SmartScreen asks before they run here): ' +
|
|
46
|
+
marked
|
|
47
|
+
.slice(0, MAX_NAMED)
|
|
48
|
+
.map((f) => path.basename(f))
|
|
49
|
+
.join(', ') +
|
|
50
|
+
(marked.length > MAX_NAMED ? ' and ' + (marked.length - MAX_NAMED) + ' more' : ''));
|
|
51
|
+
};
|
|
52
|
+
const watchers = projects.flatMap((project) => {
|
|
53
|
+
try {
|
|
54
|
+
return [
|
|
55
|
+
fs.watch(project, { recursive: true }, (_event, file) => {
|
|
56
|
+
const rel = file ? String(file) : '';
|
|
57
|
+
if (!rel || !RISKY.test(rel) || SKIP.test(rel))
|
|
58
|
+
return;
|
|
59
|
+
pending.add(path.join(project, rel));
|
|
60
|
+
timer ??= setTimeout(flush, 1000);
|
|
61
|
+
}),
|
|
62
|
+
];
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return [];
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
return () => {
|
|
69
|
+
watchers.forEach((w) => w.close());
|
|
70
|
+
clearTimeout(timer);
|
|
71
|
+
if (pending.size)
|
|
72
|
+
flush();
|
|
73
|
+
};
|
|
74
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { GitState, GuardRule, RepoFinding, RepoSnapshot } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Git folders other than the project's own: submodules (.git/modules/**) and repositories nested up to two levels deep.
|
|
4
|
+
* git runs their hooks and config too (git status in a subfolder, VS Code's repository scan). Bounded: links are never
|
|
5
|
+
* followed and at most MAX_OTHER_REPOS are looked at.
|
|
6
|
+
*/
|
|
7
|
+
export declare function otherGitDirs(workspace: string): string[];
|
|
8
|
+
/** The state of every other git folder, for the snapshot. */
|
|
9
|
+
export declare function nestedRepoStates(workspace: string): Record<string, GitState>;
|
|
10
|
+
/** Submodules and nested repositories get the same git checks; a new one is compared with an empty baseline. */
|
|
11
|
+
export declare class NestedReposRule implements GuardRule {
|
|
12
|
+
readonly kind = "nested-repos";
|
|
13
|
+
check(workspace: string, before: RepoSnapshot): RepoFinding[];
|
|
14
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
// Git folders other than the project's own: submodules and nested repositories, which git also runs hooks from.
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { fileExists } from '../../core/util/index.js';
|
|
5
|
+
import { EMPTY_GIT, gitState, guardGitDir, plainGitDir } from './git-dirs.js';
|
|
6
|
+
const MAX_OTHER_REPOS = 64;
|
|
7
|
+
const SKIP_DIRS = new Set([
|
|
8
|
+
'node_modules',
|
|
9
|
+
'.git',
|
|
10
|
+
'agent-sandbox-quarantine',
|
|
11
|
+
'target',
|
|
12
|
+
'dist',
|
|
13
|
+
'build',
|
|
14
|
+
'bin',
|
|
15
|
+
'obj',
|
|
16
|
+
'.venv',
|
|
17
|
+
'venv',
|
|
18
|
+
]);
|
|
19
|
+
const notSkipped = (d) => !SKIP_DIRS.has(path.basename(d).toLowerCase());
|
|
20
|
+
function plainDirs(dir, limit) {
|
|
21
|
+
try {
|
|
22
|
+
return fs
|
|
23
|
+
.readdirSync(dir, { withFileTypes: true })
|
|
24
|
+
.filter((e) => e.isDirectory() && !e.isSymbolicLink())
|
|
25
|
+
.slice(0, limit)
|
|
26
|
+
.map((e) => path.join(dir, e.name));
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return [];
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/** The key of a git folder in RepoSnapshot.repos: its path relative to the workspace, with forward slashes. */
|
|
33
|
+
function repoKey(workspace, dir) {
|
|
34
|
+
return path.relative(workspace, dir).split(path.sep).join('/');
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Git folders other than the project's own: submodules (.git/modules/**) and repositories nested up to two levels deep.
|
|
38
|
+
* git runs their hooks and config too (git status in a subfolder, VS Code's repository scan). Bounded: links are never
|
|
39
|
+
* followed and at most MAX_OTHER_REPOS are looked at.
|
|
40
|
+
*/
|
|
41
|
+
export function otherGitDirs(workspace) {
|
|
42
|
+
const found = [];
|
|
43
|
+
const main = plainGitDir(workspace);
|
|
44
|
+
// Submodules: a folder with a config and a HEAD is a git folder, and may have modules of its own.
|
|
45
|
+
const walk = (dir, depth) => {
|
|
46
|
+
for (const d of plainDirs(dir, 200)) {
|
|
47
|
+
if (found.length >= MAX_OTHER_REPOS)
|
|
48
|
+
return;
|
|
49
|
+
if (fileExists(path.join(d, 'config')) && fileExists(path.join(d, 'HEAD'))) {
|
|
50
|
+
found.push(d);
|
|
51
|
+
if (depth < 3)
|
|
52
|
+
walk(path.join(d, 'modules'), depth + 1);
|
|
53
|
+
}
|
|
54
|
+
else if (depth < 3)
|
|
55
|
+
walk(d, depth + 1);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
if (main)
|
|
59
|
+
walk(path.join(main, 'modules'), 0);
|
|
60
|
+
for (const sub of plainDirs(workspace, 500).filter(notSkipped)) {
|
|
61
|
+
for (const candidate of [sub, ...plainDirs(sub, 200).filter(notSkipped)]) {
|
|
62
|
+
if (found.length >= MAX_OTHER_REPOS)
|
|
63
|
+
return found;
|
|
64
|
+
const git = plainGitDir(candidate);
|
|
65
|
+
if (git)
|
|
66
|
+
found.push(git);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return found;
|
|
70
|
+
}
|
|
71
|
+
/** The state of every other git folder, for the snapshot. */
|
|
72
|
+
export function nestedRepoStates(workspace) {
|
|
73
|
+
return Object.fromEntries(otherGitDirs(workspace).map((d) => [repoKey(workspace, d), gitState(d)]));
|
|
74
|
+
}
|
|
75
|
+
/** Submodules and nested repositories get the same git checks; a new one is compared with an empty baseline. */
|
|
76
|
+
export class NestedReposRule {
|
|
77
|
+
kind = 'nested-repos';
|
|
78
|
+
check(workspace, before) {
|
|
79
|
+
// Snapshots from before this check existed have no baseline: checking against nothing would move your own files.
|
|
80
|
+
const repos = before.repos;
|
|
81
|
+
if (!repos)
|
|
82
|
+
return [];
|
|
83
|
+
return otherGitDirs(workspace).flatMap((other) => {
|
|
84
|
+
const rel = repoKey(workspace, other);
|
|
85
|
+
return guardGitDir(other, repos[rel] ?? EMPTY_GIT).map((f) => ({ ...f, detail: rel + ': ' + f.detail }));
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
/** Moves files into <dir>\agent-sandbox-quarantine\<time>\ and reports them. */
|
|
4
|
+
export function quarantine(from, names, into, kind) {
|
|
5
|
+
if (names.length === 0)
|
|
6
|
+
return [];
|
|
7
|
+
const target = path.join(into, 'agent-sandbox-quarantine', String(Date.now()));
|
|
8
|
+
fs.mkdirSync(target, { recursive: true });
|
|
9
|
+
return names.map((name) => {
|
|
10
|
+
try {
|
|
11
|
+
fs.renameSync(path.join(from, name), path.join(target, name));
|
|
12
|
+
}
|
|
13
|
+
catch (e) {
|
|
14
|
+
return {
|
|
15
|
+
kind,
|
|
16
|
+
detail: name +
|
|
17
|
+
' (could not be moved: ' +
|
|
18
|
+
e.code +
|
|
19
|
+
'; delete it yourself before running anything here)',
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
return { kind, detail: name + ' (moved to ' + target + ')' };
|
|
23
|
+
});
|
|
24
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { RepoFinding, RepoSnapshot } from './types.js';
|
|
2
|
+
/** Snapshots a project before the sandbox can write it, and later neutralises what it added. */
|
|
3
|
+
export declare class RepoGuard {
|
|
4
|
+
snapshot(workspace: string): RepoSnapshot;
|
|
5
|
+
/**
|
|
6
|
+
* Compares the workspace with its pre-launch snapshot and neutralises anything new that would execute on this PC.
|
|
7
|
+
* Returns what was found (and fixed). Never touches what was already there before the sandbox ran.
|
|
8
|
+
*/
|
|
9
|
+
guard(workspace: string, before: RepoSnapshot): RepoFinding[];
|
|
10
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// Zero-click protection for the folder the sandbox shares with this PC. What the agent writes there could run code on
|
|
2
|
+
// THIS PC without you doing anything unusual (git hooks and config, commands planted in the project root, agent and
|
|
3
|
+
// editor files), so it is snapshotted before launch, re-checked every minute and at close, and neutralised (RULES).
|
|
4
|
+
import { assertTestWritable } from '../test-guard.js';
|
|
5
|
+
import { AgentFilesRule, agentSnapshot } from './agent-files.js';
|
|
6
|
+
import { PlantedCommandsRule, plantedCommands } from './commands.js';
|
|
7
|
+
import { GitDirRule, gitState, plainGitDir } from './git-dirs.js';
|
|
8
|
+
import { NestedReposRule, nestedRepoStates } from './nested-repos.js';
|
|
9
|
+
/** The checks in the order their findings are reported. */
|
|
10
|
+
const RULES = [
|
|
11
|
+
new PlantedCommandsRule(),
|
|
12
|
+
new AgentFilesRule(),
|
|
13
|
+
new NestedReposRule(),
|
|
14
|
+
new GitDirRule(),
|
|
15
|
+
];
|
|
16
|
+
/** Snapshots a project before the sandbox can write it, and later neutralises what it added. */
|
|
17
|
+
export class RepoGuard {
|
|
18
|
+
snapshot(workspace) {
|
|
19
|
+
const dir = plainGitDir(workspace);
|
|
20
|
+
return {
|
|
21
|
+
gitDir: dir !== null,
|
|
22
|
+
...gitState(dir),
|
|
23
|
+
commands: plantedCommands(workspace),
|
|
24
|
+
agent: agentSnapshot(workspace),
|
|
25
|
+
repos: nestedRepoStates(workspace),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Compares the workspace with its pre-launch snapshot and neutralises anything new that would execute on this PC.
|
|
30
|
+
* Returns what was found (and fixed). Never touches what was already there before the sandbox ran.
|
|
31
|
+
*/
|
|
32
|
+
guard(workspace, before) {
|
|
33
|
+
assertTestWritable(workspace);
|
|
34
|
+
return RULES.flatMap((rule) => rule.check(workspace, before));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { RepoGuard } from './repo-guard.js';
|
|
2
|
+
import { type RepoFinding } from './types.js';
|
|
3
|
+
/** A recorded finding (`at`: when it was found). */
|
|
4
|
+
export type RecordedFinding = RepoFinding & {
|
|
5
|
+
at?: string;
|
|
6
|
+
};
|
|
7
|
+
/** The guarded projects of one data folder and what the guard found (host-only files next to the sync state). */
|
|
8
|
+
export declare class RepoGuardStore {
|
|
9
|
+
private readonly guard;
|
|
10
|
+
private readonly snapshots;
|
|
11
|
+
private readonly found;
|
|
12
|
+
constructor(dataPath: string, guard?: RepoGuard);
|
|
13
|
+
private read;
|
|
14
|
+
/**
|
|
15
|
+
* At launch: every folder the sandbox will be able to write. The launch folder, projects mapped with it and every
|
|
16
|
+
* project already inside a project root are snapshotted as they are now, before the sandbox can touch them.
|
|
17
|
+
*/
|
|
18
|
+
save(workspace: string, more?: readonly string[], roots?: readonly string[]): void;
|
|
19
|
+
/**
|
|
20
|
+
* A project that joins the running sandbox: snapshotted before its first session, then guarded like the launch
|
|
21
|
+
* folder. A project already guarded keeps its first snapshot (what was there before the sandbox could touch it).
|
|
22
|
+
*/
|
|
23
|
+
add(workspace: string, o?: {
|
|
24
|
+
empty?: boolean;
|
|
25
|
+
}): void;
|
|
26
|
+
/**
|
|
27
|
+
* Folders that appeared inside a project root after the launch: the sandbox could have written them from the start,
|
|
28
|
+
* so they get an EMPTY baseline: any git hook, git config that runs programs (core.hooksPath, core.fsmonitor, ...)
|
|
29
|
+
* or planted command in them counts as added inside the sandbox and is neutralised.
|
|
30
|
+
*/
|
|
31
|
+
private discoverRootProjects;
|
|
32
|
+
/** The folders being guarded (for status). */
|
|
33
|
+
guarded(): string[];
|
|
34
|
+
/**
|
|
35
|
+
* Re-checks every project of the current/last launch; findings are kept in a host-only file for `status`. Returns the
|
|
36
|
+
* new ones.
|
|
37
|
+
*/
|
|
38
|
+
check(): RepoFinding[];
|
|
39
|
+
findings(): RecordedFinding[];
|
|
40
|
+
}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
// Where the repo guard keeps its snapshots and findings: host-only files next to the sync state, never in the data
|
|
2
|
+
// folder the sandbox can write.
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import _ from 'lodash';
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { JsonFile } from '../../shared/io/index.js';
|
|
8
|
+
import { hostStateFile, storageOf } from '../storage/index.js';
|
|
9
|
+
import { dirExists, isLink } from '../../core/util/index.js';
|
|
10
|
+
import { RepoGuard } from './repo-guard.js';
|
|
11
|
+
import { FINDING_KINDS } from './types.js';
|
|
12
|
+
const FindingSchema = z.object({
|
|
13
|
+
kind: z.enum(FINDING_KINDS),
|
|
14
|
+
detail: z.string().max(4096),
|
|
15
|
+
at: z.string().max(64).optional(),
|
|
16
|
+
});
|
|
17
|
+
const GitStateSchema = z.object({
|
|
18
|
+
config: z.array(z.string()),
|
|
19
|
+
hooks: z.record(z.string(), z.string()),
|
|
20
|
+
redirects: z.array(z.string()),
|
|
21
|
+
});
|
|
22
|
+
const SavedSchema = z.object({
|
|
23
|
+
workspace: z
|
|
24
|
+
.string()
|
|
25
|
+
.max(1024)
|
|
26
|
+
.refine((p) => path.isAbsolute(p)),
|
|
27
|
+
snapshot: GitStateSchema.extend({
|
|
28
|
+
gitDir: z.boolean(),
|
|
29
|
+
commands: z.record(z.string(), z.string()),
|
|
30
|
+
agent: z.record(z.string(), z.string()).optional(),
|
|
31
|
+
repos: z.record(z.string(), GitStateSchema).optional(),
|
|
32
|
+
}),
|
|
33
|
+
});
|
|
34
|
+
/**
|
|
35
|
+
* Every project the sandbox can write, and the project roots (whole folders of projects) it has mapped. Older
|
|
36
|
+
* versions saved a single object.
|
|
37
|
+
*/
|
|
38
|
+
const StoreSchema = z.strictObject({
|
|
39
|
+
projects: z.array(SavedSchema).max(4096),
|
|
40
|
+
roots: z
|
|
41
|
+
.array(z
|
|
42
|
+
.string()
|
|
43
|
+
.max(1024)
|
|
44
|
+
.refine((p) => path.isAbsolute(p)))
|
|
45
|
+
.max(64),
|
|
46
|
+
});
|
|
47
|
+
const StoreAnySchema = z.union([StoreSchema, SavedSchema.transform((s) => ({ projects: [s], roots: [] }))]);
|
|
48
|
+
const EMPTY = { gitDir: false, config: [], hooks: {}, redirects: [], commands: {}, agent: {}, repos: {} };
|
|
49
|
+
const MAX_ROOT_PROJECTS = 2000;
|
|
50
|
+
/** The folders directly inside a project root (plain folders only; links are never followed). */
|
|
51
|
+
function rootProjects(root) {
|
|
52
|
+
if (!dirExists(root) || isLink(root))
|
|
53
|
+
return [];
|
|
54
|
+
return fs
|
|
55
|
+
.readdirSync(root, { withFileTypes: true })
|
|
56
|
+
.filter((e) => e.isDirectory() && !e.isSymbolicLink())
|
|
57
|
+
.slice(0, MAX_ROOT_PROJECTS)
|
|
58
|
+
.map((e) => path.join(root, e.name));
|
|
59
|
+
}
|
|
60
|
+
function has(projects, workspace) {
|
|
61
|
+
return projects.some((s) => s.workspace.toLowerCase() === workspace.toLowerCase());
|
|
62
|
+
}
|
|
63
|
+
/** The guarded projects of one data folder and what the guard found (host-only files next to the sync state). */
|
|
64
|
+
export class RepoGuardStore {
|
|
65
|
+
guard;
|
|
66
|
+
snapshots;
|
|
67
|
+
found;
|
|
68
|
+
constructor(dataPath, guard = new RepoGuard()) {
|
|
69
|
+
this.guard = guard;
|
|
70
|
+
const storageRoot = storageOf(dataPath);
|
|
71
|
+
this.snapshots = new JsonFile(StoreAnySchema, hostStateFile(storageRoot, dataPath, '-repo.json'));
|
|
72
|
+
this.found = new JsonFile(z.array(FindingSchema).max(10000), hostStateFile(storageRoot, dataPath, '-repo-findings.json'));
|
|
73
|
+
}
|
|
74
|
+
read() {
|
|
75
|
+
return this.snapshots.read() ?? { projects: [], roots: [] };
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* At launch: every folder the sandbox will be able to write. The launch folder, projects mapped with it and every
|
|
79
|
+
* project already inside a project root are snapshotted as they are now, before the sandbox can touch them.
|
|
80
|
+
*/
|
|
81
|
+
save(workspace, more = [], roots = []) {
|
|
82
|
+
const folders = _.uniqBy([workspace, ...more, ...roots.flatMap((r) => [r, ...rootProjects(r)])], (w) => w.toLowerCase());
|
|
83
|
+
this.snapshots.write({
|
|
84
|
+
projects: folders.map((w) => ({ workspace: w, snapshot: this.guard.snapshot(w) })),
|
|
85
|
+
roots: [...roots],
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* A project that joins the running sandbox: snapshotted before its first session, then guarded like the launch
|
|
90
|
+
* folder. A project already guarded keeps its first snapshot (what was there before the sandbox could touch it).
|
|
91
|
+
*/
|
|
92
|
+
add(workspace, o = {}) {
|
|
93
|
+
const store = this.read();
|
|
94
|
+
// A folder inside one that is guarded already is covered by it only for its root files; it gets its own entry.
|
|
95
|
+
if (has(store.projects, workspace))
|
|
96
|
+
return;
|
|
97
|
+
this.snapshots.write({
|
|
98
|
+
...store,
|
|
99
|
+
projects: [...store.projects, { workspace, snapshot: o.empty ? EMPTY : this.guard.snapshot(workspace) }],
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Folders that appeared inside a project root after the launch: the sandbox could have written them from the start,
|
|
104
|
+
* so they get an EMPTY baseline: any git hook, git config that runs programs (core.hooksPath, core.fsmonitor, ...)
|
|
105
|
+
* or planted command in them counts as added inside the sandbox and is neutralised.
|
|
106
|
+
*/
|
|
107
|
+
discoverRootProjects() {
|
|
108
|
+
const store = this.read();
|
|
109
|
+
const found = store.roots
|
|
110
|
+
.flatMap(rootProjects)
|
|
111
|
+
.filter((w) => !has(store.projects, w))
|
|
112
|
+
.map((workspace) => ({ workspace, snapshot: EMPTY }));
|
|
113
|
+
if (!found.length)
|
|
114
|
+
return store.projects;
|
|
115
|
+
const projects = [...store.projects, ...found].slice(0, 4096);
|
|
116
|
+
this.snapshots.write({ ...store, projects });
|
|
117
|
+
return projects;
|
|
118
|
+
}
|
|
119
|
+
/** The folders being guarded (for status). */
|
|
120
|
+
guarded() {
|
|
121
|
+
return this.read().projects.map((s) => s.workspace);
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Re-checks every project of the current/last launch; findings are kept in a host-only file for `status`. Returns the
|
|
125
|
+
* new ones.
|
|
126
|
+
*/
|
|
127
|
+
check() {
|
|
128
|
+
const saved = this.discoverRootProjects();
|
|
129
|
+
if (!saved.length)
|
|
130
|
+
return [];
|
|
131
|
+
const old = this.findings();
|
|
132
|
+
// A finding that cannot be fixed (a file locked in the sandbox) is reported once, not every minute.
|
|
133
|
+
const findings = saved
|
|
134
|
+
.flatMap((s) => this.guard
|
|
135
|
+
.guard(s.workspace, s.snapshot)
|
|
136
|
+
.map((f) => (saved.length > 1 ? { ...f, detail: s.workspace + ': ' + f.detail } : f)))
|
|
137
|
+
.filter((f) => !old.some((o) => o.kind === f.kind && o.detail === f.detail));
|
|
138
|
+
if (findings.length)
|
|
139
|
+
this.found.write([...old, ...findings.map((f) => ({ ...f, at: new Date().toISOString() }))]);
|
|
140
|
+
return findings;
|
|
141
|
+
}
|
|
142
|
+
findings() {
|
|
143
|
+
return this.found.read() ?? [];
|
|
144
|
+
}
|
|
145
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/** What a finding is about (also the persisted findings' schema). */
|
|
2
|
+
export declare const FINDING_KINDS: readonly ["hook", "config", "git", "command", "agent"];
|
|
3
|
+
export type FindingKind = (typeof FINDING_KINDS)[number];
|
|
4
|
+
/** A git folder's own state: config lines, hooks, redirect files. */
|
|
5
|
+
export interface GitState {
|
|
6
|
+
readonly config: string[];
|
|
7
|
+
readonly hooks: Record<string, string>;
|
|
8
|
+
readonly redirects: string[];
|
|
9
|
+
}
|
|
10
|
+
export interface RepoSnapshot extends GitState {
|
|
11
|
+
readonly gitDir: boolean;
|
|
12
|
+
readonly commands: Record<string, string>;
|
|
13
|
+
/** Fingerprints of AGENT_FILES (missing in snapshots of older versions: then they are not checked). */
|
|
14
|
+
readonly agent?: Record<string, string>;
|
|
15
|
+
/** Other git folders: submodules (.git/modules/...) and repositories nested in the project, by relative path. */
|
|
16
|
+
readonly repos?: Record<string, GitState>;
|
|
17
|
+
}
|
|
18
|
+
export interface RepoFinding {
|
|
19
|
+
readonly kind: FindingKind;
|
|
20
|
+
readonly detail: string;
|
|
21
|
+
}
|
|
22
|
+
export type GuardRuleKind = 'commands' | 'agent-files' | 'nested-repos' | 'git-dir';
|
|
23
|
+
/** One check: compares the workspace with its pre-launch snapshot and neutralises what is new. */
|
|
24
|
+
export interface GuardRule {
|
|
25
|
+
readonly kind: GuardRuleKind;
|
|
26
|
+
check(workspace: string, before: RepoSnapshot): RepoFinding[];
|
|
27
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** The projects to watch and mark (empty: storage.markSandboxFiles is off). */
|
|
2
|
+
export declare function saveMarkedProjects(storageRoot: string, dataPath: string, projects: string[]): void;
|
|
3
|
+
export declare function readMarkedProjects(storageRoot: string, dataPath: string): string[];
|
|
4
|
+
/** The data folder's size, measured by the watcher when a sandbox closes (measuring at launch would be slow). */
|
|
5
|
+
export declare function saveDataSize(storageRoot: string, dataPath: string, bytes: number): void;
|
|
6
|
+
export declare function readDataSize(storageRoot: string, dataPath: string): {
|
|
7
|
+
bytes: number;
|
|
8
|
+
at: string;
|
|
9
|
+
} | null;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// What the background watcher marks, and the size of the persisted data: host-only files next to the sync state.
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { JsonFile } from '../../shared/io/index.js';
|
|
4
|
+
import { hostStateFile } from '../storage/index.js';
|
|
5
|
+
const MarkedSchema = z.array(z.string().max(1024)).max(64);
|
|
6
|
+
const DataSizeSchema = z.object({ bytes: z.number().min(0), at: z.string().max(40) });
|
|
7
|
+
function marksFile(storageRoot, dataPath) {
|
|
8
|
+
return new JsonFile(MarkedSchema, hostStateFile(storageRoot, dataPath, '-mark.json'));
|
|
9
|
+
}
|
|
10
|
+
function sizeFile(storageRoot, dataPath) {
|
|
11
|
+
return new JsonFile(DataSizeSchema, hostStateFile(storageRoot, dataPath, '-size.json'));
|
|
12
|
+
}
|
|
13
|
+
/** The projects to watch and mark (empty: storage.markSandboxFiles is off). */
|
|
14
|
+
export function saveMarkedProjects(storageRoot, dataPath, projects) {
|
|
15
|
+
marksFile(storageRoot, dataPath).write(projects);
|
|
16
|
+
}
|
|
17
|
+
export function readMarkedProjects(storageRoot, dataPath) {
|
|
18
|
+
return marksFile(storageRoot, dataPath).read() ?? [];
|
|
19
|
+
}
|
|
20
|
+
/** The data folder's size, measured by the watcher when a sandbox closes (measuring at launch would be slow). */
|
|
21
|
+
export function saveDataSize(storageRoot, dataPath, bytes) {
|
|
22
|
+
sizeFile(storageRoot, dataPath).write({ bytes, at: new Date().toISOString() });
|
|
23
|
+
}
|
|
24
|
+
export function readDataSize(storageRoot, dataPath) {
|
|
25
|
+
return sizeFile(storageRoot, dataPath).read();
|
|
26
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ResolvedRun } from '../../core/types.js';
|
|
2
|
+
import { type RootMapping } from '../../shared/paths/index.js';
|
|
3
|
+
/** More folders than this would make the .wsb (and every boot) unwieldy; the rest join with a restart later. */
|
|
4
|
+
export declare const MAX_BOOT_PROJECTS = 48;
|
|
5
|
+
export interface BootProjects {
|
|
6
|
+
readonly roots: RootMapping[];
|
|
7
|
+
readonly projects: RootMapping[];
|
|
8
|
+
readonly notes: string[];
|
|
9
|
+
}
|
|
10
|
+
export declare function planBootProjects(o: {
|
|
11
|
+
readonly run: ResolvedRun;
|
|
12
|
+
readonly packageRoot: string;
|
|
13
|
+
readonly extraProjects?: readonly string[];
|
|
14
|
+
readonly knownProjects?: readonly string[];
|
|
15
|
+
}): BootProjects;
|
|
16
|
+
/** The launch folder is inside a mapped root and placed under it (core/run): the root shows it, no own mapping. */
|
|
17
|
+
export declare function shownByRoot(roots: readonly RootMapping[], workspaceHost: string, guestWorkspace: string): boolean;
|
|
@@ -3,12 +3,13 @@
|
|
|
3
3
|
// started before (except projects.exclude). Every one passes the same checks as a launch folder.
|
|
4
4
|
import path from 'node:path';
|
|
5
5
|
import { assertSafeMapping, assertSafeWorkspace } from '../../core/safe-paths.js';
|
|
6
|
-
import { dirExists, errMsg, fail } from '../../core/util.js';
|
|
7
|
-
import { guestDirFor, isWithin, planProjectMappings, projectForHostDir, usableRoots } from '../../shared/
|
|
8
|
-
|
|
6
|
+
import { dirExists, errMsg, fail } from '../../core/util/index.js';
|
|
7
|
+
import { guestDirFor, isWithin, planProjectMappings, projectForHostDir, usableRoots, } from '../../shared/paths/index.js';
|
|
8
|
+
// Direct, not the barrel: host/projects/join.ts imports host/launch.
|
|
9
|
+
import { allProjectsToMap, KnownProjects } from '../projects/known.js';
|
|
9
10
|
/** More folders than this would make the .wsb (and every boot) unwieldy; the rest join with a restart later. */
|
|
10
11
|
export const MAX_BOOT_PROJECTS = 48;
|
|
11
|
-
export
|
|
12
|
+
export function planBootProjects(o) {
|
|
12
13
|
const { config, workspaceHost, storageRoot } = o.run;
|
|
13
14
|
const notes = [];
|
|
14
15
|
const safe = (folder) => {
|
|
@@ -30,13 +31,20 @@ export const planBootProjects = (o) => {
|
|
|
30
31
|
if (refusal)
|
|
31
32
|
fail('projects.roots: ' + refusal, 'Use a folder that holds your projects, e.g. F:\\Code (not a drive, your profile or a system folder).');
|
|
32
33
|
}
|
|
33
|
-
// The same list resolveRun used to place a launch folder that is inside a root (core/workspace.ts).
|
|
34
|
+
// The same list resolveRun used to place a launch folder that is inside a root (core/run/guest-workspace.ts).
|
|
34
35
|
const roots = usableRoots(config.projects.roots, dirExists);
|
|
35
|
-
const known = o.knownProjects ??
|
|
36
|
-
const wanted = [
|
|
36
|
+
const known = o.knownProjects ?? new KnownProjects(storageRoot).list().map((k) => k.host);
|
|
37
|
+
const wanted = [
|
|
38
|
+
...(o.extraProjects ?? []),
|
|
39
|
+
...(config.projects.all
|
|
40
|
+
? allProjectsToMap(known, { primary: workspaceHost, roots, exclude: config.projects.exclude })
|
|
41
|
+
: []),
|
|
42
|
+
];
|
|
37
43
|
const projects = [];
|
|
38
44
|
for (const folder of wanted.map((p) => path.resolve(p))) {
|
|
39
|
-
if (isWithin(workspaceHost, folder) ||
|
|
45
|
+
if (isWithin(workspaceHost, folder) ||
|
|
46
|
+
roots.some((r) => isWithin(r, folder)) ||
|
|
47
|
+
projects.some((p) => isWithin(p, folder) || isWithin(folder, p)))
|
|
40
48
|
continue;
|
|
41
49
|
if (!dirExists(folder))
|
|
42
50
|
continue;
|
|
@@ -54,9 +62,10 @@ export const planBootProjects = (o) => {
|
|
|
54
62
|
// Projects mapped on their own sit where they would as the launch folder (C:\Workspace\<name>), never on top of it.
|
|
55
63
|
const taken = [config.guestWorkspace, ...config.mappings.flatMap((m) => (m.guest ? [m.guest] : []))];
|
|
56
64
|
return { ...planProjectMappings(roots, projects, Boolean(o.run.mirror), taken), notes };
|
|
57
|
-
}
|
|
58
|
-
/** The launch folder is inside a mapped root and placed under it (core/
|
|
59
|
-
export
|
|
65
|
+
}
|
|
66
|
+
/** The launch folder is inside a mapped root and placed under it (core/run): the root shows it, no own mapping. */
|
|
67
|
+
export function shownByRoot(roots, workspaceHost, guestWorkspace) {
|
|
60
68
|
const root = projectForHostDir(roots, workspaceHost);
|
|
61
|
-
return root !== null &&
|
|
62
|
-
|
|
69
|
+
return (root !== null &&
|
|
70
|
+
guestDirFor(root, workspaceHost).toLowerCase() === guestWorkspace.replace(/[\\/]+$/, '').toLowerCase());
|
|
71
|
+
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import type { Config, DatabasePlan } from '
|
|
2
|
-
import { type Database, type ProjectFile } from '
|
|
1
|
+
import type { Config, DatabasePlan } from '../../core/types.js';
|
|
2
|
+
import { type Database, type ProjectFile } from '../../core/detect/index.js';
|
|
3
3
|
/**
|
|
4
4
|
* What to run in this sandbox: databases set to true, plus "auto" ones the project needs. SQL Server is reported (so
|
|
5
5
|
* the user hears about it) but cannot run inside Windows Sandbox.
|
|
6
6
|
*/
|
|
7
|
-
export declare
|
|
7
|
+
export declare function planDatabases(config: Config['databases'], workspace: string, probe?: {
|
|
8
8
|
files?: ProjectFile[];
|
|
9
9
|
host?: Database[];
|
|
10
|
-
})
|
|
10
|
+
}): DatabasePlan[];
|
|
11
11
|
/** Every database the sandbox can run, so `sbx-db start <name>` works for ones that did not start at boot. */
|
|
12
|
-
export declare
|
|
12
|
+
export declare function databaseCatalog(config: Config['databases']): DatabasePlan[];
|