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
|
@@ -1,15 +1,28 @@
|
|
|
1
1
|
import { userDir } from '../../../core/config/index.js';
|
|
2
2
|
import { autoMigrates, continuesAfterFailedMigration, MigrateService, } from '../../services/index.js';
|
|
3
|
+
import { askRequired } from '../../../core/prompt.js';
|
|
3
4
|
import { c } from '../../output/index.js';
|
|
4
5
|
import { errMsg, UserError } from '../../../core/util/index.js';
|
|
5
6
|
import { insideSandbox } from '../../../host/sandbox/index.js';
|
|
6
|
-
|
|
7
|
+
import { holdsData, oldDefaultRoot } from '../../../host/storage/index.js';
|
|
8
|
+
import { refreshStorage } from '../context.js';
|
|
9
|
+
/**
|
|
10
|
+
* Where this context keeps the saved settings. Backups go where the data is: an upgrade that has not pinned the old
|
|
11
|
+
* folder yet would otherwise fill the new, empty default folder with them.
|
|
12
|
+
*/
|
|
7
13
|
function whereOf(ctx) {
|
|
8
|
-
|
|
14
|
+
const old = oldDefaultRoot();
|
|
15
|
+
const unpinned = old !== null && !holdsData(ctx.storageRoot) && holdsData(old) && !ctx.loaded.layers?.machine;
|
|
16
|
+
return { storageRoot: unpinned ? old : ctx.storageRoot, userDir: userDir(), configPath: ctx.loaded.configPath };
|
|
9
17
|
}
|
|
10
18
|
/** `sandbox migrate`: the work, with the service and the output given so a test can drive it. */
|
|
11
19
|
export async function runMigrate(service, options, print) {
|
|
12
20
|
if (options.restore) {
|
|
21
|
+
if (!options.yes &&
|
|
22
|
+
!(await askRequired('Put back the files saved in ' + options.restore + '? Your current settings files are replaced.', 'Add --yes to put them back without asking.'))) {
|
|
23
|
+
print('Nothing was changed.');
|
|
24
|
+
return 1;
|
|
25
|
+
}
|
|
13
26
|
service.restore(options.restore);
|
|
14
27
|
print('Put back the files saved in ' + options.restore + '.');
|
|
15
28
|
return 0;
|
|
@@ -31,7 +44,7 @@ export async function runMigrate(service, options, print) {
|
|
|
31
44
|
return 0;
|
|
32
45
|
}
|
|
33
46
|
export function migrate(ctx) {
|
|
34
|
-
return runMigrate(new MigrateService(whereOf(ctx)), { dryRun: ctx.options.dryRun, restore: ctx.options.restore }, (line) => console.log(line));
|
|
47
|
+
return runMigrate(new MigrateService(whereOf(ctx)), { dryRun: ctx.options.dryRun, restore: ctx.options.restore, yes: ctx.options.yes }, (line) => console.log(line));
|
|
35
48
|
}
|
|
36
49
|
/**
|
|
37
50
|
* Before a command: brings the settings up to date when the version changed (one small file is read otherwise).
|
|
@@ -44,7 +57,9 @@ export async function migrateBeforeCommand(ctx, command) {
|
|
|
44
57
|
try {
|
|
45
58
|
if (!service.versionChanged())
|
|
46
59
|
return;
|
|
47
|
-
await service.run((line) => console.error(c.dim(line)));
|
|
60
|
+
const result = await service.run((line) => console.error(c.dim(line)));
|
|
61
|
+
if (result.applied.length)
|
|
62
|
+
refreshStorage(ctx);
|
|
48
63
|
}
|
|
49
64
|
catch (e) {
|
|
50
65
|
if (!continuesAfterFailedMigration(command))
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { isSandboxRunning } from '../../../host/sandbox/index.js';
|
|
2
2
|
import { syncBack } from '../../../sync/index.js';
|
|
3
|
+
import { nextStep } from '../../output/index.js';
|
|
3
4
|
export function sync(ctx) {
|
|
4
5
|
const running = isSandboxRunning();
|
|
5
6
|
const result = syncBack(ctx.dataPath, !running);
|
|
@@ -8,5 +9,6 @@ export function sync(ctx) {
|
|
|
8
9
|
' item(s) synced back. claude-mem: ' +
|
|
9
10
|
result.claudeMem +
|
|
10
11
|
(running ? ' (claude-mem syncs when the sandbox closes)' : ''));
|
|
12
|
+
nextStep('sandbox claude (carry on where you left off)');
|
|
11
13
|
return 0;
|
|
12
14
|
}
|
|
@@ -6,6 +6,8 @@ export interface UpdateRequest {
|
|
|
6
6
|
readonly rollback: boolean;
|
|
7
7
|
readonly auto?: 'on' | 'off';
|
|
8
8
|
readonly unattended: boolean;
|
|
9
|
+
/** Do not ask before going back. */
|
|
10
|
+
readonly yes?: boolean;
|
|
9
11
|
}
|
|
10
12
|
/** One sentence for what an update run did, and whether it counts as done. */
|
|
11
13
|
export declare function describeResult(result: UpdateResult | null, unattended: boolean): {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { userDir } from '../../../core/config/index.js';
|
|
2
|
+
import { askRequired } from '../../../core/prompt.js';
|
|
2
3
|
import { errMsg } from '../../../core/util/index.js';
|
|
3
4
|
import { PACKAGE_ROOT } from '../../../core/package-info.js';
|
|
4
5
|
import { insideSandbox, spawnDetached } from '../../../host/sandbox/index.js';
|
|
@@ -23,8 +24,14 @@ export function describeResult(result, unattended) {
|
|
|
23
24
|
result.version +
|
|
24
25
|
' failed: ' +
|
|
25
26
|
result.reason.replace(/\.?\s*$/, '.') +
|
|
26
|
-
|
|
27
|
-
|
|
27
|
+
(result.rolledBack
|
|
28
|
+
? ' The change was undone: you are on the version you had.'
|
|
29
|
+
: ' Going back to your previous version did not fully work: run sandbox update --rollback or the installer.') +
|
|
30
|
+
(result.autoUpdateOff
|
|
31
|
+
? ' Automatic updates are off; turn them back on in Maintenance > Updates or with sandbox update --auto on.'
|
|
32
|
+
: result.blocked
|
|
33
|
+
? ' It is not tried again; the next release is.'
|
|
34
|
+
: ' It is tried again later.'),
|
|
28
35
|
code: 1,
|
|
29
36
|
};
|
|
30
37
|
switch (result.reason) {
|
|
@@ -52,12 +59,22 @@ export async function runUpdate(service, request, print) {
|
|
|
52
59
|
print('This copy was installed with npm. Update it with: ' + NPM_UPDATE_COMMAND);
|
|
53
60
|
return 0;
|
|
54
61
|
}
|
|
62
|
+
// The scheduled task (it may outlive a removal that needed admin) and background starts only run when updates are on.
|
|
63
|
+
if (request.unattended && !request.auto && !service.status().autoUpdate)
|
|
64
|
+
return 0;
|
|
55
65
|
if (request.auto) {
|
|
56
66
|
service.setAuto(request.auto === 'on');
|
|
57
67
|
print('Automatic updates are ' + request.auto + '.');
|
|
58
68
|
return 0;
|
|
59
69
|
}
|
|
60
70
|
if (request.rollback) {
|
|
71
|
+
const { version, state } = service.status();
|
|
72
|
+
const target = state.previous ? 'version ' + state.previous : 'the version before the last update';
|
|
73
|
+
if (!request.yes &&
|
|
74
|
+
!(await askRequired('Go back from version ' + version + ' to ' + target + '?', 'Add --yes to go back without asking.'))) {
|
|
75
|
+
print('Nothing was changed.');
|
|
76
|
+
return 1;
|
|
77
|
+
}
|
|
61
78
|
print('Went back to version ' + service.rollback() + '.');
|
|
62
79
|
return 0;
|
|
63
80
|
}
|
|
@@ -77,10 +94,16 @@ export async function runUpdate(service, request, print) {
|
|
|
77
94
|
}
|
|
78
95
|
export function update(options) {
|
|
79
96
|
const service = UpdateService.forPackage(PACKAGE_ROOT, options.feed, { userDir: userDir() });
|
|
80
|
-
return runUpdate(service, {
|
|
97
|
+
return runUpdate(service, {
|
|
98
|
+
check: options.check,
|
|
99
|
+
rollback: options.rollback,
|
|
100
|
+
auto: options.autoUpdate,
|
|
101
|
+
unattended: options.unattended,
|
|
102
|
+
yes: options.yes,
|
|
103
|
+
}, (line) => console.log(line));
|
|
81
104
|
}
|
|
82
105
|
/** Commands that never look for updates first: they are how updates run, or they must stay quiet. */
|
|
83
|
-
const NO_STARTUP_UPDATE = ['self-test', 'update', '_watch'];
|
|
106
|
+
const NO_STARTUP_UPDATE = ['self-test', 'update', '_watch', '_web'];
|
|
84
107
|
/**
|
|
85
108
|
* At the start of a command: tells this user once about an update that ran without them, and (current-user installs
|
|
86
109
|
* with automatic updates on) starts the daily check in the background. Never stops the command.
|
|
@@ -3,13 +3,13 @@
|
|
|
3
3
|
// folder a project of the running sandbox when it can without a restart (launch, start, exec, db).
|
|
4
4
|
import path from 'node:path';
|
|
5
5
|
import { select } from '@inquirer/prompts';
|
|
6
|
-
import { describeMissing, missingTip } from '../../../core/local-config/index.js';
|
|
6
|
+
import { describeMissing, missingTip, protectionsOf } from '../../../core/local-config/index.js';
|
|
7
7
|
import { askYesNo } from '../../../core/prompt.js';
|
|
8
8
|
import { fail, isInsideOrEqual } from '../../../core/util/index.js';
|
|
9
9
|
import { ownerName } from '../../../host/sharing/index.js';
|
|
10
10
|
import { resolveRun } from '../../../core/run/index.js';
|
|
11
11
|
import { SandboxChannel } from '../../../host/channel/index.js';
|
|
12
|
-
import { BorrowedRegistry, ProjectRegistry, joinRunning, } from '../../../host/projects/index.js';
|
|
12
|
+
import { BorrowedRegistry, ProjectRegistry, joinRunning, runningRegistry, } from '../../../host/projects/index.js';
|
|
13
13
|
import { c, working } from '../../output/index.js';
|
|
14
14
|
import { describeSessions } from './describe-sessions.js';
|
|
15
15
|
import { guestPathFor } from '../context.js';
|
|
@@ -21,17 +21,22 @@ export function registryOf(ctx) {
|
|
|
21
21
|
export function hereDir(ctx) {
|
|
22
22
|
return path.resolve(ctx.options.workspace ?? process.cwd());
|
|
23
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* Your running sandbox's registry, rebuilt from its launch folder when the file is missing, unreadable or an earlier
|
|
26
|
+
* sandbox's (another copy or version of this tool started it). null only for a sandbox without one at all.
|
|
27
|
+
*/
|
|
28
|
+
function ownRegistry(ctx) {
|
|
29
|
+
return runningRegistry(ctx.storageRoot, ctx.dataPath, protectionsOf(ctx.loaded.config));
|
|
30
|
+
}
|
|
24
31
|
/** Where this folder is in the running sandbox, if it is in it at all (nothing is registered). */
|
|
25
32
|
export function locateHere(ctx, status) {
|
|
26
33
|
const dir = hereDir(ctx);
|
|
34
|
+
const own = ctx.borrowed ? null : ownRegistry(ctx);
|
|
27
35
|
const here = registryOf(ctx).here(dir);
|
|
28
36
|
if (here)
|
|
29
37
|
return here;
|
|
30
38
|
// A sandbox started before projects existed: only its launch folder.
|
|
31
|
-
if (!ctx.borrowed &&
|
|
32
|
-
!new ProjectRegistry(ctx.storageRoot).read() &&
|
|
33
|
-
status &&
|
|
34
|
-
isInsideOrEqual(status.workspaceHost, dir))
|
|
39
|
+
if (!ctx.borrowed && !own && status && isInsideOrEqual(status.workspaceHost, dir))
|
|
35
40
|
return { project: null, guestDir: guestPathFor(dir, status.workspaceHost, status.guestWorkspace) };
|
|
36
41
|
return { project: null, guestDir: null };
|
|
37
42
|
}
|
|
@@ -57,7 +62,7 @@ export async function joinHere(ctx, status, o = {}) {
|
|
|
57
62
|
return { project: known.project, guestDir: known.guestDir, spec: null, harness: null, notes: [] };
|
|
58
63
|
}
|
|
59
64
|
// A sandbox started before projects existed: only its launch folder (guestPathFor explains why otherwise).
|
|
60
|
-
if (!
|
|
65
|
+
if (!ownRegistry(ctx))
|
|
61
66
|
return {
|
|
62
67
|
project: null,
|
|
63
68
|
guestDir: guestPathFor(dir, status.workspaceHost, status.guestWorkspace),
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
// `sandbox projects`: which projects a sandbox can open without a restart. Project roots (whole folders of projects),
|
|
2
|
-
// the projects this tool has started before, and projects
|
|
2
|
+
// the projects this tool has started before, and the all-projects and exclude settings. Changes to what is mapped take
|
|
3
3
|
// effect at the next start; a project you start while a sandbox runs joins it when it can (projects.ts in host/).
|
|
4
4
|
import path from 'node:path';
|
|
5
5
|
import { checkbox } from '@inquirer/prompts';
|
|
6
|
+
import { askChoice } from '../../../core/prompt.js';
|
|
6
7
|
import { fail } from '../../../core/util/index.js';
|
|
7
8
|
import { isSandboxRunning } from '../../../host/sandbox/index.js';
|
|
8
|
-
import { c, pageSizeFor, shortenMiddle, termWidth, printJson, table } from '../../output/index.js';
|
|
9
|
+
import { c, nextStep, pageSizeFor, shortenMiddle, termWidth, printJson, table } from '../../output/index.js';
|
|
9
10
|
import { ProjectsService } from '../../services/index.js';
|
|
10
11
|
const NEXT_START = 'This changes what is mapped from the next start.';
|
|
11
12
|
function runningNote() {
|
|
@@ -18,7 +19,7 @@ function list(ctx, service) {
|
|
|
18
19
|
const rows = listing.projects;
|
|
19
20
|
if (printJson(ctx, { all: listing.all, roots: listing.roots, exclude: listing.exclude, projects: rows }))
|
|
20
21
|
return 0;
|
|
21
|
-
console.log(c.bold('projects
|
|
22
|
+
console.log(c.bold('All projects') +
|
|
22
23
|
': ' +
|
|
23
24
|
(listing.all ? 'on (every project below is mapped at every start, except excluded ones)' : 'off') +
|
|
24
25
|
c.dim(' sandbox projects all on|off'));
|
|
@@ -42,7 +43,7 @@ function list(ctx, service) {
|
|
|
42
43
|
console.log(c.dim('* = this folder. Choose with: sandbox projects choose'));
|
|
43
44
|
return 0;
|
|
44
45
|
}
|
|
45
|
-
/** Ticks the projects mapped at every start (turns projects
|
|
46
|
+
/** Ticks the projects mapped at every start (any ticked turns all-projects on); the rest are excluded. */
|
|
46
47
|
async function choose(service) {
|
|
47
48
|
const rows = service.rows().filter((r) => !r.root);
|
|
48
49
|
if (!rows.length) {
|
|
@@ -65,14 +66,22 @@ async function choose(service) {
|
|
|
65
66
|
console.log(mapped + ' project(s) mapped at every start, ' + excluded + ' excluded. ' + NEXT_START + runningNote());
|
|
66
67
|
return 0;
|
|
67
68
|
}
|
|
69
|
+
/** The folder typed, or one picked from the known projects (or this folder) when it was left out. */
|
|
70
|
+
async function folderOf(service, action, given) {
|
|
71
|
+
if (given)
|
|
72
|
+
return given;
|
|
73
|
+
const rows = service.rows();
|
|
74
|
+
return askChoice('Which folder?', [
|
|
75
|
+
{ name: 'This folder (' + shortenMiddle(process.cwd(), termWidth() - 30) + ')', value: '.' },
|
|
76
|
+
...rows.filter((r) => !r.here).map((r) => ({ name: shortenMiddle(r.folder, termWidth() - 12), value: r.folder })),
|
|
77
|
+
], 'Usage: sandbox projects ' + action + ' <folder> (. = this folder)');
|
|
78
|
+
}
|
|
68
79
|
function add(service, value) {
|
|
69
80
|
const dir = service.add(value);
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
(
|
|
74
|
-
? ' ' + NEXT_START
|
|
75
|
-
: ' It is mapped at every start once projects.all is on (sandbox projects all on).'));
|
|
81
|
+
const all = service.settings().all;
|
|
82
|
+
console.log('Added ' + dir + ' to your projects.' + (all ? ' ' + NEXT_START : ''));
|
|
83
|
+
if (!all)
|
|
84
|
+
nextStep('sandbox projects all on (map every project at every start)');
|
|
76
85
|
return 0;
|
|
77
86
|
}
|
|
78
87
|
function remove(service, value) {
|
|
@@ -88,18 +97,18 @@ function includeOrExclude(service, action, value) {
|
|
|
88
97
|
? (action === 'exclude' ? 'Excluded ' : 'Included ') + path.resolve(value) + '. ' + NEXT_START
|
|
89
98
|
: 'Nothing changed.') +
|
|
90
99
|
(action === 'include' && !service.settings().all
|
|
91
|
-
? '
|
|
100
|
+
? ' Mapping all projects is off: sandbox projects all on maps your projects at every start.'
|
|
92
101
|
: '') +
|
|
93
102
|
(changed ? runningNote() : ''));
|
|
94
103
|
return 0;
|
|
95
104
|
}
|
|
96
105
|
function all(service, value) {
|
|
97
106
|
if (value === undefined) {
|
|
98
|
-
console.log('
|
|
107
|
+
console.log('Mapping all projects at every start is ' + (service.settings().all ? 'on' : 'off') + '.');
|
|
99
108
|
return 0;
|
|
100
109
|
}
|
|
101
110
|
service.setAll(value === 'on');
|
|
102
|
-
console.log('
|
|
111
|
+
console.log('Mapping all projects at every start is ' +
|
|
103
112
|
value +
|
|
104
113
|
'. ' +
|
|
105
114
|
NEXT_START +
|
|
@@ -137,17 +146,17 @@ export async function projects(ctx) {
|
|
|
137
146
|
case 'choose':
|
|
138
147
|
return choose(service);
|
|
139
148
|
case 'add':
|
|
140
|
-
return add(service, value);
|
|
149
|
+
return add(service, await folderOf(service, action, value));
|
|
141
150
|
case 'remove':
|
|
142
|
-
return remove(service, value);
|
|
151
|
+
return remove(service, await folderOf(service, action, value));
|
|
143
152
|
case 'include':
|
|
144
153
|
case 'exclude':
|
|
145
|
-
return includeOrExclude(service, action, value);
|
|
154
|
+
return includeOrExclude(service, action, await folderOf(service, action, value));
|
|
146
155
|
case 'all':
|
|
147
156
|
return all(service, value);
|
|
148
157
|
case 'roots':
|
|
149
158
|
return roots(service, value, folder);
|
|
150
159
|
default:
|
|
151
|
-
return fail('Unknown projects action "' + action + '".');
|
|
160
|
+
return fail('Unknown projects action "' + action + '".', 'Use: sandbox projects list | choose | add | remove | include | exclude | all | roots');
|
|
152
161
|
}
|
|
153
162
|
}
|
|
@@ -1,26 +1,24 @@
|
|
|
1
1
|
import { launch } from './launch/index.js';
|
|
2
2
|
import { setup } from './setup/index.js';
|
|
3
3
|
import { data } from './data/index.js';
|
|
4
|
-
import {
|
|
4
|
+
import { storage } from './storage/index.js';
|
|
5
|
+
import { attach, db, exec } from './sessions/index.js';
|
|
5
6
|
import { account } from './accounts.js';
|
|
6
7
|
import { projects } from './projects/index.js';
|
|
7
8
|
import { audit, claudeHost, clean, config, doctor, hostCommand, logs, migrate, sync, watcher, } from './maintenance/index.js';
|
|
9
|
+
import { engine } from './engine.js';
|
|
8
10
|
import { resume } from './resume.js';
|
|
9
11
|
import { agentCommandsCommand } from './agent-commands.js';
|
|
12
|
+
import { vpn } from './vpn.js';
|
|
13
|
+
import { web, webServer } from './web.js';
|
|
10
14
|
export const HANDLERS = {
|
|
11
15
|
launch: (ctx) => launch(ctx),
|
|
12
16
|
generate: (ctx) => launch(ctx, true),
|
|
13
17
|
attach: attach,
|
|
14
|
-
sessions: sessions,
|
|
15
|
-
status: status,
|
|
16
18
|
exec: exec,
|
|
17
19
|
'agent-commands': agentCommandsCommand,
|
|
18
20
|
db: db,
|
|
19
|
-
restart: restart,
|
|
20
21
|
resume: resume,
|
|
21
|
-
stop: stop,
|
|
22
|
-
show: show,
|
|
23
|
-
hide: hide,
|
|
24
22
|
account: account,
|
|
25
23
|
projects: projects,
|
|
26
24
|
sync: sync,
|
|
@@ -32,7 +30,12 @@ export const HANDLERS = {
|
|
|
32
30
|
migrate: migrate,
|
|
33
31
|
setup: setup,
|
|
34
32
|
data: data,
|
|
33
|
+
storage: storage,
|
|
34
|
+
engine: engine,
|
|
35
35
|
'host-claude': claudeHost,
|
|
36
36
|
host: hostCommand,
|
|
37
37
|
_watch: watcher,
|
|
38
|
+
vpn: vpn,
|
|
39
|
+
web: web,
|
|
40
|
+
_web: webServer,
|
|
38
41
|
};
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// Agents: is the default agent one of those configured, and for each agent that keeps a login, is a saved login in
|
|
2
|
+
// use in this data folder. Looks only; logins are never changed here.
|
|
3
|
+
import { errMsg } from '../../../../core/util/index.js';
|
|
4
|
+
import { AccountStore, AgentAccountStore } from '../../../../host/profile/index.js';
|
|
5
|
+
import { ok, plural } from './common.js';
|
|
6
|
+
function rowsOf(env, name, loginFiles) {
|
|
7
|
+
if (name === 'claude')
|
|
8
|
+
return new AccountStore(env.storageRoot).list(env.dataPath);
|
|
9
|
+
return loginFiles ? new AgentAccountStore(env.storageRoot, name, loginFiles).list(env.dataPath) : [];
|
|
10
|
+
}
|
|
11
|
+
export const AGENT_CHECKS = [
|
|
12
|
+
{
|
|
13
|
+
id: 'agents-default',
|
|
14
|
+
group: 'Agents & tools',
|
|
15
|
+
name: 'Default agent',
|
|
16
|
+
run: (env) => {
|
|
17
|
+
const config = env.ctx.loaded.config;
|
|
18
|
+
const name = env.ctx.options.harness ?? config.defaultHarness;
|
|
19
|
+
const harness = config.harnesses[name];
|
|
20
|
+
if (!harness)
|
|
21
|
+
return {
|
|
22
|
+
status: 'needs-you',
|
|
23
|
+
detail: '"' + name + '" is not one of your configured agents (' + Object.keys(config.harnesses).join(', ') + ')',
|
|
24
|
+
means: 'sandbox launch has no agent to start.',
|
|
25
|
+
fix: 'Set defaultHarness in your settings to one of those names (sandbox config path shows the file).',
|
|
26
|
+
};
|
|
27
|
+
return ok(name + ' (' + plural(Object.keys(config.harnesses).length, 'agent') + ' configured)');
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
id: 'agents-logins',
|
|
32
|
+
group: 'Agents & tools',
|
|
33
|
+
name: 'Agent logins',
|
|
34
|
+
run: (env) => {
|
|
35
|
+
const harnesses = env.ctx.loaded.config.harnesses;
|
|
36
|
+
const lines = [];
|
|
37
|
+
const idle = [];
|
|
38
|
+
for (const [name, harness] of Object.entries(harnesses)) {
|
|
39
|
+
let rows;
|
|
40
|
+
try {
|
|
41
|
+
rows = rowsOf(env, name, harness.home?.loginFiles);
|
|
42
|
+
}
|
|
43
|
+
catch (e) {
|
|
44
|
+
lines.push(name + ': saved logins cannot be read (' + errMsg(e) + ')');
|
|
45
|
+
idle.push(name);
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
if (!rows.length)
|
|
49
|
+
continue;
|
|
50
|
+
const active = rows.find((r) => r.isActive);
|
|
51
|
+
if (active)
|
|
52
|
+
lines.push(name + ': ' + active.name + ' is in use (' + plural(rows.length, 'login') + ' saved)');
|
|
53
|
+
else {
|
|
54
|
+
lines.push(name + ': ' + plural(rows.length, 'login') + ' saved, none in use here');
|
|
55
|
+
idle.push(name);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (!lines.length)
|
|
59
|
+
return ok('no saved logins (sign in inside the sandbox the first time)');
|
|
60
|
+
if (!idle.length)
|
|
61
|
+
return { ...ok(lines.join('; ')) };
|
|
62
|
+
return {
|
|
63
|
+
status: 'warn',
|
|
64
|
+
detail: lines.join('; '),
|
|
65
|
+
means: 'The sandbox starts signed out for ' + idle.join(', ') + ' until you pick a saved login.',
|
|
66
|
+
fix: 'Run: sandbox account use <name>' + (idle[0] === 'claude' ? '' : ' --agent ' + idle[0]),
|
|
67
|
+
};
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
];
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Finding, RepairEnv } from '../types.js';
|
|
2
|
+
export declare function ok(detail: string): Finding;
|
|
3
|
+
export declare function rel(root: string, p: string): string;
|
|
4
|
+
/** Throws unless every folder from the data folder's parent down to `p` is real (no link the sandbox made). */
|
|
5
|
+
export declare function guard(env: RepairEnv, p: string): void;
|
|
6
|
+
export declare function plural(n: number, one: string, many?: string): string;
|
|
7
|
+
/** The current Windows user's name (what the group lists, without the domain). */
|
|
8
|
+
export declare function sameUser(account: string, user: string): boolean;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// Small helpers the checks share.
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { assertNoLinks } from '../../../../core/util/index.js';
|
|
4
|
+
export function ok(detail) {
|
|
5
|
+
return { status: 'ok', detail };
|
|
6
|
+
}
|
|
7
|
+
export function rel(root, p) {
|
|
8
|
+
return path.relative(root, p) || '.';
|
|
9
|
+
}
|
|
10
|
+
/** Throws unless every folder from the data folder's parent down to `p` is real (no link the sandbox made). */
|
|
11
|
+
export function guard(env, p) {
|
|
12
|
+
assertNoLinks(path.dirname(env.dataPath), p);
|
|
13
|
+
}
|
|
14
|
+
export function plural(n, one, many = one + 's') {
|
|
15
|
+
return n + ' ' + (n === 1 ? one : many);
|
|
16
|
+
}
|
|
17
|
+
/** The current Windows user's name (what the group lists, without the domain). */
|
|
18
|
+
export function sameUser(account, user) {
|
|
19
|
+
const a = account.toLowerCase();
|
|
20
|
+
const u = user.toLowerCase();
|
|
21
|
+
return a === u || a.endsWith('\\' + u);
|
|
22
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
// Contained storage (beta): the image is there, what the record says is mounted matches what is really mounted, and
|
|
2
|
+
// the folders around the image are private. A mount left behind (a sandbox that ended without letting go, a crash) is
|
|
3
|
+
// dismounted here, which needs the Windows permission prompt.
|
|
4
|
+
import fs from 'node:fs';
|
|
5
|
+
import { isWin } from '../../../../core/util/index.js';
|
|
6
|
+
import { parseIcacls, privacyProblems, SHARING_GROUP } from '../../../../host/health/index.js';
|
|
7
|
+
import { realContainedDeps } from '../../../../host/sandbox/index.js';
|
|
8
|
+
import { protectPrivateFolder } from '../../../../host/sharing/index.js';
|
|
9
|
+
import { containedAvailability, ContainedStorage, containedPaths } from '../../../../host/storage/index.js';
|
|
10
|
+
import { ok } from './common.js';
|
|
11
|
+
function storageOf(env) {
|
|
12
|
+
const { config } = env.ctx.loaded;
|
|
13
|
+
return new ContainedStorage(realContainedDeps(env.storageRoot, config.storage.containedMaxGb), config.storage.dataName);
|
|
14
|
+
}
|
|
15
|
+
/** Only when contained storage is on, or an image or a record of one exists. */
|
|
16
|
+
const inUse = (env) => {
|
|
17
|
+
if (!isWin)
|
|
18
|
+
return false;
|
|
19
|
+
const { config } = env.ctx.loaded;
|
|
20
|
+
const paths = containedPaths(env.storageRoot, config.storage.dataName);
|
|
21
|
+
return config.storage.contained === 'vhdx' || fs.existsSync(paths.image) || fs.existsSync(paths.stateFile);
|
|
22
|
+
};
|
|
23
|
+
export const CONTAINED_CHECKS = [
|
|
24
|
+
{
|
|
25
|
+
id: 'data-contained',
|
|
26
|
+
group: 'Data folder',
|
|
27
|
+
name: 'Contained storage',
|
|
28
|
+
checking: 'the contained storage image (beta)',
|
|
29
|
+
applies: inUse,
|
|
30
|
+
timeoutMs: 60_000,
|
|
31
|
+
run: async (env) => {
|
|
32
|
+
const wanted = env.ctx.loaded.config.storage.contained === 'vhdx';
|
|
33
|
+
const available = containedAvailability();
|
|
34
|
+
if (!available.available)
|
|
35
|
+
return wanted
|
|
36
|
+
? {
|
|
37
|
+
status: 'needs-you',
|
|
38
|
+
detail: 'storage.contained is "vhdx", but ' + available.reasons.join(' '),
|
|
39
|
+
means: 'A launch cannot mount the image on this PC.',
|
|
40
|
+
fix: available.fixes.join(' '),
|
|
41
|
+
}
|
|
42
|
+
: {
|
|
43
|
+
status: 'skipped',
|
|
44
|
+
detail: 'an image exists, but this PC cannot look at it: ' + available.reasons.join(' '),
|
|
45
|
+
};
|
|
46
|
+
const storage = storageOf(env);
|
|
47
|
+
const diagnosis = await storage.diagnose();
|
|
48
|
+
switch (diagnosis.kind) {
|
|
49
|
+
case 'image-missing':
|
|
50
|
+
return wanted
|
|
51
|
+
? {
|
|
52
|
+
status: 'needs-you',
|
|
53
|
+
detail: 'the image is missing: ' + storage.paths.image,
|
|
54
|
+
means: 'A launch stops until it is there (the tools, state and logs in it are gone with it).',
|
|
55
|
+
fix: 'Restore the file, or run: sandbox storage contained off (and then on again for a new, empty image).',
|
|
56
|
+
}
|
|
57
|
+
: ok('no image (contained storage is off)');
|
|
58
|
+
case 'in-use':
|
|
59
|
+
return ok('mounted, in use by a running sandbox');
|
|
60
|
+
case 'stale-mount':
|
|
61
|
+
return {
|
|
62
|
+
status: 'needs-you',
|
|
63
|
+
detail: 'the image is still mounted at ' + storage.paths.mount + ', and nothing uses it',
|
|
64
|
+
means: 'It stays attached to this PC until it is dismounted; a launch would reuse it.',
|
|
65
|
+
plan: 'dismount the image (Windows asks for permission)',
|
|
66
|
+
data: 'dismount',
|
|
67
|
+
};
|
|
68
|
+
case 'stale-state':
|
|
69
|
+
return {
|
|
70
|
+
status: 'warn',
|
|
71
|
+
detail: 'the record says the image is mounted, but it is not',
|
|
72
|
+
means: 'Nothing is wrong with the image; the record is out of date.',
|
|
73
|
+
plan: 'correct the record',
|
|
74
|
+
data: 'record',
|
|
75
|
+
};
|
|
76
|
+
default:
|
|
77
|
+
return ok('not mounted' + (wanted ? '' : ' (contained storage is off; the image is kept)'));
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
fix: async (env, finding) => {
|
|
81
|
+
const storage = storageOf(env);
|
|
82
|
+
if (finding.data === 'record') {
|
|
83
|
+
storage.clearRecord();
|
|
84
|
+
return { done: 'corrected the record' };
|
|
85
|
+
}
|
|
86
|
+
const result = await storage.dismountIfIdle();
|
|
87
|
+
if (!result.dismounted)
|
|
88
|
+
throw new Error('Could not dismount the image: ' + (result.note ?? 'unknown reason'));
|
|
89
|
+
return { done: 'dismounted the image' };
|
|
90
|
+
},
|
|
91
|
+
needsIdle: 'fix',
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
id: 'data-contained-privacy',
|
|
95
|
+
group: 'Data folder',
|
|
96
|
+
name: 'Contained storage folders',
|
|
97
|
+
checking: 'who can open the contained storage folders',
|
|
98
|
+
applies: inUse,
|
|
99
|
+
run: (env) => {
|
|
100
|
+
const { config } = env.ctx.loaded;
|
|
101
|
+
const paths = containedPaths(env.storageRoot, config.storage.dataName);
|
|
102
|
+
// While mounted, the mount folder shows the image's own root, and nothing is changed under a mount point.
|
|
103
|
+
if (env.running)
|
|
104
|
+
return ok('a sandbox is running; not looked at now');
|
|
105
|
+
const loose = [];
|
|
106
|
+
for (const dir of [paths.imagesDir, paths.mountsDir, paths.mount]) {
|
|
107
|
+
if (!fs.existsSync(dir))
|
|
108
|
+
continue;
|
|
109
|
+
const text = env.system.icacls(dir);
|
|
110
|
+
if (text === null)
|
|
111
|
+
return { status: 'skipped', detail: 'could not read the permissions of ' + dir };
|
|
112
|
+
const problems = privacyProblems(parseIcacls(text, dir), SHARING_GROUP);
|
|
113
|
+
if (problems.length > 0)
|
|
114
|
+
loose.push(dir + ' (' + problems.join(', ') + ')');
|
|
115
|
+
}
|
|
116
|
+
if (loose.length === 0)
|
|
117
|
+
return ok('private (you, SYSTEM and administrators)');
|
|
118
|
+
return {
|
|
119
|
+
status: 'warn',
|
|
120
|
+
detail: 'open to more than you: ' + loose.join('; '),
|
|
121
|
+
means: 'Other users of this PC could open the image or the folders it is mounted in.',
|
|
122
|
+
plan: 'make them private',
|
|
123
|
+
data: 'private',
|
|
124
|
+
};
|
|
125
|
+
},
|
|
126
|
+
fix: (env) => {
|
|
127
|
+
const { config } = env.ctx.loaded;
|
|
128
|
+
const paths = containedPaths(env.storageRoot, config.storage.dataName);
|
|
129
|
+
// Never with an image mounted below: a folder with files is walked, and a mount point must not be.
|
|
130
|
+
if (env.running)
|
|
131
|
+
throw new Error('a sandbox is running; run repair again once it is closed');
|
|
132
|
+
for (const dir of [paths.imagesDir, paths.mountsDir, paths.mount])
|
|
133
|
+
if (fs.existsSync(dir))
|
|
134
|
+
protectPrivateFolder(dir);
|
|
135
|
+
return { done: 'made the folders private' };
|
|
136
|
+
},
|
|
137
|
+
needsIdle: 'fix',
|
|
138
|
+
},
|
|
139
|
+
];
|