windows-development-sandbox 1.4.0 → 1.4.3
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/.sandbox-config.example.json +2 -1
- package/config.example.json +4 -1
- package/dist/api.js +27 -16
- package/dist/cli/args.d.ts +4 -6
- package/dist/cli/args.js +67 -34
- package/dist/cli/argv.d.ts +9 -0
- package/dist/cli/argv.js +22 -0
- package/dist/cli/commands/accounts.d.ts +1 -1
- package/dist/cli/commands/accounts.js +42 -27
- package/dist/cli/commands/agent-commands.d.ts +3 -3
- package/dist/cli/commands/agent-commands.js +27 -18
- package/dist/cli/commands/context.d.ts +9 -11
- package/dist/cli/commands/context.js +35 -32
- package/dist/cli/commands/data/clean.d.ts +2 -2
- package/dist/cli/commands/data/clean.js +27 -11
- package/dist/cli/commands/data/collect.d.ts +6 -3
- package/dist/cli/commands/data/collect.js +46 -15
- package/dist/cli/commands/data/index.d.ts +2 -2
- package/dist/cli/commands/data/index.js +30 -12
- package/dist/cli/commands/data/remove.d.ts +1 -1
- package/dist/cli/commands/data/remove.js +4 -4
- package/dist/cli/commands/index.d.ts +5 -4
- package/dist/cli/commands/index.js +5 -4
- package/dist/cli/commands/launch/add-root.d.ts +7 -0
- package/dist/cli/commands/launch/add-root.js +64 -0
- package/dist/cli/commands/launch/boot-progress.d.ts +7 -0
- package/dist/cli/commands/launch/boot-progress.js +48 -0
- package/dist/cli/commands/launch/boot-wants.d.ts +11 -0
- package/dist/cli/commands/launch/boot-wants.js +48 -0
- package/dist/cli/commands/launch/first-start.d.ts +10 -0
- package/dist/cli/commands/launch/first-start.js +53 -0
- package/dist/cli/commands/launch/index.d.ts +6 -0
- package/dist/cli/commands/launch/index.js +6 -0
- package/dist/cli/commands/launch/launch.d.ts +8 -0
- package/dist/cli/commands/launch/launch.js +211 -0
- package/dist/cli/commands/launch/prepare.d.ts +23 -0
- package/dist/cli/commands/launch/prepare.js +109 -0
- package/dist/cli/commands/launch/running.d.ts +45 -0
- package/dist/cli/commands/launch/running.js +218 -0
- package/dist/cli/commands/launch/summary.d.ts +8 -0
- package/dist/cli/commands/launch/summary.js +98 -0
- package/dist/cli/commands/maintenance/audit.d.ts +3 -0
- package/dist/cli/commands/maintenance/audit.js +58 -0
- package/dist/cli/commands/maintenance/clean.d.ts +2 -0
- package/dist/cli/commands/maintenance/clean.js +10 -0
- package/dist/cli/commands/maintenance/config.d.ts +2 -0
- package/dist/cli/commands/maintenance/config.js +145 -0
- package/dist/cli/commands/maintenance/doctor.d.ts +2 -0
- package/dist/cli/commands/maintenance/doctor.js +52 -0
- package/dist/cli/commands/maintenance/host-claude.d.ts +2 -0
- package/dist/cli/commands/maintenance/host-claude.js +4 -0
- package/dist/cli/commands/maintenance/index.d.ts +8 -0
- package/dist/cli/commands/maintenance/index.js +9 -0
- package/dist/cli/commands/maintenance/logs.d.ts +2 -0
- package/dist/cli/commands/maintenance/logs.js +44 -0
- package/dist/cli/commands/maintenance/sync.d.ts +2 -0
- package/dist/cli/commands/maintenance/sync.js +12 -0
- package/dist/cli/commands/maintenance/watch.d.ts +3 -0
- package/dist/cli/commands/maintenance/watch.js +6 -0
- package/dist/cli/commands/projects/describe-sessions.d.ts +3 -0
- package/dist/cli/commands/projects/describe-sessions.js +15 -0
- package/dist/cli/commands/projects/here.d.ts +38 -0
- package/dist/cli/commands/projects/here.js +145 -0
- package/dist/cli/commands/projects/index.d.ts +4 -0
- package/dist/cli/commands/projects/index.js +4 -0
- package/dist/cli/commands/projects/projects.d.ts +14 -0
- package/dist/cli/commands/projects/projects.js +213 -0
- package/dist/cli/commands/projects/restart.d.ts +15 -0
- package/dist/cli/commands/projects/restart.js +149 -0
- package/dist/cli/commands/registry.d.ts +3 -0
- package/dist/cli/commands/registry.js +34 -0
- package/dist/cli/commands/repair/checks.js +105 -29
- package/dist/cli/commands/repair/finders.d.ts +13 -10
- package/dist/cli/commands/repair/finders.js +63 -43
- package/dist/cli/commands/repair/index.d.ts +4 -4
- package/dist/cli/commands/repair/index.js +47 -21
- package/dist/cli/commands/repair/types.d.ts +2 -2
- package/dist/cli/commands/repair/types.js +7 -2
- package/dist/cli/commands/sessions/attach.d.ts +2 -0
- package/dist/cli/commands/sessions/attach.js +45 -0
- package/dist/cli/commands/sessions/control.d.ts +4 -0
- package/dist/cli/commands/sessions/control.js +62 -0
- package/dist/cli/commands/sessions/exec.d.ts +6 -0
- package/dist/cli/commands/sessions/exec.js +72 -0
- package/dist/cli/commands/sessions/index.d.ts +6 -0
- package/dist/cli/commands/sessions/index.js +9 -0
- package/dist/cli/commands/sessions/list.d.ts +15 -0
- package/dist/cli/commands/sessions/list.js +65 -0
- package/dist/cli/commands/sessions/status.d.ts +2 -0
- package/dist/cli/commands/sessions/status.js +153 -0
- package/dist/cli/commands/sessions/window.d.ts +3 -0
- package/dist/cli/commands/sessions/window.js +18 -0
- package/dist/cli/commands/setup/checks.d.ts +4 -4
- package/dist/cli/commands/setup/checks.js +36 -19
- package/dist/cli/commands/setup/facts.d.ts +6 -6
- package/dist/cli/commands/setup/facts.js +23 -11
- package/dist/cli/commands/setup/index.d.ts +1 -1
- package/dist/cli/commands/setup/index.js +25 -12
- package/dist/cli/commands/user-config.d.ts +5 -5
- package/dist/cli/commands/user-config.js +14 -12
- package/dist/cli/history.d.ts +5 -4
- package/dist/cli/history.js +23 -11
- package/dist/cli/index.d.ts +4 -14
- package/dist/cli/index.js +27 -77
- package/dist/cli/manifest.d.ts +464 -10
- package/dist/cli/manifest.js +328 -54
- package/dist/cli/menu/apps.d.ts +7 -5
- package/dist/cli/menu/apps.js +64 -16
- package/dist/cli/menu/command-fields.d.ts +15 -0
- package/dist/cli/menu/command-fields.js +23 -0
- package/dist/cli/menu/command-form.d.ts +3 -5
- package/dist/cli/menu/command-form.js +116 -48
- package/dist/cli/menu/home.d.ts +22 -0
- package/dist/cli/menu/home.js +72 -0
- package/dist/cli/menu/index.d.ts +2 -24
- package/dist/cli/menu/index.js +4 -178
- package/dist/cli/menu/menu.d.ts +23 -0
- package/dist/cli/menu/menu.js +185 -0
- package/dist/cli/menu/settings/categories.d.ts +2 -2
- package/dist/cli/menu/settings/categories.js +123 -20
- package/dist/cli/menu/settings/collections/collection-editor.d.ts +23 -0
- package/dist/cli/menu/settings/collections/collection-editor.js +89 -0
- package/dist/cli/menu/settings/collections/map-editor.d.ts +10 -0
- package/dist/cli/menu/settings/collections/map-editor.js +34 -0
- package/dist/cli/menu/settings/collections/object-list-editor.d.ts +10 -0
- package/dist/cli/menu/settings/collections/object-list-editor.js +23 -0
- package/dist/cli/menu/settings/collections/object-map-editor.d.ts +10 -0
- package/dist/cli/menu/settings/collections/object-map-editor.js +35 -0
- package/dist/cli/menu/settings/collections/string-list-editor.d.ts +12 -0
- package/dist/cli/menu/settings/collections/string-list-editor.js +39 -0
- package/dist/cli/menu/settings/config-file.d.ts +2 -2
- package/dist/cli/menu/settings/config-file.js +42 -19
- package/dist/cli/menu/settings/editor-actions.d.ts +2 -0
- package/dist/cli/menu/settings/editor-actions.js +2 -0
- package/dist/cli/menu/settings/format.d.ts +5 -0
- package/dist/cli/menu/settings/format.js +39 -0
- package/dist/cli/menu/settings/index.d.ts +1 -29
- package/dist/cli/menu/settings/index.js +1 -133
- package/dist/cli/menu/settings/object-editor.d.ts +12 -0
- package/dist/cli/menu/settings/object-editor.js +86 -0
- package/dist/cli/menu/settings/schema-node.d.ts +3 -1
- package/dist/cli/menu/settings/schema-node.js +71 -24
- package/dist/cli/menu/settings/settings-editor.d.ts +30 -0
- package/dist/cli/menu/settings/settings-editor.js +176 -0
- package/dist/cli/menu/settings/{editors.d.ts → value-editor.d.ts} +2 -13
- package/dist/cli/menu/settings/value-editor.js +137 -0
- package/dist/cli/menu/several.d.ts +4 -4
- package/dist/cli/menu/several.js +61 -20
- package/dist/cli/{colors.d.ts → output/colors.d.ts} +8 -8
- package/dist/cli/{colors.js → output/colors.js} +32 -14
- package/dist/cli/output/index.d.ts +3 -0
- package/dist/cli/output/index.js +3 -0
- package/dist/cli/output/print.d.ts +5 -0
- package/dist/cli/output/print.js +14 -0
- package/dist/cli/output/progress.d.ts +24 -0
- package/dist/cli/output/progress.js +124 -0
- package/dist/cli/report.d.ts +2 -0
- package/dist/cli/report.js +20 -0
- package/dist/cli/tui/app.d.ts +6 -16
- package/dist/cli/tui/app.js +28 -8
- package/dist/cli/tui/dialogs/confirm-screen.d.ts +20 -0
- package/dist/cli/tui/dialogs/confirm-screen.js +50 -0
- package/dist/cli/tui/dialogs/message-screen.d.ts +17 -0
- package/dist/cli/tui/dialogs/message-screen.js +55 -0
- package/dist/cli/tui/dialogs/paragraphs.d.ts +2 -0
- package/dist/cli/tui/dialogs/paragraphs.js +5 -0
- package/dist/cli/tui/dialogs/text-screen.d.ts +26 -0
- package/dist/cli/tui/dialogs/text-screen.js +107 -0
- package/dist/cli/tui/frame.js +3 -1
- package/dist/cli/tui/index.d.ts +7 -3
- package/dist/cli/tui/index.js +4 -2
- package/dist/cli/tui/list/list-screen.d.ts +29 -0
- package/dist/cli/tui/{list-screen.js → list/list-screen.js} +86 -23
- package/dist/cli/tui/{list-screen.d.ts → list/list-types.d.ts} +0 -28
- package/dist/cli/tui/screen.d.ts +14 -0
- package/dist/cli/tui/terminal.js +34 -10
- package/dist/cli/tui/text.d.ts +2 -1
- package/dist/cli/tui/text.js +37 -7
- package/dist/cli/tui/theme.js +27 -9
- package/dist/cli/validate.d.ts +8 -8
- package/dist/cli/validate.js +32 -21
- package/dist/core/config/defaults.d.ts +2 -0
- package/dist/core/config/defaults.js +203 -0
- package/dist/core/config/index.d.ts +2 -0
- package/dist/core/config/index.js +3 -0
- package/dist/core/{config.d.ts → config/loader.d.ts} +1 -2
- package/dist/core/config/loader.js +47 -0
- package/dist/core/{detect-databases.js → detect/databases.js} +111 -23
- package/dist/core/detect/index.d.ts +4 -0
- package/dist/core/detect/index.js +4 -0
- package/dist/core/{detect-pwsh.d.ts → detect/pwsh.d.ts} +1 -1
- package/dist/core/{detect-pwsh.js → detect/pwsh.js} +25 -11
- package/dist/core/{detect-toolchains.d.ts → detect/toolchains.d.ts} +1 -1
- package/dist/core/{detect-toolchains.js → detect/toolchains.js} +42 -5
- package/dist/{guest/toolchains → core/detect}/versions.js +28 -12
- package/dist/core/disk.d.ts +2 -0
- package/dist/core/disk.js +46 -3
- package/dist/core/local-config/boot-wants.d.ts +45 -0
- package/dist/core/local-config/boot-wants.js +120 -0
- package/dist/core/local-config/file.d.ts +3 -0
- package/dist/core/local-config/file.js +16 -0
- package/dist/core/local-config/index.d.ts +5 -0
- package/dist/core/local-config/index.js +7 -0
- package/dist/core/{local-config.d.ts → local-config/overrides.d.ts} +11 -11
- package/dist/core/{local-config.js → local-config/overrides.js} +53 -54
- package/dist/core/{project-policy.d.ts → local-config/policy.d.ts} +7 -3
- package/dist/core/{project-policy.js → local-config/policy.js} +16 -6
- package/dist/core/local-config/trust.d.ts +13 -0
- package/dist/core/local-config/trust.js +43 -0
- package/dist/core/package-info.d.ts +4 -0
- package/dist/core/package-info.js +13 -0
- package/dist/core/run/guest-workspace.d.ts +23 -0
- package/dist/core/run/guest-workspace.js +47 -0
- package/dist/core/run/index.d.ts +3 -0
- package/dist/core/run/index.js +3 -0
- package/dist/core/run/resolve-run.d.ts +3 -0
- package/dist/core/run/resolve-run.js +202 -0
- package/dist/core/run/versions.d.ts +13 -0
- package/dist/core/run/versions.js +65 -0
- package/dist/core/safe-paths.js +17 -5
- package/dist/core/schema/apps.d.ts +4 -4
- package/dist/core/schema/apps.js +55 -21
- package/dist/core/schema/common.d.ts +13 -10
- package/dist/core/schema/common.js +16 -10
- package/dist/core/schema/config.d.ts +18 -12
- package/dist/core/schema/config.js +78 -53
- package/dist/core/schema/databases.d.ts +4 -3
- package/dist/core/schema/databases.js +16 -12
- package/dist/core/schema/harness.d.ts +1 -1
- package/dist/core/schema/harness.js +17 -7
- package/dist/core/schema/index.d.ts +6 -0
- package/dist/core/schema/index.js +8 -0
- package/dist/core/schema/json-schema.js +10 -5
- package/dist/core/schema/profile.d.ts +4 -4
- package/dist/core/schema/profile.js +37 -17
- package/dist/core/schema/projects.d.ts +2 -1
- package/dist/core/schema/projects.js +16 -5
- package/dist/core/schema/sandbox.d.ts +12 -12
- package/dist/core/schema/sandbox.js +101 -37
- package/dist/core/schema/toolchains.d.ts +6 -1
- package/dist/core/schema/toolchains.js +84 -34
- package/dist/core/types.d.ts +36 -9
- package/dist/core/util/errors.d.ts +8 -0
- package/dist/core/util/errors.js +14 -0
- package/dist/core/util/fs.d.ts +8 -0
- package/dist/core/util/fs.js +40 -0
- package/dist/core/util/index.d.ts +7 -0
- package/dist/core/util/index.js +7 -0
- package/dist/core/util/jsonc.d.ts +6 -0
- package/dist/core/util/jsonc.js +25 -0
- package/dist/core/util/links.d.ts +10 -0
- package/dist/core/util/links.js +39 -0
- package/dist/core/util/paths.d.ts +7 -0
- package/dist/core/util/paths.js +33 -0
- package/dist/core/util/process.d.ts +15 -0
- package/dist/core/util/process.js +54 -0
- package/dist/core/util/text.d.ts +8 -0
- package/dist/core/util/text.js +8 -0
- package/dist/guest/{setup/agents.js → agents/agent-installer.js} +24 -4
- package/dist/guest/apps/after-install.d.ts +3 -0
- package/dist/guest/apps/after-install.js +47 -0
- package/dist/guest/apps/app-installer.d.ts +22 -0
- package/dist/guest/apps/app-installer.js +116 -0
- package/dist/guest/apps/find-exe.d.ts +5 -0
- package/dist/guest/apps/find-exe.js +41 -0
- package/dist/guest/apps/index.d.ts +3 -10
- package/dist/guest/apps/index.js +6 -206
- package/dist/guest/apps/resolvers.js +37 -9
- package/dist/guest/apps/shortcuts.d.ts +6 -0
- package/dist/guest/apps/shortcuts.js +28 -0
- package/dist/guest/apps/sources.d.ts +4 -0
- package/dist/guest/apps/sources.js +17 -0
- package/dist/guest/apps/unpack.d.ts +3 -0
- package/dist/guest/apps/unpack.js +47 -0
- package/dist/guest/{audit-parse.js → audit/parse.js} +39 -3
- package/dist/guest/{audit.d.ts → audit/process-audit.d.ts} +3 -1
- package/dist/guest/{audit.js → audit/process-audit.js} +33 -8
- package/dist/guest/boot/boot-env.d.ts +4 -0
- package/dist/guest/{boot-env.js → boot/boot-env.js} +7 -5
- package/dist/guest/boot/boot.d.ts +1 -0
- package/dist/guest/{main.js → boot/boot.js} +100 -50
- package/dist/guest/{guide.js → boot/guide.js} +32 -7
- package/dist/guest/{project-env.d.ts → boot/project-env.d.ts} +3 -3
- package/dist/guest/{project-env.js → boot/project-env.js} +12 -4
- package/dist/guest/boot/project-status.d.ts +5 -0
- package/dist/guest/boot/project-status.js +28 -0
- package/dist/guest/daemon/daemon.d.ts +1 -0
- package/dist/guest/daemon/daemon.js +51 -0
- package/dist/guest/daemon/exec.js +18 -6
- package/dist/guest/daemon/{shutdown.js → idle-shutdown.js} +5 -4
- package/dist/guest/daemon/{project.d.ts → project-provisioner.d.ts} +3 -3
- package/dist/guest/daemon/{project.js → project-provisioner.js} +60 -22
- package/dist/guest/daemon/relays.js +5 -3
- package/dist/guest/daemon/{session.js → sessions.js} +84 -24
- package/dist/guest/daemon/state.d.ts +4 -1
- package/dist/guest/daemon/state.js +34 -20
- package/dist/guest/databases/database-server.d.ts +13 -0
- package/dist/guest/databases/database-server.js +35 -0
- package/dist/guest/databases/dynamodb.d.ts +12 -0
- package/dist/guest/databases/dynamodb.js +81 -0
- package/dist/guest/databases/index.d.ts +2 -0
- package/dist/guest/databases/index.js +2 -0
- package/dist/guest/databases/mongodb.d.ts +7 -0
- package/dist/guest/databases/mongodb.js +46 -0
- package/dist/guest/databases/mysql.d.ts +7 -0
- package/dist/guest/databases/mysql.js +59 -0
- package/dist/guest/databases/names.d.ts +5 -0
- package/dist/guest/databases/names.js +8 -0
- package/dist/guest/databases/postgres.d.ts +9 -0
- package/dist/guest/databases/postgres.js +85 -0
- package/dist/guest/databases/redis.d.ts +7 -0
- package/dist/guest/databases/redis.js +25 -0
- package/dist/guest/databases/registry.d.ts +5 -0
- package/dist/guest/databases/registry.js +51 -0
- package/dist/guest/databases/sbx-db.d.ts +1 -0
- package/dist/guest/{db.js → databases/sbx-db.js} +13 -13
- package/dist/guest/{toolchains/databases → databases}/server.d.ts +5 -5
- package/dist/guest/{toolchains/databases → databases}/server.js +18 -13
- package/dist/guest/entries/daemon.js +16 -0
- package/dist/guest/entries/db.js +10 -0
- package/dist/guest/entries/gitguard.js +20 -0
- package/dist/guest/entries/main.d.ts +1 -0
- package/dist/guest/entries/main.js +24 -0
- package/dist/guest/entries/netproxy.d.ts +1 -0
- package/dist/guest/entries/netproxy.js +7 -0
- package/dist/guest/entries/view.d.ts +1 -0
- package/dist/guest/entries/view.js +11 -0
- package/dist/guest/{gitguard.js → git/decision.js} +49 -26
- package/dist/guest/network/addresses.d.ts +2 -0
- package/dist/guest/network/addresses.js +6 -0
- package/dist/guest/{setup/network.d.ts → network/allow-only.d.ts} +0 -10
- package/dist/guest/network/allow-only.js +84 -0
- package/dist/guest/network/firewall.d.ts +9 -0
- package/dist/guest/{setup/network.js → network/firewall.js} +58 -63
- package/dist/guest/network/proxy-server.d.ts +2 -0
- package/dist/guest/{netproxy.js → network/proxy-server.js} +37 -18
- package/dist/guest/{helpers.d.ts → runtime/csc.d.ts} +1 -1
- package/dist/guest/{helpers.js → runtime/csc.js} +7 -2
- package/dist/guest/runtime/fs.d.ts +2 -0
- package/dist/guest/runtime/fs.js +6 -0
- package/dist/guest/runtime/log.d.ts +3 -0
- package/dist/guest/runtime/log.js +22 -0
- package/dist/guest/runtime/paths.d.ts +13 -0
- package/dist/guest/runtime/paths.js +14 -0
- package/dist/guest/{ports.js → runtime/ports.js} +8 -2
- package/dist/guest/runtime/process.d.ts +15 -0
- package/dist/guest/runtime/process.js +59 -0
- package/dist/guest/{project-context.js → runtime/project-context.js} +1 -1
- package/dist/guest/runtime/session.d.ts +5 -0
- package/dist/guest/runtime/session.js +10 -0
- package/dist/guest/runtime/status.d.ts +7 -0
- package/dist/guest/runtime/status.js +57 -0
- package/dist/guest/{cmdline.js → sessions/cmdline.js} +10 -4
- package/dist/guest/{ptyhost.js → sessions/pty-host.js} +12 -5
- package/dist/guest/{view.js → sessions/viewer.js} +8 -11
- package/dist/guest/setup/claude-mem.d.ts +10 -0
- package/dist/guest/setup/{claude.js → claude-mem.js} +18 -78
- package/dist/guest/setup/{claude.d.ts → claude-profile.d.ts} +0 -10
- package/dist/guest/setup/claude-profile.js +89 -0
- package/dist/guest/setup/desktop.d.ts +2 -0
- package/dist/guest/setup/desktop.js +32 -0
- package/dist/guest/setup/environment.js +28 -5
- package/dist/guest/setup/{user.d.ts → git-identity.d.ts} +0 -2
- package/dist/guest/setup/git-identity.js +34 -0
- package/dist/guest/{gitrules.d.ts → setup/git-rules.d.ts} +1 -1
- package/dist/guest/setup/git-rules.js +50 -0
- package/dist/guest/setup/hooks.js +22 -5
- package/dist/guest/setup/{policy.js → managed-policy.js} +2 -2
- package/dist/guest/toolchains/catalogue.d.ts +4 -4
- package/dist/guest/toolchains/catalogue.js +30 -7
- package/dist/guest/toolchains/detect.d.ts +12 -0
- package/dist/guest/toolchains/detect.js +54 -0
- package/dist/guest/toolchains/index.d.ts +3 -17
- package/dist/guest/toolchains/index.js +1 -80
- package/dist/guest/toolchains/install.d.ts +20 -0
- package/dist/guest/toolchains/install.js +29 -0
- package/dist/guest/toolchains/languages/go.d.ts +3 -0
- package/dist/guest/toolchains/{go.js → languages/go.js} +27 -9
- package/dist/guest/toolchains/languages/java.d.ts +8 -0
- package/dist/guest/toolchains/{java.js → languages/java.js} +57 -18
- package/dist/guest/toolchains/languages/node.d.ts +3 -0
- package/dist/guest/toolchains/{node.js → languages/node.js} +51 -18
- package/dist/guest/toolchains/languages/php.d.ts +3 -0
- package/dist/guest/toolchains/{scripting → languages}/php.js +36 -11
- package/dist/guest/toolchains/languages/python-tools.d.ts +3 -0
- package/dist/guest/toolchains/languages/python-tools.js +12 -0
- package/dist/guest/toolchains/languages/python.d.ts +3 -0
- package/dist/guest/toolchains/{python.js → languages/python.js} +29 -16
- package/dist/guest/toolchains/languages/ruby.d.ts +3 -0
- package/dist/guest/toolchains/{scripting → languages}/ruby.js +28 -10
- package/dist/guest/toolchains/leftovers.d.ts +1 -1
- package/dist/guest/toolchains/leftovers.js +13 -11
- package/dist/guest/toolchains/managers.d.ts +6 -6
- package/dist/guest/toolchains/managers.js +38 -17
- package/dist/guest/toolchains/native/binstall.d.ts +3 -2
- package/dist/guest/toolchains/native/binstall.js +20 -8
- package/dist/guest/toolchains/native/cpp.d.ts +2 -2
- package/dist/guest/toolchains/native/cpp.js +23 -8
- package/dist/guest/toolchains/native/dotnet.d.ts +5 -3
- package/dist/guest/toolchains/native/dotnet.js +72 -24
- package/dist/guest/toolchains/native/mesa.d.ts +2 -2
- package/dist/guest/toolchains/native/mesa.js +27 -10
- package/dist/guest/toolchains/native/msvc/environment.d.ts +4 -4
- package/dist/guest/toolchains/native/msvc/environment.js +30 -16
- package/dist/guest/toolchains/native/msvc/index.d.ts +3 -3
- package/dist/guest/toolchains/native/msvc/index.js +10 -8
- package/dist/guest/toolchains/native/msvc/packages.d.ts +1 -1
- package/dist/guest/toolchains/native/msvc/packages.js +69 -23
- package/dist/guest/toolchains/native/msvc/tree.d.ts +6 -6
- package/dist/guest/toolchains/native/msvc/tree.js +15 -9
- package/dist/guest/toolchains/native/rust-extras.d.ts +23 -0
- package/dist/guest/toolchains/native/rust-extras.js +100 -0
- package/dist/guest/toolchains/native/rust.d.ts +2 -2
- package/dist/guest/toolchains/native/rust.js +41 -10
- package/dist/guest/toolchains/{scripting → native}/vcruntime.d.ts +2 -2
- package/dist/guest/toolchains/{scripting → native}/vcruntime.js +17 -7
- package/dist/guest/toolchains/package-ledger.d.ts +17 -0
- package/dist/guest/toolchains/package-ledger.js +54 -0
- package/dist/guest/toolchains/plan.d.ts +3 -24
- package/dist/guest/toolchains/plan.js +99 -111
- package/dist/guest/toolchains/runtimes.d.ts +6 -6
- package/dist/guest/toolchains/runtimes.js +31 -13
- package/dist/guest/toolchains/scheduler.d.ts +22 -0
- package/dist/guest/toolchains/scheduler.js +123 -0
- package/dist/guest/toolchains/setup.d.ts +10 -0
- package/dist/guest/toolchains/setup.js +22 -0
- package/dist/guest/toolchains/state-file.d.ts +3 -0
- package/dist/guest/toolchains/state-file.js +10 -0
- package/dist/guest/toolchains/step.d.ts +24 -0
- package/dist/guest/toolchains/step.js +1 -0
- package/dist/guest/toolchains/tool-env.d.ts +12 -0
- package/dist/guest/toolchains/tool-env.js +16 -0
- package/dist/guest/toolchains/tools/cli.d.ts +10 -0
- package/dist/guest/toolchains/{cli.js → tools/cli.js} +35 -15
- package/dist/guest/toolchains/tools/git.d.ts +3 -0
- package/dist/guest/toolchains/{git.js → tools/git.js} +38 -15
- package/dist/guest/toolchains/tools/pwsh.d.ts +4 -0
- package/dist/guest/toolchains/{pwsh.js → tools/pwsh.js} +14 -7
- package/dist/guest/toolchains/{vscode-profile.d.ts → tools/vscode-profile.d.ts} +6 -6
- package/dist/guest/toolchains/{vscode-profile.js → tools/vscode-profile.js} +28 -12
- package/dist/guest/toolchains/{vscode.d.ts → tools/vscode.d.ts} +6 -6
- package/dist/guest/toolchains/{vscode.js → tools/vscode.js} +67 -21
- package/dist/guest/toolchains/version-cache.d.ts +16 -0
- package/dist/guest/toolchains/version-cache.js +67 -0
- package/dist/host/agent-commands/commands.d.ts +13 -0
- package/dist/host/agent-commands/commands.js +33 -0
- package/dist/host/agent-commands/forwarders.d.ts +7 -0
- package/dist/host/agent-commands/forwarders.js +31 -0
- package/dist/host/agent-commands/index.d.ts +4 -0
- package/dist/host/agent-commands/index.js +4 -0
- package/dist/host/agent-commands/reconcile.d.ts +12 -0
- package/dist/host/agent-commands/reconcile.js +69 -0
- package/dist/host/agent-commands/user-path.d.ts +2 -0
- package/dist/host/agent-commands/user-path.js +33 -0
- package/dist/host/audit/collect.d.ts +2 -2
- package/dist/host/audit/collect.js +59 -22
- package/dist/host/audit/log.d.ts +2 -2
- package/dist/host/audit/log.js +24 -8
- package/dist/host/{attach.d.ts → channel/attach.d.ts} +2 -2
- package/dist/host/{attach.js → channel/attach.js} +33 -15
- package/dist/host/channel/channel.d.ts +51 -0
- package/dist/host/channel/channel.js +196 -0
- package/dist/host/channel/index.d.ts +2 -0
- package/dist/host/channel/index.js +2 -0
- package/dist/host/guard/agent-files.d.ts +7 -0
- package/dist/host/guard/agent-files.js +103 -0
- package/dist/host/guard/commands.d.ts +10 -0
- package/dist/host/guard/commands.js +123 -0
- package/dist/host/guard/file-hash.d.ts +4 -0
- package/dist/host/guard/file-hash.js +37 -0
- package/dist/host/guard/git-config.d.ts +5 -0
- package/dist/host/guard/git-config.js +62 -0
- package/dist/host/guard/git-dirs.d.ts +12 -0
- package/dist/host/guard/git-dirs.js +53 -0
- package/dist/host/guard/index.d.ts +5 -0
- package/dist/host/guard/index.js +4 -0
- package/dist/host/guard/mark-of-the-web.d.ts +8 -0
- package/dist/host/guard/mark-of-the-web.js +74 -0
- package/dist/host/guard/nested-repos.d.ts +14 -0
- package/dist/host/guard/nested-repos.js +88 -0
- package/dist/host/guard/quarantine.d.ts +3 -0
- package/dist/host/guard/quarantine.js +24 -0
- package/dist/host/guard/repo-guard.d.ts +10 -0
- package/dist/host/guard/repo-guard.js +36 -0
- package/dist/host/guard/store.d.ts +40 -0
- package/dist/host/guard/store.js +145 -0
- package/dist/host/guard/types.d.ts +27 -0
- package/dist/host/guard/types.js +3 -0
- package/dist/host/guard/watch-state.d.ts +9 -0
- package/dist/host/guard/watch-state.js +26 -0
- package/dist/host/launch/boot-projects.d.ts +17 -0
- package/dist/host/launch/{projects.js → boot-projects.js} +27 -12
- package/dist/host/{database-plan.d.ts → launch/database-plan.d.ts} +5 -5
- package/dist/host/{database-plan.js → launch/database-plan.js} +24 -13
- package/dist/host/launch/generate.d.ts +4 -0
- package/dist/host/launch/generate.js +77 -0
- package/dist/host/launch/index.d.ts +10 -0
- package/dist/host/launch/index.js +10 -0
- package/dist/host/launch/mappings.d.ts +7 -2
- package/dist/host/launch/mappings.js +83 -24
- package/dist/host/launch/pc-scan.d.ts +5 -0
- package/dist/host/{pc-scan.js → launch/pc-scan.js} +20 -13
- package/dist/host/launch/project-scan.d.ts +7 -0
- package/dist/host/{project-scan.js → launch/project-scan.js} +29 -21
- package/dist/host/launch/session-file.d.ts +23 -0
- package/dist/host/launch/session-file.js +73 -0
- package/dist/host/launch/stage.d.ts +5 -5
- package/dist/host/launch/stage.js +14 -13
- package/dist/host/launch/toolchains.d.ts +4 -0
- package/dist/host/launch/toolchains.js +11 -0
- package/dist/host/launch/{wsb.d.ts → wsb-file.d.ts} +4 -2
- package/dist/host/launch/wsb-file.js +56 -0
- package/dist/host/life/crash-report.d.ts +8 -0
- package/dist/host/life/crash-report.js +87 -0
- package/dist/host/life/index.d.ts +6 -0
- package/dist/host/life/index.js +6 -0
- package/dist/host/life/keep-awake.d.ts +10 -0
- package/dist/host/life/keep-awake.js +29 -0
- package/dist/host/life/life-record.d.ts +48 -0
- package/dist/host/life/life-record.js +76 -0
- package/dist/host/life/stop-events.d.ts +27 -0
- package/dist/host/life/stop-events.js +96 -0
- package/dist/host/life/stop-warning.d.ts +4 -0
- package/dist/host/life/stop-warning.js +25 -0
- package/dist/host/life/windows-update.d.ts +3 -0
- package/dist/host/life/windows-update.js +11 -0
- package/dist/host/native.d.ts +4 -0
- package/dist/host/native.js +11 -0
- package/dist/host/network/index.d.ts +1 -0
- package/dist/host/network/index.js +1 -0
- package/dist/host/{port-forward.d.ts → network/port-forward.d.ts} +1 -1
- package/dist/host/{port-forward.js → network/port-forward.js} +16 -10
- package/dist/host/profile/accounts.d.ts +37 -0
- package/dist/host/profile/accounts.js +146 -0
- package/dist/host/profile/claude-login.d.ts +22 -0
- package/dist/host/profile/claude-login.js +57 -0
- package/dist/host/{claude-profile.d.ts → profile/claude-profile.d.ts} +9 -9
- package/dist/host/{claude-profile.js → profile/claude-profile.js} +32 -22
- package/dist/host/profile/index.d.ts +7 -0
- package/dist/host/profile/index.js +7 -0
- package/dist/host/profile/personalize.d.ts +2 -0
- package/dist/host/profile/personalize.js +127 -0
- package/dist/host/profile/reg-file.d.ts +8 -0
- package/dist/host/profile/reg-file.js +45 -0
- package/dist/host/profile/secret-files.d.ts +2 -0
- package/dist/host/profile/secret-files.js +25 -0
- package/dist/host/profile/secret-patterns.d.ts +6 -0
- package/dist/host/profile/secret-patterns.js +128 -0
- package/dist/host/profile/secrets.d.ts +12 -0
- package/dist/host/profile/secrets.js +100 -0
- package/dist/host/projects/index.d.ts +4 -0
- package/dist/host/projects/index.js +4 -0
- package/dist/host/projects/join.d.ts +38 -0
- package/dist/host/projects/join.js +119 -0
- package/dist/host/projects/known.d.ts +28 -0
- package/dist/host/projects/known.js +55 -0
- package/dist/host/projects/mapper.d.ts +29 -0
- package/dist/host/projects/mapper.js +88 -0
- package/dist/host/projects/registry.d.ts +83 -0
- package/dist/host/projects/registry.js +136 -0
- package/dist/host/sandbox/doctor.d.ts +2 -0
- package/dist/host/sandbox/doctor.js +42 -0
- package/dist/host/sandbox/host-claude.d.ts +1 -0
- package/dist/host/sandbox/host-claude.js +26 -0
- package/dist/host/sandbox/index.d.ts +6 -0
- package/dist/host/sandbox/index.js +6 -0
- package/dist/host/{platform.d.ts → sandbox/platform.d.ts} +0 -5
- package/dist/host/sandbox/platform.js +60 -0
- package/dist/host/sandbox/probe.d.ts +3 -0
- package/dist/host/sandbox/probe.js +47 -0
- package/dist/host/{window.js → sandbox/window.js} +7 -5
- package/dist/host/{wsb.js → sandbox/wsb-cli.js} +31 -8
- package/dist/host/{cleanup.js → storage/cleanup.js} +27 -12
- package/dist/host/storage/index.d.ts +2 -0
- package/dist/host/storage/index.js +2 -0
- package/dist/host/storage/state-files.d.ts +4 -0
- package/dist/host/storage/state-files.js +10 -0
- package/dist/host/test-guard.js +1 -1
- package/dist/host/tools/conpty.d.ts +8 -0
- package/dist/host/tools/conpty.js +58 -0
- package/dist/host/tools/index.d.ts +2 -0
- package/dist/host/tools/index.js +2 -0
- package/dist/host/{terminal.d.ts → tools/windows-terminal.d.ts} +2 -10
- package/dist/host/{terminal.js → tools/windows-terminal.js} +33 -57
- package/dist/host/workspace-view/active-views.d.ts +3 -0
- package/dist/host/workspace-view/active-views.js +22 -0
- package/dist/host/workspace-view/index.d.ts +2 -18
- package/dist/host/workspace-view/index.js +2 -49
- package/dist/host/workspace-view/plan.d.ts +16 -0
- package/dist/host/workspace-view/plan.js +50 -0
- package/dist/host/workspace-view/rules.js +10 -3
- package/dist/host/workspace-view/view-state.d.ts +10 -0
- package/dist/host/workspace-view/view-state.js +31 -0
- package/dist/host/workspace-view/view.d.ts +1 -0
- package/dist/host/workspace-view/view.js +51 -55
- package/dist/runtime/daemon.js +4232 -1918
- package/dist/runtime/db.js +2145 -830
- package/dist/runtime/gitguard.js +29 -11
- package/dist/runtime/main.js +4760 -2155
- package/dist/runtime/netproxy.js +1654 -418
- package/dist/runtime/view.js +1515 -453
- package/dist/selftest/accounts.test.d.ts +1 -1
- package/dist/selftest/accounts.test.js +20 -17
- package/dist/selftest/agent-commands.test.d.ts +1 -1
- package/dist/selftest/agent-commands.test.js +9 -5
- package/dist/selftest/audit.test.d.ts +1 -1
- package/dist/selftest/audit.test.js +46 -13
- package/dist/selftest/channel.test.d.ts +1 -1
- package/dist/selftest/channel.test.js +91 -8
- package/dist/selftest/cli.test.d.ts +1 -1
- package/dist/selftest/cli.test.js +68 -16
- package/dist/selftest/cmdline.test.d.ts +1 -1
- package/dist/selftest/cmdline.test.js +36 -7
- package/dist/selftest/config.test.d.ts +1 -1
- package/dist/selftest/config.test.js +12 -5
- package/dist/selftest/data.test.d.ts +1 -1
- package/dist/selftest/data.test.js +35 -6
- package/dist/selftest/detect.test.d.ts +1 -1
- package/dist/selftest/detect.test.js +22 -9
- package/dist/selftest/generate.test.d.ts +1 -1
- package/dist/selftest/generate.test.js +33 -9
- package/dist/selftest/git-access.test.d.ts +1 -1
- package/dist/selftest/git-access.test.js +42 -4
- package/dist/selftest/guest-boot.test.d.ts +1 -1
- package/dist/selftest/guest-boot.test.js +25 -7
- package/dist/selftest/host-sim.test.d.ts +1 -1
- package/dist/selftest/host-sim.test.js +27 -3
- package/dist/selftest/hostile-input.test.d.ts +1 -1
- package/dist/selftest/hostile-input.test.js +5 -5
- package/dist/selftest/index.d.ts +1 -1
- package/dist/selftest/index.js +73 -16
- package/dist/selftest/layout.test.d.ts +2 -0
- package/dist/selftest/layout.test.js +131 -0
- package/dist/selftest/links.test.d.ts +1 -1
- package/dist/selftest/links.test.js +16 -11
- package/dist/selftest/live-daemon.test.d.ts +1 -1
- package/dist/selftest/live-daemon.test.js +20 -8
- package/dist/selftest/live-git.test.d.ts +1 -1
- package/dist/selftest/live-git.test.js +13 -4
- package/dist/selftest/live-network.test.d.ts +1 -1
- package/dist/selftest/live-network.test.js +24 -9
- package/dist/selftest/live-projects.test.d.ts +1 -1
- package/dist/selftest/live-projects.test.js +47 -20
- package/dist/selftest/live-terminal.test.d.ts +2 -0
- package/dist/selftest/live-terminal.test.js +195 -0
- package/dist/selftest/local-config.test.d.ts +1 -1
- package/dist/selftest/local-config.test.js +88 -15
- package/dist/selftest/mirror.test.d.ts +1 -1
- package/dist/selftest/mirror.test.js +118 -19
- package/dist/selftest/network.test.d.ts +1 -1
- package/dist/selftest/network.test.js +17 -8
- package/dist/selftest/personalization.test.d.ts +1 -1
- package/dist/selftest/personalization.test.js +12 -5
- package/dist/selftest/projects.test.d.ts +1 -1
- package/dist/selftest/projects.test.js +336 -72
- package/dist/selftest/repair.test.d.ts +1 -1
- package/dist/selftest/repair.test.js +17 -5
- package/dist/selftest/repo-guard.test.d.ts +1 -1
- package/dist/selftest/repo-guard.test.js +21 -20
- package/dist/selftest/secrets.test.d.ts +1 -1
- package/dist/selftest/secrets.test.js +57 -13
- package/dist/selftest/setup.test.d.ts +1 -1
- package/dist/selftest/setup.test.js +25 -5
- package/dist/selftest/{fixtures.d.ts → support/fixtures.d.ts} +7 -4
- package/dist/selftest/{fixtures.js → support/fixtures.js} +95 -17
- package/dist/selftest/{harness.js → support/harness.js} +24 -7
- package/dist/selftest/{live.d.ts → support/live.d.ts} +2 -2
- package/dist/selftest/{live.js → support/live.js} +34 -10
- package/dist/selftest/support/suite.js +1 -0
- package/dist/selftest/sync.test.d.ts +1 -1
- package/dist/selftest/sync.test.js +64 -26
- package/dist/selftest/test-guard.test.d.ts +1 -1
- package/dist/selftest/test-guard.test.js +43 -15
- package/dist/selftest/toolchains.test.d.ts +1 -1
- package/dist/selftest/toolchains.test.js +135 -36
- package/dist/selftest/workspace-view.test.d.ts +1 -1
- package/dist/selftest/workspace-view.test.js +48 -11
- package/dist/selftest/workspace.test.d.ts +1 -1
- package/dist/selftest/workspace.test.js +13 -4
- package/dist/shared/{apps.d.ts → apps/catalogue.d.ts} +1 -11
- package/dist/shared/apps/catalogue.js +768 -0
- package/dist/shared/apps/index.d.ts +2 -0
- package/dist/shared/apps/index.js +2 -0
- package/dist/shared/apps/selection.d.ts +11 -0
- package/dist/shared/apps/selection.js +40 -0
- package/dist/shared/channel/index.d.ts +2 -0
- package/dist/shared/channel/index.js +2 -0
- package/dist/shared/channel/run-dir.d.ts +30 -0
- package/dist/shared/channel/run-dir.js +84 -0
- package/dist/shared/{schema.d.ts → channel/schema.d.ts} +60 -19
- package/dist/shared/channel/schema.js +131 -0
- package/dist/shared/download/archive.d.ts +13 -0
- package/dist/shared/download/archive.js +57 -0
- package/dist/shared/download/downloader.d.ts +35 -0
- package/dist/shared/download/downloader.js +110 -0
- package/dist/shared/download/github.d.ts +16 -0
- package/dist/shared/download/github.js +74 -0
- package/dist/shared/download/http.d.ts +5 -0
- package/dist/shared/download/http.js +30 -0
- package/dist/shared/download/index.d.ts +5 -0
- package/dist/shared/download/index.js +5 -0
- package/dist/shared/download/spawn.d.ts +2 -0
- package/dist/shared/download/spawn.js +7 -0
- package/dist/shared/io/index.d.ts +3 -0
- package/dist/shared/io/index.js +3 -0
- package/dist/shared/io/json-file.d.ts +10 -0
- package/dist/shared/io/json-file.js +21 -0
- package/dist/shared/io/json.d.ts +13 -0
- package/dist/shared/io/json.js +49 -0
- package/dist/shared/{safe-remove.js → io/safe-remove.js} +32 -7
- package/dist/shared/{netrules.js → network/firewall-rules.js} +36 -5
- package/dist/shared/network/index.d.ts +2 -0
- package/dist/shared/network/index.js +2 -0
- package/dist/shared/{netpolicy.js → network/policy.js} +66 -11
- package/dist/shared/{paths.js → paths/claude-paths.js} +12 -2
- package/dist/shared/{guest-paths.d.ts → paths/guest-paths.d.ts} +21 -0
- package/dist/shared/paths/guest-paths.js +146 -0
- package/dist/shared/paths/index.d.ts +3 -0
- package/dist/shared/paths/index.js +3 -0
- package/dist/shared/{projects.d.ts → paths/projects.d.ts} +27 -4
- package/dist/shared/paths/projects.js +136 -0
- package/dist/shared/pty/client.d.ts +21 -0
- package/dist/shared/pty/client.js +79 -0
- package/dist/shared/pty/console-input.d.ts +11 -0
- package/dist/shared/pty/console-input.js +81 -0
- package/dist/shared/pty/index.d.ts +6 -0
- package/dist/shared/pty/index.js +6 -0
- package/dist/shared/pty/input-joiner.d.ts +15 -0
- package/dist/shared/pty/input-joiner.js +44 -0
- package/dist/shared/pty/output-filter.d.ts +13 -0
- package/dist/shared/pty/output-filter.js +140 -0
- package/dist/shared/pty/protocol.d.ts +36 -0
- package/dist/shared/pty/protocol.js +60 -0
- package/dist/shared/pty/terminal.d.ts +24 -0
- package/dist/shared/pty/terminal.js +147 -0
- package/dist/shared/test-guard.js +3 -1
- package/dist/sync/claude-mem.d.ts +1 -1
- package/dist/sync/claude-mem.js +9 -4
- package/dist/sync/history.d.ts +1 -29
- package/dist/sync/history.js +57 -45
- package/dist/sync/index.d.ts +5 -0
- package/dist/sync/index.js +5 -0
- package/dist/sync/sync-cycle.d.ts +18 -0
- package/dist/sync/sync-cycle.js +85 -0
- package/dist/sync/sync-state.d.ts +32 -0
- package/dist/sync/sync-state.js +37 -0
- package/dist/sync/watcher.d.ts +0 -18
- package/dist/sync/watcher.js +66 -100
- package/native/keep-awake.ps1 +8 -0
- package/native/power.cs +23 -0
- package/native/stop-events.ps1 +38 -0
- package/package.json +11 -3
- package/sandbox/linkgate.cs +98 -0
- package/sandbox/memlog.ps1 +15 -6
- package/sandbox/ptyhost.cs +60 -3
- package/schemas/config.schema.json +48 -1
- package/schemas/sandbox-config.schema.json +37 -3
- package/dist/cli/commands/launch.d.ts +0 -29
- package/dist/cli/commands/launch.js +0 -366
- package/dist/cli/commands/maintenance.d.ts +0 -10
- package/dist/cli/commands/maintenance.js +0 -187
- package/dist/cli/commands/project.d.ts +0 -29
- package/dist/cli/commands/project.js +0 -63
- package/dist/cli/commands/projects.d.ts +0 -14
- package/dist/cli/commands/projects.js +0 -146
- package/dist/cli/commands/restart.d.ts +0 -6
- package/dist/cli/commands/restart.js +0 -85
- package/dist/cli/commands/sessions.d.ts +0 -12
- package/dist/cli/commands/sessions.js +0 -257
- package/dist/cli/menu/settings/editors.js +0 -305
- package/dist/cli/progress.d.ts +0 -9
- package/dist/cli/progress.js +0 -49
- package/dist/cli/tui/dialogs.d.ts +0 -57
- package/dist/cli/tui/dialogs.js +0 -162
- package/dist/core/config.js +0 -109
- package/dist/core/schema.d.ts +0 -6
- package/dist/core/schema.js +0 -8
- package/dist/core/util.d.ts +0 -62
- package/dist/core/util.js +0 -156
- package/dist/core/workspace.d.ts +0 -18
- package/dist/core/workspace.js +0 -145
- package/dist/guest/boot-env.d.ts +0 -4
- package/dist/guest/daemon.js +0 -57
- package/dist/guest/env.d.ts +0 -52
- package/dist/guest/env.js +0 -103
- package/dist/guest/gitrules.js +0 -11
- package/dist/guest/project-status.d.ts +0 -5
- package/dist/guest/project-status.js +0 -17
- package/dist/guest/setup/user.js +0 -51
- package/dist/guest/toolchains/cli.d.ts +0 -10
- package/dist/guest/toolchains/common.d.ts +0 -54
- package/dist/guest/toolchains/common.js +0 -147
- package/dist/guest/toolchains/databases/dynamodb.d.ts +0 -8
- package/dist/guest/toolchains/databases/dynamodb.js +0 -52
- package/dist/guest/toolchains/databases/index.d.ts +0 -6
- package/dist/guest/toolchains/databases/index.js +0 -62
- package/dist/guest/toolchains/databases/mongodb.d.ts +0 -3
- package/dist/guest/toolchains/databases/mongodb.js +0 -31
- package/dist/guest/toolchains/databases/mysql.d.ts +0 -3
- package/dist/guest/toolchains/databases/mysql.js +0 -38
- package/dist/guest/toolchains/databases/postgres.d.ts +0 -5
- package/dist/guest/toolchains/databases/postgres.js +0 -38
- package/dist/guest/toolchains/databases/redis.d.ts +0 -3
- package/dist/guest/toolchains/databases/redis.js +0 -16
- package/dist/guest/toolchains/git.d.ts +0 -3
- package/dist/guest/toolchains/go.d.ts +0 -3
- package/dist/guest/toolchains/java.d.ts +0 -8
- package/dist/guest/toolchains/node.d.ts +0 -3
- package/dist/guest/toolchains/pwsh.d.ts +0 -4
- package/dist/guest/toolchains/python.d.ts +0 -3
- package/dist/guest/toolchains/scripting/php.d.ts +0 -3
- package/dist/guest/toolchains/scripting/ruby.d.ts +0 -3
- package/dist/host/accounts.d.ts +0 -32
- package/dist/host/accounts.js +0 -128
- package/dist/host/agent-commands.d.ts +0 -25
- package/dist/host/agent-commands.js +0 -145
- package/dist/host/channel.d.ts +0 -38
- package/dist/host/channel.js +0 -162
- package/dist/host/generate.d.ts +0 -13
- package/dist/host/generate.js +0 -108
- package/dist/host/join.d.ts +0 -28
- package/dist/host/join.js +0 -76
- package/dist/host/launch/projects.d.ts +0 -15
- package/dist/host/launch/wsb.js +0 -34
- package/dist/host/motw.d.ts +0 -17
- package/dist/host/motw.js +0 -74
- package/dist/host/pc-scan.d.ts +0 -6
- package/dist/host/personalize.d.ts +0 -10
- package/dist/host/personalize.js +0 -97
- package/dist/host/platform.js +0 -129
- package/dist/host/project-scan.d.ts +0 -7
- package/dist/host/projects.d.ts +0 -100
- package/dist/host/projects.js +0 -147
- package/dist/host/repo-guard.d.ts +0 -43
- package/dist/host/repo-guard.js +0 -347
- package/dist/host/secrets.d.ts +0 -14
- package/dist/host/secrets.js +0 -133
- package/dist/host/stops.d.ts +0 -67
- package/dist/host/stops.js +0 -126
- package/dist/shared/apps.js +0 -114
- package/dist/shared/download.d.ts +0 -60
- package/dist/shared/download.js +0 -215
- package/dist/shared/guest-paths.js +0 -61
- package/dist/shared/projects.js +0 -67
- package/dist/shared/pty-client.d.ts +0 -91
- package/dist/shared/pty-client.js +0 -349
- package/dist/shared/rundir.d.ts +0 -41
- package/dist/shared/rundir.js +0 -96
- package/dist/shared/schema.js +0 -92
- /package/dist/{guest/daemon.d.ts → cli/tui/list/list-types.js} +0 -0
- /package/dist/{guest/db.d.ts → cli/tui/screen.js} +0 -0
- /package/dist/core/{detect-databases.d.ts → detect/databases.d.ts} +0 -0
- /package/dist/{guest/toolchains → core/detect}/versions.d.ts +0 -0
- /package/dist/guest/{setup/agents.d.ts → agents/agent-installer.d.ts} +0 -0
- /package/dist/guest/{audit-parse.d.ts → audit/parse.d.ts} +0 -0
- /package/dist/guest/{guide.d.ts → boot/guide.d.ts} +0 -0
- /package/dist/guest/daemon/{shutdown.d.ts → idle-shutdown.d.ts} +0 -0
- /package/dist/guest/daemon/{session.d.ts → sessions.d.ts} +0 -0
- /package/dist/guest/{main.d.ts → entries/daemon.d.ts} +0 -0
- /package/dist/guest/{netproxy.d.ts → entries/db.d.ts} +0 -0
- /package/dist/{selftest/suite.js → guest/entries/gitguard.d.ts} +0 -0
- /package/dist/guest/{gitguard.d.ts → git/decision.d.ts} +0 -0
- /package/dist/guest/{ports.d.ts → runtime/ports.d.ts} +0 -0
- /package/dist/guest/{project-context.d.ts → runtime/project-context.d.ts} +0 -0
- /package/dist/guest/{cmdline.d.ts → sessions/cmdline.d.ts} +0 -0
- /package/dist/guest/{ptyhost.d.ts → sessions/pty-host.d.ts} +0 -0
- /package/dist/guest/{view.d.ts → sessions/viewer.d.ts} +0 -0
- /package/dist/guest/setup/{policy.d.ts → managed-policy.d.ts} +0 -0
- /package/dist/host/{window.d.ts → sandbox/window.d.ts} +0 -0
- /package/dist/host/{wsb.d.ts → sandbox/wsb-cli.d.ts} +0 -0
- /package/dist/host/{cleanup.d.ts → storage/cleanup.d.ts} +0 -0
- /package/dist/selftest/{harness.d.ts → support/harness.d.ts} +0 -0
- /package/dist/selftest/{suite.d.ts → support/suite.d.ts} +0 -0
- /package/dist/shared/{safe-remove.d.ts → io/safe-remove.d.ts} +0 -0
- /package/dist/shared/{netrules.d.ts → network/firewall-rules.d.ts} +0 -0
- /package/dist/shared/{netpolicy.d.ts → network/policy.d.ts} +0 -0
- /package/dist/shared/{paths.d.ts → paths/claude-paths.d.ts} +0 -0
|
@@ -3,12 +3,12 @@ import { SchemaNode } from './schema-node.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). */
|
|
6
|
-
export declare
|
|
6
|
+
export declare function fileValue(text: string, key: string[]): unknown;
|
|
7
7
|
/**
|
|
8
8
|
* Applies one change (undefined = remove the line, back to the default) to config text and returns the new text, or
|
|
9
9
|
* the problems that make the result invalid. Pure; ConfigFile writes it.
|
|
10
10
|
*/
|
|
11
|
-
export declare
|
|
11
|
+
export declare function editConfigText(text: string, key: string[], value: unknown, target?: SettingsTarget): {
|
|
12
12
|
text: string;
|
|
13
13
|
} | {
|
|
14
14
|
problems: string[];
|
|
@@ -1,26 +1,35 @@
|
|
|
1
|
-
// One config file being edited: your own settings, or a project's .sandbox-config.json. One setting is changed at a
|
|
2
|
-
// through jsonc-parser, so comments and formatting stay, and nothing is written unless the whole file is still
|
|
1
|
+
// One config file being edited: your own settings, or a project's .sandbox-config.json. One setting is changed at a
|
|
2
|
+
// time through jsonc-parser, so comments and formatting stay, and nothing is written unless the whole file is still
|
|
3
|
+
// valid.
|
|
3
4
|
import fs from 'node:fs';
|
|
4
5
|
import path from 'node:path';
|
|
5
6
|
import { applyEdits, modify, parse } from 'jsonc-parser';
|
|
6
7
|
import _ from 'lodash';
|
|
7
|
-
import { DEFAULTS, loadConfig, mergeConfig, userConfigPath } from '../../../core/config.js';
|
|
8
|
-
import { LOCAL_CONFIG_NAME } from '../../../core/local-config.js';
|
|
9
|
-
import {
|
|
8
|
+
import { DEFAULTS, loadConfig, mergeConfig, userConfigPath } from '../../../core/config/index.js';
|
|
9
|
+
import { LOCAL_CONFIG_NAME } from '../../../core/local-config/index.js';
|
|
10
|
+
import { ConfigSchema, describeIssues, LocalOverridesSchema } from '../../../core/schema/index.js';
|
|
10
11
|
import { SchemaNode } from './schema-node.js';
|
|
11
12
|
/** What the value is in this JSON text (undefined when it is not set there). */
|
|
12
|
-
export
|
|
13
|
+
export function fileValue(text, key) {
|
|
14
|
+
return _.get(parse(text) ?? {}, key);
|
|
15
|
+
}
|
|
13
16
|
/**
|
|
14
17
|
* Applies one change (undefined = remove the line, back to the default) to config text and returns the new text, or
|
|
15
18
|
* the problems that make the result invalid. Pure; ConfigFile writes it.
|
|
16
19
|
*/
|
|
17
|
-
export
|
|
20
|
+
export function editConfigText(text, key, value, target = 'user') {
|
|
18
21
|
// Removing a setting the file does not have changes nothing (jsonc-parser throws on it).
|
|
19
|
-
const edits = value === undefined && fileValue(text || '{}', key) === undefined
|
|
22
|
+
const edits = value === undefined && fileValue(text || '{}', key) === undefined
|
|
23
|
+
? []
|
|
24
|
+
: modify(text || '{}', key, value, { formattingOptions: { insertSpaces: true, tabSize: 2, eol: '\n' } });
|
|
20
25
|
const next = applyEdits(text || '{}', edits);
|
|
21
|
-
const parsed = target === 'project'
|
|
22
|
-
|
|
23
|
-
};
|
|
26
|
+
const parsed = target === 'project'
|
|
27
|
+
? LocalOverridesSchema.safeParse(parse(next) ?? {})
|
|
28
|
+
: ConfigSchema.safeParse(mergeConfig(DEFAULTS, parse(next) ?? {}));
|
|
29
|
+
return parsed.success
|
|
30
|
+
? { text: next.endsWith('\n') ? next : next + '\n' }
|
|
31
|
+
: { problems: describeIssues(parsed.error) };
|
|
32
|
+
}
|
|
24
33
|
export class ConfigFile {
|
|
25
34
|
target;
|
|
26
35
|
file;
|
|
@@ -28,15 +37,27 @@ export class ConfigFile {
|
|
|
28
37
|
constructor(target, file) {
|
|
29
38
|
this.target = target;
|
|
30
39
|
this.file = file;
|
|
31
|
-
this.schema = new SchemaNode(target === 'project' ?
|
|
40
|
+
this.schema = new SchemaNode(target === 'project' ? LocalOverridesSchema : ConfigSchema);
|
|
41
|
+
}
|
|
42
|
+
static user(configPath) {
|
|
43
|
+
return new ConfigFile('user', configPath ?? userConfigPath());
|
|
44
|
+
}
|
|
45
|
+
static project(dir) {
|
|
46
|
+
return new ConfigFile('project', path.join(dir, LOCAL_CONFIG_NAME));
|
|
47
|
+
}
|
|
48
|
+
get isProject() {
|
|
49
|
+
return this.target === 'project';
|
|
50
|
+
}
|
|
51
|
+
get exists() {
|
|
52
|
+
return fs.existsSync(this.file);
|
|
53
|
+
}
|
|
54
|
+
text() {
|
|
55
|
+
return this.exists ? fs.readFileSync(this.file, 'utf8') : '';
|
|
32
56
|
}
|
|
33
|
-
static user(configPath) { return new ConfigFile('user', configPath ?? userConfigPath()); }
|
|
34
|
-
static project(dir) { return new ConfigFile('project', path.join(dir, LOCAL_CONFIG_NAME)); }
|
|
35
|
-
get isProject() { return this.target === 'project'; }
|
|
36
|
-
get exists() { return fs.existsSync(this.file); }
|
|
37
|
-
text() { return this.exists ? fs.readFileSync(this.file, 'utf8') : ''; }
|
|
38
57
|
/** The value written in this file (undefined = not set here). */
|
|
39
|
-
valueInFile(key) {
|
|
58
|
+
valueInFile(key) {
|
|
59
|
+
return fileValue(this.text(), key);
|
|
60
|
+
}
|
|
40
61
|
/** Your own settings with the built-in defaults filled in (what a sandbox uses without a project file). */
|
|
41
62
|
userConfig() {
|
|
42
63
|
const file = this.isProject ? userConfigPath() : this.file;
|
|
@@ -51,7 +72,9 @@ export class ConfigFile {
|
|
|
51
72
|
effective(key, config = this.userConfig()) {
|
|
52
73
|
return this.isProject ? this.valueInFile(key) : _.get(config, key);
|
|
53
74
|
}
|
|
54
|
-
defaultOf(key) {
|
|
75
|
+
defaultOf(key) {
|
|
76
|
+
return _.get(DEFAULTS, key);
|
|
77
|
+
}
|
|
55
78
|
/**
|
|
56
79
|
* Saves one setting. In your own file a value equal to the default is removed instead (no line needed). Returns
|
|
57
80
|
* 'unchanged', 'saved', or the problems that stopped it.
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** A value in one short line, for the right-hand column. */
|
|
2
|
+
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;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import _ from 'lodash';
|
|
2
|
+
import { Text, Theme } from '../../tui/index.js';
|
|
3
|
+
/** A value in one short line, for the right-hand column. */
|
|
4
|
+
export function formatValue(value, max = 60) {
|
|
5
|
+
if (value === undefined)
|
|
6
|
+
return Theme.muted('not set');
|
|
7
|
+
if (value === true)
|
|
8
|
+
return Theme.ok('On');
|
|
9
|
+
if (value === false)
|
|
10
|
+
return Theme.muted('Off');
|
|
11
|
+
if (value === null)
|
|
12
|
+
return Theme.muted('none');
|
|
13
|
+
if (typeof value === 'string')
|
|
14
|
+
return value === '' ? Theme.muted('(empty)') : Text.truncate(value, max);
|
|
15
|
+
if (typeof value === 'number')
|
|
16
|
+
return String(value);
|
|
17
|
+
if (Array.isArray(value))
|
|
18
|
+
return value.length === 0
|
|
19
|
+
? Theme.muted('none')
|
|
20
|
+
: Text.truncate(value.length + ' · ' + value.map((v) => (typeof v === 'object' ? summary(v) : String(v))).join(', '), max);
|
|
21
|
+
const keys = Object.keys(value);
|
|
22
|
+
return keys.length ? Text.truncate(keys.length + ' · ' + keys.join(', '), max) : Theme.muted('none');
|
|
23
|
+
}
|
|
24
|
+
/** A one-line name for an object in a list (a mapping's folders, an agent's package ...). */
|
|
25
|
+
export function summary(value) {
|
|
26
|
+
if (!_.isPlainObject(value))
|
|
27
|
+
return String(value);
|
|
28
|
+
const o = value;
|
|
29
|
+
const strings = Object.entries(o).filter(([, v]) => typeof v === 'string' && v);
|
|
30
|
+
if (typeof o.host === 'string' && typeof o.guest === 'string')
|
|
31
|
+
return o.host + ' → ' + o.guest + (o.readOnly ? ' (read-only)' : '');
|
|
32
|
+
return (strings
|
|
33
|
+
.slice(0, 2)
|
|
34
|
+
.map(([, v]) => v)
|
|
35
|
+
.join(' · ') || '{ ' + Object.keys(o).join(', ') + ' }');
|
|
36
|
+
}
|
|
37
|
+
export function choiceLabel(v) {
|
|
38
|
+
return v === true ? 'On' : v === false ? 'Off' : String(v);
|
|
39
|
+
}
|
|
@@ -1,32 +1,4 @@
|
|
|
1
|
-
import { App } from '../../tui/index.js';
|
|
2
|
-
import { ConfigFile } from './config-file.js';
|
|
3
|
-
import type { SchemaNode } from './schema-node.js';
|
|
4
1
|
export { CATEGORIES, nameOf } from './categories.js';
|
|
5
2
|
export { ConfigFile, editConfigText, fileValue, type SettingsTarget } from './config-file.js';
|
|
6
3
|
export { SchemaNode } from './schema-node.js';
|
|
7
|
-
|
|
8
|
-
key: string[];
|
|
9
|
-
node: SchemaNode;
|
|
10
|
-
category: string;
|
|
11
|
-
section?: string;
|
|
12
|
-
}
|
|
13
|
-
export type Scope = 'user' | 'project';
|
|
14
|
-
export declare class SettingsEditor {
|
|
15
|
-
private readonly app;
|
|
16
|
-
private readonly files;
|
|
17
|
-
private scope;
|
|
18
|
-
private readonly dataPath;
|
|
19
|
-
private readonly editor;
|
|
20
|
-
/** files: your config and this folder's project file; dataPath: where the apps catalogue looks for installed apps. */
|
|
21
|
-
constructor(app: App, files: Record<Scope, ConfigFile>, scope?: Scope, dataPath?: string);
|
|
22
|
-
/** The file the current tab edits. */
|
|
23
|
-
get file(): ConfigFile;
|
|
24
|
-
private get title();
|
|
25
|
-
/** Every editable setting with the category and heading it is shown under. */
|
|
26
|
-
settings(): Setting[];
|
|
27
|
-
private item;
|
|
28
|
-
run(): Promise<void>;
|
|
29
|
-
private edit;
|
|
30
|
-
/** Saves (or resets) one setting and returns the notice to show. */
|
|
31
|
-
private save;
|
|
32
|
-
}
|
|
4
|
+
export { SettingsEditor, type Scope } from './settings-editor.js';
|
|
@@ -1,136 +1,4 @@
|
|
|
1
|
-
// The settings screen: two scopes on tabs, your own settings ("All projects", blue) and this folder's
|
|
2
|
-
// .sandbox-config.json ("This project", purple); Tab switches and keeps your place. Every setting is grouped into
|
|
3
|
-
// categories (sidebar), searchable, with its value in both scopes, its default and description. Enter edits (on/off
|
|
4
|
-
// flips at once), r resets. Edits keep the file's comments and formatting, and nothing is saved unless the whole file
|
|
5
|
-
// stays valid.
|
|
6
|
-
import _ from 'lodash';
|
|
7
|
-
import { NEVER_LOOSER } from '../../../core/local-config.js';
|
|
8
|
-
import { Text, Theme } from '../../tui/index.js';
|
|
9
|
-
import { AppsCatalogue } from '../apps.js';
|
|
10
|
-
import { CATEGORIES, categoryOf, nameOf } from './categories.js';
|
|
11
|
-
import { formatValue, ValueEditor } from './editors.js';
|
|
12
1
|
export { CATEGORIES, nameOf } from './categories.js';
|
|
13
2
|
export { ConfigFile, editConfigText, fileValue } from './config-file.js';
|
|
14
3
|
export { SchemaNode } from './schema-node.js';
|
|
15
|
-
|
|
16
|
-
{ scope: 'user', tab: { label: 'All projects', badge: 'YOURS', paint: Theme.scopeGlobal } },
|
|
17
|
-
{ scope: 'project', tab: { label: 'This project', badge: 'PROJECT', paint: Theme.scopeProject } },
|
|
18
|
-
];
|
|
19
|
-
export class SettingsEditor {
|
|
20
|
-
app;
|
|
21
|
-
files;
|
|
22
|
-
scope;
|
|
23
|
-
dataPath;
|
|
24
|
-
editor;
|
|
25
|
-
/** files: your config and this folder's project file; dataPath: where the apps catalogue looks for installed apps. */
|
|
26
|
-
constructor(app, files, scope = 'user', dataPath = '') {
|
|
27
|
-
this.app = app;
|
|
28
|
-
this.files = files;
|
|
29
|
-
this.scope = scope;
|
|
30
|
-
this.dataPath = dataPath;
|
|
31
|
-
this.editor = new ValueEditor(app, { suggestions: (key) => (['defaultHarness', 'harness'].includes(key.join('.')) ? Object.keys(this.file.userConfig().harnesses) : undefined) });
|
|
32
|
-
}
|
|
33
|
-
/** The file the current tab edits. */
|
|
34
|
-
get file() { return this.files[this.scope]; }
|
|
35
|
-
get title() { return 'Settings · ' + (this.file.isProject ? 'This project' : 'All projects'); }
|
|
36
|
-
/** Every editable setting with the category and heading it is shown under. */
|
|
37
|
-
settings() {
|
|
38
|
-
return this.file.schema.children().flatMap(([top, node]) => {
|
|
39
|
-
const category = categoryOf(top);
|
|
40
|
-
if (!category)
|
|
41
|
-
return [];
|
|
42
|
-
const several = category.keys.filter((k) => this.file.schema.child(k)).length > 1;
|
|
43
|
-
if (!node.isSection)
|
|
44
|
-
return [{ key: [top], node, category: category.id, section: several && category.id !== 'general' ? nameOf(top) : undefined }];
|
|
45
|
-
return node.leaves([top]).map(({ key, node: leaf }) => {
|
|
46
|
-
const heading = [several ? nameOf(top) : undefined, key.length > 2 ? key.slice(1, -1).map(nameOf).join(' › ') : undefined].filter(Boolean).join(' › ');
|
|
47
|
-
return { key, node: leaf, category: category.id, section: heading || undefined };
|
|
48
|
-
});
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
item(s, config) {
|
|
52
|
-
const inFile = this.file.valueInFile(s.key);
|
|
53
|
-
const set = inFile !== undefined;
|
|
54
|
-
const yours = _.get(config, s.key);
|
|
55
|
-
const id = s.key.join('.');
|
|
56
|
-
const project = this.files.project;
|
|
57
|
-
const inProject = project.schema.leaves().some((l) => l.key.join('.') === id) ? project.valueInFile(s.key) : undefined;
|
|
58
|
-
const paint = this.file.isProject ? Theme.project : Theme.changed;
|
|
59
|
-
const value = this.file.isProject && !set ? Theme.muted('all projects: ') + formatValue(yours, 40) : formatValue(this.file.effective(s.key, config));
|
|
60
|
-
const details = [
|
|
61
|
-
Theme.muted('Setting ') + id,
|
|
62
|
-
Theme.muted('All projects ') + formatValue(yours, 40) + Theme.muted(this.files.user.valueInFile(s.key) === undefined ? ' (built-in default)' : ' (your file)'),
|
|
63
|
-
Theme.muted('This project ') + (inProject === undefined ? Theme.muted('not set') : Theme.project(Text.strip(formatValue(inProject, 40)))),
|
|
64
|
-
...(!this.file.isProject ? [Theme.muted('Default ') + formatValue(this.file.defaultOf(s.key), 40)] : []),
|
|
65
|
-
...(this.file.isProject && NEVER_LOOSER.includes(id) ? [Theme.warn(Theme.glyph.lock + ' A project can only make this stricter than your own setting.')] : []),
|
|
66
|
-
];
|
|
67
|
-
return {
|
|
68
|
-
value: id,
|
|
69
|
-
label: Text.humanize(s.key[s.key.length - 1]),
|
|
70
|
-
hint: set ? paint(Text.strip(value)) + ' ' + paint(Theme.glyph.changed) : value,
|
|
71
|
-
description: s.node.description,
|
|
72
|
-
details,
|
|
73
|
-
section: s.section,
|
|
74
|
-
category: s.category,
|
|
75
|
-
keywords: id,
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
async run() {
|
|
79
|
-
let focus;
|
|
80
|
-
let notice;
|
|
81
|
-
for (;;) {
|
|
82
|
-
const config = this.file.userConfig();
|
|
83
|
-
const settings = this.settings();
|
|
84
|
-
const categories = CATEGORIES.filter((c) => settings.some((s) => s.category === c.id)).map((c) => ({ id: c.id, label: c.label, description: c.description }));
|
|
85
|
-
const picked = await this.app.list({
|
|
86
|
-
path: [this.title],
|
|
87
|
-
tabs: { items: SCOPES.map((x) => x.tab), active: SCOPES.findIndex((x) => x.scope === this.scope) },
|
|
88
|
-
status: (this.file.isProject ? Theme.project('●') : Theme.accent('●')) + Theme.muted(' Editing ') + Text.middle(this.file.file, 80) + (this.file.exists ? '' : Theme.muted(' (created when you save)')) + (this.file.isProject ? Theme.muted(' · only what a project may set; needs your approval at the next launch') : ''),
|
|
89
|
-
items: settings.map((s) => this.item(s, config)),
|
|
90
|
-
categories,
|
|
91
|
-
startAt: focus,
|
|
92
|
-
actions: [{ key: 'r', label: this.file.isProject ? 'remove from project' : 'reset to default' }],
|
|
93
|
-
notice,
|
|
94
|
-
});
|
|
95
|
-
notice = undefined;
|
|
96
|
-
if (picked.kind === 'back')
|
|
97
|
-
return;
|
|
98
|
-
// The other tab, on the same setting when that scope has it.
|
|
99
|
-
if (picked.kind === 'tab') {
|
|
100
|
-
this.scope = SCOPES[picked.index].scope;
|
|
101
|
-
continue;
|
|
102
|
-
}
|
|
103
|
-
if (picked.kind !== 'pick' && picked.kind !== 'action')
|
|
104
|
-
continue;
|
|
105
|
-
if (picked.value === undefined)
|
|
106
|
-
continue;
|
|
107
|
-
focus = picked.value;
|
|
108
|
-
const setting = settings.find((s) => s.key.join('.') === picked.value);
|
|
109
|
-
if (picked.kind === 'action')
|
|
110
|
-
notice = this.save(setting.key, undefined, 'reset');
|
|
111
|
-
else
|
|
112
|
-
notice = await this.edit(setting, config);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
async edit(s, config) {
|
|
116
|
-
// The apps list is picked from the catalogue (by category, with sizes), not typed.
|
|
117
|
-
if (s.key.join('.') === 'apps.install')
|
|
118
|
-
return new AppsCatalogue(this.app, this.file, this.dataPath).run();
|
|
119
|
-
const current = this.file.isProject ? this.file.valueInFile(s.key) ?? _.get(config, s.key) : _.get(config, s.key);
|
|
120
|
-
const path = [this.title, ...s.key.slice(0, -1).map(nameOf), Text.humanize(s.key[s.key.length - 1])];
|
|
121
|
-
const edited = await this.editor.edit(path, s.key, s.node, current);
|
|
122
|
-
return edited ? this.save(s.key, edited.value, 'save') : undefined;
|
|
123
|
-
}
|
|
124
|
-
/** Saves (or resets) one setting and returns the notice to show. */
|
|
125
|
-
save(key, value, how) {
|
|
126
|
-
const name = key.join('.');
|
|
127
|
-
const result = this.file.set(key, value);
|
|
128
|
-
if (result === 'unchanged')
|
|
129
|
-
return Theme.muted(how === 'reset' ? name + ' is already the default.' : 'Unchanged.');
|
|
130
|
-
if (typeof result === 'object')
|
|
131
|
-
return Theme.error(Theme.glyph.cross + ' Not saved: ' + result.problems.join('; '));
|
|
132
|
-
// The approval is tied to the file's exact contents, so any change makes the project file need approval again.
|
|
133
|
-
const after = this.file.isProject ? ' The next launch asks you to approve the project file again.' : ' New sandboxes use it.';
|
|
134
|
-
return Theme.ok(Theme.glyph.ok + ' ' + (how === 'reset' ? 'Reset ' + name + '.' : 'Saved ' + name + '.')) + Theme.muted(after);
|
|
135
|
-
}
|
|
136
|
-
}
|
|
4
|
+
export { SettingsEditor } from './settings-editor.js';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type App } from '../../tui/index.js';
|
|
2
|
+
import { type SchemaNode } from './schema-node.js';
|
|
3
|
+
import type { ValueEditor, Edited } from './value-editor.js';
|
|
4
|
+
/** One object as a form: each field with its value, Enter to change it, r to clear an optional one. */
|
|
5
|
+
export declare class ObjectEditor {
|
|
6
|
+
private readonly app;
|
|
7
|
+
private readonly path;
|
|
8
|
+
private readonly node;
|
|
9
|
+
private readonly editor;
|
|
10
|
+
constructor(app: App, path: string[], node: SchemaNode, editor: ValueEditor);
|
|
11
|
+
run(start: Record<string, unknown>, isNew?: boolean): Promise<Edited>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import _ from 'lodash';
|
|
2
|
+
import { Text, Theme } from '../../tui/index.js';
|
|
3
|
+
import { SAVE } from './editor-actions.js';
|
|
4
|
+
import { formatValue } from './format.js';
|
|
5
|
+
/** One object as a form: each field with its value, Enter to change it, r to clear an optional one. */
|
|
6
|
+
export class ObjectEditor {
|
|
7
|
+
app;
|
|
8
|
+
path;
|
|
9
|
+
node;
|
|
10
|
+
editor;
|
|
11
|
+
constructor(app, path, node, editor) {
|
|
12
|
+
this.app = app;
|
|
13
|
+
this.path = path;
|
|
14
|
+
this.node = node;
|
|
15
|
+
this.editor = editor;
|
|
16
|
+
}
|
|
17
|
+
async run(start, isNew = false) {
|
|
18
|
+
const value = structuredClone(start);
|
|
19
|
+
let focus;
|
|
20
|
+
let notice;
|
|
21
|
+
for (;;) {
|
|
22
|
+
const dirty = isNew || !_.isEqual(value, start);
|
|
23
|
+
const problem = this.node.check(value);
|
|
24
|
+
const fields = this.node.children();
|
|
25
|
+
const picked = await this.app.list({
|
|
26
|
+
path: this.path,
|
|
27
|
+
intro: this.node.description,
|
|
28
|
+
notice,
|
|
29
|
+
items: [
|
|
30
|
+
{
|
|
31
|
+
value: SAVE,
|
|
32
|
+
label: problem === true
|
|
33
|
+
? dirty
|
|
34
|
+
? Theme.ok(Theme.glyph.ok + ' Save')
|
|
35
|
+
: Theme.muted(Theme.glyph.ok + ' Done (no changes)')
|
|
36
|
+
: Theme.warn(Theme.glyph.cross + ' Not complete yet'),
|
|
37
|
+
description: problem === true ? undefined : problem,
|
|
38
|
+
section: 'Actions',
|
|
39
|
+
},
|
|
40
|
+
...fields.map(([name, field]) => ({
|
|
41
|
+
value: name,
|
|
42
|
+
label: Text.humanize(name),
|
|
43
|
+
hint: formatValue(value[name]),
|
|
44
|
+
description: field.description,
|
|
45
|
+
section: 'Fields',
|
|
46
|
+
})),
|
|
47
|
+
],
|
|
48
|
+
startAt: focus,
|
|
49
|
+
actions: [{ key: 'r', label: 'clear' }],
|
|
50
|
+
});
|
|
51
|
+
notice = undefined;
|
|
52
|
+
if (picked.kind === 'back') {
|
|
53
|
+
if (!dirty ||
|
|
54
|
+
(await this.app.confirm({
|
|
55
|
+
path: this.path,
|
|
56
|
+
question: 'Discard your changes?',
|
|
57
|
+
yes: 'Discard',
|
|
58
|
+
no: 'Keep editing',
|
|
59
|
+
initial: false,
|
|
60
|
+
danger: true,
|
|
61
|
+
})))
|
|
62
|
+
return undefined;
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
if (picked.kind === 'pick' && picked.value === SAVE) {
|
|
66
|
+
if (problem !== true) {
|
|
67
|
+
notice = Theme.warn(problem);
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
return dirty ? { value } : undefined;
|
|
71
|
+
}
|
|
72
|
+
const name = picked.kind === 'pick' || picked.kind === 'action' ? picked.value : undefined;
|
|
73
|
+
if (!name || name === SAVE)
|
|
74
|
+
continue;
|
|
75
|
+
focus = name;
|
|
76
|
+
const field = this.node.child(name);
|
|
77
|
+
if (picked.kind === 'action') {
|
|
78
|
+
delete value[name];
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
const edited = await this.editor.edit([...this.path, Text.humanize(name)], [name], field, value[name]);
|
|
82
|
+
if (edited)
|
|
83
|
+
value[name] = edited.value;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
@@ -54,7 +54,9 @@ export declare class SchemaNode {
|
|
|
54
54
|
get choiceValues(): unknown[];
|
|
55
55
|
/** The member of a union that is not a fixed value (a number, a string ...), edited after "Custom...". */
|
|
56
56
|
get openOption(): SchemaNode | undefined;
|
|
57
|
-
/**
|
|
57
|
+
/**
|
|
58
|
+
* What a new entry (in a list or a map) starts as: the default if there is one, otherwise the simplest valid shape.
|
|
59
|
+
*/
|
|
58
60
|
initial(): unknown;
|
|
59
61
|
/** Is `value` acceptable here on its own? (The whole file is checked again when it is saved.) */
|
|
60
62
|
check(value: unknown): true | string;
|
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
const HIDDEN = new Set(['$schema']);
|
|
3
3
|
export class SchemaNode {
|
|
4
4
|
schema;
|
|
5
|
-
constructor(schema) {
|
|
5
|
+
constructor(schema) {
|
|
6
|
+
this.schema = schema;
|
|
7
|
+
}
|
|
6
8
|
/** The real type under optional() / default() / nullable() / transforms. */
|
|
7
9
|
get inner() {
|
|
8
10
|
let s = this.schema;
|
|
@@ -16,16 +18,28 @@ export class SchemaNode {
|
|
|
16
18
|
return s;
|
|
17
19
|
}
|
|
18
20
|
}
|
|
19
|
-
get type() {
|
|
21
|
+
get type() {
|
|
22
|
+
return this.inner._zod.def.type;
|
|
23
|
+
}
|
|
20
24
|
/** A group of settings (an object with known fields), opened rather than edited. */
|
|
21
|
-
get isSection() {
|
|
25
|
+
get isSection() {
|
|
26
|
+
return this.type === 'object' && Boolean(this.inner.shape);
|
|
27
|
+
}
|
|
22
28
|
/** The description, which .partial() / .optional() wrappers may carry on the inner schema instead. */
|
|
23
|
-
get description() {
|
|
24
|
-
|
|
25
|
-
|
|
29
|
+
get description() {
|
|
30
|
+
return this.schema.description ?? this.inner.description;
|
|
31
|
+
}
|
|
32
|
+
get min() {
|
|
33
|
+
return this.inner.minValue ?? undefined;
|
|
34
|
+
}
|
|
35
|
+
get max() {
|
|
36
|
+
return this.inner.maxValue ?? undefined;
|
|
37
|
+
}
|
|
26
38
|
/** The fields of an object, in schema order. */
|
|
27
39
|
children() {
|
|
28
|
-
return Object.entries(this.inner.shape ?? {})
|
|
40
|
+
return Object.entries(this.inner.shape ?? {})
|
|
41
|
+
.filter(([name]) => !HIDDEN.has(name))
|
|
42
|
+
.map(([name, s]) => [name, new SchemaNode(s)]);
|
|
29
43
|
}
|
|
30
44
|
child(name) {
|
|
31
45
|
const s = this.inner.shape?.[name];
|
|
@@ -33,15 +47,21 @@ export class SchemaNode {
|
|
|
33
47
|
}
|
|
34
48
|
/** Every setting below this one that has an editor of its own (not a section), with its path. */
|
|
35
49
|
leaves(key = []) {
|
|
36
|
-
return this.children().flatMap(([name, child]) =>
|
|
50
|
+
return this.children().flatMap(([name, child]) => child.isSection ? child.leaves([...key, name]) : [{ key: [...key, name], node: child }]);
|
|
37
51
|
}
|
|
38
52
|
/** Array items, or a map's values. */
|
|
39
53
|
get element() {
|
|
40
54
|
const def = this.inner._zod.def;
|
|
41
|
-
return def.type === 'array' && def.element
|
|
55
|
+
return def.type === 'array' && def.element
|
|
56
|
+
? new SchemaNode(def.element)
|
|
57
|
+
: def.type === 'record' && def.valueType
|
|
58
|
+
? new SchemaNode(def.valueType)
|
|
59
|
+
: undefined;
|
|
42
60
|
}
|
|
43
61
|
/** Union members. */
|
|
44
|
-
get options() {
|
|
62
|
+
get options() {
|
|
63
|
+
return (this.inner._zod.def.options ?? []).map((o) => new SchemaNode(o));
|
|
64
|
+
}
|
|
45
65
|
/** The values an enum or literal allows. */
|
|
46
66
|
get choices() {
|
|
47
67
|
const def = this.inner._zod.def;
|
|
@@ -63,9 +83,19 @@ export class SchemaNode {
|
|
|
63
83
|
return type;
|
|
64
84
|
const element = this.element;
|
|
65
85
|
if (type === 'array' && element)
|
|
66
|
-
return element.type === 'string'
|
|
86
|
+
return element.type === 'string'
|
|
87
|
+
? 'string-list'
|
|
88
|
+
: element.type === 'enum'
|
|
89
|
+
? 'choice-list'
|
|
90
|
+
: element.type === 'object'
|
|
91
|
+
? 'object-list'
|
|
92
|
+
: 'json';
|
|
67
93
|
if (type === 'record' && element)
|
|
68
|
-
return ['string', 'number', 'boolean'].includes(element.type)
|
|
94
|
+
return ['string', 'number', 'boolean'].includes(element.type)
|
|
95
|
+
? 'string-map'
|
|
96
|
+
: element.type === 'object'
|
|
97
|
+
? 'object-map'
|
|
98
|
+
: 'json';
|
|
69
99
|
if (type === 'object')
|
|
70
100
|
return 'object';
|
|
71
101
|
return 'json';
|
|
@@ -77,28 +107,45 @@ export class SchemaNode {
|
|
|
77
107
|
return this.options.flatMap((o) => (o.type === 'boolean' ? [true, false] : o.choices));
|
|
78
108
|
}
|
|
79
109
|
/** The member of a union that is not a fixed value (a number, a string ...), edited after "Custom...". */
|
|
80
|
-
get openOption() {
|
|
81
|
-
|
|
110
|
+
get openOption() {
|
|
111
|
+
return this.options.find((o) => !['literal', 'enum', 'boolean'].includes(o.type));
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* What a new entry (in a list or a map) starts as: the default if there is one, otherwise the simplest valid shape.
|
|
115
|
+
*/
|
|
82
116
|
initial() {
|
|
83
117
|
const def = this.schema._zod.def;
|
|
84
118
|
if (def.type === 'default')
|
|
85
119
|
return structuredClone(def.defaultValue);
|
|
86
120
|
switch (this.type) {
|
|
87
|
-
case 'boolean':
|
|
88
|
-
|
|
89
|
-
case '
|
|
121
|
+
case 'boolean':
|
|
122
|
+
return false;
|
|
123
|
+
case 'number':
|
|
124
|
+
return this.min ?? 0;
|
|
125
|
+
case 'string':
|
|
126
|
+
return '';
|
|
90
127
|
case 'enum':
|
|
91
|
-
case 'literal':
|
|
92
|
-
|
|
93
|
-
case '
|
|
94
|
-
|
|
95
|
-
case '
|
|
96
|
-
|
|
128
|
+
case 'literal':
|
|
129
|
+
return this.choices[0];
|
|
130
|
+
case 'union':
|
|
131
|
+
return this.options[0]?.initial();
|
|
132
|
+
case 'array':
|
|
133
|
+
return [];
|
|
134
|
+
case 'record':
|
|
135
|
+
return {};
|
|
136
|
+
case 'object':
|
|
137
|
+
return Object.fromEntries(this.children()
|
|
138
|
+
.filter(([, c]) => !['optional', 'default'].includes(c.schema._zod.def.type))
|
|
139
|
+
.map(([name, c]) => [name, c.initial()]));
|
|
140
|
+
default:
|
|
141
|
+
return null;
|
|
97
142
|
}
|
|
98
143
|
}
|
|
99
144
|
/** Is `value` acceptable here on its own? (The whole file is checked again when it is saved.) */
|
|
100
145
|
check(value) {
|
|
101
146
|
const result = this.schema.safeParse(value);
|
|
102
|
-
return result.success
|
|
147
|
+
return result.success
|
|
148
|
+
? true
|
|
149
|
+
: result.error.issues.map((i) => (i.path.length ? i.path.join('.') + ': ' : '') + i.message).join('; ');
|
|
103
150
|
}
|
|
104
151
|
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type App } from '../../tui/index.js';
|
|
2
|
+
import { type ConfigFile } from './config-file.js';
|
|
3
|
+
import type { SchemaNode } from './schema-node.js';
|
|
4
|
+
interface Setting {
|
|
5
|
+
key: string[];
|
|
6
|
+
node: SchemaNode;
|
|
7
|
+
category: string;
|
|
8
|
+
section?: string;
|
|
9
|
+
}
|
|
10
|
+
export type Scope = 'user' | 'project';
|
|
11
|
+
export declare class SettingsEditor {
|
|
12
|
+
private readonly app;
|
|
13
|
+
private readonly files;
|
|
14
|
+
private scope;
|
|
15
|
+
private readonly dataPath;
|
|
16
|
+
private readonly editor;
|
|
17
|
+
/** files: your config and this folder's project file; dataPath: where the apps catalogue looks for installed apps. */
|
|
18
|
+
constructor(app: App, files: Record<Scope, ConfigFile>, scope?: Scope, dataPath?: string);
|
|
19
|
+
/** The file the current tab edits. */
|
|
20
|
+
get file(): ConfigFile;
|
|
21
|
+
private get title();
|
|
22
|
+
/** Every editable setting with the category and heading it is shown under. */
|
|
23
|
+
settings(): Setting[];
|
|
24
|
+
private item;
|
|
25
|
+
run(): Promise<void>;
|
|
26
|
+
private edit;
|
|
27
|
+
/** Saves (or resets) one setting and returns the notice to show. */
|
|
28
|
+
private save;
|
|
29
|
+
}
|
|
30
|
+
export {};
|