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
package/dist/guest/boot/boot.js
CHANGED
|
@@ -5,6 +5,9 @@ import { spawn } from 'node:child_process';
|
|
|
5
5
|
import { writeGuides } from './guide.js';
|
|
6
6
|
import { setupToolchains } from '../toolchains/index.js';
|
|
7
7
|
import { agents } from '../agents/agent-installer.js';
|
|
8
|
+
import { agentShims, sbxAgentText, shimText } from '../agents/agent-files.js';
|
|
9
|
+
import { resetMachineBound, restoreLocalState } from '../agents/local-state.js';
|
|
10
|
+
import { installShellPath } from '../setup/shell-path.js';
|
|
8
11
|
import { linkProfileDirs } from '../agents/profile-links.js';
|
|
9
12
|
import { restoreClaudeMem } from '../setup/claude-mem.js';
|
|
10
13
|
import { syncClaudeProfile } from '../setup/claude-profile.js';
|
|
@@ -20,6 +23,7 @@ import { pruneToolLeftovers } from '../toolchains/leftovers.js';
|
|
|
20
23
|
import { wanted } from '../toolchains/detect.js';
|
|
21
24
|
import { configureVscode } from '../toolchains/tools/vscode.js';
|
|
22
25
|
import { enableProcessAudit } from '../audit/process-audit.js';
|
|
26
|
+
import { setupVpn } from '../vpn/index.js';
|
|
23
27
|
import { now } from '../../shared/channel/run-dir.js';
|
|
24
28
|
import { writeJsonAtomic } from '../../shared/io/json.js';
|
|
25
29
|
import { viewSession } from '../sessions/viewer.js';
|
|
@@ -29,9 +33,10 @@ import { dryRun, isWin, localDir, logsDir, run, toolsDir } from '../runtime/path
|
|
|
29
33
|
import { log, logPath, warn } from '../runtime/log.js';
|
|
30
34
|
import { mkdirp } from '../runtime/fs.js';
|
|
31
35
|
import { session, workspace } from '../runtime/session.js';
|
|
36
|
+
import { applyBootEnvironment, BOOT_SECRETS_VARIABLE, takeSecrets } from '../runtime/secrets.js';
|
|
32
37
|
import { setSandboxStatus } from '../runtime/status.js';
|
|
33
38
|
import { errMsg } from '../../core/util/errors.js';
|
|
34
|
-
const STEPS =
|
|
39
|
+
const STEPS = 9;
|
|
35
40
|
const PRIMARY_POLLS = 600;
|
|
36
41
|
const POLL_MS = 500;
|
|
37
42
|
const VSCODE_LANGUAGES = ['python', 'java', 'go', 'rust', 'cpp', 'msvc', 'dotnet', 'ruby', 'php', 'deno', 'pwsh'];
|
|
@@ -56,12 +61,19 @@ async function soft(what, work) {
|
|
|
56
61
|
warn(what + ' failed (continuing): ' + errMsg(e));
|
|
57
62
|
}
|
|
58
63
|
}
|
|
59
|
-
function startDaemon(env) {
|
|
64
|
+
function startDaemon(env, secrets) {
|
|
60
65
|
spawn(process.execPath, [path.join(path.dirname(process.argv[1]), 'daemon.js')], {
|
|
61
66
|
detached: true,
|
|
62
67
|
stdio: 'ignore',
|
|
63
68
|
windowsHide: true,
|
|
64
|
-
env: {
|
|
69
|
+
env: {
|
|
70
|
+
...env,
|
|
71
|
+
AGENT_LOG_PREFIX: 'daemon',
|
|
72
|
+
// The agent's environment (it may hold API keys): the daemon moves it into memory and removes this at once.
|
|
73
|
+
...(secrets.harnessEnvironment
|
|
74
|
+
? { [BOOT_SECRETS_VARIABLE]: JSON.stringify({ harnessEnvironment: secrets.harnessEnvironment }) }
|
|
75
|
+
: {}),
|
|
76
|
+
},
|
|
65
77
|
}).unref();
|
|
66
78
|
}
|
|
67
79
|
/**
|
|
@@ -72,8 +84,19 @@ function writeDbCommand() {
|
|
|
72
84
|
const dir = mkdirp(path.join(localDir, 'bin'));
|
|
73
85
|
const db = path.join(path.dirname(process.argv[1]), 'db.js');
|
|
74
86
|
fs.writeFileSync(path.join(dir, 'sbx-db.cmd'), '@setlocal\r\n@set AGENT_LOG_PREFIX=db\r\n@"' + process.execPath + '" "' + db + '" %*\r\n');
|
|
87
|
+
writeAgentCommands(dir);
|
|
75
88
|
return dir;
|
|
76
89
|
}
|
|
90
|
+
/**
|
|
91
|
+
* `claude`, `codex` ... by name in every terminal tab, installed yet or not (the command installs the agent on first
|
|
92
|
+
* use), and `sbx-agent`. Written to the sandbox's disk each boot, next to `sbx-db`.
|
|
93
|
+
*/
|
|
94
|
+
function writeAgentCommands(dir) {
|
|
95
|
+
const install = { node: process.execPath, script: path.join(path.dirname(process.argv[1]), 'agent.js') };
|
|
96
|
+
for (const shim of agentShims(toolsDir, session.agents ?? {}))
|
|
97
|
+
fs.writeFileSync(path.join(dir, shim.command + '.cmd'), shimText(shim, install));
|
|
98
|
+
fs.writeFileSync(path.join(dir, 'sbx-agent.cmd'), sbxAgentText(install));
|
|
99
|
+
}
|
|
77
100
|
async function waitForPrimary() {
|
|
78
101
|
for (let i = 0; i < PRIMARY_POLLS; i++) {
|
|
79
102
|
const s = run.readSession(session.launchId);
|
|
@@ -97,6 +120,8 @@ export class Boot {
|
|
|
97
120
|
ptyHost = null;
|
|
98
121
|
lan = session.networking ? 'open' : 'offline';
|
|
99
122
|
gitAccess = session.provisioning.git.access ?? 'full';
|
|
123
|
+
/** What the host handed over in its one-shot file (read and deleted at the start of run()). */
|
|
124
|
+
secrets = {};
|
|
100
125
|
async run() {
|
|
101
126
|
log('Agent sandbox: ' +
|
|
102
127
|
session.project +
|
|
@@ -110,9 +135,12 @@ export class Boot {
|
|
|
110
135
|
throw new Error('Workspace folder is missing in the sandbox: ' + workspace);
|
|
111
136
|
mkdirp(toolsDir);
|
|
112
137
|
mkdirp(run.root);
|
|
138
|
+
this.secrets = takeSecrets(session.launchId);
|
|
139
|
+
applyBootEnvironment(this.secrets.harnessEnvironment);
|
|
113
140
|
await this.networkAndSessionHost();
|
|
114
141
|
await this.hooksAndDesktop();
|
|
115
142
|
const { tools, env } = await this.developerTools();
|
|
143
|
+
await this.vpn();
|
|
116
144
|
await this.gitIdentity(env);
|
|
117
145
|
await this.claude(tools);
|
|
118
146
|
await this.agent(env);
|
|
@@ -165,6 +193,7 @@ export class Boot {
|
|
|
165
193
|
}));
|
|
166
194
|
const env = agentEnv(tools);
|
|
167
195
|
persistEnvironment(env, Object.keys(tools.vars));
|
|
196
|
+
await soft('Shell start-up PATH', installShellPath);
|
|
168
197
|
saveBootEnv({
|
|
169
198
|
basePath,
|
|
170
199
|
toolVars: Object.keys(tools.vars),
|
|
@@ -178,36 +207,47 @@ export class Boot {
|
|
|
178
207
|
await soft('Cleaning old tool builds', () => pruneToolLeftovers());
|
|
179
208
|
return { tools, env };
|
|
180
209
|
}
|
|
210
|
+
/** vpn.enabled: the tunnel and its kill switch, before anything else uses the network (git, the agent). */
|
|
211
|
+
async vpn() {
|
|
212
|
+
step(4, session.vpn ? 'VPN (' + session.vpn.server + ')' : 'VPN (off)');
|
|
213
|
+
if (!session.vpn)
|
|
214
|
+
return;
|
|
215
|
+
await soft('VPN', async () => {
|
|
216
|
+
await setupVpn(this.secrets, this.ptyHost);
|
|
217
|
+
});
|
|
218
|
+
}
|
|
181
219
|
async gitIdentity(env) {
|
|
182
|
-
step(
|
|
220
|
+
step(5, 'Git identity');
|
|
183
221
|
await soft('Git config', () => setupGitConfig(env));
|
|
184
222
|
}
|
|
185
223
|
async claude(tools) {
|
|
186
|
-
step(
|
|
224
|
+
step(6, 'Claude settings, history and claude-mem');
|
|
187
225
|
if (session.harnessName === 'claude')
|
|
188
|
-
await soft('Claude settings', syncClaudeProfile);
|
|
226
|
+
await soft('Claude settings', () => syncClaudeProfile(this.secrets.claudeCredentials));
|
|
189
227
|
await soft('claude-mem restore', restoreClaudeMem);
|
|
228
|
+
await soft('Agent files of the last sandbox', resetMachineBound);
|
|
229
|
+
await soft('Agent databases restore', restoreLocalState);
|
|
190
230
|
await soft('Sandbox guide for the agent', () => writeGuides(tools.summary, this.lan));
|
|
191
231
|
await soft('Claude managed settings', () => writeManagedSettings(this.gitAccess));
|
|
192
232
|
}
|
|
193
233
|
async agent(env) {
|
|
194
|
-
step(
|
|
234
|
+
step(7, 'Agent: ' + session.harnessName);
|
|
195
235
|
linkProfileDirs(session.agentProfileDirs ?? {});
|
|
196
236
|
if (session.harness)
|
|
197
237
|
await agents.provision(session.harnessName, session.harness, env);
|
|
198
238
|
}
|
|
199
239
|
preAgentHooks(env) {
|
|
200
|
-
step(
|
|
240
|
+
step(8, 'Pre-agent hooks');
|
|
201
241
|
runHooks('pre-agent', env);
|
|
202
242
|
}
|
|
203
243
|
/** Ready: starts the session daemon and, with an agent, its first session, shown in this window. */
|
|
204
244
|
async start(env) {
|
|
205
|
-
step(
|
|
245
|
+
step(9, 'Starting ' + session.harnessName);
|
|
206
246
|
setSandboxStatus('ready', 'Ready');
|
|
207
247
|
// No agent, or a restart that adds a project (the host opens its sessions itself once the sandbox is ready).
|
|
208
248
|
if (!session.harness || session.autoSession === false) {
|
|
209
249
|
if (!dryRun)
|
|
210
|
-
startDaemon(env);
|
|
250
|
+
startDaemon(env, this.secrets);
|
|
211
251
|
log('Ready' + (session.harness ? '' : ' (no agent requested)') + '. Workspace: ' + workspace);
|
|
212
252
|
return;
|
|
213
253
|
}
|
|
@@ -220,7 +260,7 @@ export class Boot {
|
|
|
220
260
|
runHooks('post-agent', env);
|
|
221
261
|
return;
|
|
222
262
|
}
|
|
223
|
-
startDaemon(env);
|
|
263
|
+
startDaemon(env, this.secrets);
|
|
224
264
|
writeJsonAtomic(run.requestFile(session.launchId), {
|
|
225
265
|
kind: 'session',
|
|
226
266
|
id: session.launchId,
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
// The session daemon's polling loop: claims each valid request in run\requests and hands it to its handler.
|
|
2
2
|
import fs from 'node:fs';
|
|
3
3
|
import { saveClaudeMem } from '../setup/claude-mem.js';
|
|
4
|
+
import { saveLocalState } from '../agents/local-state.js';
|
|
4
5
|
import { execCommand } from './exec.js';
|
|
5
6
|
import { sessions } from './sessions.js';
|
|
7
|
+
import { governor } from '../governor/index.js';
|
|
6
8
|
import { respond, safely } from './state.js';
|
|
7
9
|
import { run } from '../runtime/paths.js';
|
|
10
|
+
import { withRequestSecrets } from '../runtime/secrets.js';
|
|
8
11
|
import { warn } from '../runtime/log.js';
|
|
9
12
|
import { errMsg } from '../../core/util/errors.js';
|
|
10
13
|
const POLL_MS = 400;
|
|
@@ -33,11 +36,12 @@ export class Daemon {
|
|
|
33
36
|
if (run.readSession(req.id))
|
|
34
37
|
continue;
|
|
35
38
|
// Not awaited: starting a session or running a command must not hold up other requests.
|
|
36
|
-
void Promise.resolve(this.handle(req)).catch((e) => respond(req.id, { ok: false, message: errMsg(e) }));
|
|
39
|
+
void Promise.resolve(this.handle(withRequestSecrets(req))).catch((e) => respond(req.id, { ok: false, message: errMsg(e) }));
|
|
37
40
|
}
|
|
38
41
|
if (Date.now() - this.lastMemSave > MEM_SAVE_MS) {
|
|
39
42
|
this.lastMemSave = Date.now();
|
|
40
43
|
safely('claude-mem save', saveClaudeMem);
|
|
44
|
+
safely('agent databases save', saveLocalState);
|
|
41
45
|
}
|
|
42
46
|
}
|
|
43
47
|
handle(req) {
|
|
@@ -50,6 +54,9 @@ export class Daemon {
|
|
|
50
54
|
return execCommand(req);
|
|
51
55
|
case 'restart':
|
|
52
56
|
return sessions.restart(req);
|
|
57
|
+
case 'pressure':
|
|
58
|
+
// No response: the host repeats it every few seconds while its memory stays low.
|
|
59
|
+
return governor.hostPressure(req.seconds, req.reason);
|
|
53
60
|
case 'ping':
|
|
54
61
|
return respond(req.id, { ok: true, message: 'pong (' + sessions.count + ' session(s) running)' });
|
|
55
62
|
}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { spawn } from 'node:child_process';
|
|
3
3
|
import { SYSTEM } from '../../shared/system.js';
|
|
4
4
|
import { exists } from '../runtime/fs.js';
|
|
5
|
+
import { withRegistryPath } from '../setup/environment.js';
|
|
5
6
|
import { errMsg } from '../../core/util/errors.js';
|
|
6
7
|
import { provisioner } from './project-provisioner.js';
|
|
7
8
|
import { insideWorkspace, respond } from './state.js';
|
|
@@ -20,7 +21,7 @@ export function execCommand(req) {
|
|
|
20
21
|
}
|
|
21
22
|
// chcp 65001 first: console programs then write UTF-8 (not the OEM code page) into the pipes.
|
|
22
23
|
// In a project registered after boot, its own environment (its Node, Python, database variables).
|
|
23
|
-
const env = provisioner.provisionedFor(req.cwd)?.env ?? process.env;
|
|
24
|
+
const env = withRegistryPath(provisioner.provisionedFor(req.cwd)?.env ?? process.env);
|
|
24
25
|
const child = spawn(SYSTEM.cmd(), ['/d', '/s', '/c', '"chcp 65001>nul & ' + req.command.map(quoteForCmd).join(' ') + '"'], { cwd: req.cwd, env, windowsHide: true, windowsVerbatimArguments: true });
|
|
25
26
|
const output = { stdout: '', stderr: '' };
|
|
26
27
|
// setEncoding decodes across chunks: a multi-byte character split between two reads is not mangled.
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { spawnSync } from 'node:child_process';
|
|
3
3
|
import { SYSTEM } from '../../shared/system.js';
|
|
4
4
|
import { saveClaudeMem } from '../setup/claude-mem.js';
|
|
5
|
+
import { saveLocalState } from '../agents/local-state.js';
|
|
5
6
|
import { isWin, run } from '../runtime/paths.js';
|
|
6
7
|
import { log } from '../runtime/log.js';
|
|
7
8
|
import { session } from '../runtime/session.js';
|
|
@@ -25,6 +26,7 @@ export class IdleShutdown {
|
|
|
25
26
|
return;
|
|
26
27
|
log('Headless sandbox has no sessions left; shutting down.');
|
|
27
28
|
safely('claude-mem save', saveClaudeMem);
|
|
29
|
+
safely('agent databases save', saveLocalState);
|
|
28
30
|
spawnSync(SYSTEM.shutdown(), ['/s', '/t', '5'], { windowsHide: true });
|
|
29
31
|
}, GRACE_MS);
|
|
30
32
|
}
|
|
@@ -2,6 +2,11 @@ import type { GuestRequest } from '../../core/types.js';
|
|
|
2
2
|
type SessionRequest = Extract<GuestRequest, {
|
|
3
3
|
kind: 'session';
|
|
4
4
|
}>;
|
|
5
|
+
/**
|
|
6
|
+
* What keeps heavy load from taking the sandbox down: the job object's memory limit for everything the agents start
|
|
7
|
+
* (ptyhost reads PTYHOST_JOB_MB) and cargo's parallel jobs sized to the sandbox's memory and the sessions building.
|
|
8
|
+
*/
|
|
9
|
+
export declare function memoryEnv(env: NodeJS.ProcessEnv, sessions: number): NodeJS.ProcessEnv;
|
|
5
10
|
/** The agent sessions of this sandbox: the running ones, the ones starting, and what happens when one ends. */
|
|
6
11
|
export declare class SessionManager {
|
|
7
12
|
private readonly live;
|
|
@@ -3,19 +3,23 @@
|
|
|
3
3
|
// (daemon/project).
|
|
4
4
|
import path from 'node:path';
|
|
5
5
|
import crypto from 'node:crypto';
|
|
6
|
+
import os from 'node:os';
|
|
6
7
|
import { spawn } from 'node:child_process';
|
|
7
8
|
import { FrameType, sendControl } from '../../shared/pty/index.js';
|
|
8
9
|
import { isWithin } from '../../shared/paths/projects.js';
|
|
9
10
|
import { now } from '../../shared/channel/run-dir.js';
|
|
10
11
|
import { SYSTEM } from '../../shared/system.js';
|
|
12
|
+
import { cargoJobs } from '../../shared/memory/index.js';
|
|
11
13
|
import { commandLine } from '../sessions/cmdline.js';
|
|
12
14
|
import { freePort } from '../runtime/ports.js';
|
|
13
15
|
import { primaryProject } from '../boot/project-status.js';
|
|
14
16
|
import { ensurePtyHost, ptyHostLogTail, startPtyHost, waitForPtyHost } from '../sessions/pty-host.js';
|
|
15
17
|
import { agents } from '../agents/agent-installer.js';
|
|
16
18
|
import { saveClaudeMem } from '../setup/claude-mem.js';
|
|
19
|
+
import { saveLocalState } from '../agents/local-state.js';
|
|
17
20
|
import { projectHooks, runHooks, runHooksAsync } from '../setup/hooks.js';
|
|
18
21
|
import { guestAddresses } from '../network/addresses.js';
|
|
22
|
+
import { withRegistryPath } from '../setup/environment.js';
|
|
19
23
|
import { dataDir, toolsDir } from '../runtime/paths.js';
|
|
20
24
|
import { exists } from '../runtime/fs.js';
|
|
21
25
|
import { log, warn } from '../runtime/log.js';
|
|
@@ -46,8 +50,20 @@ const harnessFor = (req) => {
|
|
|
46
50
|
return sent;
|
|
47
51
|
throw new Error('Agent "' + req.harness + '" is not configured for this sandbox (it runs ' + session.harnessName + ').');
|
|
48
52
|
};
|
|
53
|
+
/**
|
|
54
|
+
* What keeps heavy load from taking the sandbox down: the job object's memory limit for everything the agents start
|
|
55
|
+
* (ptyhost reads PTYHOST_JOB_MB) and cargo's parallel jobs sized to the sandbox's memory and the sessions building.
|
|
56
|
+
*/
|
|
57
|
+
export function memoryEnv(env, sessions) {
|
|
58
|
+
const out = {};
|
|
59
|
+
if (session.agentMemoryLimitMb)
|
|
60
|
+
out.PTYHOST_JOB_MB = String(session.agentMemoryLimitMb);
|
|
61
|
+
if (!env.CARGO_BUILD_JOBS)
|
|
62
|
+
out.CARGO_BUILD_JOBS = String(cargoJobs(os.cpus().length, os.totalmem() / 1024 ** 3, sessions));
|
|
63
|
+
return out;
|
|
64
|
+
}
|
|
49
65
|
/** Starts ptyhost for the agent and waits until it listens; a failure carries the tail of ptyhost's own log. */
|
|
50
|
-
const launchPtyHost = async (req, remote, env, say) => {
|
|
66
|
+
const launchPtyHost = async (req, remote, env, say, sessions) => {
|
|
51
67
|
const harness = harnessFor(req);
|
|
52
68
|
// Never refresh here: main already did, and replacing a running agent's executable would fail.
|
|
53
69
|
say('Preparing ' + req.harness);
|
|
@@ -64,7 +80,7 @@ const launchPtyHost = async (req, remote, env, say) => {
|
|
|
64
80
|
rows: 32,
|
|
65
81
|
id: req.id,
|
|
66
82
|
cwd: req.cwd,
|
|
67
|
-
env: { ...env, ...harness.environment },
|
|
83
|
+
env: { ...withRegistryPath(env), ...harness.environment, ...memoryEnv(env, sessions) },
|
|
68
84
|
remote,
|
|
69
85
|
command: commandLine(launch.file, [...base, ...req.args]),
|
|
70
86
|
restartCommand: commandLine(launch.file, [...base, ...(harness.resumeArguments ?? [])]),
|
|
@@ -143,7 +159,7 @@ export class SessionManager {
|
|
|
143
159
|
try {
|
|
144
160
|
const place = await placeFor(req, say);
|
|
145
161
|
const remote = session.networking && session.attach.enabled;
|
|
146
|
-
const { child, port, token } = await launchPtyHost(req, remote, place.env, say);
|
|
162
|
+
const { child, port, token } = await launchPtyHost(req, remote, place.env, say, this.live.size + 1);
|
|
147
163
|
const resumed = req.harness === 'claude' ? resumedConversation(req.args) : undefined;
|
|
148
164
|
const running = {
|
|
149
165
|
...status,
|
|
@@ -257,6 +273,7 @@ export class SessionManager {
|
|
|
257
273
|
else
|
|
258
274
|
safely('post-agent hooks', () => runHooks('post-agent', process.env));
|
|
259
275
|
safely('claude-mem save', saveClaudeMem);
|
|
276
|
+
safely('agent databases save', saveLocalState);
|
|
260
277
|
this.idle.check();
|
|
261
278
|
}
|
|
262
279
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// `sbx-agent`: list agents and install a configured one inside the sandbox. Usage: sbx-agent list | install <agent>
|
|
2
|
+
import { dropInheritedModulePath } from '../../shared/system.js';
|
|
3
|
+
import { runSbxAgent } from '../agents/sbx-agent.js';
|
|
4
|
+
dropInheritedModulePath();
|
|
5
|
+
runSbxAgent(process.argv.slice(2)).then((code) => {
|
|
6
|
+
process.exitCode = code;
|
|
7
|
+
}, (e) => {
|
|
8
|
+
console.error(e instanceof Error ? e.message : String(e));
|
|
9
|
+
process.exitCode = 1;
|
|
10
|
+
});
|
|
@@ -6,11 +6,16 @@ import { startRelays } from '../daemon/relays.js';
|
|
|
6
6
|
import { startProcessCollector } from '../audit/process-audit.js';
|
|
7
7
|
import { safely } from '../daemon/state.js';
|
|
8
8
|
import { log, warn } from '../runtime/log.js';
|
|
9
|
+
import { adoptBootSecrets } from '../runtime/secrets.js';
|
|
9
10
|
import { errMsg } from '../../core/util/errors.js';
|
|
10
11
|
import { Daemon } from '../daemon/daemon.js';
|
|
12
|
+
import { governor } from '../governor/index.js';
|
|
11
13
|
process.on('uncaughtException', (e) => warn('daemon: unexpected error (continuing): ' + (e.stack ?? errMsg(e))));
|
|
12
14
|
process.on('unhandledRejection', (e) => warn('daemon: unexpected error (continuing): ' + errMsg(e)));
|
|
15
|
+
adoptBootSecrets();
|
|
13
16
|
log('Session daemon started (pid ' + process.pid + ').');
|
|
14
17
|
safely('port forwards', startRelays);
|
|
15
18
|
safely('audit', startProcessCollector);
|
|
19
|
+
safely('memory governor', () => governor.start());
|
|
20
|
+
log('Memory governor: ' + governor.describe());
|
|
16
21
|
new Daemon().start();
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { GuestThresholds, LoadProfile } from '../../shared/memory/index.js';
|
|
2
|
+
export type Priority = 'idle' | 'below' | 'normal';
|
|
3
|
+
export interface ProcSample {
|
|
4
|
+
readonly pid: number;
|
|
5
|
+
readonly name: string;
|
|
6
|
+
/** Private memory in MB. */
|
|
7
|
+
readonly mb: number;
|
|
8
|
+
readonly prio: Priority;
|
|
9
|
+
}
|
|
10
|
+
export interface MemSample {
|
|
11
|
+
readonly ramTotalMb: number;
|
|
12
|
+
readonly ramAvailMb: number;
|
|
13
|
+
readonly commitLimitMb: number;
|
|
14
|
+
readonly commitAvailMb: number;
|
|
15
|
+
/** Only the processes in the agents' job. */
|
|
16
|
+
readonly procs: readonly ProcSample[];
|
|
17
|
+
}
|
|
18
|
+
export declare const isNeverTouched: (name: string) => boolean;
|
|
19
|
+
export declare const canLower: (name: string) => boolean;
|
|
20
|
+
export declare const canPause: (name: string) => boolean;
|
|
21
|
+
export type Level = 'ok' | 'throttled' | 'suspending';
|
|
22
|
+
export interface GovernorState {
|
|
23
|
+
/** Under pressure now (with hysteresis). */
|
|
24
|
+
readonly pressure: boolean;
|
|
25
|
+
/** Samples in a row that looked calm while under pressure. */
|
|
26
|
+
readonly calm: number;
|
|
27
|
+
/** Samples under pressure so far (resets when it ends). */
|
|
28
|
+
readonly samples: number;
|
|
29
|
+
/** What was lowered and to what, by pid. */
|
|
30
|
+
readonly lowered: Readonly<Record<number, Priority>>;
|
|
31
|
+
/** Until when (ms) the last pause lasts, and when another may start. */
|
|
32
|
+
readonly pausedUntil: number;
|
|
33
|
+
readonly nextPauseAt: number;
|
|
34
|
+
/** The PC asked for slowing down until this time (ms). */
|
|
35
|
+
readonly hostUntil: number;
|
|
36
|
+
}
|
|
37
|
+
export declare const INITIAL_STATE: GovernorState;
|
|
38
|
+
export type Action = {
|
|
39
|
+
readonly kind: 'priority';
|
|
40
|
+
readonly pid: number;
|
|
41
|
+
readonly name: string;
|
|
42
|
+
readonly to: Priority;
|
|
43
|
+
} | {
|
|
44
|
+
readonly kind: 'pause';
|
|
45
|
+
readonly pid: number;
|
|
46
|
+
readonly name: string;
|
|
47
|
+
readonly ms: number;
|
|
48
|
+
};
|
|
49
|
+
export interface Decision {
|
|
50
|
+
readonly state: GovernorState;
|
|
51
|
+
readonly actions: readonly Action[];
|
|
52
|
+
readonly level: Level;
|
|
53
|
+
readonly ramFreePercent: number;
|
|
54
|
+
readonly commitPercent: number;
|
|
55
|
+
}
|
|
56
|
+
export declare const PAUSE_MS = 5000;
|
|
57
|
+
/**
|
|
58
|
+
* One step. `gentle` (vGPU on): compilers start below normal even without pressure. Programs go back to their normal
|
|
59
|
+
* priority only when pressure ends (several calm samples in a row).
|
|
60
|
+
*/
|
|
61
|
+
export declare function decide(prev: GovernorState, sample: MemSample, nowMs: number, thresholds: GuestThresholds, profile: LoadProfile): Decision;
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/** Programs that compile or link: they may be slowed down and, as the last resort, paused for a few seconds. */
|
|
2
|
+
const COMPILERS = new Set([
|
|
3
|
+
'rustc',
|
|
4
|
+
'clippy-driver',
|
|
5
|
+
'rustdoc',
|
|
6
|
+
'cc1',
|
|
7
|
+
'cc1plus',
|
|
8
|
+
'cc1obj',
|
|
9
|
+
'collect2',
|
|
10
|
+
'gcc',
|
|
11
|
+
'g++',
|
|
12
|
+
'c++',
|
|
13
|
+
'cc',
|
|
14
|
+
'clang',
|
|
15
|
+
'clang++',
|
|
16
|
+
'clang-cl',
|
|
17
|
+
'cl',
|
|
18
|
+
'link',
|
|
19
|
+
'lld',
|
|
20
|
+
'lld-link',
|
|
21
|
+
'ld',
|
|
22
|
+
'ld.lld',
|
|
23
|
+
'as',
|
|
24
|
+
'tsc',
|
|
25
|
+
'javac',
|
|
26
|
+
]);
|
|
27
|
+
/** Build tools and workers: slowed down but never paused (a node process may be a dev server or an agent). */
|
|
28
|
+
const BUILD_TOOLS = new Set([
|
|
29
|
+
'node',
|
|
30
|
+
'dotnet',
|
|
31
|
+
'msbuild',
|
|
32
|
+
'vbcscompiler',
|
|
33
|
+
'ninja',
|
|
34
|
+
'make',
|
|
35
|
+
'mingw32-make',
|
|
36
|
+
'cmake',
|
|
37
|
+
'cargo',
|
|
38
|
+
'go',
|
|
39
|
+
'java',
|
|
40
|
+
'gradle',
|
|
41
|
+
'python',
|
|
42
|
+
]);
|
|
43
|
+
/** Never touched: the agents themselves, shells, terminals, this tool's own programs, Windows. */
|
|
44
|
+
const NEVER = new Set([
|
|
45
|
+
'claude',
|
|
46
|
+
'codex',
|
|
47
|
+
'gemini',
|
|
48
|
+
'opencode',
|
|
49
|
+
'aider',
|
|
50
|
+
'cursor-agent',
|
|
51
|
+
'cmd',
|
|
52
|
+
'powershell',
|
|
53
|
+
'pwsh',
|
|
54
|
+
'bash',
|
|
55
|
+
'sh',
|
|
56
|
+
'zsh',
|
|
57
|
+
'git',
|
|
58
|
+
'conhost',
|
|
59
|
+
'openconsole',
|
|
60
|
+
'windowsterminal',
|
|
61
|
+
'wt',
|
|
62
|
+
'ptyhost',
|
|
63
|
+
'memgov',
|
|
64
|
+
'sandboxtools',
|
|
65
|
+
'sbx-db',
|
|
66
|
+
'explorer',
|
|
67
|
+
'csrss',
|
|
68
|
+
'wininit',
|
|
69
|
+
'winlogon',
|
|
70
|
+
'services',
|
|
71
|
+
'svchost',
|
|
72
|
+
'lsass',
|
|
73
|
+
'system',
|
|
74
|
+
'smss',
|
|
75
|
+
'dwm',
|
|
76
|
+
]);
|
|
77
|
+
const key = (name) => name.toLowerCase().replace(/\.exe$/, '');
|
|
78
|
+
export const isNeverTouched = (name) => NEVER.has(key(name));
|
|
79
|
+
export const canLower = (name) => !isNeverTouched(name) && (COMPILERS.has(key(name)) || BUILD_TOOLS.has(key(name)));
|
|
80
|
+
export const canPause = (name) => !isNeverTouched(name) && COMPILERS.has(key(name));
|
|
81
|
+
export const INITIAL_STATE = {
|
|
82
|
+
pressure: false,
|
|
83
|
+
calm: 0,
|
|
84
|
+
samples: 0,
|
|
85
|
+
lowered: {},
|
|
86
|
+
pausedUntil: 0,
|
|
87
|
+
nextPauseAt: 0,
|
|
88
|
+
hostUntil: 0,
|
|
89
|
+
};
|
|
90
|
+
export const PAUSE_MS = 5000;
|
|
91
|
+
const PAUSE_COOLDOWN_MS = 10000;
|
|
92
|
+
/** Samples under pressure before programs go from below-normal to idle, and before one is paused. */
|
|
93
|
+
const IDLE_AFTER = 3;
|
|
94
|
+
const PAUSE_AFTER = 4;
|
|
95
|
+
/** Only a program this big is worth pausing. */
|
|
96
|
+
const PAUSE_MIN_MB = 300;
|
|
97
|
+
/**
|
|
98
|
+
* One step. `gentle` (vGPU on): compilers start below normal even without pressure. Programs go back to their normal
|
|
99
|
+
* priority only when pressure ends (several calm samples in a row).
|
|
100
|
+
*/
|
|
101
|
+
export function decide(prev, sample, nowMs, thresholds, profile) {
|
|
102
|
+
const ramFree = (sample.ramAvailMb / Math.max(1, sample.ramTotalMb)) * 100;
|
|
103
|
+
const commit = ((sample.commitLimitMb - sample.commitAvailMb) / Math.max(1, sample.commitLimitMb)) * 100;
|
|
104
|
+
const pcLow = nowMs < prev.hostUntil;
|
|
105
|
+
const low = ramFree < thresholds.enterAvailablePercent || commit > thresholds.enterCommitPercent || pcLow;
|
|
106
|
+
const recovered = ramFree > thresholds.exitAvailablePercent && commit < thresholds.exitCommitPercent && !pcLow;
|
|
107
|
+
let pressure = prev.pressure;
|
|
108
|
+
let calm = prev.calm;
|
|
109
|
+
let samples = prev.samples;
|
|
110
|
+
if (low) {
|
|
111
|
+
pressure = true;
|
|
112
|
+
calm = 0;
|
|
113
|
+
samples = prev.samples + 1;
|
|
114
|
+
}
|
|
115
|
+
else if (prev.pressure) {
|
|
116
|
+
calm = recovered ? prev.calm + 1 : 0;
|
|
117
|
+
if (calm >= thresholds.calmSamples) {
|
|
118
|
+
pressure = false;
|
|
119
|
+
calm = 0;
|
|
120
|
+
samples = 0;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
const actions = [];
|
|
124
|
+
const present = new Set(sample.procs.map((p) => p.pid));
|
|
125
|
+
const lowered = {};
|
|
126
|
+
for (const [pid, to] of Object.entries(prev.lowered))
|
|
127
|
+
if (present.has(Number(pid)))
|
|
128
|
+
lowered[Number(pid)] = to;
|
|
129
|
+
if (pressure) {
|
|
130
|
+
const target = samples > IDLE_AFTER ? 'idle' : 'below';
|
|
131
|
+
for (const p of sample.procs) {
|
|
132
|
+
if (!canLower(p.name) || lowered[p.pid] === target)
|
|
133
|
+
continue;
|
|
134
|
+
// Already as low as asked (or lower): only remember it.
|
|
135
|
+
if (p.prio !== target && !(target === 'below' && p.prio === 'idle'))
|
|
136
|
+
actions.push({ kind: 'priority', pid: p.pid, name: p.name, to: target });
|
|
137
|
+
lowered[p.pid] = target;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
for (const p of sample.procs) {
|
|
142
|
+
if (!canLower(p.name))
|
|
143
|
+
continue;
|
|
144
|
+
// Where a program rests when nothing is wrong: compilers below normal in the gentle profile.
|
|
145
|
+
const base = profile === 'gentle' && canPause(p.name) ? 'below' : 'normal';
|
|
146
|
+
const was = lowered[p.pid];
|
|
147
|
+
if (prev.pressure && was !== undefined && was !== base) {
|
|
148
|
+
if (p.prio !== base)
|
|
149
|
+
actions.push({ kind: 'priority', pid: p.pid, name: p.name, to: base });
|
|
150
|
+
if (base === 'normal')
|
|
151
|
+
delete lowered[p.pid];
|
|
152
|
+
else
|
|
153
|
+
lowered[p.pid] = base;
|
|
154
|
+
}
|
|
155
|
+
else if (!prev.pressure && base === 'below' && was === undefined) {
|
|
156
|
+
if (p.prio === 'normal')
|
|
157
|
+
actions.push({ kind: 'priority', pid: p.pid, name: p.name, to: 'below' });
|
|
158
|
+
lowered[p.pid] = 'below';
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
let pausedUntil = prev.pausedUntil;
|
|
163
|
+
let nextPauseAt = prev.nextPauseAt;
|
|
164
|
+
if (pressure && samples >= PAUSE_AFTER && nowMs >= prev.nextPauseAt && nowMs >= prev.pausedUntil) {
|
|
165
|
+
const victim = [...sample.procs]
|
|
166
|
+
.filter((p) => canPause(p.name) && p.mb >= PAUSE_MIN_MB)
|
|
167
|
+
.sort((a, b) => b.mb - a.mb)[0];
|
|
168
|
+
if (victim) {
|
|
169
|
+
actions.push({ kind: 'pause', pid: victim.pid, name: victim.name, ms: PAUSE_MS });
|
|
170
|
+
pausedUntil = nowMs + PAUSE_MS;
|
|
171
|
+
nextPauseAt = pausedUntil + PAUSE_COOLDOWN_MS;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
const level = nowMs < pausedUntil ? 'suspending' : pressure ? 'throttled' : 'ok';
|
|
175
|
+
return {
|
|
176
|
+
state: { pressure, calm, samples, lowered, pausedUntil, nextPauseAt, hostUntil: prev.hostUntil },
|
|
177
|
+
actions,
|
|
178
|
+
level,
|
|
179
|
+
ramFreePercent: Math.round(ramFree),
|
|
180
|
+
commitPercent: Math.round(commit),
|
|
181
|
+
};
|
|
182
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { PressureStatus } from '../../shared/channel/schema.js';
|
|
2
|
+
import { type LoadProfile } from '../../shared/memory/index.js';
|
|
3
|
+
import { type GovernorState, type MemSample } from './decide.js';
|
|
4
|
+
/** What the governor needs from Windows (injectable: the tests use a fake). */
|
|
5
|
+
export interface GovernorPort {
|
|
6
|
+
setPriority(pid: number, to: 'idle' | 'below' | 'normal'): void;
|
|
7
|
+
pause(pid: number, ms: number): void;
|
|
8
|
+
}
|
|
9
|
+
/** Everything a step changes outside the decision, behind injectable functions. */
|
|
10
|
+
export interface GovernorDeps {
|
|
11
|
+
readonly port: GovernorPort;
|
|
12
|
+
readonly profile: LoadProfile;
|
|
13
|
+
readonly now: () => number;
|
|
14
|
+
/** A line in the memory log. */
|
|
15
|
+
readonly logLine: (line: string) => void;
|
|
16
|
+
/** run\pressure.json. */
|
|
17
|
+
readonly saveStatus: (status: PressureStatus) => void;
|
|
18
|
+
}
|
|
19
|
+
/** The governor's logic over a port: feed it samples; the host's "slow down" requests go to hostPressure. */
|
|
20
|
+
export declare class GovernorCore {
|
|
21
|
+
private readonly deps;
|
|
22
|
+
private state;
|
|
23
|
+
private lastAction;
|
|
24
|
+
private lastWrite;
|
|
25
|
+
private lastWriteAt;
|
|
26
|
+
private pausedName;
|
|
27
|
+
private pausedPid;
|
|
28
|
+
constructor(deps: GovernorDeps);
|
|
29
|
+
hostPressure(seconds: number, reason: string): void;
|
|
30
|
+
get current(): GovernorState;
|
|
31
|
+
onSample(sample: MemSample): void;
|
|
32
|
+
private apply;
|
|
33
|
+
}
|
|
34
|
+
/** The daemon's governor: on unless sandbox.pressureResponse is off. */
|
|
35
|
+
export declare class Governor {
|
|
36
|
+
private core;
|
|
37
|
+
describe(): string;
|
|
38
|
+
start(): void;
|
|
39
|
+
/** The host's watchdog: this PC is low for a while. */
|
|
40
|
+
hostPressure(seconds: number, reason: string): void;
|
|
41
|
+
}
|
|
42
|
+
export declare const governor: Governor;
|