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,244 @@
|
|
|
1
|
+
// An OpenVPN profile (.ovpn) is untrusted data: it comes from the internet or from a file you were given, and OpenVPN
|
|
2
|
+
// can run programs from it (script-security, up, down, plugin ...) with administrator rights. Only directives on a
|
|
3
|
+
// short list of harmless ones are accepted; anything else is refused by name. Also answers where the tunnel connects
|
|
4
|
+
// (the `remote` lines), which the kill switch needs. Pure: no files, no network.
|
|
5
|
+
/** Directives that run a program, load code or touch a file on this machine. Refused with a clear reason. */
|
|
6
|
+
export const PROGRAM_DIRECTIVES = [
|
|
7
|
+
'script-security',
|
|
8
|
+
'up',
|
|
9
|
+
'down',
|
|
10
|
+
'up-restart',
|
|
11
|
+
'down-pre',
|
|
12
|
+
'route-up',
|
|
13
|
+
'route-pre-down',
|
|
14
|
+
'ipchange',
|
|
15
|
+
'tls-verify',
|
|
16
|
+
'plugin',
|
|
17
|
+
'client-connect',
|
|
18
|
+
'client-disconnect',
|
|
19
|
+
'learn-address',
|
|
20
|
+
'auth-user-pass-verify',
|
|
21
|
+
'setenv-safe',
|
|
22
|
+
'management',
|
|
23
|
+
'management-client',
|
|
24
|
+
'management-client-auth',
|
|
25
|
+
'management-hold',
|
|
26
|
+
'management-query-passwords',
|
|
27
|
+
'config',
|
|
28
|
+
'daemon',
|
|
29
|
+
'service',
|
|
30
|
+
'cd',
|
|
31
|
+
'chroot',
|
|
32
|
+
'setcon',
|
|
33
|
+
'log',
|
|
34
|
+
'log-append',
|
|
35
|
+
'writepid',
|
|
36
|
+
'status',
|
|
37
|
+
'askpass',
|
|
38
|
+
'engine',
|
|
39
|
+
'bcast-dev',
|
|
40
|
+
'dev-node',
|
|
41
|
+
'cryptoapicert',
|
|
42
|
+
'pkcs11-providers',
|
|
43
|
+
'pkcs12',
|
|
44
|
+
'http-proxy-user-pass',
|
|
45
|
+
'tmp-dir',
|
|
46
|
+
];
|
|
47
|
+
/** Directives that are only settings of the tunnel. Everything else is refused. */
|
|
48
|
+
const ALLOWED = new Set([
|
|
49
|
+
'client',
|
|
50
|
+
'tls-client',
|
|
51
|
+
'dev',
|
|
52
|
+
'dev-type',
|
|
53
|
+
'proto',
|
|
54
|
+
'remote',
|
|
55
|
+
'remote-random',
|
|
56
|
+
'remote-random-hostname',
|
|
57
|
+
'resolv-retry',
|
|
58
|
+
'nobind',
|
|
59
|
+
'persist-key',
|
|
60
|
+
'persist-tun',
|
|
61
|
+
'remote-cert-tls',
|
|
62
|
+
'remote-cert-eku',
|
|
63
|
+
'ns-cert-type',
|
|
64
|
+
'verify-x509-name',
|
|
65
|
+
'cipher',
|
|
66
|
+
'data-ciphers',
|
|
67
|
+
'data-ciphers-fallback',
|
|
68
|
+
'ncp-ciphers',
|
|
69
|
+
'auth',
|
|
70
|
+
'verb',
|
|
71
|
+
'mute',
|
|
72
|
+
'mute-replay-warnings',
|
|
73
|
+
'reneg-sec',
|
|
74
|
+
'reneg-bytes',
|
|
75
|
+
'reneg-pkts',
|
|
76
|
+
'tun-mtu',
|
|
77
|
+
'tun-mtu-extra',
|
|
78
|
+
'ping-timer-rem',
|
|
79
|
+
'fast-io',
|
|
80
|
+
'tls-timeout',
|
|
81
|
+
'push-peer-info',
|
|
82
|
+
'comp-noadapt',
|
|
83
|
+
'link-mtu',
|
|
84
|
+
'fragment',
|
|
85
|
+
'mssfix',
|
|
86
|
+
'sndbuf',
|
|
87
|
+
'rcvbuf',
|
|
88
|
+
'comp-lzo',
|
|
89
|
+
'compress',
|
|
90
|
+
'allow-compression',
|
|
91
|
+
'key-direction',
|
|
92
|
+
'auth-user-pass',
|
|
93
|
+
'auth-nocache',
|
|
94
|
+
'explicit-exit-notify',
|
|
95
|
+
'pull',
|
|
96
|
+
'pull-filter',
|
|
97
|
+
'route-nopull',
|
|
98
|
+
'route',
|
|
99
|
+
'route-ipv6',
|
|
100
|
+
'route-delay',
|
|
101
|
+
'route-metric',
|
|
102
|
+
'redirect-gateway',
|
|
103
|
+
'redirect-private',
|
|
104
|
+
'dhcp-option',
|
|
105
|
+
'block-outside-dns',
|
|
106
|
+
'register-dns',
|
|
107
|
+
'topology',
|
|
108
|
+
'tls-version-min',
|
|
109
|
+
'tls-version-max',
|
|
110
|
+
'tls-cipher',
|
|
111
|
+
'tls-ciphersuites',
|
|
112
|
+
'tls-groups',
|
|
113
|
+
'tls-exit',
|
|
114
|
+
'ping',
|
|
115
|
+
'ping-restart',
|
|
116
|
+
'ping-exit',
|
|
117
|
+
'keepalive',
|
|
118
|
+
'connect-retry',
|
|
119
|
+
'connect-retry-max',
|
|
120
|
+
'connect-timeout',
|
|
121
|
+
'server-poll-timeout',
|
|
122
|
+
'float',
|
|
123
|
+
'ifconfig-nowarn',
|
|
124
|
+
'tun-ipv6',
|
|
125
|
+
'disable-dco',
|
|
126
|
+
'windows-driver',
|
|
127
|
+
'ignore-unknown-option',
|
|
128
|
+
'opt-verify',
|
|
129
|
+
'setenv',
|
|
130
|
+
'key-method',
|
|
131
|
+
'replay-window',
|
|
132
|
+
'hand-window',
|
|
133
|
+
'tran-window',
|
|
134
|
+
'inactive',
|
|
135
|
+
'socket-flags',
|
|
136
|
+
'auth-retry',
|
|
137
|
+
'ca',
|
|
138
|
+
'cert',
|
|
139
|
+
'key',
|
|
140
|
+
'tls-auth',
|
|
141
|
+
'tls-crypt',
|
|
142
|
+
'tls-crypt-v2',
|
|
143
|
+
'extra-certs',
|
|
144
|
+
'dh',
|
|
145
|
+
]);
|
|
146
|
+
/** Directives that name a file: only allowed as inline sections (the certificates must be inside the profile). */
|
|
147
|
+
const FILE_DIRECTIVES = new Set(['ca', 'cert', 'key', 'tls-auth', 'tls-crypt', 'tls-crypt-v2', 'extra-certs', 'dh']);
|
|
148
|
+
/** The inline sections (<ca> ... </ca>); their text is data, never parsed as directives. */
|
|
149
|
+
const BLOCKS = new Set(['ca', 'cert', 'key', 'tls-auth', 'tls-crypt', 'tls-crypt-v2', 'extra-certs', 'dh']);
|
|
150
|
+
export const MAX_OVPN_BYTES = 256 * 1024;
|
|
151
|
+
const MAX_LINES = 4000;
|
|
152
|
+
const HOST = /^(?:\d{1,3}(?:\.\d{1,3}){3}|[A-Za-z0-9](?:[A-Za-z0-9.-]{0,251}[A-Za-z0-9])?)$/;
|
|
153
|
+
function directiveOf(line) {
|
|
154
|
+
const text = line.replace(/^\uFEFF/, '').trim();
|
|
155
|
+
if (text === '' || text.startsWith('#') || text.startsWith(';'))
|
|
156
|
+
return null;
|
|
157
|
+
// OpenVPN accepts "--client" too.
|
|
158
|
+
const parts = text.replace(/^-+/, '').split(/\s+/);
|
|
159
|
+
return { name: parts[0].toLowerCase(), args: parts.slice(1) };
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Checks a profile. `ok: false` lists the problems; `ok: true` gives the servers it connects to. A profile must name at
|
|
163
|
+
* least one remote, and every certificate must be inside it.
|
|
164
|
+
*/
|
|
165
|
+
export function inspectOvpn(text) {
|
|
166
|
+
const problems = [];
|
|
167
|
+
const found = [];
|
|
168
|
+
const refuse = (message) => {
|
|
169
|
+
if (problems.length < 20 && !problems.includes(message))
|
|
170
|
+
problems.push(message);
|
|
171
|
+
};
|
|
172
|
+
if (Buffer.byteLength(text, 'utf8') > MAX_OVPN_BYTES)
|
|
173
|
+
return { ok: false, problems: ['the file is too big'] };
|
|
174
|
+
if (text.includes('\0'))
|
|
175
|
+
return { ok: false, problems: ['the file is not text'] };
|
|
176
|
+
const lines = text.split(/\r?\n/);
|
|
177
|
+
if (lines.length > MAX_LINES)
|
|
178
|
+
return { ok: false, problems: ['the file has too many lines'] };
|
|
179
|
+
let block = null;
|
|
180
|
+
let defaultProto = 'udp';
|
|
181
|
+
lines.forEach((line, i) => {
|
|
182
|
+
const at = 'line ' + (i + 1) + ': ';
|
|
183
|
+
const trimmed = line.trim();
|
|
184
|
+
if (block) {
|
|
185
|
+
if (trimmed.toLowerCase() === '</' + block + '>')
|
|
186
|
+
block = null;
|
|
187
|
+
else if (/^<\/?[A-Za-z-]+>$/.test(trimmed))
|
|
188
|
+
refuse(at + 'a section inside a section');
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
const open = /^<([A-Za-z0-9-]+)>$/.exec(trimmed);
|
|
192
|
+
if (open) {
|
|
193
|
+
const tag = open[1].toLowerCase();
|
|
194
|
+
if (!BLOCKS.has(tag))
|
|
195
|
+
refuse(at + '<' + tag + '> is not allowed');
|
|
196
|
+
block = tag;
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
const d = directiveOf(line);
|
|
200
|
+
if (!d)
|
|
201
|
+
return;
|
|
202
|
+
if (!/^[a-z0-9-]{1,40}$/.test(d.name))
|
|
203
|
+
return refuse(at + 'a directive name with odd characters');
|
|
204
|
+
if (PROGRAM_DIRECTIVES.includes(d.name))
|
|
205
|
+
return refuse(at + d.name + ' runs a program or reads or writes a file on this machine');
|
|
206
|
+
if (!ALLOWED.has(d.name))
|
|
207
|
+
return refuse(at + d.name + ' is not on the list of settings that are safe to accept');
|
|
208
|
+
if (FILE_DIRECTIVES.has(d.name))
|
|
209
|
+
return refuse(at + d.name + ' names a file: certificates must be inside the profile');
|
|
210
|
+
if (d.name === 'auth-user-pass' && d.args.length > 0)
|
|
211
|
+
return refuse(at + 'auth-user-pass names a file: the login is given separately');
|
|
212
|
+
if (d.name === 'setenv' && !(d.args[0] === 'CLIENT_CERT' && d.args.length === 2))
|
|
213
|
+
return refuse(at + 'setenv may only be CLIENT_CERT');
|
|
214
|
+
if (d.name === 'proto')
|
|
215
|
+
defaultProto = d.args[0]?.startsWith('tcp') ? 'tcp' : 'udp';
|
|
216
|
+
if (d.name === 'remote') {
|
|
217
|
+
const [host, port = '1194', proto] = d.args;
|
|
218
|
+
if (!host || !HOST.test(host))
|
|
219
|
+
return refuse(at + 'remote needs a host name or an IPv4 address');
|
|
220
|
+
const n = Number(port);
|
|
221
|
+
if (!Number.isInteger(n) || n < 1 || n > 65535)
|
|
222
|
+
return refuse(at + 'remote has an invalid port');
|
|
223
|
+
found.push({ host, port: n, ...(proto ? { proto: proto.startsWith('tcp') ? 'tcp' : 'udp' } : {}) });
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
// A remote without its own protocol uses the profile's proto line, wherever that line is.
|
|
227
|
+
const remotes = found.map((r) => ({ host: r.host, port: r.port, proto: r.proto ?? defaultProto }));
|
|
228
|
+
if (block)
|
|
229
|
+
refuse('a <' + block + '> section is never closed');
|
|
230
|
+
if (remotes.length === 0)
|
|
231
|
+
refuse('it names no remote server');
|
|
232
|
+
if (remotes.length > 64)
|
|
233
|
+
refuse('it names too many servers');
|
|
234
|
+
return problems.length ? { ok: false, problems } : { ok: true, remotes };
|
|
235
|
+
}
|
|
236
|
+
/** The servers of a safe profile; throws, saying why, when it is not (`what` names the file or source). */
|
|
237
|
+
export function assertSafeOvpn(text, what) {
|
|
238
|
+
const report = inspectOvpn(text);
|
|
239
|
+
if (report.ok)
|
|
240
|
+
return report.remotes;
|
|
241
|
+
throw new Error(what +
|
|
242
|
+
' was refused because it could run programs or is not a plain profile:\n - ' +
|
|
243
|
+
report.problems.slice(0, 5).join('\n - '));
|
|
244
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
export declare const MAX_WIREGUARD_BYTES: number;
|
|
2
|
+
/** Keys that run a program, change the routes or write the config back. Refused with a clear reason. */
|
|
3
|
+
export declare const WIREGUARD_PROGRAM_KEYS: readonly ["preup", "postup", "predown", "postdown", "table", "saveconfig"];
|
|
4
|
+
export interface WireguardPeer {
|
|
5
|
+
readonly publicKey: string;
|
|
6
|
+
readonly presharedKey?: string;
|
|
7
|
+
readonly allowedIps: readonly string[];
|
|
8
|
+
readonly endpointHost: string;
|
|
9
|
+
readonly endpointPort: number;
|
|
10
|
+
readonly keepalive?: number;
|
|
11
|
+
}
|
|
12
|
+
/** A checked config. Holds secrets (privateKey, presharedKey): never log it or write it to session.json. */
|
|
13
|
+
export interface WireguardConfig {
|
|
14
|
+
readonly privateKey: string;
|
|
15
|
+
readonly addresses: readonly string[];
|
|
16
|
+
readonly dns: readonly string[];
|
|
17
|
+
readonly mtu?: number;
|
|
18
|
+
readonly listenPort?: number;
|
|
19
|
+
readonly peers: readonly WireguardPeer[];
|
|
20
|
+
}
|
|
21
|
+
export type WireguardReport = {
|
|
22
|
+
readonly ok: true;
|
|
23
|
+
readonly config: WireguardConfig;
|
|
24
|
+
} | {
|
|
25
|
+
readonly ok: false;
|
|
26
|
+
readonly problems: readonly string[];
|
|
27
|
+
};
|
|
28
|
+
/** Where the tunnel connects (the kill switch allows these, over udp). */
|
|
29
|
+
export interface WireguardEndpoint {
|
|
30
|
+
readonly host: string;
|
|
31
|
+
readonly port: number;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Checks a config. `ok: false` lists the problems (no values in them); `ok: true` gives the checked settings. It needs
|
|
35
|
+
* one [Interface] with a PrivateKey and an IPv4 Address, and at least one [Peer] with PublicKey, AllowedIPs and an
|
|
36
|
+
* Endpoint that is a name or an IPv4 address (the kill switch rules are IPv4).
|
|
37
|
+
*/
|
|
38
|
+
export declare function inspectWireguard(text: string): WireguardReport;
|
|
39
|
+
/** The checked config; throws, saying why (never with a key), when it is not safe. `what` names the file. */
|
|
40
|
+
export declare function assertSafeWireguard(text: string, what: string): WireguardConfig;
|
|
41
|
+
/** The config as text, written from the checked values. `endpointIps` puts an address in a peer's place. */
|
|
42
|
+
export declare function renderWireguard(config: WireguardConfig, endpointIps?: Readonly<Record<number, string>>): string;
|
|
43
|
+
export declare function wireguardEndpoints(config: WireguardConfig): WireguardEndpoint[];
|
|
44
|
+
/** The tunnel's own IPv4 address (what the kill switch lets through once the tunnel is up). */
|
|
45
|
+
export declare function wireguardTunnelAddress(config: WireguardConfig): string;
|
|
46
|
+
/** True when some peer sends all IPv4 traffic through the tunnel (AllowedIPs 0.0.0.0/0). */
|
|
47
|
+
export declare function routesEverything(config: WireguardConfig): boolean;
|
|
48
|
+
/** Whether `sc query` output says the tunnel service is running. */
|
|
49
|
+
export declare function serviceRunning(scOutput: string): boolean;
|
|
50
|
+
/** Whether `wg show <tunnel> latest-handshakes` says a peer has completed a handshake (a time that is not 0). */
|
|
51
|
+
export declare function handshakeDone(wgOutput: string): boolean;
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
// A WireGuard config (.conf) is untrusted data: it comes from a file you were given, and WireGuard for Windows runs the
|
|
2
|
+
// programs of PreUp/PostUp/PreDown/PostDown with administrator rights. Only the settings on a short list are accepted;
|
|
3
|
+
// anything else is refused by name, and the config that is handed on is written again from the checked values, never
|
|
4
|
+
// copied. Problem messages name keys and lines, never values (the private and preshared keys are secrets). Also answers
|
|
5
|
+
// where the tunnel connects and which address it has, which the kill switch needs. Pure: no files, no network.
|
|
6
|
+
import net from 'node:net';
|
|
7
|
+
export const MAX_WIREGUARD_BYTES = 16 * 1024;
|
|
8
|
+
const MAX_LINES = 300;
|
|
9
|
+
const MAX_PEERS = 16;
|
|
10
|
+
/** Keys that run a program, change the routes or write the config back. Refused with a clear reason. */
|
|
11
|
+
export const WIREGUARD_PROGRAM_KEYS = ['preup', 'postup', 'predown', 'postdown', 'table', 'saveconfig'];
|
|
12
|
+
const INTERFACE_KEYS = new Set(['privatekey', 'address', 'dns', 'mtu', 'listenport']);
|
|
13
|
+
const PEER_KEYS = new Set(['publickey', 'presharedkey', 'allowedips', 'endpoint', 'persistentkeepalive']);
|
|
14
|
+
/** Keys that may be given more than once (their values are joined). */
|
|
15
|
+
const LIST_KEYS = new Set(['address', 'dns', 'allowedips']);
|
|
16
|
+
const KEY = /^[A-Za-z0-9+/]{43}=$/;
|
|
17
|
+
const HOST = /^(?:\d{1,3}(?:\.\d{1,3}){3}|[A-Za-z0-9](?:[A-Za-z0-9.-]{0,251}[A-Za-z0-9])?)$/;
|
|
18
|
+
function validCidr(text) {
|
|
19
|
+
const [addr, prefix, ...rest] = text.split('/');
|
|
20
|
+
if (rest.length > 0 || !addr)
|
|
21
|
+
return false;
|
|
22
|
+
const version = net.isIP(addr);
|
|
23
|
+
if (version === 0)
|
|
24
|
+
return false;
|
|
25
|
+
if (prefix === undefined)
|
|
26
|
+
return true;
|
|
27
|
+
if (!/^\d{1,3}$/.test(prefix))
|
|
28
|
+
return false;
|
|
29
|
+
return Number(prefix) <= (version === 4 ? 32 : 128);
|
|
30
|
+
}
|
|
31
|
+
const inRange = (text, low, high) => {
|
|
32
|
+
if (!/^\d{1,5}$/.test(text))
|
|
33
|
+
return null;
|
|
34
|
+
const n = Number(text);
|
|
35
|
+
return n >= low && n <= high ? n : null;
|
|
36
|
+
};
|
|
37
|
+
const splitList = (text) => text
|
|
38
|
+
.split(',')
|
|
39
|
+
.map((s) => s.trim())
|
|
40
|
+
.filter(Boolean);
|
|
41
|
+
/**
|
|
42
|
+
* Checks a config. `ok: false` lists the problems (no values in them); `ok: true` gives the checked settings. It needs
|
|
43
|
+
* one [Interface] with a PrivateKey and an IPv4 Address, and at least one [Peer] with PublicKey, AllowedIPs and an
|
|
44
|
+
* Endpoint that is a name or an IPv4 address (the kill switch rules are IPv4).
|
|
45
|
+
*/
|
|
46
|
+
export function inspectWireguard(text) {
|
|
47
|
+
const problems = [];
|
|
48
|
+
const refuse = (message) => {
|
|
49
|
+
if (problems.length < 20 && !problems.includes(message))
|
|
50
|
+
problems.push(message);
|
|
51
|
+
};
|
|
52
|
+
if (Buffer.byteLength(text, 'utf8') > MAX_WIREGUARD_BYTES)
|
|
53
|
+
return { ok: false, problems: ['the file is too big'] };
|
|
54
|
+
if (text.includes('\0'))
|
|
55
|
+
return { ok: false, problems: ['the file is not text'] };
|
|
56
|
+
const lines = (text.charCodeAt(0) === 0xfeff ? text.slice(1) : text).split(/\r?\n/);
|
|
57
|
+
if (lines.length > MAX_LINES)
|
|
58
|
+
return { ok: false, problems: ['the file has too many lines'] };
|
|
59
|
+
const sections = [];
|
|
60
|
+
let current = null;
|
|
61
|
+
lines.forEach((raw, i) => {
|
|
62
|
+
const at = 'line ' + (i + 1) + ': ';
|
|
63
|
+
const line = raw.replace(/#.*$/, '').trim();
|
|
64
|
+
if (!line)
|
|
65
|
+
return;
|
|
66
|
+
const header = /^\[([A-Za-z]{1,20})\]$/.exec(line);
|
|
67
|
+
if (header) {
|
|
68
|
+
const name = header[1].toLowerCase();
|
|
69
|
+
if (name !== 'interface' && name !== 'peer') {
|
|
70
|
+
current = null;
|
|
71
|
+
return refuse(at + '[' + name + '] is not allowed');
|
|
72
|
+
}
|
|
73
|
+
current = { kind: name, values: new Map() };
|
|
74
|
+
sections.push(current);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const pair = /^([A-Za-z]{1,40})\s*=\s*(.*)$/.exec(line);
|
|
78
|
+
if (!pair)
|
|
79
|
+
return refuse(at + 'not a "Key = value" line');
|
|
80
|
+
const key = pair[1].toLowerCase();
|
|
81
|
+
if (WIREGUARD_PROGRAM_KEYS.includes(key))
|
|
82
|
+
return refuse(at + pair[1] + ' runs a program or changes how the tunnel is routed or saved');
|
|
83
|
+
if (!current)
|
|
84
|
+
return refuse(at + pair[1] + ' is outside a section');
|
|
85
|
+
if (!(current.kind === 'interface' ? INTERFACE_KEYS : PEER_KEYS).has(key))
|
|
86
|
+
return refuse(at + pair[1] + ' is not on the list of settings that are safe to accept');
|
|
87
|
+
const seen = current.values.get(key);
|
|
88
|
+
if (seen && !LIST_KEYS.has(key))
|
|
89
|
+
return refuse(at + pair[1] + ' is given twice');
|
|
90
|
+
current.values.set(key, [...(seen ?? []), pair[2].trim()]);
|
|
91
|
+
});
|
|
92
|
+
const one = (s, key) => s.values.get(key)?.[0];
|
|
93
|
+
const joined = (s, key) => (s.values.get(key) ?? []).flatMap(splitList);
|
|
94
|
+
const interfaces = sections.filter((s) => s.kind === 'interface');
|
|
95
|
+
const peers = sections.filter((s) => s.kind === 'peer');
|
|
96
|
+
if (interfaces.length !== 1)
|
|
97
|
+
refuse('it needs exactly one [Interface] section');
|
|
98
|
+
if (peers.length === 0)
|
|
99
|
+
refuse('it has no [Peer] section');
|
|
100
|
+
if (peers.length > MAX_PEERS)
|
|
101
|
+
refuse('it has too many [Peer] sections');
|
|
102
|
+
if (problems.length)
|
|
103
|
+
return { ok: false, problems };
|
|
104
|
+
const face = interfaces[0];
|
|
105
|
+
const privateKey = one(face, 'privatekey');
|
|
106
|
+
if (!privateKey)
|
|
107
|
+
refuse('[Interface] has no PrivateKey');
|
|
108
|
+
else if (!KEY.test(privateKey))
|
|
109
|
+
refuse('PrivateKey is not a WireGuard key (44 characters of base64)');
|
|
110
|
+
const addresses = joined(face, 'address');
|
|
111
|
+
if (addresses.length === 0 || !addresses.every(validCidr))
|
|
112
|
+
refuse('[Interface] needs valid Address values');
|
|
113
|
+
else if (!addresses.some((a) => net.isIPv4(a.split('/')[0])))
|
|
114
|
+
refuse('Address needs an IPv4 address (the kill switch works on IPv4)');
|
|
115
|
+
const dns = joined(face, 'dns');
|
|
116
|
+
if (!dns.every((d) => net.isIP(d) !== 0))
|
|
117
|
+
refuse('DNS may only list IP addresses');
|
|
118
|
+
const mtuText = one(face, 'mtu');
|
|
119
|
+
const mtu = mtuText === undefined ? undefined : inRange(mtuText, 576, 1500);
|
|
120
|
+
if (mtuText !== undefined && mtu === null)
|
|
121
|
+
refuse('MTU must be a number from 576 to 1500');
|
|
122
|
+
const portText = one(face, 'listenport');
|
|
123
|
+
const listenPort = portText === undefined ? undefined : inRange(portText, 1, 65535);
|
|
124
|
+
if (portText !== undefined && listenPort === null)
|
|
125
|
+
refuse('ListenPort must be a number from 1 to 65535');
|
|
126
|
+
const checked = [];
|
|
127
|
+
peers.forEach((p, n) => {
|
|
128
|
+
const who = '[Peer] ' + (n + 1) + ': ';
|
|
129
|
+
const publicKey = one(p, 'publickey');
|
|
130
|
+
if (!publicKey || !KEY.test(publicKey))
|
|
131
|
+
return refuse(who + 'PublicKey is missing or not a WireGuard key');
|
|
132
|
+
const preshared = one(p, 'presharedkey');
|
|
133
|
+
if (preshared !== undefined && !KEY.test(preshared))
|
|
134
|
+
return refuse(who + 'PresharedKey is not a WireGuard key');
|
|
135
|
+
const allowed = joined(p, 'allowedips');
|
|
136
|
+
if (allowed.length === 0 || !allowed.every(validCidr))
|
|
137
|
+
return refuse(who + 'AllowedIPs is missing or invalid');
|
|
138
|
+
const endpoint = one(p, 'endpoint');
|
|
139
|
+
const m = endpoint ? /^([^:[\]]+):(\d{1,5})$/.exec(endpoint) : null;
|
|
140
|
+
if (!m || !HOST.test(m[1]) || inRange(m[2], 1, 65535) === null)
|
|
141
|
+
return refuse(who + 'Endpoint must be host:port with a name or an IPv4 address');
|
|
142
|
+
if (/^\d+\.\d+\.\d+\.\d+$/.test(m[1]) && !net.isIPv4(m[1]))
|
|
143
|
+
return refuse(who + 'Endpoint is not a valid address');
|
|
144
|
+
const keepText = one(p, 'persistentkeepalive');
|
|
145
|
+
let keepalive;
|
|
146
|
+
if (keepText !== undefined && keepText.toLowerCase() !== 'off') {
|
|
147
|
+
const k = inRange(keepText, 0, 65535);
|
|
148
|
+
if (k === null)
|
|
149
|
+
return refuse(who + 'PersistentKeepalive must be a number or off');
|
|
150
|
+
keepalive = k;
|
|
151
|
+
}
|
|
152
|
+
checked.push({
|
|
153
|
+
publicKey,
|
|
154
|
+
...(preshared ? { presharedKey: preshared } : {}),
|
|
155
|
+
allowedIps: allowed,
|
|
156
|
+
endpointHost: m[1],
|
|
157
|
+
endpointPort: Number(m[2]),
|
|
158
|
+
...(keepalive !== undefined ? { keepalive } : {}),
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
if (problems.length || !privateKey)
|
|
162
|
+
return { ok: false, problems };
|
|
163
|
+
return {
|
|
164
|
+
ok: true,
|
|
165
|
+
config: {
|
|
166
|
+
privateKey,
|
|
167
|
+
addresses,
|
|
168
|
+
dns,
|
|
169
|
+
...(typeof mtu === 'number' ? { mtu } : {}),
|
|
170
|
+
...(typeof listenPort === 'number' ? { listenPort } : {}),
|
|
171
|
+
peers: checked,
|
|
172
|
+
},
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
/** The checked config; throws, saying why (never with a key), when it is not safe. `what` names the file. */
|
|
176
|
+
export function assertSafeWireguard(text, what) {
|
|
177
|
+
const report = inspectWireguard(text);
|
|
178
|
+
if (report.ok)
|
|
179
|
+
return report.config;
|
|
180
|
+
throw new Error(what +
|
|
181
|
+
' was refused because it could run programs or is not a plain WireGuard config:\n - ' +
|
|
182
|
+
report.problems.slice(0, 5).join('\n - '));
|
|
183
|
+
}
|
|
184
|
+
/** The config as text, written from the checked values. `endpointIps` puts an address in a peer's place. */
|
|
185
|
+
export function renderWireguard(config, endpointIps = {}) {
|
|
186
|
+
const out = ['[Interface]', 'PrivateKey = ' + config.privateKey, 'Address = ' + config.addresses.join(', ')];
|
|
187
|
+
if (config.dns.length)
|
|
188
|
+
out.push('DNS = ' + config.dns.join(', '));
|
|
189
|
+
if (config.mtu !== undefined)
|
|
190
|
+
out.push('MTU = ' + config.mtu);
|
|
191
|
+
if (config.listenPort !== undefined)
|
|
192
|
+
out.push('ListenPort = ' + config.listenPort);
|
|
193
|
+
config.peers.forEach((p, i) => {
|
|
194
|
+
out.push('', '[Peer]', 'PublicKey = ' + p.publicKey);
|
|
195
|
+
if (p.presharedKey)
|
|
196
|
+
out.push('PresharedKey = ' + p.presharedKey);
|
|
197
|
+
out.push('AllowedIPs = ' + p.allowedIps.join(', '), 'Endpoint = ' + (endpointIps[i] ?? p.endpointHost) + ':' + p.endpointPort);
|
|
198
|
+
if (p.keepalive !== undefined)
|
|
199
|
+
out.push('PersistentKeepalive = ' + p.keepalive);
|
|
200
|
+
});
|
|
201
|
+
return out.join('\r\n') + '\r\n';
|
|
202
|
+
}
|
|
203
|
+
export function wireguardEndpoints(config) {
|
|
204
|
+
return config.peers.map((p) => ({ host: p.endpointHost, port: p.endpointPort }));
|
|
205
|
+
}
|
|
206
|
+
/** The tunnel's own IPv4 address (what the kill switch lets through once the tunnel is up). */
|
|
207
|
+
export function wireguardTunnelAddress(config) {
|
|
208
|
+
const found = config.addresses.map((a) => a.split('/')[0]).find((a) => net.isIPv4(a));
|
|
209
|
+
if (!found)
|
|
210
|
+
throw new Error('the config has no IPv4 address');
|
|
211
|
+
return found;
|
|
212
|
+
}
|
|
213
|
+
/** True when some peer sends all IPv4 traffic through the tunnel (AllowedIPs 0.0.0.0/0). */
|
|
214
|
+
export function routesEverything(config) {
|
|
215
|
+
return config.peers.some((p) => p.allowedIps.some((a) => a === '0.0.0.0/0'));
|
|
216
|
+
}
|
|
217
|
+
/** Whether `sc query` output says the tunnel service is running. */
|
|
218
|
+
export function serviceRunning(scOutput) {
|
|
219
|
+
return /STATE\s*:\s*\d+\s+RUNNING/i.test(scOutput);
|
|
220
|
+
}
|
|
221
|
+
/** Whether `wg show <tunnel> latest-handshakes` says a peer has completed a handshake (a time that is not 0). */
|
|
222
|
+
export function handshakeDone(wgOutput) {
|
|
223
|
+
return wgOutput.split(/\r?\n/).some((line) => {
|
|
224
|
+
const t = /\s(\d+)\s*$/.exec(line);
|
|
225
|
+
return t !== null && Number(t[1]) > 0;
|
|
226
|
+
});
|
|
227
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './protocol.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './protocol.js';
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/** The header every state-changing call carries (a browser page of another site cannot add it without CORS). */
|
|
2
|
+
export declare const CSRF_HEADER = "x-sandbox-web";
|
|
3
|
+
export declare const CSRF_VALUE = "1";
|
|
4
|
+
export declare const COOKIE_NAME = "sbxweb";
|
|
5
|
+
export interface WebSession {
|
|
6
|
+
readonly id: string;
|
|
7
|
+
readonly harness: string;
|
|
8
|
+
readonly project: string;
|
|
9
|
+
readonly cwd: string;
|
|
10
|
+
readonly phase: 'starting' | 'running' | 'exited' | 'failed';
|
|
11
|
+
readonly message: string;
|
|
12
|
+
readonly startedAt: string;
|
|
13
|
+
/** Terminals attached right now (null: the session could not be asked). */
|
|
14
|
+
readonly viewers: number | null;
|
|
15
|
+
/** The session can be opened here (running, and reachable from this PC). */
|
|
16
|
+
readonly canOpen: boolean;
|
|
17
|
+
}
|
|
18
|
+
export interface WebProject {
|
|
19
|
+
readonly name: string;
|
|
20
|
+
readonly guest: string;
|
|
21
|
+
}
|
|
22
|
+
export interface WebInfo {
|
|
23
|
+
readonly sandbox: 'running' | 'stopped';
|
|
24
|
+
/** "Running, started by alice (shared with you)" and the like; null for your own sandbox. */
|
|
25
|
+
readonly owner: string | null;
|
|
26
|
+
/** This user may open sessions and start new ones in the running sandbox. */
|
|
27
|
+
readonly canUse: boolean;
|
|
28
|
+
readonly harnesses: readonly string[];
|
|
29
|
+
readonly defaultHarness: string;
|
|
30
|
+
readonly projects: readonly WebProject[];
|
|
31
|
+
}
|
|
32
|
+
export interface NewSessionRequest {
|
|
33
|
+
readonly harness: string;
|
|
34
|
+
readonly project: string;
|
|
35
|
+
}
|
|
36
|
+
/** Browser -> server on the terminal socket: binary messages are keystrokes; text messages are these (JSON). */
|
|
37
|
+
export type ClientMessage = {
|
|
38
|
+
readonly t: 'resize';
|
|
39
|
+
readonly cols: number;
|
|
40
|
+
readonly rows: number;
|
|
41
|
+
};
|
|
42
|
+
/** Server -> browser: binary messages are terminal output; text messages are these (JSON). */
|
|
43
|
+
export type ServerMessage = {
|
|
44
|
+
readonly t: 'ready';
|
|
45
|
+
} | {
|
|
46
|
+
readonly t: 'restarting';
|
|
47
|
+
} | {
|
|
48
|
+
readonly t: 'exit';
|
|
49
|
+
readonly code: number;
|
|
50
|
+
} | {
|
|
51
|
+
readonly t: 'error';
|
|
52
|
+
readonly message: string;
|
|
53
|
+
};
|
|
54
|
+
export declare const MIN_COLS = 10;
|
|
55
|
+
export declare const MAX_COLS = 500;
|
|
56
|
+
export declare const MIN_ROWS = 2;
|
|
57
|
+
export declare const MAX_ROWS = 300;
|
|
58
|
+
/** Biggest browser message the server accepts (a paste); more closes the socket. */
|
|
59
|
+
export declare const MAX_CLIENT_MESSAGE_BYTES: number;
|
|
60
|
+
/** A browser message that is JSON of a known shape and sane numbers, else null (the socket is then closed). */
|
|
61
|
+
export declare function parseClientMessage(text: string): ClientMessage | null;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// What the web UI's server and its browser app say to each other. Types and constants only (no Node, no DOM), so the
|
|
2
|
+
// server (src/host/web) and the app (web/) share one definition.
|
|
3
|
+
/** The header every state-changing call carries (a browser page of another site cannot add it without CORS). */
|
|
4
|
+
export const CSRF_HEADER = 'x-sandbox-web';
|
|
5
|
+
export const CSRF_VALUE = '1';
|
|
6
|
+
export const COOKIE_NAME = 'sbxweb';
|
|
7
|
+
export const MIN_COLS = 10;
|
|
8
|
+
export const MAX_COLS = 500;
|
|
9
|
+
export const MIN_ROWS = 2;
|
|
10
|
+
export const MAX_ROWS = 300;
|
|
11
|
+
/** Biggest browser message the server accepts (a paste); more closes the socket. */
|
|
12
|
+
export const MAX_CLIENT_MESSAGE_BYTES = 256 * 1024;
|
|
13
|
+
/** A browser message that is JSON of a known shape and sane numbers, else null (the socket is then closed). */
|
|
14
|
+
export function parseClientMessage(text) {
|
|
15
|
+
let value;
|
|
16
|
+
try {
|
|
17
|
+
value = JSON.parse(text);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
if (typeof value !== 'object' || value === null)
|
|
23
|
+
return null;
|
|
24
|
+
const m = value;
|
|
25
|
+
if (m.t !== 'resize')
|
|
26
|
+
return null;
|
|
27
|
+
const { cols, rows } = m;
|
|
28
|
+
if (!Number.isInteger(cols) || !Number.isInteger(rows))
|
|
29
|
+
return null;
|
|
30
|
+
const c = cols;
|
|
31
|
+
const r = rows;
|
|
32
|
+
if (c < MIN_COLS || c > MAX_COLS || r < MIN_ROWS || r > MAX_ROWS)
|
|
33
|
+
return null;
|
|
34
|
+
return { t: 'resize', cols: c, rows: r };
|
|
35
|
+
}
|
package/dist/sync/sync-cycle.js
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
2
|
import { assertNoLinks } from '../core/util/index.js';
|
|
3
|
-
import { hostClaudeDir } from '../host/profile/index.js';
|
|
3
|
+
import { hostClaudeDir, PluginShare } from '../host/profile/index.js';
|
|
4
|
+
import { hostDataFolder, hostDataRoot, storageOf } from '../host/storage/index.js';
|
|
4
5
|
import { hostClaudeMemDir, syncClaudeMem } from './claude-mem.js';
|
|
5
6
|
import { readSyncState, writeSyncState } from './sync-state.js';
|
|
6
7
|
import { syncHistoryIn, syncHistoryOut } from './history.js';
|
|
7
|
-
const guestClaude = (dataPath) => path.join(dataPath, 'state', 'claude');
|
|
8
|
-
const guestMem = (dataPath) => path.join(dataPath, 'state', 'claude-mem');
|
|
8
|
+
const guestClaude = (dataPath) => path.join(hostDataFolder(dataPath, 'state'), 'claude');
|
|
9
|
+
const guestMem = (dataPath) => path.join(hostDataFolder(dataPath, 'state'), 'claude-mem');
|
|
9
10
|
/** Sync paths for the sandbox side, after checking nothing on the way there is a link planted by the sandbox. */
|
|
10
11
|
const toPaths = (state, dataPath) => {
|
|
11
|
-
assertNoLinks(dataPath, guestClaude(dataPath));
|
|
12
|
+
assertNoLinks(hostDataRoot(dataPath), guestClaude(dataPath));
|
|
12
13
|
return {
|
|
13
14
|
hostClaudeDir: state.hostClaudeDir,
|
|
14
15
|
guestClaudeDir: guestClaude(dataPath),
|
|
@@ -37,7 +38,7 @@ export function syncProjectIn(dataPath, project) {
|
|
|
37
38
|
: 0;
|
|
38
39
|
}
|
|
39
40
|
const memSync = (dataPath, state, direction) => {
|
|
40
|
-
assertNoLinks(dataPath, guestMem(dataPath));
|
|
41
|
+
assertNoLinks(hostDataRoot(dataPath), guestMem(dataPath));
|
|
41
42
|
return syncClaudeMem(hostClaudeMemDir(), guestMem(dataPath), state, direction);
|
|
42
43
|
};
|
|
43
44
|
/** Before launch: finish syncing the previous run out, then bring this PC's history (and claude-mem) in. */
|
|
@@ -58,6 +59,7 @@ export function syncBeforeLaunch(config, dataPath, hostWorkspace) {
|
|
|
58
59
|
historyScope: profile.historyScope,
|
|
59
60
|
syncClaudeMem: profile.syncClaudeMem,
|
|
60
61
|
syncClaudeMemBack: profile.syncClaudeMemBack,
|
|
62
|
+
sharePlugins: profile.sharePluginsAcrossAccounts,
|
|
61
63
|
projects: [],
|
|
62
64
|
};
|
|
63
65
|
if (profile.syncHistory)
|
|
@@ -78,6 +80,8 @@ export function syncBack(dataPath, final) {
|
|
|
78
80
|
return summary;
|
|
79
81
|
if (state.syncHistory)
|
|
80
82
|
summary.history = syncHistoryOut(toPaths(state, dataPath));
|
|
83
|
+
if (final && state.sharePlugins)
|
|
84
|
+
PluginShare.in(storageOf(dataPath)).saveQuietly(dataPath, guestClaude(dataPath));
|
|
81
85
|
if (final && state.syncClaudeMem && state.syncClaudeMemBack)
|
|
82
86
|
summary.claudeMem = memSync(dataPath, state, 'out');
|
|
83
87
|
writeSyncState(dataPath, state);
|