windows-development-sandbox 1.4.1 → 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/config.example.json +3 -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 +327 -53
- 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/{progress.d.ts → output/progress.d.ts} +5 -5
- package/dist/cli/{progress.js → output/progress.js} +42 -19
- 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} +3 -18
- package/dist/core/{local-config.js → local-config/overrides.js} +45 -52
- package/dist/core/local-config/policy.d.ts +19 -0
- package/dist/core/local-config/policy.js +45 -0
- 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 +15 -10
- 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 +1 -1
- package/dist/core/schema/projects.js +16 -6
- package/dist/core/schema/sandbox.d.ts +11 -11
- 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 +19 -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} +96 -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 -106
- 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} +22 -13
- 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 +5 -5
- package/dist/host/launch/mappings.js +37 -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/{join.d.ts → projects/join.d.ts} +12 -9
- package/dist/host/{join.js → projects/join.js} +62 -33
- 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 +4220 -1968
- package/dist/runtime/db.js +2134 -849
- package/dist/runtime/gitguard.js +29 -11
- package/dist/runtime/main.js +4687 -2243
- package/dist/runtime/netproxy.js +1644 -420
- package/dist/runtime/view.js +1356 -428
- 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 +63 -16
- 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 +72 -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 +1 -1
- package/dist/selftest/live-terminal.test.js +41 -15
- package/dist/selftest/local-config.test.d.ts +1 -1
- package/dist/selftest/local-config.test.js +64 -16
- package/dist/selftest/mirror.test.d.ts +1 -1
- package/dist/selftest/mirror.test.js +102 -32
- 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 +280 -85
- 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} +5 -3
- 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} +38 -21
- package/dist/shared/{schema.js → channel/schema.js} +62 -35
- 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} +6 -12
- package/dist/shared/{guest-paths.js → paths/guest-paths.js} +53 -36
- package/dist/shared/paths/index.d.ts +3 -0
- package/dist/shared/paths/index.js +3 -0
- package/dist/shared/{projects.js → paths/projects.js} +13 -3
- package/dist/shared/pty/client.d.ts +21 -0
- package/dist/shared/pty/client.js +79 -0
- package/dist/shared/{console-input.js → pty/console-input.js} +26 -6
- 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/schemas/config.schema.json +34 -1
- package/schemas/sandbox-config.schema.json +34 -1
- package/dist/cli/boot-progress.d.ts +0 -22
- package/dist/cli/boot-progress.js +0 -59
- package/dist/cli/commands/launch.d.ts +0 -32
- package/dist/cli/commands/launch.js +0 -421
- package/dist/cli/commands/maintenance.d.ts +0 -10
- package/dist/cli/commands/maintenance.js +0 -220
- package/dist/cli/commands/project.d.ts +0 -33
- package/dist/cli/commands/project.js +0 -102
- 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 -95
- package/dist/cli/commands/sessions.d.ts +0 -12
- package/dist/cli/commands/sessions.js +0 -258
- package/dist/cli/menu/settings/editors.js +0 -305
- 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/project-policy.d.ts +0 -62
- package/dist/core/project-policy.js +0 -121
- 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 -35
- package/dist/core/workspace.js +0 -206
- package/dist/guest/boot-env.d.ts +0 -4
- package/dist/guest/daemon.js +0 -57
- package/dist/guest/env.d.ts +0 -56
- package/dist/guest/env.js +0 -115
- 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 -163
- package/dist/host/generate.d.ts +0 -13
- package/dist/host/generate.js +0 -115
- package/dist/host/launch/projects.d.ts +0 -17
- 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 -123
- package/dist/host/projects.js +0 -196
- 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 -63
- package/dist/shared/download.js +0 -238
- package/dist/shared/pty-client.d.ts +0 -108
- package/dist/shared/pty-client.js +0 -406
- package/dist/shared/rundir.d.ts +0 -41
- package/dist/shared/rundir.js +0 -96
- /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
- /package/dist/shared/{projects.d.ts → paths/projects.d.ts} +0 -0
- /package/dist/shared/{console-input.d.ts → pty/console-input.d.ts} +0 -0
|
@@ -0,0 +1,176 @@
|
|
|
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/index.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 } from './format.js';
|
|
12
|
+
import { ValueEditor } from './value-editor.js';
|
|
13
|
+
const SCOPES = [
|
|
14
|
+
{ scope: 'user', tab: { label: 'All projects', badge: 'YOURS', paint: Theme.scopeGlobal } },
|
|
15
|
+
{ scope: 'project', tab: { label: 'This project', badge: 'PROJECT', paint: Theme.scopeProject } },
|
|
16
|
+
];
|
|
17
|
+
export class SettingsEditor {
|
|
18
|
+
app;
|
|
19
|
+
files;
|
|
20
|
+
scope;
|
|
21
|
+
dataPath;
|
|
22
|
+
editor;
|
|
23
|
+
/** files: your config and this folder's project file; dataPath: where the apps catalogue looks for installed apps. */
|
|
24
|
+
constructor(app, files, scope = 'user', dataPath = '') {
|
|
25
|
+
this.app = app;
|
|
26
|
+
this.files = files;
|
|
27
|
+
this.scope = scope;
|
|
28
|
+
this.dataPath = dataPath;
|
|
29
|
+
this.editor = new ValueEditor(app, {
|
|
30
|
+
suggestions: (key) => ['defaultHarness', 'harness'].includes(key.join('.'))
|
|
31
|
+
? Object.keys(this.file.userConfig().harnesses)
|
|
32
|
+
: undefined,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/** The file the current tab edits. */
|
|
36
|
+
get file() {
|
|
37
|
+
return this.files[this.scope];
|
|
38
|
+
}
|
|
39
|
+
get title() {
|
|
40
|
+
return 'Settings · ' + (this.file.isProject ? 'This project' : 'All projects');
|
|
41
|
+
}
|
|
42
|
+
/** Every editable setting with the category and heading it is shown under. */
|
|
43
|
+
settings() {
|
|
44
|
+
return this.file.schema.children().flatMap(([top, node]) => {
|
|
45
|
+
const category = categoryOf(top);
|
|
46
|
+
if (!category)
|
|
47
|
+
return [];
|
|
48
|
+
const several = category.keys.filter((k) => this.file.schema.child(k)).length > 1;
|
|
49
|
+
if (!node.isSection)
|
|
50
|
+
return [
|
|
51
|
+
{
|
|
52
|
+
key: [top],
|
|
53
|
+
node,
|
|
54
|
+
category: category.id,
|
|
55
|
+
section: several && category.id !== 'general' ? nameOf(top) : undefined,
|
|
56
|
+
},
|
|
57
|
+
];
|
|
58
|
+
return node.leaves([top]).map(({ key, node: leaf }) => {
|
|
59
|
+
const heading = [
|
|
60
|
+
several ? nameOf(top) : undefined,
|
|
61
|
+
key.length > 2 ? key.slice(1, -1).map(nameOf).join(' › ') : undefined,
|
|
62
|
+
]
|
|
63
|
+
.filter(Boolean)
|
|
64
|
+
.join(' › ');
|
|
65
|
+
return { key, node: leaf, category: category.id, section: heading || undefined };
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
item(s, config) {
|
|
70
|
+
const inFile = this.file.valueInFile(s.key);
|
|
71
|
+
const set = inFile !== undefined;
|
|
72
|
+
const yours = _.get(config, s.key);
|
|
73
|
+
const id = s.key.join('.');
|
|
74
|
+
const project = this.files.project;
|
|
75
|
+
const inProject = project.schema.leaves().some((l) => l.key.join('.') === id)
|
|
76
|
+
? project.valueInFile(s.key)
|
|
77
|
+
: undefined;
|
|
78
|
+
const paint = this.file.isProject ? Theme.project : Theme.changed;
|
|
79
|
+
const value = this.file.isProject && !set
|
|
80
|
+
? Theme.muted('all projects: ') + formatValue(yours, 40)
|
|
81
|
+
: formatValue(this.file.effective(s.key, config));
|
|
82
|
+
const details = [
|
|
83
|
+
Theme.muted('Setting ') + id,
|
|
84
|
+
Theme.muted('All projects ') +
|
|
85
|
+
formatValue(yours, 40) +
|
|
86
|
+
Theme.muted(this.files.user.valueInFile(s.key) === undefined ? ' (built-in default)' : ' (your file)'),
|
|
87
|
+
Theme.muted('This project ') +
|
|
88
|
+
(inProject === undefined ? Theme.muted('not set') : Theme.project(Text.strip(formatValue(inProject, 40)))),
|
|
89
|
+
...(!this.file.isProject ? [Theme.muted('Default ') + formatValue(this.file.defaultOf(s.key), 40)] : []),
|
|
90
|
+
...(this.file.isProject && NEVER_LOOSER.includes(id)
|
|
91
|
+
? [Theme.warn(Theme.glyph.lock + ' A project can only make this stricter than your own setting.')]
|
|
92
|
+
: []),
|
|
93
|
+
];
|
|
94
|
+
return {
|
|
95
|
+
value: id,
|
|
96
|
+
label: Text.humanize(s.key[s.key.length - 1]),
|
|
97
|
+
hint: set ? paint(Text.strip(value)) + ' ' + paint(Theme.glyph.changed) : value,
|
|
98
|
+
description: s.node.description,
|
|
99
|
+
details,
|
|
100
|
+
section: s.section,
|
|
101
|
+
category: s.category,
|
|
102
|
+
keywords: id,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
async run() {
|
|
106
|
+
let focus;
|
|
107
|
+
let notice;
|
|
108
|
+
for (;;) {
|
|
109
|
+
const config = this.file.userConfig();
|
|
110
|
+
const settings = this.settings();
|
|
111
|
+
const categories = CATEGORIES.filter((c) => settings.some((s) => s.category === c.id)).map((c) => ({
|
|
112
|
+
id: c.id,
|
|
113
|
+
label: c.label,
|
|
114
|
+
description: c.description,
|
|
115
|
+
}));
|
|
116
|
+
const picked = await this.app.list({
|
|
117
|
+
path: [this.title],
|
|
118
|
+
tabs: { items: SCOPES.map((x) => x.tab), active: SCOPES.findIndex((x) => x.scope === this.scope) },
|
|
119
|
+
status: (this.file.isProject ? Theme.project('●') : Theme.accent('●')) +
|
|
120
|
+
Theme.muted(' Editing ') +
|
|
121
|
+
Text.middle(this.file.file, 80) +
|
|
122
|
+
(this.file.exists ? '' : Theme.muted(' (created when you save)')) +
|
|
123
|
+
(this.file.isProject
|
|
124
|
+
? Theme.muted(' · only what a project may set; needs your approval at the next launch')
|
|
125
|
+
: ''),
|
|
126
|
+
items: settings.map((s) => this.item(s, config)),
|
|
127
|
+
categories,
|
|
128
|
+
startAt: focus,
|
|
129
|
+
actions: [{ key: 'r', label: this.file.isProject ? 'remove from project' : 'reset to default' }],
|
|
130
|
+
notice,
|
|
131
|
+
});
|
|
132
|
+
notice = undefined;
|
|
133
|
+
if (picked.kind === 'back')
|
|
134
|
+
return;
|
|
135
|
+
// The other tab, on the same setting when that scope has it.
|
|
136
|
+
if (picked.kind === 'tab') {
|
|
137
|
+
this.scope = SCOPES[picked.index].scope;
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
if (picked.kind !== 'pick' && picked.kind !== 'action')
|
|
141
|
+
continue;
|
|
142
|
+
if (picked.value === undefined)
|
|
143
|
+
continue;
|
|
144
|
+
focus = picked.value;
|
|
145
|
+
const setting = settings.find((s) => s.key.join('.') === picked.value);
|
|
146
|
+
if (picked.kind === 'action')
|
|
147
|
+
notice = this.save(setting.key, undefined, 'reset');
|
|
148
|
+
else
|
|
149
|
+
notice = await this.edit(setting, config);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
async edit(s, config) {
|
|
153
|
+
// The apps list is picked from the catalogue (by category, with sizes), not typed.
|
|
154
|
+
if (s.key.join('.') === 'apps.install')
|
|
155
|
+
return new AppsCatalogue(this.app, this.file, this.dataPath).run();
|
|
156
|
+
const current = this.file.isProject ? (this.file.valueInFile(s.key) ?? _.get(config, s.key)) : _.get(config, s.key);
|
|
157
|
+
const path = [this.title, ...s.key.slice(0, -1).map(nameOf), Text.humanize(s.key[s.key.length - 1])];
|
|
158
|
+
const edited = await this.editor.edit(path, s.key, s.node, current);
|
|
159
|
+
return edited ? this.save(s.key, edited.value, 'save') : undefined;
|
|
160
|
+
}
|
|
161
|
+
/** Saves (or resets) one setting and returns the notice to show. */
|
|
162
|
+
save(key, value, how) {
|
|
163
|
+
const name = key.join('.');
|
|
164
|
+
const result = this.file.set(key, value);
|
|
165
|
+
if (result === 'unchanged')
|
|
166
|
+
return Theme.muted(how === 'reset' ? name + ' is already the default.' : 'Unchanged.');
|
|
167
|
+
if (typeof result === 'object')
|
|
168
|
+
return Theme.error(Theme.glyph.cross + ' Not saved: ' + result.problems.join('; '));
|
|
169
|
+
// The approval is tied to the file's exact contents, so any change makes the project file need approval again.
|
|
170
|
+
const after = this.file.isProject
|
|
171
|
+
? ' The next launch asks you to approve the project file again.'
|
|
172
|
+
: ' New sandboxes use it.';
|
|
173
|
+
return (Theme.ok(Theme.glyph.ok + ' ' + (how === 'reset' ? 'Reset ' + name + '.' : 'Saved ' + name + '.')) +
|
|
174
|
+
Theme.muted(after));
|
|
175
|
+
}
|
|
176
|
+
}
|
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
import { App } from '../../tui/index.js';
|
|
2
|
-
import { SchemaNode } from './schema-node.js';
|
|
1
|
+
import { type App } from '../../tui/index.js';
|
|
2
|
+
import { type SchemaNode } from './schema-node.js';
|
|
3
3
|
/** The new value, or undefined when you backed out without changing anything. */
|
|
4
4
|
export type Edited = {
|
|
5
5
|
value: unknown;
|
|
6
6
|
} | undefined;
|
|
7
|
-
/** A value in one short line, for the right-hand column. */
|
|
8
|
-
export declare const formatValue: (value: unknown, max?: number) => string;
|
|
9
7
|
/** Optional extra knowledge: values to suggest for some settings (the configured agents for defaultHarness). */
|
|
10
8
|
export interface EditorHints {
|
|
11
9
|
suggestions?: (key: string[]) => string[] | undefined;
|
|
@@ -19,12 +17,3 @@ export declare class ValueEditor {
|
|
|
19
17
|
private suggest;
|
|
20
18
|
private json;
|
|
21
19
|
}
|
|
22
|
-
/** One object as a form: each field with its value, Enter to change it, r to clear an optional one. */
|
|
23
|
-
export declare class ObjectEditor {
|
|
24
|
-
private readonly app;
|
|
25
|
-
private readonly path;
|
|
26
|
-
private readonly node;
|
|
27
|
-
private readonly editor;
|
|
28
|
-
constructor(app: App, path: string[], node: SchemaNode, editor: ValueEditor);
|
|
29
|
-
run(start: Record<string, unknown>, isNew?: boolean): Promise<Edited>;
|
|
30
|
-
}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
// Editing one value with the screen that fits it: on/off flips, choices are picked from a list, numbers and text are
|
|
2
|
+
// typed and checked as you type, lists and maps get an editor of their own (add, change, remove), and objects (a
|
|
3
|
+
// mapped folder, an agent) open as a small form. JSON is only the last resort for shapes none of these fit.
|
|
4
|
+
import _ from 'lodash';
|
|
5
|
+
import { Text } from '../../tui/index.js';
|
|
6
|
+
import { choiceLabel } from './format.js';
|
|
7
|
+
import { StringListEditor } from './collections/string-list-editor.js';
|
|
8
|
+
import { MapEditor } from './collections/map-editor.js';
|
|
9
|
+
import { ObjectListEditor } from './collections/object-list-editor.js';
|
|
10
|
+
import { ObjectMapEditor } from './collections/object-map-editor.js';
|
|
11
|
+
import { ObjectEditor } from './object-editor.js';
|
|
12
|
+
export class ValueEditor {
|
|
13
|
+
app;
|
|
14
|
+
hints;
|
|
15
|
+
constructor(app, hints = {}) {
|
|
16
|
+
this.app = app;
|
|
17
|
+
this.hints = hints;
|
|
18
|
+
}
|
|
19
|
+
async edit(path, key, node, current) {
|
|
20
|
+
const about = node.description ? [node.description] : [];
|
|
21
|
+
const suggestions = this.hints.suggestions?.(key);
|
|
22
|
+
if (suggestions?.length && node.type === 'string')
|
|
23
|
+
return this.suggest(path, key, node, current, suggestions);
|
|
24
|
+
switch (node.editor) {
|
|
25
|
+
case 'boolean':
|
|
26
|
+
return { value: !(current ?? false) };
|
|
27
|
+
case 'choice':
|
|
28
|
+
return this.pick(path, node, current, node.choiceValues);
|
|
29
|
+
case 'union': {
|
|
30
|
+
const open = node.openOption;
|
|
31
|
+
const custom = '@custom';
|
|
32
|
+
const picked = await this.app.choose(path, node.description ?? '', [
|
|
33
|
+
...node.choiceValues.map((v) => ({ value: v, label: choiceLabel(v) })),
|
|
34
|
+
...(open
|
|
35
|
+
? [
|
|
36
|
+
{
|
|
37
|
+
value: custom,
|
|
38
|
+
label: 'Custom ' + open.type + '…',
|
|
39
|
+
description: 'Type a ' + open.type + ' of your own.',
|
|
40
|
+
},
|
|
41
|
+
]
|
|
42
|
+
: []),
|
|
43
|
+
], node.choiceValues.includes(current) ? current : open && current !== undefined ? custom : undefined);
|
|
44
|
+
if (picked === undefined)
|
|
45
|
+
return undefined;
|
|
46
|
+
return picked === custom && open
|
|
47
|
+
? this.edit(path, key, open, node.choiceValues.includes(current) ? undefined : current)
|
|
48
|
+
: { value: picked };
|
|
49
|
+
}
|
|
50
|
+
case 'number': {
|
|
51
|
+
const range = node.min !== undefined || node.max !== undefined
|
|
52
|
+
? ' (' + (node.min ?? '…') + ' to ' + (node.max ?? '…') + ')'
|
|
53
|
+
: '';
|
|
54
|
+
const typed = await this.app.text({
|
|
55
|
+
path,
|
|
56
|
+
label: Text.humanize(key[key.length - 1]) + range,
|
|
57
|
+
about,
|
|
58
|
+
initial: current === undefined ? '' : String(current),
|
|
59
|
+
validate: (v) => (v.trim() === '' || !Number.isFinite(Number(v)) ? 'Enter a number.' : node.check(Number(v))),
|
|
60
|
+
});
|
|
61
|
+
return typed === undefined ? undefined : { value: Number(typed) };
|
|
62
|
+
}
|
|
63
|
+
case 'string': {
|
|
64
|
+
const typed = await this.app.text({
|
|
65
|
+
path,
|
|
66
|
+
label: Text.humanize(key[key.length - 1]),
|
|
67
|
+
about,
|
|
68
|
+
initial: typeof current === 'string' ? current : '',
|
|
69
|
+
allowEmpty: node.check('') === true,
|
|
70
|
+
validate: (v) => node.check(v),
|
|
71
|
+
});
|
|
72
|
+
return typed === undefined ? undefined : { value: typed };
|
|
73
|
+
}
|
|
74
|
+
case 'choice-list': {
|
|
75
|
+
const ticked = Array.isArray(current) ? current : [];
|
|
76
|
+
const picked = await this.app.list({
|
|
77
|
+
path,
|
|
78
|
+
intro: node.description,
|
|
79
|
+
multi: true,
|
|
80
|
+
items: node.element.choices.map((v) => ({ value: v, label: String(v), checked: ticked.includes(v) })),
|
|
81
|
+
});
|
|
82
|
+
return picked.kind === 'multi' ? { value: picked.values } : undefined;
|
|
83
|
+
}
|
|
84
|
+
case 'string-list':
|
|
85
|
+
return new StringListEditor(this.app, path, node, this).run(Array.isArray(current) ? current : []);
|
|
86
|
+
case 'string-map':
|
|
87
|
+
return new MapEditor(this.app, path, node, this).run(_.isPlainObject(current) ? current : {});
|
|
88
|
+
case 'object-list':
|
|
89
|
+
return new ObjectListEditor(this.app, path, node, this).run(Array.isArray(current) ? current : []);
|
|
90
|
+
case 'object-map':
|
|
91
|
+
return new ObjectMapEditor(this.app, path, node, this).run(_.isPlainObject(current) ? current : {});
|
|
92
|
+
case 'object':
|
|
93
|
+
return new ObjectEditor(this.app, path, node, this).run(_.isPlainObject(current) ? current : node.initial());
|
|
94
|
+
default:
|
|
95
|
+
return this.json(path, key, node, current);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async pick(path, node, current, values) {
|
|
99
|
+
const picked = await this.app.choose(path, node.description ?? '', values.map((v) => ({ value: v, label: choiceLabel(v) })), current);
|
|
100
|
+
return picked === undefined ? undefined : { value: picked };
|
|
101
|
+
}
|
|
102
|
+
async suggest(path, key, node, current, suggestions) {
|
|
103
|
+
const other = '@other';
|
|
104
|
+
const picked = await this.app.choose(path, node.description ?? '', [
|
|
105
|
+
...suggestions.map((s) => ({ value: s, label: s })),
|
|
106
|
+
{ value: other, label: 'Other…', description: 'Type a name that is not in the list.' },
|
|
107
|
+
], typeof current === 'string' ? current : undefined);
|
|
108
|
+
if (picked === undefined)
|
|
109
|
+
return undefined;
|
|
110
|
+
if (picked !== other)
|
|
111
|
+
return { value: picked };
|
|
112
|
+
const typed = await this.app.text({
|
|
113
|
+
path,
|
|
114
|
+
label: Text.humanize(key[key.length - 1]),
|
|
115
|
+
initial: typeof current === 'string' ? current : '',
|
|
116
|
+
validate: (v) => node.check(v),
|
|
117
|
+
});
|
|
118
|
+
return typed === undefined ? undefined : { value: typed };
|
|
119
|
+
}
|
|
120
|
+
async json(path, key, node, current) {
|
|
121
|
+
const typed = await this.app.text({
|
|
122
|
+
path,
|
|
123
|
+
label: Text.humanize(key[key.length - 1]) + ' (JSON)',
|
|
124
|
+
about: node.description ? [node.description] : [],
|
|
125
|
+
initial: current === undefined ? '' : JSON.stringify(current),
|
|
126
|
+
validate: (v) => {
|
|
127
|
+
try {
|
|
128
|
+
return node.check(JSON.parse(v));
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return 'This is not valid JSON.';
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
return typed === undefined ? undefined : { value: JSON.parse(typed) };
|
|
136
|
+
}
|
|
137
|
+
}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import type { Context } from '../commands/context.js';
|
|
2
|
-
import { App } from '../tui/index.js';
|
|
2
|
+
import { type App } from '../tui/index.js';
|
|
3
3
|
/** Folders worth offering: this one, the projects started before, and the folders inside your roots. */
|
|
4
|
-
export declare
|
|
4
|
+
export declare function candidateFolders(ctx: Context, cwd?: string): string[];
|
|
5
5
|
/** The command line for several sessions: one --session per (agent, folder), with the shared options. */
|
|
6
|
-
export declare
|
|
6
|
+
export declare function severalAgentsArgv(sessions: {
|
|
7
7
|
harness: string;
|
|
8
8
|
folder: string;
|
|
9
9
|
}[], o: {
|
|
10
10
|
headless: boolean;
|
|
11
11
|
attachFirst: boolean;
|
|
12
|
-
})
|
|
12
|
+
}): string[];
|
|
13
13
|
export declare class SeveralAgents {
|
|
14
14
|
private readonly app;
|
|
15
15
|
private readonly ctx;
|
package/dist/cli/menu/several.js
CHANGED
|
@@ -3,25 +3,38 @@
|
|
|
3
3
|
import fs from 'node:fs';
|
|
4
4
|
import path from 'node:path';
|
|
5
5
|
import { assertSafeWorkspace } from '../../core/safe-paths.js';
|
|
6
|
-
import { errMsg, expandPath } from '../../core/util.js';
|
|
7
|
-
import {
|
|
8
|
-
import { isWithin } from '../../shared/
|
|
6
|
+
import { errMsg, expandPath } from '../../core/util/index.js';
|
|
7
|
+
import { KnownProjects } from '../../host/projects/index.js';
|
|
8
|
+
import { isWithin } from '../../shared/paths/index.js';
|
|
9
9
|
import { commandLine } from '../history.js';
|
|
10
10
|
import { Text, Theme } from '../tui/index.js';
|
|
11
11
|
/** Folders worth offering: this one, the projects started before, and the folders inside your roots. */
|
|
12
|
-
export
|
|
12
|
+
export function candidateFolders(ctx, cwd = process.cwd()) {
|
|
13
13
|
const roots = ctx.loaded.config.projects.roots.map((r) => expandPath(r, ctx.loaded.base));
|
|
14
|
-
const inRoots = roots.flatMap((r) => {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
14
|
+
const inRoots = roots.flatMap((r) => {
|
|
15
|
+
try {
|
|
16
|
+
return fs
|
|
17
|
+
.readdirSync(r, { withFileTypes: true })
|
|
18
|
+
.filter((e) => e.isDirectory() && !e.isSymbolicLink() && !e.name.startsWith('.'))
|
|
19
|
+
.slice(0, 200)
|
|
20
|
+
.map((e) => path.join(r, e.name));
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return [];
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
const all = [path.resolve(cwd), ...new KnownProjects(ctx.storageRoot).list().map((k) => k.host), ...inRoots];
|
|
21
27
|
return all.filter((f, i) => all.findIndex((g) => g.toLowerCase() === f.toLowerCase()) === i && fs.existsSync(f));
|
|
22
|
-
}
|
|
28
|
+
}
|
|
23
29
|
/** The command line for several sessions: one --session per (agent, folder), with the shared options. */
|
|
24
|
-
export
|
|
30
|
+
export function severalAgentsArgv(sessions, o) {
|
|
31
|
+
return [
|
|
32
|
+
'launch',
|
|
33
|
+
...sessions.flatMap((s) => ['--session', s.harness + '@' + s.folder]),
|
|
34
|
+
...(o.headless ? ['--headless'] : []),
|
|
35
|
+
...(o.attachFirst ? ['-t'] : []),
|
|
36
|
+
];
|
|
37
|
+
}
|
|
25
38
|
const ADD = '@add';
|
|
26
39
|
export class SeveralAgents {
|
|
27
40
|
app;
|
|
@@ -39,7 +52,9 @@ export class SeveralAgents {
|
|
|
39
52
|
const sessions = [];
|
|
40
53
|
for (const folder of folders) {
|
|
41
54
|
const picked = await this.app.list({
|
|
42
|
-
path: [...this.path, path.basename(folder)],
|
|
55
|
+
path: [...this.path, path.basename(folder)],
|
|
56
|
+
intro: 'Agents for ' + folder + ' (one session each). Space ticks, Enter continues.',
|
|
57
|
+
multi: true,
|
|
43
58
|
items: agents.map((a) => ({ value: a, label: a, checked: a === this.ctx.loaded.config.defaultHarness })),
|
|
44
59
|
});
|
|
45
60
|
if (picked.kind !== 'multi')
|
|
@@ -48,7 +63,12 @@ export class SeveralAgents {
|
|
|
48
63
|
}
|
|
49
64
|
if (!sessions.length)
|
|
50
65
|
return null;
|
|
51
|
-
const headless = await this.app.confirm({
|
|
66
|
+
const headless = await this.app.confirm({
|
|
67
|
+
path: this.path,
|
|
68
|
+
question: 'Hide the sandbox window (headless)?',
|
|
69
|
+
about: ['sandbox show brings it back.'],
|
|
70
|
+
initial: this.ctx.loaded.config.sandbox.headless,
|
|
71
|
+
});
|
|
52
72
|
const attach = await this.app.choose(this.path, 'Attach this terminal to one of them? Each session also has a tab inside the sandbox; sandbox attach shows any of them later.', [
|
|
53
73
|
{ value: -1, label: 'None' },
|
|
54
74
|
...sessions.map((s, i) => ({ value: i, label: s.harness + ' in ' + Text.middle(s.folder, 60) })),
|
|
@@ -60,8 +80,21 @@ export class SeveralAgents {
|
|
|
60
80
|
const argv = severalAgentsArgv(ordered, { headless, attachFirst: attach >= 0 });
|
|
61
81
|
const projects = [...new Set(sessions.map((s) => path.basename(s.folder)))];
|
|
62
82
|
const go = await this.app.confirm({
|
|
63
|
-
path: this.path,
|
|
64
|
-
|
|
83
|
+
path: this.path,
|
|
84
|
+
question: 'Start them?',
|
|
85
|
+
about: [
|
|
86
|
+
'One sandbox with ' +
|
|
87
|
+
sessions.length +
|
|
88
|
+
' session' +
|
|
89
|
+
(sessions.length === 1 ? '' : 's') +
|
|
90
|
+
': ' +
|
|
91
|
+
ordered.map((s) => s.harness + ' in ' + path.basename(s.folder)).join(', ') +
|
|
92
|
+
'. Maps ' +
|
|
93
|
+
projects.join(' and ') +
|
|
94
|
+
'.',
|
|
95
|
+
'',
|
|
96
|
+
'$ ' + commandLine(argv),
|
|
97
|
+
],
|
|
65
98
|
});
|
|
66
99
|
return go ? argv : null;
|
|
67
100
|
}
|
|
@@ -69,9 +102,16 @@ export class SeveralAgents {
|
|
|
69
102
|
const here = path.resolve(process.cwd());
|
|
70
103
|
const candidates = candidateFolders(this.ctx);
|
|
71
104
|
const picked = await this.app.list({
|
|
72
|
-
path: this.path,
|
|
105
|
+
path: this.path,
|
|
106
|
+
intro: 'Which projects? Each gets its own sessions; all of them are mapped into one sandbox. Space ticks, Enter continues.',
|
|
107
|
+
multi: true,
|
|
73
108
|
items: [
|
|
74
|
-
...candidates.map((f) => ({
|
|
109
|
+
...candidates.map((f) => ({
|
|
110
|
+
value: f,
|
|
111
|
+
label: Text.middle(f, 90),
|
|
112
|
+
hint: isWithin(f, here) && isWithin(here, f) ? Theme.muted('this folder') : undefined,
|
|
113
|
+
checked: f.toLowerCase() === here.toLowerCase(),
|
|
114
|
+
})),
|
|
75
115
|
{ value: ADD, label: '+ Another folder…' },
|
|
76
116
|
],
|
|
77
117
|
});
|
|
@@ -80,7 +120,8 @@ export class SeveralAgents {
|
|
|
80
120
|
const folders = picked.values.filter((f) => f !== ADD);
|
|
81
121
|
if (picked.values.includes(ADD)) {
|
|
82
122
|
const extra = await this.app.text({
|
|
83
|
-
path: this.path,
|
|
123
|
+
path: this.path,
|
|
124
|
+
label: 'Folder to add',
|
|
84
125
|
validate: (v) => {
|
|
85
126
|
const dir = path.resolve(v.trim());
|
|
86
127
|
if (!v.trim() || !fs.existsSync(dir) || !fs.statSync(dir).isDirectory())
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** The colour policy as a pure function (tested); `isTTY` is that of the stream being written to. */
|
|
2
|
-
export declare
|
|
2
|
+
export declare function colorEnabled(env: NodeJS.ProcessEnv, isTTY: boolean): boolean;
|
|
3
3
|
export declare const c: {
|
|
4
4
|
bold: (text: string) => string;
|
|
5
5
|
dim: (text: string) => string;
|
|
@@ -9,16 +9,16 @@ export declare const c: {
|
|
|
9
9
|
cyan: (text: string) => string;
|
|
10
10
|
};
|
|
11
11
|
/** Removes colour codes (for measuring or comparing text). */
|
|
12
|
-
export declare
|
|
12
|
+
export declare function stripAnsi(text: string): string;
|
|
13
13
|
/** Cuts `text` to `max` visible characters, ending in an ellipsis (plain text only). */
|
|
14
|
-
export declare
|
|
14
|
+
export declare function shorten(text: string, max: number): string;
|
|
15
15
|
/** Cuts the middle out of a long path or id so both ends stay readable. */
|
|
16
|
-
export declare
|
|
16
|
+
export declare function shortenMiddle(text: string, max: number): string;
|
|
17
17
|
/** 1536 -> "1.5 KB" is in the data command; this is "3 min ago" for the tables. */
|
|
18
|
-
export declare
|
|
18
|
+
export declare function ago(then: number | string | Date, now?: number): string;
|
|
19
19
|
/** Width to lay text out in (terminal columns, 80 when unknown, never absurdly small). */
|
|
20
|
-
export declare
|
|
20
|
+
export declare function termWidth(): number;
|
|
21
21
|
/** Each menu page starts on a clean screen (answered prompts would otherwise pile up above it). */
|
|
22
|
-
export declare
|
|
22
|
+
export declare function clearScreen(): void;
|
|
23
23
|
/** Rows of a list that fit the terminal (leaving room for the prompt and the help line). */
|
|
24
|
-
export declare
|
|
24
|
+
export declare function pageSizeFor(wanted: number): number;
|
|
@@ -1,29 +1,41 @@
|
|
|
1
1
|
// ANSI colours for terminal output (one place, so menus, errors and warnings agree).
|
|
2
|
-
// Colour is on only for a terminal that wants it: not with NO_COLOR, TERM=dumb or piped output; FORCE_COLOR turns it
|
|
2
|
+
// Colour is on only for a terminal that wants it: not with NO_COLOR, TERM=dumb or piped output; FORCE_COLOR turns it
|
|
3
|
+
// on.
|
|
3
4
|
/** The colour policy as a pure function (tested); `isTTY` is that of the stream being written to. */
|
|
4
|
-
export
|
|
5
|
+
export function colorEnabled(env, isTTY) {
|
|
5
6
|
if (env.NO_COLOR)
|
|
6
7
|
return false;
|
|
7
8
|
if (env.FORCE_COLOR !== undefined && env.FORCE_COLOR !== '')
|
|
8
9
|
return env.FORCE_COLOR !== '0' && env.FORCE_COLOR !== 'false';
|
|
9
10
|
return isTTY && env.TERM !== 'dumb';
|
|
11
|
+
}
|
|
12
|
+
const paint = (code) => (text) => colorEnabled(process.env, Boolean(process.stdout.isTTY)) ? '\x1b[' + code + 'm' + text + '\x1b[0m' : text;
|
|
13
|
+
export const c = {
|
|
14
|
+
bold: paint(1),
|
|
15
|
+
dim: paint(2),
|
|
16
|
+
red: paint(31),
|
|
17
|
+
green: paint(32),
|
|
18
|
+
yellow: paint(33),
|
|
19
|
+
cyan: paint(36),
|
|
10
20
|
};
|
|
11
|
-
const paint = (code) => (text) => (colorEnabled(process.env, Boolean(process.stdout.isTTY)) ? '\x1b[' + code + 'm' + text + '\x1b[0m' : text);
|
|
12
|
-
export const c = { bold: paint(1), dim: paint(2), red: paint(31), green: paint(32), yellow: paint(33), cyan: paint(36) };
|
|
13
21
|
/** Removes colour codes (for measuring or comparing text). */
|
|
14
|
-
export
|
|
22
|
+
export function stripAnsi(text) {
|
|
23
|
+
return text.replace(/\x1b\[[0-9;]*m/g, '');
|
|
24
|
+
}
|
|
15
25
|
/** Cuts `text` to `max` visible characters, ending in an ellipsis (plain text only). */
|
|
16
|
-
export
|
|
26
|
+
export function shorten(text, max) {
|
|
27
|
+
return max < 2 || text.length <= max ? text : text.slice(0, max - 1) + '…';
|
|
28
|
+
}
|
|
17
29
|
/** Cuts the middle out of a long path or id so both ends stay readable. */
|
|
18
|
-
export
|
|
30
|
+
export function shortenMiddle(text, max) {
|
|
19
31
|
if (max < 5 || text.length <= max)
|
|
20
32
|
return text;
|
|
21
33
|
const keep = max - 1;
|
|
22
34
|
const head = Math.ceil(keep / 2);
|
|
23
35
|
return text.slice(0, head) + '…' + text.slice(text.length - (keep - head));
|
|
24
|
-
}
|
|
36
|
+
}
|
|
25
37
|
/** 1536 -> "1.5 KB" is in the data command; this is "3 min ago" for the tables. */
|
|
26
|
-
export
|
|
38
|
+
export function ago(then, now = Date.now()) {
|
|
27
39
|
const secs = Math.max(0, Math.round((now - new Date(then).getTime()) / 1000));
|
|
28
40
|
if (secs < 45)
|
|
29
41
|
return 'just now';
|
|
@@ -32,11 +44,17 @@ export const ago = (then, now = Date.now()) => {
|
|
|
32
44
|
if (secs < 86400)
|
|
33
45
|
return Math.round(secs / 3600) + ' h ago';
|
|
34
46
|
return Math.round(secs / 86400) + ' d ago';
|
|
35
|
-
}
|
|
47
|
+
}
|
|
36
48
|
/** Width to lay text out in (terminal columns, 80 when unknown, never absurdly small). */
|
|
37
|
-
export
|
|
49
|
+
export function termWidth() {
|
|
50
|
+
return Math.max(40, process.stdout.columns ?? 80);
|
|
51
|
+
}
|
|
38
52
|
/** Each menu page starts on a clean screen (answered prompts would otherwise pile up above it). */
|
|
39
|
-
export
|
|
40
|
-
process.stdout.
|
|
53
|
+
export function clearScreen() {
|
|
54
|
+
if (process.stdout.isTTY)
|
|
55
|
+
process.stdout.write('\x1b[2J\x1b[3J\x1b[H');
|
|
56
|
+
}
|
|
41
57
|
/** Rows of a list that fit the terminal (leaving room for the prompt and the help line). */
|
|
42
|
-
export
|
|
58
|
+
export function pageSizeFor(wanted) {
|
|
59
|
+
return Math.max(5, Math.min(wanted, (process.stdout.rows ?? 30) - 6));
|
|
60
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Context } from '../commands/context.js';
|
|
2
|
+
/** Prints rows as aligned columns (the last column is not padded). */
|
|
3
|
+
export declare function table(rows: string[][]): void;
|
|
4
|
+
/** Prints `value` as JSON when --json was given; returns whether it did. */
|
|
5
|
+
export declare function printJson(ctx: Context, value: unknown): boolean;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import _ from 'lodash';
|
|
2
|
+
/** Prints rows as aligned columns (the last column is not padded). */
|
|
3
|
+
export function table(rows) {
|
|
4
|
+
const widths = _.range(_.max(rows.map((r) => r.length)) ?? 0).map((i) => _.max(rows.map((r) => (r[i] ?? '').length)) ?? 0);
|
|
5
|
+
for (const row of rows)
|
|
6
|
+
console.log(row.map((cell, i) => (i === row.length - 1 ? cell : _.padEnd(cell, widths[i] + 2))).join(''));
|
|
7
|
+
}
|
|
8
|
+
/** Prints `value` as JSON when --json was given; returns whether it did. */
|
|
9
|
+
export function printJson(ctx, value) {
|
|
10
|
+
// JSON.stringify leaves C1 controls (U+0080-U+009F) as they are; text from the sandbox must not reach a terminal raw.
|
|
11
|
+
if (ctx.options.json)
|
|
12
|
+
console.log(JSON.stringify(value, null, 2).replace(/[\u0080-\u009f]/g, (ch) => '\\u' + ch.charCodeAt(0).toString(16).padStart(4, '0')));
|
|
13
|
+
return ctx.options.json;
|
|
14
|
+
}
|