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
|
@@ -25,7 +25,7 @@ export function isSandboxAddress(ip, interfaces = os.networkInterfaces()) {
|
|
|
25
25
|
}));
|
|
26
26
|
}
|
|
27
27
|
/** Where this PC may connect for a session: only addresses on its own Hyper-V network (null if there are none). */
|
|
28
|
-
const hostEndpoint = (session) => {
|
|
28
|
+
export const hostEndpoint = (session) => {
|
|
29
29
|
// Inside the sandbox every session is on loopback; on the PC only addresses on its Hyper-V network are trusted.
|
|
30
30
|
const addresses = insideSandbox()
|
|
31
31
|
? ['127.0.0.1']
|
|
@@ -53,7 +53,7 @@ export async function findUnwatchedSession(dataPath, harness, cwd) {
|
|
|
53
53
|
return null;
|
|
54
54
|
}
|
|
55
55
|
/** Bridges this terminal to a session. Returns the agent's exit code, or 0 when the user detaches. */
|
|
56
|
-
export async function attachTerminal(session) {
|
|
56
|
+
export async function attachTerminal(session, o = {}) {
|
|
57
57
|
if (!process.stdin.isTTY || !process.stdout.isTTY)
|
|
58
58
|
fail('--terminal / attach needs an interactive terminal.', 'Run it directly in Windows Terminal or PowerShell, not through a pipe or script.');
|
|
59
59
|
if (!session.attach)
|
|
@@ -71,7 +71,10 @@ export async function attachTerminal(session) {
|
|
|
71
71
|
safeText(session.cwd) +
|
|
72
72
|
'). Detach any time with Ctrl+]');
|
|
73
73
|
await sleep(400);
|
|
74
|
-
const result = await runTerminalClient(socket, session.attach.token, {
|
|
74
|
+
const result = await runTerminalClient(socket, session.attach.token, {
|
|
75
|
+
detachKey: DETACH_KEY,
|
|
76
|
+
clipboardWrites: o.clipboardWrites,
|
|
77
|
+
});
|
|
75
78
|
switch (result.reason) {
|
|
76
79
|
case 'detach':
|
|
77
80
|
console.log('Detached. The session keeps running; reattach with: sandbox attach ' + session.id);
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import type { GuestRequest, GuestResponse, Harness, SandboxStatus, SessionStatus } from '../../core/types.js';
|
|
2
2
|
import type { ProjectSpec } from '../../shared/channel/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* The boot script writes its first status once Windows has booted the sandbox and logged on (a minute or two, longer on
|
|
5
|
+
* a slow PC or the very first start); none after this long means it never got going.
|
|
6
|
+
*/
|
|
7
|
+
export declare const FIRST_STATUS_MS: number;
|
|
8
|
+
/** True when a boot is silent: no status of this launch yet, and the sandbox had its time to write one. */
|
|
9
|
+
export declare function bootSilent(elapsedMs: number, seenStatus: boolean, limitMs?: number): boolean;
|
|
3
10
|
/** Most sessions the host will ever contact for one listing: a sandbox can write as many session files as it likes. */
|
|
4
11
|
export declare const MAX_QUERIED_SESSIONS = 32;
|
|
5
12
|
/** Where progress lines go: printed by default; a spinner passes its own. Text from the sandbox, made safe first. */
|
|
@@ -39,6 +46,8 @@ export declare class SandboxChannel {
|
|
|
39
46
|
exec(command: string[], cwd: string, timeoutSeconds: number): Promise<GuestResponse>;
|
|
40
47
|
/** Restarts running sessions in place (they resume via the harness's resumeArguments, e.g. claude --continue). */
|
|
41
48
|
restart(harness: string | null, cwd?: string): Promise<GuestResponse>;
|
|
49
|
+
/** The PC is low on memory or CPU: the sandbox slows its builds down for `seconds`. Never waits for an answer. */
|
|
50
|
+
pressure(reason: string, seconds: number): void;
|
|
42
51
|
ping(): Promise<GuestResponse>;
|
|
43
52
|
runningSessions(): SessionStatus[];
|
|
44
53
|
/** Running sessions of the sandbox that is running now (its launch id), newest last, capped. */
|
|
@@ -7,8 +7,18 @@ import { isWithin } from '../../shared/paths/index.js';
|
|
|
7
7
|
import { now, RunDir } from '../../shared/channel/index.js';
|
|
8
8
|
import { safeRemove, writeJsonAtomic } from '../../shared/io/index.js';
|
|
9
9
|
import { isSandboxRunning } from '../sandbox/index.js';
|
|
10
|
+
import { withoutSecrets, writeSecrets } from '../secrets/index.js';
|
|
10
11
|
import { assertTestWritable, refuseInSelfTest } from '../test-guard.js';
|
|
11
12
|
const BOOT_TIMEOUT_MS = 30 * 60 * 1000;
|
|
13
|
+
/**
|
|
14
|
+
* The boot script writes its first status once Windows has booted the sandbox and logged on (a minute or two, longer on
|
|
15
|
+
* a slow PC or the very first start); none after this long means it never got going.
|
|
16
|
+
*/
|
|
17
|
+
export const FIRST_STATUS_MS = 8 * 60 * 1000;
|
|
18
|
+
/** True when a boot is silent: no status of this launch yet, and the sandbox had its time to write one. */
|
|
19
|
+
export function bootSilent(elapsedMs, seenStatus, limitMs = FIRST_STATUS_MS) {
|
|
20
|
+
return !seenStatus && elapsedMs > limitMs;
|
|
21
|
+
}
|
|
12
22
|
/** Most sessions the host will ever contact for one listing: a sandbox can write as many session files as it likes. */
|
|
13
23
|
export const MAX_QUERIED_SESSIONS = 32;
|
|
14
24
|
const printLine = (line) => console.log(line);
|
|
@@ -57,10 +67,20 @@ export class SandboxChannel {
|
|
|
57
67
|
*/
|
|
58
68
|
waitForReady(launchId, progress = (m) => printLine(' [sandbox] ' + m), onStatus) {
|
|
59
69
|
let last = '';
|
|
70
|
+
let seen = false;
|
|
71
|
+
const started = Date.now();
|
|
60
72
|
return this.until(BOOT_TIMEOUT_MS, () => {
|
|
61
73
|
const status = this.run.readSandboxStatus();
|
|
62
|
-
if (!status || (launchId !== null && status.launchId !== launchId))
|
|
74
|
+
if (!status || (launchId !== null && status.launchId !== launchId)) {
|
|
75
|
+
if (bootSilent(Date.now() - started, seen))
|
|
76
|
+
fail('The sandbox has not reported anything for ' + Math.round(FIRST_STATUS_MS / 60000) + ' minutes.', 'It may still be starting, or it cannot reach its folders. Look at its window (sbx-show), the run folder ' +
|
|
77
|
+
this.run.root +
|
|
78
|
+
' and the data folder ' +
|
|
79
|
+
this.dataPath +
|
|
80
|
+
', and check that you can write to both. sandbox logs shows what happened.');
|
|
63
81
|
return null;
|
|
82
|
+
}
|
|
83
|
+
seen = true;
|
|
64
84
|
onStatus?.(status);
|
|
65
85
|
if (status.message !== last) {
|
|
66
86
|
progress(safeText(status.message).slice(0, 300));
|
|
@@ -77,7 +97,11 @@ export class SandboxChannel {
|
|
|
77
97
|
if (request.kind === 'exec' && /shutdown/i.test(request.command[0] ?? ''))
|
|
78
98
|
refuseInSelfTest('shut down Windows Sandbox');
|
|
79
99
|
assertNoLinks(this.dataPath, this.run.requestsDir);
|
|
80
|
-
|
|
100
|
+
// Agent environment values (they may be API keys) never go into run: they travel in a one-shot file next to it.
|
|
101
|
+
const { request: plain, secrets } = withoutSecrets(request);
|
|
102
|
+
if (secrets)
|
|
103
|
+
writeSecrets(this.dataPath, request.id, secrets);
|
|
104
|
+
writeJsonAtomic(this.run.requestFile(request.id), plain);
|
|
81
105
|
}
|
|
82
106
|
waitForResponse(requestId, timeoutMs) {
|
|
83
107
|
return this.until(timeoutMs, () => {
|
|
@@ -155,6 +179,10 @@ export class SandboxChannel {
|
|
|
155
179
|
this.send({ kind: 'restart', id: requestId, harness, ...(cwd ? { cwd } : {}), createdAt: now() });
|
|
156
180
|
return this.waitForResponse(requestId, 30000);
|
|
157
181
|
}
|
|
182
|
+
/** The PC is low on memory or CPU: the sandbox slows its builds down for `seconds`. Never waits for an answer. */
|
|
183
|
+
pressure(reason, seconds) {
|
|
184
|
+
this.send({ kind: 'pressure', id: newId(), reason, seconds, createdAt: now() });
|
|
185
|
+
}
|
|
158
186
|
async ping() {
|
|
159
187
|
const requestId = newId();
|
|
160
188
|
this.send({ kind: 'ping', id: requestId, createdAt: now() });
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { EngineCapabilities, EngineCheck, EngineId, EnginePlan, LaunchPlan, RunningSandbox } from './types.js';
|
|
2
|
+
export interface SandboxEngine {
|
|
3
|
+
readonly id: EngineId;
|
|
4
|
+
capabilities(): EngineCapabilities;
|
|
5
|
+
check(): Promise<EngineCheck>;
|
|
6
|
+
/** Pure: the engine's own files for this launch. */
|
|
7
|
+
plan(launch: LaunchPlan): EnginePlan;
|
|
8
|
+
/** Starts the sandbox from a plan whose files are written, and waits until it is up. */
|
|
9
|
+
start(plan: EnginePlan): Promise<RunningSandbox>;
|
|
10
|
+
running(): Promise<boolean>;
|
|
11
|
+
stop(): Promise<void>;
|
|
12
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { EngineCheck } from '../types.js';
|
|
2
|
+
import { type ImageStore } from './images.js';
|
|
3
|
+
/** Windows 10 1809: the first build with the Host Compute Service API (Microsoft HCS overview). */
|
|
4
|
+
export declare const MIN_BUILD = 17763;
|
|
5
|
+
export interface TokenGroups {
|
|
6
|
+
/** The token is an elevated member of Administrators. */
|
|
7
|
+
readonly elevatedAdministrator: boolean;
|
|
8
|
+
/** The token has Hyper-V Administrators (S-1-5-32-578). */
|
|
9
|
+
readonly hyperVAdministrators: boolean;
|
|
10
|
+
}
|
|
11
|
+
/** Everything the check looks at, so tests give it a fake PC. */
|
|
12
|
+
export interface HcsProbes {
|
|
13
|
+
isWindows(): boolean;
|
|
14
|
+
windowsBuild(): number | null;
|
|
15
|
+
/** Whether a Windows service exists; null when that could not be told. */
|
|
16
|
+
serviceInstalled(name: string): boolean | null;
|
|
17
|
+
fileExists(file: string): boolean;
|
|
18
|
+
tokenGroups(): TokenGroups | null;
|
|
19
|
+
imageStores(): readonly ImageStore[];
|
|
20
|
+
}
|
|
21
|
+
export declare function checkHcs(p: HcsProbes): EngineCheck;
|
|
22
|
+
/** The groups of a token from `whoami /groups /fo csv /nh`: name, type, SID, attributes per line. */
|
|
23
|
+
export declare function parseWhoamiGroups(csv: string): TokenGroups;
|
|
24
|
+
/** The real probes: sc.exe query, whoami, file checks. They only read. */
|
|
25
|
+
export declare function realHcsProbes(): HcsProbes;
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
// The HCS engine's check: what this PC has and lacks. Read-only: it looks (service list, files, the token's groups)
|
|
2
|
+
// and answers with the reasons and the exact commands that would fix each one. It NEVER runs a fix: turning on a
|
|
3
|
+
// Windows feature or adding a group member is the owner's choice (docs/design/engines.md, "Never").
|
|
4
|
+
import fs from 'node:fs';
|
|
5
|
+
import os from 'node:os';
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
import { spawnSync } from 'node:child_process';
|
|
8
|
+
import { SYSTEM, system32 } from '../../../shared/system.js';
|
|
9
|
+
import { isWin } from '../../../core/util/index.js';
|
|
10
|
+
import { defaultImageStores, findImage } from './images.js';
|
|
11
|
+
/** Windows 10 1809: the first build with the Host Compute Service API (Microsoft HCS overview). */
|
|
12
|
+
export const MIN_BUILD = 17763;
|
|
13
|
+
const ENABLE = 'Enable-WindowsOptionalFeature -Online -All -FeatureName ';
|
|
14
|
+
export function checkHcs(p) {
|
|
15
|
+
const reasons = [];
|
|
16
|
+
const fixes = [];
|
|
17
|
+
const need = (reason, fix) => {
|
|
18
|
+
reasons.push(reason);
|
|
19
|
+
fixes.push(fix);
|
|
20
|
+
};
|
|
21
|
+
if (!p.isWindows())
|
|
22
|
+
return { available: false, reasons: ['The HCS engine only runs on Windows.'], fixes: ['Use "windows-sandbox".'] };
|
|
23
|
+
const build = p.windowsBuild();
|
|
24
|
+
if (build !== null && build < MIN_BUILD)
|
|
25
|
+
need('Windows build ' +
|
|
26
|
+
build +
|
|
27
|
+
' is too old: the Host Compute Service needs Windows 10 1809 (build ' +
|
|
28
|
+
MIN_BUILD +
|
|
29
|
+
') or newer.', 'Update Windows.');
|
|
30
|
+
if (!p.fileExists(path.join(system32Dir(), 'computecore.dll')))
|
|
31
|
+
need('computecore.dll (the Host Compute Service API) is not on this PC.', 'It comes with the Windows virtualization features (not in Windows Home). In an admin PowerShell, then restart: ' +
|
|
32
|
+
ENABLE +
|
|
33
|
+
'VirtualMachinePlatform (the owner decides: this changes Windows)');
|
|
34
|
+
if (p.serviceInstalled('vmcompute') === false)
|
|
35
|
+
need('The Hyper-V Host Compute Service (vmcompute) is not installed.', 'In an admin PowerShell, then restart: ' +
|
|
36
|
+
ENABLE +
|
|
37
|
+
'Microsoft-Hyper-V-All (needs Windows Pro, Enterprise or Education)');
|
|
38
|
+
if (p.serviceInstalled('cexecsvc') === false)
|
|
39
|
+
need('The Windows Containers feature is not turned on (its Container Execution Agent service is missing).', 'In an admin PowerShell, then restart: ' + ENABLE + 'Containers');
|
|
40
|
+
const token = p.tokenGroups();
|
|
41
|
+
if (token && !token.elevatedAdministrator && !token.hyperVAdministrators)
|
|
42
|
+
need('This Windows user is neither an elevated Administrator nor in Hyper-V Administrators, and the Host Compute Service refuses anyone else (HCS_E_ACCESS_DENIED, https://aka.ms/hcsadmin).', 'Either start the terminal as administrator, or in an admin PowerShell add yourself, then sign out and in: net localgroup "Hyper-V Administrators" "%USERDOMAIN%\\%USERNAME%" /add');
|
|
43
|
+
const image = findImage(p.imageStores());
|
|
44
|
+
if (!image.image)
|
|
45
|
+
need('No Windows Server Core (ltsc2022) image is on this PC. ' + image.reason, 'Pull one with Docker Desktop (Windows containers mode): docker pull mcr.microsoft.com/windows/servercore:ltsc2022 - or put your own in a folder with an image.json and set AGENT_SANDBOX_HCS_IMAGE to it. This tool does not download images in this alpha.');
|
|
46
|
+
return { available: reasons.length === 0, reasons, fixes };
|
|
47
|
+
}
|
|
48
|
+
function system32Dir() {
|
|
49
|
+
return path.dirname(system32('x'));
|
|
50
|
+
}
|
|
51
|
+
/** The groups of a token from `whoami /groups /fo csv /nh`: name, type, SID, attributes per line. */
|
|
52
|
+
export function parseWhoamiGroups(csv) {
|
|
53
|
+
let elevated = false;
|
|
54
|
+
let hyperV = false;
|
|
55
|
+
for (const line of csv.split(/\r?\n/)) {
|
|
56
|
+
const cells = [...line.matchAll(/"([^"]*)"/g)].map((m) => m[1]);
|
|
57
|
+
if (cells.length < 4)
|
|
58
|
+
continue;
|
|
59
|
+
const [, , sid, attributes] = cells;
|
|
60
|
+
const denyOnly = /deny only/i.test(attributes);
|
|
61
|
+
if (sid === 'S-1-5-32-544' && !denyOnly)
|
|
62
|
+
elevated = true;
|
|
63
|
+
if (sid === 'S-1-5-32-578' && !denyOnly)
|
|
64
|
+
hyperV = true;
|
|
65
|
+
}
|
|
66
|
+
return { elevatedAdministrator: elevated, hyperVAdministrators: hyperV };
|
|
67
|
+
}
|
|
68
|
+
const QUERY_TIMEOUT_MS = 10000;
|
|
69
|
+
/** The real probes: sc.exe query, whoami, file checks. They only read. */
|
|
70
|
+
export function realHcsProbes() {
|
|
71
|
+
return {
|
|
72
|
+
isWindows: () => isWin,
|
|
73
|
+
windowsBuild: () => {
|
|
74
|
+
const m = /^\d+\.\d+\.(\d+)/.exec(os.release());
|
|
75
|
+
return m ? Number(m[1]) : null;
|
|
76
|
+
},
|
|
77
|
+
serviceInstalled: (name) => {
|
|
78
|
+
const r = spawnSync(SYSTEM.sc(), ['query', name], { windowsHide: true, timeout: QUERY_TIMEOUT_MS });
|
|
79
|
+
if (r.status === 0)
|
|
80
|
+
return true;
|
|
81
|
+
return r.status === 1060 ? false : null; // 1060: the service does not exist
|
|
82
|
+
},
|
|
83
|
+
fileExists: (file) => fs.existsSync(file),
|
|
84
|
+
tokenGroups: () => {
|
|
85
|
+
const r = spawnSync(SYSTEM.whoami(), ['/groups', '/fo', 'csv', '/nh'], {
|
|
86
|
+
windowsHide: true,
|
|
87
|
+
timeout: QUERY_TIMEOUT_MS,
|
|
88
|
+
encoding: 'utf8',
|
|
89
|
+
maxBuffer: 1024 * 1024,
|
|
90
|
+
});
|
|
91
|
+
return r.status === 0 ? parseWhoamiGroups(r.stdout) : null;
|
|
92
|
+
},
|
|
93
|
+
imageStores: () => defaultImageStores(),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { LaunchPlan } from '../types.js';
|
|
2
|
+
export declare const HCS_OWNER = "agent-sandbox";
|
|
3
|
+
/** The Container's Windows-side folder for the agent disk's own sub-folders. */
|
|
4
|
+
export declare const AGENT_DISK_FOLDERS: readonly ["tools", "state", "logs"];
|
|
5
|
+
export type HcsDocument = Readonly<Record<string, unknown>>;
|
|
6
|
+
/** A base image already on this PC. Layers are the folders of the image, base layer first. */
|
|
7
|
+
export interface HcsImage {
|
|
8
|
+
readonly id: string;
|
|
9
|
+
/** Folders of the image layers, base first. */
|
|
10
|
+
readonly layers: readonly string[];
|
|
11
|
+
/** The base layer's UtilityVM\Files folder (the kernel and files of the utility VM). */
|
|
12
|
+
readonly utilityVmFiles: string;
|
|
13
|
+
}
|
|
14
|
+
export interface HcsDocumentInput {
|
|
15
|
+
readonly launch: LaunchPlan;
|
|
16
|
+
readonly image: HcsImage;
|
|
17
|
+
/** The utility VM's id; the container's is `<id>-c`. [a-zA-Z0-9._-] only. */
|
|
18
|
+
readonly id: string;
|
|
19
|
+
/** The writable layer (scratch) VHDX of this run: made before start, deleted after. */
|
|
20
|
+
readonly scratchVhdx: string;
|
|
21
|
+
/** Processors of this PC, to turn a CPU percentage into a count. */
|
|
22
|
+
readonly hostCpus: number;
|
|
23
|
+
}
|
|
24
|
+
export interface HcsDiskPlan {
|
|
25
|
+
readonly image: string;
|
|
26
|
+
readonly maxGb: number;
|
|
27
|
+
readonly lun: number;
|
|
28
|
+
}
|
|
29
|
+
export interface HcsDocuments {
|
|
30
|
+
readonly uvmId: string;
|
|
31
|
+
readonly containerId: string;
|
|
32
|
+
readonly uvm: HcsDocument;
|
|
33
|
+
readonly container: HcsDocument;
|
|
34
|
+
/** The agent disks (read-write) to create, give the utility VM access to and attach. */
|
|
35
|
+
readonly disks: readonly HcsDiskPlan[];
|
|
36
|
+
/** Things the plan asked for that this engine does not do (shown to the user). */
|
|
37
|
+
readonly notes: readonly string[];
|
|
38
|
+
}
|
|
39
|
+
/** A GUID made from a path, so a layer has the same id every time. [U] hcsshim names layers the same way. */
|
|
40
|
+
export declare function layerGuid(folder: string): string;
|
|
41
|
+
export declare function containerId(uvmId: string): string;
|
|
42
|
+
/** Processors for a percentage of this PC ('none' = all of them), at least one. */
|
|
43
|
+
export declare function cpuCount(limit: LaunchPlan['cpuLimit'], hostCpus: number): number;
|
|
44
|
+
export declare function buildDocuments(input: HcsDocumentInput): HcsDocuments;
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
// Pure: the HCS compute-system documents (schema 2.x JSON) for a Hyper-V isolated Windows container, from a
|
|
2
|
+
// LaunchPlan.
|
|
3
|
+
//
|
|
4
|
+
// Two documents, as hcsshim does it for a container with Hyper-V isolation:
|
|
5
|
+
// 1. the utility VM: ComputeSystem { VirtualMachine { Chipset, ComputeTopology,
|
|
6
|
+
// Devices { Scsi, VirtualSmb, HvSocket }, GuestConnection } }
|
|
7
|
+
// 2. the container inside it: ComputeSystem { HostingSystemId, HostedSystem { Container { GuestOs, Storage, Memory,
|
|
8
|
+
// MappedDirectories, HvSocket } } }
|
|
9
|
+
//
|
|
10
|
+
// Schema reference used (learn.microsoft.com/virtualization/api/hcs/schemareference), field names and casing taken
|
|
11
|
+
// from these tables: ComputeSystem, VirtualMachine, Topology, VirtualMachine_Memory, VirtualMachine_Processor,
|
|
12
|
+
// Devices, Scsi, Attachment (AttachmentType "VirtualDisk", CachingMode), VirtualSmb, VirtualSmbShare,
|
|
13
|
+
// VirtualSmbShareOptions, VirtualMachine_HvSocket, HvSocketSystemConfig, Chipset, Uefi, UefiBootEntry,
|
|
14
|
+
// GuestConnection, HostedSystem, Container, GuestOs, Container_Memory, Layer (PathType "VirtualSmbShareName"),
|
|
15
|
+
// MappedDirectory (HostPathType), Container_HvSocket, Version.
|
|
16
|
+
//
|
|
17
|
+
// NOT verified (each is marked [U] where it is used, and listed in the report):
|
|
18
|
+
// - the boot entry of the utility VM and the "os" share of the base layer's UtilityVM\Files (hcsshim from memory);
|
|
19
|
+
// - the order of the layers (topmost first here);
|
|
20
|
+
// - where a SCSI disk appears inside the utility VM and how a blank VHDX becomes a formatted volume there;
|
|
21
|
+
// - the scratch layer (a writable layer VHDX made by HcsInitializeWritableLayer: not built in this phase);
|
|
22
|
+
// - that Layers / MappedDirectories may name vSMB shares by share name (the PathType values exist in the schema).
|
|
23
|
+
import crypto from 'node:crypto';
|
|
24
|
+
export const HCS_OWNER = 'agent-sandbox';
|
|
25
|
+
/** Schema 2.1 is the first with VirtualSmb options, SCSI caching and Layer.PathType (Windows 10 1809). */
|
|
26
|
+
const SCHEMA = { Major: 2, Minor: 1 };
|
|
27
|
+
/** The Container's Windows-side folder for the agent disk's own sub-folders. */
|
|
28
|
+
export const AGENT_DISK_FOLDERS = ['tools', 'state', 'logs'];
|
|
29
|
+
const GUEST_DATA = 'C:\\AgentData';
|
|
30
|
+
/** Placeholder SDDL: SYSTEM and Administrators only. [U] whether this ACL is what the host side of HvSocket needs. */
|
|
31
|
+
const HVSOCKET_SDDL = 'D:P(A;;FA;;;SY)(A;;FA;;;BA)';
|
|
32
|
+
/** A GUID made from a path, so a layer has the same id every time. [U] hcsshim names layers the same way. */
|
|
33
|
+
export function layerGuid(folder) {
|
|
34
|
+
const h = crypto.createHash('sha1').update(folder.toLowerCase()).digest('hex');
|
|
35
|
+
return [h.slice(0, 8), h.slice(8, 12), '5' + h.slice(13, 16), '8' + h.slice(17, 20), h.slice(20, 32)].join('-');
|
|
36
|
+
}
|
|
37
|
+
export function containerId(uvmId) {
|
|
38
|
+
return uvmId + '-c';
|
|
39
|
+
}
|
|
40
|
+
/** Processors for a percentage of this PC ('none' = all of them), at least one. */
|
|
41
|
+
export function cpuCount(limit, hostCpus) {
|
|
42
|
+
if (limit === 'none')
|
|
43
|
+
return Math.max(1, hostCpus);
|
|
44
|
+
return Math.min(Math.max(1, hostCpus), Math.max(1, Math.ceil((hostCpus * limit) / 100)));
|
|
45
|
+
}
|
|
46
|
+
const hvSocketConfig = {
|
|
47
|
+
DefaultBindSecurityDescriptor: HVSOCKET_SDDL,
|
|
48
|
+
DefaultConnectSecurityDescriptor: HVSOCKET_SDDL,
|
|
49
|
+
ServiceTable: {},
|
|
50
|
+
};
|
|
51
|
+
export function buildDocuments(input) {
|
|
52
|
+
const { launch, image } = input;
|
|
53
|
+
const notes = [];
|
|
54
|
+
const uvmId = input.id;
|
|
55
|
+
const baseLayers = [...image.layers].reverse(); // topmost first [U]
|
|
56
|
+
// Utility VM shares: the OS files, each image layer, then the folders shared in.
|
|
57
|
+
const shares = [
|
|
58
|
+
{
|
|
59
|
+
Name: 'os',
|
|
60
|
+
Path: image.utilityVmFiles,
|
|
61
|
+
// [U] the options hcsshim gives the OS share of a Windows utility VM.
|
|
62
|
+
Options: { ReadOnly: true, ShareRead: true, CacheIo: true, TakeBackupPrivilege: true, PseudoOplocks: true },
|
|
63
|
+
},
|
|
64
|
+
];
|
|
65
|
+
const layers = baseLayers.map((folder, i) => {
|
|
66
|
+
const name = 'layer' + i;
|
|
67
|
+
shares.push({ Name: name, Path: folder, Options: { ReadOnly: true, ShareRead: true, NoDirectmap: true } });
|
|
68
|
+
return { Id: layerGuid(folder), Path: name, PathType: 'VirtualSmbShareName' };
|
|
69
|
+
});
|
|
70
|
+
const folderMaps = [];
|
|
71
|
+
launch.mappings.forEach((m, i) => {
|
|
72
|
+
const name = 'dir' + i;
|
|
73
|
+
// NoDirectmap on every folder shared in: no direct file mapping into the guest.
|
|
74
|
+
shares.push({ Name: name, Path: m.host, Options: { ReadOnly: m.readOnly, NoDirectmap: true } });
|
|
75
|
+
folderMaps.push({
|
|
76
|
+
HostPath: name,
|
|
77
|
+
HostPathType: 'VirtualSmbShareName',
|
|
78
|
+
ContainerPath: m.guest,
|
|
79
|
+
ReadOnly: m.readOnly,
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
// SCSI controller 0: the agent disks (read-write), then the scratch layer.
|
|
83
|
+
const disks = [];
|
|
84
|
+
const attachments = {};
|
|
85
|
+
const attach = (file, readOnly, lun) => {
|
|
86
|
+
attachments[String(lun)] = { Type: 'VirtualDisk', Path: file, ReadOnly: readOnly, CachingMode: 'Uncached' };
|
|
87
|
+
};
|
|
88
|
+
for (const a of launch.storage) {
|
|
89
|
+
if (a.kind !== 'disk')
|
|
90
|
+
continue;
|
|
91
|
+
const lun = disks.length;
|
|
92
|
+
disks.push({ image: a.image, maxGb: a.maxGb, lun });
|
|
93
|
+
attach(a.image, false, lun);
|
|
94
|
+
// [U] the disk is formatted and mounted in the utility VM at this folder (a blank VHDX is not formatted yet).
|
|
95
|
+
const volume = 'C:\\agent-disk' + lun;
|
|
96
|
+
const target = a.guest || GUEST_DATA;
|
|
97
|
+
for (const folder of AGENT_DISK_FOLDERS)
|
|
98
|
+
folderMaps.push({
|
|
99
|
+
HostPath: volume + '\\' + folder,
|
|
100
|
+
HostPathType: 'AbsolutePath',
|
|
101
|
+
ContainerPath: target + '\\' + folder,
|
|
102
|
+
ReadOnly: false,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
attach(input.scratchVhdx, false, disks.length);
|
|
106
|
+
if (launch.networking)
|
|
107
|
+
notes.push('Networking is not available in the HCS engine yet: the sandbox has no network adapter.');
|
|
108
|
+
if (launch.devices.gpu || launch.devices.clipboard || launch.devices.audioInput || launch.devices.videoInput)
|
|
109
|
+
notes.push('GPU, clipboard, microphone and camera do not exist in the HCS engine.');
|
|
110
|
+
const uvm = {
|
|
111
|
+
Owner: HCS_OWNER,
|
|
112
|
+
SchemaVersion: SCHEMA,
|
|
113
|
+
// false on purpose: the helper exits after creating the system, which closes its handle; true would end the
|
|
114
|
+
// system at once. Leftovers are found by owner (sandbox engine clean).
|
|
115
|
+
ShouldTerminateOnLastHandleClosed: false,
|
|
116
|
+
VirtualMachine: {
|
|
117
|
+
StopOnReset: true,
|
|
118
|
+
Chipset: {
|
|
119
|
+
// [U] hcsshim's boot entry for a Windows utility VM.
|
|
120
|
+
Uefi: { BootThis: { DeviceType: 'VmbFs', DevicePath: '\\EFI\\Microsoft\\Boot\\bootmgfw.efi' } },
|
|
121
|
+
},
|
|
122
|
+
ComputeTopology: {
|
|
123
|
+
Memory: { SizeInMB: launch.memoryMb, AllowOvercommit: true },
|
|
124
|
+
Processor: { Count: cpuCount(launch.cpuLimit, input.hostCpus) },
|
|
125
|
+
},
|
|
126
|
+
Devices: {
|
|
127
|
+
Scsi: { '0': { Attachments: attachments } },
|
|
128
|
+
VirtualSmb: { Shares: shares },
|
|
129
|
+
// Placeholder: the control channel's service ids are added when the guest side exists.
|
|
130
|
+
HvSocket: { HvSocketConfig: hvSocketConfig },
|
|
131
|
+
// No NetworkAdapters: no network by default.
|
|
132
|
+
},
|
|
133
|
+
GuestConnection: {},
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
const container = {
|
|
137
|
+
Owner: HCS_OWNER,
|
|
138
|
+
SchemaVersion: SCHEMA,
|
|
139
|
+
ShouldTerminateOnLastHandleClosed: false,
|
|
140
|
+
HostingSystemId: uvmId,
|
|
141
|
+
HostedSystem: {
|
|
142
|
+
SchemaVersion: SCHEMA,
|
|
143
|
+
Container: {
|
|
144
|
+
GuestOs: { HostName: 'agent-sandbox' },
|
|
145
|
+
// [U] Path is the scratch layer's folder as the utility VM sees it.
|
|
146
|
+
Storage: { Layers: layers, Path: 'C:\\scratch' },
|
|
147
|
+
Memory: { SizeInMB: launch.memoryMb },
|
|
148
|
+
MappedDirectories: folderMaps,
|
|
149
|
+
HvSocket: { Config: hvSocketConfig },
|
|
150
|
+
// No Networking section: no endpoint.
|
|
151
|
+
},
|
|
152
|
+
},
|
|
153
|
+
};
|
|
154
|
+
return { uvmId, containerId: containerId(uvmId), uvm, container, disks, notes };
|
|
155
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { SandboxEngine } from '../engine.js';
|
|
2
|
+
import type { EngineCapabilities, EngineCheck, EnginePlan, LaunchPlan, RunningSandbox } from '../types.js';
|
|
3
|
+
import { type HcsProbes } from './check.js';
|
|
4
|
+
import { type HcsImage } from './documents.js';
|
|
5
|
+
import { HcsHelper } from './helper.js';
|
|
6
|
+
export declare const HCS_CAPABILITIES: EngineCapabilities;
|
|
7
|
+
export declare const HCS_ALPHA_MESSAGE = "The HCS engine is in alpha and starting it is not enabled yet; see docs/design/engines.md";
|
|
8
|
+
export declare const HCS_FLAG = "AGENT_SANDBOX_HCS_EXPERIMENTAL";
|
|
9
|
+
/** Starting is allowed only with the owner's flag, and never inside the self-test. */
|
|
10
|
+
export declare function hcsStartEnabled(env: NodeJS.ProcessEnv, selfTest: boolean): boolean;
|
|
11
|
+
export interface HcsEngineDeps {
|
|
12
|
+
readonly helper?: HcsHelper;
|
|
13
|
+
readonly env?: NodeJS.ProcessEnv;
|
|
14
|
+
/** Inside the self-test, starting is refused whatever the flag says. */
|
|
15
|
+
readonly selfTest?: () => boolean;
|
|
16
|
+
readonly hostCpus?: () => number;
|
|
17
|
+
readonly exists?: (file: string) => boolean;
|
|
18
|
+
}
|
|
19
|
+
export declare class HcsEngine implements SandboxEngine {
|
|
20
|
+
private readonly image;
|
|
21
|
+
private readonly probes;
|
|
22
|
+
private readonly storageRoot;
|
|
23
|
+
private readonly deps;
|
|
24
|
+
readonly id = "hcs";
|
|
25
|
+
/** `image` and `probes` come from the check (see HcsEngine.open); `storageRoot` is where HcsHost.exe is built. */
|
|
26
|
+
constructor(image: HcsImage | null, probes: HcsProbes, storageRoot: string, deps?: HcsEngineDeps);
|
|
27
|
+
/** The engine for this PC when its check passes; otherwise a clear stop with the check's reasons and fixes. */
|
|
28
|
+
static open(storageRoot: string, probes?: HcsProbes, deps?: HcsEngineDeps): Promise<HcsEngine>;
|
|
29
|
+
capabilities(): EngineCapabilities;
|
|
30
|
+
check(): Promise<EngineCheck>;
|
|
31
|
+
plan(launch: LaunchPlan): EnginePlan;
|
|
32
|
+
private helper;
|
|
33
|
+
start(plan: EnginePlan): Promise<RunningSandbox>;
|
|
34
|
+
private tryTerminate;
|
|
35
|
+
/** Ours: the compute systems the helper lists with our owner name. */
|
|
36
|
+
private ours;
|
|
37
|
+
running(): Promise<boolean>;
|
|
38
|
+
stop(): Promise<void>;
|
|
39
|
+
}
|