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
|
@@ -3,9 +3,12 @@
|
|
|
3
3
|
/** Turns an .nvmrc-style spec (20, v20.11.1, lts/*, lts/iron, node, latest) into an exact version like 20.11.1. */
|
|
4
4
|
export const pickNodeVersion = (releases, spec) => {
|
|
5
5
|
const s = spec.trim().toLowerCase().replace(/^v/, '');
|
|
6
|
-
const hit = ['node', 'latest', 'current', 'stable'].includes(s)
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
const hit = ['node', 'latest', 'current', 'stable'].includes(s)
|
|
7
|
+
? releases[0]
|
|
8
|
+
: s === 'lts' || s === 'lts/*'
|
|
9
|
+
? releases.find((r) => r.lts)
|
|
10
|
+
: s.startsWith('lts/')
|
|
11
|
+
? releases.find((r) => typeof r.lts === 'string' && r.lts.toLowerCase() === s.slice(4))
|
|
9
12
|
: releases.find((r) => r.version === 'v' + s || r.version.startsWith('v' + s + '.'));
|
|
10
13
|
return hit ? hit.version.slice(1) : null;
|
|
11
14
|
};
|
|
@@ -19,19 +22,26 @@ export const pickSpreadVersions = (available, current, max) => {
|
|
|
19
22
|
const newestPerMajor = exact.filter((v, i) => exact[i + 1]?.split('.')[0] !== v.split('.')[0]);
|
|
20
23
|
const pool = newestPerMajor.filter((v) => v.split('.')[0] !== current.split('.')[0]);
|
|
21
24
|
const want = Math.max(0, max - 1);
|
|
22
|
-
const picked = want >= pool.length
|
|
23
|
-
|
|
24
|
-
|
|
25
|
+
const picked = want >= pool.length
|
|
26
|
+
? pool
|
|
27
|
+
: want === 1
|
|
28
|
+
? [pool[pool.length - 1]]
|
|
29
|
+
: Array.from({ length: want }, (_, i) => pool[Math.round((i * (pool.length - 1)) / (want - 1))]);
|
|
25
30
|
return [current, ...picked];
|
|
26
31
|
};
|
|
27
32
|
/** Newest stable version matching a prefix spec ("3" -> 3.13.1, "3.12" -> 3.12.10). */
|
|
28
33
|
export const pickPackageVersion = (all, spec) => {
|
|
29
34
|
const s = spec.trim().replace(/^python-?/i, '');
|
|
30
|
-
const stable = all
|
|
35
|
+
const stable = all
|
|
36
|
+
.filter((v) => /^\d+(\.\d+)*$/.test(v))
|
|
37
|
+
.sort((a, b) => b.localeCompare(a, undefined, { numeric: true }));
|
|
31
38
|
return stable.find((v) => v === s || v.startsWith(s + '.')) ?? null;
|
|
32
39
|
};
|
|
33
40
|
/** Version spec from a version file's text (.ruby-version "ruby-3.3.1", .java-version "temurin-21", ...): its first x[.y[.z]]. */
|
|
34
|
-
export const specFromVersionFile = (text) => /(\d+(?:\.\d+){0,2})/.exec(text
|
|
41
|
+
export const specFromVersionFile = (text) => /(\d+(?:\.\d+){0,2})/.exec(text
|
|
42
|
+
.split(/\r?\n/)
|
|
43
|
+
.map((l) => l.replace(/#.*$/, '').trim())
|
|
44
|
+
.find(Boolean) ?? '')?.[1] ?? null;
|
|
35
45
|
/** Java major version from .java-version ("21", "17.0.9", "1.8", "temurin-21") or .sdkmanrc ("java=21.0.2-tem"). */
|
|
36
46
|
export const javaMajorFrom = (text, sdkmanrc = false) => {
|
|
37
47
|
const line = sdkmanrc ? /^\s*java\s*=\s*(.+)$/m.exec(text)?.[1] : text;
|
|
@@ -55,23 +65,29 @@ export const pickGoRelease = (releases, spec) => {
|
|
|
55
65
|
*/
|
|
56
66
|
export const projectUses = (entries, markers) => entries.some((entry) => {
|
|
57
67
|
const name = entry.split(/[\/]/).pop().toLowerCase();
|
|
58
|
-
return markers.some((m) =>
|
|
68
|
+
return markers.some((m) => m.startsWith('*.') ? name.endsWith(m.slice(1).toLowerCase()) : name === m.toLowerCase());
|
|
59
69
|
});
|
|
60
70
|
/** Newest MSVC tools version among VS manifest package ids ("microsoft.vc.14.44.17.14.tools.hostx64.targetx64.base"). */
|
|
61
71
|
export const pickMsvcVersion = (packageIds, spec = 'latest') => {
|
|
62
|
-
const versions = packageIds
|
|
72
|
+
const versions = packageIds
|
|
73
|
+
.map((id) => /^microsoft\.vc\.(\d+\.\d+\.\d+\.\d+)\.tools\.hostx64\.targetx64\.base$/i.exec(id)?.[1])
|
|
74
|
+
.filter((v) => Boolean(v));
|
|
63
75
|
const sorted = [...new Set(versions)].sort((a, b) => b.localeCompare(a, undefined, { numeric: true }));
|
|
64
76
|
return (spec === 'latest' ? sorted[0] : sorted.find((v) => v === spec || v.startsWith(spec + '.'))) ?? null;
|
|
65
77
|
};
|
|
66
78
|
/** Newest Windows SDK build among component ids ("microsoft.visualstudio.component.windows11sdk.26100"). */
|
|
67
79
|
export const pickWindowsSdk = (packageIds, spec = 'latest') => {
|
|
68
|
-
const found = packageIds
|
|
80
|
+
const found = packageIds
|
|
81
|
+
.map((id) => ({ id, build: /^microsoft\.visualstudio\.component\.windows1[01]sdk\.(\d+)$/i.exec(id)?.[1] }))
|
|
82
|
+
.filter((x) => Boolean(x.build));
|
|
69
83
|
const sorted = found.sort((a, b) => Number(b.build) - Number(a.build));
|
|
70
84
|
const hit = spec === 'latest' ? sorted[0] : sorted.find((x) => x.build === spec.replace(/^10\.0\./, '').split('.')[0]);
|
|
71
85
|
return hit ? { build: hit.build, componentId: hit.id } : null;
|
|
72
86
|
};
|
|
73
87
|
/** The .cab files an SDK .msi refers to (their names are inside the msi as plain "<32 hex>.cab"). */
|
|
74
|
-
export const msiCabs = (msi) => [
|
|
88
|
+
export const msiCabs = (msi) => [
|
|
89
|
+
...new Set([...msi.toString('latin1').matchAll(/([0-9a-f]{32}\.cab)/gi)].map((m) => m[1].toLowerCase())),
|
|
90
|
+
];
|
|
75
91
|
/** The oldest CMake many projects (OpenMoHAA among them) accept. */
|
|
76
92
|
export const CMAKE_FLOOR = '3.25';
|
|
77
93
|
export const cmakeTooOld = (version) => /^\d+\.\d+/.test(version) && version.localeCompare(CMAKE_FLOOR, undefined, { numeric: true }) < 0;
|
package/dist/core/disk.d.ts
CHANGED
|
@@ -3,6 +3,8 @@ export declare const GB: number;
|
|
|
3
3
|
export declare const humanBytes: (bytes: number) => string;
|
|
4
4
|
/** Size on disk, never following links or junctions (a link counts as 0, so a planted junction cannot make us walk this PC's disk). */
|
|
5
5
|
export declare const sizeOf: (p: string) => number;
|
|
6
|
+
/** sizeOf with a time budget: null when measuring would take longer than `ms` (a big data folder can take minutes). */
|
|
7
|
+
export declare const sizeWithin: (p: string, ms: number) => number | null;
|
|
6
8
|
/** Free bytes on the drive that holds `dir` (which may not exist yet: the nearest existing parent is asked); null if unknown. */
|
|
7
9
|
export declare const freeBytesAt: (dir: string) => number | null;
|
|
8
10
|
export interface DiskUsage {
|
package/dist/core/disk.js
CHANGED
|
@@ -18,12 +18,44 @@ export const sizeOf = (p) => {
|
|
|
18
18
|
return 0;
|
|
19
19
|
if (!stat.isDirectory())
|
|
20
20
|
return stat.size;
|
|
21
|
-
return _.sumBy(fs.readdirSync(p, { withFileTypes: true }), (d) =>
|
|
21
|
+
return _.sumBy(fs.readdirSync(p, { withFileTypes: true }), (d) => d.isSymbolicLink() ? 0 : sizeOf(path.join(p, d.name)));
|
|
22
22
|
}
|
|
23
23
|
catch {
|
|
24
24
|
return 0;
|
|
25
25
|
}
|
|
26
26
|
};
|
|
27
|
+
/** sizeOf with a time budget: null when measuring would take longer than `ms` (a big data folder can take minutes). */
|
|
28
|
+
export const sizeWithin = (p, ms) => {
|
|
29
|
+
const deadline = Date.now() + ms;
|
|
30
|
+
const overBudget = Symbol('over budget');
|
|
31
|
+
const walk = (at) => {
|
|
32
|
+
if (Date.now() > deadline)
|
|
33
|
+
throw overBudget;
|
|
34
|
+
let stat;
|
|
35
|
+
let entries = [];
|
|
36
|
+
try {
|
|
37
|
+
stat = fs.lstatSync(at);
|
|
38
|
+
if (stat.isDirectory() && !stat.isSymbolicLink())
|
|
39
|
+
entries = fs.readdirSync(at, { withFileTypes: true });
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return 0; /* gone or unreadable: counts as nothing, like sizeOf */
|
|
43
|
+
}
|
|
44
|
+
if (stat.isSymbolicLink())
|
|
45
|
+
return 0;
|
|
46
|
+
if (!stat.isDirectory())
|
|
47
|
+
return stat.size;
|
|
48
|
+
return _.sumBy(entries, (d) => (d.isSymbolicLink() ? 0 : walk(path.join(at, d.name))));
|
|
49
|
+
};
|
|
50
|
+
try {
|
|
51
|
+
return walk(p);
|
|
52
|
+
}
|
|
53
|
+
catch (e) {
|
|
54
|
+
if (e === overBudget)
|
|
55
|
+
return null;
|
|
56
|
+
throw e;
|
|
57
|
+
}
|
|
58
|
+
};
|
|
27
59
|
/** Free bytes on the drive that holds `dir` (which may not exist yet: the nearest existing parent is asked); null if unknown. */
|
|
28
60
|
export const freeBytesAt = (dir) => {
|
|
29
61
|
let at = path.resolve(dir);
|
|
@@ -40,13 +72,24 @@ export const freeBytesAt = (dir) => {
|
|
|
40
72
|
/** Every local drive's size and free space, and which one holds the sandbox storage. */
|
|
41
73
|
export const diskUsage = (storageRoot) => {
|
|
42
74
|
const storageDrive = path.parse(path.resolve(storageRoot)).root.toUpperCase();
|
|
43
|
-
return 'CDEFGHIJKLMNOPQRSTUVWXYZ'
|
|
75
|
+
return 'CDEFGHIJKLMNOPQRSTUVWXYZ'
|
|
76
|
+
.split('')
|
|
77
|
+
.map((letter) => letter + ':\\')
|
|
78
|
+
.flatMap((drive) => {
|
|
44
79
|
try {
|
|
45
80
|
const s = fs.statfsSync(drive);
|
|
46
81
|
const totalBytes = s.blocks * s.bsize;
|
|
47
82
|
if (!totalBytes)
|
|
48
83
|
return [];
|
|
49
|
-
return [
|
|
84
|
+
return [
|
|
85
|
+
{
|
|
86
|
+
drive,
|
|
87
|
+
totalBytes,
|
|
88
|
+
freeBytes: s.bavail * s.bsize,
|
|
89
|
+
usedBytes: totalBytes - s.bfree * s.bsize,
|
|
90
|
+
holdsStorage: drive.toUpperCase() === storageDrive,
|
|
91
|
+
},
|
|
92
|
+
];
|
|
50
93
|
}
|
|
51
94
|
catch {
|
|
52
95
|
return [];
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { Config, ResolvedMapping } from '../types.js';
|
|
2
|
+
import type { Protections } from './policy.js';
|
|
3
|
+
/** .wsb devices a project may want on (only when your settings or your answer for that project allow it). */
|
|
4
|
+
export declare const BOOT_SETTINGS: string[];
|
|
5
|
+
/** What the running sandbox booted with (host-only registry). */
|
|
6
|
+
export interface BootRecord {
|
|
7
|
+
memoryMb: number | null;
|
|
8
|
+
mappings: ResolvedMapping[];
|
|
9
|
+
}
|
|
10
|
+
/** What a project wants that the running sandbox started without. */
|
|
11
|
+
export interface Missing {
|
|
12
|
+
settings: string[];
|
|
13
|
+
memoryMb: number | null;
|
|
14
|
+
mappings: ResolvedMapping[];
|
|
15
|
+
}
|
|
16
|
+
/** A project mapped at boot besides the launch folder, with its effective config. */
|
|
17
|
+
export interface BootWant {
|
|
18
|
+
name: string;
|
|
19
|
+
config: Config;
|
|
20
|
+
}
|
|
21
|
+
export interface Widened {
|
|
22
|
+
config: Config;
|
|
23
|
+
/** Setting -> the project it was turned on for. */
|
|
24
|
+
widened: Record<string, string>;
|
|
25
|
+
notes: string[];
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* The boot-only things `config` (a project's effective config: your settings, its approved file, your answers) asks
|
|
29
|
+
* for that the running sandbox lacks. `exists`: optional mappings whose folder is missing are no wish.
|
|
30
|
+
*/
|
|
31
|
+
export declare function missingAtBoot(running: Protections, boot: BootRecord, config: Config, exists?: (folder: string) => boolean): Missing;
|
|
32
|
+
export declare function nothingMissing(m: Missing): boolean;
|
|
33
|
+
/** "mw2-agent wants vGPU and 2 folders (C:\Steam\..., F:\SteamLibrary\...), but this sandbox started without them." */
|
|
34
|
+
export declare function describeMissing(project: string, m: Missing): string;
|
|
35
|
+
/** "Set sandbox.vGpu (or the mappings) in your own settings to have them in every sandbox." */
|
|
36
|
+
export declare function missingTip(m: Missing): string;
|
|
37
|
+
/**
|
|
38
|
+
* The launch folder's config plus what the other projects mapped at boot want: their allowed .wsb devices, a fixed
|
|
39
|
+
* memory size larger than the launch's, and their mappings (placed with every other mapping at launch).
|
|
40
|
+
* `keepOff`: devices the launch folder's own .sandbox-config.json switched off; they stay off.
|
|
41
|
+
*/
|
|
42
|
+
export declare function widenForProjects(launch: Config, others: readonly BootWant[], opts?: {
|
|
43
|
+
keepOff?: readonly string[];
|
|
44
|
+
exists?: (folder: string) => boolean;
|
|
45
|
+
}): Widened;
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
// What a project WANTS at boot (a .wsb device you allowed for it, more memory, its mappings) and the running sandbox
|
|
2
|
+
// started without. Those can only come with a restart, so they are named (missingAtBoot), and a sandbox started with
|
|
3
|
+
// several projects boots with all of their allowed wants (widenForProjects). Pure.
|
|
4
|
+
import _ from 'lodash';
|
|
5
|
+
/** .wsb devices a project may want on (only when your settings or your answer for that project allow it). */
|
|
6
|
+
export const BOOT_SETTINGS = [
|
|
7
|
+
'sandbox.vGpu',
|
|
8
|
+
'sandbox.networking',
|
|
9
|
+
'sandbox.clipboard',
|
|
10
|
+
'sandbox.audioInput',
|
|
11
|
+
'sandbox.videoInput',
|
|
12
|
+
'sandbox.printerRedirection',
|
|
13
|
+
];
|
|
14
|
+
const LABELS = {
|
|
15
|
+
'sandbox.vGpu': 'vGPU',
|
|
16
|
+
'sandbox.networking': 'networking',
|
|
17
|
+
'sandbox.clipboard': 'the shared clipboard',
|
|
18
|
+
'sandbox.audioInput': 'the microphone',
|
|
19
|
+
'sandbox.videoInput': 'the camera',
|
|
20
|
+
'sandbox.printerRedirection': 'printers',
|
|
21
|
+
};
|
|
22
|
+
function sameHost(a, b) {
|
|
23
|
+
return a.toLowerCase().replace(/\\+$/, '') === b.toLowerCase().replace(/\\+$/, '');
|
|
24
|
+
}
|
|
25
|
+
/** `m`'s folder is mapped, wherever the launch placed it (read-only is enough for a read-only wish). */
|
|
26
|
+
function isMapped(mapped, m) {
|
|
27
|
+
return mapped.some((x) => sameHost(x.host, m.host) && (m.readOnly || !x.readOnly));
|
|
28
|
+
}
|
|
29
|
+
function listing(items) {
|
|
30
|
+
return items.length <= 1 ? items.join('') : items.slice(0, -1).join(', ') + ' and ' + items[items.length - 1];
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* The boot-only things `config` (a project's effective config: your settings, its approved file, your answers) asks
|
|
34
|
+
* for that the running sandbox lacks. `exists`: optional mappings whose folder is missing are no wish.
|
|
35
|
+
*/
|
|
36
|
+
export function missingAtBoot(running, boot, config, exists = () => true) {
|
|
37
|
+
const memory = config.sandbox.memoryMb;
|
|
38
|
+
return {
|
|
39
|
+
settings: BOOT_SETTINGS.filter((s) => _.get(config, s) === true && running[s] === false),
|
|
40
|
+
memoryMb: typeof memory === 'number' && boot.memoryMb !== null && memory > boot.memoryMb ? memory : null,
|
|
41
|
+
mappings: config.mappings
|
|
42
|
+
.filter((m) => (!m.optional || exists(m.host)) && !isMapped(boot.mappings, m))
|
|
43
|
+
.map((m) => ({ host: m.host, guest: m.guest ?? m.host, readOnly: m.readOnly })),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
export function nothingMissing(m) {
|
|
47
|
+
return m.settings.length === 0 && m.memoryMb === null && m.mappings.length === 0;
|
|
48
|
+
}
|
|
49
|
+
/** "mw2-agent wants vGPU and 2 folders (C:\Steam\..., F:\SteamLibrary\...), but this sandbox started without them." */
|
|
50
|
+
export function describeMissing(project, m) {
|
|
51
|
+
const folders = m.mappings.length
|
|
52
|
+
? [
|
|
53
|
+
m.mappings.length +
|
|
54
|
+
' folder' +
|
|
55
|
+
(m.mappings.length === 1 ? '' : 's') +
|
|
56
|
+
' (' +
|
|
57
|
+
m.mappings.map((x) => x.host).join(', ') +
|
|
58
|
+
')',
|
|
59
|
+
]
|
|
60
|
+
: [];
|
|
61
|
+
const items = [
|
|
62
|
+
...m.settings.map((s) => LABELS[s] ?? s),
|
|
63
|
+
...(m.memoryMb !== null ? [m.memoryMb + ' MB of memory'] : []),
|
|
64
|
+
...folders,
|
|
65
|
+
];
|
|
66
|
+
const pronoun = items.length === 1 && !m.mappings.length ? 'it' : 'them';
|
|
67
|
+
return project + ' wants ' + listing(items) + ', but this sandbox started without ' + pronoun + '.';
|
|
68
|
+
}
|
|
69
|
+
/** "Set sandbox.vGpu (or the mappings) in your own settings to have them in every sandbox." */
|
|
70
|
+
export function missingTip(m) {
|
|
71
|
+
const keys = [...m.settings, ...(m.memoryMb !== null ? ['sandbox.memoryMb'] : [])];
|
|
72
|
+
const what = keys.length ? listing(keys) + (m.mappings.length ? ' (or the mappings)' : '') : 'the mappings';
|
|
73
|
+
return 'Set ' + what + ' in your own settings to have them in every sandbox.';
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* The launch folder's config plus what the other projects mapped at boot want: their allowed .wsb devices, a fixed
|
|
77
|
+
* memory size larger than the launch's, and their mappings (placed with every other mapping at launch).
|
|
78
|
+
* `keepOff`: devices the launch folder's own .sandbox-config.json switched off; they stay off.
|
|
79
|
+
*/
|
|
80
|
+
export function widenForProjects(launch, others, opts = {}) {
|
|
81
|
+
const keepOff = opts.keepOff ?? [];
|
|
82
|
+
const exists = opts.exists ?? (() => true);
|
|
83
|
+
const config = _.cloneDeep(launch);
|
|
84
|
+
const widened = {};
|
|
85
|
+
const notes = [];
|
|
86
|
+
for (const setting of BOOT_SETTINGS) {
|
|
87
|
+
const by = others.find((o) => _.get(o.config, setting) === true);
|
|
88
|
+
if (!by || _.get(config, setting) === true)
|
|
89
|
+
continue;
|
|
90
|
+
const label = LABELS[setting] ?? setting;
|
|
91
|
+
if (keepOff.includes(setting)) {
|
|
92
|
+
notes.push(by.name +
|
|
93
|
+
' wants ' +
|
|
94
|
+
label +
|
|
95
|
+
", but the launch folder's .sandbox-config.json switches it off, so it stays off.");
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
_.set(config, setting, true);
|
|
99
|
+
widened[setting] = by.name;
|
|
100
|
+
notes.push(label + ' is on in this sandbox (for every project in it): ' + by.name + ' asks for it and you allowed it.');
|
|
101
|
+
}
|
|
102
|
+
for (const o of others) {
|
|
103
|
+
const mem = o.config.sandbox.memoryMb;
|
|
104
|
+
if (typeof mem === 'number' && typeof config.sandbox.memoryMb === 'number' && mem > config.sandbox.memoryMb)
|
|
105
|
+
config.sandbox.memoryMb = mem;
|
|
106
|
+
for (const m of o.config.mappings) {
|
|
107
|
+
if (config.mappings.some((x) => sameHost(x.host, m.host)))
|
|
108
|
+
continue;
|
|
109
|
+
if (m.optional && !exists(m.host))
|
|
110
|
+
continue;
|
|
111
|
+
if (!exists(m.host)) {
|
|
112
|
+
notes.push(o.name + ': mapped folder not found, skipped: ' + m.host);
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
// Where it appears (and moving it when that place is taken) is decided with every other mapping at launch.
|
|
116
|
+
config.mappings.push({ ...m, optional: true });
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return { config, widened, notes };
|
|
120
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import crypto from 'node:crypto';
|
|
4
|
+
import { fileExists, parseJsonc } from '../util/index.js';
|
|
5
|
+
export const LOCAL_CONFIG_NAME = '.sandbox-config.json';
|
|
6
|
+
export const readLocalConfig = (dir) => {
|
|
7
|
+
const file = path.join(dir, LOCAL_CONFIG_NAME);
|
|
8
|
+
if (!fileExists(file))
|
|
9
|
+
return null;
|
|
10
|
+
const raw = fs.readFileSync(file);
|
|
11
|
+
return {
|
|
12
|
+
path: file,
|
|
13
|
+
hash: crypto.createHash('sha256').update(raw).digest('hex'),
|
|
14
|
+
data: parseJsonc(raw.toString('utf8'), file),
|
|
15
|
+
};
|
|
16
|
+
};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { LOCAL_CONFIG_NAME, readLocalConfig } from './file.js';
|
|
2
|
+
export { normalizeOverrides, ON_IS_SAFER, OFF_IS_SAFER, GIT_STRICTNESS, NEVER_LOOSER, loosenedRequests, applyOverrides, describeOverrides, allowRequests, outsideMappings, insideProject, } from './overrides.js';
|
|
3
|
+
export { trustStorePath, isTrusted, saveTrust, allowStorePath, allowedAnswer, saveAllowed, OUTSIDE_FOLDER, outsideKey, } from './trust.js';
|
|
4
|
+
export * from './policy.js';
|
|
5
|
+
export * from './boot-wants.js';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// A project's .sandbox-config.json: validated against the LocalOverrides schema (a safe subset of settings), applied
|
|
2
|
+
// over the user config, and only used once you have approved this exact version of the file.
|
|
3
|
+
export { LOCAL_CONFIG_NAME, readLocalConfig } from './file.js';
|
|
4
|
+
export { normalizeOverrides, ON_IS_SAFER, OFF_IS_SAFER, GIT_STRICTNESS, NEVER_LOOSER, loosenedRequests, applyOverrides, describeOverrides, allowRequests, outsideMappings, insideProject, } from './overrides.js';
|
|
5
|
+
export { trustStorePath, isTrusted, saveTrust, allowStorePath, allowedAnswer, saveAllowed, OUTSIDE_FOLDER, outsideKey, } from './trust.js';
|
|
6
|
+
export * from './policy.js';
|
|
7
|
+
export * from './boot-wants.js';
|
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
import type { Config,
|
|
2
|
-
export declare const LOCAL_CONFIG_NAME = ".sandbox-config.json";
|
|
1
|
+
import type { Config, Overrides } from '../types.js';
|
|
3
2
|
/** Validates a folder's settings and resolves its relative paths against that folder. */
|
|
4
3
|
export declare const normalizeOverrides: (data: unknown, dir: string, source: string) => Overrides;
|
|
5
4
|
/**
|
|
6
5
|
* The project file's mappings of folders outside the project (%VAR% expanded, links and short names followed). A repo
|
|
7
6
|
* ships this file, so these reach the rest of this PC: projects.allowOutsideMappings in YOUR settings decides.
|
|
8
7
|
*/
|
|
9
|
-
export declare
|
|
8
|
+
export declare function outsideMappings<M extends {
|
|
10
9
|
host: string;
|
|
11
|
-
}>(dir: string, mappings?: M[])
|
|
10
|
+
}>(dir: string, mappings?: readonly M[]): M[];
|
|
12
11
|
/** `folder` (also where it really is, through links) is inside the project folder `dir`. */
|
|
13
12
|
export declare const insideProject: (dir: string, folder: string) => boolean;
|
|
14
13
|
/**
|
|
@@ -29,20 +28,6 @@ export declare const loosenedRequests: (config: Config, ov: Overrides) => {
|
|
|
29
28
|
export declare const applyOverrides: (config: Config, ov: Overrides) => Config;
|
|
30
29
|
/** Human-readable list of what a local config changes, with risky items flagged. */
|
|
31
30
|
export declare const describeOverrides: (ov: Overrides, dir?: string) => string[];
|
|
32
|
-
export declare const readLocalConfig: (dir: string) => LocalConfigFile | null;
|
|
33
|
-
export declare const trustStorePath: (storageRoot: string) => string;
|
|
34
|
-
export declare const isTrusted: (store: string, file: string, hash: string) => boolean;
|
|
35
|
-
export declare const saveTrust: (store: string, file: string, hash: string) => void;
|
|
36
|
-
export declare const allowStorePath: (storageRoot: string) => string;
|
|
37
|
-
/** true = you allowed it, false = you said no (not asked again), null = not asked yet. */
|
|
38
|
-
export declare const allowedAnswer: (store: string, file: string, setting: string, value: unknown) => boolean | null;
|
|
39
|
-
export declare const saveAllowed: (store: string, file: string, setting: string, value: unknown, allow: boolean) => void;
|
|
40
|
-
/** Answers for folders outside the project are kept with the others, one per folder (and read-only or not). */
|
|
41
|
-
export declare const OUTSIDE_FOLDER = "folder outside the project";
|
|
42
|
-
export declare const outsideKey: (m: {
|
|
43
|
-
host: string;
|
|
44
|
-
readOnly: boolean;
|
|
45
|
-
}) => string;
|
|
46
31
|
/** Your config with these requests let through, so applyOverrides' "strictest wins" keeps the project's value. */
|
|
47
32
|
export declare const allowRequests: (config: Config, allowed: {
|
|
48
33
|
key: string;
|
|
@@ -1,17 +1,12 @@
|
|
|
1
|
-
// A project's .sandbox-config.json: validated against the LocalOverrides schema (a safe subset of settings), applied
|
|
2
|
-
// over the user config, and only used once you have approved this exact version of the file.
|
|
3
1
|
import fs from 'node:fs';
|
|
4
2
|
import path from 'node:path';
|
|
5
|
-
import crypto from 'node:crypto';
|
|
6
3
|
import _ from 'lodash';
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import { expandPath, fail, fileExists, isInsideOrEqual, parseJsonc, tryReadJson, writeJson } from './util.js';
|
|
11
|
-
export const LOCAL_CONFIG_NAME = '.sandbox-config.json';
|
|
4
|
+
import { mergeConfig } from '../config/index.js';
|
|
5
|
+
import { describeIssues, LocalOverridesSchema } from '../schema/index.js';
|
|
6
|
+
import { expandPath, fail, fileExists, isInsideOrEqual } from '../util/index.js';
|
|
12
7
|
/** Validates a folder's settings and resolves its relative paths against that folder. */
|
|
13
8
|
export const normalizeOverrides = (data, dir, source) => {
|
|
14
|
-
const parsed =
|
|
9
|
+
const parsed = LocalOverridesSchema.safeParse(data);
|
|
15
10
|
if (!parsed.success)
|
|
16
11
|
fail(source + ' is not valid:\n - ' + describeIssues(parsed.error).join('\n - '));
|
|
17
12
|
const overrides = parsed.data;
|
|
@@ -26,10 +21,13 @@ export const normalizeOverrides = (data, dir, source) => {
|
|
|
26
21
|
* The project file's mappings of folders outside the project (%VAR% expanded, links and short names followed). A repo
|
|
27
22
|
* ships this file, so these reach the rest of this PC: projects.allowOutsideMappings in YOUR settings decides.
|
|
28
23
|
*/
|
|
29
|
-
export
|
|
24
|
+
export function outsideMappings(dir, mappings = []) {
|
|
25
|
+
return mappings.filter((m) => !insideProject(dir, m.host));
|
|
26
|
+
}
|
|
30
27
|
/** `folder` (also where it really is, through links) is inside the project folder `dir`. */
|
|
31
28
|
export const insideProject = (dir, folder) => {
|
|
32
|
-
// Where a path really is: the nearest existing folder resolved (links, 8.3 short names), plus the part not created
|
|
29
|
+
// Where a path really is: the nearest existing folder resolved (links, 8.3 short names), plus the part not created
|
|
30
|
+
// yet.
|
|
33
31
|
const real = (p) => {
|
|
34
32
|
const full = path.resolve(p);
|
|
35
33
|
try {
|
|
@@ -45,8 +43,25 @@ export const insideProject = (dir, folder) => {
|
|
|
45
43
|
* Protections a project file may only make stricter, never looser. A repo can ship the file, so it must not be able to
|
|
46
44
|
* switch off what you turned on (or turn on what you turned off). The strictest of the two values always wins.
|
|
47
45
|
*/
|
|
48
|
-
export const ON_IS_SAFER = [
|
|
49
|
-
|
|
46
|
+
export const ON_IS_SAFER = [
|
|
47
|
+
'readOnly',
|
|
48
|
+
'workspaceFilter.enabled',
|
|
49
|
+
'network.blockPrivateRanges',
|
|
50
|
+
'sandbox.protectedClient',
|
|
51
|
+
'downloads.requireChecksum',
|
|
52
|
+
];
|
|
53
|
+
export const OFF_IS_SAFER = [
|
|
54
|
+
'sandbox.networking',
|
|
55
|
+
'sandbox.clipboard',
|
|
56
|
+
'sandbox.audioInput',
|
|
57
|
+
'sandbox.videoInput',
|
|
58
|
+
'sandbox.printerRedirection',
|
|
59
|
+
'sandbox.vGpu',
|
|
60
|
+
'claudeProfile.copyCredentials',
|
|
61
|
+
'claudeProfile.enabled',
|
|
62
|
+
'claudeProfile.syncHistory',
|
|
63
|
+
'claudeProfile.syncClaudeMem',
|
|
64
|
+
];
|
|
50
65
|
export const GIT_STRICTNESS = { full: 0, readonly: 1, none: 2 };
|
|
51
66
|
export const NEVER_LOOSER = [...ON_IS_SAFER, ...OFF_IS_SAFER, 'provisioning.git.access'];
|
|
52
67
|
const keepStrictest = (yours, merged) => {
|
|
@@ -59,7 +74,10 @@ const keepStrictest = (yours, merged) => {
|
|
|
59
74
|
export const loosenedRequests = (config, ov) => [
|
|
60
75
|
...ON_IS_SAFER.filter((p) => _.has(ov, p) && !_.get(ov, p) && _.get(config, p)),
|
|
61
76
|
...OFF_IS_SAFER.filter((p) => _.has(ov, p) && _.get(ov, p) && !_.get(config, p)),
|
|
62
|
-
...(_.has(ov, 'provisioning.git.access') &&
|
|
77
|
+
...(_.has(ov, 'provisioning.git.access') &&
|
|
78
|
+
GIT_STRICTNESS[_.get(ov, 'provisioning.git.access')] < GIT_STRICTNESS[config.provisioning.git.access]
|
|
79
|
+
? ['provisioning.git.access']
|
|
80
|
+
: []),
|
|
63
81
|
].map((key) => ({ key, wanted: _.get(ov, key), yours: _.get(config, key) }));
|
|
64
82
|
/** Applies validated overrides. Mappings with the same guest folder replace the configured ones. */
|
|
65
83
|
export const applyOverrides = (config, ov) => {
|
|
@@ -78,17 +96,27 @@ export const applyOverrides = (config, ov) => {
|
|
|
78
96
|
next.workspaceFilter.exclude = _.union(config.workspaceFilter.exclude, rest.workspaceFilter.exclude);
|
|
79
97
|
const sameGuest = (a, b) => Boolean(a && b && a.toLowerCase() === b.toLowerCase());
|
|
80
98
|
if (mappings)
|
|
81
|
-
next.mappings = [
|
|
99
|
+
next.mappings = [
|
|
100
|
+
..._.reject(config.mappings, (m) => mappings.some((o) => sameGuest(o.guest, m.guest))),
|
|
101
|
+
...mappings,
|
|
102
|
+
];
|
|
82
103
|
return next;
|
|
83
104
|
};
|
|
84
|
-
const flatten = (value, prefix = '') => _.isPlainObject(value)
|
|
105
|
+
const flatten = (value, prefix = '') => _.isPlainObject(value)
|
|
106
|
+
? Object.entries(value).flatMap(([k, v]) => flatten(v, prefix ? prefix + '.' + k : k))
|
|
107
|
+
: [prefix + ' = ' + JSON.stringify(value)];
|
|
85
108
|
/** Human-readable list of what a local config changes, with risky items flagged. */
|
|
86
109
|
export const describeOverrides = (ov, dir) => {
|
|
87
110
|
const { harness, mappings = [], scripts = [], $schema: _schema, ...sections } = ov;
|
|
88
111
|
const outside = dir ? outsideMappings(dir, mappings) : [];
|
|
89
112
|
const lines = [
|
|
90
113
|
...(harness ? ['agent = ' + harness] : []),
|
|
91
|
-
...mappings.map((m) => (m.readOnly ? 'read-only' : 'READ/WRITE') +
|
|
114
|
+
...mappings.map((m) => (m.readOnly ? 'read-only' : 'READ/WRITE') +
|
|
115
|
+
' folder ' +
|
|
116
|
+
m.host +
|
|
117
|
+
' -> ' +
|
|
118
|
+
(m.guest ?? 'the same path') +
|
|
119
|
+
(outside.includes(m) ? ' (outside the project)' : '')),
|
|
92
120
|
...scripts.map((s) => 'runs inside the sandbox: ' + s),
|
|
93
121
|
...flatten(sections),
|
|
94
122
|
];
|
|
@@ -99,41 +127,6 @@ export const describeOverrides = (ov, dir) => {
|
|
|
99
127
|
const limited = NEVER_LOOSER.filter((p) => _.has(sections, p)).map((p) => p + ' is only used if it is stricter than your own setting');
|
|
100
128
|
return [...lines, ...risky.map((r) => '!! ' + r), ...limited.map((r) => ' ' + r)];
|
|
101
129
|
};
|
|
102
|
-
export const readLocalConfig = (dir) => {
|
|
103
|
-
const file = path.join(dir, LOCAL_CONFIG_NAME);
|
|
104
|
-
if (!fileExists(file))
|
|
105
|
-
return null;
|
|
106
|
-
const raw = fs.readFileSync(file);
|
|
107
|
-
return { path: file, hash: crypto.createHash('sha256').update(raw).digest('hex'), data: parseJsonc(raw.toString('utf8'), file) };
|
|
108
|
-
};
|
|
109
|
-
// ---- approvals (host-only: <storage>\trusted-configs.json) ----------------------------------------------------------
|
|
110
|
-
export const trustStorePath = (storageRoot) => path.join(storageRoot, 'trusted-configs.json');
|
|
111
|
-
const loadTrust = (store) => tryReadJson(store) ?? {};
|
|
112
|
-
const key = (file) => path.resolve(file).toLowerCase();
|
|
113
|
-
export const isTrusted = (store, file, hash) => loadTrust(store)[key(file)] === hash;
|
|
114
|
-
export const saveTrust = (store, file, hash) => writeJson(store, { ...loadTrust(store), [key(file)]: hash });
|
|
115
|
-
// ---- looser settings you allowed for one project (host-only: <storage>\allowed-requests.json) ----------------------
|
|
116
|
-
// A project file can never loosen a protection by itself. When it asks, you are asked once (interactively); a "yes"
|
|
117
|
-
// is kept here, per project file and per "setting = value", so only that value is ever let through for that project.
|
|
118
|
-
export const allowStorePath = (storageRoot) => path.join(storageRoot, 'allowed-requests.json');
|
|
119
|
-
const loadAllowed = (store) => {
|
|
120
|
-
const parsed = z.record(z.string(), z.array(z.string().max(2000)).max(500)).safeParse(tryReadJson(store) ?? {});
|
|
121
|
-
return parsed.success ? parsed.data : {};
|
|
122
|
-
};
|
|
123
|
-
const allowKey = (setting, value) => setting + ' = ' + JSON.stringify(value);
|
|
124
|
-
/** true = you allowed it, false = you said no (not asked again), null = not asked yet. */
|
|
125
|
-
export const allowedAnswer = (store, file, setting, value) => {
|
|
126
|
-
const answers = loadAllowed(store)[key(file)] ?? [];
|
|
127
|
-
return answers.includes(allowKey(setting, value)) ? true : answers.includes('no: ' + allowKey(setting, value)) ? false : null;
|
|
128
|
-
};
|
|
129
|
-
export const saveAllowed = (store, file, setting, value, allow) => {
|
|
130
|
-
const all = loadAllowed(store);
|
|
131
|
-
const entry = allowKey(setting, value);
|
|
132
|
-
writeJson(store, { ...all, [key(file)]: _.union(_.without(all[key(file)] ?? [], entry, 'no: ' + entry), [(allow ? '' : 'no: ') + entry]) });
|
|
133
|
-
};
|
|
134
|
-
/** Answers for folders outside the project are kept with the others, one per folder (and read-only or not). */
|
|
135
|
-
export const OUTSIDE_FOLDER = 'folder outside the project';
|
|
136
|
-
export const outsideKey = (m) => (m.readOnly ? 'read-only ' : 'read/write ') + path.resolve(m.host).toLowerCase();
|
|
137
130
|
/** Your config with these requests let through, so applyOverrides' "strictest wins" keeps the project's value. */
|
|
138
131
|
export const allowRequests = (config, allowed) => {
|
|
139
132
|
const next = _.cloneDeep(config);
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Config } from '../types.js';
|
|
2
|
+
/** The protections of a running sandbox, by setting path (`sandbox.networking`, `provisioning.git.access`, ...). */
|
|
3
|
+
export type Protections = Record<string, boolean | string>;
|
|
4
|
+
export declare const protectionsOf: (config: Config) => Protections;
|
|
5
|
+
export interface JoinCheck {
|
|
6
|
+
/** Settings this project needs stricter than the running sandbox: the launch is refused. */
|
|
7
|
+
stricter: string[];
|
|
8
|
+
/** Settings it would have looser: it gets the sandbox's (stricter) value; shown as a note. */
|
|
9
|
+
looser: string[];
|
|
10
|
+
/** Settings the sandbox turned on at its start for another project you allowed them for: shared, shown as a note. */
|
|
11
|
+
shared: string[];
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Compares a project's effective protections with the running sandbox's. Hub projects are always read/write
|
|
15
|
+
* (Windows Sandbox maps the hub once, read/write), so a read-only project counts as stricter. `widened`: the boot
|
|
16
|
+
* settings the sandbox turned on for another of its projects (with your consent); a project that has them off
|
|
17
|
+
* shares them instead of being refused.
|
|
18
|
+
*/
|
|
19
|
+
export declare const checkJoin: (running: Protections, wanted: Protections, widened?: string[]) => JoinCheck;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// Joining a running sandbox from another project. Its protections (network, LAN block, git access, clipboard, the
|
|
2
|
+
// .wsb device settings, read-only) are machine-wide: they were fixed when the sandbox booted for the first project.
|
|
3
|
+
// A second project may never loosen them, and a project that needs a STRICTER setting than the running sandbox has
|
|
4
|
+
// cannot get it there without changing it for the sessions already running, so that launch is refused with a clear
|
|
5
|
+
// message. A project asking for less than the sandbox has simply runs with the sandbox's (stricter) setting.
|
|
6
|
+
// Pure: the host checks it before registering a project, the tests drive it directly.
|
|
7
|
+
import _ from 'lodash';
|
|
8
|
+
import { GIT_STRICTNESS, NEVER_LOOSER, OFF_IS_SAFER, ON_IS_SAFER } from './overrides.js';
|
|
9
|
+
export const protectionsOf = (config) => Object.fromEntries(NEVER_LOOSER.map((p) => [p, _.get(config, p)]));
|
|
10
|
+
/** 1 = `wanted` is stricter than `running`, -1 = looser, 0 = the same. */
|
|
11
|
+
const compare = (setting, running, wanted) => {
|
|
12
|
+
if (setting === 'provisioning.git.access')
|
|
13
|
+
return Math.sign((GIT_STRICTNESS[String(wanted)] ?? 0) - (GIT_STRICTNESS[String(running)] ?? 0));
|
|
14
|
+
if (ON_IS_SAFER.includes(setting))
|
|
15
|
+
return Number(Boolean(wanted)) - Number(Boolean(running));
|
|
16
|
+
if (OFF_IS_SAFER.includes(setting))
|
|
17
|
+
return Number(Boolean(running)) - Number(Boolean(wanted));
|
|
18
|
+
return 0;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Compares a project's effective protections with the running sandbox's. Hub projects are always read/write
|
|
22
|
+
* (Windows Sandbox maps the hub once, read/write), so a read-only project counts as stricter. `widened`: the boot
|
|
23
|
+
* settings the sandbox turned on for another of its projects (with your consent); a project that has them off
|
|
24
|
+
* shares them instead of being refused.
|
|
25
|
+
*/
|
|
26
|
+
export const checkJoin = (running, wanted, widened = []) => {
|
|
27
|
+
const stricter = [];
|
|
28
|
+
const looser = [];
|
|
29
|
+
const shared = [];
|
|
30
|
+
for (const setting of NEVER_LOOSER) {
|
|
31
|
+
const result = compare(setting, setting === 'readOnly' ? false : running[setting], wanted[setting]);
|
|
32
|
+
if (result > 0 && widened.includes(setting))
|
|
33
|
+
shared.push(setting);
|
|
34
|
+
else if (result > 0)
|
|
35
|
+
stricter.push(setting +
|
|
36
|
+
' = ' +
|
|
37
|
+
JSON.stringify(wanted[setting]) +
|
|
38
|
+
' (the running sandbox has ' +
|
|
39
|
+
JSON.stringify(setting === 'readOnly' ? false : running[setting]) +
|
|
40
|
+
')');
|
|
41
|
+
if (result < 0)
|
|
42
|
+
looser.push(setting + ' stays ' + JSON.stringify(running[setting]));
|
|
43
|
+
}
|
|
44
|
+
return { stricter, looser, shared };
|
|
45
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare const trustStorePath: (storageRoot: string) => string;
|
|
2
|
+
export declare const isTrusted: (store: string, file: string, hash: string) => boolean;
|
|
3
|
+
export declare const saveTrust: (store: string, file: string, hash: string) => void;
|
|
4
|
+
export declare const allowStorePath: (storageRoot: string) => string;
|
|
5
|
+
/** true = you allowed it, false = you said no (not asked again), null = not asked yet. */
|
|
6
|
+
export declare const allowedAnswer: (store: string, file: string, setting: string, value: unknown) => boolean | null;
|
|
7
|
+
export declare const saveAllowed: (store: string, file: string, setting: string, value: unknown, allow: boolean) => void;
|
|
8
|
+
/** Answers for folders outside the project are kept with the others, one per folder (and read-only or not). */
|
|
9
|
+
export declare const OUTSIDE_FOLDER = "folder outside the project";
|
|
10
|
+
export declare function outsideKey(m: {
|
|
11
|
+
host: string;
|
|
12
|
+
readOnly: boolean;
|
|
13
|
+
}): string;
|