windows-development-sandbox 1.5.0 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/config.example.json +27 -1
- package/dist/app/context.d.ts +8 -0
- package/dist/app/context.js +12 -0
- package/dist/app/features/defs.d.ts +322 -0
- package/dist/app/features/defs.js +28 -0
- package/dist/app/features/sandbox/index.d.ts +2 -0
- package/dist/app/features/sandbox/index.js +3 -0
- package/dist/app/features/sandbox/sandbox.def.d.ts +193 -0
- package/dist/app/features/sandbox/sandbox.def.js +245 -0
- package/dist/app/features/sandbox/sandbox.run.d.ts +72 -0
- package/dist/app/features/sandbox/sandbox.run.js +98 -0
- package/dist/app/features/sessions/index.d.ts +2 -0
- package/dist/app/features/sessions/index.js +3 -0
- package/dist/app/features/sessions/sessions.def.d.ts +141 -0
- package/dist/app/features/sessions/sessions.def.js +176 -0
- package/dist/app/features/sessions/sessions.run.d.ts +39 -0
- package/dist/app/features/sessions/sessions.run.js +58 -0
- package/dist/{cli/menu/settings/categories.d.ts → app/features/settings/categories.def.d.ts} +4 -0
- package/dist/{cli/menu/settings/categories.js → app/features/settings/categories.def.js} +40 -46
- package/dist/app/features/settings/index.d.ts +5 -0
- package/dist/app/features/settings/index.js +6 -0
- package/dist/{cli/menu/settings/config-file.d.ts → app/features/settings/settings-file.d.ts} +1 -1
- package/dist/{cli/menu/settings/config-file.js → app/features/settings/settings-file.js} +1 -1
- package/dist/app/features/settings/settings-rows.d.ts +35 -0
- package/dist/app/features/settings/settings-rows.js +94 -0
- package/dist/app/features/settings/settings.def.d.ts +157 -0
- package/dist/app/features/settings/settings.def.js +179 -0
- package/dist/app/features/settings/settings.run.d.ts +67 -0
- package/dist/app/features/settings/settings.run.js +84 -0
- package/dist/app/kernel/define.d.ts +143 -0
- package/dist/app/kernel/define.js +42 -0
- package/dist/app/kernel/errors.d.ts +34 -0
- package/dist/app/kernel/errors.js +45 -0
- package/dist/app/kernel/fields.d.ts +70 -0
- package/dist/app/kernel/fields.js +243 -0
- package/dist/app/kernel/index.d.ts +8 -0
- package/dist/app/kernel/index.js +10 -0
- package/dist/app/kernel/io.d.ts +193 -0
- package/dist/app/kernel/io.js +126 -0
- package/dist/app/kernel/rpc.d.ts +156 -0
- package/dist/app/kernel/rpc.js +47 -0
- package/dist/{cli/menu/settings → app/kernel}/schema-node.d.ts +9 -0
- package/dist/{cli/menu/settings → app/kernel}/schema-node.js +26 -0
- package/dist/app/kernel/text.d.ts +6 -0
- package/dist/app/kernel/text.js +57 -0
- package/dist/app/kernel/view.d.ts +146 -0
- package/dist/app/kernel/view.js +28 -0
- package/dist/app/registry.d.ts +10 -0
- package/dist/app/registry.js +50 -0
- package/dist/cli/args.d.ts +18 -2
- package/dist/cli/args.js +101 -24
- package/dist/cli/commands/accounts.js +45 -17
- package/dist/cli/commands/context.d.ts +2 -0
- package/dist/cli/commands/context.js +9 -2
- package/dist/cli/commands/data/clean.js +32 -9
- package/dist/cli/commands/engine.d.ts +2 -0
- package/dist/cli/commands/engine.js +60 -0
- package/dist/cli/commands/index.d.ts +2 -1
- package/dist/cli/commands/index.js +2 -1
- package/dist/cli/commands/launch/add-root.d.ts +3 -2
- package/dist/cli/commands/launch/add-root.js +11 -10
- package/dist/cli/commands/launch/launch.js +102 -9
- package/dist/cli/commands/launch/prepare.js +6 -4
- package/dist/cli/commands/launch/running.js +2 -1
- package/dist/cli/commands/launch/summary.d.ts +2 -0
- package/dist/cli/commands/maintenance/audit.js +1 -1
- package/dist/cli/commands/maintenance/clean.d.ts +1 -1
- package/dist/cli/commands/maintenance/clean.js +17 -3
- package/dist/cli/commands/maintenance/config-share.d.ts +12 -0
- package/dist/cli/commands/maintenance/config-share.js +80 -0
- package/dist/cli/commands/maintenance/config.d.ts +1 -1
- package/dist/cli/commands/maintenance/config.js +38 -10
- package/dist/cli/commands/maintenance/doctor.d.ts +1 -1
- package/dist/cli/commands/maintenance/doctor.js +2 -4
- package/dist/cli/commands/maintenance/logs.js +14 -0
- package/dist/cli/commands/maintenance/migrate.d.ts +2 -1
- package/dist/cli/commands/maintenance/migrate.js +19 -4
- package/dist/cli/commands/maintenance/sync.js +2 -0
- package/dist/cli/commands/maintenance/update.d.ts +2 -0
- package/dist/cli/commands/maintenance/update.js +27 -4
- package/dist/cli/commands/projects/here.js +12 -7
- package/dist/cli/commands/projects/projects.js +26 -17
- package/dist/cli/commands/registry.js +10 -7
- package/dist/cli/commands/repair/checks/agents.d.ts +2 -0
- package/dist/cli/commands/repair/checks/agents.js +70 -0
- package/dist/cli/commands/repair/checks/common.d.ts +8 -0
- package/dist/cli/commands/repair/checks/common.js +22 -0
- package/dist/cli/commands/repair/checks/contained.d.ts +2 -0
- package/dist/cli/commands/repair/checks/contained.js +139 -0
- package/dist/cli/commands/repair/checks/data.d.ts +2 -0
- package/dist/cli/commands/repair/checks/data.js +241 -0
- package/dist/cli/commands/repair/checks/hcs.d.ts +7 -0
- package/dist/cli/commands/repair/checks/hcs.js +28 -0
- package/dist/cli/commands/repair/checks/index.d.ts +2 -0
- package/dist/cli/commands/repair/checks/index.js +24 -0
- package/dist/cli/commands/repair/checks/install.d.ts +5 -0
- package/dist/cli/commands/repair/checks/install.js +318 -0
- package/dist/cli/commands/repair/checks/machine.d.ts +2 -0
- package/dist/cli/commands/repair/checks/machine.js +232 -0
- package/dist/cli/commands/repair/checks/network.d.ts +6 -0
- package/dist/cli/commands/repair/checks/network.js +60 -0
- package/dist/cli/commands/repair/checks/pc.d.ts +4 -0
- package/dist/cli/commands/repair/checks/pc.js +86 -0
- package/dist/cli/commands/repair/checks/sandbox.d.ts +2 -0
- package/dist/cli/commands/repair/checks/sandbox.js +282 -0
- package/dist/cli/commands/repair/checks/settings.d.ts +2 -0
- package/dist/cli/commands/repair/checks/settings.js +169 -0
- package/dist/cli/commands/repair/checks/vpn.d.ts +2 -0
- package/dist/cli/commands/repair/checks/vpn.js +78 -0
- package/dist/cli/commands/repair/engine.d.ts +32 -0
- package/dist/cli/commands/repair/engine.js +127 -0
- package/dist/cli/commands/repair/env.d.ts +7 -0
- package/dist/cli/commands/repair/env.js +50 -0
- package/dist/cli/commands/repair/index.d.ts +1 -9
- package/dist/cli/commands/repair/index.js +2 -54
- package/dist/cli/commands/repair/log.d.ts +17 -0
- package/dist/cli/commands/repair/log.js +82 -0
- package/dist/cli/commands/repair/printer.d.ts +32 -0
- package/dist/cli/commands/repair/printer.js +132 -0
- package/dist/cli/commands/repair/run.d.ts +33 -0
- package/dist/cli/commands/repair/run.js +133 -0
- package/dist/cli/commands/repair/types.d.ts +97 -9
- package/dist/cli/commands/repair/types.js +11 -7
- package/dist/cli/commands/resume.js +2 -2
- package/dist/cli/commands/sessions/index.d.ts +0 -4
- package/dist/cli/commands/sessions/index.js +3 -7
- package/dist/cli/commands/setup/index.d.ts +5 -0
- package/dist/cli/commands/setup/index.js +25 -1
- package/dist/cli/commands/shared-use.d.ts +5 -2
- package/dist/cli/commands/shared-use.js +11 -8
- package/dist/cli/commands/storage/contained.d.ts +3 -0
- package/dist/cli/commands/storage/contained.js +179 -0
- package/dist/cli/commands/storage/index.d.ts +2 -0
- package/dist/cli/commands/storage/index.js +2 -0
- package/dist/cli/commands/storage/offer.d.ts +3 -0
- package/dist/cli/commands/storage/offer.js +91 -0
- package/dist/cli/commands/storage/storage.d.ts +8 -0
- package/dist/cli/commands/storage/storage.js +179 -0
- package/dist/cli/commands/user-config.js +2 -2
- package/dist/cli/commands/vpn.d.ts +4 -0
- package/dist/cli/commands/vpn.js +91 -0
- package/dist/cli/commands/web.d.ts +4 -0
- package/dist/cli/commands/web.js +97 -0
- package/dist/cli/history.js +1 -1
- package/dist/cli/index.js +48 -4
- package/dist/cli/manifest.d.ts +339 -97
- package/dist/cli/manifest.js +222 -67
- package/dist/cli/menu/add-agent.d.ts +47 -0
- package/dist/cli/menu/add-agent.js +168 -0
- package/dist/cli/menu/apps.d.ts +38 -3
- package/dist/cli/menu/apps.js +80 -5
- package/dist/cli/menu/command-fields.d.ts +18 -0
- package/dist/cli/menu/command-fields.js +61 -0
- package/dist/cli/menu/command-form.d.ts +22 -0
- package/dist/cli/menu/command-form.js +169 -46
- package/dist/cli/menu/data-folder.d.ts +18 -0
- package/dist/cli/menu/data-folder.js +99 -0
- package/dist/cli/menu/io-menu.d.ts +29 -0
- package/dist/cli/menu/io-menu.js +126 -0
- package/dist/cli/menu/live.d.ts +27 -0
- package/dist/cli/menu/live.js +69 -0
- package/dist/cli/menu/memory.d.ts +19 -0
- package/dist/cli/menu/memory.js +53 -0
- package/dist/cli/menu/menu.d.ts +11 -2
- package/dist/cli/menu/menu.js +36 -15
- package/dist/cli/menu/pages/accounts-page.js +55 -24
- package/dist/cli/menu/pages/agents-page.d.ts +68 -0
- package/dist/cli/menu/pages/agents-page.js +345 -0
- package/dist/cli/menu/pages/apps-page.d.ts +3 -1
- package/dist/cli/menu/pages/apps-page.js +20 -4
- package/dist/cli/menu/pages/list-page.d.ts +43 -3
- package/dist/cli/menu/pages/list-page.js +146 -12
- package/dist/cli/menu/pages/maintenance-page.d.ts +9 -5
- package/dist/cli/menu/pages/maintenance-page.js +172 -85
- package/dist/cli/menu/pages/sandbox-page.d.ts +7 -6
- package/dist/cli/menu/pages/sandbox-page.js +117 -120
- package/dist/cli/menu/pages/scopes.d.ts +1 -1
- package/dist/cli/menu/pages/sessions-page.d.ts +6 -8
- package/dist/cli/menu/pages/sessions-page.js +22 -75
- package/dist/cli/menu/pages/settings-page.d.ts +10 -14
- package/dist/cli/menu/pages/settings-page.js +95 -102
- package/dist/cli/menu/render-view.d.ts +28 -0
- package/dist/cli/menu/render-view.js +112 -0
- package/dist/cli/menu/settings/ask-path.d.ts +14 -0
- package/dist/cli/menu/settings/ask-path.js +14 -0
- package/dist/cli/menu/settings/collections/collection-editor.d.ts +8 -2
- package/dist/cli/menu/settings/collections/collection-editor.js +12 -8
- package/dist/cli/menu/settings/collections/map-editor.js +5 -1
- package/dist/cli/menu/settings/collections/object-list-editor.js +2 -2
- package/dist/cli/menu/settings/collections/object-map-editor.js +2 -2
- package/dist/cli/menu/settings/collections/string-list-editor.d.ts +10 -1
- package/dist/cli/menu/settings/collections/string-list-editor.js +23 -0
- package/dist/cli/menu/settings/draft.d.ts +1 -1
- package/dist/cli/menu/settings/format.d.ts +1 -3
- package/dist/cli/menu/settings/format.js +6 -36
- package/dist/cli/menu/settings/index.d.ts +1 -3
- package/dist/cli/menu/settings/index.js +3 -3
- package/dist/cli/menu/settings/object-editor.d.ts +6 -2
- package/dist/cli/menu/settings/object-editor.js +15 -4
- package/dist/cli/menu/settings/share.d.ts +36 -0
- package/dist/cli/menu/settings/share.js +131 -0
- package/dist/cli/menu/settings/value-editor.d.ts +10 -1
- package/dist/cli/menu/settings/value-editor.js +99 -63
- package/dist/cli/menu/several.js +7 -5
- package/dist/cli/menu/share-settings.d.ts +21 -0
- package/dist/cli/menu/share-settings.js +112 -0
- package/dist/cli/menu/shell.d.ts +53 -10
- package/dist/cli/menu/shell.js +115 -10
- package/dist/cli/menu/views.d.ts +7 -0
- package/dist/cli/menu/views.js +11 -0
- package/dist/cli/menu/vpn-login.d.ts +16 -0
- package/dist/cli/menu/vpn-login.js +74 -0
- package/dist/cli/operations/handler.d.ts +6 -0
- package/dist/cli/operations/handler.js +61 -0
- package/dist/cli/operations/index.d.ts +4 -0
- package/dist/cli/operations/index.js +5 -0
- package/dist/cli/operations/input.d.ts +6 -0
- package/dist/cli/operations/input.js +37 -0
- package/dist/cli/operations/io-cli.d.ts +7 -0
- package/dist/cli/operations/io-cli.js +62 -0
- package/dist/cli/operations/spec.d.ts +18 -0
- package/dist/cli/operations/spec.js +108 -0
- package/dist/cli/output/colors.d.ts +2 -2
- package/dist/cli/output/colors.js +2 -11
- package/dist/cli/output/index.d.ts +1 -0
- package/dist/cli/output/index.js +1 -0
- package/dist/cli/output/print.d.ts +5 -1
- package/dist/cli/output/print.js +15 -4
- package/dist/cli/output/progress.d.ts +15 -0
- package/dist/cli/output/progress.js +44 -0
- package/dist/cli/output/render-view.d.ts +4 -0
- package/dist/cli/output/render-view.js +63 -0
- package/dist/cli/services/accounts-service.d.ts +2 -0
- package/dist/cli/services/accounts-service.js +2 -2
- package/dist/cli/services/agent-commands-service.d.ts +2 -0
- package/dist/cli/services/agent-commands-service.js +11 -2
- package/dist/cli/services/health-service.d.ts +0 -6
- package/dist/cli/services/health-service.js +5 -42
- package/dist/cli/services/index.d.ts +3 -1
- package/dist/cli/services/index.js +3 -1
- package/dist/cli/services/logs-service.js +4 -3
- package/dist/cli/services/migrate-service.js +1 -1
- package/dist/cli/services/update-service.d.ts +2 -0
- package/dist/cli/services/update-service.js +13 -6
- package/dist/cli/services/vpn-service.d.ts +28 -0
- package/dist/cli/services/vpn-service.js +46 -0
- package/dist/cli/services/web-service.d.ts +22 -0
- package/dist/cli/services/web-service.js +111 -0
- package/dist/cli/tui/app.d.ts +12 -4
- package/dist/cli/tui/app.js +38 -9
- package/dist/cli/tui/dialogs/path-listing.d.ts +43 -0
- package/dist/cli/tui/dialogs/path-listing.js +127 -0
- package/dist/cli/tui/dialogs/path-picker.d.ts +67 -0
- package/dist/cli/tui/dialogs/path-picker.js +423 -0
- package/dist/cli/tui/dialogs/text-screen.d.ts +6 -0
- package/dist/cli/tui/dialogs/text-screen.js +10 -3
- package/dist/cli/tui/frame.d.ts +7 -10
- package/dist/cli/tui/frame.js +19 -10
- package/dist/cli/tui/index.d.ts +4 -3
- package/dist/cli/tui/index.js +2 -1
- package/dist/cli/tui/list/list-screen.d.ts +28 -2
- package/dist/cli/tui/list/list-screen.js +130 -66
- package/dist/cli/tui/list/list-types.d.ts +10 -4
- package/dist/cli/tui/nav.d.ts +29 -0
- package/dist/cli/tui/nav.js +67 -0
- package/dist/cli/tui/terminal.d.ts +7 -0
- package/dist/cli/tui/terminal.js +30 -10
- package/dist/cli/validate.d.ts +1 -1
- package/dist/cli/validate.js +3 -3
- package/dist/cli/version.d.ts +2 -0
- package/dist/cli/version.js +11 -0
- package/dist/core/config/defaults.js +13 -1
- package/dist/core/config/loader.js +12 -2
- package/dist/core/local-config/overrides.js +1 -0
- package/dist/core/prompt.d.ts +19 -0
- package/dist/core/prompt.js +43 -3
- package/dist/core/schema/common.d.ts +6 -0
- package/dist/core/schema/common.js +8 -0
- package/dist/core/schema/config.d.ts +36 -0
- package/dist/core/schema/config.js +26 -2
- package/dist/core/schema/harness.d.ts +2 -0
- package/dist/core/schema/harness.js +13 -2
- package/dist/core/schema/index.d.ts +3 -1
- package/dist/core/schema/index.js +3 -1
- package/dist/core/schema/profile.d.ts +1 -0
- package/dist/core/schema/profile.js +3 -0
- package/dist/core/schema/redact.d.ts +13 -0
- package/dist/core/schema/redact.js +75 -0
- package/dist/core/schema/sandbox.d.ts +6 -0
- package/dist/core/schema/sandbox.js +21 -3
- package/dist/core/schema/vpn.d.ts +18 -0
- package/dist/core/schema/vpn.js +22 -0
- package/dist/core/schema/web.d.ts +6 -0
- package/dist/core/schema/web.js +14 -0
- package/dist/core/types.d.ts +44 -0
- package/dist/core/util/fs.d.ts +2 -0
- package/dist/core/util/fs.js +9 -0
- package/dist/core/util/index.d.ts +1 -1
- package/dist/core/util/index.js +1 -1
- package/dist/guest/agents/agent-files.d.ts +54 -0
- package/dist/guest/agents/agent-files.js +67 -0
- package/dist/guest/agents/agent-installer.js +2 -9
- package/dist/guest/agents/local-state.d.ts +14 -0
- package/dist/guest/agents/local-state.js +218 -0
- package/dist/guest/agents/sbx-agent.d.ts +2 -0
- package/dist/guest/agents/sbx-agent.js +35 -0
- package/dist/guest/boot/boot.d.ts +4 -0
- package/dist/guest/boot/boot.js +51 -11
- package/dist/guest/daemon/daemon.js +8 -1
- package/dist/guest/daemon/exec.js +2 -1
- package/dist/guest/daemon/idle-shutdown.js +2 -0
- package/dist/guest/daemon/sessions.d.ts +5 -0
- package/dist/guest/daemon/sessions.js +20 -3
- package/dist/guest/entries/agent.d.ts +1 -0
- package/dist/guest/entries/agent.js +10 -0
- package/dist/guest/entries/daemon.js +5 -0
- package/dist/guest/governor/decide.d.ts +61 -0
- package/dist/guest/governor/decide.js +182 -0
- package/dist/guest/governor/governor.d.ts +42 -0
- package/dist/guest/governor/governor.js +214 -0
- package/dist/guest/governor/index.d.ts +2 -0
- package/dist/guest/governor/index.js +2 -0
- package/dist/guest/runtime/csc.d.ts +2 -0
- package/dist/guest/runtime/csc.js +2 -0
- package/dist/guest/runtime/secrets.d.ts +12 -0
- package/dist/guest/runtime/secrets.js +63 -0
- package/dist/guest/sessions/viewer.js +3 -1
- package/dist/guest/setup/claude-profile.d.ts +2 -1
- package/dist/guest/setup/claude-profile.js +12 -1
- package/dist/guest/setup/environment.d.ts +6 -0
- package/dist/guest/setup/environment.js +56 -6
- package/dist/guest/setup/path-plan.d.ts +32 -0
- package/dist/guest/setup/path-plan.js +67 -0
- package/dist/guest/setup/shell-path.d.ts +1 -0
- package/dist/guest/setup/shell-path.js +22 -0
- package/dist/guest/toolchains/languages/python.js +1 -1
- package/dist/guest/toolchains/native/rust-extras.js +4 -2
- package/dist/guest/toolchains/runtimes.js +2 -2
- package/dist/guest/vpn/index.d.ts +1 -0
- package/dist/guest/vpn/index.js +1 -0
- package/dist/guest/vpn/openvpn.d.ts +9 -0
- package/dist/guest/vpn/openvpn.js +47 -0
- package/dist/guest/vpn/tunnel.d.ts +17 -0
- package/dist/guest/vpn/tunnel.js +78 -0
- package/dist/guest/vpn/vpn.d.ts +6 -0
- package/dist/guest/vpn/vpn.js +174 -0
- package/dist/guest/vpn/wireguard.d.ts +32 -0
- package/dist/guest/vpn/wireguard.js +132 -0
- package/dist/host/agent-commands/commands.d.ts +4 -0
- package/dist/host/agent-commands/commands.js +31 -7
- package/dist/host/audit/log.d.ts +1 -1
- package/dist/host/channel/attach.d.ts +6 -2
- package/dist/host/channel/attach.js +6 -3
- package/dist/host/channel/channel.d.ts +9 -0
- package/dist/host/channel/channel.js +30 -2
- package/dist/host/engines/engine.d.ts +12 -0
- package/dist/host/engines/engine.js +1 -0
- package/dist/host/engines/hcs/check.d.ts +25 -0
- package/dist/host/engines/hcs/check.js +95 -0
- package/dist/host/engines/hcs/documents.d.ts +44 -0
- package/dist/host/engines/hcs/documents.js +155 -0
- package/dist/host/engines/hcs/engine.d.ts +39 -0
- package/dist/host/engines/hcs/engine.js +171 -0
- package/dist/host/engines/hcs/helper.d.ts +43 -0
- package/dist/host/engines/hcs/helper.js +173 -0
- package/dist/host/engines/hcs/images.d.ts +37 -0
- package/dist/host/engines/hcs/images.js +152 -0
- package/dist/host/engines/index.d.ts +7 -0
- package/dist/host/engines/index.js +5 -0
- package/dist/host/engines/registry.d.ts +16 -0
- package/dist/host/engines/registry.js +30 -0
- package/dist/host/engines/types.d.ts +58 -0
- package/dist/host/engines/types.js +1 -0
- package/dist/host/engines/windows-sandbox/engine.d.ts +16 -0
- package/dist/host/engines/windows-sandbox/engine.js +63 -0
- package/dist/host/engines/windows-sandbox/wsb-text.d.ts +2 -0
- package/dist/host/engines/windows-sandbox/wsb-text.js +29 -0
- package/dist/host/health/acl-read.d.ts +17 -0
- package/dist/host/health/acl-read.js +45 -0
- package/dist/host/health/config-backup.d.ts +11 -0
- package/dist/host/health/config-backup.js +73 -0
- package/dist/host/health/index.d.ts +6 -0
- package/dist/host/health/index.js +7 -0
- package/dist/host/health/install-state.d.ts +33 -0
- package/dist/host/health/install-state.js +110 -0
- package/dist/host/health/path-copies.d.ts +32 -0
- package/dist/host/health/path-copies.js +82 -0
- package/dist/host/health/stale.d.ts +45 -0
- package/dist/host/health/stale.js +120 -0
- package/dist/host/health/system.d.ts +37 -0
- package/dist/host/health/system.js +87 -0
- package/dist/host/install/copies.d.ts +13 -0
- package/dist/host/install/copies.js +63 -0
- package/dist/host/install/index.d.ts +1 -0
- package/dist/host/install/index.js +1 -0
- package/dist/host/launch/generate.d.ts +5 -1
- package/dist/host/launch/generate.js +73 -7
- package/dist/host/launch/index.d.ts +3 -1
- package/dist/host/launch/index.js +3 -1
- package/dist/host/launch/launch-plan.d.ts +13 -0
- package/dist/host/launch/launch-plan.js +26 -0
- package/dist/host/launch/mappings.js +2 -1
- package/dist/host/launch/risk-notes.d.ts +10 -0
- package/dist/host/launch/risk-notes.js +18 -0
- package/dist/host/launch/session-file.d.ts +2 -0
- package/dist/host/launch/session-file.js +11 -2
- package/dist/host/launch/stage.js +1 -1
- package/dist/host/launch/wsb-file.d.ts +28 -4
- package/dist/host/launch/wsb-file.js +61 -42
- package/dist/host/life/crash-report.d.ts +27 -1
- package/dist/host/life/crash-report.js +173 -7
- package/dist/host/life/host-memory.d.ts +40 -0
- package/dist/host/life/host-memory.js +137 -0
- package/dist/host/life/index.d.ts +2 -0
- package/dist/host/life/index.js +2 -0
- package/dist/host/life/stop-events.d.ts +2 -0
- package/dist/host/life/stop-events.js +20 -3
- package/dist/host/life/stop-warning.js +1 -1
- package/dist/host/life/watchdog.d.ts +54 -0
- package/dist/host/life/watchdog.js +108 -0
- package/dist/host/migrate/backup.js +3 -0
- package/dist/host/migrate/migrations/config-file.d.ts +2 -0
- package/dist/host/migrate/migrations/config-file.js +7 -0
- package/dist/host/migrate/migrations/follow-machine-storage.js +9 -1
- package/dist/host/migrate/migrations/pin-storage-root.d.ts +4 -0
- package/dist/host/migrate/migrations/pin-storage-root.js +46 -0
- package/dist/host/migrate/migrations/unpin-config-defaults.js +4 -1
- package/dist/host/migrate/registry.js +2 -1
- package/dist/host/native.d.ts +3 -2
- package/dist/host/native.js +22 -3
- package/dist/host/profile/accounts.d.ts +25 -1
- package/dist/host/profile/accounts.js +96 -13
- package/dist/host/profile/agent-accounts.d.ts +5 -1
- package/dist/host/profile/agent-accounts.js +35 -5
- package/dist/host/profile/claude-login.js +3 -2
- package/dist/host/profile/index.d.ts +2 -1
- package/dist/host/profile/index.js +1 -0
- package/dist/host/profile/plugin-share.d.ts +26 -0
- package/dist/host/profile/plugin-share.js +146 -0
- package/dist/host/projects/join.d.ts +7 -1
- package/dist/host/projects/join.js +21 -4
- package/dist/host/projects/registry.d.ts +16 -10
- package/dist/host/projects/registry.js +74 -6
- package/dist/host/sandbox/contained-deps.d.ts +2 -0
- package/dist/host/sandbox/contained-deps.js +17 -0
- package/dist/host/sandbox/index.d.ts +2 -0
- package/dist/host/sandbox/index.js +2 -0
- package/dist/host/sandbox/platform.d.ts +4 -0
- package/dist/host/sandbox/platform.js +23 -4
- package/dist/host/sandbox/tasklist.d.ts +13 -0
- package/dist/host/sandbox/tasklist.js +47 -0
- package/dist/host/secrets/index.d.ts +2 -0
- package/dist/host/secrets/index.js +2 -0
- package/dist/host/secrets/launch-secrets.d.ts +17 -0
- package/dist/host/secrets/launch-secrets.js +94 -0
- package/dist/host/secrets/secret-store.d.ts +25 -0
- package/dist/host/secrets/secret-store.js +89 -0
- package/dist/host/sharing/acl.d.ts +16 -2
- package/dist/host/sharing/acl.js +35 -10
- package/dist/host/sharing/current.js +8 -3
- package/dist/host/sharing/doctor.d.ts +2 -0
- package/dist/host/sharing/doctor.js +44 -0
- package/dist/host/sharing/group-access.d.ts +6 -0
- package/dist/host/sharing/group-access.js +24 -0
- package/dist/host/sharing/index.d.ts +2 -1
- package/dist/host/sharing/index.js +2 -1
- package/dist/host/sharing/lifecycle.d.ts +8 -2
- package/dist/host/sharing/lifecycle.js +16 -7
- package/dist/host/storage/cleanup.d.ts +2 -0
- package/dist/host/storage/cleanup.js +2 -1
- package/dist/host/storage/contained/check.d.ts +9 -0
- package/dist/host/storage/contained/check.js +37 -0
- package/dist/host/storage/contained/contained-storage.d.ts +66 -0
- package/dist/host/storage/contained/contained-storage.js +168 -0
- package/dist/host/storage/contained/disk-port.d.ts +43 -0
- package/dist/host/storage/contained/disk-port.js +122 -0
- package/dist/host/storage/contained/index.d.ts +9 -0
- package/dist/host/storage/contained/index.js +8 -0
- package/dist/host/storage/contained/layout.d.ts +28 -0
- package/dist/host/storage/contained/layout.js +45 -0
- package/dist/host/storage/contained/resolve.d.ts +4 -0
- package/dist/host/storage/contained/resolve.js +30 -0
- package/dist/host/storage/contained/setting.d.ts +1 -0
- package/dist/host/storage/contained/setting.js +5 -0
- package/dist/host/storage/contained/state.d.ts +89 -0
- package/dist/host/storage/contained/state.js +166 -0
- package/dist/host/storage/contained/transfer.d.ts +24 -0
- package/dist/host/storage/contained/transfer.js +121 -0
- package/dist/host/storage/history.d.ts +21 -0
- package/dist/host/storage/history.js +49 -0
- package/dist/host/storage/index.d.ts +6 -0
- package/dist/host/storage/index.js +6 -0
- package/dist/host/storage/move.d.ts +95 -0
- package/dist/host/storage/move.js +384 -0
- package/dist/host/storage/offer.d.ts +11 -0
- package/dist/host/storage/offer.js +36 -0
- package/dist/host/storage/providers/contained.d.ts +15 -0
- package/dist/host/storage/providers/contained.js +39 -0
- package/dist/host/storage/providers/folder.d.ts +12 -0
- package/dist/host/storage/providers/folder.js +20 -0
- package/dist/host/storage/providers/index.d.ts +4 -0
- package/dist/host/storage/providers/index.js +3 -0
- package/dist/host/storage/providers/registry.d.ts +9 -0
- package/dist/host/storage/providers/registry.js +14 -0
- package/dist/host/storage/providers/types.d.ts +33 -0
- package/dist/host/storage/providers/types.js +1 -0
- package/dist/host/storage/root.d.ts +18 -0
- package/dist/host/storage/root.js +77 -0
- package/dist/host/tools/conpty.js +3 -2
- package/dist/host/tools/windows-terminal.d.ts +2 -0
- package/dist/host/tools/windows-terminal.js +31 -12
- package/dist/host/update/index.d.ts +1 -1
- package/dist/host/update/index.js +1 -1
- package/dist/host/update/notice.d.ts +2 -0
- package/dist/host/update/notice.js +13 -1
- package/dist/host/update/update-state.d.ts +6 -0
- package/dist/host/update/update-state.js +2 -0
- package/dist/host/update/updater.d.ts +19 -0
- package/dist/host/update/updater.js +88 -12
- package/dist/host/vpn/index.d.ts +4 -0
- package/dist/host/vpn/index.js +4 -0
- package/dist/host/vpn/login.d.ts +24 -0
- package/dist/host/vpn/login.js +79 -0
- package/dist/host/vpn/nordvpn.d.ts +21 -0
- package/dist/host/vpn/nordvpn.js +77 -0
- package/dist/host/vpn/prepare.d.ts +19 -0
- package/dist/host/vpn/prepare.js +138 -0
- package/dist/host/vpn/status.d.ts +12 -0
- package/dist/host/vpn/status.js +53 -0
- package/dist/host/web/auth.d.ts +38 -0
- package/dist/host/web/auth.js +96 -0
- package/dist/host/web/backend.d.ts +14 -0
- package/dist/host/web/backend.js +1 -0
- package/dist/host/web/bridge.d.ts +27 -0
- package/dist/host/web/bridge.js +144 -0
- package/dist/host/web/browser.d.ts +3 -0
- package/dist/host/web/browser.js +23 -0
- package/dist/host/web/control.d.ts +17 -0
- package/dist/host/web/control.js +67 -0
- package/dist/host/web/index.d.ts +10 -0
- package/dist/host/web/index.js +9 -0
- package/dist/host/web/rpc.d.ts +24 -0
- package/dist/host/web/rpc.js +149 -0
- package/dist/host/web/runner.d.ts +16 -0
- package/dist/host/web/runner.js +44 -0
- package/dist/host/web/server.d.ts +47 -0
- package/dist/host/web/server.js +238 -0
- package/dist/host/web/state.d.ts +20 -0
- package/dist/host/web/state.js +41 -0
- package/dist/host/web/static-files.d.ts +13 -0
- package/dist/host/web/static-files.js +57 -0
- package/dist/runtime/agent.js +27675 -0
- package/dist/runtime/daemon.js +1950 -1122
- package/dist/runtime/db.js +302 -111
- package/dist/runtime/main.js +1560 -275
- package/dist/runtime/netproxy.js +168 -8
- package/dist/runtime/view.js +186 -13
- package/dist/selftest/accounts.test.js +40 -0
- package/dist/selftest/agent-paths.test.d.ts +2 -0
- package/dist/selftest/agent-paths.test.js +125 -0
- package/dist/selftest/app.test.d.ts +2 -0
- package/dist/selftest/app.test.js +324 -0
- package/dist/selftest/channel.test.js +18 -0
- package/dist/selftest/cli.test.js +35 -4
- package/dist/selftest/config.test.js +59 -0
- package/dist/selftest/contained.test.d.ts +2 -0
- package/dist/selftest/contained.test.js +544 -0
- package/dist/selftest/credentials.test.d.ts +2 -0
- package/dist/selftest/credentials.test.js +198 -0
- package/dist/selftest/engine.test.d.ts +2 -0
- package/dist/selftest/engine.test.js +127 -0
- package/dist/selftest/generate.test.js +1 -1
- package/dist/selftest/hcs.test.d.ts +2 -0
- package/dist/selftest/hcs.test.js +482 -0
- package/dist/selftest/health.test.d.ts +2 -0
- package/dist/selftest/health.test.js +470 -0
- package/dist/selftest/heavy-load.test.d.ts +2 -0
- package/dist/selftest/heavy-load.test.js +329 -0
- package/dist/selftest/host-sim.test.js +2 -0
- package/dist/selftest/index.js +31 -0
- package/dist/selftest/layout.test.js +14 -0
- package/dist/selftest/menu-perf.test.d.ts +2 -0
- package/dist/selftest/menu-perf.test.js +248 -0
- package/dist/selftest/menu-screens.d.ts +7 -0
- package/dist/selftest/menu-screens.js +68 -17
- package/dist/selftest/menu.test.js +603 -22
- package/dist/selftest/migrate.test.js +1 -1
- package/dist/selftest/personalization.test.js +3 -1
- package/dist/selftest/projects.test.js +39 -1
- package/dist/selftest/shared-use.test.js +64 -2
- package/dist/selftest/sharing.test.js +50 -1
- package/dist/selftest/storage.test.d.ts +2 -0
- package/dist/selftest/storage.test.js +363 -0
- package/dist/selftest/support/engine-cases.d.ts +8 -0
- package/dist/selftest/support/engine-cases.js +65 -0
- package/dist/selftest/support/engine-golden.d.ts +3 -0
- package/dist/selftest/support/engine-golden.js +66 -0
- package/dist/selftest/support/fixtures.d.ts +20 -0
- package/dist/selftest/support/hcs-probes.d.ts +17 -0
- package/dist/selftest/support/hcs-probes.js +41 -0
- package/dist/selftest/support/releases.js +1 -1
- package/dist/selftest/toolchains.test.js +21 -0
- package/dist/selftest/update-service.test.js +87 -3
- package/dist/selftest/vpn.test.d.ts +2 -0
- package/dist/selftest/vpn.test.js +412 -0
- package/dist/selftest/web.test.d.ts +2 -0
- package/dist/selftest/web.test.js +402 -0
- package/dist/shared/apps/catalogue.js +31 -0
- package/dist/shared/channel/index.d.ts +1 -0
- package/dist/shared/channel/index.js +1 -0
- package/dist/shared/channel/run-dir.d.ts +9 -1
- package/dist/shared/channel/run-dir.js +18 -1
- package/dist/shared/channel/schema.d.ts +53 -0
- package/dist/shared/channel/schema.js +38 -0
- package/dist/shared/channel/secrets.d.ts +29 -0
- package/dist/shared/channel/secrets.js +50 -0
- package/dist/shared/memory/index.d.ts +1 -0
- package/dist/shared/memory/index.js +1 -0
- package/dist/shared/memory/policy.d.ts +33 -0
- package/dist/shared/memory/policy.js +55 -0
- package/dist/shared/pty/output-filter.d.ts +14 -1
- package/dist/shared/pty/output-filter.js +22 -4
- package/dist/shared/pty/terminal.d.ts +4 -1
- package/dist/shared/pty/terminal.js +4 -2
- package/dist/shared/system.d.ts +1 -0
- package/dist/shared/system.js +1 -0
- package/dist/shared/vpn/download.d.ts +29 -0
- package/dist/shared/vpn/download.js +30 -0
- package/dist/shared/vpn/kill-switch.d.ts +18 -0
- package/dist/shared/vpn/kill-switch.js +81 -0
- package/dist/shared/vpn/ovpn.d.ts +23 -0
- package/dist/shared/vpn/ovpn.js +244 -0
- package/dist/shared/vpn/wireguard.d.ts +51 -0
- package/dist/shared/vpn/wireguard.js +227 -0
- package/dist/shared/web/index.d.ts +1 -0
- package/dist/shared/web/index.js +1 -0
- package/dist/shared/web/protocol.d.ts +61 -0
- package/dist/shared/web/protocol.js +35 -0
- package/dist/sync/sync-cycle.js +9 -5
- package/dist/sync/sync-state.d.ts +1 -0
- package/dist/sync/sync-state.js +1 -0
- package/dist/sync/watcher.d.ts +13 -0
- package/dist/sync/watcher.js +102 -3
- package/dist/web/index.html +14 -0
- package/dist/web/main-NRRS5O6Z.js +157 -0
- package/dist/web/main-T5DMCHYV.css +1 -0
- package/native/csharp/FolderSecurity.cs +29 -0
- package/native/csharp/HcsHost/AssemblyInfo.cs +14 -0
- package/native/csharp/HcsHost/Guard.cs +100 -0
- package/native/csharp/HcsHost/Hcs.cs +256 -0
- package/native/csharp/HcsHost/Json.cs +78 -0
- package/native/csharp/HcsHost/Program.cs +185 -0
- package/native/csharp/HcsHost/VirtualDisk.cs +95 -0
- package/native/csharp/HostTools/AssemblyInfo.cs +14 -0
- package/native/csharp/HostTools/MemoryStatus.cs +107 -0
- package/native/csharp/HostTools/Program.cs +58 -17
- package/native/scripts/check-contained.ps1 +28 -0
- package/native/scripts/contained-common.ps1 +241 -0
- package/native/scripts/dismount-contained.ps1 +66 -0
- package/native/scripts/memory-status.ps1 +34 -0
- package/native/scripts/mount-contained.ps1 +139 -0
- package/native/scripts/protect-data.ps1 +29 -0
- package/native/scripts/read-folder-sddl.ps1 +10 -0
- package/native/scripts/run-elevated.ps1 +17 -4
- package/native/scripts/set-folder-access.ps1 +49 -7
- package/native/scripts/stop-events.ps1 +23 -8
- package/node_modules/ws/LICENSE +20 -0
- package/node_modules/ws/README.md +548 -0
- package/node_modules/ws/browser.js +8 -0
- package/node_modules/ws/index.js +22 -0
- package/node_modules/ws/lib/buffer-util.js +131 -0
- package/node_modules/ws/lib/constants.js +19 -0
- package/node_modules/ws/lib/event-target.js +292 -0
- package/node_modules/ws/lib/extension.js +203 -0
- package/node_modules/ws/lib/limiter.js +55 -0
- package/node_modules/ws/lib/permessage-deflate.js +530 -0
- package/node_modules/ws/lib/receiver.js +743 -0
- package/node_modules/ws/lib/sender.js +607 -0
- package/node_modules/ws/lib/stream.js +161 -0
- package/node_modules/ws/lib/subprotocol.js +62 -0
- package/node_modules/ws/lib/validation.js +152 -0
- package/node_modules/ws/lib/websocket-server.js +562 -0
- package/node_modules/ws/lib/websocket.js +1421 -0
- package/node_modules/ws/package.json +74 -0
- package/node_modules/ws/wrapper.mjs +21 -0
- package/package.json +22 -5
- package/sandbox/csharp/EnvBroadcast.cs +33 -0
- package/sandbox/csharp/MemGov.cs +398 -0
- package/sandbox/csharp/PathSync.cs +90 -0
- package/sandbox/csharp/PtyHost.cs +111 -5
- package/sandbox/scripts/install-shell-path.ps1 +73 -0
- package/sandbox/scripts/set-machine-environment.ps1 +37 -4
- package/schemas/config.schema.json +136 -7
- package/schemas/sandbox-config.schema.json +17 -4
- package/dist/cli/commands/repair/checks.d.ts +0 -2
- package/dist/cli/commands/repair/checks.js +0 -246
- package/dist/cli/commands/sessions/control.d.ts +0 -4
- package/dist/cli/commands/sessions/control.js +0 -66
- package/dist/cli/commands/sessions/list.d.ts +0 -2
- package/dist/cli/commands/sessions/list.js +0 -45
- package/dist/cli/commands/sessions/status.d.ts +0 -2
- package/dist/cli/commands/sessions/status.js +0 -93
- package/dist/cli/commands/sessions/window.d.ts +0 -3
- package/dist/cli/commands/sessions/window.js +0 -18
- package/dist/cli/menu/pages/start-page.d.ts +0 -43
- package/dist/cli/menu/pages/start-page.js +0 -192
- package/dist/cli/tui/tab-bar.d.ts +0 -9
- package/dist/cli/tui/tab-bar.js +0 -33
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
#Requires -Version 5.1
|
|
2
|
+
# Detaches the contained-storage disk image of one data set (the image file stays, with everything in it). Run elevated
|
|
3
|
+
# (one Windows permission prompt). The request is a JSON file: { set, storageRoot, image, mount, userSid }. The same
|
|
4
|
+
# checks as mount-contained.ps1 apply (exact paths, no links, yours). It refuses while Windows Sandbox is running (the
|
|
5
|
+
# sandbox may be using the folders in the image). Only `detach vdisk` for this one image is run; nothing is deleted.
|
|
6
|
+
# -DryRun prints the diskpart lines and does nothing else; the result goes to result.json next to the request file.
|
|
7
|
+
param(
|
|
8
|
+
[Parameter(Mandatory = $true)][string]$Json,
|
|
9
|
+
[string]$Sha256 = '',
|
|
10
|
+
[switch]$DryRun
|
|
11
|
+
)
|
|
12
|
+
$ErrorActionPreference = 'Stop'
|
|
13
|
+
. (Join-Path $PSScriptRoot 'contained-common.ps1')
|
|
14
|
+
|
|
15
|
+
$result = @{ ok = $false; message = ''; action = 'dismount'; created = $false; alreadyMounted = $false }
|
|
16
|
+
|
|
17
|
+
function Invoke-Dismount($Req, [bool]$Dry, [string]$TempDir) {
|
|
18
|
+
Assert-NoLinksOnTheWay $Req $true
|
|
19
|
+
$root = $Req.storageRoot.TrimEnd('\')
|
|
20
|
+
Assert-OwnedByUser $Req @($root, (Join-Path $root 'images'), (Join-Path $root 'mounts'))
|
|
21
|
+
if (-not (Test-Path -LiteralPath $Req.image -PathType Leaf)) { throw "The image is missing: $($Req.image)" }
|
|
22
|
+
Assert-OwnedByUser $Req @($Req.image)
|
|
23
|
+
$image = $Req.image
|
|
24
|
+
$mount = $Req.mount.TrimEnd('\')
|
|
25
|
+
if (-not $Dry) {
|
|
26
|
+
if (Get-Process -Name 'WindowsSandbox*' -ErrorAction SilentlyContinue) {
|
|
27
|
+
throw 'A Windows Sandbox is running and may be using the image. Close it first.'
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
$state = Get-ImageState $image $Dry
|
|
31
|
+
if ((-not $Dry) -and (-not $state.Attached)) {
|
|
32
|
+
if (Test-ReparsePoint $mount) { throw "The mount folder is a mount point of something else; not touching it: $mount" }
|
|
33
|
+
$script:result.ok = $true
|
|
34
|
+
$script:result.message = 'The image is not mounted.'
|
|
35
|
+
Add-Note 'not attached: nothing to do'
|
|
36
|
+
return
|
|
37
|
+
}
|
|
38
|
+
[void](Invoke-DiskPart @("select vdisk file=""$image""", 'detach vdisk') $TempDir $Dry)
|
|
39
|
+
if (-not $Dry) {
|
|
40
|
+
$after = Get-ImageState $image $false
|
|
41
|
+
if ($after.Attached) { throw 'The image is still attached (something is using it). Close programs that use files in it and try again.' }
|
|
42
|
+
if (Test-ReparsePoint $mount) { throw "The mount folder is still a mount point: $mount" }
|
|
43
|
+
}
|
|
44
|
+
$script:result.ok = $true
|
|
45
|
+
$script:result.message = 'The image was detached.'
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
$mutex = $null
|
|
49
|
+
try {
|
|
50
|
+
$request = Read-ContainedRequest -JsonPath $Json -Sha256 $Sha256 -Dry $DryRun.IsPresent
|
|
51
|
+
Assert-ContainedRequest $request
|
|
52
|
+
if (-not $DryRun) {
|
|
53
|
+
if (-not (Test-IsAdministrator)) { throw 'Detaching a disk image needs administrator rights.' }
|
|
54
|
+
$mutex = Enter-ContainedLock
|
|
55
|
+
}
|
|
56
|
+
Invoke-Dismount $request $DryRun.IsPresent (Split-Path -Parent $Json)
|
|
57
|
+
} catch {
|
|
58
|
+
$result.ok = $false
|
|
59
|
+
$result.message = $_.Exception.Message
|
|
60
|
+
} finally {
|
|
61
|
+
if ($mutex) { $mutex.ReleaseMutex(); $mutex.Dispose() }
|
|
62
|
+
}
|
|
63
|
+
Write-ContainedResult $result $Json $DryRun.IsPresent
|
|
64
|
+
if ($result.ok) { exit 0 }
|
|
65
|
+
if ($DryRun) { [Console]::Error.WriteLine($result.message) }
|
|
66
|
+
exit 1
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#Requires -Version 5.1
|
|
2
|
+
# Prints this PC's memory as JSON: { totalMb, availableMb, commitLimitMb, commitAvailableMb }. Read-only. The fallback
|
|
3
|
+
# for HostTools.exe memory-status (host/life/host-memory.ts).
|
|
4
|
+
param()
|
|
5
|
+
$ErrorActionPreference = 'Stop'
|
|
6
|
+
|
|
7
|
+
$os = Get-CimInstance -ClassName Win32_OperatingSystem
|
|
8
|
+
# The paging file setup from the registry: auto (Windows manages it), fixed (with its maximum sizes) or none.
|
|
9
|
+
$pageFile = 'auto'
|
|
10
|
+
$pageFileMax = 0
|
|
11
|
+
try {
|
|
12
|
+
$entries = @((Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management' -ErrorAction Stop).PagingFiles | Where-Object { $_ -and $_.Trim() })
|
|
13
|
+
$pageFile = 'none'
|
|
14
|
+
foreach ($entry in $entries) {
|
|
15
|
+
$parts = $entry.Trim() -split ' '
|
|
16
|
+
$initial = 0; $max = 0
|
|
17
|
+
if ($parts.Count -ge 3) { $initial = [int64]$parts[-2]; $max = [int64]$parts[-1] }
|
|
18
|
+
if ($entry.StartsWith('?:') -or ($initial -eq 0 -and $max -eq 0)) { $pageFile = 'auto'; $pageFileMax = 0; break }
|
|
19
|
+
$pageFile = 'fixed'
|
|
20
|
+
$pageFileMax += $max
|
|
21
|
+
}
|
|
22
|
+
} catch {
|
|
23
|
+
# Not readable: treated as automatic (no warning).
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
# Win32_OperatingSystem counts in KB.
|
|
27
|
+
ConvertTo-Json -Compress -InputObject ([ordered]@{
|
|
28
|
+
totalMb = [int64][math]::Floor($os.TotalVisibleMemorySize / 1024)
|
|
29
|
+
availableMb = [int64][math]::Floor($os.FreePhysicalMemory / 1024)
|
|
30
|
+
commitLimitMb = [int64][math]::Floor($os.TotalVirtualMemorySize / 1024)
|
|
31
|
+
commitAvailableMb = [int64][math]::Floor($os.FreeVirtualMemory / 1024)
|
|
32
|
+
pageFile = $pageFile
|
|
33
|
+
pageFileMaxMb = [int64]$pageFileMax
|
|
34
|
+
})
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
#Requires -Version 5.1
|
|
2
|
+
# Mounts the contained-storage disk image of one data set at its mount folder (no drive letter), creating and
|
|
3
|
+
# formatting the image the very first time. Run elevated (host/storage/contained starts it through run-elevated.ps1,
|
|
4
|
+
# one Windows permission prompt). The request is a JSON file: { set, storageRoot, image, mount, userSid, maxGb, create }.
|
|
5
|
+
# Safety, all checked again here: the image is <storage>\images\<set>.vhdx and the mount folder <storage>\mounts\<set>;
|
|
6
|
+
# no folder on the way is a link; both are yours; the image has no parent file and is not bigger than the limit; an
|
|
7
|
+
# existing image is only attached (never formatted, never deleted), and a new one is only made where no file is.
|
|
8
|
+
# Every diskpart command names this one image. -DryRun checks everything and prints the diskpart lines it would run
|
|
9
|
+
# (and does nothing else); the result of a real run goes to result.json next to the request file.
|
|
10
|
+
param(
|
|
11
|
+
[Parameter(Mandatory = $true)][string]$Json,
|
|
12
|
+
[string]$Sha256 = '',
|
|
13
|
+
[switch]$DryRun
|
|
14
|
+
)
|
|
15
|
+
$ErrorActionPreference = 'Stop'
|
|
16
|
+
. (Join-Path $PSScriptRoot 'contained-common.ps1')
|
|
17
|
+
|
|
18
|
+
$result = @{ ok = $false; message = ''; action = 'mount'; created = $false; alreadyMounted = $false }
|
|
19
|
+
|
|
20
|
+
function Invoke-Mount($Req, [bool]$Dry, [string]$TempDir) {
|
|
21
|
+
foreach ($name in @('maxGb', 'create')) {
|
|
22
|
+
if (-not ($Req.PSObject.Properties.Name -contains $name)) { throw "The request has no $name." }
|
|
23
|
+
}
|
|
24
|
+
if ($Req.maxGb -lt 8 -or $Req.maxGb -gt 4096) { throw 'The size limit must be between 8 and 4096 GB.' }
|
|
25
|
+
$create = [bool]$Req.create
|
|
26
|
+
Assert-NoLinksOnTheWay $Req $true
|
|
27
|
+
$root = $Req.storageRoot.TrimEnd('\')
|
|
28
|
+
$mountIsLink = Test-ReparsePoint $Req.mount
|
|
29
|
+
Assert-OwnedByUser $Req @($root, (Join-Path $root 'images'), (Join-Path $root 'mounts'))
|
|
30
|
+
# A mounted folder shows the image's own root, whose owner is not ours to judge; a plain folder is.
|
|
31
|
+
if (-not $mountIsLink) { Assert-OwnedByUser $Req @($Req.mount) }
|
|
32
|
+
$exists = Test-Path -LiteralPath $Req.image -PathType Leaf
|
|
33
|
+
if ($create -and $exists) { throw "An image exists already; refusing to create over it: $($Req.image)" }
|
|
34
|
+
if ((-not $create) -and (-not $exists)) { throw "The image is missing: $($Req.image)" }
|
|
35
|
+
$image = $Req.image
|
|
36
|
+
$mount = $Req.mount.TrimEnd('\')
|
|
37
|
+
|
|
38
|
+
if ($exists) {
|
|
39
|
+
Assert-OwnedByUser $Req @($image)
|
|
40
|
+
$state = Get-ImageState $image $Dry
|
|
41
|
+
if ($state.Attached) {
|
|
42
|
+
if ((Test-MountedAt $state $mount) -and $mountIsLink) {
|
|
43
|
+
$script:result.ok = $true
|
|
44
|
+
$script:result.alreadyMounted = $true
|
|
45
|
+
$script:result.message = 'The image is mounted already.'
|
|
46
|
+
Add-Note 'already mounted at the mount folder'
|
|
47
|
+
return
|
|
48
|
+
}
|
|
49
|
+
throw 'The image is attached somewhere else (Disk Management or another tool). Detach it there first.'
|
|
50
|
+
}
|
|
51
|
+
# Not attached, so its header can be read.
|
|
52
|
+
[void](Assert-PlainImage $Req $Dry)
|
|
53
|
+
}
|
|
54
|
+
if ($mountIsLink) { throw "The mount folder is a mount point already: $mount" }
|
|
55
|
+
if (@(Get-ChildItem -LiteralPath $mount -Force).Count -ne 0) { throw "The mount folder is not empty: $mount" }
|
|
56
|
+
$format = (New-Object IO.DriveInfo ([IO.Path]::GetPathRoot($mount))).DriveFormat
|
|
57
|
+
if ($format -ne 'NTFS') { throw "The mount folder must be on an NTFS drive (this one is $format): $mount" }
|
|
58
|
+
|
|
59
|
+
if ($exists) {
|
|
60
|
+
# Attach and mount the first partition of this image; nothing is created and nothing is formatted.
|
|
61
|
+
$lines = @(
|
|
62
|
+
"select vdisk file=""$image""",
|
|
63
|
+
'attach vdisk',
|
|
64
|
+
'select partition 1',
|
|
65
|
+
"assign mount=""$mount"""
|
|
66
|
+
)
|
|
67
|
+
} else {
|
|
68
|
+
if (-not $Dry) {
|
|
69
|
+
$drive = New-Object IO.DriveInfo ([IO.Path]::GetPathRoot($image))
|
|
70
|
+
if ($drive.AvailableFreeSpace -lt 1GB) { throw 'There is less than 1 GB free where the image would be made.' }
|
|
71
|
+
}
|
|
72
|
+
$megabytes = [int]$Req.maxGb * 1024
|
|
73
|
+
$lines = @(
|
|
74
|
+
"create vdisk file=""$image"" maximum=$megabytes type=expandable",
|
|
75
|
+
"select vdisk file=""$image""",
|
|
76
|
+
'attach vdisk',
|
|
77
|
+
'create partition primary',
|
|
78
|
+
'format fs=ntfs quick label=AgentData',
|
|
79
|
+
"assign mount=""$mount"""
|
|
80
|
+
)
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
[void](Invoke-DiskPart $lines $TempDir $Dry)
|
|
84
|
+
if (-not $Dry) {
|
|
85
|
+
$after = Get-ImageState $image $false
|
|
86
|
+
if (-not $after.Attached -or -not (Test-MountedAt $after $mount)) { throw 'The image is attached but not mounted at the mount folder.' }
|
|
87
|
+
if (-not (Test-ReparsePoint $mount)) { throw 'The mount folder is not a mount point after mounting.' }
|
|
88
|
+
if (-not $exists) {
|
|
89
|
+
# The new volume's root is open to Users by default: only you and the system may use it.
|
|
90
|
+
$acl = New-Object Security.AccessControl.DirectorySecurity
|
|
91
|
+
$acl.SetAccessRuleProtection($true, $false)
|
|
92
|
+
$inherit = [Security.AccessControl.InheritanceFlags]'ContainerInherit, ObjectInherit'
|
|
93
|
+
foreach ($sid in @($Req.userSid, 'S-1-5-18')) {
|
|
94
|
+
$who = New-Object Security.Principal.SecurityIdentifier($sid)
|
|
95
|
+
$acl.AddAccessRule((New-Object Security.AccessControl.FileSystemAccessRule($who, 'FullControl', $inherit, 'None', 'Allow')))
|
|
96
|
+
}
|
|
97
|
+
Set-Acl -LiteralPath $mount -AclObject $acl
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
$script:result.ok = $true
|
|
101
|
+
$script:result.created = (-not $exists)
|
|
102
|
+
$script:result.message = if ($exists) { 'The image was mounted.' } else { 'The image was created and mounted.' }
|
|
103
|
+
} catch {
|
|
104
|
+
$problem = $_.Exception.Message
|
|
105
|
+
if (-not $Dry) {
|
|
106
|
+
# Leave the PC as it was: detach this image (only this one); a half-made new image is renamed, never deleted.
|
|
107
|
+
$now = $null
|
|
108
|
+
try { $now = Get-ImageState $image $false } catch { $now = $null }
|
|
109
|
+
if ((Test-Path -LiteralPath $image) -and ((-not $now) -or $now.Attached)) {
|
|
110
|
+
try { [void](Invoke-DiskPart @("select vdisk file=""$image""", 'detach vdisk') $TempDir $false) } catch { $problem += ' (it could not be detached again: ' + $_.Exception.Message + ')' }
|
|
111
|
+
}
|
|
112
|
+
if ((-not $exists) -and (Test-Path -LiteralPath $image)) {
|
|
113
|
+
$kept = $image + '.failed-' + (Get-Date -Format 'yyyyMMddHHmmss')
|
|
114
|
+
try { Rename-Item -LiteralPath $image -NewName (Split-Path -Leaf $kept); $problem += " (the unfinished image was kept as $kept)" } catch { $problem += ' (the unfinished image is still at ' + $image + ')' }
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
throw $problem
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
$mutex = $null
|
|
122
|
+
try {
|
|
123
|
+
$request = Read-ContainedRequest -JsonPath $Json -Sha256 $Sha256 -Dry $DryRun.IsPresent
|
|
124
|
+
Assert-ContainedRequest $request
|
|
125
|
+
if (-not $DryRun) {
|
|
126
|
+
if (-not (Test-IsAdministrator)) { throw 'Mounting a disk image needs administrator rights.' }
|
|
127
|
+
$mutex = Enter-ContainedLock
|
|
128
|
+
}
|
|
129
|
+
Invoke-Mount $request $DryRun.IsPresent (Split-Path -Parent $Json)
|
|
130
|
+
} catch {
|
|
131
|
+
$result.ok = $false
|
|
132
|
+
$result.message = $_.Exception.Message
|
|
133
|
+
} finally {
|
|
134
|
+
if ($mutex) { $mutex.ReleaseMutex(); $mutex.Dispose() }
|
|
135
|
+
}
|
|
136
|
+
Write-ContainedResult $result $Json $DryRun.IsPresent
|
|
137
|
+
if ($result.ok) { exit 0 }
|
|
138
|
+
if ($DryRun) { [Console]::Error.WriteLine($result.message) }
|
|
139
|
+
exit 1
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
#Requires -Version 5.1
|
|
2
|
+
# Encrypts or decrypts data with Windows DPAPI for the current user (host/secrets/secret-store.ts runs it). Standard
|
|
3
|
+
# input: base64 of the bytes; standard output: base64 of the result. Nothing goes on the command line, so nothing shows
|
|
4
|
+
# in a process list, and nothing is written to disk. Only this Windows user, on this PC, can decrypt what it made.
|
|
5
|
+
# Exit 0 on success; exit 1 with the reason on stderr.
|
|
6
|
+
param(
|
|
7
|
+
[Parameter(Mandatory = $true)][ValidateSet('protect', 'unprotect')][string]$Mode
|
|
8
|
+
)
|
|
9
|
+
$ErrorActionPreference = 'Stop'
|
|
10
|
+
try {
|
|
11
|
+
Add-Type -AssemblyName System.Security
|
|
12
|
+
$buffer = New-Object System.IO.MemoryStream
|
|
13
|
+
[Console]::OpenStandardInput().CopyTo($buffer)
|
|
14
|
+
$text = [System.Text.Encoding]::ASCII.GetString($buffer.ToArray()).Trim()
|
|
15
|
+
$data = [Convert]::FromBase64String($text)
|
|
16
|
+
# A fixed extra secret: another program of yours that calls DPAPI without it cannot open these.
|
|
17
|
+
$entropy = [System.Text.Encoding]::UTF8.GetBytes('agent-sandbox/secret-store/v1')
|
|
18
|
+
$scope = [System.Security.Cryptography.DataProtectionScope]::CurrentUser
|
|
19
|
+
if ($Mode -eq 'protect') {
|
|
20
|
+
$result = [System.Security.Cryptography.ProtectedData]::Protect($data, $entropy, $scope)
|
|
21
|
+
} else {
|
|
22
|
+
$result = [System.Security.Cryptography.ProtectedData]::Unprotect($data, $entropy, $scope)
|
|
23
|
+
}
|
|
24
|
+
[Console]::Out.Write([Convert]::ToBase64String($result))
|
|
25
|
+
exit 0
|
|
26
|
+
} catch {
|
|
27
|
+
[Console]::Error.WriteLine($_.Exception.Message)
|
|
28
|
+
exit 1
|
|
29
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#Requires -Version 5.1
|
|
2
|
+
# Prints the permissions of a folder (and of a second path when given) as SDDL, one line each, read only. Used by the
|
|
3
|
+
# self-test to compare a folder and a child before and after a change ("D:AI" = auto-inherited).
|
|
4
|
+
param(
|
|
5
|
+
[Parameter(Mandatory = $true)][string]$Path,
|
|
6
|
+
[string]$Also
|
|
7
|
+
)
|
|
8
|
+
$ErrorActionPreference = 'Stop'
|
|
9
|
+
(Get-Acl -LiteralPath $Path).Sddl
|
|
10
|
+
if ($Also) { (Get-Acl -LiteralPath $Also).Sddl }
|
|
@@ -1,11 +1,24 @@
|
|
|
1
1
|
#Requires -Version 5.1
|
|
2
|
-
# Runs one fixed PowerShell command in an elevated PowerShell (Windows asks for
|
|
3
|
-
# `sandbox setup` to turn on the Windows Sandbox feature.
|
|
4
|
-
|
|
2
|
+
# Runs one fixed PowerShell command, or one script of this package, in an elevated PowerShell (Windows asks for
|
|
3
|
+
# permission) and waits for it. -Command is used by `sandbox setup` to turn on the Windows Sandbox feature. -Script is
|
|
4
|
+
# used for contained storage: the script (a file of this package) gets -Json <request file> -Sha256 <its checksum>.
|
|
5
|
+
# Exits with the exit code of what it ran, or 1 when the permission was declined.
|
|
6
|
+
[CmdletBinding(DefaultParameterSetName = 'Command')]
|
|
7
|
+
param(
|
|
8
|
+
[Parameter(Mandatory = $true, ParameterSetName = 'Command')][string]$Command,
|
|
9
|
+
[Parameter(Mandatory = $true, ParameterSetName = 'Script')][string]$Script,
|
|
10
|
+
[Parameter(Mandatory = $true, ParameterSetName = 'Script')][string]$Json,
|
|
11
|
+
[Parameter(Mandatory = $true, ParameterSetName = 'Script')][string]$Sha256
|
|
12
|
+
)
|
|
5
13
|
$ErrorActionPreference = 'Stop'
|
|
6
14
|
try {
|
|
7
15
|
$exe = Join-Path $PSHOME 'powershell.exe'
|
|
8
|
-
|
|
16
|
+
if ($PSCmdlet.ParameterSetName -eq 'Script') {
|
|
17
|
+
$arguments = @('-NoProfile', '-NonInteractive', '-ExecutionPolicy', 'Bypass', '-File', ('"' + $Script + '"'), '-Json', ('"' + $Json + '"'), '-Sha256', $Sha256)
|
|
18
|
+
} else {
|
|
19
|
+
$arguments = @('-NoProfile', '-Command', $Command)
|
|
20
|
+
}
|
|
21
|
+
$p = Start-Process -FilePath $exe -Verb RunAs -Wait -PassThru -WindowStyle Hidden -ArgumentList $arguments
|
|
9
22
|
exit $p.ExitCode
|
|
10
23
|
} catch {
|
|
11
24
|
exit 1
|
|
@@ -1,23 +1,62 @@
|
|
|
1
1
|
#Requires -Version 5.1
|
|
2
2
|
# Adds or removes folder access entries listed in a JSON file (host/sharing/acl.ts writes it): { "changes": [ { path,
|
|
3
|
-
# sid, rights (Read | Traverse | Modify), scope (this-folder | inherit), add }
|
|
4
|
-
# A link (junction or symbolic link) is refused, so an entry can never land on another folder.
|
|
5
|
-
#
|
|
3
|
+
# sid, rights (Read | Traverse | Modify), scope (this-folder | inherit), add } or { op: "private", path } ] }. Entries
|
|
4
|
+
# are applied in order. A link (junction or symbolic link) is refused, so an entry can never land on another folder.
|
|
5
|
+
# Nothing is written when the permissions would not change. A this-folder entry (and "private" on an empty folder) is
|
|
6
|
+
# written to that folder only, never over its children (FolderSecurity.cs); an inherit entry reaches the children.
|
|
7
|
+
# Exit 0 when all are applied; exit 1 with the reason on stderr otherwise.
|
|
6
8
|
param(
|
|
7
9
|
[Parameter(Mandatory = $true)][string]$Json
|
|
8
10
|
)
|
|
9
11
|
$ErrorActionPreference = 'Stop'
|
|
10
12
|
|
|
13
|
+
$loaded = $false
|
|
14
|
+
function Set-OwnDacl([string]$Path, $Acl) {
|
|
15
|
+
if (-not $script:loaded) {
|
|
16
|
+
Add-Type -Path (Join-Path $PSScriptRoot '..\csharp\FolderSecurity.cs')
|
|
17
|
+
$script:loaded = $true
|
|
18
|
+
}
|
|
19
|
+
# Keep "auto-inherited" (D:AI) as Set-Acl does: without it Windows treats the inherited entries as the folder's own
|
|
20
|
+
# the next time the parent changes. SetFileSecurity keeps that flag only when the descriptor also requests it.
|
|
21
|
+
$raw = New-Object System.Security.AccessControl.RawSecurityDescriptor -ArgumentList $Acl.GetSecurityDescriptorBinaryForm(), 0
|
|
22
|
+
if (-not $Acl.AreAccessRulesProtected) {
|
|
23
|
+
$auto = [System.Security.AccessControl.ControlFlags]'DiscretionaryAclAutoInherited, DiscretionaryAclAutoInheritRequired'
|
|
24
|
+
$raw.SetFlags($raw.ControlFlags -bor $auto)
|
|
25
|
+
}
|
|
26
|
+
$bytes = New-Object byte[] $raw.BinaryLength
|
|
27
|
+
$raw.GetBinaryForm($bytes, 0)
|
|
28
|
+
[AgentSandbox.FolderSecurity]::SetDacl($Path, $bytes)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function Get-Folder([string]$Path) {
|
|
32
|
+
$item = Get-Item -LiteralPath $Path -Force
|
|
33
|
+
if (-not $item.PSIsContainer) { throw "Not a folder: $Path" }
|
|
34
|
+
if ($item.Attributes -band [System.IO.FileAttributes]::ReparsePoint) { throw "Refusing a link: $Path" }
|
|
35
|
+
}
|
|
36
|
+
|
|
11
37
|
try {
|
|
12
38
|
# The entries sit in a property: piping a bare JSON array into ConvertFrom-Json gives one array object on 5.1.
|
|
13
39
|
$doc = Get-Content -LiteralPath $Json -Raw -Encoding UTF8 | ConvertFrom-Json
|
|
14
40
|
$entries = @($doc.changes)
|
|
15
41
|
foreach ($e in $entries) {
|
|
42
|
+
Get-Folder $e.path
|
|
43
|
+
if ($e.op -eq 'private') {
|
|
44
|
+
# Only you, SYSTEM and Administrators; inheritance from the parent off; children inherit this.
|
|
45
|
+
$me = [System.Security.Principal.WindowsIdentity]::GetCurrent().User
|
|
46
|
+
$want = New-Object System.Security.AccessControl.DirectorySecurity
|
|
47
|
+
$want.SetAccessRuleProtection($true, $false)
|
|
48
|
+
foreach ($who in @($me, (New-Object System.Security.Principal.SecurityIdentifier('S-1-5-18')), (New-Object System.Security.Principal.SecurityIdentifier('S-1-5-32-544')))) {
|
|
49
|
+
$want.AddAccessRule((New-Object System.Security.AccessControl.FileSystemAccessRule(
|
|
50
|
+
$who, 'FullControl', 'ContainerInherit, ObjectInherit', 'None', 'Allow')))
|
|
51
|
+
}
|
|
52
|
+
$have = Get-Acl -LiteralPath $e.path
|
|
53
|
+
if ($have.GetSecurityDescriptorSddlForm('Access') -eq $want.GetSecurityDescriptorSddlForm('Access')) { continue }
|
|
54
|
+
$children = @(Get-ChildItem -LiteralPath $e.path -Force | Select-Object -First 1)
|
|
55
|
+
if ($children.Count -eq 0) { Set-OwnDacl $e.path $want } else { Set-Acl -LiteralPath $e.path -AclObject $want }
|
|
56
|
+
continue
|
|
57
|
+
}
|
|
16
58
|
if ($e.rights -notin @('Read', 'Traverse', 'Modify')) { throw "Unknown rights: $($e.rights)" }
|
|
17
59
|
if ($e.scope -notin @('this-folder', 'inherit')) { throw "Unknown scope: $($e.scope)" }
|
|
18
|
-
$item = Get-Item -LiteralPath $e.path -Force
|
|
19
|
-
if (-not $item.PSIsContainer) { throw "Not a folder: $($e.path)" }
|
|
20
|
-
if ($item.Attributes -band [System.IO.FileAttributes]::ReparsePoint) { throw "Refusing a link: $($e.path)" }
|
|
21
60
|
|
|
22
61
|
$sid = New-Object System.Security.Principal.SecurityIdentifier($e.sid)
|
|
23
62
|
$rights = [System.Security.AccessControl.FileSystemRights]$e.rights
|
|
@@ -30,12 +69,15 @@ try {
|
|
|
30
69
|
$sid, $rights, $inherit, [System.Security.AccessControl.PropagationFlags]'None', [System.Security.AccessControl.AccessControlType]'Allow')
|
|
31
70
|
|
|
32
71
|
$acl = Get-Acl -LiteralPath $e.path
|
|
72
|
+
$before = $acl.GetSecurityDescriptorSddlForm('Access')
|
|
33
73
|
if ($e.add) {
|
|
34
74
|
$acl.AddAccessRule($rule)
|
|
35
75
|
} else {
|
|
36
76
|
[void]$acl.RemoveAccessRuleSpecific($rule)
|
|
37
77
|
}
|
|
38
|
-
|
|
78
|
+
# Nothing changed (removing an absent entry, adding a present one): do not write, a write walks the subtree.
|
|
79
|
+
if ($acl.GetSecurityDescriptorSddlForm('Access') -eq $before) { continue }
|
|
80
|
+
if ($e.scope -eq 'inherit') { Set-Acl -LiteralPath $e.path -AclObject $acl } else { Set-OwnDacl $e.path $acl }
|
|
39
81
|
}
|
|
40
82
|
exit 0
|
|
41
83
|
} catch {
|
|
@@ -7,28 +7,43 @@ $ErrorActionPreference = 'Stop'
|
|
|
7
7
|
$filters = @(
|
|
8
8
|
@{ LogName = 'System'; Id = 1074, 6008, 41, 42, 2004; StartTime = $Since },
|
|
9
9
|
@{ LogName = 'System'; Id = 1001; ProviderName = 'Microsoft-Windows-WER-SystemErrorReporting'; StartTime = $Since },
|
|
10
|
-
@{ LogName = 'Microsoft-Windows-Hyper-V-Worker-Admin'; Id = 18590, 40001; StartTime = $Since }
|
|
10
|
+
@{ LogName = 'Microsoft-Windows-Hyper-V-Worker-Admin'; Id = 18590, 40001; StartTime = $Since },
|
|
11
|
+
# Hardware errors Windows reported (WHEA: CPU, memory, bus, disk).
|
|
12
|
+
@{ LogName = 'System'; ProviderName = 'Microsoft-Windows-WHEA-Logger'; Id = 17, 18, 19, 47; StartTime = $Since },
|
|
13
|
+
# Any error or critical event of the Hyper-V worker and compute services (the VM's memory, start and stop).
|
|
14
|
+
@{ LogName = 'Microsoft-Windows-Hyper-V-Worker-Admin'; Level = 1, 2; StartTime = $Since },
|
|
15
|
+
@{ LogName = 'Microsoft-Windows-Hyper-V-Compute-Admin'; Level = 1, 2; StartTime = $Since },
|
|
16
|
+
# A crash report of the programs that hold the VM (kept only when it names one of them).
|
|
17
|
+
@{ LogName = 'Application'; Id = 1000, 1001; StartTime = $Since; OnlyVmPrograms = $true }
|
|
11
18
|
)
|
|
12
19
|
$maxMessage = 390
|
|
20
|
+
$maxResourceMessage = 1500
|
|
13
21
|
|
|
14
22
|
# What each event says beyond its id: the program that asked for a restart (1074), else the start of the message.
|
|
15
23
|
function Get-EventDetail($record) {
|
|
16
24
|
if ($record.Id -eq 1074) { return [string]$record.Properties[0].Value }
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
}
|
|
21
|
-
|
|
25
|
+
# The plain power events say nothing more; the resource-exhaustion event (2004) lists the biggest memory users.
|
|
26
|
+
# Kernel-Power 41 carries the stop code of a blue screen (0 when there was none: a freeze or power loss).
|
|
27
|
+
if ($record.Id -eq 41) { return 'BugcheckCode ' + [string]$record.Properties[0].Value }
|
|
28
|
+
if ($record.Id -in 42, 6008) { return '' }
|
|
29
|
+
$message = [string]$record.Message
|
|
30
|
+
$max = if ($record.Id -eq 2004) { $maxResourceMessage } else { $maxMessage }
|
|
31
|
+
return $message.Substring(0, [math]::Min($max, $message.Length))
|
|
22
32
|
}
|
|
23
33
|
|
|
24
34
|
$events = foreach ($filter in $filters) {
|
|
25
35
|
try {
|
|
26
|
-
|
|
36
|
+
$onlyVm = $filter.ContainsKey('OnlyVmPrograms')
|
|
37
|
+
$query = @{} + $filter
|
|
38
|
+
$query.Remove('OnlyVmPrograms')
|
|
39
|
+
Get-WinEvent -FilterHashtable $query -MaxEvents 100 | ForEach-Object {
|
|
40
|
+
$detail = Get-EventDetail $_
|
|
41
|
+
if ($onlyVm -and $detail -notmatch 'vmwp\.exe|vmmem|vmcompute|windowssandbox') { return }
|
|
27
42
|
[pscustomobject]@{
|
|
28
43
|
at = $_.TimeCreated.ToUniversalTime().ToString('o')
|
|
29
44
|
id = $_.Id
|
|
30
45
|
provider = $_.ProviderName
|
|
31
|
-
process =
|
|
46
|
+
process = $detail
|
|
32
47
|
}
|
|
33
48
|
}
|
|
34
49
|
} catch {
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
Copyright (c) 2011 Einar Otto Stangvik <einaros@gmail.com>
|
|
2
|
+
Copyright (c) 2013 Arnout Kazemier and contributors
|
|
3
|
+
Copyright (c) 2016 Luigi Pinca and contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
6
|
+
this software and associated documentation files (the "Software"), to deal in
|
|
7
|
+
the Software without restriction, including without limitation the rights to
|
|
8
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
|
9
|
+
the Software, and to permit persons to whom the Software is furnished to do so,
|
|
10
|
+
subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
17
|
+
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
18
|
+
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
19
|
+
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
20
|
+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|