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,133 @@
|
|
|
1
|
+
// `sandbox doctor` and `sandbox repair`: both run the same checks through the same engine, a line each as it ends.
|
|
2
|
+
// doctor only looks (and offers to fix, or fixes with --fix); repair looks, lists what it would change, asks once, then
|
|
3
|
+
// fixes and writes a log. --json prints the results instead and never asks.
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { confirm } from '@inquirer/prompts';
|
|
6
|
+
import { DEFAULTS, userDir } from '../../../core/config/index.js';
|
|
7
|
+
import { packageVersion } from '../../../core/package-info.js';
|
|
8
|
+
import { expandPath, UserError } from '../../../core/util/index.js';
|
|
9
|
+
import { insideSandbox } from '../../../host/sandbox/index.js';
|
|
10
|
+
import { printJson, table } from '../../output/index.js';
|
|
11
|
+
import { HealthService } from '../../services/index.js';
|
|
12
|
+
import { createContext, requireOnPc } from '../context.js';
|
|
13
|
+
import { ALL_CHECKS } from './checks/index.js';
|
|
14
|
+
import { buildEnv } from './env.js';
|
|
15
|
+
import { HealthRun, summarize } from './engine.js';
|
|
16
|
+
import { logText, writeRepairLog } from './log.js';
|
|
17
|
+
import { HealthPrinter } from './printer.js';
|
|
18
|
+
const interactive = () => Boolean(process.stdin.isTTY && process.stdout.isTTY);
|
|
19
|
+
const stdout = { write: (text) => void process.stdout.write(text) };
|
|
20
|
+
/** Runs the checks, then (when allowed) the fixes. `printer` is null for --json. */
|
|
21
|
+
export async function runHealth(env, printer, plan, checks = ALL_CHECKS, confirmFix = (q) => confirm({ message: q, default: true })) {
|
|
22
|
+
const run = new HealthRun(checks, env, printer?.hooks());
|
|
23
|
+
const found = await run.look();
|
|
24
|
+
const fixable = found.filter((r) => r.fixable);
|
|
25
|
+
let final = found;
|
|
26
|
+
let changed = false;
|
|
27
|
+
if (fixable.length) {
|
|
28
|
+
let go = plan.yes;
|
|
29
|
+
if (!go && plan.ask) {
|
|
30
|
+
printer?.plan(fixable);
|
|
31
|
+
go = await confirmFix(plan.question(fixable.length));
|
|
32
|
+
}
|
|
33
|
+
if (go) {
|
|
34
|
+
if (plan.yes)
|
|
35
|
+
printer?.plan(fixable);
|
|
36
|
+
final = await run.fix(found);
|
|
37
|
+
changed = true;
|
|
38
|
+
}
|
|
39
|
+
else
|
|
40
|
+
printer?.line('\nNothing was changed.');
|
|
41
|
+
}
|
|
42
|
+
return { found, final, summary: summarize(final), changed };
|
|
43
|
+
}
|
|
44
|
+
function quote(n, what) {
|
|
45
|
+
return n + ' ' + what + (n === 1 ? '' : 's');
|
|
46
|
+
}
|
|
47
|
+
/** `sandbox doctor` */
|
|
48
|
+
export async function runDoctor(ctx) {
|
|
49
|
+
const health = new HealthService(ctx);
|
|
50
|
+
if (insideSandbox()) {
|
|
51
|
+
table(health.doctor());
|
|
52
|
+
return 0;
|
|
53
|
+
}
|
|
54
|
+
const json = ctx.options.json;
|
|
55
|
+
const printer = json ? null : new HealthPrinter(stdout);
|
|
56
|
+
printer?.title('Checking this PC, the install, your settings and the sandbox...');
|
|
57
|
+
const env = buildEnv(ctx);
|
|
58
|
+
const report = await runHealth(env, printer, {
|
|
59
|
+
yes: ctx.options.fix,
|
|
60
|
+
ask: !json && interactive(),
|
|
61
|
+
question: (n) => quote(n, 'problem') + ' can be fixed. Fix ' + (n === 1 ? 'it' : 'them') + ' now?',
|
|
62
|
+
});
|
|
63
|
+
const details = health.doctor();
|
|
64
|
+
if (printJson(ctx, { checks: report.final, summary: report.summary, details }))
|
|
65
|
+
return 0;
|
|
66
|
+
printer?.summary(report.final, report.summary);
|
|
67
|
+
const left = report.final.filter((r) => r.fixable).length;
|
|
68
|
+
if (left && !report.changed)
|
|
69
|
+
printer?.line('\n' + quote(left, 'problem') + ' can be fixed: run sandbox repair (or sandbox doctor --fix).');
|
|
70
|
+
printer?.line('\n' + 'Details');
|
|
71
|
+
table(details);
|
|
72
|
+
return 0;
|
|
73
|
+
}
|
|
74
|
+
/** `sandbox repair` for a loaded context. */
|
|
75
|
+
export async function runRepair(ctx, configError = null) {
|
|
76
|
+
requireOnPc('repair');
|
|
77
|
+
const json = ctx.options.json;
|
|
78
|
+
const printer = json ? null : new HealthPrinter(stdout);
|
|
79
|
+
printer?.title('Checking this PC, the install, your settings and the sandbox...');
|
|
80
|
+
const env = buildEnv(ctx, configError);
|
|
81
|
+
const yes = ctx.options.yes;
|
|
82
|
+
const ask = !json && interactive();
|
|
83
|
+
const report = await runHealth(env, printer, {
|
|
84
|
+
yes,
|
|
85
|
+
ask,
|
|
86
|
+
question: (n) => 'Fix ' + (n === 1 ? 'this problem' : 'these ' + n + ' problems') + '?',
|
|
87
|
+
});
|
|
88
|
+
const when = new Date();
|
|
89
|
+
const log = writeRepairLog(ctx.storageRoot, logText({
|
|
90
|
+
when,
|
|
91
|
+
version: packageVersion(),
|
|
92
|
+
command: 'sandbox repair' + (yes ? ' --yes' : ''),
|
|
93
|
+
found: report.found,
|
|
94
|
+
final: report.final,
|
|
95
|
+
summary: report.summary,
|
|
96
|
+
}), when);
|
|
97
|
+
const stillFixable = report.final.filter((r) => r.fixable).length;
|
|
98
|
+
if (printJson(ctx, { checks: report.final, summary: report.summary, changed: report.changed, log })) {
|
|
99
|
+
return report.summary.needsYou ? 1 : 0;
|
|
100
|
+
}
|
|
101
|
+
printer?.summary(report.final, report.summary);
|
|
102
|
+
if (stillFixable && !ask && !yes)
|
|
103
|
+
printer?.line('\n' + quote(stillFixable, 'problem') + ' can be fixed: run sandbox repair --yes.');
|
|
104
|
+
printer?.line(log
|
|
105
|
+
? '\nLog of what was found and changed: ' + log
|
|
106
|
+
: '\nNo log was written (the storage folder does not exist yet).');
|
|
107
|
+
return report.summary.needsYou ? 1 : 0;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Entry point that works even when the config file is broken (createContext would throw): falls back to the built-in
|
|
111
|
+
* defaults so the other checks still run, and reports the settings problem as a check of its own.
|
|
112
|
+
*/
|
|
113
|
+
export function repairCommand(packageRoot, entry, options) {
|
|
114
|
+
let ctx;
|
|
115
|
+
try {
|
|
116
|
+
ctx = createContext(packageRoot, entry, options);
|
|
117
|
+
}
|
|
118
|
+
catch (e) {
|
|
119
|
+
if (!(e instanceof UserError))
|
|
120
|
+
throw e;
|
|
121
|
+
const loaded = { config: structuredClone(DEFAULTS), configPath: null, base: userDir() };
|
|
122
|
+
const storageRoot = expandPath(loaded.config.storage.root, loaded.base);
|
|
123
|
+
return runRepair({
|
|
124
|
+
packageRoot,
|
|
125
|
+
entry,
|
|
126
|
+
options,
|
|
127
|
+
loaded,
|
|
128
|
+
storageRoot,
|
|
129
|
+
dataPath: path.join(storageRoot, 'data', loaded.config.storage.dataName),
|
|
130
|
+
}, e);
|
|
131
|
+
}
|
|
132
|
+
return runRepair(ctx);
|
|
133
|
+
}
|
|
@@ -1,11 +1,89 @@
|
|
|
1
1
|
import type { UserError } from '../../../core/util/index.js';
|
|
2
|
+
import type { InstallLayout, InstallRecord } from '../../../host/install/index.js';
|
|
3
|
+
import type { SystemProbe } from '../../../host/health/index.js';
|
|
4
|
+
import type { MachineFacts } from '../setup/facts.js';
|
|
5
|
+
import type { Migration } from '../../../host/migrate/index.js';
|
|
2
6
|
import type { Context } from '../context.js';
|
|
3
7
|
export type RepairStatus = 'ok' | 'fixed' | 'needs-you' | 'warn' | 'skipped';
|
|
8
|
+
/** The headings the output is grouped under, in the order they are shown. */
|
|
9
|
+
export declare const CHECK_GROUPS: readonly ["This PC", "Install", "Data folder", "Settings", "Sandbox", "Agents & tools", "Network"];
|
|
10
|
+
export type CheckGroup = (typeof CHECK_GROUPS)[number];
|
|
11
|
+
/** The short form of a result (the menu shows these). */
|
|
4
12
|
export interface RepairResult {
|
|
5
13
|
name: string;
|
|
6
14
|
status: RepairStatus;
|
|
7
15
|
detail: string;
|
|
8
16
|
}
|
|
17
|
+
/** What a check's run() finds. */
|
|
18
|
+
export interface Finding {
|
|
19
|
+
/** ok, a warning (nothing to do now), something you need to do, or not checked. */
|
|
20
|
+
status: 'ok' | 'warn' | 'needs-you' | 'skipped';
|
|
21
|
+
/** One line: what was found. */
|
|
22
|
+
detail: string;
|
|
23
|
+
/** What it means for you (shown when not ok). */
|
|
24
|
+
means?: string;
|
|
25
|
+
/** What to do about it yourself, when repair cannot (a command or a step). */
|
|
26
|
+
fix?: string;
|
|
27
|
+
/** What repair would change, in a few words ("remove 2 stale records"). Set only when fix() can mend this. */
|
|
28
|
+
plan?: string;
|
|
29
|
+
/** More lines shown under the plan when repair lists what it will change (a diff, the folders). */
|
|
30
|
+
lines?: string[];
|
|
31
|
+
/** Handed to fix() unchanged: what run() decided (the folders to remove ...). */
|
|
32
|
+
data?: unknown;
|
|
33
|
+
}
|
|
34
|
+
/** What a fix reports: what it changed. The before/after lines come from running the check again. */
|
|
35
|
+
export interface FixOutcome {
|
|
36
|
+
done: string;
|
|
37
|
+
}
|
|
38
|
+
export interface Check {
|
|
39
|
+
/** Stable id (kebab-case): used in --json and the repair log. */
|
|
40
|
+
id: string;
|
|
41
|
+
group: CheckGroup;
|
|
42
|
+
/** Short label for the result line ("Data folder"). */
|
|
43
|
+
name: string;
|
|
44
|
+
/** "the data folder" in "Checking the data folder..."; the lower-cased name when left out. */
|
|
45
|
+
checking?: string;
|
|
46
|
+
/** Not shown at all when it returns false (an all-users check on another install). */
|
|
47
|
+
applies?: (env: RepairEnv) => boolean;
|
|
48
|
+
/** Slower checks (the network, Windows tools) say how long they may take; the default is 20 seconds. */
|
|
49
|
+
timeoutMs?: number;
|
|
50
|
+
/** look: do not even look while a sandbox runs (the folders are in use). fix: look, but fix only when none runs. */
|
|
51
|
+
needsIdle?: 'look' | 'fix';
|
|
52
|
+
run: (env: RepairEnv) => Finding | Promise<Finding>;
|
|
53
|
+
fix?: (env: RepairEnv, finding: Finding) => FixOutcome | Promise<FixOutcome>;
|
|
54
|
+
}
|
|
55
|
+
export interface CheckResult extends RepairResult {
|
|
56
|
+
id: string;
|
|
57
|
+
group: CheckGroup;
|
|
58
|
+
means?: string;
|
|
59
|
+
fix?: string;
|
|
60
|
+
plan?: string;
|
|
61
|
+
lines?: string[];
|
|
62
|
+
/** Repair can mend this one (a plan exists and the check has a fix). */
|
|
63
|
+
fixable: boolean;
|
|
64
|
+
timedOut?: boolean;
|
|
65
|
+
/** Milliseconds the look took. */
|
|
66
|
+
ms: number;
|
|
67
|
+
/** After a fix: what was changed, and what the check said before. */
|
|
68
|
+
applied?: {
|
|
69
|
+
done: string;
|
|
70
|
+
before: string;
|
|
71
|
+
after: string;
|
|
72
|
+
};
|
|
73
|
+
/** After a fix that failed: why. */
|
|
74
|
+
error?: string;
|
|
75
|
+
}
|
|
76
|
+
export interface Summary {
|
|
77
|
+
total: number;
|
|
78
|
+
ok: number;
|
|
79
|
+
fixed: number;
|
|
80
|
+
warn: number;
|
|
81
|
+
needsYou: number;
|
|
82
|
+
skipped: number;
|
|
83
|
+
/** Results repair could still mend. */
|
|
84
|
+
fixable: number;
|
|
85
|
+
}
|
|
86
|
+
/** Everything the checks read, in one place: injectable, so tests point it at temp folders. */
|
|
9
87
|
export interface RepairEnv {
|
|
10
88
|
ctx: Context;
|
|
11
89
|
running: boolean;
|
|
@@ -13,14 +91,24 @@ export interface RepairEnv {
|
|
|
13
91
|
storageRoot: string;
|
|
14
92
|
toolsDir: string;
|
|
15
93
|
configError: UserError | null;
|
|
94
|
+
/** The managed install this program runs from, or null (npm). */
|
|
95
|
+
layout: InstallLayout | null;
|
|
96
|
+
/** install.json of that install. */
|
|
97
|
+
record: InstallRecord | null;
|
|
98
|
+
/** %ProgramData%\AgentSandbox (the PC-wide folder of an all-users install). */
|
|
99
|
+
machineHome: string;
|
|
100
|
+
/** ~/.agent-sandbox: the settings file and what belongs to it. */
|
|
101
|
+
userDir: string;
|
|
102
|
+
/** The settings file in use (--config, AGENT_SANDBOX_CONFIG, else <userDir>\config.json). */
|
|
103
|
+
configFile: string;
|
|
104
|
+
/** The settings updates that exist (a test gives its own). */
|
|
105
|
+
migrations: readonly Migration[];
|
|
106
|
+
/** The user-scope install folder next to an all-users one (checked for leftovers). */
|
|
107
|
+
userInstallRoot: string | null;
|
|
108
|
+
system: SystemProbe;
|
|
109
|
+
now: () => number;
|
|
110
|
+
/** What `sandbox setup` learns about this PC (looked up once, the first time a check asks). */
|
|
111
|
+
facts: () => MachineFacts;
|
|
16
112
|
}
|
|
17
|
-
export interface RepairCheck {
|
|
18
|
-
name: string;
|
|
19
|
-
run: (env: RepairEnv) => Omit<RepairResult, 'name'>;
|
|
20
|
-
}
|
|
21
|
-
export declare function ok(detail: string): Omit<RepairResult, 'name'>;
|
|
22
113
|
/** For fixes that must not touch folders a running sandbox may be using. */
|
|
23
|
-
export declare const
|
|
24
|
-
status: "skipped";
|
|
25
|
-
detail: string;
|
|
26
|
-
};
|
|
114
|
+
export declare const WHILE_RUNNING = "a sandbox is running and may be using it; run repair again once it is closed";
|
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
/** The headings the output is grouped under, in the order they are shown. */
|
|
2
|
+
export const CHECK_GROUPS = [
|
|
3
|
+
'This PC',
|
|
4
|
+
'Install',
|
|
5
|
+
'Data folder',
|
|
6
|
+
'Settings',
|
|
7
|
+
'Sandbox',
|
|
8
|
+
'Agents & tools',
|
|
9
|
+
'Network',
|
|
10
|
+
];
|
|
4
11
|
/** For fixes that must not touch folders a running sandbox may be using. */
|
|
5
|
-
export const
|
|
6
|
-
status: 'skipped',
|
|
7
|
-
detail: 'a sandbox is running and may be using it; run repair again once it is closed',
|
|
8
|
-
};
|
|
12
|
+
export const WHILE_RUNNING = 'a sandbox is running and may be using it; run repair again once it is closed';
|
|
@@ -24,7 +24,7 @@ export async function resume(ctx) {
|
|
|
24
24
|
const { storageRoot, dataPath, options } = ctx;
|
|
25
25
|
const saved = new SessionLedger(storageRoot, dataPath).read();
|
|
26
26
|
if (!saved) {
|
|
27
|
-
console.log('Nothing to
|
|
27
|
+
console.log('Nothing to resume. Start one: sandbox claude.');
|
|
28
28
|
return 0;
|
|
29
29
|
}
|
|
30
30
|
// By hand, you asked for it. From the watcher, the setting decides.
|
|
@@ -32,7 +32,7 @@ export async function resume(ctx) {
|
|
|
32
32
|
const life = new LifeRecord(storageRoot, dataPath).read();
|
|
33
33
|
const reopening = !options.auto || shouldReopen(setting === 'ask' ? 'always' : setting, life, saved) === 'reopen';
|
|
34
34
|
if (!options.auto && !saved.sessions.length) {
|
|
35
|
-
console.log('Nothing to
|
|
35
|
+
console.log('Nothing to resume. Start one: sandbox claude.');
|
|
36
36
|
return 0;
|
|
37
37
|
}
|
|
38
38
|
if (reopening && saved.sessions.length)
|
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
// Working with a running sandbox: attach
|
|
2
|
-
//
|
|
3
|
-
//
|
|
1
|
+
// Working with a running sandbox: attach and exec. Each knows which project you run it from (projects/here.ts): attach
|
|
2
|
+
// puts that project's sessions first, exec and db run in it. Status, sessions, restart, stop and show/hide are the
|
|
3
|
+
// shared core's (src/app/features/sandbox and sessions).
|
|
4
4
|
export * from './attach.js';
|
|
5
|
-
export * from './list.js';
|
|
6
|
-
export * from './status.js';
|
|
7
5
|
export * from './exec.js';
|
|
8
|
-
export * from './control.js';
|
|
9
|
-
export * from './window.js';
|
|
@@ -1,2 +1,7 @@
|
|
|
1
1
|
import { type Context } from '../context.js';
|
|
2
|
+
/**
|
|
3
|
+
* First start on a PC without Windows Sandbox: offers to turn it on (the setup steps) instead of a bare error.
|
|
4
|
+
* Returns the setup's exit code, or undefined when there is nothing to offer (it is on, no terminal, or declined).
|
|
5
|
+
*/
|
|
6
|
+
export declare function offerSetupWhenOff(ctx: Context): Promise<number | undefined>;
|
|
2
7
|
export declare function setup(ctx: Context): Promise<number>;
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
// `sandbox setup`: checks this PC can run Windows Sandbox and offers to turn the feature on.
|
|
2
|
+
import { spawnSync } from 'node:child_process';
|
|
2
3
|
import { askYesNo } from '../../../core/prompt.js';
|
|
3
|
-
import { fail } from '../../../core/util/index.js';
|
|
4
|
+
import { fail, isWin } from '../../../core/util/index.js';
|
|
5
|
+
import { insideSandbox, sandboxFeatureInstalled } from '../../../host/sandbox/index.js';
|
|
6
|
+
import { refuseInSelfTest } from '../../../host/test-guard.js';
|
|
7
|
+
import { SYSTEM } from '../../../shared/system.js';
|
|
4
8
|
import { c, table } from '../../output/index.js';
|
|
5
9
|
import { HealthService } from '../../services/index.js';
|
|
6
10
|
import { ENABLE_COMMAND } from './facts.js';
|
|
@@ -12,6 +16,25 @@ const LABEL = {
|
|
|
12
16
|
function print(checks) {
|
|
13
17
|
table(checks.map((check) => [LABEL[check.status], check.name, check.detail]));
|
|
14
18
|
}
|
|
19
|
+
/** Seconds Windows waits before it restarts (shutdown /a cancels in that time). */
|
|
20
|
+
const RESTART_DELAY_SECONDS = 30;
|
|
21
|
+
/** After turning the feature on Windows must restart: offered, never done without a yes. */
|
|
22
|
+
async function offerRestart() {
|
|
23
|
+
if (!(await askYesNo('Restart Windows now?')))
|
|
24
|
+
return;
|
|
25
|
+
refuseInSelfTest('restart Windows');
|
|
26
|
+
spawnSync(SYSTEM.shutdown(), ['/r', '/t', String(RESTART_DELAY_SECONDS)], { windowsHide: true });
|
|
27
|
+
console.log('Windows restarts in ' + RESTART_DELAY_SECONDS + ' seconds. To cancel: shutdown /a');
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* First start on a PC without Windows Sandbox: offers to turn it on (the setup steps) instead of a bare error.
|
|
31
|
+
* Returns the setup's exit code, or undefined when there is nothing to offer (it is on, no terminal, or declined).
|
|
32
|
+
*/
|
|
33
|
+
export async function offerSetupWhenOff(ctx) {
|
|
34
|
+
if (!isWin || insideSandbox() || sandboxFeatureInstalled() || !process.stdin.isTTY)
|
|
35
|
+
return undefined;
|
|
36
|
+
return (await askYesNo('Windows Sandbox is not turned on. Turn it on now?', true)) ? setup(ctx) : undefined;
|
|
37
|
+
}
|
|
15
38
|
export async function setup(ctx) {
|
|
16
39
|
const health = new HealthService(ctx);
|
|
17
40
|
health.assertWindows();
|
|
@@ -28,6 +51,7 @@ export async function setup(ctx) {
|
|
|
28
51
|
console.log('Done. Restart Windows to finish, then run sandbox setup again.\n');
|
|
29
52
|
checks = health.setupReport().checks;
|
|
30
53
|
print(checks);
|
|
54
|
+
await offerRestart();
|
|
31
55
|
}
|
|
32
56
|
else
|
|
33
57
|
console.log('To do it yourself, in an admin PowerShell run:\n ' + ENABLE_COMMAND + '\nthen restart Windows.');
|
|
@@ -21,9 +21,12 @@ export interface SandboxView {
|
|
|
21
21
|
}
|
|
22
22
|
/** For status and sessions: they work for anyone, and say whose sandbox this is. */
|
|
23
23
|
export declare function lookAtSandbox(ctx: Context): SandboxView;
|
|
24
|
+
/** Asks for a typed confirmation ("Type alice to confirm"); true when it was typed. */
|
|
25
|
+
export type TypedConfirm = (prompt: string, expected: string) => Promise<boolean>;
|
|
24
26
|
/**
|
|
25
27
|
* For a command that acts on the running sandbox: refuses with the reason when this user may not, asks for the typed
|
|
26
|
-
* confirmation when the rule wants one (--yes in a script
|
|
28
|
+
* confirmation when the rule wants one (--yes in a script; `confirm` asks it, by default on the terminal), and returns
|
|
29
|
+
* the context to use.
|
|
27
30
|
*/
|
|
28
|
-
export declare function useSharedSandbox(ctx: Context, action: OwnerAction | ((shared: Context) => OwnerAction)): Promise<Context>;
|
|
31
|
+
export declare function useSharedSandbox(ctx: Context, action: OwnerAction | ((shared: Context) => OwnerAction), confirm?: TypedConfirm): Promise<Context>;
|
|
29
32
|
export {};
|
|
@@ -47,11 +47,18 @@ export function lookAtSandbox(ctx) {
|
|
|
47
47
|
return { ctx: borrowedContext(ctx, owner), line, limited: false, owner };
|
|
48
48
|
return { ctx, line, limited: owner.kind !== 'mine' && owner.kind !== 'none', owner };
|
|
49
49
|
}
|
|
50
|
+
/** On the terminal: no terminal fails and says how to do it in a script. */
|
|
51
|
+
const terminalTypedConfirm = async (prompt, expected) => {
|
|
52
|
+
if (!(process.stdin.isTTY && process.stdout.isTTY))
|
|
53
|
+
fail(prompt + ' It was not stopped.', 'In a script, add --yes to do it anyway.');
|
|
54
|
+
return askTyped(prompt, expected);
|
|
55
|
+
};
|
|
50
56
|
/**
|
|
51
57
|
* For a command that acts on the running sandbox: refuses with the reason when this user may not, asks for the typed
|
|
52
|
-
* confirmation when the rule wants one (--yes in a script
|
|
58
|
+
* confirmation when the rule wants one (--yes in a script; `confirm` asks it, by default on the terminal), and returns
|
|
59
|
+
* the context to use.
|
|
53
60
|
*/
|
|
54
|
-
export async function useSharedSandbox(ctx, action) {
|
|
61
|
+
export async function useSharedSandbox(ctx, action, confirm = terminalTypedConfirm) {
|
|
55
62
|
const owner = ownerNow();
|
|
56
63
|
if (!owner || owner.kind === 'mine' || owner.kind === 'none')
|
|
57
64
|
return ctx;
|
|
@@ -59,11 +66,7 @@ export async function useSharedSandbox(ctx, action) {
|
|
|
59
66
|
const rule = ownerRule(owner, typeof action === 'function' ? action(target) : action);
|
|
60
67
|
if (rule.kind === 'refuse')
|
|
61
68
|
return fail(rule.reason, rule.fix);
|
|
62
|
-
if (rule.kind === 'confirm' && !ctx.options.yes)
|
|
63
|
-
|
|
64
|
-
fail(rule.prompt + ' It was not stopped.', 'In a script, add --yes to do it anyway.');
|
|
65
|
-
if (!(await askTyped(rule.prompt, rule.expected)))
|
|
66
|
-
fail('Nothing changed.');
|
|
67
|
-
}
|
|
69
|
+
if (rule.kind === 'confirm' && !ctx.options.yes && !(await confirm(rule.prompt, rule.expected)))
|
|
70
|
+
fail('Nothing changed.');
|
|
68
71
|
return target;
|
|
69
72
|
}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
// `sandbox storage contained on|off|status` (beta): keep the data set's tools, state and logs in a
|
|
2
|
+
// disk image that is mounted only while a sandbox runs. The work is in host/storage/contained; this file asks, shows
|
|
3
|
+
// size and time, and prints.
|
|
4
|
+
import fs from 'node:fs';
|
|
5
|
+
import { userConfigPath } from '../../../core/config/index.js';
|
|
6
|
+
import { humanBytes } from '../../../core/disk.js';
|
|
7
|
+
import { askRequired } from '../../../core/prompt.js';
|
|
8
|
+
import { fail } from '../../../core/util/index.js';
|
|
9
|
+
import { isSandboxRunning, realContainedDeps } from '../../../host/sandbox/index.js';
|
|
10
|
+
import { assertTargetsFree, containedAvailability, ContainedStorage, describeDuration, describeSize, planTransfer, runTransfer, setStateOf, StateFile, writeContainedSetting, } from '../../../host/storage/index.js';
|
|
11
|
+
import { c, printJson, working } from '../../output/index.js';
|
|
12
|
+
const BETA = 'Beta, and not yet tested on a real PC. ';
|
|
13
|
+
function storageFor(ctx) {
|
|
14
|
+
const { config } = ctx.loaded;
|
|
15
|
+
return new ContainedStorage(realContainedDeps(ctx.storageRoot, config.storage.containedMaxGb), config.storage.dataName);
|
|
16
|
+
}
|
|
17
|
+
function requireAvailable() {
|
|
18
|
+
const check = containedAvailability();
|
|
19
|
+
if (!check.available)
|
|
20
|
+
fail('Contained storage cannot be used: ' + check.reasons.join(' '), check.fixes.join(' '));
|
|
21
|
+
}
|
|
22
|
+
function requireNoSandbox() {
|
|
23
|
+
if (isSandboxRunning())
|
|
24
|
+
fail('A sandbox is running.', 'Close it (sandbox stop) first: the folders in the image are in use.');
|
|
25
|
+
}
|
|
26
|
+
async function status(ctx) {
|
|
27
|
+
const storage = storageFor(ctx);
|
|
28
|
+
const check = containedAvailability();
|
|
29
|
+
const state = new StateFile(storage.paths).read();
|
|
30
|
+
const record = setStateOf(state, storage.set);
|
|
31
|
+
const reality = check.available && storage.imageExists() ? await storage.reality() : null;
|
|
32
|
+
const answer = {
|
|
33
|
+
setting: ctx.loaded.config.storage.contained,
|
|
34
|
+
maxGb: ctx.loaded.config.storage.containedMaxGb,
|
|
35
|
+
available: check.available,
|
|
36
|
+
reasons: check.reasons,
|
|
37
|
+
image: storage.paths.image,
|
|
38
|
+
imageExists: storage.imageExists(),
|
|
39
|
+
imageBytes: reality?.imageBytes ?? null,
|
|
40
|
+
mountFolder: storage.paths.mount,
|
|
41
|
+
recordedMounted: record.mounted,
|
|
42
|
+
holders: record.holders.length,
|
|
43
|
+
mountedNow: reality?.mountIsMountPoint ?? null,
|
|
44
|
+
};
|
|
45
|
+
if (printJson(ctx, answer))
|
|
46
|
+
return 0;
|
|
47
|
+
console.log(c.yellow('Contained storage (beta, untested on a real PC)'));
|
|
48
|
+
console.log(' setting: storage.contained = ' + answer.setting + ' (limit ' + answer.maxGb + ' GB)');
|
|
49
|
+
console.log(' this PC: ' +
|
|
50
|
+
(check.available ? 'can use it' : 'cannot use it: ' + check.reasons.join(' ') + ' ' + check.fixes.join(' ')));
|
|
51
|
+
console.log(' image: ' +
|
|
52
|
+
answer.image +
|
|
53
|
+
(answer.imageExists ? ' (' + humanBytes(answer.imageBytes ?? 0) + ' on disk)' : ' (not made yet)'));
|
|
54
|
+
console.log(' mount folder: ' + answer.mountFolder);
|
|
55
|
+
if (reality)
|
|
56
|
+
console.log(' mounted now: ' +
|
|
57
|
+
(reality.mountIsMountPoint ? 'yes' : 'no') +
|
|
58
|
+
(record.mounted !== reality.mountIsMountPoint
|
|
59
|
+
? ' (the record says ' + (record.mounted ? 'yes' : 'no') + '; sandbox doctor looks into it)'
|
|
60
|
+
: ''));
|
|
61
|
+
console.log('\nTurn it on with: sandbox storage contained on Turn it off with: sandbox storage contained off');
|
|
62
|
+
return 0;
|
|
63
|
+
}
|
|
64
|
+
function printPlan(plan, to) {
|
|
65
|
+
for (const f of plan.folders)
|
|
66
|
+
console.log(' ' + f.name + ': ' + describeSize(f.measured));
|
|
67
|
+
console.log(' total: ' + describeSize(plan.total) + ' to ' + to);
|
|
68
|
+
console.log(' time: about ' + describeDuration(plan.estimate.seconds) + ' (copied, then the originals are removed)');
|
|
69
|
+
if (!plan.estimate.fits)
|
|
70
|
+
fail('Not enough free space for the copy.', 'Free some space on that drive and try again.');
|
|
71
|
+
}
|
|
72
|
+
async function turnOn(ctx) {
|
|
73
|
+
requireAvailable();
|
|
74
|
+
requireNoSandbox();
|
|
75
|
+
const storage = storageFor(ctx);
|
|
76
|
+
const { config } = ctx.loaded;
|
|
77
|
+
const configFile = ctx.loaded.configPath ?? userConfigPath();
|
|
78
|
+
console.log(c.yellow(BETA + 'Contained storage keeps the sandbox tools, state and logs in one disk image file.'));
|
|
79
|
+
console.log(' image: ' + storage.paths.image + (storage.imageExists() ? ' (exists, it is used as it is)' : ''));
|
|
80
|
+
console.log(' limit: ' + config.storage.containedMaxGb + ' GB (storage.containedMaxGb; the file grows only as it fills)');
|
|
81
|
+
console.log(' Windows asks for permission to mount it each time a sandbox starts (and once when it closes).');
|
|
82
|
+
if (!ctx.options.yes &&
|
|
83
|
+
!(await askRequired('Turn contained storage on?', 'Add --yes to turn it on without asking.', true)))
|
|
84
|
+
return fail('Nothing was changed.', 'Run sandbox storage contained on when you want it.');
|
|
85
|
+
const mount = await working('Making and mounting the image (Windows asks for permission)', () => storage.acquire({ id: 'cli', pid: process.pid }, { create: true }));
|
|
86
|
+
try {
|
|
87
|
+
const plan = planTransfer(ctx.dataPath, mount, ctx.storageRoot);
|
|
88
|
+
if (plan.folders.length > 0) {
|
|
89
|
+
console.log('\nThese folders hold your tools, state and logs now:');
|
|
90
|
+
printPlan(plan, 'the image');
|
|
91
|
+
assertTargetsFree(plan);
|
|
92
|
+
const move = ctx.options.yes || (await askRequired('Move them into the image?', 'Add --yes to move without asking.', true));
|
|
93
|
+
if (move) {
|
|
94
|
+
let line = 'Copying';
|
|
95
|
+
const result = await working(() => line, () => runTransfer(plan, ctx.dataPath, (p) => {
|
|
96
|
+
line = 'Copying: ' + p.files.toLocaleString('en-US') + ' files, ' + humanBytes(p.bytes);
|
|
97
|
+
}));
|
|
98
|
+
console.log('Moved ' + result.files.toLocaleString('en-US') + ' files into the image.');
|
|
99
|
+
for (const note of result.notes)
|
|
100
|
+
console.log(c.yellow(note));
|
|
101
|
+
}
|
|
102
|
+
else
|
|
103
|
+
console.log('They stay where they are and are not used: tools are downloaded again into the image. Delete them later with sandbox data clean.');
|
|
104
|
+
}
|
|
105
|
+
writeContainedSetting(configFile, 'vhdx');
|
|
106
|
+
}
|
|
107
|
+
finally {
|
|
108
|
+
const done = await working('Dismounting the image (Windows asks for permission)', () => storage.release('cli'));
|
|
109
|
+
if (!done.dismounted)
|
|
110
|
+
console.log(c.yellow('The image stays mounted (' + (done.note ?? '') + '). sandbox repair dismounts it.'));
|
|
111
|
+
}
|
|
112
|
+
console.log('Contained storage is on. sandbox launch mounts the image first.');
|
|
113
|
+
return 0;
|
|
114
|
+
}
|
|
115
|
+
async function turnOff(ctx) {
|
|
116
|
+
requireAvailable();
|
|
117
|
+
requireNoSandbox();
|
|
118
|
+
const storage = storageFor(ctx);
|
|
119
|
+
const configFile = ctx.loaded.configPath ?? userConfigPath();
|
|
120
|
+
console.log(c.yellow(BETA + 'Turning contained storage off moves the files back into plain folders.'));
|
|
121
|
+
if (!storage.imageExists()) {
|
|
122
|
+
writeContainedSetting(configFile, 'off');
|
|
123
|
+
console.log('There is no image, so there was nothing to move. Contained storage is off.');
|
|
124
|
+
return 0;
|
|
125
|
+
}
|
|
126
|
+
const mount = await working('Mounting the image (Windows asks for permission)', () => storage.acquire({ id: 'cli', pid: process.pid }));
|
|
127
|
+
let moved = false;
|
|
128
|
+
try {
|
|
129
|
+
const plan = planTransfer(mount, ctx.dataPath, ctx.dataPath);
|
|
130
|
+
if (plan.folders.length > 0) {
|
|
131
|
+
console.log('\nIn the image:');
|
|
132
|
+
printPlan(plan, ctx.dataPath);
|
|
133
|
+
assertTargetsFree(plan);
|
|
134
|
+
if (!ctx.options.yes &&
|
|
135
|
+
!(await askRequired('Move them back out of the image?', 'Add --yes to move without asking.', true)))
|
|
136
|
+
return fail('Nothing was moved.', 'Contained storage is still on.');
|
|
137
|
+
let line = 'Copying';
|
|
138
|
+
const result = await working(() => line, () => runTransfer(plan, mount, (p) => {
|
|
139
|
+
line = 'Copying: ' + p.files.toLocaleString('en-US') + ' files, ' + humanBytes(p.bytes);
|
|
140
|
+
}));
|
|
141
|
+
console.log('Moved ' + result.files.toLocaleString('en-US') + ' files back.');
|
|
142
|
+
for (const note of result.notes)
|
|
143
|
+
console.log(c.yellow(note));
|
|
144
|
+
}
|
|
145
|
+
writeContainedSetting(configFile, 'off');
|
|
146
|
+
moved = true;
|
|
147
|
+
}
|
|
148
|
+
finally {
|
|
149
|
+
const done = await working('Dismounting the image (Windows asks for permission)', () => storage.release('cli'));
|
|
150
|
+
if (!done.dismounted)
|
|
151
|
+
console.log(c.yellow('The image stays mounted (' + (done.note ?? '') + '). sandbox repair dismounts it.'));
|
|
152
|
+
else if (!moved)
|
|
153
|
+
console.log('The image was dismounted; contained storage is still on.');
|
|
154
|
+
}
|
|
155
|
+
console.log('Contained storage is off: tools, state and logs are plain folders in ' + ctx.dataPath + '.');
|
|
156
|
+
const bytes = fs.statSync(storage.paths.image).size;
|
|
157
|
+
if (!ctx.options.yes &&
|
|
158
|
+
(await askRequired('Delete the image file now (' + humanBytes(bytes) + ')? Everything in it was moved out.', 'Answer no to keep it.', false))) {
|
|
159
|
+
await storage.deleteImage();
|
|
160
|
+
console.log('Deleted ' + storage.paths.image + '.');
|
|
161
|
+
}
|
|
162
|
+
else
|
|
163
|
+
console.log('The image file is kept: ' + storage.paths.image + ' (delete it yourself when you are sure).');
|
|
164
|
+
return 0;
|
|
165
|
+
}
|
|
166
|
+
/** `sandbox storage contained [status|on|off]`. */
|
|
167
|
+
export function contained(ctx) {
|
|
168
|
+
const [, mode = 'status'] = ctx.options.positionals;
|
|
169
|
+
switch (mode) {
|
|
170
|
+
case 'status':
|
|
171
|
+
return status(ctx);
|
|
172
|
+
case 'on':
|
|
173
|
+
return turnOn(ctx);
|
|
174
|
+
case 'off':
|
|
175
|
+
return turnOff(ctx);
|
|
176
|
+
default:
|
|
177
|
+
return Promise.resolve(fail('Unknown action "' + mode + '" for contained storage.', 'Use: sandbox storage contained on, off or status'));
|
|
178
|
+
}
|
|
179
|
+
}
|