windows-development-sandbox 1.5.0 → 1.9.0
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/README.md +1 -0
- package/config.example.json +27 -1
- package/dist/app/context.d.ts +8 -0
- package/dist/app/context.js +12 -0
- package/dist/app/features/defs.d.ts +322 -0
- package/dist/app/features/defs.js +28 -0
- package/dist/app/features/sandbox/index.d.ts +2 -0
- package/dist/app/features/sandbox/index.js +3 -0
- package/dist/app/features/sandbox/sandbox.def.d.ts +193 -0
- package/dist/app/features/sandbox/sandbox.def.js +245 -0
- package/dist/app/features/sandbox/sandbox.run.d.ts +72 -0
- package/dist/app/features/sandbox/sandbox.run.js +98 -0
- package/dist/app/features/sessions/index.d.ts +2 -0
- package/dist/app/features/sessions/index.js +3 -0
- package/dist/app/features/sessions/sessions.def.d.ts +141 -0
- package/dist/app/features/sessions/sessions.def.js +176 -0
- package/dist/app/features/sessions/sessions.run.d.ts +39 -0
- package/dist/app/features/sessions/sessions.run.js +58 -0
- package/dist/{cli/menu/settings/categories.d.ts → app/features/settings/categories.def.d.ts} +4 -0
- package/dist/{cli/menu/settings/categories.js → app/features/settings/categories.def.js} +40 -46
- package/dist/app/features/settings/index.d.ts +5 -0
- package/dist/app/features/settings/index.js +6 -0
- package/dist/{cli/menu/settings/config-file.d.ts → app/features/settings/settings-file.d.ts} +1 -1
- package/dist/{cli/menu/settings/config-file.js → app/features/settings/settings-file.js} +1 -1
- package/dist/app/features/settings/settings-rows.d.ts +35 -0
- package/dist/app/features/settings/settings-rows.js +94 -0
- package/dist/app/features/settings/settings.def.d.ts +157 -0
- package/dist/app/features/settings/settings.def.js +179 -0
- package/dist/app/features/settings/settings.run.d.ts +67 -0
- package/dist/app/features/settings/settings.run.js +84 -0
- package/dist/app/kernel/define.d.ts +143 -0
- package/dist/app/kernel/define.js +42 -0
- package/dist/app/kernel/errors.d.ts +34 -0
- package/dist/app/kernel/errors.js +45 -0
- package/dist/app/kernel/fields.d.ts +70 -0
- package/dist/app/kernel/fields.js +243 -0
- package/dist/app/kernel/index.d.ts +8 -0
- package/dist/app/kernel/index.js +10 -0
- package/dist/app/kernel/io.d.ts +193 -0
- package/dist/app/kernel/io.js +126 -0
- package/dist/app/kernel/rpc.d.ts +156 -0
- package/dist/app/kernel/rpc.js +47 -0
- package/dist/{cli/menu/settings → app/kernel}/schema-node.d.ts +9 -0
- package/dist/{cli/menu/settings → app/kernel}/schema-node.js +26 -0
- package/dist/app/kernel/text.d.ts +6 -0
- package/dist/app/kernel/text.js +57 -0
- package/dist/app/kernel/view.d.ts +146 -0
- package/dist/app/kernel/view.js +28 -0
- package/dist/app/registry.d.ts +10 -0
- package/dist/app/registry.js +50 -0
- package/dist/cli/args.d.ts +18 -2
- package/dist/cli/args.js +101 -24
- package/dist/cli/commands/accounts.js +45 -17
- package/dist/cli/commands/context.d.ts +2 -0
- package/dist/cli/commands/context.js +9 -2
- package/dist/cli/commands/data/clean.js +32 -9
- package/dist/cli/commands/engine.d.ts +2 -0
- package/dist/cli/commands/engine.js +60 -0
- package/dist/cli/commands/index.d.ts +2 -1
- package/dist/cli/commands/index.js +2 -1
- package/dist/cli/commands/launch/add-root.d.ts +3 -2
- package/dist/cli/commands/launch/add-root.js +11 -10
- package/dist/cli/commands/launch/launch.js +102 -9
- package/dist/cli/commands/launch/prepare.js +6 -4
- package/dist/cli/commands/launch/running.js +2 -1
- package/dist/cli/commands/launch/summary.d.ts +2 -0
- package/dist/cli/commands/maintenance/audit.js +1 -1
- package/dist/cli/commands/maintenance/clean.d.ts +1 -1
- package/dist/cli/commands/maintenance/clean.js +17 -3
- package/dist/cli/commands/maintenance/config-share.d.ts +12 -0
- package/dist/cli/commands/maintenance/config-share.js +80 -0
- package/dist/cli/commands/maintenance/config.d.ts +1 -1
- package/dist/cli/commands/maintenance/config.js +38 -10
- package/dist/cli/commands/maintenance/doctor.d.ts +1 -1
- package/dist/cli/commands/maintenance/doctor.js +2 -4
- package/dist/cli/commands/maintenance/logs.js +14 -0
- package/dist/cli/commands/maintenance/migrate.d.ts +2 -1
- package/dist/cli/commands/maintenance/migrate.js +19 -4
- package/dist/cli/commands/maintenance/sync.js +2 -0
- package/dist/cli/commands/maintenance/update.d.ts +2 -0
- package/dist/cli/commands/maintenance/update.js +27 -4
- package/dist/cli/commands/projects/here.js +12 -7
- package/dist/cli/commands/projects/projects.js +26 -17
- package/dist/cli/commands/registry.js +10 -7
- package/dist/cli/commands/repair/checks/agents.d.ts +2 -0
- package/dist/cli/commands/repair/checks/agents.js +70 -0
- package/dist/cli/commands/repair/checks/common.d.ts +8 -0
- package/dist/cli/commands/repair/checks/common.js +22 -0
- package/dist/cli/commands/repair/checks/contained.d.ts +2 -0
- package/dist/cli/commands/repair/checks/contained.js +139 -0
- package/dist/cli/commands/repair/checks/data.d.ts +2 -0
- package/dist/cli/commands/repair/checks/data.js +241 -0
- package/dist/cli/commands/repair/checks/hcs.d.ts +7 -0
- package/dist/cli/commands/repair/checks/hcs.js +28 -0
- package/dist/cli/commands/repair/checks/index.d.ts +2 -0
- package/dist/cli/commands/repair/checks/index.js +24 -0
- package/dist/cli/commands/repair/checks/install.d.ts +5 -0
- package/dist/cli/commands/repair/checks/install.js +318 -0
- package/dist/cli/commands/repair/checks/machine.d.ts +2 -0
- package/dist/cli/commands/repair/checks/machine.js +232 -0
- package/dist/cli/commands/repair/checks/network.d.ts +6 -0
- package/dist/cli/commands/repair/checks/network.js +60 -0
- package/dist/cli/commands/repair/checks/pc.d.ts +4 -0
- package/dist/cli/commands/repair/checks/pc.js +86 -0
- package/dist/cli/commands/repair/checks/sandbox.d.ts +2 -0
- package/dist/cli/commands/repair/checks/sandbox.js +282 -0
- package/dist/cli/commands/repair/checks/settings.d.ts +2 -0
- package/dist/cli/commands/repair/checks/settings.js +169 -0
- package/dist/cli/commands/repair/checks/vpn.d.ts +2 -0
- package/dist/cli/commands/repair/checks/vpn.js +78 -0
- package/dist/cli/commands/repair/engine.d.ts +32 -0
- package/dist/cli/commands/repair/engine.js +127 -0
- package/dist/cli/commands/repair/env.d.ts +7 -0
- package/dist/cli/commands/repair/env.js +50 -0
- package/dist/cli/commands/repair/index.d.ts +1 -9
- package/dist/cli/commands/repair/index.js +2 -54
- package/dist/cli/commands/repair/log.d.ts +17 -0
- package/dist/cli/commands/repair/log.js +82 -0
- package/dist/cli/commands/repair/printer.d.ts +32 -0
- package/dist/cli/commands/repair/printer.js +132 -0
- package/dist/cli/commands/repair/run.d.ts +33 -0
- package/dist/cli/commands/repair/run.js +133 -0
- package/dist/cli/commands/repair/types.d.ts +97 -9
- package/dist/cli/commands/repair/types.js +11 -7
- package/dist/cli/commands/resume.js +2 -2
- package/dist/cli/commands/sessions/index.d.ts +0 -4
- package/dist/cli/commands/sessions/index.js +3 -7
- package/dist/cli/commands/setup/index.d.ts +5 -0
- package/dist/cli/commands/setup/index.js +25 -1
- package/dist/cli/commands/shared-use.d.ts +5 -2
- package/dist/cli/commands/shared-use.js +11 -8
- package/dist/cli/commands/storage/contained.d.ts +3 -0
- package/dist/cli/commands/storage/contained.js +179 -0
- package/dist/cli/commands/storage/index.d.ts +2 -0
- package/dist/cli/commands/storage/index.js +2 -0
- package/dist/cli/commands/storage/offer.d.ts +3 -0
- package/dist/cli/commands/storage/offer.js +91 -0
- package/dist/cli/commands/storage/storage.d.ts +8 -0
- package/dist/cli/commands/storage/storage.js +179 -0
- package/dist/cli/commands/user-config.js +2 -2
- package/dist/cli/commands/vpn.d.ts +4 -0
- package/dist/cli/commands/vpn.js +91 -0
- package/dist/cli/commands/web.d.ts +4 -0
- package/dist/cli/commands/web.js +97 -0
- package/dist/cli/history.js +1 -1
- package/dist/cli/index.js +48 -4
- package/dist/cli/manifest.d.ts +339 -97
- package/dist/cli/manifest.js +222 -67
- package/dist/cli/menu/add-agent.d.ts +47 -0
- package/dist/cli/menu/add-agent.js +168 -0
- package/dist/cli/menu/apps.d.ts +38 -3
- package/dist/cli/menu/apps.js +80 -5
- package/dist/cli/menu/command-fields.d.ts +18 -0
- package/dist/cli/menu/command-fields.js +61 -0
- package/dist/cli/menu/command-form.d.ts +22 -0
- package/dist/cli/menu/command-form.js +169 -46
- package/dist/cli/menu/data-folder.d.ts +18 -0
- package/dist/cli/menu/data-folder.js +99 -0
- package/dist/cli/menu/io-menu.d.ts +29 -0
- package/dist/cli/menu/io-menu.js +126 -0
- package/dist/cli/menu/live.d.ts +27 -0
- package/dist/cli/menu/live.js +69 -0
- package/dist/cli/menu/memory.d.ts +19 -0
- package/dist/cli/menu/memory.js +53 -0
- package/dist/cli/menu/menu.d.ts +11 -2
- package/dist/cli/menu/menu.js +36 -15
- package/dist/cli/menu/pages/accounts-page.js +55 -24
- package/dist/cli/menu/pages/agents-page.d.ts +68 -0
- package/dist/cli/menu/pages/agents-page.js +345 -0
- package/dist/cli/menu/pages/apps-page.d.ts +3 -1
- package/dist/cli/menu/pages/apps-page.js +20 -4
- package/dist/cli/menu/pages/list-page.d.ts +43 -3
- package/dist/cli/menu/pages/list-page.js +146 -12
- package/dist/cli/menu/pages/maintenance-page.d.ts +9 -5
- package/dist/cli/menu/pages/maintenance-page.js +172 -85
- package/dist/cli/menu/pages/sandbox-page.d.ts +7 -6
- package/dist/cli/menu/pages/sandbox-page.js +117 -120
- package/dist/cli/menu/pages/scopes.d.ts +1 -1
- package/dist/cli/menu/pages/sessions-page.d.ts +6 -8
- package/dist/cli/menu/pages/sessions-page.js +22 -75
- package/dist/cli/menu/pages/settings-page.d.ts +10 -14
- package/dist/cli/menu/pages/settings-page.js +95 -102
- package/dist/cli/menu/render-view.d.ts +28 -0
- package/dist/cli/menu/render-view.js +112 -0
- package/dist/cli/menu/settings/ask-path.d.ts +14 -0
- package/dist/cli/menu/settings/ask-path.js +14 -0
- package/dist/cli/menu/settings/collections/collection-editor.d.ts +8 -2
- package/dist/cli/menu/settings/collections/collection-editor.js +12 -8
- package/dist/cli/menu/settings/collections/map-editor.js +5 -1
- package/dist/cli/menu/settings/collections/object-list-editor.js +2 -2
- package/dist/cli/menu/settings/collections/object-map-editor.js +2 -2
- package/dist/cli/menu/settings/collections/string-list-editor.d.ts +10 -1
- package/dist/cli/menu/settings/collections/string-list-editor.js +23 -0
- package/dist/cli/menu/settings/draft.d.ts +1 -1
- package/dist/cli/menu/settings/format.d.ts +1 -3
- package/dist/cli/menu/settings/format.js +6 -36
- package/dist/cli/menu/settings/index.d.ts +1 -3
- package/dist/cli/menu/settings/index.js +3 -3
- package/dist/cli/menu/settings/object-editor.d.ts +6 -2
- package/dist/cli/menu/settings/object-editor.js +15 -4
- package/dist/cli/menu/settings/share.d.ts +36 -0
- package/dist/cli/menu/settings/share.js +131 -0
- package/dist/cli/menu/settings/value-editor.d.ts +10 -1
- package/dist/cli/menu/settings/value-editor.js +99 -63
- package/dist/cli/menu/several.js +7 -5
- package/dist/cli/menu/share-settings.d.ts +21 -0
- package/dist/cli/menu/share-settings.js +112 -0
- package/dist/cli/menu/shell.d.ts +53 -10
- package/dist/cli/menu/shell.js +115 -10
- package/dist/cli/menu/views.d.ts +7 -0
- package/dist/cli/menu/views.js +11 -0
- package/dist/cli/menu/vpn-login.d.ts +16 -0
- package/dist/cli/menu/vpn-login.js +74 -0
- package/dist/cli/operations/handler.d.ts +6 -0
- package/dist/cli/operations/handler.js +61 -0
- package/dist/cli/operations/index.d.ts +4 -0
- package/dist/cli/operations/index.js +5 -0
- package/dist/cli/operations/input.d.ts +6 -0
- package/dist/cli/operations/input.js +37 -0
- package/dist/cli/operations/io-cli.d.ts +7 -0
- package/dist/cli/operations/io-cli.js +62 -0
- package/dist/cli/operations/spec.d.ts +18 -0
- package/dist/cli/operations/spec.js +108 -0
- package/dist/cli/output/colors.d.ts +2 -2
- package/dist/cli/output/colors.js +2 -11
- package/dist/cli/output/index.d.ts +1 -0
- package/dist/cli/output/index.js +1 -0
- package/dist/cli/output/print.d.ts +5 -1
- package/dist/cli/output/print.js +15 -4
- package/dist/cli/output/progress.d.ts +15 -0
- package/dist/cli/output/progress.js +44 -0
- package/dist/cli/output/render-view.d.ts +4 -0
- package/dist/cli/output/render-view.js +63 -0
- package/dist/cli/services/accounts-service.d.ts +2 -0
- package/dist/cli/services/accounts-service.js +2 -2
- package/dist/cli/services/agent-commands-service.d.ts +2 -0
- package/dist/cli/services/agent-commands-service.js +11 -2
- package/dist/cli/services/health-service.d.ts +0 -6
- package/dist/cli/services/health-service.js +5 -42
- package/dist/cli/services/index.d.ts +3 -1
- package/dist/cli/services/index.js +3 -1
- package/dist/cli/services/logs-service.js +4 -3
- package/dist/cli/services/migrate-service.js +1 -1
- package/dist/cli/services/update-service.d.ts +2 -0
- package/dist/cli/services/update-service.js +13 -6
- package/dist/cli/services/vpn-service.d.ts +28 -0
- package/dist/cli/services/vpn-service.js +46 -0
- package/dist/cli/services/web-service.d.ts +22 -0
- package/dist/cli/services/web-service.js +111 -0
- package/dist/cli/tui/app.d.ts +12 -4
- package/dist/cli/tui/app.js +38 -9
- package/dist/cli/tui/dialogs/path-listing.d.ts +43 -0
- package/dist/cli/tui/dialogs/path-listing.js +127 -0
- package/dist/cli/tui/dialogs/path-picker.d.ts +67 -0
- package/dist/cli/tui/dialogs/path-picker.js +423 -0
- package/dist/cli/tui/dialogs/text-screen.d.ts +6 -0
- package/dist/cli/tui/dialogs/text-screen.js +10 -3
- package/dist/cli/tui/frame.d.ts +7 -10
- package/dist/cli/tui/frame.js +19 -10
- package/dist/cli/tui/index.d.ts +4 -3
- package/dist/cli/tui/index.js +2 -1
- package/dist/cli/tui/list/list-screen.d.ts +28 -2
- package/dist/cli/tui/list/list-screen.js +130 -66
- package/dist/cli/tui/list/list-types.d.ts +10 -4
- package/dist/cli/tui/nav.d.ts +29 -0
- package/dist/cli/tui/nav.js +67 -0
- package/dist/cli/tui/terminal.d.ts +7 -0
- package/dist/cli/tui/terminal.js +30 -10
- package/dist/cli/validate.d.ts +1 -1
- package/dist/cli/validate.js +3 -3
- package/dist/cli/version.d.ts +2 -0
- package/dist/cli/version.js +11 -0
- package/dist/core/config/defaults.js +13 -1
- package/dist/core/config/loader.js +12 -2
- package/dist/core/local-config/overrides.js +1 -0
- package/dist/core/prompt.d.ts +19 -0
- package/dist/core/prompt.js +43 -3
- package/dist/core/schema/common.d.ts +6 -0
- package/dist/core/schema/common.js +8 -0
- package/dist/core/schema/config.d.ts +36 -0
- package/dist/core/schema/config.js +26 -2
- package/dist/core/schema/harness.d.ts +2 -0
- package/dist/core/schema/harness.js +13 -2
- package/dist/core/schema/index.d.ts +3 -1
- package/dist/core/schema/index.js +3 -1
- package/dist/core/schema/profile.d.ts +1 -0
- package/dist/core/schema/profile.js +3 -0
- package/dist/core/schema/redact.d.ts +13 -0
- package/dist/core/schema/redact.js +75 -0
- package/dist/core/schema/sandbox.d.ts +6 -0
- package/dist/core/schema/sandbox.js +21 -3
- package/dist/core/schema/vpn.d.ts +18 -0
- package/dist/core/schema/vpn.js +22 -0
- package/dist/core/schema/web.d.ts +6 -0
- package/dist/core/schema/web.js +14 -0
- package/dist/core/types.d.ts +44 -0
- package/dist/core/util/fs.d.ts +2 -0
- package/dist/core/util/fs.js +9 -0
- package/dist/core/util/index.d.ts +1 -1
- package/dist/core/util/index.js +1 -1
- package/dist/guest/agents/agent-files.d.ts +54 -0
- package/dist/guest/agents/agent-files.js +67 -0
- package/dist/guest/agents/agent-installer.js +2 -9
- package/dist/guest/agents/local-state.d.ts +14 -0
- package/dist/guest/agents/local-state.js +218 -0
- package/dist/guest/agents/sbx-agent.d.ts +2 -0
- package/dist/guest/agents/sbx-agent.js +35 -0
- package/dist/guest/boot/boot.d.ts +4 -0
- package/dist/guest/boot/boot.js +51 -11
- package/dist/guest/daemon/daemon.js +8 -1
- package/dist/guest/daemon/exec.js +2 -1
- package/dist/guest/daemon/idle-shutdown.js +2 -0
- package/dist/guest/daemon/sessions.d.ts +5 -0
- package/dist/guest/daemon/sessions.js +20 -3
- package/dist/guest/entries/agent.d.ts +1 -0
- package/dist/guest/entries/agent.js +10 -0
- package/dist/guest/entries/daemon.js +5 -0
- package/dist/guest/governor/decide.d.ts +61 -0
- package/dist/guest/governor/decide.js +182 -0
- package/dist/guest/governor/governor.d.ts +42 -0
- package/dist/guest/governor/governor.js +214 -0
- package/dist/guest/governor/index.d.ts +2 -0
- package/dist/guest/governor/index.js +2 -0
- package/dist/guest/runtime/csc.d.ts +2 -0
- package/dist/guest/runtime/csc.js +2 -0
- package/dist/guest/runtime/secrets.d.ts +12 -0
- package/dist/guest/runtime/secrets.js +63 -0
- package/dist/guest/sessions/viewer.js +3 -1
- package/dist/guest/setup/claude-profile.d.ts +2 -1
- package/dist/guest/setup/claude-profile.js +12 -1
- package/dist/guest/setup/environment.d.ts +6 -0
- package/dist/guest/setup/environment.js +56 -6
- package/dist/guest/setup/path-plan.d.ts +32 -0
- package/dist/guest/setup/path-plan.js +67 -0
- package/dist/guest/setup/shell-path.d.ts +1 -0
- package/dist/guest/setup/shell-path.js +22 -0
- package/dist/guest/toolchains/languages/python.js +1 -1
- package/dist/guest/toolchains/native/rust-extras.js +4 -2
- package/dist/guest/toolchains/runtimes.js +2 -2
- package/dist/guest/vpn/index.d.ts +1 -0
- package/dist/guest/vpn/index.js +1 -0
- package/dist/guest/vpn/openvpn.d.ts +9 -0
- package/dist/guest/vpn/openvpn.js +47 -0
- package/dist/guest/vpn/tunnel.d.ts +17 -0
- package/dist/guest/vpn/tunnel.js +78 -0
- package/dist/guest/vpn/vpn.d.ts +6 -0
- package/dist/guest/vpn/vpn.js +174 -0
- package/dist/guest/vpn/wireguard.d.ts +32 -0
- package/dist/guest/vpn/wireguard.js +132 -0
- package/dist/host/agent-commands/commands.d.ts +4 -0
- package/dist/host/agent-commands/commands.js +31 -7
- package/dist/host/audit/log.d.ts +1 -1
- package/dist/host/channel/attach.d.ts +6 -2
- package/dist/host/channel/attach.js +6 -3
- package/dist/host/channel/channel.d.ts +9 -0
- package/dist/host/channel/channel.js +30 -2
- package/dist/host/engines/engine.d.ts +12 -0
- package/dist/host/engines/engine.js +1 -0
- package/dist/host/engines/hcs/check.d.ts +25 -0
- package/dist/host/engines/hcs/check.js +95 -0
- package/dist/host/engines/hcs/documents.d.ts +44 -0
- package/dist/host/engines/hcs/documents.js +155 -0
- package/dist/host/engines/hcs/engine.d.ts +39 -0
- package/dist/host/engines/hcs/engine.js +171 -0
- package/dist/host/engines/hcs/helper.d.ts +43 -0
- package/dist/host/engines/hcs/helper.js +173 -0
- package/dist/host/engines/hcs/images.d.ts +37 -0
- package/dist/host/engines/hcs/images.js +152 -0
- package/dist/host/engines/index.d.ts +7 -0
- package/dist/host/engines/index.js +5 -0
- package/dist/host/engines/registry.d.ts +16 -0
- package/dist/host/engines/registry.js +30 -0
- package/dist/host/engines/types.d.ts +58 -0
- package/dist/host/engines/types.js +1 -0
- package/dist/host/engines/windows-sandbox/engine.d.ts +16 -0
- package/dist/host/engines/windows-sandbox/engine.js +63 -0
- package/dist/host/engines/windows-sandbox/wsb-text.d.ts +2 -0
- package/dist/host/engines/windows-sandbox/wsb-text.js +29 -0
- package/dist/host/health/acl-read.d.ts +17 -0
- package/dist/host/health/acl-read.js +45 -0
- package/dist/host/health/config-backup.d.ts +11 -0
- package/dist/host/health/config-backup.js +73 -0
- package/dist/host/health/index.d.ts +6 -0
- package/dist/host/health/index.js +7 -0
- package/dist/host/health/install-state.d.ts +33 -0
- package/dist/host/health/install-state.js +110 -0
- package/dist/host/health/path-copies.d.ts +32 -0
- package/dist/host/health/path-copies.js +82 -0
- package/dist/host/health/stale.d.ts +45 -0
- package/dist/host/health/stale.js +120 -0
- package/dist/host/health/system.d.ts +37 -0
- package/dist/host/health/system.js +87 -0
- package/dist/host/install/copies.d.ts +13 -0
- package/dist/host/install/copies.js +63 -0
- package/dist/host/install/index.d.ts +1 -0
- package/dist/host/install/index.js +1 -0
- package/dist/host/launch/generate.d.ts +5 -1
- package/dist/host/launch/generate.js +73 -7
- package/dist/host/launch/index.d.ts +3 -1
- package/dist/host/launch/index.js +3 -1
- package/dist/host/launch/launch-plan.d.ts +13 -0
- package/dist/host/launch/launch-plan.js +26 -0
- package/dist/host/launch/mappings.js +2 -1
- package/dist/host/launch/risk-notes.d.ts +10 -0
- package/dist/host/launch/risk-notes.js +18 -0
- package/dist/host/launch/session-file.d.ts +2 -0
- package/dist/host/launch/session-file.js +11 -2
- package/dist/host/launch/stage.js +1 -1
- package/dist/host/launch/wsb-file.d.ts +28 -4
- package/dist/host/launch/wsb-file.js +61 -42
- package/dist/host/life/crash-report.d.ts +27 -1
- package/dist/host/life/crash-report.js +173 -7
- package/dist/host/life/host-memory.d.ts +40 -0
- package/dist/host/life/host-memory.js +137 -0
- package/dist/host/life/index.d.ts +2 -0
- package/dist/host/life/index.js +2 -0
- package/dist/host/life/stop-events.d.ts +2 -0
- package/dist/host/life/stop-events.js +20 -3
- package/dist/host/life/stop-warning.js +1 -1
- package/dist/host/life/watchdog.d.ts +54 -0
- package/dist/host/life/watchdog.js +108 -0
- package/dist/host/migrate/backup.js +3 -0
- package/dist/host/migrate/migrations/config-file.d.ts +2 -0
- package/dist/host/migrate/migrations/config-file.js +7 -0
- package/dist/host/migrate/migrations/follow-machine-storage.js +9 -1
- package/dist/host/migrate/migrations/pin-storage-root.d.ts +4 -0
- package/dist/host/migrate/migrations/pin-storage-root.js +46 -0
- package/dist/host/migrate/migrations/unpin-config-defaults.js +4 -1
- package/dist/host/migrate/registry.js +2 -1
- package/dist/host/native.d.ts +3 -2
- package/dist/host/native.js +22 -3
- package/dist/host/profile/accounts.d.ts +25 -1
- package/dist/host/profile/accounts.js +96 -13
- package/dist/host/profile/agent-accounts.d.ts +5 -1
- package/dist/host/profile/agent-accounts.js +35 -5
- package/dist/host/profile/claude-login.js +3 -2
- package/dist/host/profile/index.d.ts +2 -1
- package/dist/host/profile/index.js +1 -0
- package/dist/host/profile/plugin-share.d.ts +26 -0
- package/dist/host/profile/plugin-share.js +146 -0
- package/dist/host/projects/join.d.ts +7 -1
- package/dist/host/projects/join.js +21 -4
- package/dist/host/projects/registry.d.ts +16 -10
- package/dist/host/projects/registry.js +74 -6
- package/dist/host/sandbox/contained-deps.d.ts +2 -0
- package/dist/host/sandbox/contained-deps.js +17 -0
- package/dist/host/sandbox/index.d.ts +2 -0
- package/dist/host/sandbox/index.js +2 -0
- package/dist/host/sandbox/platform.d.ts +4 -0
- package/dist/host/sandbox/platform.js +23 -4
- package/dist/host/sandbox/tasklist.d.ts +13 -0
- package/dist/host/sandbox/tasklist.js +47 -0
- package/dist/host/secrets/index.d.ts +2 -0
- package/dist/host/secrets/index.js +2 -0
- package/dist/host/secrets/launch-secrets.d.ts +17 -0
- package/dist/host/secrets/launch-secrets.js +94 -0
- package/dist/host/secrets/secret-store.d.ts +25 -0
- package/dist/host/secrets/secret-store.js +89 -0
- package/dist/host/sharing/acl.d.ts +16 -2
- package/dist/host/sharing/acl.js +35 -10
- package/dist/host/sharing/current.js +8 -3
- package/dist/host/sharing/doctor.d.ts +2 -0
- package/dist/host/sharing/doctor.js +44 -0
- package/dist/host/sharing/group-access.d.ts +6 -0
- package/dist/host/sharing/group-access.js +24 -0
- package/dist/host/sharing/index.d.ts +2 -1
- package/dist/host/sharing/index.js +2 -1
- package/dist/host/sharing/lifecycle.d.ts +8 -2
- package/dist/host/sharing/lifecycle.js +16 -7
- package/dist/host/storage/cleanup.d.ts +2 -0
- package/dist/host/storage/cleanup.js +2 -1
- package/dist/host/storage/contained/check.d.ts +9 -0
- package/dist/host/storage/contained/check.js +37 -0
- package/dist/host/storage/contained/contained-storage.d.ts +66 -0
- package/dist/host/storage/contained/contained-storage.js +168 -0
- package/dist/host/storage/contained/disk-port.d.ts +43 -0
- package/dist/host/storage/contained/disk-port.js +122 -0
- package/dist/host/storage/contained/index.d.ts +9 -0
- package/dist/host/storage/contained/index.js +8 -0
- package/dist/host/storage/contained/layout.d.ts +28 -0
- package/dist/host/storage/contained/layout.js +45 -0
- package/dist/host/storage/contained/resolve.d.ts +4 -0
- package/dist/host/storage/contained/resolve.js +30 -0
- package/dist/host/storage/contained/setting.d.ts +1 -0
- package/dist/host/storage/contained/setting.js +5 -0
- package/dist/host/storage/contained/state.d.ts +89 -0
- package/dist/host/storage/contained/state.js +166 -0
- package/dist/host/storage/contained/transfer.d.ts +24 -0
- package/dist/host/storage/contained/transfer.js +121 -0
- package/dist/host/storage/history.d.ts +21 -0
- package/dist/host/storage/history.js +49 -0
- package/dist/host/storage/index.d.ts +6 -0
- package/dist/host/storage/index.js +6 -0
- package/dist/host/storage/move.d.ts +95 -0
- package/dist/host/storage/move.js +384 -0
- package/dist/host/storage/offer.d.ts +11 -0
- package/dist/host/storage/offer.js +36 -0
- package/dist/host/storage/providers/contained.d.ts +15 -0
- package/dist/host/storage/providers/contained.js +39 -0
- package/dist/host/storage/providers/folder.d.ts +12 -0
- package/dist/host/storage/providers/folder.js +20 -0
- package/dist/host/storage/providers/index.d.ts +4 -0
- package/dist/host/storage/providers/index.js +3 -0
- package/dist/host/storage/providers/registry.d.ts +9 -0
- package/dist/host/storage/providers/registry.js +14 -0
- package/dist/host/storage/providers/types.d.ts +33 -0
- package/dist/host/storage/providers/types.js +1 -0
- package/dist/host/storage/root.d.ts +18 -0
- package/dist/host/storage/root.js +77 -0
- package/dist/host/tools/conpty.js +3 -2
- package/dist/host/tools/windows-terminal.d.ts +2 -0
- package/dist/host/tools/windows-terminal.js +31 -12
- package/dist/host/update/index.d.ts +1 -1
- package/dist/host/update/index.js +1 -1
- package/dist/host/update/notice.d.ts +2 -0
- package/dist/host/update/notice.js +13 -1
- package/dist/host/update/update-state.d.ts +6 -0
- package/dist/host/update/update-state.js +2 -0
- package/dist/host/update/updater.d.ts +19 -0
- package/dist/host/update/updater.js +88 -12
- package/dist/host/vpn/index.d.ts +4 -0
- package/dist/host/vpn/index.js +4 -0
- package/dist/host/vpn/login.d.ts +24 -0
- package/dist/host/vpn/login.js +79 -0
- package/dist/host/vpn/nordvpn.d.ts +21 -0
- package/dist/host/vpn/nordvpn.js +77 -0
- package/dist/host/vpn/prepare.d.ts +19 -0
- package/dist/host/vpn/prepare.js +138 -0
- package/dist/host/vpn/status.d.ts +12 -0
- package/dist/host/vpn/status.js +53 -0
- package/dist/host/web/auth.d.ts +38 -0
- package/dist/host/web/auth.js +96 -0
- package/dist/host/web/backend.d.ts +14 -0
- package/dist/host/web/backend.js +1 -0
- package/dist/host/web/bridge.d.ts +27 -0
- package/dist/host/web/bridge.js +144 -0
- package/dist/host/web/browser.d.ts +3 -0
- package/dist/host/web/browser.js +23 -0
- package/dist/host/web/control.d.ts +17 -0
- package/dist/host/web/control.js +67 -0
- package/dist/host/web/index.d.ts +10 -0
- package/dist/host/web/index.js +9 -0
- package/dist/host/web/rpc.d.ts +24 -0
- package/dist/host/web/rpc.js +149 -0
- package/dist/host/web/runner.d.ts +16 -0
- package/dist/host/web/runner.js +44 -0
- package/dist/host/web/server.d.ts +47 -0
- package/dist/host/web/server.js +238 -0
- package/dist/host/web/state.d.ts +20 -0
- package/dist/host/web/state.js +41 -0
- package/dist/host/web/static-files.d.ts +13 -0
- package/dist/host/web/static-files.js +57 -0
- package/dist/runtime/agent.js +27675 -0
- package/dist/runtime/daemon.js +1950 -1122
- package/dist/runtime/db.js +302 -111
- package/dist/runtime/main.js +1560 -275
- package/dist/runtime/netproxy.js +168 -8
- package/dist/runtime/view.js +186 -13
- package/dist/selftest/accounts.test.js +40 -0
- package/dist/selftest/agent-paths.test.d.ts +2 -0
- package/dist/selftest/agent-paths.test.js +125 -0
- package/dist/selftest/app.test.d.ts +2 -0
- package/dist/selftest/app.test.js +324 -0
- package/dist/selftest/channel.test.js +18 -0
- package/dist/selftest/cli.test.js +35 -4
- package/dist/selftest/config.test.js +59 -0
- package/dist/selftest/contained.test.d.ts +2 -0
- package/dist/selftest/contained.test.js +544 -0
- package/dist/selftest/credentials.test.d.ts +2 -0
- package/dist/selftest/credentials.test.js +198 -0
- package/dist/selftest/engine.test.d.ts +2 -0
- package/dist/selftest/engine.test.js +127 -0
- package/dist/selftest/generate.test.js +1 -1
- package/dist/selftest/hcs.test.d.ts +2 -0
- package/dist/selftest/hcs.test.js +482 -0
- package/dist/selftest/health.test.d.ts +2 -0
- package/dist/selftest/health.test.js +470 -0
- package/dist/selftest/heavy-load.test.d.ts +2 -0
- package/dist/selftest/heavy-load.test.js +329 -0
- package/dist/selftest/host-sim.test.js +2 -0
- package/dist/selftest/index.js +31 -0
- package/dist/selftest/layout.test.js +14 -0
- package/dist/selftest/menu-perf.test.d.ts +2 -0
- package/dist/selftest/menu-perf.test.js +248 -0
- package/dist/selftest/menu-screens.d.ts +7 -0
- package/dist/selftest/menu-screens.js +68 -17
- package/dist/selftest/menu.test.js +603 -22
- package/dist/selftest/migrate.test.js +1 -1
- package/dist/selftest/personalization.test.js +3 -1
- package/dist/selftest/projects.test.js +39 -1
- package/dist/selftest/shared-use.test.js +64 -2
- package/dist/selftest/sharing.test.js +50 -1
- package/dist/selftest/storage.test.d.ts +2 -0
- package/dist/selftest/storage.test.js +363 -0
- package/dist/selftest/support/engine-cases.d.ts +8 -0
- package/dist/selftest/support/engine-cases.js +65 -0
- package/dist/selftest/support/engine-golden.d.ts +3 -0
- package/dist/selftest/support/engine-golden.js +66 -0
- package/dist/selftest/support/fixtures.d.ts +20 -0
- package/dist/selftest/support/hcs-probes.d.ts +17 -0
- package/dist/selftest/support/hcs-probes.js +41 -0
- package/dist/selftest/support/releases.js +1 -1
- package/dist/selftest/toolchains.test.js +21 -0
- package/dist/selftest/update-service.test.js +87 -3
- package/dist/selftest/vpn.test.d.ts +2 -0
- package/dist/selftest/vpn.test.js +412 -0
- package/dist/selftest/web.test.d.ts +2 -0
- package/dist/selftest/web.test.js +402 -0
- package/dist/shared/apps/catalogue.js +31 -0
- package/dist/shared/channel/index.d.ts +1 -0
- package/dist/shared/channel/index.js +1 -0
- package/dist/shared/channel/run-dir.d.ts +9 -1
- package/dist/shared/channel/run-dir.js +18 -1
- package/dist/shared/channel/schema.d.ts +53 -0
- package/dist/shared/channel/schema.js +38 -0
- package/dist/shared/channel/secrets.d.ts +29 -0
- package/dist/shared/channel/secrets.js +50 -0
- package/dist/shared/memory/index.d.ts +1 -0
- package/dist/shared/memory/index.js +1 -0
- package/dist/shared/memory/policy.d.ts +33 -0
- package/dist/shared/memory/policy.js +55 -0
- package/dist/shared/pty/output-filter.d.ts +14 -1
- package/dist/shared/pty/output-filter.js +22 -4
- package/dist/shared/pty/terminal.d.ts +4 -1
- package/dist/shared/pty/terminal.js +4 -2
- package/dist/shared/system.d.ts +1 -0
- package/dist/shared/system.js +1 -0
- package/dist/shared/vpn/download.d.ts +29 -0
- package/dist/shared/vpn/download.js +30 -0
- package/dist/shared/vpn/kill-switch.d.ts +18 -0
- package/dist/shared/vpn/kill-switch.js +81 -0
- package/dist/shared/vpn/ovpn.d.ts +23 -0
- package/dist/shared/vpn/ovpn.js +244 -0
- package/dist/shared/vpn/wireguard.d.ts +51 -0
- package/dist/shared/vpn/wireguard.js +227 -0
- package/dist/shared/web/index.d.ts +1 -0
- package/dist/shared/web/index.js +1 -0
- package/dist/shared/web/protocol.d.ts +61 -0
- package/dist/shared/web/protocol.js +35 -0
- package/dist/sync/sync-cycle.js +9 -5
- package/dist/sync/sync-state.d.ts +1 -0
- package/dist/sync/sync-state.js +1 -0
- package/dist/sync/watcher.d.ts +13 -0
- package/dist/sync/watcher.js +102 -3
- package/dist/web/index.html +14 -0
- package/dist/web/main-NRRS5O6Z.js +157 -0
- package/dist/web/main-T5DMCHYV.css +1 -0
- package/native/csharp/FolderSecurity.cs +29 -0
- package/native/csharp/HcsHost/AssemblyInfo.cs +14 -0
- package/native/csharp/HcsHost/Guard.cs +100 -0
- package/native/csharp/HcsHost/Hcs.cs +256 -0
- package/native/csharp/HcsHost/Json.cs +78 -0
- package/native/csharp/HcsHost/Program.cs +185 -0
- package/native/csharp/HcsHost/VirtualDisk.cs +95 -0
- package/native/csharp/HostTools/AssemblyInfo.cs +14 -0
- package/native/csharp/HostTools/MemoryStatus.cs +107 -0
- package/native/csharp/HostTools/Program.cs +58 -17
- package/native/scripts/check-contained.ps1 +28 -0
- package/native/scripts/contained-common.ps1 +241 -0
- package/native/scripts/dismount-contained.ps1 +66 -0
- package/native/scripts/memory-status.ps1 +34 -0
- package/native/scripts/mount-contained.ps1 +139 -0
- package/native/scripts/protect-data.ps1 +29 -0
- package/native/scripts/read-folder-sddl.ps1 +10 -0
- package/native/scripts/run-elevated.ps1 +17 -4
- package/native/scripts/set-folder-access.ps1 +49 -7
- package/native/scripts/stop-events.ps1 +23 -8
- package/node_modules/ws/LICENSE +20 -0
- package/node_modules/ws/README.md +548 -0
- package/node_modules/ws/browser.js +8 -0
- package/node_modules/ws/index.js +22 -0
- package/node_modules/ws/lib/buffer-util.js +131 -0
- package/node_modules/ws/lib/constants.js +19 -0
- package/node_modules/ws/lib/event-target.js +292 -0
- package/node_modules/ws/lib/extension.js +203 -0
- package/node_modules/ws/lib/limiter.js +55 -0
- package/node_modules/ws/lib/permessage-deflate.js +530 -0
- package/node_modules/ws/lib/receiver.js +743 -0
- package/node_modules/ws/lib/sender.js +607 -0
- package/node_modules/ws/lib/stream.js +161 -0
- package/node_modules/ws/lib/subprotocol.js +62 -0
- package/node_modules/ws/lib/validation.js +152 -0
- package/node_modules/ws/lib/websocket-server.js +562 -0
- package/node_modules/ws/lib/websocket.js +1421 -0
- package/node_modules/ws/package.json +74 -0
- package/node_modules/ws/wrapper.mjs +21 -0
- package/package.json +22 -5
- package/sandbox/csharp/EnvBroadcast.cs +33 -0
- package/sandbox/csharp/MemGov.cs +398 -0
- package/sandbox/csharp/PathSync.cs +90 -0
- package/sandbox/csharp/PtyHost.cs +111 -5
- package/sandbox/scripts/install-shell-path.ps1 +73 -0
- package/sandbox/scripts/set-machine-environment.ps1 +37 -4
- package/schemas/config.schema.json +136 -7
- package/schemas/sandbox-config.schema.json +17 -4
- package/dist/cli/commands/repair/checks.d.ts +0 -2
- package/dist/cli/commands/repair/checks.js +0 -246
- package/dist/cli/commands/sessions/control.d.ts +0 -4
- package/dist/cli/commands/sessions/control.js +0 -66
- package/dist/cli/commands/sessions/list.d.ts +0 -2
- package/dist/cli/commands/sessions/list.js +0 -45
- package/dist/cli/commands/sessions/status.d.ts +0 -2
- package/dist/cli/commands/sessions/status.js +0 -93
- package/dist/cli/commands/sessions/window.d.ts +0 -3
- package/dist/cli/commands/sessions/window.js +0 -18
- package/dist/cli/menu/pages/start-page.d.ts +0 -43
- package/dist/cli/menu/pages/start-page.js +0 -192
- package/dist/cli/tui/tab-bar.d.ts +0 -9
- package/dist/cli/tui/tab-bar.js +0 -33
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { ResolvedMapping } from '../../../core/types.js';
|
|
2
|
+
/** `folder`: a host folder shared in (it is also one of the plan's mappings). `disk`: an image the engine attaches. */
|
|
3
|
+
export type StorageAttachment = {
|
|
4
|
+
readonly kind: 'folder';
|
|
5
|
+
readonly host: string;
|
|
6
|
+
readonly guest: string;
|
|
7
|
+
readonly readOnly: boolean;
|
|
8
|
+
} | {
|
|
9
|
+
readonly kind: 'disk';
|
|
10
|
+
readonly image: string;
|
|
11
|
+
readonly guest: string;
|
|
12
|
+
readonly maxGb: number;
|
|
13
|
+
};
|
|
14
|
+
export interface DataSet {
|
|
15
|
+
readonly dataPath: string;
|
|
16
|
+
readonly guest: string;
|
|
17
|
+
}
|
|
18
|
+
export interface PreparedStorage {
|
|
19
|
+
readonly attachments: readonly StorageAttachment[];
|
|
20
|
+
/** The folder attachments as mappings, in the order they go in the launch. */
|
|
21
|
+
readonly mappings: readonly ResolvedMapping[];
|
|
22
|
+
}
|
|
23
|
+
export interface ProviderCheck {
|
|
24
|
+
readonly available: boolean;
|
|
25
|
+
readonly reasons: readonly string[];
|
|
26
|
+
readonly fixes: readonly string[];
|
|
27
|
+
}
|
|
28
|
+
export interface StorageProvider {
|
|
29
|
+
readonly id: 'folder' | 'vhdx-mounted' | 'vhdx-attached';
|
|
30
|
+
check(): Promise<ProviderCheck>;
|
|
31
|
+
prepare(dataSet: DataSet): Promise<PreparedStorage>;
|
|
32
|
+
release(): Promise<void>;
|
|
33
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** Where the data lived before 1.6: per user, in the profile. Still pinned in config.json when it was there. */
|
|
2
|
+
export declare const OLD_DEFAULT_ROOT = "%LOCALAPPDATA%\\AgentSandbox";
|
|
3
|
+
/** The old per-user default, expanded (null when LOCALAPPDATA is not set). */
|
|
4
|
+
export declare function oldDefaultRoot(env?: NodeJS.ProcessEnv): string | null;
|
|
5
|
+
/** The shared default, expanded: %ProgramData%\AgentSandbox\users\<you>. */
|
|
6
|
+
export declare function sharedDefaultRoot(base?: string): string;
|
|
7
|
+
/** The folder that holds one private storage folder per user. */
|
|
8
|
+
export declare function usersFolder(env?: NodeJS.ProcessEnv): string;
|
|
9
|
+
/** The per-user folder under the users folder that `root` is (or is inside), or null when it is elsewhere. */
|
|
10
|
+
export declare function privateFolderOf(root: string, env?: NodeJS.ProcessEnv): string | null;
|
|
11
|
+
/** A folder with something in it (a missing folder, a file or an empty folder holds no data). */
|
|
12
|
+
export declare function holdsData(dir: string): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Creates the storage root when it is missing. Under %ProgramData%\AgentSandbox\users the folder is made private
|
|
15
|
+
* before anything is written in it (the users folder itself is created as you when no all-users install made it). A
|
|
16
|
+
* root elsewhere is made private when this call creates it.
|
|
17
|
+
*/
|
|
18
|
+
export declare function ensureStorageRoot(root: string, protect: (dir: string) => void, env?: NodeJS.ProcessEnv): void;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// The storage root (everything kept between sandboxes): where the old and the new default are, which folders may hold
|
|
2
|
+
// saved data, and the one place that creates the root (private when it is under %ProgramData%\AgentSandbox\users).
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { DEFAULTS, machineRoot } from '../../core/config/index.js';
|
|
6
|
+
import { expandPath, fail, isInsideOrEqual, isLink } from '../../core/util/index.js';
|
|
7
|
+
/** Where the data lived before 1.6: per user, in the profile. Still pinned in config.json when it was there. */
|
|
8
|
+
export const OLD_DEFAULT_ROOT = '%LOCALAPPDATA%\\AgentSandbox';
|
|
9
|
+
/** The old per-user default, expanded (null when LOCALAPPDATA is not set). */
|
|
10
|
+
export function oldDefaultRoot(env = process.env) {
|
|
11
|
+
return env.LOCALAPPDATA ? path.join(env.LOCALAPPDATA, 'AgentSandbox') : null;
|
|
12
|
+
}
|
|
13
|
+
/** The shared default, expanded: %ProgramData%\AgentSandbox\users\<you>. */
|
|
14
|
+
export function sharedDefaultRoot(base = process.cwd()) {
|
|
15
|
+
return expandPath(DEFAULTS.storage.root, base);
|
|
16
|
+
}
|
|
17
|
+
/** The folder that holds one private storage folder per user. */
|
|
18
|
+
export function usersFolder(env = process.env) {
|
|
19
|
+
return path.join(machineRoot(env), 'users');
|
|
20
|
+
}
|
|
21
|
+
/** The per-user folder under the users folder that `root` is (or is inside), or null when it is elsewhere. */
|
|
22
|
+
export function privateFolderOf(root, env = process.env) {
|
|
23
|
+
const users = usersFolder(env);
|
|
24
|
+
const resolved = path.resolve(root);
|
|
25
|
+
if (!isInsideOrEqual(users, resolved) || resolved.toLowerCase() === path.resolve(users).toLowerCase())
|
|
26
|
+
return null;
|
|
27
|
+
const first = path.relative(path.resolve(users), resolved).split(path.sep)[0];
|
|
28
|
+
return path.join(users, first);
|
|
29
|
+
}
|
|
30
|
+
/** A folder with something in it (a missing folder, a file or an empty folder holds no data). */
|
|
31
|
+
export function holdsData(dir) {
|
|
32
|
+
try {
|
|
33
|
+
return fs.statSync(dir).isDirectory() && fs.readdirSync(dir).length > 0;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Creates the storage root when it is missing. Under %ProgramData%\AgentSandbox\users the folder is made private
|
|
41
|
+
* before anything is written in it (the users folder itself is created as you when no all-users install made it). A
|
|
42
|
+
* root elsewhere is made private when this call creates it.
|
|
43
|
+
*/
|
|
44
|
+
export function ensureStorageRoot(root, protect, env = process.env) {
|
|
45
|
+
const priv = privateFolderOf(root, env);
|
|
46
|
+
if (fs.existsSync(root)) {
|
|
47
|
+
// Made by hand and still empty: private before anything lands in it.
|
|
48
|
+
if (priv && !holdsData(root))
|
|
49
|
+
protect(priv);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if (!priv) {
|
|
53
|
+
// A root of your own choosing is made private too, but only when this call creates it (never an existing folder,
|
|
54
|
+
// so a tree that already holds files is not walked) and never a drive root.
|
|
55
|
+
const created = fs.mkdirSync(root, { recursive: true });
|
|
56
|
+
if (created && path.dirname(path.resolve(root)) !== path.resolve(root)) {
|
|
57
|
+
try {
|
|
58
|
+
protect(root);
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// Drives without permissions (FAT, some network shares) cannot be made private: the folder is still used.
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
fs.mkdirSync(path.dirname(priv), { recursive: true });
|
|
67
|
+
if (isLink(path.dirname(priv)))
|
|
68
|
+
fail('The folder ' + path.dirname(priv) + ' is a link.', 'Remove the link first.');
|
|
69
|
+
fs.mkdirSync(priv, { recursive: true });
|
|
70
|
+
try {
|
|
71
|
+
protect(priv);
|
|
72
|
+
}
|
|
73
|
+
catch (e) {
|
|
74
|
+
fail('Could not make ' + priv + ' private: ' + (e instanceof Error ? e.message : String(e)), 'Run sandbox storage move <folder> to keep your data somewhere else, or report this.');
|
|
75
|
+
}
|
|
76
|
+
fs.mkdirSync(root, { recursive: true });
|
|
77
|
+
}
|
|
@@ -3,12 +3,13 @@ import path from 'node:path';
|
|
|
3
3
|
import { downloader, extractArchive, fetchJson, moveIntoPlace, stagingFolder } from '../../shared/download/index.js';
|
|
4
4
|
import { safeRemove } from '../../shared/io/index.js';
|
|
5
5
|
import { assertTestWritable } from '../test-guard.js';
|
|
6
|
+
import { hostDataFolder, hostDataRoot } from '../storage/index.js';
|
|
6
7
|
import { z } from 'zod';
|
|
7
8
|
import { assertNoLinks, errMsg, fileExists } from '../../core/util/index.js';
|
|
8
9
|
// ---- conpty.dll -----------------------------------------------------------------------------------------------------
|
|
9
10
|
/** Where the sandbox finds conpty.dll + OpenConsole.exe (guest/ptyhost.ts points ptyhost at it). */
|
|
10
11
|
export function conptyDir(dataPath) {
|
|
11
|
-
return path.join(dataPath, 'tools', 'conpty');
|
|
12
|
+
return path.join(hostDataFolder(dataPath, 'tools'), 'conpty');
|
|
12
13
|
}
|
|
13
14
|
const NUGET_CONPTY = 'https://api.nuget.org/v3-flatcontainer/microsoft.windows.console.conpty/';
|
|
14
15
|
const NugetVersionsSchema = z.object({ versions: z.array(z.string()) });
|
|
@@ -22,7 +23,7 @@ const NugetCatalogSchema = z.object({ packageHash: z.string(), packageHashAlgori
|
|
|
22
23
|
export async function ensureConpty(dataPath, refresh) {
|
|
23
24
|
const dir = conptyDir(dataPath);
|
|
24
25
|
assertTestWritable(dir);
|
|
25
|
-
assertNoLinks(dataPath, dir);
|
|
26
|
+
assertNoLinks(hostDataRoot(dataPath), dir);
|
|
26
27
|
if (fileExists(path.join(dir, 'conpty.dll')) && fileExists(path.join(dir, 'OpenConsole.exe')) && !refresh)
|
|
27
28
|
return 'cached';
|
|
28
29
|
const arch = process.arch === 'arm64' ? 'arm64' : 'x64';
|
|
@@ -17,6 +17,8 @@ declare const TerminalSettingsSchema: z.ZodObject<{
|
|
|
17
17
|
* survive turning pwsh off and on). Pure: returns null when nothing changes.
|
|
18
18
|
*/
|
|
19
19
|
export declare function withPwshProfile(settings: z.output<typeof TerminalSettingsSchema>, visible: boolean): z.output<typeof TerminalSettingsSchema> | null;
|
|
20
|
+
/** settings.json that makes new tabs read the current environment; null when it already does. Pure. */
|
|
21
|
+
export declare function withReloadEnvironment(settings: z.output<typeof TerminalSettingsSchema>): z.output<typeof TerminalSettingsSchema> | null;
|
|
20
22
|
/**
|
|
21
23
|
* Shows the PowerShell 7 profile once pwsh is installed in this data folder (and `allowed`, i.e. toolchains.pwsh is
|
|
22
24
|
* not off), hides it otherwise. settings.json is written by the sandbox too: read with a size cap, through no links,
|
|
@@ -3,12 +3,14 @@
|
|
|
3
3
|
import fs from 'node:fs';
|
|
4
4
|
import path from 'node:path';
|
|
5
5
|
import { downloader, githubAsset } from '../../shared/download/index.js';
|
|
6
|
-
import { safeRemove } from '../../shared/io/index.js';
|
|
6
|
+
import { safeRemove, writeFileAtomic } from '../../shared/io/index.js';
|
|
7
7
|
import { assertTestWritable } from '../test-guard.js';
|
|
8
|
+
import { hostDataFolder, hostDataRoot } from '../storage/index.js';
|
|
9
|
+
import { applyEdits, modify } from 'jsonc-parser';
|
|
8
10
|
import { z } from 'zod';
|
|
9
11
|
import { assertNoLinks, errMsg, fileExists, parseJsonc, writeJson } from '../../core/util/index.js';
|
|
10
12
|
export function terminalDir(dataPath) {
|
|
11
|
-
return path.join(dataPath, 'tools', 'terminal');
|
|
13
|
+
return path.join(hostDataFolder(dataPath, 'tools'), 'terminal');
|
|
12
14
|
}
|
|
13
15
|
export function terminalExe(dataPath) {
|
|
14
16
|
return path.join(terminalDir(dataPath), 'WindowsTerminal.exe');
|
|
@@ -66,6 +68,13 @@ export function withPwshProfile(settings, visible) {
|
|
|
66
68
|
list[at] = { ...list[at], hidden: !visible };
|
|
67
69
|
return { ...settings, profiles: { ...profiles, list } };
|
|
68
70
|
}
|
|
71
|
+
/** settings.json that makes new tabs read the current environment; null when it already does. Pure. */
|
|
72
|
+
export function withReloadEnvironment(settings) {
|
|
73
|
+
const compatibility = settings.compatibility;
|
|
74
|
+
if (compatibility?.reloadEnvironmentVariables === true)
|
|
75
|
+
return null;
|
|
76
|
+
return { ...settings, compatibility: { ...compatibility, reloadEnvironmentVariables: true } };
|
|
77
|
+
}
|
|
69
78
|
/**
|
|
70
79
|
* Shows the PowerShell 7 profile once pwsh is installed in this data folder (and `allowed`, i.e. toolchains.pwsh is
|
|
71
80
|
* not off), hides it otherwise. settings.json is written by the sandbox too: read with a size cap, through no links,
|
|
@@ -74,13 +83,14 @@ export function withPwshProfile(settings, visible) {
|
|
|
74
83
|
export function syncPwshProfile(dataPath, allowed) {
|
|
75
84
|
const file = path.join(terminalDir(dataPath), 'settings', 'settings.json');
|
|
76
85
|
assertTestWritable(file);
|
|
77
|
-
assertNoLinks(dataPath, file);
|
|
86
|
+
assertNoLinks(hostDataRoot(dataPath), file);
|
|
78
87
|
if (!fileExists(file) || fs.statSync(file).size > MAX_SETTINGS_BYTES)
|
|
79
88
|
return;
|
|
80
|
-
const visible = allowed && fileExists(path.join(dataPath, 'tools', 'pwsh', 'pwsh.exe'));
|
|
89
|
+
const visible = allowed && fileExists(path.join(hostDataFolder(dataPath, 'tools'), 'pwsh', 'pwsh.exe'));
|
|
81
90
|
let parsed;
|
|
91
|
+
const text = fs.readFileSync(file, 'utf8');
|
|
82
92
|
try {
|
|
83
|
-
const result = TerminalSettingsSchema.safeParse(parseJsonc(
|
|
93
|
+
const result = TerminalSettingsSchema.safeParse(parseJsonc(text, file));
|
|
84
94
|
if (!result.success)
|
|
85
95
|
return;
|
|
86
96
|
parsed = result.data;
|
|
@@ -88,9 +98,18 @@ export function syncPwshProfile(dataPath, allowed) {
|
|
|
88
98
|
catch {
|
|
89
99
|
return;
|
|
90
100
|
}
|
|
91
|
-
const
|
|
92
|
-
if (
|
|
93
|
-
writeJson(file,
|
|
101
|
+
const withProfile = withPwshProfile(parsed, visible);
|
|
102
|
+
if (withProfile) {
|
|
103
|
+
writeJson(file, withReloadEnvironment(withProfile) ?? withProfile);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
// Only the reload switch is missing: set that one value in the text, so comments and the layout stay.
|
|
107
|
+
if (withReloadEnvironment(parsed)) {
|
|
108
|
+
const edits = modify(text, ['compatibility', 'reloadEnvironmentVariables'], true, {
|
|
109
|
+
formattingOptions: { insertSpaces: true, tabSize: 4 },
|
|
110
|
+
});
|
|
111
|
+
writeFileAtomic(file, applyEdits(text, edits));
|
|
112
|
+
}
|
|
94
113
|
}
|
|
95
114
|
export async function ensureTerminal(dataPath, refresh, options = {}) {
|
|
96
115
|
const result = await installTerminal(dataPath, refresh);
|
|
@@ -112,9 +131,9 @@ const installTerminal = async (dataPath, refresh) => {
|
|
|
112
131
|
const settings = path.join(dir, 'settings');
|
|
113
132
|
// downloader.archive replaces tools\terminal: the portable settings folder waits here meanwhile (and goes back also
|
|
114
133
|
// when the download fails). One still parked from an interrupted earlier run is the one to keep.
|
|
115
|
-
const parked = path.join(dataPath, 'tools', 'terminal-settings.parked');
|
|
116
|
-
assertNoLinks(dataPath, settings);
|
|
117
|
-
assertNoLinks(dataPath, parked);
|
|
134
|
+
const parked = path.join(hostDataFolder(dataPath, 'tools'), 'terminal-settings.parked');
|
|
135
|
+
assertNoLinks(hostDataRoot(dataPath), settings);
|
|
136
|
+
assertNoLinks(hostDataRoot(dataPath), parked);
|
|
118
137
|
if (fileExists(exe) && !refresh)
|
|
119
138
|
return { exe, message: 'cached' };
|
|
120
139
|
try {
|
|
@@ -140,7 +159,7 @@ const installTerminal = async (dataPath, refresh) => {
|
|
|
140
159
|
fs.renameSync(parked, settings);
|
|
141
160
|
}
|
|
142
161
|
const settingsFile = path.join(settings, 'settings.json');
|
|
143
|
-
assertNoLinks(dataPath, settingsFile);
|
|
162
|
+
assertNoLinks(hostDataRoot(dataPath), settingsFile);
|
|
144
163
|
if (fileExists(path.join(dir, '.portable')) && !fs.existsSync(settingsFile))
|
|
145
164
|
writeJson(settingsFile, SETTINGS);
|
|
146
165
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { type ReleaseInfo, type ReleaseSource, GithubReleases, FolderFeed, RELEASE_REPO } from './release-source.js';
|
|
2
2
|
export { type SkipReason, type UpdateDecision, type DecisionInput, decideUpdate, isTooSoon } from './decision.js';
|
|
3
3
|
export { UpdateStateFile, type UpdateState } from './update-state.js';
|
|
4
|
-
export { updateNotice, type UpdateNotice } from './notice.js';
|
|
4
|
+
export { updateNotice, autoOffText, type UpdateNotice } from './notice.js';
|
|
5
5
|
export { UpdateLock } from './update-lock.js';
|
|
6
6
|
export { Updater, type UpdateResult, type RunOptions, type UpdaterOptions } from './updater.js';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { GithubReleases, FolderFeed, RELEASE_REPO } from './release-source.js';
|
|
2
2
|
export { decideUpdate, isTooSoon } from './decision.js';
|
|
3
3
|
export { UpdateStateFile } from './update-state.js';
|
|
4
|
-
export { updateNotice } from './notice.js';
|
|
4
|
+
export { updateNotice, autoOffText } from './notice.js';
|
|
5
5
|
export { UpdateLock } from './update-lock.js';
|
|
6
6
|
export { Updater } from './updater.js';
|
|
@@ -4,6 +4,8 @@ export interface UpdateNotice {
|
|
|
4
4
|
/** Identifies the outcome: the same key is never shown to the same user twice. */
|
|
5
5
|
key: string;
|
|
6
6
|
}
|
|
7
|
+
/** What a user is told when a failed install was undone and automatic updates were switched off. */
|
|
8
|
+
export declare function autoOffText(failedVersion: string, current: string): string;
|
|
7
9
|
/**
|
|
8
10
|
* `current` is the version that runs now. A success is announced while it is still the current version; a blocked
|
|
9
11
|
* failure while the current version is older than the one that failed. When both exist, the newer outcome wins.
|
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
// The one-line notice a user sees on their next command after an update ran without them: it worked, or it failed and
|
|
2
2
|
// the old version stayed. Each user sees each outcome once (the caller remembers the key). Pure.
|
|
3
3
|
import { compareVersions } from '../install/layout.js';
|
|
4
|
+
/** What a user is told when a failed install was undone and automatic updates were switched off. */
|
|
5
|
+
export function autoOffText(failedVersion, current) {
|
|
6
|
+
return ('The update to ' +
|
|
7
|
+
failedVersion +
|
|
8
|
+
' failed and was undone (you are on ' +
|
|
9
|
+
current +
|
|
10
|
+
'). Automatic updates are off; turn them back on in Maintenance > Updates or with sandbox update --auto on.');
|
|
11
|
+
}
|
|
4
12
|
/**
|
|
5
13
|
* `current` is the version that runs now. A success is announced while it is still the current version; a blocked
|
|
6
14
|
* failure while the current version is older than the one that failed. When both exist, the newer outcome wins.
|
|
@@ -10,8 +18,12 @@ export function updateNotice(state, current, seenKey) {
|
|
|
10
18
|
const done = state.lastResult;
|
|
11
19
|
if (done?.ok && done.version === current)
|
|
12
20
|
candidates.push({ at: done.at, notice: { key: 'ok@' + done.at, text: 'Updated to ' + done.version + '.' } });
|
|
21
|
+
const off = state.autoOff;
|
|
22
|
+
if (off && compareVersions(off.version, current) > 0)
|
|
23
|
+
candidates.push({ at: off.at, notice: { key: 'auto-off@' + off.at, text: autoOffText(off.version, current) } });
|
|
13
24
|
const failed = state.failed;
|
|
14
|
-
|
|
25
|
+
// The automatic-updates-off notice already tells about this failure.
|
|
26
|
+
if (failed && compareVersions(failed.version, current) > 0 && off?.version !== failed.version)
|
|
15
27
|
candidates.push({
|
|
16
28
|
at: failed.at,
|
|
17
29
|
notice: {
|
|
@@ -7,6 +7,12 @@ declare const StateSchema: z.ZodObject<{
|
|
|
7
7
|
at: z.ZodString;
|
|
8
8
|
reason: z.ZodString;
|
|
9
9
|
}, z.core.$strip>>;
|
|
10
|
+
autoOff: z.ZodOptional<z.ZodObject<{
|
|
11
|
+
version: z.ZodString;
|
|
12
|
+
current: z.ZodString;
|
|
13
|
+
reason: z.ZodString;
|
|
14
|
+
at: z.ZodString;
|
|
15
|
+
}, z.core.$strip>>;
|
|
10
16
|
lastResult: z.ZodOptional<z.ZodObject<{
|
|
11
17
|
version: z.ZodString;
|
|
12
18
|
ok: z.ZodBoolean;
|
|
@@ -7,6 +7,8 @@ const StateSchema = z.object({
|
|
|
7
7
|
lastCheck: z.string().optional(),
|
|
8
8
|
previous: z.string().optional(),
|
|
9
9
|
failed: z.object({ version: z.string(), at: z.string(), reason: z.string() }).optional(),
|
|
10
|
+
/** Why automatic updates were switched off: `version` failed to install and `current` was put back. */
|
|
11
|
+
autoOff: z.object({ version: z.string(), current: z.string(), reason: z.string(), at: z.string() }).optional(),
|
|
10
12
|
lastResult: z.object({ version: z.string(), ok: z.boolean(), at: z.string() }).optional(),
|
|
11
13
|
});
|
|
12
14
|
export class UpdateStateFile {
|
|
@@ -7,6 +7,10 @@ export interface UpdaterOptions {
|
|
|
7
7
|
/** How long to wait between two looks at GitHub (not for `force`). */
|
|
8
8
|
minHoursBetweenChecks?: number;
|
|
9
9
|
downloader?: Downloader;
|
|
10
|
+
/** The scheduled task of an all-users install: removed when a failed install turns automatic updates off. */
|
|
11
|
+
task?: {
|
|
12
|
+
remove(): void;
|
|
13
|
+
} | null;
|
|
10
14
|
}
|
|
11
15
|
export interface RunOptions {
|
|
12
16
|
/** A sandbox runs on this PC: its files are in use, so nothing is installed. */
|
|
@@ -29,6 +33,10 @@ export type UpdateResult = {
|
|
|
29
33
|
version: string;
|
|
30
34
|
reason: string;
|
|
31
35
|
blocked: boolean;
|
|
36
|
+
/** The previous version is active again (pointers and shims), or was never left. */
|
|
37
|
+
rolledBack: boolean;
|
|
38
|
+
/** This failure switched automatic updates off (they were on). */
|
|
39
|
+
autoUpdateOff: boolean;
|
|
32
40
|
};
|
|
33
41
|
export declare class Updater {
|
|
34
42
|
private readonly layout;
|
|
@@ -37,12 +45,23 @@ export declare class Updater {
|
|
|
37
45
|
private readonly now;
|
|
38
46
|
private readonly minHours;
|
|
39
47
|
private readonly downloader;
|
|
48
|
+
private readonly task;
|
|
40
49
|
constructor(layout: InstallLayout, source?: ReleaseSource, options?: UpdaterOptions);
|
|
41
50
|
/** Looks for a newer release (unless the time gate says not yet) and installs it if it is verified. */
|
|
42
51
|
run(options: RunOptions): Promise<UpdateResult>;
|
|
43
52
|
/** Points the shims back at the version the last successful update replaced. Returns that version. */
|
|
44
53
|
rollback(): string;
|
|
45
54
|
private install;
|
|
55
|
+
/** The commands a version's package.json declares, or null when it cannot be read. */
|
|
56
|
+
private binsOf;
|
|
57
|
+
/** Puts the previous version's pointers and shims back and drops shims only the new one had. False: it failed. */
|
|
58
|
+
private restore;
|
|
59
|
+
/**
|
|
60
|
+
* Switches automatic updates off in install.json (the scheduled task of an all-users install does nothing without
|
|
61
|
+
* it) and removes that task when this process may; a failure to remove it is not an error. Remembers why, for the
|
|
62
|
+
* notice. True when automatic updates were on.
|
|
63
|
+
*/
|
|
64
|
+
private turnAutoUpdateOff;
|
|
46
65
|
/** A release tarball: a local feed file is copied, GitHub is downloaded; either way the sha256 must match. */
|
|
47
66
|
private download;
|
|
48
67
|
/** The extracted package must be this package, at this version. Returns its commands. */
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Installs a newer release next to the active one, checks that it starts (directly and through the shim), and only then
|
|
2
|
-
// moves the pointers to it. Any failure
|
|
3
|
-
// release itself (BadRelease) records the version as failed: it is not tried again until a newer one
|
|
4
|
-
//
|
|
2
|
+
// moves the pointers to it. Any failure puts the previous version back (pointers and shims) and deletes what was made.
|
|
3
|
+
// A fault of the release itself (BadRelease) records the version as failed: it is not tried again until a newer one
|
|
4
|
+
// exists. A failed install also turns automatic updates off (`turnAutoUpdateOff`). A rollback moves the pointers back.
|
|
5
5
|
import crypto from 'node:crypto';
|
|
6
6
|
import fs from 'node:fs';
|
|
7
7
|
import path from 'node:path';
|
|
@@ -14,6 +14,7 @@ import { SYSTEM } from '../../shared/system.js';
|
|
|
14
14
|
import { safeRemove } from '../../shared/io/index.js';
|
|
15
15
|
import { testWriteRefusal } from '../../shared/test-guard.js';
|
|
16
16
|
import { refuseInSelfTest } from '../test-guard.js';
|
|
17
|
+
import { InstallRecordFile } from '../install/install-record.js';
|
|
17
18
|
import { readBins, writeShims } from '../install/shims.js';
|
|
18
19
|
import { decideUpdate } from './decision.js';
|
|
19
20
|
import { GithubReleases } from './release-source.js';
|
|
@@ -38,6 +39,7 @@ export class Updater {
|
|
|
38
39
|
now;
|
|
39
40
|
minHours;
|
|
40
41
|
downloader;
|
|
42
|
+
task;
|
|
41
43
|
constructor(layout, source = new GithubReleases(), options = {}) {
|
|
42
44
|
this.layout = layout;
|
|
43
45
|
this.source = source;
|
|
@@ -45,6 +47,7 @@ export class Updater {
|
|
|
45
47
|
this.now = options.now ?? (() => new Date());
|
|
46
48
|
this.minHours = options.minHoursBetweenChecks ?? 24;
|
|
47
49
|
this.downloader = options.downloader ?? new Downloader();
|
|
50
|
+
this.task = options.task ?? null;
|
|
48
51
|
}
|
|
49
52
|
/** Looks for a newer release (unless the time gate says not yet) and installs it if it is verified. */
|
|
50
53
|
async run(options) {
|
|
@@ -78,6 +81,10 @@ export class Updater {
|
|
|
78
81
|
fail('There is no earlier version to go back to.', 'Only a version an update replaced can be restored.');
|
|
79
82
|
if (!this.layout.installedVersions().includes(target))
|
|
80
83
|
fail(target + ' is no longer installed.', 'Install it again with the installer.');
|
|
84
|
+
// The shims of the target first (it may have other commands), then the pointers.
|
|
85
|
+
const bins = this.binsOf(target);
|
|
86
|
+
if (bins)
|
|
87
|
+
writeShims(this.layout, bins);
|
|
81
88
|
this.layout.setActive(target, node);
|
|
82
89
|
// The version we leave is now the one a second rollback returns to.
|
|
83
90
|
this.state.update((s) => ({ ...s, previous: current }));
|
|
@@ -87,32 +94,42 @@ export class Updater {
|
|
|
87
94
|
const version = release.version;
|
|
88
95
|
const archive = path.join(this.layout.root, 'staging', version + '.tgz');
|
|
89
96
|
const work = this.layout.versionDir(version) + '.staging';
|
|
90
|
-
|
|
97
|
+
const previousBins = this.binsOf(current);
|
|
98
|
+
let downloaded = false;
|
|
99
|
+
let shimsWritten = false;
|
|
100
|
+
let pointersMoved = false;
|
|
101
|
+
let newBins = {};
|
|
91
102
|
try {
|
|
92
103
|
await this.download(release, archive);
|
|
104
|
+
downloaded = true;
|
|
93
105
|
safeRemove(work, this.layout.versionsDir);
|
|
94
106
|
await extractArchive(archive, work).catch((e) => {
|
|
95
107
|
throw new BadRelease('The release archive could not be unpacked: ' + errMsg(e));
|
|
96
108
|
});
|
|
97
|
-
|
|
109
|
+
newBins = this.checkPackage(work, version);
|
|
98
110
|
moveIntoPlace(work, this.layout.versionDir(version));
|
|
99
|
-
|
|
111
|
+
shimsWritten = true;
|
|
112
|
+
writeShims(this.layout, newBins);
|
|
100
113
|
this.checkEntry(version, node);
|
|
114
|
+
pointersMoved = true;
|
|
101
115
|
this.layout.setActive(version, node);
|
|
102
|
-
activated = true;
|
|
103
116
|
this.checkShim(version);
|
|
104
117
|
}
|
|
105
118
|
catch (e) {
|
|
106
119
|
const reason = errMsg(e);
|
|
107
|
-
|
|
108
|
-
|
|
120
|
+
const changed = pointersMoved || shimsWritten;
|
|
121
|
+
const rolledBack = changed ? this.restore(current, node, previousBins, newBins, pointersMoved) : true;
|
|
109
122
|
this.discard(work, version);
|
|
110
123
|
const blocked = e instanceof BadRelease;
|
|
111
124
|
if (blocked)
|
|
112
125
|
this.recordFailure(version, reason);
|
|
113
126
|
else
|
|
114
127
|
this.recordAttempt(version, false);
|
|
115
|
-
|
|
128
|
+
// A plain network error before anything arrived changed nothing and says nothing about this release: the next
|
|
129
|
+
// check tries again. Every other failure is a failure of the install itself, so the machine must stop trying
|
|
130
|
+
// by itself until the user turns updates back on.
|
|
131
|
+
const autoUpdateOff = blocked || downloaded ? this.turnAutoUpdateOff(version, current, reason) : false;
|
|
132
|
+
return { kind: 'failed', version, reason, blocked, rolledBack, autoUpdateOff };
|
|
116
133
|
}
|
|
117
134
|
finally {
|
|
118
135
|
try {
|
|
@@ -125,6 +142,65 @@ export class Updater {
|
|
|
125
142
|
this.finish(version, current);
|
|
126
143
|
return { kind: 'installed', version, previous: current };
|
|
127
144
|
}
|
|
145
|
+
/** The commands a version's package.json declares, or null when it cannot be read. */
|
|
146
|
+
binsOf(version) {
|
|
147
|
+
try {
|
|
148
|
+
return readBins(JSON.parse(fs.readFileSync(path.join(this.layout.packageDir(version), 'package.json'), 'utf8')));
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/** Puts the previous version's pointers and shims back and drops shims only the new one had. False: it failed. */
|
|
155
|
+
restore(current, node, previousBins, newBins, pointersMoved) {
|
|
156
|
+
let ok = true;
|
|
157
|
+
try {
|
|
158
|
+
if (pointersMoved)
|
|
159
|
+
this.layout.setActive(current, node);
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
ok = false;
|
|
163
|
+
}
|
|
164
|
+
try {
|
|
165
|
+
if (previousBins) {
|
|
166
|
+
writeShims(this.layout, previousBins);
|
|
167
|
+
for (const name of Object.keys(newBins))
|
|
168
|
+
if (!(name in previousBins))
|
|
169
|
+
for (const file of [name + '.cmd', name])
|
|
170
|
+
fs.rmSync(path.join(this.layout.binDir, file), { force: true });
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
ok = false;
|
|
175
|
+
}
|
|
176
|
+
return ok;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Switches automatic updates off in install.json (the scheduled task of an all-users install does nothing without
|
|
180
|
+
* it) and removes that task when this process may; a failure to remove it is not an error. Remembers why, for the
|
|
181
|
+
* notice. True when automatic updates were on.
|
|
182
|
+
*/
|
|
183
|
+
turnAutoUpdateOff(version, current, reason) {
|
|
184
|
+
const record = new InstallRecordFile(this.layout.root);
|
|
185
|
+
const wasOn = record.read()?.autoUpdate === true;
|
|
186
|
+
try {
|
|
187
|
+
record.setAutoUpdate(false);
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
// The record is unwritable: a blocked version is still not retried, so the failure does not repeat.
|
|
191
|
+
}
|
|
192
|
+
try {
|
|
193
|
+
this.task?.remove();
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
// Needs admin: the task runs, sees autoUpdate false in install.json and does nothing.
|
|
197
|
+
}
|
|
198
|
+
if (wasOn) {
|
|
199
|
+
const at = this.now().toISOString();
|
|
200
|
+
this.state.update((s) => ({ ...s, autoOff: { version, current, reason, at } }));
|
|
201
|
+
}
|
|
202
|
+
return wasOn;
|
|
203
|
+
}
|
|
128
204
|
/** A release tarball: a local feed file is copied, GitHub is downloaded; either way the sha256 must match. */
|
|
129
205
|
async download(release, archive) {
|
|
130
206
|
fs.mkdirSync(path.dirname(archive), { recursive: true });
|
|
@@ -170,7 +246,7 @@ export class Updater {
|
|
|
170
246
|
/** The version starts with the private Node and prints its own version number. */
|
|
171
247
|
checkEntry(version, node) {
|
|
172
248
|
const entry = path.join(this.layout.packageDir(version), ENTRY);
|
|
173
|
-
const run = spawnSync(this.layout.nodeExe(node), [entry, '--version'], {
|
|
249
|
+
const run = spawnSync(this.layout.nodeExe(node), [entry, '--version', '--short'], {
|
|
174
250
|
encoding: 'utf8',
|
|
175
251
|
windowsHide: true,
|
|
176
252
|
timeout: CHECK_MS,
|
|
@@ -187,7 +263,7 @@ export class Updater {
|
|
|
187
263
|
checkShim(version) {
|
|
188
264
|
const shim = path.join(this.layout.binDir, 'sandbox.cmd');
|
|
189
265
|
// /s takes off the outer quotes, so the quoted path (Program Files has a space) needs a pair around the whole line.
|
|
190
|
-
const run = spawnSync(SYSTEM.cmd(), ['/d', '/s', '/c', '""' + shim + '" --version"'], {
|
|
266
|
+
const run = spawnSync(SYSTEM.cmd(), ['/d', '/s', '/c', '""' + shim + '" --version --short"'], {
|
|
191
267
|
encoding: 'utf8',
|
|
192
268
|
windowsHide: true,
|
|
193
269
|
windowsVerbatimArguments: true,
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { VpnLogin, loginProblem, type LoginState, type VpnCredentials } from './login.js';
|
|
2
|
+
export { fetchBounded, findCountry, nordProfile, recommendedServer, type Fetcher, type NordServer } from './nordvpn.js';
|
|
3
|
+
export { prepareVpn, vpnNotes, wireguardFileProblem, type PrepareOptions } from './prepare.js';
|
|
4
|
+
export { hostPublicIp, readVpnLine, vpnLine, type VpnLine } from './status.js';
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { VpnLogin, loginProblem } from './login.js';
|
|
2
|
+
export { fetchBounded, findCountry, nordProfile, recommendedServer } from './nordvpn.js';
|
|
3
|
+
export { prepareVpn, vpnNotes, wireguardFileProblem } from './prepare.js';
|
|
4
|
+
export { hostPublicIp, readVpnLine, vpnLine } from './status.js';
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type VpnProvider } from '../../core/schema/index.js';
|
|
2
|
+
import { SecretStore } from '../secrets/index.js';
|
|
3
|
+
export interface VpnCredentials {
|
|
4
|
+
readonly username: string;
|
|
5
|
+
readonly password: string;
|
|
6
|
+
}
|
|
7
|
+
/** What `sandbox vpn status` may say about the login: never the values. */
|
|
8
|
+
export type LoginState = 'none' | 'saved' | 'unreadable';
|
|
9
|
+
/** The login must go on two lines of a file for OpenVPN, so no line breaks or other control characters. */
|
|
10
|
+
export declare function loginProblem(c: VpnCredentials): string | null;
|
|
11
|
+
export declare class VpnLogin {
|
|
12
|
+
private readonly storageRoot;
|
|
13
|
+
private readonly secrets;
|
|
14
|
+
constructor(storageRoot: string, secrets?: SecretStore);
|
|
15
|
+
private file;
|
|
16
|
+
/** Encrypts and saves the login (replacing an earlier one). */
|
|
17
|
+
save(provider: VpnProvider, login: VpnCredentials): void;
|
|
18
|
+
/** The login, decrypted. Only the launch calls this. */
|
|
19
|
+
read(provider: VpnProvider): VpnCredentials | null;
|
|
20
|
+
/** Whether a login is saved and can be decrypted by this Windows user (the values are never returned). */
|
|
21
|
+
state(provider: VpnProvider): LoginState;
|
|
22
|
+
savedAt(provider: VpnProvider): string | null;
|
|
23
|
+
remove(provider: VpnProvider): boolean;
|
|
24
|
+
}
|