windows-development-sandbox 1.7.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/config.example.json +10 -0
- 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} +2 -0
- package/dist/{cli/menu/settings/categories.js → app/features/settings/categories.def.js} +24 -5
- 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/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 +5 -0
- package/dist/cli/args.js +6 -0
- package/dist/cli/commands/engine.d.ts +2 -0
- package/dist/cli/commands/engine.js +60 -0
- package/dist/cli/commands/index.d.ts +1 -1
- package/dist/cli/commands/index.js +1 -1
- package/dist/cli/commands/launch/launch.js +47 -7
- package/dist/cli/commands/launch/prepare.js +3 -3
- package/dist/cli/commands/launch/running.js +2 -1
- package/dist/cli/commands/launch/summary.d.ts +2 -0
- 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.js +8 -82
- package/dist/cli/commands/maintenance/logs.js +14 -0
- package/dist/cli/commands/registry.js +3 -7
- 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/hcs.d.ts +7 -0
- package/dist/cli/commands/repair/checks/hcs.js +28 -0
- package/dist/cli/commands/repair/checks/index.js +4 -0
- package/dist/cli/commands/repair/checks/pc.js +32 -1
- package/dist/cli/commands/repair/checks/sandbox.js +16 -1
- package/dist/cli/commands/repair/checks/vpn.js +34 -9
- package/dist/cli/commands/repair/env.js +2 -1
- package/dist/cli/commands/sessions/index.d.ts +0 -4
- package/dist/cli/commands/sessions/index.js +3 -7
- 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/offer.js +7 -1
- package/dist/cli/commands/storage/storage.js +10 -2
- package/dist/cli/commands/user-config.js +1 -1
- package/dist/cli/commands/vpn.js +19 -3
- package/dist/cli/commands/web.js +2 -0
- package/dist/cli/index.js +2 -1
- package/dist/cli/manifest.d.ts +72 -104
- package/dist/cli/manifest.js +64 -39
- package/dist/cli/menu/add-agent.d.ts +1 -1
- package/dist/cli/menu/add-agent.js +1 -1
- package/dist/cli/menu/apps.d.ts +7 -1
- package/dist/cli/menu/apps.js +36 -0
- package/dist/cli/menu/command-fields.d.ts +1 -1
- package/dist/cli/menu/command-form.js +2 -2
- 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 +10 -1
- package/dist/cli/menu/menu.js +27 -9
- package/dist/cli/menu/pages/agents-page.d.ts +3 -1
- package/dist/cli/menu/pages/agents-page.js +12 -5
- package/dist/cli/menu/pages/apps-page.d.ts +3 -1
- package/dist/cli/menu/pages/apps-page.js +19 -2
- package/dist/cli/menu/pages/list-page.d.ts +27 -0
- package/dist/cli/menu/pages/list-page.js +109 -7
- package/dist/cli/menu/pages/maintenance-page.d.ts +0 -5
- package/dist/cli/menu/pages/maintenance-page.js +17 -19
- package/dist/cli/menu/pages/sandbox-page.d.ts +4 -6
- package/dist/cli/menu/pages/sandbox-page.js +26 -118
- package/dist/cli/menu/pages/scopes.d.ts +1 -1
- package/dist/cli/menu/pages/sessions-page.d.ts +5 -11
- package/dist/cli/menu/pages/sessions-page.js +19 -88
- package/dist/cli/menu/pages/settings-page.d.ts +2 -10
- package/dist/cli/menu/pages/settings-page.js +64 -94
- package/dist/cli/menu/render-view.d.ts +28 -0
- package/dist/cli/menu/render-view.js +112 -0
- package/dist/cli/menu/settings/{path-kind.d.ts → ask-path.d.ts} +1 -7
- package/dist/cli/menu/settings/ask-path.js +14 -0
- package/dist/cli/menu/settings/collections/collection-editor.d.ts +1 -1
- package/dist/cli/menu/settings/collections/string-list-editor.d.ts +1 -2
- package/dist/cli/menu/settings/collections/string-list-editor.js +1 -1
- 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 +1 -1
- 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 +5 -1
- package/dist/cli/menu/settings/value-editor.js +57 -54
- package/dist/cli/menu/several.js +1 -1
- 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 +21 -5
- package/dist/cli/menu/shell.js +31 -6
- package/dist/cli/menu/views.d.ts +7 -0
- package/dist/cli/menu/views.js +11 -0
- package/dist/cli/menu/vpn-login.js +8 -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 +3 -1
- package/dist/cli/output/print.js +7 -3
- 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/agent-commands-service.d.ts +2 -0
- package/dist/cli/services/agent-commands-service.js +11 -2
- package/dist/cli/services/logs-service.js +4 -3
- package/dist/cli/tui/app.d.ts +6 -1
- package/dist/cli/tui/app.js +26 -4
- package/dist/cli/tui/list/list-screen.d.ts +14 -0
- package/dist/cli/tui/list/list-screen.js +64 -36
- package/dist/cli/tui/list/list-types.d.ts +2 -0
- package/dist/cli/tui/terminal.d.ts +7 -0
- package/dist/cli/tui/terminal.js +30 -10
- package/dist/core/config/defaults.js +8 -0
- package/dist/core/schema/config.d.ts +13 -0
- package/dist/core/schema/config.js +16 -1
- package/dist/core/schema/harness.d.ts +1 -0
- package/dist/core/schema/harness.js +5 -0
- package/dist/core/schema/sandbox.d.ts +6 -0
- package/dist/core/schema/sandbox.js +20 -3
- package/dist/core/schema/vpn.d.ts +2 -1
- package/dist/core/schema/vpn.js +3 -3
- package/dist/core/types.d.ts +23 -5
- 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 +5 -0
- package/dist/guest/agents/agent-files.js +4 -0
- package/dist/guest/agents/local-state.d.ts +2 -0
- package/dist/guest/agents/local-state.js +21 -1
- package/dist/guest/boot/boot.js +2 -1
- package/dist/guest/daemon/daemon.js +4 -0
- package/dist/guest/daemon/sessions.d.ts +5 -0
- package/dist/guest/daemon/sessions.js +17 -3
- package/dist/guest/entries/daemon.js +3 -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 +1 -0
- package/dist/guest/runtime/csc.js +1 -0
- package/dist/guest/sessions/viewer.js +3 -1
- package/dist/guest/toolchains/native/rust-extras.js +4 -2
- package/dist/guest/vpn/vpn.js +69 -21
- 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 +3 -1
- package/dist/host/channel/attach.js +5 -2
- package/dist/host/channel/channel.d.ts +2 -0
- package/dist/host/channel/channel.js +4 -0
- 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/launch/generate.d.ts +5 -1
- package/dist/host/launch/generate.js +50 -8
- 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 +7 -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/native.d.ts +3 -2
- package/dist/host/native.js +22 -3
- package/dist/host/profile/claude-login.js +3 -2
- 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 +2 -0
- package/dist/host/sandbox/platform.js +7 -7
- package/dist/host/sandbox/tasklist.d.ts +13 -0
- package/dist/host/sandbox/tasklist.js +47 -0
- package/dist/host/secrets/launch-secrets.js +2 -1
- package/dist/host/sharing/current.js +2 -6
- 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/index.d.ts +2 -0
- package/dist/host/storage/index.js +2 -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/tools/conpty.js +3 -2
- package/dist/host/tools/windows-terminal.js +8 -7
- package/dist/host/vpn/index.d.ts +1 -1
- package/dist/host/vpn/index.js +1 -1
- package/dist/host/vpn/prepare.d.ts +2 -0
- package/dist/host/vpn/prepare.js +63 -2
- package/dist/host/web/browser.d.ts +2 -0
- package/dist/host/web/browser.js +14 -1
- package/dist/host/web/index.d.ts +3 -2
- package/dist/host/web/index.js +3 -2
- package/dist/host/web/rpc.d.ts +24 -0
- package/dist/host/web/rpc.js +149 -0
- package/dist/host/web/runner.d.ts +2 -0
- package/dist/host/web/runner.js +1 -2
- package/dist/host/web/server.d.ts +7 -0
- package/dist/host/web/server.js +23 -3
- package/dist/runtime/agent.js +69 -8
- package/dist/runtime/daemon.js +1058 -624
- package/dist/runtime/db.js +69 -8
- package/dist/runtime/main.js +624 -182
- package/dist/runtime/netproxy.js +69 -8
- package/dist/runtime/view.js +87 -13
- package/dist/selftest/agent-paths.test.js +11 -1
- package/dist/selftest/app.test.d.ts +2 -0
- package/dist/selftest/app.test.js +324 -0
- package/dist/selftest/channel.test.js +13 -0
- package/dist/selftest/cli.test.js +2 -1
- 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.js +1 -1
- package/dist/selftest/engine.test.d.ts +2 -0
- package/dist/selftest/engine.test.js +127 -0
- package/dist/selftest/hcs.test.d.ts +2 -0
- package/dist/selftest/hcs.test.js +482 -0
- package/dist/selftest/heavy-load.test.d.ts +2 -0
- package/dist/selftest/heavy-load.test.js +329 -0
- package/dist/selftest/index.js +12 -0
- package/dist/selftest/layout.test.js +12 -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.js +4 -2
- package/dist/selftest/menu.test.js +36 -8
- 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 +7 -1
- package/dist/selftest/support/hcs-probes.d.ts +17 -0
- package/dist/selftest/support/hcs-probes.js +41 -0
- package/dist/selftest/vpn.test.js +136 -3
- package/dist/selftest/web.test.js +101 -3
- package/dist/shared/channel/run-dir.d.ts +4 -1
- package/dist/shared/channel/run-dir.js +7 -1
- package/dist/shared/channel/schema.d.ts +35 -1
- package/dist/shared/channel/schema.js +27 -0
- package/dist/shared/channel/secrets.d.ts +1 -0
- package/dist/shared/channel/secrets.js +6 -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 +16 -0
- package/dist/shared/vpn/download.js +16 -0
- package/dist/shared/vpn/wireguard.d.ts +51 -0
- package/dist/shared/vpn/wireguard.js +227 -0
- package/dist/sync/sync-cycle.js +5 -5
- package/dist/sync/watcher.d.ts +13 -0
- package/dist/sync/watcher.js +92 -3
- package/dist/web/index.html +4 -3
- package/dist/web/main-NRRS5O6Z.js +157 -0
- package/dist/web/main-T5DMCHYV.css +1 -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/run-elevated.ps1 +17 -4
- package/native/scripts/stop-events.ps1 +23 -8
- package/package.json +9 -2
- package/sandbox/csharp/MemGov.cs +398 -0
- package/sandbox/csharp/PtyHost.cs +111 -5
- package/schemas/config.schema.json +60 -6
- package/schemas/sandbox-config.schema.json +3 -3
- 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 -48
- package/dist/cli/commands/sessions/status.d.ts +0 -4
- package/dist/cli/commands/sessions/status.js +0 -114
- package/dist/cli/commands/sessions/window.d.ts +0 -3
- package/dist/cli/commands/sessions/window.js +0 -18
- package/dist/cli/menu/settings/path-kind.js +0 -44
- package/dist/web/main-CXESL347.js +0 -45
- package/dist/web/main-VLR7DVQ4.css +0 -1
- /package/dist/{cli/menu/settings → app/kernel}/schema-node.d.ts +0 -0
- /package/dist/{cli/menu/settings → app/kernel}/schema-node.js +0 -0
|
@@ -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
|
@@ -9,3 +9,5 @@ export declare const CATEGORIES: SettingsCategory[];
|
|
|
9
9
|
export declare const SETTINGS_ELSEWHERE: readonly string[];
|
|
10
10
|
export declare function nameOf(key: string): string;
|
|
11
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,7 +1,7 @@
|
|
|
1
|
-
// How the settings are grouped on
|
|
2
|
-
//
|
|
3
|
-
// it), so nothing is ever hidden.
|
|
4
|
-
import {
|
|
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';
|
|
5
5
|
export const CATEGORIES = [
|
|
6
6
|
{
|
|
7
7
|
id: 'general',
|
|
@@ -106,8 +106,27 @@ const NAMES = {
|
|
|
106
106
|
audit: 'Audit log',
|
|
107
107
|
};
|
|
108
108
|
export function nameOf(key) {
|
|
109
|
-
return NAMES[key] ??
|
|
109
|
+
return NAMES[key] ?? humanize(key);
|
|
110
110
|
}
|
|
111
111
|
export function categoryOf(topKey) {
|
|
112
112
|
return CATEGORIES.find((c) => c.keys.includes(topKey));
|
|
113
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
|
+
}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { type Page } from '../../kernel/index.js';
|
|
3
|
+
export declare const ScopeSchema: z.ZodEnum<{
|
|
4
|
+
project: "project";
|
|
5
|
+
user: "user";
|
|
6
|
+
}>;
|
|
7
|
+
export type Scope = z.output<typeof ScopeSchema>;
|
|
8
|
+
/** One setting as every surface shows it. Values are what the file or the merged settings say, secrets as ***. */
|
|
9
|
+
export declare const SettingRowSchema: z.ZodObject<{
|
|
10
|
+
id: z.ZodString;
|
|
11
|
+
key: z.ZodArray<z.ZodString>;
|
|
12
|
+
label: z.ZodString;
|
|
13
|
+
category: z.ZodString;
|
|
14
|
+
section: z.ZodOptional<z.ZodString>;
|
|
15
|
+
field: z.ZodType<import("../../kernel/fields.js").Field, unknown, z.core.$ZodTypeInternals<import("../../kernel/fields.js").Field, unknown>>;
|
|
16
|
+
value: z.ZodUnknown;
|
|
17
|
+
set: z.ZodBoolean;
|
|
18
|
+
yours: z.ZodUnknown;
|
|
19
|
+
yoursSet: z.ZodBoolean;
|
|
20
|
+
inProject: z.ZodOptional<z.ZodUnknown>;
|
|
21
|
+
default: z.ZodOptional<z.ZodUnknown>;
|
|
22
|
+
locked: z.ZodBoolean;
|
|
23
|
+
}, z.core.$strip>;
|
|
24
|
+
export type SettingRow = z.output<typeof SettingRowSchema>;
|
|
25
|
+
export declare const SettingsListSchema: z.ZodObject<{
|
|
26
|
+
scope: z.ZodEnum<{
|
|
27
|
+
project: "project";
|
|
28
|
+
user: "user";
|
|
29
|
+
}>;
|
|
30
|
+
file: z.ZodString;
|
|
31
|
+
exists: z.ZodBoolean;
|
|
32
|
+
dataFolder: z.ZodOptional<z.ZodString>;
|
|
33
|
+
categories: z.ZodArray<z.ZodObject<{
|
|
34
|
+
id: z.ZodString;
|
|
35
|
+
label: z.ZodString;
|
|
36
|
+
description: z.ZodString;
|
|
37
|
+
}, z.core.$strip>>;
|
|
38
|
+
rows: z.ZodArray<z.ZodObject<{
|
|
39
|
+
id: z.ZodString;
|
|
40
|
+
key: z.ZodArray<z.ZodString>;
|
|
41
|
+
label: z.ZodString;
|
|
42
|
+
category: z.ZodString;
|
|
43
|
+
section: z.ZodOptional<z.ZodString>;
|
|
44
|
+
field: z.ZodType<import("../../kernel/fields.js").Field, unknown, z.core.$ZodTypeInternals<import("../../kernel/fields.js").Field, unknown>>;
|
|
45
|
+
value: z.ZodUnknown;
|
|
46
|
+
set: z.ZodBoolean;
|
|
47
|
+
yours: z.ZodUnknown;
|
|
48
|
+
yoursSet: z.ZodBoolean;
|
|
49
|
+
inProject: z.ZodOptional<z.ZodUnknown>;
|
|
50
|
+
default: z.ZodOptional<z.ZodUnknown>;
|
|
51
|
+
locked: z.ZodBoolean;
|
|
52
|
+
}, z.core.$strip>>;
|
|
53
|
+
}, z.core.$strip>;
|
|
54
|
+
export type SettingsList = z.output<typeof SettingsListSchema>;
|
|
55
|
+
export declare const listSettings: import("../../kernel/define.js").QueryDef<z.ZodObject<{
|
|
56
|
+
scope: z.ZodDefault<z.ZodEnum<{
|
|
57
|
+
project: "project";
|
|
58
|
+
user: "user";
|
|
59
|
+
}>>;
|
|
60
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
61
|
+
scope: z.ZodEnum<{
|
|
62
|
+
project: "project";
|
|
63
|
+
user: "user";
|
|
64
|
+
}>;
|
|
65
|
+
file: z.ZodString;
|
|
66
|
+
exists: z.ZodBoolean;
|
|
67
|
+
dataFolder: z.ZodOptional<z.ZodString>;
|
|
68
|
+
categories: z.ZodArray<z.ZodObject<{
|
|
69
|
+
id: z.ZodString;
|
|
70
|
+
label: z.ZodString;
|
|
71
|
+
description: z.ZodString;
|
|
72
|
+
}, z.core.$strip>>;
|
|
73
|
+
rows: z.ZodArray<z.ZodObject<{
|
|
74
|
+
id: z.ZodString;
|
|
75
|
+
key: z.ZodArray<z.ZodString>;
|
|
76
|
+
label: z.ZodString;
|
|
77
|
+
category: z.ZodString;
|
|
78
|
+
section: z.ZodOptional<z.ZodString>;
|
|
79
|
+
field: z.ZodType<import("../../kernel/fields.js").Field, unknown, z.core.$ZodTypeInternals<import("../../kernel/fields.js").Field, unknown>>;
|
|
80
|
+
value: z.ZodUnknown;
|
|
81
|
+
set: z.ZodBoolean;
|
|
82
|
+
yours: z.ZodUnknown;
|
|
83
|
+
yoursSet: z.ZodBoolean;
|
|
84
|
+
inProject: z.ZodOptional<z.ZodUnknown>;
|
|
85
|
+
default: z.ZodOptional<z.ZodUnknown>;
|
|
86
|
+
locked: z.ZodBoolean;
|
|
87
|
+
}, z.core.$strip>>;
|
|
88
|
+
}, z.core.$strip>, "settings.list">;
|
|
89
|
+
export declare const getSetting: import("../../kernel/define.js").QueryDef<z.ZodObject<{
|
|
90
|
+
key: z.ZodString;
|
|
91
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
92
|
+
key: z.ZodString;
|
|
93
|
+
value: z.ZodUnknown;
|
|
94
|
+
}, z.core.$strip>, "settings.get">;
|
|
95
|
+
export declare const setSetting: import("../../kernel/define.js").OperationDef<z.ZodObject<{
|
|
96
|
+
scope: z.ZodDefault<z.ZodEnum<{
|
|
97
|
+
project: "project";
|
|
98
|
+
user: "user";
|
|
99
|
+
}>>;
|
|
100
|
+
key: z.ZodString;
|
|
101
|
+
value: z.ZodUnknown;
|
|
102
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
103
|
+
key: z.ZodString;
|
|
104
|
+
changed: z.ZodBoolean;
|
|
105
|
+
message: z.ZodString;
|
|
106
|
+
}, z.core.$strip>, "settings.set">;
|
|
107
|
+
export declare const resetSetting: import("../../kernel/define.js").OperationDef<z.ZodObject<{
|
|
108
|
+
scope: z.ZodDefault<z.ZodEnum<{
|
|
109
|
+
project: "project";
|
|
110
|
+
user: "user";
|
|
111
|
+
}>>;
|
|
112
|
+
key: z.ZodString;
|
|
113
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
114
|
+
key: z.ZodString;
|
|
115
|
+
changed: z.ZodBoolean;
|
|
116
|
+
message: z.ZodString;
|
|
117
|
+
}, z.core.$strip>, "settings.reset">;
|
|
118
|
+
/** The settings page of one scope: a section per category, each setting with its value and an edit action. */
|
|
119
|
+
export declare function settingsPage(o: SettingsList): Page;
|
|
120
|
+
export declare const settingsView: import("../../kernel/define.js").ViewDef<{
|
|
121
|
+
settings: import("../../kernel/define.js").QueryDef<z.ZodObject<{
|
|
122
|
+
scope: z.ZodDefault<z.ZodEnum<{
|
|
123
|
+
project: "project";
|
|
124
|
+
user: "user";
|
|
125
|
+
}>>;
|
|
126
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
127
|
+
scope: z.ZodEnum<{
|
|
128
|
+
project: "project";
|
|
129
|
+
user: "user";
|
|
130
|
+
}>;
|
|
131
|
+
file: z.ZodString;
|
|
132
|
+
exists: z.ZodBoolean;
|
|
133
|
+
dataFolder: z.ZodOptional<z.ZodString>;
|
|
134
|
+
categories: z.ZodArray<z.ZodObject<{
|
|
135
|
+
id: z.ZodString;
|
|
136
|
+
label: z.ZodString;
|
|
137
|
+
description: z.ZodString;
|
|
138
|
+
}, z.core.$strip>>;
|
|
139
|
+
rows: z.ZodArray<z.ZodObject<{
|
|
140
|
+
id: z.ZodString;
|
|
141
|
+
key: z.ZodArray<z.ZodString>;
|
|
142
|
+
label: z.ZodString;
|
|
143
|
+
category: z.ZodString;
|
|
144
|
+
section: z.ZodOptional<z.ZodString>;
|
|
145
|
+
field: z.ZodType<import("../../kernel/fields.js").Field, unknown, z.core.$ZodTypeInternals<import("../../kernel/fields.js").Field, unknown>>;
|
|
146
|
+
value: z.ZodUnknown;
|
|
147
|
+
set: z.ZodBoolean;
|
|
148
|
+
yours: z.ZodUnknown;
|
|
149
|
+
yoursSet: z.ZodBoolean;
|
|
150
|
+
inProject: z.ZodOptional<z.ZodUnknown>;
|
|
151
|
+
default: z.ZodOptional<z.ZodUnknown>;
|
|
152
|
+
locked: z.ZodBoolean;
|
|
153
|
+
}, z.core.$strip>>;
|
|
154
|
+
}, z.core.$strip>, "settings.list">;
|
|
155
|
+
}, {
|
|
156
|
+
scope: Scope;
|
|
157
|
+
}, "settings">;
|