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
|
@@ -1,258 +0,0 @@
|
|
|
1
|
-
// Working with a running sandbox: attach, sessions, status, exec, restart, stop, show/hide. Each knows which project
|
|
2
|
-
// you run it from (project.ts): attach and sessions put that project's sessions first, exec and db run in it, restart
|
|
3
|
-
// restarts its sessions, stop warns about the other projects' sessions.
|
|
4
|
-
import path from 'node:path';
|
|
5
|
-
import { spawnSync } from 'node:child_process';
|
|
6
|
-
import { select } from '@inquirer/prompts';
|
|
7
|
-
import _ from 'lodash';
|
|
8
|
-
import { askYesNo } from '../../core/prompt.js';
|
|
9
|
-
import { activeAccount } from '../../host/accounts.js';
|
|
10
|
-
import { execInSandbox, pickSession, pingSandbox, restartSessions, currentSessions, runningSessions, sessionsFirstIn } from '../../host/channel.js';
|
|
11
|
-
import { sessionViewers } from '../../host/attach.js';
|
|
12
|
-
import { insideSandbox, isSandboxRunning } from '../../host/platform.js';
|
|
13
|
-
import { NeedsRestart, readRegistry } from '../../host/projects.js';
|
|
14
|
-
import { guardedProjects, repoFindings } from '../../host/repo-guard.js';
|
|
15
|
-
import { hideSandboxWindow, showSandboxWindow } from '../../host/window.js';
|
|
16
|
-
import { isWithin, projectForGuestDir } from '../../shared/projects.js';
|
|
17
|
-
import { listProjectStatus, listSessions, readSandboxStatus } from '../../shared/rundir.js';
|
|
18
|
-
import { watcherRunning } from '../../sync/watcher.js';
|
|
19
|
-
import { errMsg, fail, safeText, sleep } from '../../core/util.js';
|
|
20
|
-
import { printJson, requireOnPc, requireRunning, sandboxAlive, table } from './context.js';
|
|
21
|
-
import { attachHere, readySandbox } from './launch.js';
|
|
22
|
-
import { hereDir, joinHere, locateHere, provisionJoined } from './project.js';
|
|
23
|
-
import { working } from '../progress.js';
|
|
24
|
-
import { ago, c, shortenMiddle, termWidth } from '../colors.js';
|
|
25
|
-
const viewerText = (v) => (v === undefined ? '-' : v === null ? 'unknown (older session)' : v.remote + ' here, ' + (v.viewers - v.remote) + ' in sandbox');
|
|
26
|
-
const projectOf = (projects, s) => s.project ?? projectForGuestDir(projects, s.cwd)?.name ?? '-';
|
|
27
|
-
export const attach = async (ctx) => {
|
|
28
|
-
requireOnPc('attach');
|
|
29
|
-
requireRunning('Start one with: sandbox claude --terminal');
|
|
30
|
-
const ready = await readySandbox(ctx.dataPath);
|
|
31
|
-
const id = ctx.options.positionals[0];
|
|
32
|
-
if (!id && runningSessions(ctx.dataPath).length === 0)
|
|
33
|
-
await sleep(1500);
|
|
34
|
-
const here = locateHere(ctx, ready);
|
|
35
|
-
if (id)
|
|
36
|
-
return attachHere(ctx, pickSession(ctx.dataPath, id));
|
|
37
|
-
// Several sessions: choose, this folder's project first (the newest is the default).
|
|
38
|
-
const running = sessionsFirstIn(runningSessions(ctx.dataPath), here.guestDir);
|
|
39
|
-
if (running.length > 1 && process.stdin.isTTY && process.stdout.isTTY) {
|
|
40
|
-
const projects = readRegistry(ctx.storageRoot)?.projects ?? [];
|
|
41
|
-
const chosen = await select({
|
|
42
|
-
message: 'Which session?' + (here.project ? ' (' + here.project.name + ' first)' : ''),
|
|
43
|
-
choices: running.map((s) => ({ value: s.id, name: (here.guestDir && isWithin(here.guestDir, s.cwd) ? '* ' : ' ') + safeText(s.harness).padEnd(9) + ' ' + safeText(projectOf(projects, s)).padEnd(16) + ' ' + ago(s.startedAt).padEnd(11) + ' ' + s.id })),
|
|
44
|
-
});
|
|
45
|
-
return attachHere(ctx, pickSession(ctx.dataPath, chosen));
|
|
46
|
-
}
|
|
47
|
-
return attachHere(ctx, pickSession(ctx.dataPath, undefined, here.guestDir));
|
|
48
|
-
};
|
|
49
|
-
/** Sessions with who is watching them; `here` marks the ones in the project of the current folder. */
|
|
50
|
-
const listedSessions = async (ctx) => {
|
|
51
|
-
// Who is attached comes from each session itself, so a terminal that was closed is never counted.
|
|
52
|
-
const live = isSandboxRunning();
|
|
53
|
-
// Only this sandbox's sessions are asked (and at most MAX_QUERIED_SESSIONS): the sandbox writes these files.
|
|
54
|
-
const ask = new Set(live ? currentSessions(ctx.dataPath).map((s) => s.id) : []);
|
|
55
|
-
const here = live ? locateHere(ctx, readSandboxStatus(ctx.dataPath)) : { guestDir: null };
|
|
56
|
-
const projects = readRegistry(ctx.storageRoot)?.projects ?? [];
|
|
57
|
-
return Promise.all(listSessions(ctx.dataPath).map(async (s) => ({
|
|
58
|
-
...s, projectName: projectOf(projects, s), here: Boolean(here.guestDir && isWithin(here.guestDir, s.cwd)),
|
|
59
|
-
...(ask.has(s.id) ? { viewers: await sessionViewers(s) } : {}),
|
|
60
|
-
})));
|
|
61
|
-
};
|
|
62
|
-
export const sessions = async (ctx) => {
|
|
63
|
-
const list = await listedSessions(ctx);
|
|
64
|
-
if (printJson(ctx, list.map((s) => _.omit(s, 'attach'))))
|
|
65
|
-
return 0;
|
|
66
|
-
if (list.length === 0) {
|
|
67
|
-
console.log('No sessions. Start one with: sandbox claude');
|
|
68
|
-
return 0;
|
|
69
|
-
}
|
|
70
|
-
// This folder's project first, newest first within each group; harness, cwd and times are written by the sandbox.
|
|
71
|
-
const ordered = [..._.sortBy(list.filter((s) => s.here), (s) => s.startedAt).reverse(), ..._.sortBy(list.filter((s) => !s.here), (s) => s.startedAt).reverse()];
|
|
72
|
-
const folderWidth = Math.max(16, termWidth() - 80);
|
|
73
|
-
table([['', 'ID', 'AGENT', 'PROJECT', 'STATE', 'ATTACHED', 'FOLDER', 'STARTED'], ...ordered.map((s) => [
|
|
74
|
-
s.here ? '*' : '', s.id, safeText(s.harness), safeText(s.projectName ?? '-'), s.phase + (s.exitCode !== undefined ? ' (' + s.exitCode + ')' : ''), viewerText(s.viewers), shortenMiddle(safeText(s.cwd), folderWidth), ago(s.startedAt),
|
|
75
|
-
])]);
|
|
76
|
-
if (list.some((s) => s.here))
|
|
77
|
-
console.log(c.dim('* = the project of this folder'));
|
|
78
|
-
return 0;
|
|
79
|
-
};
|
|
80
|
-
/** Running databases by port, from the sandbox's own `sbx-db list` (best effort: unknown when it does not answer). */
|
|
81
|
-
const runningPorts = async (ctx, cwd) => {
|
|
82
|
-
try {
|
|
83
|
-
const r = await execInSandbox(ctx.dataPath, ['sbx-db', 'list'], cwd, 30, sandboxAlive);
|
|
84
|
-
return new Set((r.stdout ?? '').split(/\r?\n/).filter((l) => /\brunning\b/.test(l)).map((l) => Number(/port (\d+)/.exec(l)?.[1])).filter((n) => n > 0));
|
|
85
|
-
}
|
|
86
|
-
catch {
|
|
87
|
-
return null;
|
|
88
|
-
}
|
|
89
|
-
};
|
|
90
|
-
export const status = async (ctx) => {
|
|
91
|
-
const running = isSandboxRunning();
|
|
92
|
-
const sandbox = readSandboxStatus(ctx.dataPath);
|
|
93
|
-
const registry = running ? readRegistry(ctx.storageRoot) : null;
|
|
94
|
-
const ready = running && sandbox?.phase === 'ready';
|
|
95
|
-
const daemon = ready ? await pingSandbox(ctx.dataPath, sandboxAlive).then((r) => r.message, (e) => 'no answer (' + errMsg(e) + ')') : '-';
|
|
96
|
-
const here = running ? locateHere(ctx, sandbox) : { project: null, guestDir: null };
|
|
97
|
-
const sessionList = running ? await listedSessions(ctx) : [];
|
|
98
|
-
const provisioning = running ? listProjectStatus(ctx.dataPath) : [];
|
|
99
|
-
const ports = ready && sandbox ? await runningPorts(ctx, sandbox.guestWorkspace) : null;
|
|
100
|
-
const findings = repoFindings(ctx.dataPath);
|
|
101
|
-
const startedAt = Number(/^(\d+)-/.exec(registry?.launchId ?? sandbox?.launchId ?? '')?.[1]) || null;
|
|
102
|
-
const projects = (registry?.projects ?? []).map((p) => {
|
|
103
|
-
const prov = provisioning.find((s) => s.name.toLowerCase() === p.name.toLowerCase());
|
|
104
|
-
const own = sessionList.filter((s) => s.phase === 'running' && projectForGuestDir(registry?.projects ?? [], s.cwd)?.name === p.name);
|
|
105
|
-
return {
|
|
106
|
-
name: p.name, host: p.host, guest: p.guest, mechanism: p.mechanism, here: here.project?.name === p.name,
|
|
107
|
-
setup: prov ? { phase: prov.phase, message: safeText(prov.message) } : { phase: 'not set up yet', message: 'set up when you first start a session or command there' },
|
|
108
|
-
databases: (prov?.databases ?? []).map((d) => ({ database: safeText(d.database), port: d.port, state: ports ? (ports.has(d.port) ? 'running' : 'stopped') : 'unknown' })),
|
|
109
|
-
sessions: own.map((s) => ({ id: s.id, harness: safeText(s.harness), viewers: viewerText(s.viewers), started: s.startedAt })),
|
|
110
|
-
// With several guarded folders each finding starts with its folder.
|
|
111
|
-
repoGuard: findings.filter((f) => f.detail.toLowerCase().startsWith(p.host.toLowerCase() + ':')).map((f) => f.kind + ': ' + safeText(f.detail)),
|
|
112
|
-
};
|
|
113
|
-
});
|
|
114
|
-
const info = {
|
|
115
|
-
sandbox: {
|
|
116
|
-
running, phase: running ? sandbox?.phase ?? 'unknown' : 'stopped', message: sandbox?.message, headless: sandbox?.headless,
|
|
117
|
-
uptime: running && startedAt ? ago(startedAt).replace(' ago', '') : null, daemon, account: activeAccount(ctx.dataPath), syncWatcher: watcherRunning(ctx.dataPath),
|
|
118
|
-
},
|
|
119
|
-
here: { folder: hereDir(ctx), project: here.project?.name ?? null, guest: here.guestDir },
|
|
120
|
-
roots: registry?.roots ?? [],
|
|
121
|
-
projects,
|
|
122
|
-
otherSessions: sessionList.filter((s) => s.phase === 'running' && !projects.some((p) => p.sessions.some((x) => x.id === s.id))).map((s) => ({ id: s.id, harness: safeText(s.harness), cwd: safeText(s.cwd) })),
|
|
123
|
-
repoGuard: { guarded: guardedProjects(ctx.dataPath).length, findings: findings.map((f) => f.kind + ': ' + f.detail) },
|
|
124
|
-
};
|
|
125
|
-
if (printJson(ctx, info))
|
|
126
|
-
return 0;
|
|
127
|
-
const yesNo = (v) => (typeof v === 'boolean' ? (v ? 'yes' : 'no') : String(v ?? '-'));
|
|
128
|
-
table(Object.entries(info.sandbox).map(([k, v]) => [_.startCase(k), safeText(yesNo(v))]));
|
|
129
|
-
if (!running)
|
|
130
|
-
return 0;
|
|
131
|
-
console.log('\n' + c.bold('Projects') + c.dim(' (* = this folder: ' + info.here.folder + (info.here.project ? '' : ', not in this sandbox') + ')'));
|
|
132
|
-
for (const p of projects) {
|
|
133
|
-
console.log((p.here ? '* ' : ' ') + c.bold(p.name) + ' ' + p.host + ' -> ' + p.guest + c.dim(' (' + (p.mechanism === 'launch' ? 'started from here' : p.mechanism === 'root' ? 'in a project root' : p.mechanism === 'boot' ? 'mapped at start' : 'wsb share') + ')'));
|
|
134
|
-
console.log(' setup: ' + p.setup.phase + (p.setup.phase === 'ready' ? '' : ' - ' + shortenMiddle(p.setup.message, termWidth() - 20)));
|
|
135
|
-
if (p.databases.length)
|
|
136
|
-
console.log(' databases: ' + p.databases.map((d) => d.database + ' :' + d.port + ' ' + d.state).join(', '));
|
|
137
|
-
for (const s of p.sessions)
|
|
138
|
-
console.log(' session ' + s.id + ' ' + s.harness + ' ' + s.viewers + ' ' + ago(s.started));
|
|
139
|
-
for (const f of p.repoGuard)
|
|
140
|
-
console.log(' ' + c.yellow('guard: ' + f));
|
|
141
|
-
}
|
|
142
|
-
for (const r of info.roots)
|
|
143
|
-
console.log(' root ' + r.host + ' -> ' + r.guest + c.dim(' (every project in it opens without a restart)'));
|
|
144
|
-
for (const s of info.otherSessions)
|
|
145
|
-
console.log(' session ' + s.id + ' ' + s.harness + ' ' + s.cwd);
|
|
146
|
-
console.log('\n' + c.bold('Repo guard') + ' ' + info.repoGuard.guarded + ' folder(s) guarded; ' + (findings.length ? c.yellow(findings.length + ' change(s) neutralised:') : 'nothing from the sandbox needed neutralising'));
|
|
147
|
-
for (const f of info.repoGuard.findings.slice(-10))
|
|
148
|
-
console.log(' ' + c.yellow(safeText(f)));
|
|
149
|
-
return 0;
|
|
150
|
-
};
|
|
151
|
-
/** What a command run in the sandbox printed (text from the sandbox: through safeText), or why it failed. */
|
|
152
|
-
const printExecResult = (result) => {
|
|
153
|
-
if (result.stdout)
|
|
154
|
-
process.stdout.write(safeText(result.stdout));
|
|
155
|
-
if (result.stderr)
|
|
156
|
-
process.stderr.write(safeText(result.stderr));
|
|
157
|
-
if (!result.ok && !result.stdout && !result.stderr)
|
|
158
|
-
console.error(safeText(result.message));
|
|
159
|
-
};
|
|
160
|
-
/** The guest folder for this folder, joining the running sandbox (and setting the project up) when needed. */
|
|
161
|
-
const guestFolderHere = async (ctx, what) => {
|
|
162
|
-
const ready = await readySandbox(ctx.dataPath);
|
|
163
|
-
try {
|
|
164
|
-
// A command needs no restart for what the project wants at boot: it runs without them (and says so).
|
|
165
|
-
const joined = await joinHere(ctx, ready, { noRestart: true });
|
|
166
|
-
for (const note of joined.notes)
|
|
167
|
-
console.error(note);
|
|
168
|
-
await provisionJoined(ctx, joined);
|
|
169
|
-
return joined.guestDir;
|
|
170
|
-
}
|
|
171
|
-
catch (e) {
|
|
172
|
-
if (!(e instanceof NeedsRestart))
|
|
173
|
-
throw e;
|
|
174
|
-
return fail(hereDir(ctx) + ' is not in the running sandbox (' + e.reason + '), so "sandbox ' + what + '" cannot run there.', 'sandbox claude (or sandbox start) from that folder offers a restart that adds it; or add its parent folder as a root: sandbox projects roots add "' + path.dirname(e.hostDir) + '"');
|
|
175
|
-
}
|
|
176
|
-
};
|
|
177
|
-
export const exec = async (ctx) => {
|
|
178
|
-
const command = [...ctx.options.positionals, ...ctx.options.passthrough];
|
|
179
|
-
if (command.length === 0)
|
|
180
|
-
fail('No command given.', 'Usage: sandbox exec [--timeout <s>] -- <command> [args...]');
|
|
181
|
-
requireOnPc('exec');
|
|
182
|
-
requireRunning();
|
|
183
|
-
const cwd = await guestFolderHere(ctx, 'exec');
|
|
184
|
-
const result = await execInSandbox(ctx.dataPath, command, cwd, ctx.options.timeout, sandboxAlive);
|
|
185
|
-
if (!printJson(ctx, result))
|
|
186
|
-
printExecResult(result);
|
|
187
|
-
return result.exitCode ?? 1;
|
|
188
|
-
};
|
|
189
|
-
/** `sandbox db`: runs the sandbox's own `sbx-db` in this folder's project, which knows its database versions and ports. */
|
|
190
|
-
export const db = async (ctx) => {
|
|
191
|
-
const [action = 'list', name] = ctx.options.positionals;
|
|
192
|
-
if (!['list', 'start', 'stop'].includes(action))
|
|
193
|
-
fail('Unknown db action "' + action + '".', 'Use: sandbox db (list) or sandbox db start|stop <postgres|mysql|mongodb|redis|dynamodb>');
|
|
194
|
-
if (action !== 'list' && !name)
|
|
195
|
-
fail('Which database?', 'Usage: sandbox db ' + action + ' <postgres|mysql|mongodb|redis|dynamodb>');
|
|
196
|
-
// Already inside the sandbox: run the database tool here instead of asking the sandbox from outside.
|
|
197
|
-
if (insideSandbox())
|
|
198
|
-
return spawnSync(process.execPath, [path.join(ctx.packageRoot, 'dist', 'runtime', 'db.js'), action, ...(name ? [name] : [])], { stdio: 'inherit', windowsHide: true }).status ?? 1;
|
|
199
|
-
requireRunning('Start one with: sandbox start --database <name>');
|
|
200
|
-
const cwd = await guestFolderHere(ctx, 'db');
|
|
201
|
-
// Starting can download the database the first time.
|
|
202
|
-
const result = await working((action === 'list' ? 'Asking' : action === 'start' ? 'Starting' : 'Stopping') + ' the database' + (name ? ' ' + name : 's') + ' in the sandbox', () => execInSandbox(ctx.dataPath, ['sbx-db', action, ...(name ? [name] : [])], cwd, 1800, sandboxAlive));
|
|
203
|
-
printExecResult(result);
|
|
204
|
-
return result.exitCode ?? 1;
|
|
205
|
-
};
|
|
206
|
-
/** Restarts this folder's project's sessions (--all: every session). */
|
|
207
|
-
export const restart = async (ctx) => {
|
|
208
|
-
requireOnPc('restart');
|
|
209
|
-
requireRunning();
|
|
210
|
-
const here = locateHere(ctx, readSandboxStatus(ctx.dataPath));
|
|
211
|
-
const scope = ctx.options.all || !here.project ? undefined : here.project.guest;
|
|
212
|
-
if (!scope && !ctx.options.all)
|
|
213
|
-
console.log(c.dim(hereDir(ctx) + ' is not a project of the running sandbox: restarting every session.'));
|
|
214
|
-
console.log(safeText((await working('Restarting the agents' + (scope ? ' of ' + here.project?.name : ''), () => restartSessions(ctx.dataPath, ctx.options.harness ?? null, sandboxAlive, scope))).message));
|
|
215
|
-
return 0;
|
|
216
|
-
};
|
|
217
|
-
export const stop = async (ctx) => {
|
|
218
|
-
requireOnPc('stop');
|
|
219
|
-
if (!isSandboxRunning()) {
|
|
220
|
-
console.log('No Windows Sandbox is running.');
|
|
221
|
-
return 0;
|
|
222
|
-
}
|
|
223
|
-
const sandbox = readSandboxStatus(ctx.dataPath) ?? fail('This sandbox was not started by this tool.', 'Close its window instead.');
|
|
224
|
-
// Stopping ends every project's sessions, not just this folder's: say which, and ask when others would end too.
|
|
225
|
-
const here = locateHere(ctx, sandbox);
|
|
226
|
-
const running = currentSessions(ctx.dataPath);
|
|
227
|
-
const others = running.filter((s) => !(here.guestDir && isWithin(here.project?.guest ?? here.guestDir, s.cwd)));
|
|
228
|
-
if (running.length)
|
|
229
|
-
console.log('Stopping ends ' + running.length + ' session(s): ' + running.map((s) => safeText(s.harness) + ' in ' + safeText(s.project ?? path.win32.basename(s.cwd))).join(', ') + '.');
|
|
230
|
-
if (others.length && !ctx.options.yes) {
|
|
231
|
-
// A script must never end other projects' sessions by accident: without a terminal to ask in, it needs --yes.
|
|
232
|
-
const interactive = process.stdin.isTTY && process.stdout.isTTY;
|
|
233
|
-
if (!interactive)
|
|
234
|
-
fail(others.length + ' of these sessions belong to other projects, so the sandbox was not stopped.', 'Stop it anyway with: sandbox stop --yes');
|
|
235
|
-
if (!(await askYesNo(others.length + ' of them belong to other projects. Stop the whole sandbox?'))) {
|
|
236
|
-
console.log('Nothing changed.');
|
|
237
|
-
return 1;
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
await working('Asking the sandbox to shut down', () => execInSandbox(ctx.dataPath, ['C:\\Windows\\System32\\shutdown.exe', '/s', '/t', '2'], sandbox.guestWorkspace, 30, sandboxAlive));
|
|
241
|
-
console.log('Sandbox is shutting down; history and claude-mem sync back when it closes.');
|
|
242
|
-
return 0;
|
|
243
|
-
};
|
|
244
|
-
export const show = (ctx) => {
|
|
245
|
-
requireOnPc('show');
|
|
246
|
-
requireRunning();
|
|
247
|
-
if (!showSandboxWindow(ctx.storageRoot))
|
|
248
|
-
fail('Could not find the Windows Sandbox window.', 'It may still be starting; try again in a few seconds.');
|
|
249
|
-
return 0;
|
|
250
|
-
};
|
|
251
|
-
export const hide = async (ctx) => {
|
|
252
|
-
requireOnPc('hide');
|
|
253
|
-
requireRunning();
|
|
254
|
-
if (!(await hideSandboxWindow(ctx.storageRoot, 5)))
|
|
255
|
-
fail('Could not find a visible Windows Sandbox window.', 'It may already be hidden (sbx-show brings it back).');
|
|
256
|
-
console.log('Sandbox window hidden. Bring it back with: sbx-show');
|
|
257
|
-
return 0;
|
|
258
|
-
};
|
|
@@ -1,305 +0,0 @@
|
|
|
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, Theme } from '../../tui/index.js';
|
|
6
|
-
/** A value in one short line, for the right-hand column. */
|
|
7
|
-
export const formatValue = (value, max = 60) => {
|
|
8
|
-
if (value === undefined)
|
|
9
|
-
return Theme.muted('not set');
|
|
10
|
-
if (value === true)
|
|
11
|
-
return Theme.ok('On');
|
|
12
|
-
if (value === false)
|
|
13
|
-
return Theme.muted('Off');
|
|
14
|
-
if (value === null)
|
|
15
|
-
return Theme.muted('none');
|
|
16
|
-
if (typeof value === 'string')
|
|
17
|
-
return value === '' ? Theme.muted('(empty)') : Text.truncate(value, max);
|
|
18
|
-
if (typeof value === 'number')
|
|
19
|
-
return String(value);
|
|
20
|
-
if (Array.isArray(value))
|
|
21
|
-
return value.length === 0 ? Theme.muted('none') : Text.truncate(value.length + ' · ' + value.map((v) => (typeof v === 'object' ? summary(v) : String(v))).join(', '), max);
|
|
22
|
-
const keys = Object.keys(value);
|
|
23
|
-
return keys.length ? Text.truncate(keys.length + ' · ' + keys.join(', '), max) : Theme.muted('none');
|
|
24
|
-
};
|
|
25
|
-
/** A one-line name for an object in a list (a mapping's folders, an agent's package ...). */
|
|
26
|
-
const summary = (value) => {
|
|
27
|
-
if (!_.isPlainObject(value))
|
|
28
|
-
return String(value);
|
|
29
|
-
const o = value;
|
|
30
|
-
const strings = Object.entries(o).filter(([, v]) => typeof v === 'string' && v);
|
|
31
|
-
if (typeof o.host === 'string' && typeof o.guest === 'string')
|
|
32
|
-
return o.host + ' → ' + o.guest + (o.readOnly ? ' (read-only)' : '');
|
|
33
|
-
return strings.slice(0, 2).map(([, v]) => v).join(' · ') || '{ ' + Object.keys(o).join(', ') + ' }';
|
|
34
|
-
};
|
|
35
|
-
const choiceLabel = (v) => (v === true ? 'On' : v === false ? 'Off' : String(v));
|
|
36
|
-
export class ValueEditor {
|
|
37
|
-
app;
|
|
38
|
-
hints;
|
|
39
|
-
constructor(app, hints = {}) {
|
|
40
|
-
this.app = app;
|
|
41
|
-
this.hints = hints;
|
|
42
|
-
}
|
|
43
|
-
async edit(path, key, node, current) {
|
|
44
|
-
const about = node.description ? [node.description] : [];
|
|
45
|
-
const suggestions = this.hints.suggestions?.(key);
|
|
46
|
-
if (suggestions?.length && node.type === 'string')
|
|
47
|
-
return this.suggest(path, key, node, current, suggestions);
|
|
48
|
-
switch (node.editor) {
|
|
49
|
-
case 'boolean': return { value: !(current ?? false) };
|
|
50
|
-
case 'choice': return this.pick(path, node, current, node.choiceValues);
|
|
51
|
-
case 'union': {
|
|
52
|
-
const open = node.openOption;
|
|
53
|
-
const custom = '@custom';
|
|
54
|
-
const picked = await this.app.choose(path, node.description ?? '', [...node.choiceValues.map((v) => ({ value: v, label: choiceLabel(v) })), ...(open ? [{ value: custom, label: 'Custom ' + open.type + '…', description: 'Type a ' + open.type + ' of your own.' }] : [])], node.choiceValues.includes(current) ? current : open && current !== undefined ? custom : undefined);
|
|
55
|
-
if (picked === undefined)
|
|
56
|
-
return undefined;
|
|
57
|
-
return picked === custom && open ? this.edit(path, key, open, node.choiceValues.includes(current) ? undefined : current) : { value: picked };
|
|
58
|
-
}
|
|
59
|
-
case 'number': {
|
|
60
|
-
const range = node.min !== undefined || node.max !== undefined ? ' (' + (node.min ?? '…') + ' to ' + (node.max ?? '…') + ')' : '';
|
|
61
|
-
const typed = await this.app.text({ path, label: Text.humanize(key[key.length - 1]) + range, about, initial: current === undefined ? '' : String(current), validate: (v) => (v.trim() === '' || !Number.isFinite(Number(v)) ? 'Enter a number.' : node.check(Number(v))) });
|
|
62
|
-
return typed === undefined ? undefined : { value: Number(typed) };
|
|
63
|
-
}
|
|
64
|
-
case 'string': {
|
|
65
|
-
const typed = await this.app.text({ path, label: Text.humanize(key[key.length - 1]), about, initial: typeof current === 'string' ? current : '', allowEmpty: node.check('') === true, validate: (v) => node.check(v) });
|
|
66
|
-
return typed === undefined ? undefined : { value: typed };
|
|
67
|
-
}
|
|
68
|
-
case 'choice-list': {
|
|
69
|
-
const ticked = Array.isArray(current) ? current : [];
|
|
70
|
-
const picked = await this.app.list({ path, intro: node.description, multi: true, items: node.element.choices.map((v) => ({ value: v, label: String(v), checked: ticked.includes(v) })) });
|
|
71
|
-
return picked.kind === 'multi' ? { value: picked.values } : undefined;
|
|
72
|
-
}
|
|
73
|
-
case 'string-list': return new StringListEditor(this.app, path, node, this).run(Array.isArray(current) ? current : []);
|
|
74
|
-
case 'string-map': return new MapEditor(this.app, path, node, this).run(_.isPlainObject(current) ? current : {});
|
|
75
|
-
case 'object-list': return new ObjectListEditor(this.app, path, node, this).run(Array.isArray(current) ? current : []);
|
|
76
|
-
case 'object-map': return new ObjectMapEditor(this.app, path, node, this).run(_.isPlainObject(current) ? current : {});
|
|
77
|
-
case 'object': return new ObjectEditor(this.app, path, node, this).run(_.isPlainObject(current) ? current : node.initial());
|
|
78
|
-
default: return this.json(path, key, node, current);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
async pick(path, node, current, values) {
|
|
82
|
-
const picked = await this.app.choose(path, node.description ?? '', values.map((v) => ({ value: v, label: choiceLabel(v) })), current);
|
|
83
|
-
return picked === undefined ? undefined : { value: picked };
|
|
84
|
-
}
|
|
85
|
-
async suggest(path, key, node, current, suggestions) {
|
|
86
|
-
const other = '@other';
|
|
87
|
-
const picked = await this.app.choose(path, node.description ?? '', [...suggestions.map((s) => ({ value: s, label: s })), { value: other, label: 'Other…', description: 'Type a name that is not in the list.' }], typeof current === 'string' ? current : undefined);
|
|
88
|
-
if (picked === undefined)
|
|
89
|
-
return undefined;
|
|
90
|
-
if (picked !== other)
|
|
91
|
-
return { value: picked };
|
|
92
|
-
const typed = await this.app.text({ path, label: Text.humanize(key[key.length - 1]), initial: typeof current === 'string' ? current : '', validate: (v) => node.check(v) });
|
|
93
|
-
return typed === undefined ? undefined : { value: typed };
|
|
94
|
-
}
|
|
95
|
-
async json(path, key, node, current) {
|
|
96
|
-
const typed = await this.app.text({
|
|
97
|
-
path, label: Text.humanize(key[key.length - 1]) + ' (JSON)', about: node.description ? [node.description] : [], initial: current === undefined ? '' : JSON.stringify(current),
|
|
98
|
-
validate: (v) => { try {
|
|
99
|
-
return node.check(JSON.parse(v));
|
|
100
|
-
}
|
|
101
|
-
catch {
|
|
102
|
-
return 'This is not valid JSON.';
|
|
103
|
-
} },
|
|
104
|
-
});
|
|
105
|
-
return typed === undefined ? undefined : { value: JSON.parse(typed) };
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
// ---- collections -----------------------------------------------------------------------------------------------------
|
|
109
|
-
const SAVE = '@save';
|
|
110
|
-
const ADD = '@add';
|
|
111
|
-
/**
|
|
112
|
-
* The shared shape of the list and map editors: a working copy shown as a list with "Save" and "Add" at the top, Enter
|
|
113
|
-
* to change an entry, d to delete it. Esc with unsaved changes asks first.
|
|
114
|
-
*/
|
|
115
|
-
class CollectionEditor {
|
|
116
|
-
app;
|
|
117
|
-
path;
|
|
118
|
-
node;
|
|
119
|
-
editor;
|
|
120
|
-
value;
|
|
121
|
-
original;
|
|
122
|
-
constructor(app, path, node, editor) {
|
|
123
|
-
this.app = app;
|
|
124
|
-
this.path = path;
|
|
125
|
-
this.node = node;
|
|
126
|
-
this.editor = editor;
|
|
127
|
-
}
|
|
128
|
-
noun = 'entry';
|
|
129
|
-
async run(start) {
|
|
130
|
-
this.original = structuredClone(start);
|
|
131
|
-
this.value = structuredClone(start);
|
|
132
|
-
let focus;
|
|
133
|
-
for (;;) {
|
|
134
|
-
const dirty = !_.isEqual(this.value, this.original);
|
|
135
|
-
const entries = this.entries();
|
|
136
|
-
const picked = await this.app.list({
|
|
137
|
-
path: this.path,
|
|
138
|
-
intro: this.node.description,
|
|
139
|
-
items: [
|
|
140
|
-
{ value: SAVE, label: dirty ? Theme.ok(Theme.glyph.ok + ' Save changes') : Theme.muted(Theme.glyph.ok + ' Done (no changes)'), section: 'Actions' },
|
|
141
|
-
{ value: ADD, label: '+ Add ' + this.noun, section: 'Actions' },
|
|
142
|
-
...entries.map((e) => ({ ...e, section: entries.length + ' ' + this.noun + (entries.length === 1 ? '' : 's') })),
|
|
143
|
-
],
|
|
144
|
-
startAt: focus,
|
|
145
|
-
actions: [{ key: 'd', label: 'delete' }, ...(this.move ? [{ key: 'u', label: 'move up' }, { key: 'j', label: 'move down' }] : [])],
|
|
146
|
-
empty: 'No ' + this.noun + 's yet.',
|
|
147
|
-
});
|
|
148
|
-
if (picked.kind === 'back') {
|
|
149
|
-
if (!dirty || await this.app.confirm({ path: this.path, question: 'Discard your changes?', yes: 'Discard', no: 'Keep editing', initial: false, danger: true }))
|
|
150
|
-
return undefined;
|
|
151
|
-
continue;
|
|
152
|
-
}
|
|
153
|
-
if (picked.kind === 'pick' && picked.value === SAVE)
|
|
154
|
-
return dirty ? { value: this.value } : undefined;
|
|
155
|
-
if (picked.kind === 'pick' && picked.value === ADD) {
|
|
156
|
-
await this.add();
|
|
157
|
-
continue;
|
|
158
|
-
}
|
|
159
|
-
const id = picked.kind === 'pick' || picked.kind === 'action' ? picked.value : undefined;
|
|
160
|
-
if (id === undefined || id === SAVE || id === ADD)
|
|
161
|
-
continue;
|
|
162
|
-
focus = id;
|
|
163
|
-
if (picked.kind === 'pick')
|
|
164
|
-
await this.open(id);
|
|
165
|
-
else if (picked.kind === 'action' && picked.key === 'd')
|
|
166
|
-
this.remove(id);
|
|
167
|
-
else if (picked.kind === 'action' && this.move)
|
|
168
|
-
focus = this.move(id, picked.key === 'u' ? -1 : 1) ?? id;
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
/** A list of strings (project roots, scripts, extra packages ...). */
|
|
173
|
-
class StringListEditor extends CollectionEditor {
|
|
174
|
-
noun = 'item';
|
|
175
|
-
entries() { return this.value.map((v, i) => ({ value: String(i), label: v || Theme.muted('(empty)') })); }
|
|
176
|
-
async ask(initial) {
|
|
177
|
-
const element = this.node.element;
|
|
178
|
-
return this.app.text({ path: this.path, label: 'Value', about: this.node.description ? [this.node.description] : [], initial, validate: (v) => element.check(v) });
|
|
179
|
-
}
|
|
180
|
-
async add() { const v = await this.ask(''); if (v !== undefined)
|
|
181
|
-
this.value.push(v); }
|
|
182
|
-
async open(id) { const v = await this.ask(this.value[Number(id)]); if (v !== undefined)
|
|
183
|
-
this.value[Number(id)] = v; }
|
|
184
|
-
remove(id) { this.value.splice(Number(id), 1); }
|
|
185
|
-
move(id, by) {
|
|
186
|
-
const from = Number(id);
|
|
187
|
-
const to = Math.max(0, Math.min(this.value.length - 1, from + by));
|
|
188
|
-
const [item] = this.value.splice(from, 1);
|
|
189
|
-
this.value.splice(to, 0, item);
|
|
190
|
-
return String(to);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
/** A map of names to simple values (environment variables). */
|
|
194
|
-
class MapEditor extends CollectionEditor {
|
|
195
|
-
noun = 'variable';
|
|
196
|
-
entries() { return Object.entries(this.value).map(([k, v]) => ({ value: k, label: k, hint: formatValue(v) })); }
|
|
197
|
-
async add() {
|
|
198
|
-
const name = await this.app.text({ path: this.path, label: 'Name', about: ['Letters, digits and _ only, e.g. NPM_CONFIG_REGISTRY.'], validate: (v) => (this.value[v] !== undefined ? 'That name is there already.' : /^[A-Za-z_][A-Za-z0-9_]*$/.test(v) ? true : 'Letters, digits and _ only.') });
|
|
199
|
-
if (name === undefined)
|
|
200
|
-
return;
|
|
201
|
-
const edited = await this.editor.edit([...this.path, name], [name], this.node.element, this.node.element.initial());
|
|
202
|
-
if (edited)
|
|
203
|
-
this.value[name] = edited.value;
|
|
204
|
-
}
|
|
205
|
-
async open(id) {
|
|
206
|
-
const edited = await this.editor.edit([...this.path, id], [id], this.node.element, this.value[id]);
|
|
207
|
-
if (edited)
|
|
208
|
-
this.value[id] = edited.value;
|
|
209
|
-
}
|
|
210
|
-
remove(id) { delete this.value[id]; }
|
|
211
|
-
}
|
|
212
|
-
/** A list of objects (mapped folders). */
|
|
213
|
-
class ObjectListEditor extends CollectionEditor {
|
|
214
|
-
noun = 'entry';
|
|
215
|
-
entries() { return this.value.map((v, i) => ({ value: String(i), label: summary(v) })); }
|
|
216
|
-
async add() {
|
|
217
|
-
const edited = await new ObjectEditor(this.app, [...this.path, 'New'], this.node.element, this.editor).run(this.node.element.initial(), true);
|
|
218
|
-
if (edited)
|
|
219
|
-
this.value.push(edited.value);
|
|
220
|
-
}
|
|
221
|
-
async open(id) {
|
|
222
|
-
const edited = await new ObjectEditor(this.app, [...this.path, summary(this.value[Number(id)])], this.node.element, this.editor).run(this.value[Number(id)]);
|
|
223
|
-
if (edited)
|
|
224
|
-
this.value[Number(id)] = edited.value;
|
|
225
|
-
}
|
|
226
|
-
remove(id) { this.value.splice(Number(id), 1); }
|
|
227
|
-
}
|
|
228
|
-
/** A map of names to objects (agents). */
|
|
229
|
-
class ObjectMapEditor extends CollectionEditor {
|
|
230
|
-
noun = 'entry';
|
|
231
|
-
entries() { return Object.entries(this.value).map(([k, v]) => ({ value: k, label: k, hint: Theme.muted(summary(v)) })); }
|
|
232
|
-
async add() {
|
|
233
|
-
const name = await this.app.text({ path: this.path, label: 'Name', validate: (v) => (this.value[v] !== undefined ? 'That name is there already.' : /^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(v) ? true : 'Letters, digits, . _ and - only.') });
|
|
234
|
-
if (name === undefined)
|
|
235
|
-
return;
|
|
236
|
-
const edited = await new ObjectEditor(this.app, [...this.path, name], this.node.element, this.editor).run(this.node.element.initial(), true);
|
|
237
|
-
if (edited)
|
|
238
|
-
this.value[name] = edited.value;
|
|
239
|
-
}
|
|
240
|
-
async open(id) {
|
|
241
|
-
const edited = await new ObjectEditor(this.app, [...this.path, id], this.node.element, this.editor).run(this.value[id]);
|
|
242
|
-
if (edited)
|
|
243
|
-
this.value[id] = edited.value;
|
|
244
|
-
}
|
|
245
|
-
remove(id) { delete this.value[id]; }
|
|
246
|
-
}
|
|
247
|
-
/** One object as a form: each field with its value, Enter to change it, r to clear an optional one. */
|
|
248
|
-
export class ObjectEditor {
|
|
249
|
-
app;
|
|
250
|
-
path;
|
|
251
|
-
node;
|
|
252
|
-
editor;
|
|
253
|
-
constructor(app, path, node, editor) {
|
|
254
|
-
this.app = app;
|
|
255
|
-
this.path = path;
|
|
256
|
-
this.node = node;
|
|
257
|
-
this.editor = editor;
|
|
258
|
-
}
|
|
259
|
-
async run(start, isNew = false) {
|
|
260
|
-
const value = structuredClone(start);
|
|
261
|
-
let focus;
|
|
262
|
-
let notice;
|
|
263
|
-
for (;;) {
|
|
264
|
-
const dirty = isNew || !_.isEqual(value, start);
|
|
265
|
-
const problem = this.node.check(value);
|
|
266
|
-
const fields = this.node.children();
|
|
267
|
-
const picked = await this.app.list({
|
|
268
|
-
path: this.path,
|
|
269
|
-
intro: this.node.description,
|
|
270
|
-
notice,
|
|
271
|
-
items: [
|
|
272
|
-
{ value: SAVE, label: problem === true ? (dirty ? Theme.ok(Theme.glyph.ok + ' Save') : Theme.muted(Theme.glyph.ok + ' Done (no changes)')) : Theme.warn(Theme.glyph.cross + ' Not complete yet'), description: problem === true ? undefined : problem, section: 'Actions' },
|
|
273
|
-
...fields.map(([name, field]) => ({ value: name, label: Text.humanize(name), hint: formatValue(value[name]), description: field.description, section: 'Fields' })),
|
|
274
|
-
],
|
|
275
|
-
startAt: focus,
|
|
276
|
-
actions: [{ key: 'r', label: 'clear' }],
|
|
277
|
-
});
|
|
278
|
-
notice = undefined;
|
|
279
|
-
if (picked.kind === 'back') {
|
|
280
|
-
if (!dirty || await this.app.confirm({ path: this.path, question: 'Discard your changes?', yes: 'Discard', no: 'Keep editing', initial: false, danger: true }))
|
|
281
|
-
return undefined;
|
|
282
|
-
continue;
|
|
283
|
-
}
|
|
284
|
-
if (picked.kind === 'pick' && picked.value === SAVE) {
|
|
285
|
-
if (problem !== true) {
|
|
286
|
-
notice = Theme.warn(problem);
|
|
287
|
-
continue;
|
|
288
|
-
}
|
|
289
|
-
return dirty ? { value } : undefined;
|
|
290
|
-
}
|
|
291
|
-
const name = picked.kind === 'pick' || picked.kind === 'action' ? picked.value : undefined;
|
|
292
|
-
if (!name || name === SAVE)
|
|
293
|
-
continue;
|
|
294
|
-
focus = name;
|
|
295
|
-
const field = this.node.child(name);
|
|
296
|
-
if (picked.kind === 'action') {
|
|
297
|
-
delete value[name];
|
|
298
|
-
continue;
|
|
299
|
-
}
|
|
300
|
-
const edited = await this.editor.edit([...this.path, Text.humanize(name)], [name], field, value[name]);
|
|
301
|
-
if (edited)
|
|
302
|
-
value[name] = edited.value;
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import type { FrameParts } from './frame.js';
|
|
2
|
-
import type { Screen, Size, Step } from './app.js';
|
|
3
|
-
import type { Key } from './terminal.js';
|
|
4
|
-
export interface TextOptions {
|
|
5
|
-
path: string[];
|
|
6
|
-
label: string;
|
|
7
|
-
/** Explanation above the field (plain lines). */
|
|
8
|
-
about?: string[];
|
|
9
|
-
initial?: string;
|
|
10
|
-
placeholder?: string;
|
|
11
|
-
/** true = fine, a string = what is wrong (shown under the field). */
|
|
12
|
-
validate?: (value: string) => true | string;
|
|
13
|
-
/** Allow an empty answer (otherwise Enter on an empty field cancels). */
|
|
14
|
-
allowEmpty?: boolean;
|
|
15
|
-
}
|
|
16
|
-
/** One line of text. Resolves to the text, or undefined when you press Esc. */
|
|
17
|
-
export declare class TextScreen implements Screen<string | undefined> {
|
|
18
|
-
private readonly o;
|
|
19
|
-
private value;
|
|
20
|
-
private cursor;
|
|
21
|
-
private problem;
|
|
22
|
-
constructor(o: TextOptions);
|
|
23
|
-
render(size: Size): FrameParts;
|
|
24
|
-
handle(key: Key): Step<string | undefined>;
|
|
25
|
-
private check;
|
|
26
|
-
}
|
|
27
|
-
export interface ConfirmOptions {
|
|
28
|
-
path: string[];
|
|
29
|
-
question: string;
|
|
30
|
-
about?: string[];
|
|
31
|
-
yes?: string;
|
|
32
|
-
no?: string;
|
|
33
|
-
initial?: boolean;
|
|
34
|
-
danger?: boolean;
|
|
35
|
-
}
|
|
36
|
-
/** Yes or no. Esc answers no. */
|
|
37
|
-
export declare class ConfirmScreen implements Screen<boolean> {
|
|
38
|
-
private readonly o;
|
|
39
|
-
private yes;
|
|
40
|
-
constructor(o: ConfirmOptions);
|
|
41
|
-
render(size: Size): FrameParts;
|
|
42
|
-
handle(key: Key): Step<boolean>;
|
|
43
|
-
}
|
|
44
|
-
/** Text to read (scrolls); any key but the arrows closes it. */
|
|
45
|
-
export declare class MessageScreen implements Screen<void> {
|
|
46
|
-
private readonly o;
|
|
47
|
-
private offset;
|
|
48
|
-
private height;
|
|
49
|
-
constructor(o: {
|
|
50
|
-
path: string[];
|
|
51
|
-
title?: string;
|
|
52
|
-
lines: string[];
|
|
53
|
-
tone?: 'ok' | 'warn' | 'error';
|
|
54
|
-
});
|
|
55
|
-
render(size: Size): FrameParts;
|
|
56
|
-
handle(key: Key): Step<void>;
|
|
57
|
-
}
|