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,176 @@
|
|
|
1
|
+
// The agent sessions of the running sandbox: the list (live) and restarting the agents. Pure: schemas, labels and the
|
|
2
|
+
// view; sessions.run.ts does the work. A running session links to its terminal (attach in the menu, the terminal page
|
|
3
|
+
// in the web UI).
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { action, ago, defineOperation, defineQuery, defineView, link, } from '../../kernel/index.js';
|
|
6
|
+
const ViewersSchema = z.object({ viewers: z.number(), remote: z.number() });
|
|
7
|
+
/** A session as every surface may see it: never its attach address or token. */
|
|
8
|
+
export const SessionRowSchema = z.object({
|
|
9
|
+
id: z.string().describe('The session'),
|
|
10
|
+
launchId: z.string(),
|
|
11
|
+
harness: z.string().describe('The agent'),
|
|
12
|
+
cwd: z.string().describe('Its folder in the sandbox'),
|
|
13
|
+
project: z.string().optional(),
|
|
14
|
+
phase: z.enum(['starting', 'running', 'exited', 'failed']).describe('What it is doing'),
|
|
15
|
+
message: z.string(),
|
|
16
|
+
updatedAt: z.string(),
|
|
17
|
+
startedAt: z.string().describe('When it started'),
|
|
18
|
+
conversation: z.string().optional(),
|
|
19
|
+
exitCode: z.number().optional(),
|
|
20
|
+
projectName: z.string().optional().describe('The project it runs in'),
|
|
21
|
+
here: z.boolean().optional().describe('In the project of the current folder'),
|
|
22
|
+
/** Terminals attached (from this PC and in the sandbox); null: an older session that cannot say. */
|
|
23
|
+
viewers: ViewersSchema.nullable().optional(),
|
|
24
|
+
/** It runs and its terminal can be reached from this PC. */
|
|
25
|
+
canOpen: z.boolean(),
|
|
26
|
+
});
|
|
27
|
+
export const SessionsListSchema = z.object({
|
|
28
|
+
sandboxRunning: z.boolean(),
|
|
29
|
+
/** The agent offered when nothing runs. */
|
|
30
|
+
defaultAgent: z.string(),
|
|
31
|
+
/** The folder column is wanted (sandbox sessions --wide). */
|
|
32
|
+
wide: z.boolean(),
|
|
33
|
+
/** "Running, started by alice (shared with you)" when the sandbox is another user's. */
|
|
34
|
+
owner: z.string().optional(),
|
|
35
|
+
sessions: z.array(SessionRowSchema),
|
|
36
|
+
});
|
|
37
|
+
/** "1 here, 0 in sandbox" for a session's viewers. */
|
|
38
|
+
export function viewerText(v) {
|
|
39
|
+
return v === undefined
|
|
40
|
+
? '-'
|
|
41
|
+
: v === null
|
|
42
|
+
? 'unknown (older session)'
|
|
43
|
+
: v.remote + ' here, ' + (v.viewers - v.remote) + ' in sandbox';
|
|
44
|
+
}
|
|
45
|
+
/** This folder's project first, newest first within each group. */
|
|
46
|
+
export function orderedSessions(list) {
|
|
47
|
+
const newest = (a, b) => (a.startedAt < b.startedAt ? 1 : -1);
|
|
48
|
+
return [...list.filter((s) => s.here).sort(newest), ...list.filter((s) => !s.here).sort(newest)];
|
|
49
|
+
}
|
|
50
|
+
export const listSessions = defineQuery({
|
|
51
|
+
id: 'sessions.list',
|
|
52
|
+
title: 'Sessions',
|
|
53
|
+
summary: 'list agent sessions and who is attached',
|
|
54
|
+
input: z.object({ wide: z.boolean().default(false).describe("also show each session's folder") }),
|
|
55
|
+
output: SessionsListSchema,
|
|
56
|
+
live: { everyMs: 2500 },
|
|
57
|
+
cli: {
|
|
58
|
+
name: 'sessions',
|
|
59
|
+
group: 'Sessions',
|
|
60
|
+
json: true,
|
|
61
|
+
flags: { wide: { flag: '--wide', noMenu: true } },
|
|
62
|
+
// The --json shape `sandbox sessions` has always printed: the session records, without the web's field.
|
|
63
|
+
shapeJson: (o) => o.sessions.map(({ canOpen: _canOpen, ...s }) => s),
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
export const restartSessions = defineOperation({
|
|
67
|
+
id: 'sessions.restart',
|
|
68
|
+
title: 'Restart agents',
|
|
69
|
+
summary: "restart this project's running agents in place; they resume their conversation",
|
|
70
|
+
input: z.object({
|
|
71
|
+
harness: z.string().optional().describe('only this agent'),
|
|
72
|
+
all: z.boolean().default(false).describe("every project's sessions, not only this folder's"),
|
|
73
|
+
}),
|
|
74
|
+
output: z.object({ message: z.string().describe("The sandbox's answer") }),
|
|
75
|
+
text: (o) => o.message,
|
|
76
|
+
cli: {
|
|
77
|
+
name: 'restart',
|
|
78
|
+
group: 'Agents',
|
|
79
|
+
flags: {
|
|
80
|
+
harness: { flag: '--harness', shownAs: '--agent', value: 'name', choices: 'harnesses' },
|
|
81
|
+
all: { flag: '--all' },
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
function sessionItem(s, wide) {
|
|
86
|
+
const state = s.phase + (s.exitCode !== undefined ? ' (' + s.exitCode + ')' : '');
|
|
87
|
+
const running = s.phase === 'running';
|
|
88
|
+
return {
|
|
89
|
+
id: s.id,
|
|
90
|
+
label: s.harness + ' ' + (s.projectName ?? '-'),
|
|
91
|
+
hint: state + ' ' + ago(s.startedAt),
|
|
92
|
+
badges: [{ text: s.phase, tone: running ? 'ok' : s.phase === 'failed' ? 'danger' : 'muted' }],
|
|
93
|
+
group: s.here ? "This folder's project" : 'Other sessions',
|
|
94
|
+
marked: s.here,
|
|
95
|
+
description: running
|
|
96
|
+
? "Opens this session's terminal (in a terminal, Ctrl+] detaches; the session keeps running)."
|
|
97
|
+
: undefined,
|
|
98
|
+
details: ['Session ' + s.id, 'Folder ' + s.cwd, 'Attached ' + viewerText(s.viewers)],
|
|
99
|
+
cells: {
|
|
100
|
+
here: s.here ? '*' : '',
|
|
101
|
+
id: s.id,
|
|
102
|
+
agent: s.harness,
|
|
103
|
+
project: s.projectName ?? '-',
|
|
104
|
+
state,
|
|
105
|
+
attached: viewerText(s.viewers),
|
|
106
|
+
...(wide ? { folder: s.cwd } : {}),
|
|
107
|
+
started: ago(s.startedAt),
|
|
108
|
+
},
|
|
109
|
+
...(running && s.canOpen ? { primary: link({ kind: 'terminal', session: s.id }, 'Open', { verb: 'attach' }) } : {}),
|
|
110
|
+
...(running ? {} : { disabled: 'This session has ended.' }),
|
|
111
|
+
...(running && !s.canOpen ? { disabled: 'Not reachable from this PC.' } : {}),
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/** The sessions page: one list (a table on the command line), this folder's project first. */
|
|
115
|
+
export function sessionsPage(o) {
|
|
116
|
+
const sessions = orderedSessions(o.sessions);
|
|
117
|
+
const agent = o.defaultAgent;
|
|
118
|
+
const start = link({ kind: 'start-agent', agent }, 'Start ' + agent, { verb: 'start' });
|
|
119
|
+
// Only ended sessions (from the last sandbox): starting one is the next step.
|
|
120
|
+
const startSection = sessions.length && !sessions.some((s) => s.phase === 'running' || s.phase === 'starting')
|
|
121
|
+
? [{ id: 'start', actions: [{ ...start, description: 'Starts ' + agent + ' in this folder.' }] }]
|
|
122
|
+
: [];
|
|
123
|
+
return {
|
|
124
|
+
title: 'Sessions',
|
|
125
|
+
...(o.owner ? { notice: { text: o.owner, tone: 'accent' } } : {}),
|
|
126
|
+
sections: [
|
|
127
|
+
{
|
|
128
|
+
id: 'sessions',
|
|
129
|
+
columns: [
|
|
130
|
+
{ key: 'here', label: '' },
|
|
131
|
+
{ key: 'id', label: 'ID' },
|
|
132
|
+
{ key: 'agent', label: 'AGENT' },
|
|
133
|
+
{ key: 'project', label: 'PROJECT' },
|
|
134
|
+
{ key: 'state', label: 'STATE' },
|
|
135
|
+
{ key: 'attached', label: 'ATTACHED' },
|
|
136
|
+
...(o.wide ? [{ key: 'folder', label: 'FOLDER' }] : []),
|
|
137
|
+
{ key: 'started', label: 'STARTED' },
|
|
138
|
+
],
|
|
139
|
+
items: sessions.map((s) => sessionItem(s, o.wide)),
|
|
140
|
+
notes: [
|
|
141
|
+
...(sessions.some((s) => s.here) ? [{ text: '* = the project of this folder', tone: 'muted' }] : []),
|
|
142
|
+
...(o.wide
|
|
143
|
+
? []
|
|
144
|
+
: [{ text: 'Folders: sandbox sessions --wide', tone: 'muted', only: 'cli' }]),
|
|
145
|
+
],
|
|
146
|
+
},
|
|
147
|
+
...startSection,
|
|
148
|
+
],
|
|
149
|
+
actions: [
|
|
150
|
+
...(sessions.length
|
|
151
|
+
? [action(restartSessions, { all: false }, { key: 'r', verb: 'restart agents', importance: 1 })]
|
|
152
|
+
: []),
|
|
153
|
+
link({ kind: 'command', argv: ['resume'] }, 'Reopen last sessions', {
|
|
154
|
+
key: 'o',
|
|
155
|
+
verb: 'reopen last sessions',
|
|
156
|
+
importance: 2,
|
|
157
|
+
}),
|
|
158
|
+
],
|
|
159
|
+
empty: {
|
|
160
|
+
title: o.sandboxRunning ? 'No sessions' : 'No sandbox is running',
|
|
161
|
+
text: o.sandboxRunning
|
|
162
|
+
? 'No agent is running. Start ' + agent + ' in this folder.'
|
|
163
|
+
: 'Starting ' + agent + ' starts the sandbox too; its session is listed here.',
|
|
164
|
+
action: start,
|
|
165
|
+
cliText: 'No sessions. Start one with: sandbox claude',
|
|
166
|
+
},
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
export const sessionsView = defineView({
|
|
170
|
+
id: 'sessions',
|
|
171
|
+
title: 'Sessions',
|
|
172
|
+
summary: 'The agent sessions of the running sandbox: open one, restart the agents.',
|
|
173
|
+
queries: { sessions: listSessions },
|
|
174
|
+
operations: [restartSessions],
|
|
175
|
+
build: ({ sessions }) => sessionsPage(sessions),
|
|
176
|
+
});
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export declare const listSessionsRun: import("../../kernel/define.js").Implementation<import("../../kernel/define.js").QueryDef<import("zod").ZodObject<{
|
|
2
|
+
wide: import("zod").ZodDefault<import("zod").ZodBoolean>;
|
|
3
|
+
}, import("zod/v4/core").$strip>, import("zod").ZodObject<{
|
|
4
|
+
sandboxRunning: import("zod").ZodBoolean;
|
|
5
|
+
defaultAgent: import("zod").ZodString;
|
|
6
|
+
wide: import("zod").ZodBoolean;
|
|
7
|
+
owner: import("zod").ZodOptional<import("zod").ZodString>;
|
|
8
|
+
sessions: import("zod").ZodArray<import("zod").ZodObject<{
|
|
9
|
+
id: import("zod").ZodString;
|
|
10
|
+
launchId: import("zod").ZodString;
|
|
11
|
+
harness: import("zod").ZodString;
|
|
12
|
+
cwd: import("zod").ZodString;
|
|
13
|
+
project: import("zod").ZodOptional<import("zod").ZodString>;
|
|
14
|
+
phase: import("zod").ZodEnum<{
|
|
15
|
+
failed: "failed";
|
|
16
|
+
starting: "starting";
|
|
17
|
+
running: "running";
|
|
18
|
+
exited: "exited";
|
|
19
|
+
}>;
|
|
20
|
+
message: import("zod").ZodString;
|
|
21
|
+
updatedAt: import("zod").ZodString;
|
|
22
|
+
startedAt: import("zod").ZodString;
|
|
23
|
+
conversation: import("zod").ZodOptional<import("zod").ZodString>;
|
|
24
|
+
exitCode: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
25
|
+
projectName: import("zod").ZodOptional<import("zod").ZodString>;
|
|
26
|
+
here: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
27
|
+
viewers: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodObject<{
|
|
28
|
+
viewers: import("zod").ZodNumber;
|
|
29
|
+
remote: import("zod").ZodNumber;
|
|
30
|
+
}, import("zod/v4/core").$strip>>>;
|
|
31
|
+
canOpen: import("zod").ZodBoolean;
|
|
32
|
+
}, import("zod/v4/core").$strip>>;
|
|
33
|
+
}, import("zod/v4/core").$strip>, "sessions.list">, import("../../../cli/commands/context.js").Context>;
|
|
34
|
+
export declare const restartSessionsRun: import("../../kernel/define.js").Implementation<import("../../kernel/define.js").OperationDef<import("zod").ZodObject<{
|
|
35
|
+
harness: import("zod").ZodOptional<import("zod").ZodString>;
|
|
36
|
+
all: import("zod").ZodDefault<import("zod").ZodBoolean>;
|
|
37
|
+
}, import("zod/v4/core").$strip>, import("zod").ZodObject<{
|
|
38
|
+
message: import("zod").ZodString;
|
|
39
|
+
}, import("zod/v4/core").$strip>, "sessions.restart">, import("../../../cli/commands/context.js").Context>;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// The sessions feature's work: the list (as this user may see it under the sharing rules) and restarting the agents.
|
|
2
|
+
import { safeText } from '../../../core/util/index.js';
|
|
3
|
+
import { hostEndpoint } from '../../../host/channel/index.js';
|
|
4
|
+
import { isSandboxRunning } from '../../../host/sandbox/index.js';
|
|
5
|
+
import { requireOnPc, requireRunning } from '../../../cli/commands/context.js';
|
|
6
|
+
import { lookAtSandbox, useSharedSandbox } from '../../../cli/commands/shared-use.js';
|
|
7
|
+
import { SessionsService } from '../../../cli/services/index.js';
|
|
8
|
+
import { implement, typedConfirm } from '../../context.js';
|
|
9
|
+
import { cancelled } from '../../kernel/index.js';
|
|
10
|
+
import { listSessions, restartSessions } from './sessions.def.js';
|
|
11
|
+
/** A listed session as the surfaces see it: no attach address or token, text from the sandbox made safe. */
|
|
12
|
+
function sessionRow(s) {
|
|
13
|
+
const { attach: _attach, ...rest } = s;
|
|
14
|
+
return {
|
|
15
|
+
...rest,
|
|
16
|
+
harness: safeText(s.harness),
|
|
17
|
+
cwd: safeText(s.cwd),
|
|
18
|
+
...(s.project !== undefined ? { project: safeText(s.project) } : {}),
|
|
19
|
+
message: safeText(s.message).slice(0, 300),
|
|
20
|
+
...(s.conversation !== undefined ? { conversation: safeText(s.conversation) } : {}),
|
|
21
|
+
...(s.projectName !== undefined ? { projectName: safeText(s.projectName) } : {}),
|
|
22
|
+
canOpen: s.phase === 'running' && hostEndpoint(s) !== null,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export const listSessionsRun = implement(listSessions, async (asked, input) => {
|
|
26
|
+
// Another user's sandbox: shared, its sessions are listed from their folders; not shared, only whose it is.
|
|
27
|
+
const view = lookAtSandbox(asked);
|
|
28
|
+
const base = {
|
|
29
|
+
sandboxRunning: isSandboxRunning(),
|
|
30
|
+
defaultAgent: asked.loaded.config.defaultHarness,
|
|
31
|
+
wide: input.wide,
|
|
32
|
+
...(view.line ? { owner: view.line } : {}),
|
|
33
|
+
};
|
|
34
|
+
if (view.limited)
|
|
35
|
+
return { ...base, sessions: [] };
|
|
36
|
+
const list = await new SessionsService(view.ctx).list();
|
|
37
|
+
return { ...base, sessions: list.map(sessionRow) };
|
|
38
|
+
});
|
|
39
|
+
export const restartSessionsRun = implement(restartSessions, async (ctx, input, io) => {
|
|
40
|
+
requireOnPc('restart');
|
|
41
|
+
requireRunning();
|
|
42
|
+
await useSharedSandbox(ctx, { kind: 'owner-only', what: 'restart the agents' }, typedConfirm(io));
|
|
43
|
+
const service = new SessionsService(ctx);
|
|
44
|
+
const scope = service.restartScope(input.all);
|
|
45
|
+
if (scope.notAProject)
|
|
46
|
+
io.log(scope.folder + ' is not a project of the running sandbox: restarting every session.', 'muted');
|
|
47
|
+
const what = scope.guest ? 'the agents of ' + scope.projectName : 'every agent';
|
|
48
|
+
const yes = await io.confirm({
|
|
49
|
+
title: 'Restart ' + what + '?',
|
|
50
|
+
lines: ['The agents are started again and continue their conversations where they can.'],
|
|
51
|
+
yes: 'Restart',
|
|
52
|
+
implied: true,
|
|
53
|
+
});
|
|
54
|
+
if (!yes)
|
|
55
|
+
cancelled();
|
|
56
|
+
io.progress('Restarting the agents' + (scope.guest ? ' of ' + scope.projectName : ''));
|
|
57
|
+
return { message: safeText(await service.restart(input.harness ?? null, scope.guest)) };
|
|
58
|
+
});
|
package/dist/{cli/menu/settings/categories.d.ts → app/features/settings/categories.def.d.ts}
RENAMED
|
@@ -5,5 +5,9 @@ export interface SettingsCategory {
|
|
|
5
5
|
keys: string[];
|
|
6
6
|
}
|
|
7
7
|
export declare const CATEGORIES: SettingsCategory[];
|
|
8
|
+
/** Settings not listed here because their own section covers them (Apps: the catalogue and your own programs). */
|
|
9
|
+
export declare const SETTINGS_ELSEWHERE: readonly string[];
|
|
8
10
|
export declare function nameOf(key: string): string;
|
|
9
11
|
export declare function categoryOf(topKey: string): SettingsCategory | undefined;
|
|
12
|
+
/** The label of a setting. */
|
|
13
|
+
export declare function labelOf(key: readonly string[]): string;
|
|
@@ -1,31 +1,26 @@
|
|
|
1
|
-
// How the settings are grouped on
|
|
2
|
-
//
|
|
3
|
-
|
|
1
|
+
// How the settings are grouped on every surface: categories (the menu's navigation, the web's tabs), readable names for
|
|
2
|
+
// sections and toolchains, and plain words for settings whose key is jargon. Every top-level setting of both files must
|
|
3
|
+
// belong to a category or be covered by another section (a self-test checks it), so nothing is ever hidden. Pure.
|
|
4
|
+
import { humanize } from '../../kernel/index.js';
|
|
4
5
|
export const CATEGORIES = [
|
|
5
6
|
{
|
|
6
7
|
id: 'general',
|
|
7
8
|
label: 'General',
|
|
8
|
-
description: 'Which agent starts, where the project appears in the sandbox,
|
|
9
|
+
description: 'Which agent starts, where the project appears in the sandbox, extra folders from this PC, and where the sandbox keeps its data.',
|
|
9
10
|
keys: ['defaultHarness', 'harness', 'guestWorkspace', 'readOnly', 'mappings', 'scripts'],
|
|
10
11
|
},
|
|
11
12
|
{
|
|
12
13
|
id: 'machine',
|
|
13
14
|
label: 'Sandbox machine',
|
|
14
|
-
description: 'Memory, CPU, window, GPU, clipboard, audio and
|
|
15
|
-
keys: ['sandbox'],
|
|
15
|
+
description: 'Memory, CPU, window, GPU, clipboard, audio and networking of the sandbox itself, and its desktop look (theme, accent colour, taskbar, wallpaper).',
|
|
16
|
+
keys: ['sandbox', 'personalization'],
|
|
16
17
|
},
|
|
17
18
|
{
|
|
18
19
|
id: 'languages',
|
|
19
20
|
label: 'Languages & tools',
|
|
20
|
-
description: 'Toolchains installed in the sandbox. "auto" follows your project
|
|
21
|
+
description: 'Toolchains installed in the sandbox. "auto" follows the files of your project and what this PC has.',
|
|
21
22
|
keys: ['toolchains'],
|
|
22
23
|
},
|
|
23
|
-
{
|
|
24
|
-
id: 'apps',
|
|
25
|
-
label: 'Apps',
|
|
26
|
-
description: 'Desktop apps installed in the sandbox: editors, database clients, API clients, game engines ... (also: Apps catalogue on the home screen).',
|
|
27
|
-
keys: ['apps'],
|
|
28
|
-
},
|
|
29
24
|
{
|
|
30
25
|
id: 'databases',
|
|
31
26
|
label: 'Databases',
|
|
@@ -34,21 +29,15 @@ export const CATEGORIES = [
|
|
|
34
29
|
},
|
|
35
30
|
{
|
|
36
31
|
id: 'agents',
|
|
37
|
-
label: 'Agents &
|
|
38
|
-
description: 'The agents you can start, attaching your terminal to them,
|
|
39
|
-
keys: ['harnesses', 'attach', 'agentCommands'],
|
|
40
|
-
},
|
|
41
|
-
{
|
|
42
|
-
id: 'claude',
|
|
43
|
-
label: 'Claude profile',
|
|
44
|
-
description: 'Which of your Claude settings, history and memory are copied in and synced back.',
|
|
45
|
-
keys: ['claudeProfile'],
|
|
32
|
+
label: 'Agents & sessions',
|
|
33
|
+
description: 'The agents you can start (also: Agents section), attaching your terminal to them, the (Beta) web UI and agent commands, which of your Claude settings are copied in, and reopening sessions.',
|
|
34
|
+
keys: ['harnesses', 'attach', 'web', 'agentCommands', 'claudeProfile', 'resume'],
|
|
46
35
|
},
|
|
47
36
|
{
|
|
48
37
|
id: 'network',
|
|
49
38
|
label: 'Network',
|
|
50
|
-
description: 'What the sandbox can reach: your LAN, only some hosts, blocked hosts, DNS, a proxy,
|
|
51
|
-
keys: ['network'],
|
|
39
|
+
description: 'What the sandbox can reach: your LAN, only some hosts, blocked hosts, DNS, a proxy, ports forwarded from this PC to servers inside, and a VPN (with a login set here). (No network at all: Sandbox machine > Networking.)',
|
|
40
|
+
keys: ['network', 'vpn'],
|
|
52
41
|
},
|
|
53
42
|
{
|
|
54
43
|
id: 'security',
|
|
@@ -56,42 +45,28 @@ export const CATEGORIES = [
|
|
|
56
45
|
description: 'Git-ignored files kept out, secrets kept out of the sandbox, download checks, what is kept on this PC, and sharing your sandbox with other Windows users.',
|
|
57
46
|
keys: ['workspaceFilter', 'audit', 'secrets', 'downloads', 'storage', 'sharing'],
|
|
58
47
|
},
|
|
59
|
-
{
|
|
60
|
-
id: 'setup',
|
|
61
|
-
label: 'Setup & hooks',
|
|
62
|
-
description: 'How tools get into the sandbox (copied from this PC or downloaded), Git, the terminal, and hook scripts.',
|
|
63
|
-
keys: ['provisioning', 'hooks'],
|
|
64
|
-
},
|
|
65
48
|
{
|
|
66
49
|
id: 'projects',
|
|
67
|
-
label: 'Projects',
|
|
68
|
-
description: 'Several projects in one sandbox
|
|
69
|
-
keys: ['projects'],
|
|
70
|
-
},
|
|
71
|
-
{
|
|
72
|
-
id: 'resume',
|
|
73
|
-
label: 'Reopening sessions',
|
|
74
|
-
description: 'Open the sessions of the last sandbox again when a new one starts, or after a crash.',
|
|
75
|
-
keys: ['resume'],
|
|
76
|
-
},
|
|
77
|
-
{
|
|
78
|
-
id: 'desktop',
|
|
79
|
-
label: 'Desktop look',
|
|
80
|
-
description: 'Copy your theme, accent colour, taskbar and wallpaper into the sandbox.',
|
|
81
|
-
keys: ['personalization'],
|
|
50
|
+
label: 'Projects & setup',
|
|
51
|
+
description: 'Several projects in one sandbox (roots mapped at every start, adding folders while it runs), how tools get into the sandbox (copied from this PC or downloaded), Git, the terminal, and hook scripts.',
|
|
52
|
+
keys: ['projects', 'provisioning', 'hooks'],
|
|
82
53
|
},
|
|
83
54
|
];
|
|
55
|
+
/** Settings not listed here because their own section covers them (Apps: the catalogue and your own programs). */
|
|
56
|
+
export const SETTINGS_ELSEWHERE = ['apps'];
|
|
84
57
|
/** Readable names for sections and toolchains (anything missing gets a name made from its key). */
|
|
85
58
|
const NAMES = {
|
|
86
59
|
sandbox: 'Sandbox machine',
|
|
87
60
|
attach: 'Attaching your terminal',
|
|
88
61
|
agentCommands: 'Agent commands (Beta)',
|
|
62
|
+
web: 'Web UI (Beta)',
|
|
89
63
|
provisioning: 'Provisioning',
|
|
90
64
|
downloads: 'Downloads',
|
|
91
65
|
secrets: 'Secrets',
|
|
92
66
|
claudeProfile: 'Claude profile',
|
|
93
67
|
storage: 'Storage on this PC',
|
|
94
68
|
network: 'Network',
|
|
69
|
+
vpn: 'VPN',
|
|
95
70
|
hooks: 'Hooks',
|
|
96
71
|
personalization: 'Desktop look',
|
|
97
72
|
projects: 'Projects',
|
|
@@ -131,8 +106,27 @@ const NAMES = {
|
|
|
131
106
|
audit: 'Audit log',
|
|
132
107
|
};
|
|
133
108
|
export function nameOf(key) {
|
|
134
|
-
return NAMES[key] ??
|
|
109
|
+
return NAMES[key] ?? humanize(key);
|
|
135
110
|
}
|
|
136
111
|
export function categoryOf(topKey) {
|
|
137
112
|
return CATEGORIES.find((c) => c.keys.includes(topKey));
|
|
138
113
|
}
|
|
114
|
+
/** Plain words for settings whose key is jargon (the key itself stays in the details). */
|
|
115
|
+
const LABELS = {
|
|
116
|
+
mappings: 'Extra folders from this PC',
|
|
117
|
+
'sandbox.vGpu': 'Graphics acceleration',
|
|
118
|
+
'sandbox.headless': 'Hide the sandbox window',
|
|
119
|
+
'sandbox.memoryMb': 'Memory (MB)',
|
|
120
|
+
'sandbox.pageFileMb': 'Swap file (MB)',
|
|
121
|
+
'sandbox.agentMemoryHeadroomMb': 'Memory kept free from agents (MB)',
|
|
122
|
+
'sandbox.pressureResponse': 'Slow builds down when memory runs low',
|
|
123
|
+
'network.dns': 'DNS servers',
|
|
124
|
+
'projects.wsbShare': 'Add folders while the sandbox runs',
|
|
125
|
+
'projects.all': 'Map all known projects at start',
|
|
126
|
+
'claudeProfile.hostDir': 'Claude folder on this PC',
|
|
127
|
+
'claudeProfile.globalStateFile': 'Claude state file on this PC',
|
|
128
|
+
};
|
|
129
|
+
/** The label of a setting. */
|
|
130
|
+
export function labelOf(key) {
|
|
131
|
+
return LABELS[key.join('.')] ?? humanize(key[key.length - 1]);
|
|
132
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// The settings feature: categories and labels, the rows of a file, get / set / reset, and the view.
|
|
2
|
+
export * from './categories.def.js';
|
|
3
|
+
export * from './settings.def.js';
|
|
4
|
+
export * from './settings-file.js';
|
|
5
|
+
export * from './settings-rows.js';
|
|
6
|
+
export * from './settings.run.js';
|
package/dist/{cli/menu/settings/config-file.d.ts → app/features/settings/settings-file.d.ts}
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Config } from '../../../core/types.js';
|
|
2
|
-
import { SchemaNode } from '
|
|
2
|
+
import { SchemaNode } from '../../kernel/index.js';
|
|
3
3
|
/** The user's own config, or a project's .sandbox-config.json (a smaller schema; nothing is merged with defaults). */
|
|
4
4
|
export type SettingsTarget = 'user' | 'project';
|
|
5
5
|
/** What the value is in this JSON text (undefined when it is not set there). */
|
|
@@ -8,7 +8,7 @@ import _ from 'lodash';
|
|
|
8
8
|
import { DEFAULTS, loadConfig, mergeConfig, userConfigPath } from '../../../core/config/index.js';
|
|
9
9
|
import { LOCAL_CONFIG_NAME } from '../../../core/local-config/index.js';
|
|
10
10
|
import { ConfigSchema, describeIssues, LocalOverridesSchema } from '../../../core/schema/index.js';
|
|
11
|
-
import { SchemaNode } from '
|
|
11
|
+
import { SchemaNode } from '../../kernel/index.js';
|
|
12
12
|
/** What the value is in this JSON text (undefined when it is not set there). */
|
|
13
13
|
export function fileValue(text, key) {
|
|
14
14
|
return _.get(parse(text) ?? {}, key);
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { Config } from '../../../core/types.js';
|
|
2
|
+
import { type SchemaNode } from '../../kernel/index.js';
|
|
3
|
+
import type { Scope, SettingRow } from './settings.def.js';
|
|
4
|
+
import type { ConfigFile } from './settings-file.js';
|
|
5
|
+
/** One editable setting with the category and heading it is shown under. */
|
|
6
|
+
export interface Setting {
|
|
7
|
+
readonly key: string[];
|
|
8
|
+
readonly node: SchemaNode;
|
|
9
|
+
readonly category: string;
|
|
10
|
+
readonly section?: string;
|
|
11
|
+
}
|
|
12
|
+
/** Every editable setting of a file, each in its category (settings covered by another section are left out). */
|
|
13
|
+
export declare function settingsOf(file: ConfigFile): Setting[];
|
|
14
|
+
/** Your own settings and this folder's project file. */
|
|
15
|
+
export type SettingsFiles = Readonly<Record<Scope, ConfigFile>>;
|
|
16
|
+
/** Where values come from: the files as saved, or with the menu's unsaved changes laid over them. */
|
|
17
|
+
export interface SettingsSource {
|
|
18
|
+
/** What the file says (undefined: not set there). */
|
|
19
|
+
written(file: ConfigFile, key: string[]): unknown;
|
|
20
|
+
/** What is in effect: your file merged with the defaults, or only what a project file says. */
|
|
21
|
+
effective(file: ConfigFile, key: string[], config: Config): unknown;
|
|
22
|
+
}
|
|
23
|
+
/** The files as they are on disk. */
|
|
24
|
+
export declare const SAVED: SettingsSource;
|
|
25
|
+
/** A value with every secret in it replaced by *** (as the whole settings object would be redacted). */
|
|
26
|
+
export declare function masked(key: readonly string[], value: unknown): unknown;
|
|
27
|
+
/** One setting's row in a scope (`config` and `inProject` can be passed when making many rows). */
|
|
28
|
+
export declare function settingRow(s: Setting, files: SettingsFiles, scope: Scope, source?: SettingsSource, config?: Config, inProject?: ReadonlySet<string>): SettingRow;
|
|
29
|
+
/** Every setting's row in a scope (one read of your settings for all of them). */
|
|
30
|
+
export declare function settingRows(files: SettingsFiles, scope: Scope, source?: SettingsSource): SettingRow[];
|
|
31
|
+
/** The setting a key names in a file's schema; an unknown key says what is close. */
|
|
32
|
+
export declare function findSetting(file: ConfigFile, key: string): {
|
|
33
|
+
key: string[];
|
|
34
|
+
node: SchemaNode;
|
|
35
|
+
};
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
// Every setting of a file as rows: which settings there are (from the schema, nothing listed by hand), where they are
|
|
2
|
+
// shown (category and heading), their Field, and their values in this file, in your settings and in the project's,
|
|
3
|
+
// with secrets as ***. The settings query sends these rows; the menu lays its unsaved changes over them (`source`).
|
|
4
|
+
import _ from 'lodash';
|
|
5
|
+
import { NEVER_LOOSER } from '../../../core/local-config/index.js';
|
|
6
|
+
import { redactSecrets } from '../../../core/schema/index.js';
|
|
7
|
+
import { fail } from '../../../core/util/index.js';
|
|
8
|
+
import { closest } from '../../../cli/validate.js';
|
|
9
|
+
import { fieldOf } from '../../kernel/index.js';
|
|
10
|
+
import { categoryOf, labelOf, nameOf } from './categories.def.js';
|
|
11
|
+
/** Every editable setting of a file, each in its category (settings covered by another section are left out). */
|
|
12
|
+
export function settingsOf(file) {
|
|
13
|
+
return file.schema.children().flatMap(([top, node]) => {
|
|
14
|
+
const category = categoryOf(top);
|
|
15
|
+
if (!category)
|
|
16
|
+
return [];
|
|
17
|
+
const several = category.keys.filter((k) => file.schema.child(k)).length > 1;
|
|
18
|
+
if (!node.isSection)
|
|
19
|
+
return [
|
|
20
|
+
{
|
|
21
|
+
key: [top],
|
|
22
|
+
node,
|
|
23
|
+
category: category.id,
|
|
24
|
+
section: several && category.id !== 'general' ? nameOf(top) : undefined,
|
|
25
|
+
},
|
|
26
|
+
];
|
|
27
|
+
return node.leaves([top]).map(({ key, node: leaf }) => {
|
|
28
|
+
const heading = [
|
|
29
|
+
several ? nameOf(top) : undefined,
|
|
30
|
+
key.length > 2 ? key.slice(1, -1).map(nameOf).join(' › ') : undefined,
|
|
31
|
+
]
|
|
32
|
+
.filter(Boolean)
|
|
33
|
+
.join(' › ');
|
|
34
|
+
return { key, node: leaf, category: category.id, section: heading || undefined };
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
/** The files as they are on disk. */
|
|
39
|
+
export const SAVED = {
|
|
40
|
+
written: (file, key) => file.valueInFile(key),
|
|
41
|
+
effective: (file, key, config) => (file.isProject ? file.valueInFile(key) : _.get(config, key)),
|
|
42
|
+
};
|
|
43
|
+
/** A value with every secret in it replaced by *** (as the whole settings object would be redacted). */
|
|
44
|
+
export function masked(key, value) {
|
|
45
|
+
if (value === undefined)
|
|
46
|
+
return undefined;
|
|
47
|
+
return _.get(redactSecrets(_.set({}, key, structuredClone(value))), key);
|
|
48
|
+
}
|
|
49
|
+
/** The keys a project file can set. */
|
|
50
|
+
function projectKeys(files) {
|
|
51
|
+
return new Set(files.project.schema.leaves().map((l) => l.key.join('.')));
|
|
52
|
+
}
|
|
53
|
+
/** One setting's row in a scope (`config` and `inProject` can be passed when making many rows). */
|
|
54
|
+
export function settingRow(s, files, scope, source = SAVED, config = files.user.userConfig(), inProject = projectKeys(files)) {
|
|
55
|
+
const file = files[scope];
|
|
56
|
+
const id = s.key.join('.');
|
|
57
|
+
return {
|
|
58
|
+
id,
|
|
59
|
+
key: s.key,
|
|
60
|
+
label: labelOf(s.key),
|
|
61
|
+
category: s.category,
|
|
62
|
+
...(s.section ? { section: s.section } : {}),
|
|
63
|
+
field: fieldOf(s.node, s.key, labelOf(s.key)),
|
|
64
|
+
value: masked(s.key, source.effective(file, s.key, config)),
|
|
65
|
+
set: source.written(file, s.key) !== undefined,
|
|
66
|
+
yours: masked(s.key, source.effective(files.user, s.key, config)),
|
|
67
|
+
yoursSet: source.written(files.user, s.key) !== undefined,
|
|
68
|
+
inProject: inProject.has(id) ? masked(s.key, source.written(files.project, s.key)) : undefined,
|
|
69
|
+
...(file.isProject ? {} : { default: masked(s.key, file.defaultOf(s.key)) }),
|
|
70
|
+
locked: NEVER_LOOSER.includes(id),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/** Every setting's row in a scope (one read of your settings for all of them). */
|
|
74
|
+
export function settingRows(files, scope, source = SAVED) {
|
|
75
|
+
const config = files.user.userConfig();
|
|
76
|
+
const inProject = projectKeys(files);
|
|
77
|
+
return settingsOf(files[scope]).map((s) => settingRow(s, files, scope, source, config, inProject));
|
|
78
|
+
}
|
|
79
|
+
/** The setting a key names in a file's schema; an unknown key says what is close. */
|
|
80
|
+
export function findSetting(file, key) {
|
|
81
|
+
const keyPath = key.split('.');
|
|
82
|
+
let node = file.schema;
|
|
83
|
+
for (const part of keyPath)
|
|
84
|
+
node = node?.child(part);
|
|
85
|
+
if (node)
|
|
86
|
+
return { key: keyPath, node };
|
|
87
|
+
const hint = closest(key, file.schema.leaves().map((l) => l.key.join('.')));
|
|
88
|
+
return fail('There is no setting "' +
|
|
89
|
+
key +
|
|
90
|
+
'"' +
|
|
91
|
+
(file.isProject ? ' a project can set' : '') +
|
|
92
|
+
'.' +
|
|
93
|
+
(hint ? ' Did you mean ' + hint + '?' : ''), 'Settings are named like sandbox.memoryMb. See them all with: sandbox config show');
|
|
94
|
+
}
|