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
|
@@ -1,116 +1,86 @@
|
|
|
1
|
-
//
|
|
2
|
-
// searchable, with each value, its default and its description.
|
|
3
|
-
//
|
|
1
|
+
// Section 5: every setting, for all projects or just this project (two scopes), grouped into categories on the left and
|
|
2
|
+
// searchable, with each value, its default and its description. The rows (which settings, their values, secrets as
|
|
3
|
+
// ***) are the settings feature's; this page lays the unsaved changes over them: changes are staged in the Draft
|
|
4
|
+
// (marked *) and written with Ctrl+S; Enter edits, r resets to the default, z undoes an unsaved change.
|
|
4
5
|
import _ from 'lodash';
|
|
5
|
-
import {
|
|
6
|
+
import { CATEGORIES, labelOf, nameOf, settingRow, settingsOf, } from '../../../app/features/settings/index.js';
|
|
7
|
+
import { valueText } from '../../../app/kernel/index.js';
|
|
6
8
|
import { errMsg } from '../../../core/util/index.js';
|
|
7
9
|
import { Text, Theme, } from '../../tui/index.js';
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
+
import { dataFolderRow, DataFolderFlow } from '../data-folder.js';
|
|
11
|
+
import { EXPORT_SETTINGS, IMPORT_SETTINGS, ShareSettingsFlow, shareSettingsRows } from '../share-settings.js';
|
|
12
|
+
import { VpnLoginFlow, vpnLoginRow, VPN_LOGIN } from '../vpn-login.js';
|
|
10
13
|
import { ValueEditor } from '../settings/value-editor.js';
|
|
11
14
|
import { SCOPES, scopeStatus } from './scopes.js';
|
|
12
15
|
import { ListPage } from './list-page.js';
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
category: category.id,
|
|
26
|
-
section: several && category.id !== 'general' ? nameOf(top) : undefined,
|
|
27
|
-
},
|
|
28
|
-
];
|
|
29
|
-
return node.leaves([top]).map(({ key, node: leaf }) => {
|
|
30
|
-
const heading = [
|
|
31
|
-
several ? nameOf(top) : undefined,
|
|
32
|
-
key.length > 2 ? key.slice(1, -1).map(nameOf).join(' › ') : undefined,
|
|
33
|
-
]
|
|
34
|
-
.filter(Boolean)
|
|
35
|
-
.join(' › ');
|
|
36
|
-
return { key, node: leaf, category: category.id, section: heading || undefined };
|
|
37
|
-
});
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
/** What the file will say for a setting once the staged changes are saved (undefined = not set there). */
|
|
41
|
-
function written(file, draft, key) {
|
|
42
|
-
return draft.has(file, key) ? draft.value(file, key) : file.valueInFile(key);
|
|
43
|
-
}
|
|
44
|
-
/** What is in effect for a setting once the staged changes are saved. */
|
|
45
|
-
function effective(file, draft, key, config) {
|
|
46
|
-
if (file.isProject)
|
|
47
|
-
return written(file, draft, key);
|
|
48
|
-
return draft.has(file, key) ? (draft.value(file, key) ?? file.defaultOf(key)) : _.get(config, key);
|
|
16
|
+
export { settingsOf };
|
|
17
|
+
/** The files with the menu's unsaved changes laid over them. */
|
|
18
|
+
function draftSource(draft) {
|
|
19
|
+
const written = (file, key) => draft.has(file, key) ? draft.value(file, key) : file.valueInFile(key);
|
|
20
|
+
return {
|
|
21
|
+
written,
|
|
22
|
+
effective: (file, key, config) => file.isProject
|
|
23
|
+
? written(file, key)
|
|
24
|
+
: draft.has(file, key)
|
|
25
|
+
? (draft.value(file, key) ?? file.defaultOf(key))
|
|
26
|
+
: _.get(config, key),
|
|
27
|
+
};
|
|
49
28
|
}
|
|
50
|
-
/**
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
'
|
|
54
|
-
'sandbox.headless': 'Hide the sandbox window',
|
|
55
|
-
'sandbox.memoryMb': 'Memory (MB)',
|
|
56
|
-
'sandbox.pageFileMb': 'Swap file (MB)',
|
|
57
|
-
'network.dns': 'DNS servers',
|
|
58
|
-
'projects.wsbShare': 'Add folders while the sandbox runs',
|
|
59
|
-
'projects.all': 'Map all known projects at start',
|
|
60
|
-
'claudeProfile.hostDir': 'Claude folder on this PC',
|
|
61
|
-
'claudeProfile.globalStateFile': 'Claude state file on this PC',
|
|
62
|
-
};
|
|
63
|
-
function labelOf(key) {
|
|
64
|
-
return LABELS[key.join('.')] ?? Text.humanize(key[key.length - 1]);
|
|
29
|
+
/** A value of a row in one short line, painted like every value in the menu. */
|
|
30
|
+
function shown(row, value, max = 60) {
|
|
31
|
+
const v = valueText(value, row.field, max);
|
|
32
|
+
return v.tone === 'ok' ? Theme.ok(v.text) : v.tone === 'muted' ? Theme.muted(v.text) : v.text;
|
|
65
33
|
}
|
|
66
|
-
function item(
|
|
67
|
-
const
|
|
68
|
-
const id = s.key.join('.');
|
|
69
|
-
const set = written(file, draft, s.key) !== undefined;
|
|
70
|
-
const unsaved = draft.has(file, s.key);
|
|
71
|
-
const yours = effective(files.user, draft, s.key, config);
|
|
72
|
-
const project = files.project;
|
|
73
|
-
const inProject = project.schema.leaves().some((l) => l.key.join('.') === id)
|
|
74
|
-
? written(project, draft, s.key)
|
|
75
|
-
: undefined;
|
|
34
|
+
function item(row, file, draft) {
|
|
35
|
+
const unsaved = draft.has(file, row.key);
|
|
76
36
|
const paint = file.isProject ? Theme.project : Theme.changed;
|
|
77
|
-
const value = file.isProject && !set
|
|
78
|
-
? Theme.muted('all projects: ') + formatValue(yours, 40)
|
|
79
|
-
: formatValue(effective(file, draft, s.key, config));
|
|
37
|
+
const value = file.isProject && !row.set ? Theme.muted('all projects: ') + shown(row, row.yours, 40) : shown(row, row.value);
|
|
80
38
|
const details = [
|
|
81
|
-
Theme.muted('Setting ') + id,
|
|
39
|
+
Theme.muted('Setting ') + row.id,
|
|
82
40
|
Theme.muted('All projects ') +
|
|
83
|
-
|
|
84
|
-
Theme.muted(
|
|
41
|
+
shown(row, row.yours, 40) +
|
|
42
|
+
Theme.muted(row.yoursSet ? ' (your file)' : ' (built-in default)'),
|
|
85
43
|
Theme.muted('This project ') +
|
|
86
|
-
(inProject === undefined ? Theme.muted('not set') : Theme.project(Text.strip(
|
|
87
|
-
...(!file.isProject ? [Theme.muted('Default ') +
|
|
44
|
+
(row.inProject === undefined ? Theme.muted('not set') : Theme.project(Text.strip(shown(row, row.inProject, 40)))),
|
|
45
|
+
...(!file.isProject ? [Theme.muted('Default ') + shown(row, row.default, 40)] : []),
|
|
88
46
|
...(unsaved ? [Theme.warn('Unsaved: Ctrl+S saves, z undoes this change.')] : []),
|
|
89
|
-
...(file.isProject &&
|
|
47
|
+
...(file.isProject && row.locked
|
|
90
48
|
? [Theme.warn(Theme.glyph.lock + ' A project can only make this stricter than your own setting.')]
|
|
91
49
|
: []),
|
|
92
50
|
];
|
|
93
51
|
return {
|
|
94
|
-
value: id,
|
|
95
|
-
label:
|
|
52
|
+
value: row.id,
|
|
53
|
+
label: row.label,
|
|
96
54
|
hint: unsaved
|
|
97
55
|
? paint(Text.strip(value)) + ' ' + Theme.warn('*')
|
|
98
|
-
: set
|
|
56
|
+
: row.set
|
|
99
57
|
? paint(Text.strip(value)) + ' ' + paint(Theme.glyph.changed)
|
|
100
58
|
: value,
|
|
101
|
-
description:
|
|
59
|
+
description: row.field.help,
|
|
102
60
|
details,
|
|
103
|
-
section:
|
|
104
|
-
category:
|
|
105
|
-
keywords: id,
|
|
106
|
-
flip:
|
|
61
|
+
section: row.section,
|
|
62
|
+
category: row.category,
|
|
63
|
+
keywords: row.id,
|
|
64
|
+
flip: row.field.kind === 'boolean',
|
|
107
65
|
};
|
|
108
66
|
}
|
|
109
|
-
/**
|
|
110
|
-
|
|
67
|
+
/** What a setting is now for editing: the staged value, else the file's (a project), else what is in effect. */
|
|
68
|
+
function current(file, draft, key, config) {
|
|
69
|
+
const source = draftSource(draft);
|
|
70
|
+
return file.isProject ? (source.written(file, key) ?? _.get(config, key)) : source.effective(file, key, config);
|
|
71
|
+
}
|
|
72
|
+
/** The row in General that opens the data folder flow (your own settings only). */
|
|
73
|
+
export const DATA_FOLDER = '@data-folder';
|
|
74
|
+
/** The list for the settings section. Pure (reads the files it is given). `extra` are rows that are not settings. */
|
|
75
|
+
export function settingsOptions(files, scope, draft, extra = []) {
|
|
111
76
|
const file = files[scope];
|
|
112
|
-
const config =
|
|
113
|
-
|
|
77
|
+
const config = files.user.userConfig();
|
|
78
|
+
// The Data folder row stands in for the storage folder setting (changing it moves the data, which is asked about).
|
|
79
|
+
const hideRoot = !file.isProject && extra.some((e) => e.value === DATA_FOLDER);
|
|
80
|
+
const settings = settingsOf(file).filter((s) => !(hideRoot && s.key.join('.') === 'storage.root'));
|
|
81
|
+
const rows = settings.map((s) => settingRow(s, files, scope, draftSource(draft), config));
|
|
82
|
+
const set = new Set(rows.filter((r) => r.set).map((r) => r.id));
|
|
83
|
+
const unsaved = new Set(rows.filter((r) => draft.has(file, r.key)).map((r) => r.id));
|
|
114
84
|
const categories = CATEGORIES.filter((c) => settings.some((s) => s.category === c.id)).map((c) => ({
|
|
115
85
|
id: c.id,
|
|
116
86
|
label: c.label,
|
|
@@ -120,27 +90,32 @@ export function settingsOptions(files, scope, draft) {
|
|
|
120
90
|
path: [],
|
|
121
91
|
status: scopeStatus(file),
|
|
122
92
|
tabs: { items: SCOPES.map((x) => x.tab), active: SCOPES.findIndex((x) => x.scope === scope) },
|
|
123
|
-
items:
|
|
93
|
+
items: [...rows.map((r) => item(r, file, draft)), ...(file.isProject ? [] : extra)],
|
|
124
94
|
categories,
|
|
125
95
|
actions: [
|
|
126
|
-
{ key: 'r', label: file.isProject ? 'remove' : 'reset' },
|
|
127
|
-
{ key: 'z', label: 'undo' },
|
|
96
|
+
{ key: 'r', label: file.isProject ? 'remove' : 'reset to default', applies: (id) => set.has(id) },
|
|
97
|
+
{ key: 'z', label: 'undo', applies: (id) => unsaved.has(id) },
|
|
128
98
|
],
|
|
129
|
-
enterLabel:
|
|
130
|
-
|
|
99
|
+
enterLabel: (_category, id) => id === DATA_FOLDER || id === VPN_LOGIN
|
|
100
|
+
? 'change'
|
|
101
|
+
: id === EXPORT_SETTINGS || id === IMPORT_SETTINGS
|
|
102
|
+
? 'open'
|
|
103
|
+
: 'edit',
|
|
131
104
|
};
|
|
132
105
|
}
|
|
133
106
|
export class SettingsPage extends ListPage {
|
|
134
107
|
files;
|
|
135
108
|
draft;
|
|
109
|
+
ctx;
|
|
136
110
|
label = 'Settings';
|
|
137
111
|
stages = true;
|
|
138
112
|
scope = 'user';
|
|
139
113
|
editor;
|
|
140
|
-
constructor(app, files, draft) {
|
|
114
|
+
constructor(app, files, draft, ctx) {
|
|
141
115
|
super(app);
|
|
142
116
|
this.files = files;
|
|
143
117
|
this.draft = draft;
|
|
118
|
+
this.ctx = ctx;
|
|
144
119
|
this.editor = new ValueEditor(app, {
|
|
145
120
|
suggestions: (key) => ['defaultHarness', 'harness'].includes(key.join('.'))
|
|
146
121
|
? Object.keys(this.files.user.userConfig().harnesses)
|
|
@@ -154,7 +129,12 @@ export class SettingsPage extends ListPage {
|
|
|
154
129
|
return Promise.resolve();
|
|
155
130
|
}
|
|
156
131
|
options() {
|
|
157
|
-
|
|
132
|
+
const row = dataFolderRow(this.ctx);
|
|
133
|
+
return settingsOptions(this.files, this.scope, this.draft, [
|
|
134
|
+
{ value: DATA_FOLDER, category: 'general', ...row },
|
|
135
|
+
{ value: VPN_LOGIN, category: 'network', ...vpnLoginRow(this.ctx) },
|
|
136
|
+
...shareSettingsRows().map((r) => ({ ...r, category: 'general' })),
|
|
137
|
+
]);
|
|
158
138
|
}
|
|
159
139
|
/** Stages a value; your own file never keeps a line that only repeats the default. */
|
|
160
140
|
stage(key, value) {
|
|
@@ -176,6 +156,24 @@ export class SettingsPage extends ListPage {
|
|
|
176
156
|
return {};
|
|
177
157
|
if (result.value === undefined)
|
|
178
158
|
return {};
|
|
159
|
+
if (result.value === DATA_FOLDER) {
|
|
160
|
+
if (result.kind !== 'pick')
|
|
161
|
+
return {};
|
|
162
|
+
const exit = await new DataFolderFlow(this.app, this.ctx).run();
|
|
163
|
+
return exit ? { exit } : { reload: true };
|
|
164
|
+
}
|
|
165
|
+
if (result.value === EXPORT_SETTINGS || result.value === IMPORT_SETTINGS) {
|
|
166
|
+
if (result.kind !== 'pick')
|
|
167
|
+
return {};
|
|
168
|
+
const flow = new ShareSettingsFlow(this.app, this.ctx);
|
|
169
|
+
const notice = await (result.value === EXPORT_SETTINGS ? flow.export() : flow.import());
|
|
170
|
+
return { reload: true, notice };
|
|
171
|
+
}
|
|
172
|
+
if (result.value === VPN_LOGIN) {
|
|
173
|
+
if (result.kind !== 'pick')
|
|
174
|
+
return {};
|
|
175
|
+
return { reload: true, notice: await new VpnLoginFlow(this.app, this.ctx).run() };
|
|
176
|
+
}
|
|
179
177
|
const setting = settingsOf(this.file).find((s) => s.key.join('.') === result.value);
|
|
180
178
|
if (!setting)
|
|
181
179
|
return {};
|
|
@@ -187,15 +185,10 @@ export class SettingsPage extends ListPage {
|
|
|
187
185
|
this.stage(setting.key, undefined);
|
|
188
186
|
return {};
|
|
189
187
|
}
|
|
190
|
-
if (result.value === 'apps.install')
|
|
191
|
-
return { notice: Theme.muted('Choose apps on the Apps tab (press 4); the list is picked there, not typed.') };
|
|
192
188
|
try {
|
|
193
|
-
const
|
|
194
|
-
const current = this.file.isProject
|
|
195
|
-
? (written(this.file, this.draft, setting.key) ?? _.get(config, setting.key))
|
|
196
|
-
: effective(this.file, this.draft, setting.key, config);
|
|
189
|
+
const now = current(this.file, this.draft, setting.key, this.file.userConfig());
|
|
197
190
|
const path = ['Settings', ...setting.key.slice(0, -1).map(nameOf), labelOf(setting.key)];
|
|
198
|
-
const edited = await this.editor.edit(path, setting.key, setting.node,
|
|
191
|
+
const edited = await this.editor.edit(path, setting.key, setting.node, now);
|
|
199
192
|
if (edited)
|
|
200
193
|
this.stage(setting.key, edited.value);
|
|
201
194
|
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Action, Page } from '../../app/kernel/index.js';
|
|
2
|
+
import { type ListAction, type ListItem, type ListResult } from '../tui/index.js';
|
|
3
|
+
/** The row that stands for the empty state. */
|
|
4
|
+
export declare const EMPTY_ROW = "@empty";
|
|
5
|
+
/** What the list returned, as the page means it. */
|
|
6
|
+
export type Chosen = {
|
|
7
|
+
readonly kind: 'refresh';
|
|
8
|
+
} | {
|
|
9
|
+
readonly kind: 'action';
|
|
10
|
+
readonly action: Action;
|
|
11
|
+
};
|
|
12
|
+
export interface MenuView {
|
|
13
|
+
readonly items: ListItem<string>[];
|
|
14
|
+
readonly actions: ListAction<string>[];
|
|
15
|
+
/** What Enter does on a row ("" = it only shows information). */
|
|
16
|
+
enterLabel(category: string | undefined, id: string | undefined): string;
|
|
17
|
+
resolve(result: ListResult<string>): Chosen | undefined;
|
|
18
|
+
}
|
|
19
|
+
export interface MenuViewOptions {
|
|
20
|
+
/** Every row goes in this category (a view that is one category of a page). */
|
|
21
|
+
readonly category?: string;
|
|
22
|
+
/** Put before every row's value, so the rows cannot clash with the page's own rows. */
|
|
23
|
+
readonly prefix?: string;
|
|
24
|
+
/** Offer l to load the data again (default: yes). */
|
|
25
|
+
readonly refresh?: boolean;
|
|
26
|
+
}
|
|
27
|
+
/** The menu's rows, keys and Enter labels for a page. */
|
|
28
|
+
export declare function menuView(page: Page, o?: MenuViewOptions): MenuView;
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { pageHasContent } from '../../app/kernel/index.js';
|
|
2
|
+
import { safeText } from '../../core/util/index.js';
|
|
3
|
+
import { Theme } from '../tui/index.js';
|
|
4
|
+
/** The row that stands for the empty state. */
|
|
5
|
+
export const EMPTY_ROW = '@empty';
|
|
6
|
+
const FACT = 'fact:';
|
|
7
|
+
const ACTION = 'action:';
|
|
8
|
+
const REFRESH_KEY = 'l';
|
|
9
|
+
const PAINT = {
|
|
10
|
+
ok: Theme.ok,
|
|
11
|
+
warn: Theme.warn,
|
|
12
|
+
danger: Theme.error,
|
|
13
|
+
muted: Theme.muted,
|
|
14
|
+
accent: Theme.accent,
|
|
15
|
+
};
|
|
16
|
+
const paint = (text, tone) => text === undefined ? undefined : tone ? PAINT[tone](safeText(text)) : safeText(text);
|
|
17
|
+
/** The menu's rows, keys and Enter labels for a page. */
|
|
18
|
+
export function menuView(page, o = {}) {
|
|
19
|
+
const category = o.category ? { category: o.category } : {};
|
|
20
|
+
const prefix = o.prefix ?? '';
|
|
21
|
+
const items = [];
|
|
22
|
+
/** The action Enter runs, by row. */
|
|
23
|
+
const enter = new Map();
|
|
24
|
+
/** Key actions that apply to one row, by row. */
|
|
25
|
+
const keyed = new Map();
|
|
26
|
+
/** Key actions that apply everywhere. */
|
|
27
|
+
const everywhere = [...(page.actions ?? [])];
|
|
28
|
+
if (!pageHasContent(page) && page.empty) {
|
|
29
|
+
const e = page.empty;
|
|
30
|
+
items.push({
|
|
31
|
+
value: prefix + EMPTY_ROW,
|
|
32
|
+
label: e.action?.label ?? e.text,
|
|
33
|
+
section: e.title,
|
|
34
|
+
description: e.text,
|
|
35
|
+
...category,
|
|
36
|
+
});
|
|
37
|
+
if (e.action)
|
|
38
|
+
enter.set(prefix + EMPTY_ROW, e.action);
|
|
39
|
+
}
|
|
40
|
+
for (const section of page.sections) {
|
|
41
|
+
const heading = section.title ?? page.title;
|
|
42
|
+
for (const f of section.facts ?? [])
|
|
43
|
+
items.push({
|
|
44
|
+
value: prefix + FACT + f.id,
|
|
45
|
+
label: f.label,
|
|
46
|
+
hint: paint(f.value, f.tone),
|
|
47
|
+
description: f.description,
|
|
48
|
+
details: f.details?.map(safeText),
|
|
49
|
+
section: heading,
|
|
50
|
+
...category,
|
|
51
|
+
});
|
|
52
|
+
for (const item of section.items ?? []) {
|
|
53
|
+
const id = prefix + item.id;
|
|
54
|
+
items.push({
|
|
55
|
+
value: id,
|
|
56
|
+
label: safeText(item.label),
|
|
57
|
+
hint: paint(item.hint, item.tone),
|
|
58
|
+
description: item.description,
|
|
59
|
+
details: item.details?.map(safeText),
|
|
60
|
+
section: item.group ?? heading,
|
|
61
|
+
keywords: item.keywords,
|
|
62
|
+
...(item.disabled ? { disabled: item.disabled } : {}),
|
|
63
|
+
...category,
|
|
64
|
+
});
|
|
65
|
+
if (item.primary && !item.disabled)
|
|
66
|
+
enter.set(id, item.primary);
|
|
67
|
+
if (item.actions?.length)
|
|
68
|
+
keyed.set(id, [...item.actions]);
|
|
69
|
+
}
|
|
70
|
+
(section.actions ?? []).forEach((a, i) => {
|
|
71
|
+
const id = prefix + ACTION + section.id + ':' + i;
|
|
72
|
+
items.push({ value: id, label: a.label, hint: '', description: a.description, section: 'Actions', ...category });
|
|
73
|
+
enter.set(id, a);
|
|
74
|
+
everywhere.push(a);
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
const keys = [];
|
|
78
|
+
const addKey = (a, applies) => {
|
|
79
|
+
if (!a.key || keys.some((k) => k.key === a.key && k.label === (a.verb ?? a.label)))
|
|
80
|
+
return;
|
|
81
|
+
keys.push({ key: a.key, label: a.verb ?? a.label, importance: a.importance ?? 2, ...(applies ? { applies } : {}) });
|
|
82
|
+
};
|
|
83
|
+
for (const a of everywhere)
|
|
84
|
+
addKey(a);
|
|
85
|
+
for (const list of keyed.values())
|
|
86
|
+
for (const a of list)
|
|
87
|
+
addKey(a, (row) => keyed.get(row)?.some((x) => x.key === a.key) ?? false);
|
|
88
|
+
if (o.refresh !== false)
|
|
89
|
+
keys.push({ key: REFRESH_KEY, label: 'refresh', importance: 3 });
|
|
90
|
+
return {
|
|
91
|
+
items,
|
|
92
|
+
actions: keys,
|
|
93
|
+
enterLabel: (_category, id) => {
|
|
94
|
+
const a = id === undefined ? undefined : enter.get(id);
|
|
95
|
+
return a ? (a.verb ?? a.label.toLowerCase()) : '';
|
|
96
|
+
},
|
|
97
|
+
resolve: (result) => {
|
|
98
|
+
if (result.kind === 'pick') {
|
|
99
|
+
const a = enter.get(result.value);
|
|
100
|
+
return a ? { kind: 'action', action: a } : undefined;
|
|
101
|
+
}
|
|
102
|
+
if (result.kind !== 'action')
|
|
103
|
+
return undefined;
|
|
104
|
+
if (result.key === REFRESH_KEY && o.refresh !== false)
|
|
105
|
+
return { kind: 'refresh' };
|
|
106
|
+
const own = result.value === undefined ? undefined : keyed.get(result.value)?.find((a) => a.key === result.key);
|
|
107
|
+
const shared = everywhere.find((a) => a.key === result.key);
|
|
108
|
+
const a = own ?? shared;
|
|
109
|
+
return a ? { kind: 'action', action: a } : undefined;
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { PathKind } from '../../../app/kernel/index.js';
|
|
2
|
+
import type { App } from '../../tui/index.js';
|
|
3
|
+
export interface AskPathOptions {
|
|
4
|
+
readonly path: string[];
|
|
5
|
+
readonly title: string;
|
|
6
|
+
readonly about?: string[];
|
|
7
|
+
readonly kind: PathKind;
|
|
8
|
+
readonly initial?: string;
|
|
9
|
+
readonly literals?: readonly string[];
|
|
10
|
+
/** true = fine, a string = what is wrong (shown under the path). */
|
|
11
|
+
readonly validate?: (path: string) => true | string;
|
|
12
|
+
}
|
|
13
|
+
/** Picks a folder or file in the path picker; typing a path (or an allowed word) still works. */
|
|
14
|
+
export declare function askPath(app: App, o: AskPathOptions): Promise<string | undefined>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** Picks a folder or file in the path picker; typing a path (or an allowed word) still works. */
|
|
2
|
+
export function askPath(app, o) {
|
|
3
|
+
return app.pickPath({
|
|
4
|
+
path: o.path,
|
|
5
|
+
title: o.title,
|
|
6
|
+
about: o.about,
|
|
7
|
+
initial: o.initial,
|
|
8
|
+
files: o.kind === 'file',
|
|
9
|
+
use: o.kind === 'file' ? 'use this file' : 'use this folder',
|
|
10
|
+
literals: o.literals,
|
|
11
|
+
relative: true,
|
|
12
|
+
validate: o.validate,
|
|
13
|
+
});
|
|
14
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type App, type ListItem } from '../../../tui/index.js';
|
|
2
|
-
import {
|
|
2
|
+
import type { SchemaNode } from '../../../../app/kernel/index.js';
|
|
3
3
|
import type { ValueEditor, Edited } from '../value-editor.js';
|
|
4
4
|
/**
|
|
5
5
|
* The shared shape of the list and map editors: a working copy shown as a list with "Add" at the top, Enter to change
|
|
@@ -10,14 +10,20 @@ export declare abstract class CollectionEditor<C> {
|
|
|
10
10
|
protected readonly path: string[];
|
|
11
11
|
protected readonly node: SchemaNode;
|
|
12
12
|
protected readonly editor: ValueEditor;
|
|
13
|
+
/** The setting's key (a list's own, without positions): what the entries are is read from it. */
|
|
14
|
+
protected readonly key: string[];
|
|
13
15
|
protected value: C;
|
|
14
16
|
private original;
|
|
15
|
-
constructor(app: App, path: string[], node: SchemaNode, editor: ValueEditor
|
|
17
|
+
constructor(app: App, path: string[], node: SchemaNode, editor: ValueEditor,
|
|
18
|
+
/** The setting's key (a list's own, without positions): what the entries are is read from it. */
|
|
19
|
+
key?: string[]);
|
|
16
20
|
protected abstract entries(): ListItem<string>[];
|
|
17
21
|
protected abstract add(): Promise<void>;
|
|
18
22
|
protected abstract open(id: string): Promise<void>;
|
|
19
23
|
protected abstract remove(id: string): void;
|
|
20
24
|
protected move?(id: string, by: number): string | undefined;
|
|
21
25
|
protected noun: string;
|
|
26
|
+
/** What leaving with changes does, shown under the list (settings: they wait for Ctrl+S). */
|
|
27
|
+
protected keepNote: string;
|
|
22
28
|
run(start: C): Promise<Edited>;
|
|
23
29
|
}
|
|
@@ -10,15 +10,21 @@ export class CollectionEditor {
|
|
|
10
10
|
path;
|
|
11
11
|
node;
|
|
12
12
|
editor;
|
|
13
|
+
key;
|
|
13
14
|
value;
|
|
14
15
|
original;
|
|
15
|
-
constructor(app, path, node, editor
|
|
16
|
+
constructor(app, path, node, editor,
|
|
17
|
+
/** The setting's key (a list's own, without positions): what the entries are is read from it. */
|
|
18
|
+
key = []) {
|
|
16
19
|
this.app = app;
|
|
17
20
|
this.path = path;
|
|
18
21
|
this.node = node;
|
|
19
22
|
this.editor = editor;
|
|
23
|
+
this.key = key;
|
|
20
24
|
}
|
|
21
25
|
noun = 'entry';
|
|
26
|
+
/** What leaving with changes does, shown under the list (settings: they wait for Ctrl+S). */
|
|
27
|
+
keepNote = 'Esc keeps it for saving with Ctrl+S';
|
|
22
28
|
async run(start) {
|
|
23
29
|
this.original = structuredClone(start);
|
|
24
30
|
this.value = structuredClone(start);
|
|
@@ -29,9 +35,7 @@ export class CollectionEditor {
|
|
|
29
35
|
const picked = await this.app.list({
|
|
30
36
|
path: this.path,
|
|
31
37
|
intro: this.node.description,
|
|
32
|
-
status: dirty
|
|
33
|
-
? Theme.changed(Theme.glyph.changed + ' changed: Esc keeps it for saving with Ctrl+S')
|
|
34
|
-
: undefined,
|
|
38
|
+
status: dirty ? Theme.changed(Theme.glyph.changed + ' changed: ' + this.keepNote) : undefined,
|
|
35
39
|
items: [
|
|
36
40
|
{ value: ADD, label: '+ Add ' + this.noun, section: 'Actions' },
|
|
37
41
|
...entries.map((e) => ({
|
|
@@ -41,11 +45,11 @@ export class CollectionEditor {
|
|
|
41
45
|
],
|
|
42
46
|
startAt: focus,
|
|
43
47
|
actions: [
|
|
44
|
-
{ key: 'd', label: '
|
|
45
|
-
...(this.move
|
|
48
|
+
{ key: 'd', label: 'remove', applies: (id) => id !== ADD },
|
|
49
|
+
...(this.move && entries.length > 1
|
|
46
50
|
? [
|
|
47
|
-
{ key: 'u', label: 'move up' },
|
|
48
|
-
{ key: 'j', label: 'move down' },
|
|
51
|
+
{ key: 'u', label: 'move up', applies: (id) => id !== ADD },
|
|
52
|
+
{ key: 'j', label: 'move down', applies: (id) => id !== ADD },
|
|
49
53
|
]
|
|
50
54
|
: []),
|
|
51
55
|
],
|
|
@@ -4,7 +4,11 @@ import { formatValue } from '../format.js';
|
|
|
4
4
|
export class MapEditor extends CollectionEditor {
|
|
5
5
|
noun = 'variable';
|
|
6
6
|
entries() {
|
|
7
|
-
return Object.entries(this.value).map(([k, v]) => ({
|
|
7
|
+
return Object.entries(this.value).map(([k, v]) => ({
|
|
8
|
+
value: k,
|
|
9
|
+
label: k,
|
|
10
|
+
hint: this.node.element?.secret ? '***' : formatValue(v),
|
|
11
|
+
}));
|
|
8
12
|
}
|
|
9
13
|
async add() {
|
|
10
14
|
const name = await this.app.text({
|
|
@@ -8,12 +8,12 @@ export class ObjectListEditor extends CollectionEditor {
|
|
|
8
8
|
return this.value.map((v, i) => ({ value: String(i), label: summary(v) }));
|
|
9
9
|
}
|
|
10
10
|
async add() {
|
|
11
|
-
const edited = await new ObjectEditor(this.app, [...this.path, 'New'], this.node.element, this.editor).run(this.node.element.initial(), true);
|
|
11
|
+
const edited = await new ObjectEditor(this.app, [...this.path, 'New'], this.node.element, this.editor, this.key).run(this.node.element.initial(), true);
|
|
12
12
|
if (edited)
|
|
13
13
|
this.value.push(edited.value);
|
|
14
14
|
}
|
|
15
15
|
async open(id) {
|
|
16
|
-
const edited = await new ObjectEditor(this.app, [...this.path, summary(this.value[Number(id)])], this.node.element, this.editor).run(this.value[Number(id)]);
|
|
16
|
+
const edited = await new ObjectEditor(this.app, [...this.path, summary(this.value[Number(id)])], this.node.element, this.editor, this.key).run(this.value[Number(id)]);
|
|
17
17
|
if (edited)
|
|
18
18
|
this.value[Number(id)] = edited.value;
|
|
19
19
|
}
|
|
@@ -20,12 +20,12 @@ export class ObjectMapEditor extends CollectionEditor {
|
|
|
20
20
|
});
|
|
21
21
|
if (name === undefined)
|
|
22
22
|
return;
|
|
23
|
-
const edited = await new ObjectEditor(this.app, [...this.path, name], this.node.element, this.editor).run(this.node.element.initial(), true);
|
|
23
|
+
const edited = await new ObjectEditor(this.app, [...this.path, name], this.node.element, this.editor, this.key).run(this.node.element.initial(), true);
|
|
24
24
|
if (edited)
|
|
25
25
|
this.value[name] = edited.value;
|
|
26
26
|
}
|
|
27
27
|
async open(id) {
|
|
28
|
-
const edited = await new ObjectEditor(this.app, [...this.path, id], this.node.element, this.editor).run(this.value[id]);
|
|
28
|
+
const edited = await new ObjectEditor(this.app, [...this.path, id], this.node.element, this.editor, this.key).run(this.value[id]);
|
|
29
29
|
if (edited)
|
|
30
30
|
this.value[id] = edited.value;
|
|
31
31
|
}
|
|
@@ -1,8 +1,17 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { App, ListItem } from '../../../tui/index.js';
|
|
2
2
|
import { CollectionEditor } from './collection-editor.js';
|
|
3
|
+
import type { PathKind, SchemaNode } from '../../../../app/kernel/index.js';
|
|
4
|
+
import type { ValueEditor } from '../value-editor.js';
|
|
3
5
|
/** A list of strings (project roots, scripts, extra packages ...). */
|
|
4
6
|
export declare class StringListEditor extends CollectionEditor<string[]> {
|
|
7
|
+
/** The items are folders or files on this PC: they are picked in the path picker. */
|
|
8
|
+
private readonly pathKind?;
|
|
5
9
|
protected noun: string;
|
|
10
|
+
constructor(app: App, path: string[], node: SchemaNode, editor: ValueEditor, key: string[],
|
|
11
|
+
/** The items are folders or files on this PC: they are picked in the path picker. */
|
|
12
|
+
pathKind?: PathKind | undefined,
|
|
13
|
+
/** What leaving with changes does, when it is not "wait for Ctrl+S". */
|
|
14
|
+
keepNote?: string);
|
|
6
15
|
protected entries(): ListItem<string>[];
|
|
7
16
|
private ask;
|
|
8
17
|
protected add(): Promise<void>;
|
|
@@ -1,13 +1,36 @@
|
|
|
1
1
|
import { Theme } from '../../../tui/index.js';
|
|
2
2
|
import { CollectionEditor } from './collection-editor.js';
|
|
3
|
+
import { askPath } from '../ask-path.js';
|
|
3
4
|
/** A list of strings (project roots, scripts, extra packages ...). */
|
|
4
5
|
export class StringListEditor extends CollectionEditor {
|
|
6
|
+
pathKind;
|
|
5
7
|
noun = 'item';
|
|
8
|
+
constructor(app, path, node, editor, key,
|
|
9
|
+
/** The items are folders or files on this PC: they are picked in the path picker. */
|
|
10
|
+
pathKind,
|
|
11
|
+
/** What leaving with changes does, when it is not "wait for Ctrl+S". */
|
|
12
|
+
keepNote) {
|
|
13
|
+
super(app, path, node, editor, key);
|
|
14
|
+
this.pathKind = pathKind;
|
|
15
|
+
if (pathKind)
|
|
16
|
+
this.noun = pathKind === 'file' ? 'file' : 'folder';
|
|
17
|
+
if (keepNote)
|
|
18
|
+
this.keepNote = keepNote;
|
|
19
|
+
}
|
|
6
20
|
entries() {
|
|
7
21
|
return this.value.map((v, i) => ({ value: String(i), label: v || Theme.muted('(empty)') }));
|
|
8
22
|
}
|
|
9
23
|
async ask(initial) {
|
|
10
24
|
const element = this.node.element;
|
|
25
|
+
if (this.pathKind)
|
|
26
|
+
return askPath(this.app, {
|
|
27
|
+
path: this.path,
|
|
28
|
+
title: this.pathKind === 'file' ? 'Choose a file' : 'Choose a folder',
|
|
29
|
+
about: this.node.description ? [this.node.description] : [],
|
|
30
|
+
kind: this.pathKind,
|
|
31
|
+
initial,
|
|
32
|
+
validate: (v) => element.check(v),
|
|
33
|
+
});
|
|
11
34
|
return this.app.text({
|
|
12
35
|
path: this.path,
|
|
13
36
|
label: 'Value',
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ConfigFile, SettingChange } from '
|
|
1
|
+
import type { ConfigFile, SettingChange } from '../../../app/features/settings/index.js';
|
|
2
2
|
/** What saving did: how many settings were written and why a file was refused. */
|
|
3
3
|
export interface DraftResult {
|
|
4
4
|
readonly saved: number;
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
+
export { choiceLabel, summary } from '../../../app/kernel/index.js';
|
|
1
2
|
/** A value in one short line, for the right-hand column. */
|
|
2
3
|
export declare function formatValue(value: unknown, max?: number): string;
|
|
3
|
-
/** A one-line name for an object in a list (a mapping's folders, an agent's package ...). */
|
|
4
|
-
export declare function summary(value: unknown): string;
|
|
5
|
-
export declare function choiceLabel(v: unknown): string;
|