windows-development-sandbox 1.4.0 → 1.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.sandbox-config.example.json +2 -1
- package/config.example.json +4 -1
- package/dist/api.js +27 -16
- package/dist/cli/args.d.ts +4 -6
- package/dist/cli/args.js +67 -34
- package/dist/cli/argv.d.ts +9 -0
- package/dist/cli/argv.js +22 -0
- package/dist/cli/commands/accounts.d.ts +1 -1
- package/dist/cli/commands/accounts.js +42 -27
- package/dist/cli/commands/agent-commands.d.ts +3 -3
- package/dist/cli/commands/agent-commands.js +27 -18
- package/dist/cli/commands/context.d.ts +9 -11
- package/dist/cli/commands/context.js +35 -32
- package/dist/cli/commands/data/clean.d.ts +2 -2
- package/dist/cli/commands/data/clean.js +27 -11
- package/dist/cli/commands/data/collect.d.ts +6 -3
- package/dist/cli/commands/data/collect.js +46 -15
- package/dist/cli/commands/data/index.d.ts +2 -2
- package/dist/cli/commands/data/index.js +30 -12
- package/dist/cli/commands/data/remove.d.ts +1 -1
- package/dist/cli/commands/data/remove.js +4 -4
- package/dist/cli/commands/index.d.ts +5 -4
- package/dist/cli/commands/index.js +5 -4
- package/dist/cli/commands/launch/add-root.d.ts +7 -0
- package/dist/cli/commands/launch/add-root.js +64 -0
- package/dist/cli/commands/launch/boot-progress.d.ts +7 -0
- package/dist/cli/commands/launch/boot-progress.js +48 -0
- package/dist/cli/commands/launch/boot-wants.d.ts +11 -0
- package/dist/cli/commands/launch/boot-wants.js +48 -0
- package/dist/cli/commands/launch/first-start.d.ts +10 -0
- package/dist/cli/commands/launch/first-start.js +53 -0
- package/dist/cli/commands/launch/index.d.ts +6 -0
- package/dist/cli/commands/launch/index.js +6 -0
- package/dist/cli/commands/launch/launch.d.ts +8 -0
- package/dist/cli/commands/launch/launch.js +211 -0
- package/dist/cli/commands/launch/prepare.d.ts +23 -0
- package/dist/cli/commands/launch/prepare.js +109 -0
- package/dist/cli/commands/launch/running.d.ts +45 -0
- package/dist/cli/commands/launch/running.js +218 -0
- package/dist/cli/commands/launch/summary.d.ts +8 -0
- package/dist/cli/commands/launch/summary.js +98 -0
- package/dist/cli/commands/maintenance/audit.d.ts +3 -0
- package/dist/cli/commands/maintenance/audit.js +58 -0
- package/dist/cli/commands/maintenance/clean.d.ts +2 -0
- package/dist/cli/commands/maintenance/clean.js +10 -0
- package/dist/cli/commands/maintenance/config.d.ts +2 -0
- package/dist/cli/commands/maintenance/config.js +145 -0
- package/dist/cli/commands/maintenance/doctor.d.ts +2 -0
- package/dist/cli/commands/maintenance/doctor.js +52 -0
- package/dist/cli/commands/maintenance/host-claude.d.ts +2 -0
- package/dist/cli/commands/maintenance/host-claude.js +4 -0
- package/dist/cli/commands/maintenance/index.d.ts +8 -0
- package/dist/cli/commands/maintenance/index.js +9 -0
- package/dist/cli/commands/maintenance/logs.d.ts +2 -0
- package/dist/cli/commands/maintenance/logs.js +44 -0
- package/dist/cli/commands/maintenance/sync.d.ts +2 -0
- package/dist/cli/commands/maintenance/sync.js +12 -0
- package/dist/cli/commands/maintenance/watch.d.ts +3 -0
- package/dist/cli/commands/maintenance/watch.js +6 -0
- package/dist/cli/commands/projects/describe-sessions.d.ts +3 -0
- package/dist/cli/commands/projects/describe-sessions.js +15 -0
- package/dist/cli/commands/projects/here.d.ts +38 -0
- package/dist/cli/commands/projects/here.js +145 -0
- package/dist/cli/commands/projects/index.d.ts +4 -0
- package/dist/cli/commands/projects/index.js +4 -0
- package/dist/cli/commands/projects/projects.d.ts +14 -0
- package/dist/cli/commands/projects/projects.js +213 -0
- package/dist/cli/commands/projects/restart.d.ts +15 -0
- package/dist/cli/commands/projects/restart.js +149 -0
- package/dist/cli/commands/registry.d.ts +3 -0
- package/dist/cli/commands/registry.js +34 -0
- package/dist/cli/commands/repair/checks.js +105 -29
- package/dist/cli/commands/repair/finders.d.ts +13 -10
- package/dist/cli/commands/repair/finders.js +63 -43
- package/dist/cli/commands/repair/index.d.ts +4 -4
- package/dist/cli/commands/repair/index.js +47 -21
- package/dist/cli/commands/repair/types.d.ts +2 -2
- package/dist/cli/commands/repair/types.js +7 -2
- package/dist/cli/commands/sessions/attach.d.ts +2 -0
- package/dist/cli/commands/sessions/attach.js +45 -0
- package/dist/cli/commands/sessions/control.d.ts +4 -0
- package/dist/cli/commands/sessions/control.js +62 -0
- package/dist/cli/commands/sessions/exec.d.ts +6 -0
- package/dist/cli/commands/sessions/exec.js +72 -0
- package/dist/cli/commands/sessions/index.d.ts +6 -0
- package/dist/cli/commands/sessions/index.js +9 -0
- package/dist/cli/commands/sessions/list.d.ts +15 -0
- package/dist/cli/commands/sessions/list.js +65 -0
- package/dist/cli/commands/sessions/status.d.ts +2 -0
- package/dist/cli/commands/sessions/status.js +153 -0
- package/dist/cli/commands/sessions/window.d.ts +3 -0
- package/dist/cli/commands/sessions/window.js +18 -0
- package/dist/cli/commands/setup/checks.d.ts +4 -4
- package/dist/cli/commands/setup/checks.js +36 -19
- package/dist/cli/commands/setup/facts.d.ts +6 -6
- package/dist/cli/commands/setup/facts.js +23 -11
- package/dist/cli/commands/setup/index.d.ts +1 -1
- package/dist/cli/commands/setup/index.js +25 -12
- package/dist/cli/commands/user-config.d.ts +5 -5
- package/dist/cli/commands/user-config.js +14 -12
- package/dist/cli/history.d.ts +5 -4
- package/dist/cli/history.js +23 -11
- package/dist/cli/index.d.ts +4 -14
- package/dist/cli/index.js +27 -77
- package/dist/cli/manifest.d.ts +464 -10
- package/dist/cli/manifest.js +328 -54
- package/dist/cli/menu/apps.d.ts +7 -5
- package/dist/cli/menu/apps.js +64 -16
- package/dist/cli/menu/command-fields.d.ts +15 -0
- package/dist/cli/menu/command-fields.js +23 -0
- package/dist/cli/menu/command-form.d.ts +3 -5
- package/dist/cli/menu/command-form.js +116 -48
- package/dist/cli/menu/home.d.ts +22 -0
- package/dist/cli/menu/home.js +72 -0
- package/dist/cli/menu/index.d.ts +2 -24
- package/dist/cli/menu/index.js +4 -178
- package/dist/cli/menu/menu.d.ts +23 -0
- package/dist/cli/menu/menu.js +185 -0
- package/dist/cli/menu/settings/categories.d.ts +2 -2
- package/dist/cli/menu/settings/categories.js +123 -20
- package/dist/cli/menu/settings/collections/collection-editor.d.ts +23 -0
- package/dist/cli/menu/settings/collections/collection-editor.js +89 -0
- package/dist/cli/menu/settings/collections/map-editor.d.ts +10 -0
- package/dist/cli/menu/settings/collections/map-editor.js +34 -0
- package/dist/cli/menu/settings/collections/object-list-editor.d.ts +10 -0
- package/dist/cli/menu/settings/collections/object-list-editor.js +23 -0
- package/dist/cli/menu/settings/collections/object-map-editor.d.ts +10 -0
- package/dist/cli/menu/settings/collections/object-map-editor.js +35 -0
- package/dist/cli/menu/settings/collections/string-list-editor.d.ts +12 -0
- package/dist/cli/menu/settings/collections/string-list-editor.js +39 -0
- package/dist/cli/menu/settings/config-file.d.ts +2 -2
- package/dist/cli/menu/settings/config-file.js +42 -19
- package/dist/cli/menu/settings/editor-actions.d.ts +2 -0
- package/dist/cli/menu/settings/editor-actions.js +2 -0
- package/dist/cli/menu/settings/format.d.ts +5 -0
- package/dist/cli/menu/settings/format.js +39 -0
- package/dist/cli/menu/settings/index.d.ts +1 -29
- package/dist/cli/menu/settings/index.js +1 -133
- package/dist/cli/menu/settings/object-editor.d.ts +12 -0
- package/dist/cli/menu/settings/object-editor.js +86 -0
- package/dist/cli/menu/settings/schema-node.d.ts +3 -1
- package/dist/cli/menu/settings/schema-node.js +71 -24
- package/dist/cli/menu/settings/settings-editor.d.ts +30 -0
- package/dist/cli/menu/settings/settings-editor.js +176 -0
- package/dist/cli/menu/settings/{editors.d.ts → value-editor.d.ts} +2 -13
- package/dist/cli/menu/settings/value-editor.js +137 -0
- package/dist/cli/menu/several.d.ts +4 -4
- package/dist/cli/menu/several.js +61 -20
- package/dist/cli/{colors.d.ts → output/colors.d.ts} +8 -8
- package/dist/cli/{colors.js → output/colors.js} +32 -14
- package/dist/cli/output/index.d.ts +3 -0
- package/dist/cli/output/index.js +3 -0
- package/dist/cli/output/print.d.ts +5 -0
- package/dist/cli/output/print.js +14 -0
- package/dist/cli/output/progress.d.ts +24 -0
- package/dist/cli/output/progress.js +124 -0
- package/dist/cli/report.d.ts +2 -0
- package/dist/cli/report.js +20 -0
- package/dist/cli/tui/app.d.ts +6 -16
- package/dist/cli/tui/app.js +28 -8
- package/dist/cli/tui/dialogs/confirm-screen.d.ts +20 -0
- package/dist/cli/tui/dialogs/confirm-screen.js +50 -0
- package/dist/cli/tui/dialogs/message-screen.d.ts +17 -0
- package/dist/cli/tui/dialogs/message-screen.js +55 -0
- package/dist/cli/tui/dialogs/paragraphs.d.ts +2 -0
- package/dist/cli/tui/dialogs/paragraphs.js +5 -0
- package/dist/cli/tui/dialogs/text-screen.d.ts +26 -0
- package/dist/cli/tui/dialogs/text-screen.js +107 -0
- package/dist/cli/tui/frame.js +3 -1
- package/dist/cli/tui/index.d.ts +7 -3
- package/dist/cli/tui/index.js +4 -2
- package/dist/cli/tui/list/list-screen.d.ts +29 -0
- package/dist/cli/tui/{list-screen.js → list/list-screen.js} +86 -23
- package/dist/cli/tui/{list-screen.d.ts → list/list-types.d.ts} +0 -28
- package/dist/cli/tui/screen.d.ts +14 -0
- package/dist/cli/tui/terminal.js +34 -10
- package/dist/cli/tui/text.d.ts +2 -1
- package/dist/cli/tui/text.js +37 -7
- package/dist/cli/tui/theme.js +27 -9
- package/dist/cli/validate.d.ts +8 -8
- package/dist/cli/validate.js +32 -21
- package/dist/core/config/defaults.d.ts +2 -0
- package/dist/core/config/defaults.js +203 -0
- package/dist/core/config/index.d.ts +2 -0
- package/dist/core/config/index.js +3 -0
- package/dist/core/{config.d.ts → config/loader.d.ts} +1 -2
- package/dist/core/config/loader.js +47 -0
- package/dist/core/{detect-databases.js → detect/databases.js} +111 -23
- package/dist/core/detect/index.d.ts +4 -0
- package/dist/core/detect/index.js +4 -0
- package/dist/core/{detect-pwsh.d.ts → detect/pwsh.d.ts} +1 -1
- package/dist/core/{detect-pwsh.js → detect/pwsh.js} +25 -11
- package/dist/core/{detect-toolchains.d.ts → detect/toolchains.d.ts} +1 -1
- package/dist/core/{detect-toolchains.js → detect/toolchains.js} +42 -5
- package/dist/{guest/toolchains → core/detect}/versions.js +28 -12
- package/dist/core/disk.d.ts +2 -0
- package/dist/core/disk.js +46 -3
- package/dist/core/local-config/boot-wants.d.ts +45 -0
- package/dist/core/local-config/boot-wants.js +120 -0
- package/dist/core/local-config/file.d.ts +3 -0
- package/dist/core/local-config/file.js +16 -0
- package/dist/core/local-config/index.d.ts +5 -0
- package/dist/core/local-config/index.js +7 -0
- package/dist/core/{local-config.d.ts → local-config/overrides.d.ts} +11 -11
- package/dist/core/{local-config.js → local-config/overrides.js} +53 -54
- package/dist/core/{project-policy.d.ts → local-config/policy.d.ts} +7 -3
- package/dist/core/{project-policy.js → local-config/policy.js} +16 -6
- package/dist/core/local-config/trust.d.ts +13 -0
- package/dist/core/local-config/trust.js +43 -0
- package/dist/core/package-info.d.ts +4 -0
- package/dist/core/package-info.js +13 -0
- package/dist/core/run/guest-workspace.d.ts +23 -0
- package/dist/core/run/guest-workspace.js +47 -0
- package/dist/core/run/index.d.ts +3 -0
- package/dist/core/run/index.js +3 -0
- package/dist/core/run/resolve-run.d.ts +3 -0
- package/dist/core/run/resolve-run.js +202 -0
- package/dist/core/run/versions.d.ts +13 -0
- package/dist/core/run/versions.js +65 -0
- package/dist/core/safe-paths.js +17 -5
- package/dist/core/schema/apps.d.ts +4 -4
- package/dist/core/schema/apps.js +55 -21
- package/dist/core/schema/common.d.ts +13 -10
- package/dist/core/schema/common.js +16 -10
- package/dist/core/schema/config.d.ts +18 -12
- package/dist/core/schema/config.js +78 -53
- package/dist/core/schema/databases.d.ts +4 -3
- package/dist/core/schema/databases.js +16 -12
- package/dist/core/schema/harness.d.ts +1 -1
- package/dist/core/schema/harness.js +17 -7
- package/dist/core/schema/index.d.ts +6 -0
- package/dist/core/schema/index.js +8 -0
- package/dist/core/schema/json-schema.js +10 -5
- package/dist/core/schema/profile.d.ts +4 -4
- package/dist/core/schema/profile.js +37 -17
- package/dist/core/schema/projects.d.ts +2 -1
- package/dist/core/schema/projects.js +16 -5
- package/dist/core/schema/sandbox.d.ts +12 -12
- package/dist/core/schema/sandbox.js +101 -37
- package/dist/core/schema/toolchains.d.ts +6 -1
- package/dist/core/schema/toolchains.js +84 -34
- package/dist/core/types.d.ts +36 -9
- package/dist/core/util/errors.d.ts +8 -0
- package/dist/core/util/errors.js +14 -0
- package/dist/core/util/fs.d.ts +8 -0
- package/dist/core/util/fs.js +40 -0
- package/dist/core/util/index.d.ts +7 -0
- package/dist/core/util/index.js +7 -0
- package/dist/core/util/jsonc.d.ts +6 -0
- package/dist/core/util/jsonc.js +25 -0
- package/dist/core/util/links.d.ts +10 -0
- package/dist/core/util/links.js +39 -0
- package/dist/core/util/paths.d.ts +7 -0
- package/dist/core/util/paths.js +33 -0
- package/dist/core/util/process.d.ts +15 -0
- package/dist/core/util/process.js +54 -0
- package/dist/core/util/text.d.ts +8 -0
- package/dist/core/util/text.js +8 -0
- package/dist/guest/{setup/agents.js → agents/agent-installer.js} +24 -4
- package/dist/guest/apps/after-install.d.ts +3 -0
- package/dist/guest/apps/after-install.js +47 -0
- package/dist/guest/apps/app-installer.d.ts +22 -0
- package/dist/guest/apps/app-installer.js +116 -0
- package/dist/guest/apps/find-exe.d.ts +5 -0
- package/dist/guest/apps/find-exe.js +41 -0
- package/dist/guest/apps/index.d.ts +3 -10
- package/dist/guest/apps/index.js +6 -206
- package/dist/guest/apps/resolvers.js +37 -9
- package/dist/guest/apps/shortcuts.d.ts +6 -0
- package/dist/guest/apps/shortcuts.js +28 -0
- package/dist/guest/apps/sources.d.ts +4 -0
- package/dist/guest/apps/sources.js +17 -0
- package/dist/guest/apps/unpack.d.ts +3 -0
- package/dist/guest/apps/unpack.js +47 -0
- package/dist/guest/{audit-parse.js → audit/parse.js} +39 -3
- package/dist/guest/{audit.d.ts → audit/process-audit.d.ts} +3 -1
- package/dist/guest/{audit.js → audit/process-audit.js} +33 -8
- package/dist/guest/boot/boot-env.d.ts +4 -0
- package/dist/guest/{boot-env.js → boot/boot-env.js} +7 -5
- package/dist/guest/boot/boot.d.ts +1 -0
- package/dist/guest/{main.js → boot/boot.js} +100 -50
- package/dist/guest/{guide.js → boot/guide.js} +32 -7
- package/dist/guest/{project-env.d.ts → boot/project-env.d.ts} +3 -3
- package/dist/guest/{project-env.js → boot/project-env.js} +12 -4
- package/dist/guest/boot/project-status.d.ts +5 -0
- package/dist/guest/boot/project-status.js +28 -0
- package/dist/guest/daemon/daemon.d.ts +1 -0
- package/dist/guest/daemon/daemon.js +51 -0
- package/dist/guest/daemon/exec.js +18 -6
- package/dist/guest/daemon/{shutdown.js → idle-shutdown.js} +5 -4
- package/dist/guest/daemon/{project.d.ts → project-provisioner.d.ts} +3 -3
- package/dist/guest/daemon/{project.js → project-provisioner.js} +60 -22
- package/dist/guest/daemon/relays.js +5 -3
- package/dist/guest/daemon/{session.js → sessions.js} +84 -24
- package/dist/guest/daemon/state.d.ts +4 -1
- package/dist/guest/daemon/state.js +34 -20
- package/dist/guest/databases/database-server.d.ts +13 -0
- package/dist/guest/databases/database-server.js +35 -0
- package/dist/guest/databases/dynamodb.d.ts +12 -0
- package/dist/guest/databases/dynamodb.js +81 -0
- package/dist/guest/databases/index.d.ts +2 -0
- package/dist/guest/databases/index.js +2 -0
- package/dist/guest/databases/mongodb.d.ts +7 -0
- package/dist/guest/databases/mongodb.js +46 -0
- package/dist/guest/databases/mysql.d.ts +7 -0
- package/dist/guest/databases/mysql.js +59 -0
- package/dist/guest/databases/names.d.ts +5 -0
- package/dist/guest/databases/names.js +8 -0
- package/dist/guest/databases/postgres.d.ts +9 -0
- package/dist/guest/databases/postgres.js +85 -0
- package/dist/guest/databases/redis.d.ts +7 -0
- package/dist/guest/databases/redis.js +25 -0
- package/dist/guest/databases/registry.d.ts +5 -0
- package/dist/guest/databases/registry.js +51 -0
- package/dist/guest/databases/sbx-db.d.ts +1 -0
- package/dist/guest/{db.js → databases/sbx-db.js} +13 -13
- package/dist/guest/{toolchains/databases → databases}/server.d.ts +5 -5
- package/dist/guest/{toolchains/databases → databases}/server.js +18 -13
- package/dist/guest/entries/daemon.js +16 -0
- package/dist/guest/entries/db.js +10 -0
- package/dist/guest/entries/gitguard.js +20 -0
- package/dist/guest/entries/main.d.ts +1 -0
- package/dist/guest/entries/main.js +24 -0
- package/dist/guest/entries/netproxy.d.ts +1 -0
- package/dist/guest/entries/netproxy.js +7 -0
- package/dist/guest/entries/view.d.ts +1 -0
- package/dist/guest/entries/view.js +11 -0
- package/dist/guest/{gitguard.js → git/decision.js} +49 -26
- package/dist/guest/network/addresses.d.ts +2 -0
- package/dist/guest/network/addresses.js +6 -0
- package/dist/guest/{setup/network.d.ts → network/allow-only.d.ts} +0 -10
- package/dist/guest/network/allow-only.js +84 -0
- package/dist/guest/network/firewall.d.ts +9 -0
- package/dist/guest/{setup/network.js → network/firewall.js} +58 -63
- package/dist/guest/network/proxy-server.d.ts +2 -0
- package/dist/guest/{netproxy.js → network/proxy-server.js} +37 -18
- package/dist/guest/{helpers.d.ts → runtime/csc.d.ts} +1 -1
- package/dist/guest/{helpers.js → runtime/csc.js} +7 -2
- package/dist/guest/runtime/fs.d.ts +2 -0
- package/dist/guest/runtime/fs.js +6 -0
- package/dist/guest/runtime/log.d.ts +3 -0
- package/dist/guest/runtime/log.js +22 -0
- package/dist/guest/runtime/paths.d.ts +13 -0
- package/dist/guest/runtime/paths.js +14 -0
- package/dist/guest/{ports.js → runtime/ports.js} +8 -2
- package/dist/guest/runtime/process.d.ts +15 -0
- package/dist/guest/runtime/process.js +59 -0
- package/dist/guest/{project-context.js → runtime/project-context.js} +1 -1
- package/dist/guest/runtime/session.d.ts +5 -0
- package/dist/guest/runtime/session.js +10 -0
- package/dist/guest/runtime/status.d.ts +7 -0
- package/dist/guest/runtime/status.js +57 -0
- package/dist/guest/{cmdline.js → sessions/cmdline.js} +10 -4
- package/dist/guest/{ptyhost.js → sessions/pty-host.js} +12 -5
- package/dist/guest/{view.js → sessions/viewer.js} +8 -11
- package/dist/guest/setup/claude-mem.d.ts +10 -0
- package/dist/guest/setup/{claude.js → claude-mem.js} +18 -78
- package/dist/guest/setup/{claude.d.ts → claude-profile.d.ts} +0 -10
- package/dist/guest/setup/claude-profile.js +89 -0
- package/dist/guest/setup/desktop.d.ts +2 -0
- package/dist/guest/setup/desktop.js +32 -0
- package/dist/guest/setup/environment.js +28 -5
- package/dist/guest/setup/{user.d.ts → git-identity.d.ts} +0 -2
- package/dist/guest/setup/git-identity.js +34 -0
- package/dist/guest/{gitrules.d.ts → setup/git-rules.d.ts} +1 -1
- package/dist/guest/setup/git-rules.js +50 -0
- package/dist/guest/setup/hooks.js +22 -5
- package/dist/guest/setup/{policy.js → managed-policy.js} +2 -2
- package/dist/guest/toolchains/catalogue.d.ts +4 -4
- package/dist/guest/toolchains/catalogue.js +30 -7
- package/dist/guest/toolchains/detect.d.ts +12 -0
- package/dist/guest/toolchains/detect.js +54 -0
- package/dist/guest/toolchains/index.d.ts +3 -17
- package/dist/guest/toolchains/index.js +1 -80
- package/dist/guest/toolchains/install.d.ts +20 -0
- package/dist/guest/toolchains/install.js +29 -0
- package/dist/guest/toolchains/languages/go.d.ts +3 -0
- package/dist/guest/toolchains/{go.js → languages/go.js} +27 -9
- package/dist/guest/toolchains/languages/java.d.ts +8 -0
- package/dist/guest/toolchains/{java.js → languages/java.js} +57 -18
- package/dist/guest/toolchains/languages/node.d.ts +3 -0
- package/dist/guest/toolchains/{node.js → languages/node.js} +51 -18
- package/dist/guest/toolchains/languages/php.d.ts +3 -0
- package/dist/guest/toolchains/{scripting → languages}/php.js +36 -11
- package/dist/guest/toolchains/languages/python-tools.d.ts +3 -0
- package/dist/guest/toolchains/languages/python-tools.js +12 -0
- package/dist/guest/toolchains/languages/python.d.ts +3 -0
- package/dist/guest/toolchains/{python.js → languages/python.js} +29 -16
- package/dist/guest/toolchains/languages/ruby.d.ts +3 -0
- package/dist/guest/toolchains/{scripting → languages}/ruby.js +28 -10
- package/dist/guest/toolchains/leftovers.d.ts +1 -1
- package/dist/guest/toolchains/leftovers.js +13 -11
- package/dist/guest/toolchains/managers.d.ts +6 -6
- package/dist/guest/toolchains/managers.js +38 -17
- package/dist/guest/toolchains/native/binstall.d.ts +3 -2
- package/dist/guest/toolchains/native/binstall.js +20 -8
- package/dist/guest/toolchains/native/cpp.d.ts +2 -2
- package/dist/guest/toolchains/native/cpp.js +23 -8
- package/dist/guest/toolchains/native/dotnet.d.ts +5 -3
- package/dist/guest/toolchains/native/dotnet.js +72 -24
- package/dist/guest/toolchains/native/mesa.d.ts +2 -2
- package/dist/guest/toolchains/native/mesa.js +27 -10
- package/dist/guest/toolchains/native/msvc/environment.d.ts +4 -4
- package/dist/guest/toolchains/native/msvc/environment.js +30 -16
- package/dist/guest/toolchains/native/msvc/index.d.ts +3 -3
- package/dist/guest/toolchains/native/msvc/index.js +10 -8
- package/dist/guest/toolchains/native/msvc/packages.d.ts +1 -1
- package/dist/guest/toolchains/native/msvc/packages.js +69 -23
- package/dist/guest/toolchains/native/msvc/tree.d.ts +6 -6
- package/dist/guest/toolchains/native/msvc/tree.js +15 -9
- package/dist/guest/toolchains/native/rust-extras.d.ts +23 -0
- package/dist/guest/toolchains/native/rust-extras.js +100 -0
- package/dist/guest/toolchains/native/rust.d.ts +2 -2
- package/dist/guest/toolchains/native/rust.js +41 -10
- package/dist/guest/toolchains/{scripting → native}/vcruntime.d.ts +2 -2
- package/dist/guest/toolchains/{scripting → native}/vcruntime.js +17 -7
- package/dist/guest/toolchains/package-ledger.d.ts +17 -0
- package/dist/guest/toolchains/package-ledger.js +54 -0
- package/dist/guest/toolchains/plan.d.ts +3 -24
- package/dist/guest/toolchains/plan.js +99 -111
- package/dist/guest/toolchains/runtimes.d.ts +6 -6
- package/dist/guest/toolchains/runtimes.js +31 -13
- package/dist/guest/toolchains/scheduler.d.ts +22 -0
- package/dist/guest/toolchains/scheduler.js +123 -0
- package/dist/guest/toolchains/setup.d.ts +10 -0
- package/dist/guest/toolchains/setup.js +22 -0
- package/dist/guest/toolchains/state-file.d.ts +3 -0
- package/dist/guest/toolchains/state-file.js +10 -0
- package/dist/guest/toolchains/step.d.ts +24 -0
- package/dist/guest/toolchains/step.js +1 -0
- package/dist/guest/toolchains/tool-env.d.ts +12 -0
- package/dist/guest/toolchains/tool-env.js +16 -0
- package/dist/guest/toolchains/tools/cli.d.ts +10 -0
- package/dist/guest/toolchains/{cli.js → tools/cli.js} +35 -15
- package/dist/guest/toolchains/tools/git.d.ts +3 -0
- package/dist/guest/toolchains/{git.js → tools/git.js} +38 -15
- package/dist/guest/toolchains/tools/pwsh.d.ts +4 -0
- package/dist/guest/toolchains/{pwsh.js → tools/pwsh.js} +14 -7
- package/dist/guest/toolchains/{vscode-profile.d.ts → tools/vscode-profile.d.ts} +6 -6
- package/dist/guest/toolchains/{vscode-profile.js → tools/vscode-profile.js} +28 -12
- package/dist/guest/toolchains/{vscode.d.ts → tools/vscode.d.ts} +6 -6
- package/dist/guest/toolchains/{vscode.js → tools/vscode.js} +67 -21
- package/dist/guest/toolchains/version-cache.d.ts +16 -0
- package/dist/guest/toolchains/version-cache.js +67 -0
- package/dist/host/agent-commands/commands.d.ts +13 -0
- package/dist/host/agent-commands/commands.js +33 -0
- package/dist/host/agent-commands/forwarders.d.ts +7 -0
- package/dist/host/agent-commands/forwarders.js +31 -0
- package/dist/host/agent-commands/index.d.ts +4 -0
- package/dist/host/agent-commands/index.js +4 -0
- package/dist/host/agent-commands/reconcile.d.ts +12 -0
- package/dist/host/agent-commands/reconcile.js +69 -0
- package/dist/host/agent-commands/user-path.d.ts +2 -0
- package/dist/host/agent-commands/user-path.js +33 -0
- package/dist/host/audit/collect.d.ts +2 -2
- package/dist/host/audit/collect.js +59 -22
- package/dist/host/audit/log.d.ts +2 -2
- package/dist/host/audit/log.js +24 -8
- package/dist/host/{attach.d.ts → channel/attach.d.ts} +2 -2
- package/dist/host/{attach.js → channel/attach.js} +33 -15
- package/dist/host/channel/channel.d.ts +51 -0
- package/dist/host/channel/channel.js +196 -0
- package/dist/host/channel/index.d.ts +2 -0
- package/dist/host/channel/index.js +2 -0
- package/dist/host/guard/agent-files.d.ts +7 -0
- package/dist/host/guard/agent-files.js +103 -0
- package/dist/host/guard/commands.d.ts +10 -0
- package/dist/host/guard/commands.js +123 -0
- package/dist/host/guard/file-hash.d.ts +4 -0
- package/dist/host/guard/file-hash.js +37 -0
- package/dist/host/guard/git-config.d.ts +5 -0
- package/dist/host/guard/git-config.js +62 -0
- package/dist/host/guard/git-dirs.d.ts +12 -0
- package/dist/host/guard/git-dirs.js +53 -0
- package/dist/host/guard/index.d.ts +5 -0
- package/dist/host/guard/index.js +4 -0
- package/dist/host/guard/mark-of-the-web.d.ts +8 -0
- package/dist/host/guard/mark-of-the-web.js +74 -0
- package/dist/host/guard/nested-repos.d.ts +14 -0
- package/dist/host/guard/nested-repos.js +88 -0
- package/dist/host/guard/quarantine.d.ts +3 -0
- package/dist/host/guard/quarantine.js +24 -0
- package/dist/host/guard/repo-guard.d.ts +10 -0
- package/dist/host/guard/repo-guard.js +36 -0
- package/dist/host/guard/store.d.ts +40 -0
- package/dist/host/guard/store.js +145 -0
- package/dist/host/guard/types.d.ts +27 -0
- package/dist/host/guard/types.js +3 -0
- package/dist/host/guard/watch-state.d.ts +9 -0
- package/dist/host/guard/watch-state.js +26 -0
- package/dist/host/launch/boot-projects.d.ts +17 -0
- package/dist/host/launch/{projects.js → boot-projects.js} +27 -12
- package/dist/host/{database-plan.d.ts → launch/database-plan.d.ts} +5 -5
- package/dist/host/{database-plan.js → launch/database-plan.js} +24 -13
- package/dist/host/launch/generate.d.ts +4 -0
- package/dist/host/launch/generate.js +77 -0
- package/dist/host/launch/index.d.ts +10 -0
- package/dist/host/launch/index.js +10 -0
- package/dist/host/launch/mappings.d.ts +7 -2
- package/dist/host/launch/mappings.js +83 -24
- package/dist/host/launch/pc-scan.d.ts +5 -0
- package/dist/host/{pc-scan.js → launch/pc-scan.js} +20 -13
- package/dist/host/launch/project-scan.d.ts +7 -0
- package/dist/host/{project-scan.js → launch/project-scan.js} +29 -21
- package/dist/host/launch/session-file.d.ts +23 -0
- package/dist/host/launch/session-file.js +73 -0
- package/dist/host/launch/stage.d.ts +5 -5
- package/dist/host/launch/stage.js +14 -13
- package/dist/host/launch/toolchains.d.ts +4 -0
- package/dist/host/launch/toolchains.js +11 -0
- package/dist/host/launch/{wsb.d.ts → wsb-file.d.ts} +4 -2
- package/dist/host/launch/wsb-file.js +56 -0
- package/dist/host/life/crash-report.d.ts +8 -0
- package/dist/host/life/crash-report.js +87 -0
- package/dist/host/life/index.d.ts +6 -0
- package/dist/host/life/index.js +6 -0
- package/dist/host/life/keep-awake.d.ts +10 -0
- package/dist/host/life/keep-awake.js +29 -0
- package/dist/host/life/life-record.d.ts +48 -0
- package/dist/host/life/life-record.js +76 -0
- package/dist/host/life/stop-events.d.ts +27 -0
- package/dist/host/life/stop-events.js +96 -0
- package/dist/host/life/stop-warning.d.ts +4 -0
- package/dist/host/life/stop-warning.js +25 -0
- package/dist/host/life/windows-update.d.ts +3 -0
- package/dist/host/life/windows-update.js +11 -0
- package/dist/host/native.d.ts +4 -0
- package/dist/host/native.js +11 -0
- package/dist/host/network/index.d.ts +1 -0
- package/dist/host/network/index.js +1 -0
- package/dist/host/{port-forward.d.ts → network/port-forward.d.ts} +1 -1
- package/dist/host/{port-forward.js → network/port-forward.js} +16 -10
- package/dist/host/profile/accounts.d.ts +37 -0
- package/dist/host/profile/accounts.js +146 -0
- package/dist/host/profile/claude-login.d.ts +22 -0
- package/dist/host/profile/claude-login.js +57 -0
- package/dist/host/{claude-profile.d.ts → profile/claude-profile.d.ts} +9 -9
- package/dist/host/{claude-profile.js → profile/claude-profile.js} +32 -22
- package/dist/host/profile/index.d.ts +7 -0
- package/dist/host/profile/index.js +7 -0
- package/dist/host/profile/personalize.d.ts +2 -0
- package/dist/host/profile/personalize.js +127 -0
- package/dist/host/profile/reg-file.d.ts +8 -0
- package/dist/host/profile/reg-file.js +45 -0
- package/dist/host/profile/secret-files.d.ts +2 -0
- package/dist/host/profile/secret-files.js +25 -0
- package/dist/host/profile/secret-patterns.d.ts +6 -0
- package/dist/host/profile/secret-patterns.js +128 -0
- package/dist/host/profile/secrets.d.ts +12 -0
- package/dist/host/profile/secrets.js +100 -0
- package/dist/host/projects/index.d.ts +4 -0
- package/dist/host/projects/index.js +4 -0
- package/dist/host/projects/join.d.ts +38 -0
- package/dist/host/projects/join.js +119 -0
- package/dist/host/projects/known.d.ts +28 -0
- package/dist/host/projects/known.js +55 -0
- package/dist/host/projects/mapper.d.ts +29 -0
- package/dist/host/projects/mapper.js +88 -0
- package/dist/host/projects/registry.d.ts +83 -0
- package/dist/host/projects/registry.js +136 -0
- package/dist/host/sandbox/doctor.d.ts +2 -0
- package/dist/host/sandbox/doctor.js +42 -0
- package/dist/host/sandbox/host-claude.d.ts +1 -0
- package/dist/host/sandbox/host-claude.js +26 -0
- package/dist/host/sandbox/index.d.ts +6 -0
- package/dist/host/sandbox/index.js +6 -0
- package/dist/host/{platform.d.ts → sandbox/platform.d.ts} +0 -5
- package/dist/host/sandbox/platform.js +60 -0
- package/dist/host/sandbox/probe.d.ts +3 -0
- package/dist/host/sandbox/probe.js +47 -0
- package/dist/host/{window.js → sandbox/window.js} +7 -5
- package/dist/host/{wsb.js → sandbox/wsb-cli.js} +31 -8
- package/dist/host/{cleanup.js → storage/cleanup.js} +27 -12
- package/dist/host/storage/index.d.ts +2 -0
- package/dist/host/storage/index.js +2 -0
- package/dist/host/storage/state-files.d.ts +4 -0
- package/dist/host/storage/state-files.js +10 -0
- package/dist/host/test-guard.js +1 -1
- package/dist/host/tools/conpty.d.ts +8 -0
- package/dist/host/tools/conpty.js +58 -0
- package/dist/host/tools/index.d.ts +2 -0
- package/dist/host/tools/index.js +2 -0
- package/dist/host/{terminal.d.ts → tools/windows-terminal.d.ts} +2 -10
- package/dist/host/{terminal.js → tools/windows-terminal.js} +33 -57
- package/dist/host/workspace-view/active-views.d.ts +3 -0
- package/dist/host/workspace-view/active-views.js +22 -0
- package/dist/host/workspace-view/index.d.ts +2 -18
- package/dist/host/workspace-view/index.js +2 -49
- package/dist/host/workspace-view/plan.d.ts +16 -0
- package/dist/host/workspace-view/plan.js +50 -0
- package/dist/host/workspace-view/rules.js +10 -3
- package/dist/host/workspace-view/view-state.d.ts +10 -0
- package/dist/host/workspace-view/view-state.js +31 -0
- package/dist/host/workspace-view/view.d.ts +1 -0
- package/dist/host/workspace-view/view.js +51 -55
- package/dist/runtime/daemon.js +4232 -1918
- package/dist/runtime/db.js +2145 -830
- package/dist/runtime/gitguard.js +29 -11
- package/dist/runtime/main.js +4760 -2155
- package/dist/runtime/netproxy.js +1654 -418
- package/dist/runtime/view.js +1515 -453
- package/dist/selftest/accounts.test.d.ts +1 -1
- package/dist/selftest/accounts.test.js +20 -17
- package/dist/selftest/agent-commands.test.d.ts +1 -1
- package/dist/selftest/agent-commands.test.js +9 -5
- package/dist/selftest/audit.test.d.ts +1 -1
- package/dist/selftest/audit.test.js +46 -13
- package/dist/selftest/channel.test.d.ts +1 -1
- package/dist/selftest/channel.test.js +91 -8
- package/dist/selftest/cli.test.d.ts +1 -1
- package/dist/selftest/cli.test.js +68 -16
- package/dist/selftest/cmdline.test.d.ts +1 -1
- package/dist/selftest/cmdline.test.js +36 -7
- package/dist/selftest/config.test.d.ts +1 -1
- package/dist/selftest/config.test.js +12 -5
- package/dist/selftest/data.test.d.ts +1 -1
- package/dist/selftest/data.test.js +35 -6
- package/dist/selftest/detect.test.d.ts +1 -1
- package/dist/selftest/detect.test.js +22 -9
- package/dist/selftest/generate.test.d.ts +1 -1
- package/dist/selftest/generate.test.js +33 -9
- package/dist/selftest/git-access.test.d.ts +1 -1
- package/dist/selftest/git-access.test.js +42 -4
- package/dist/selftest/guest-boot.test.d.ts +1 -1
- package/dist/selftest/guest-boot.test.js +25 -7
- package/dist/selftest/host-sim.test.d.ts +1 -1
- package/dist/selftest/host-sim.test.js +27 -3
- package/dist/selftest/hostile-input.test.d.ts +1 -1
- package/dist/selftest/hostile-input.test.js +5 -5
- package/dist/selftest/index.d.ts +1 -1
- package/dist/selftest/index.js +73 -16
- package/dist/selftest/layout.test.d.ts +2 -0
- package/dist/selftest/layout.test.js +131 -0
- package/dist/selftest/links.test.d.ts +1 -1
- package/dist/selftest/links.test.js +16 -11
- package/dist/selftest/live-daemon.test.d.ts +1 -1
- package/dist/selftest/live-daemon.test.js +20 -8
- package/dist/selftest/live-git.test.d.ts +1 -1
- package/dist/selftest/live-git.test.js +13 -4
- package/dist/selftest/live-network.test.d.ts +1 -1
- package/dist/selftest/live-network.test.js +24 -9
- package/dist/selftest/live-projects.test.d.ts +1 -1
- package/dist/selftest/live-projects.test.js +47 -20
- package/dist/selftest/live-terminal.test.d.ts +2 -0
- package/dist/selftest/live-terminal.test.js +195 -0
- package/dist/selftest/local-config.test.d.ts +1 -1
- package/dist/selftest/local-config.test.js +88 -15
- package/dist/selftest/mirror.test.d.ts +1 -1
- package/dist/selftest/mirror.test.js +118 -19
- package/dist/selftest/network.test.d.ts +1 -1
- package/dist/selftest/network.test.js +17 -8
- package/dist/selftest/personalization.test.d.ts +1 -1
- package/dist/selftest/personalization.test.js +12 -5
- package/dist/selftest/projects.test.d.ts +1 -1
- package/dist/selftest/projects.test.js +336 -72
- package/dist/selftest/repair.test.d.ts +1 -1
- package/dist/selftest/repair.test.js +17 -5
- package/dist/selftest/repo-guard.test.d.ts +1 -1
- package/dist/selftest/repo-guard.test.js +21 -20
- package/dist/selftest/secrets.test.d.ts +1 -1
- package/dist/selftest/secrets.test.js +57 -13
- package/dist/selftest/setup.test.d.ts +1 -1
- package/dist/selftest/setup.test.js +25 -5
- package/dist/selftest/{fixtures.d.ts → support/fixtures.d.ts} +7 -4
- package/dist/selftest/{fixtures.js → support/fixtures.js} +95 -17
- package/dist/selftest/{harness.js → support/harness.js} +24 -7
- package/dist/selftest/{live.d.ts → support/live.d.ts} +2 -2
- package/dist/selftest/{live.js → support/live.js} +34 -10
- package/dist/selftest/support/suite.js +1 -0
- package/dist/selftest/sync.test.d.ts +1 -1
- package/dist/selftest/sync.test.js +64 -26
- package/dist/selftest/test-guard.test.d.ts +1 -1
- package/dist/selftest/test-guard.test.js +43 -15
- package/dist/selftest/toolchains.test.d.ts +1 -1
- package/dist/selftest/toolchains.test.js +135 -36
- package/dist/selftest/workspace-view.test.d.ts +1 -1
- package/dist/selftest/workspace-view.test.js +48 -11
- package/dist/selftest/workspace.test.d.ts +1 -1
- package/dist/selftest/workspace.test.js +13 -4
- package/dist/shared/{apps.d.ts → apps/catalogue.d.ts} +1 -11
- package/dist/shared/apps/catalogue.js +768 -0
- package/dist/shared/apps/index.d.ts +2 -0
- package/dist/shared/apps/index.js +2 -0
- package/dist/shared/apps/selection.d.ts +11 -0
- package/dist/shared/apps/selection.js +40 -0
- package/dist/shared/channel/index.d.ts +2 -0
- package/dist/shared/channel/index.js +2 -0
- package/dist/shared/channel/run-dir.d.ts +30 -0
- package/dist/shared/channel/run-dir.js +84 -0
- package/dist/shared/{schema.d.ts → channel/schema.d.ts} +60 -19
- package/dist/shared/channel/schema.js +131 -0
- package/dist/shared/download/archive.d.ts +13 -0
- package/dist/shared/download/archive.js +57 -0
- package/dist/shared/download/downloader.d.ts +35 -0
- package/dist/shared/download/downloader.js +110 -0
- package/dist/shared/download/github.d.ts +16 -0
- package/dist/shared/download/github.js +74 -0
- package/dist/shared/download/http.d.ts +5 -0
- package/dist/shared/download/http.js +30 -0
- package/dist/shared/download/index.d.ts +5 -0
- package/dist/shared/download/index.js +5 -0
- package/dist/shared/download/spawn.d.ts +2 -0
- package/dist/shared/download/spawn.js +7 -0
- package/dist/shared/io/index.d.ts +3 -0
- package/dist/shared/io/index.js +3 -0
- package/dist/shared/io/json-file.d.ts +10 -0
- package/dist/shared/io/json-file.js +21 -0
- package/dist/shared/io/json.d.ts +13 -0
- package/dist/shared/io/json.js +49 -0
- package/dist/shared/{safe-remove.js → io/safe-remove.js} +32 -7
- package/dist/shared/{netrules.js → network/firewall-rules.js} +36 -5
- package/dist/shared/network/index.d.ts +2 -0
- package/dist/shared/network/index.js +2 -0
- package/dist/shared/{netpolicy.js → network/policy.js} +66 -11
- package/dist/shared/{paths.js → paths/claude-paths.js} +12 -2
- package/dist/shared/{guest-paths.d.ts → paths/guest-paths.d.ts} +21 -0
- package/dist/shared/paths/guest-paths.js +146 -0
- package/dist/shared/paths/index.d.ts +3 -0
- package/dist/shared/paths/index.js +3 -0
- package/dist/shared/{projects.d.ts → paths/projects.d.ts} +27 -4
- package/dist/shared/paths/projects.js +136 -0
- package/dist/shared/pty/client.d.ts +21 -0
- package/dist/shared/pty/client.js +79 -0
- package/dist/shared/pty/console-input.d.ts +11 -0
- package/dist/shared/pty/console-input.js +81 -0
- package/dist/shared/pty/index.d.ts +6 -0
- package/dist/shared/pty/index.js +6 -0
- package/dist/shared/pty/input-joiner.d.ts +15 -0
- package/dist/shared/pty/input-joiner.js +44 -0
- package/dist/shared/pty/output-filter.d.ts +13 -0
- package/dist/shared/pty/output-filter.js +140 -0
- package/dist/shared/pty/protocol.d.ts +36 -0
- package/dist/shared/pty/protocol.js +60 -0
- package/dist/shared/pty/terminal.d.ts +24 -0
- package/dist/shared/pty/terminal.js +147 -0
- package/dist/shared/test-guard.js +3 -1
- package/dist/sync/claude-mem.d.ts +1 -1
- package/dist/sync/claude-mem.js +9 -4
- package/dist/sync/history.d.ts +1 -29
- package/dist/sync/history.js +57 -45
- package/dist/sync/index.d.ts +5 -0
- package/dist/sync/index.js +5 -0
- package/dist/sync/sync-cycle.d.ts +18 -0
- package/dist/sync/sync-cycle.js +85 -0
- package/dist/sync/sync-state.d.ts +32 -0
- package/dist/sync/sync-state.js +37 -0
- package/dist/sync/watcher.d.ts +0 -18
- package/dist/sync/watcher.js +66 -100
- package/native/keep-awake.ps1 +8 -0
- package/native/power.cs +23 -0
- package/native/stop-events.ps1 +38 -0
- package/package.json +11 -3
- package/sandbox/linkgate.cs +98 -0
- package/sandbox/memlog.ps1 +15 -6
- package/sandbox/ptyhost.cs +60 -3
- package/schemas/config.schema.json +48 -1
- package/schemas/sandbox-config.schema.json +37 -3
- package/dist/cli/commands/launch.d.ts +0 -29
- package/dist/cli/commands/launch.js +0 -366
- package/dist/cli/commands/maintenance.d.ts +0 -10
- package/dist/cli/commands/maintenance.js +0 -187
- package/dist/cli/commands/project.d.ts +0 -29
- package/dist/cli/commands/project.js +0 -63
- package/dist/cli/commands/projects.d.ts +0 -14
- package/dist/cli/commands/projects.js +0 -146
- package/dist/cli/commands/restart.d.ts +0 -6
- package/dist/cli/commands/restart.js +0 -85
- package/dist/cli/commands/sessions.d.ts +0 -12
- package/dist/cli/commands/sessions.js +0 -257
- package/dist/cli/menu/settings/editors.js +0 -305
- package/dist/cli/progress.d.ts +0 -9
- package/dist/cli/progress.js +0 -49
- package/dist/cli/tui/dialogs.d.ts +0 -57
- package/dist/cli/tui/dialogs.js +0 -162
- package/dist/core/config.js +0 -109
- package/dist/core/schema.d.ts +0 -6
- package/dist/core/schema.js +0 -8
- package/dist/core/util.d.ts +0 -62
- package/dist/core/util.js +0 -156
- package/dist/core/workspace.d.ts +0 -18
- package/dist/core/workspace.js +0 -145
- package/dist/guest/boot-env.d.ts +0 -4
- package/dist/guest/daemon.js +0 -57
- package/dist/guest/env.d.ts +0 -52
- package/dist/guest/env.js +0 -103
- package/dist/guest/gitrules.js +0 -11
- package/dist/guest/project-status.d.ts +0 -5
- package/dist/guest/project-status.js +0 -17
- package/dist/guest/setup/user.js +0 -51
- package/dist/guest/toolchains/cli.d.ts +0 -10
- package/dist/guest/toolchains/common.d.ts +0 -54
- package/dist/guest/toolchains/common.js +0 -147
- package/dist/guest/toolchains/databases/dynamodb.d.ts +0 -8
- package/dist/guest/toolchains/databases/dynamodb.js +0 -52
- package/dist/guest/toolchains/databases/index.d.ts +0 -6
- package/dist/guest/toolchains/databases/index.js +0 -62
- package/dist/guest/toolchains/databases/mongodb.d.ts +0 -3
- package/dist/guest/toolchains/databases/mongodb.js +0 -31
- package/dist/guest/toolchains/databases/mysql.d.ts +0 -3
- package/dist/guest/toolchains/databases/mysql.js +0 -38
- package/dist/guest/toolchains/databases/postgres.d.ts +0 -5
- package/dist/guest/toolchains/databases/postgres.js +0 -38
- package/dist/guest/toolchains/databases/redis.d.ts +0 -3
- package/dist/guest/toolchains/databases/redis.js +0 -16
- package/dist/guest/toolchains/git.d.ts +0 -3
- package/dist/guest/toolchains/go.d.ts +0 -3
- package/dist/guest/toolchains/java.d.ts +0 -8
- package/dist/guest/toolchains/node.d.ts +0 -3
- package/dist/guest/toolchains/pwsh.d.ts +0 -4
- package/dist/guest/toolchains/python.d.ts +0 -3
- package/dist/guest/toolchains/scripting/php.d.ts +0 -3
- package/dist/guest/toolchains/scripting/ruby.d.ts +0 -3
- package/dist/host/accounts.d.ts +0 -32
- package/dist/host/accounts.js +0 -128
- package/dist/host/agent-commands.d.ts +0 -25
- package/dist/host/agent-commands.js +0 -145
- package/dist/host/channel.d.ts +0 -38
- package/dist/host/channel.js +0 -162
- package/dist/host/generate.d.ts +0 -13
- package/dist/host/generate.js +0 -108
- package/dist/host/join.d.ts +0 -28
- package/dist/host/join.js +0 -76
- package/dist/host/launch/projects.d.ts +0 -15
- package/dist/host/launch/wsb.js +0 -34
- package/dist/host/motw.d.ts +0 -17
- package/dist/host/motw.js +0 -74
- package/dist/host/pc-scan.d.ts +0 -6
- package/dist/host/personalize.d.ts +0 -10
- package/dist/host/personalize.js +0 -97
- package/dist/host/platform.js +0 -129
- package/dist/host/project-scan.d.ts +0 -7
- package/dist/host/projects.d.ts +0 -100
- package/dist/host/projects.js +0 -147
- package/dist/host/repo-guard.d.ts +0 -43
- package/dist/host/repo-guard.js +0 -347
- package/dist/host/secrets.d.ts +0 -14
- package/dist/host/secrets.js +0 -133
- package/dist/host/stops.d.ts +0 -67
- package/dist/host/stops.js +0 -126
- package/dist/shared/apps.js +0 -114
- package/dist/shared/download.d.ts +0 -60
- package/dist/shared/download.js +0 -215
- package/dist/shared/guest-paths.js +0 -61
- package/dist/shared/projects.js +0 -67
- package/dist/shared/pty-client.d.ts +0 -91
- package/dist/shared/pty-client.js +0 -349
- package/dist/shared/rundir.d.ts +0 -41
- package/dist/shared/rundir.js +0 -96
- package/dist/shared/schema.js +0 -92
- /package/dist/{guest/daemon.d.ts → cli/tui/list/list-types.js} +0 -0
- /package/dist/{guest/db.d.ts → cli/tui/screen.js} +0 -0
- /package/dist/core/{detect-databases.d.ts → detect/databases.d.ts} +0 -0
- /package/dist/{guest/toolchains → core/detect}/versions.d.ts +0 -0
- /package/dist/guest/{setup/agents.d.ts → agents/agent-installer.d.ts} +0 -0
- /package/dist/guest/{audit-parse.d.ts → audit/parse.d.ts} +0 -0
- /package/dist/guest/{guide.d.ts → boot/guide.d.ts} +0 -0
- /package/dist/guest/daemon/{shutdown.d.ts → idle-shutdown.d.ts} +0 -0
- /package/dist/guest/daemon/{session.d.ts → sessions.d.ts} +0 -0
- /package/dist/guest/{main.d.ts → entries/daemon.d.ts} +0 -0
- /package/dist/guest/{netproxy.d.ts → entries/db.d.ts} +0 -0
- /package/dist/{selftest/suite.js → guest/entries/gitguard.d.ts} +0 -0
- /package/dist/guest/{gitguard.d.ts → git/decision.d.ts} +0 -0
- /package/dist/guest/{ports.d.ts → runtime/ports.d.ts} +0 -0
- /package/dist/guest/{project-context.d.ts → runtime/project-context.d.ts} +0 -0
- /package/dist/guest/{cmdline.d.ts → sessions/cmdline.d.ts} +0 -0
- /package/dist/guest/{ptyhost.d.ts → sessions/pty-host.d.ts} +0 -0
- /package/dist/guest/{view.d.ts → sessions/viewer.d.ts} +0 -0
- /package/dist/guest/setup/{policy.d.ts → managed-policy.d.ts} +0 -0
- /package/dist/host/{window.d.ts → sandbox/window.d.ts} +0 -0
- /package/dist/host/{wsb.d.ts → sandbox/wsb-cli.d.ts} +0 -0
- /package/dist/host/{cleanup.d.ts → storage/cleanup.d.ts} +0 -0
- /package/dist/selftest/{harness.d.ts → support/harness.d.ts} +0 -0
- /package/dist/selftest/{suite.d.ts → support/suite.d.ts} +0 -0
- /package/dist/shared/{safe-remove.d.ts → io/safe-remove.d.ts} +0 -0
- /package/dist/shared/{netrules.d.ts → network/firewall-rules.d.ts} +0 -0
- /package/dist/shared/{netpolicy.d.ts → network/policy.d.ts} +0 -0
- /package/dist/shared/{paths.d.ts → paths/claude-paths.d.ts} +0 -0
|
@@ -11,6 +11,27 @@ export declare const guestDrive: (guest: string) => string | null;
|
|
|
11
11
|
* no '..' or empty segments, no characters Windows rejects in paths.
|
|
12
12
|
*/
|
|
13
13
|
export declare const isValidGuestPath: (guest: string) => boolean;
|
|
14
|
+
/** A guest path as typed, tidied: '/' -> '\', no doubled or trailing backslashes, upper-case drive letter. */
|
|
15
|
+
export declare const tidyGuestPath: (guest: string) => string;
|
|
16
|
+
/** Why a guest path cannot be used as it is (null: it can). Short, plain English. */
|
|
17
|
+
export declare const guestPathProblem: (guest: string) => string | null;
|
|
18
|
+
/** Two guest folders overlap where they really are (F:\x is C:\Mirror\F\x): the same, or one inside the other. */
|
|
19
|
+
export declare const guestOverlaps: (a: string, b: string) => boolean;
|
|
20
|
+
/** How to fix a mapping whose guest path cannot be used: `guest` is what it asked for (none = the PC path). */
|
|
21
|
+
export declare const guestFix: (guest: string | undefined) => string;
|
|
22
|
+
/**
|
|
23
|
+
* Why a folder cannot appear at `guest` in the sandbox (null: it can): a path the sandbox cannot use, or one that
|
|
24
|
+
* overlaps a folder in `taken`. Folders are never moved somewhere else: the launch names the problem and the fix.
|
|
25
|
+
*/
|
|
26
|
+
export declare const guestConflict: (guest: string, taken: readonly {
|
|
27
|
+
guest: string;
|
|
28
|
+
what: string;
|
|
29
|
+
}[]) => string | null;
|
|
30
|
+
/**
|
|
31
|
+
* The guest path a mapping asks for when it gives none: a folder inside the project at the same place in the project's
|
|
32
|
+
* guest folder, any other folder at the same path as on this PC (D: to Z: through C:\Mirror and subst).
|
|
33
|
+
*/
|
|
34
|
+
export declare const deriveGuest: (host: string, projectHost: string, projectGuest: string) => string;
|
|
14
35
|
/** Where a guest path really is inside the sandbox (the .wsb SandboxFolder): C: paths as-is, F:\x -> C:\Mirror\F\x. */
|
|
15
36
|
export declare const sandboxFolder: (guest: string) => string;
|
|
16
37
|
export interface SubstDrive {
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
// Guest paths on drive letters other than C:. Windows Sandbox can only map folders onto its own C: drive, so a
|
|
2
|
+
// guest path like F:\SteamLibrary\x is mapped to C:\Mirror\F\SteamLibrary\x and, at boot (bootstrap.ps1, before
|
|
3
|
+
// anything else uses the workspace), `subst F: C:\Mirror\F` makes it appear at F:\SteamLibrary\x.
|
|
4
|
+
// Pure functions only: used by the schema, the host (.wsb, session.json) and history sync.
|
|
5
|
+
import { win32 } from 'node:path';
|
|
6
|
+
/** Guest folders no mapping may use: the OS, the sandbox's own folders and the mirror root. */
|
|
7
|
+
export const RESERVED_GUEST = /^C:\\(?:Windows|Program Files|Program Files \(x86\)|ProgramData|Users|AgentLaunch|AgentData|HostTools|nvm|Mirror)(?:\\|$)/i;
|
|
8
|
+
/** Where folders for other drive letters really live inside the sandbox: C:\Mirror\<letter>. */
|
|
9
|
+
export const MIRROR_ROOT = 'C:\\Mirror';
|
|
10
|
+
/** Letters a mirrored path may use. Never C: (the sandbox's own disk); A:/B: are left alone (floppy-era tools). */
|
|
11
|
+
export const MIRROR_LETTER = /^[D-Z]$/;
|
|
12
|
+
const DRIVE_PATH = /^([A-Za-z]):\\(.*)$/;
|
|
13
|
+
// No other ':' (alternate data streams), no wildcards or pipes, no control characters, no forward slashes.
|
|
14
|
+
const BAD_CHARS = /[<>:"|?*/\x00-\x1f]/;
|
|
15
|
+
/** The upper-case drive letter of an absolute guest path (F:\x -> F), or null. */
|
|
16
|
+
export const guestDrive = (guest) => DRIVE_PATH.exec(guest)?.[1].toUpperCase() ?? null;
|
|
17
|
+
/**
|
|
18
|
+
* A folder the sandbox can show a host folder at: C:\<not reserved>\... or <D-Z>:\..., never a drive root,
|
|
19
|
+
* no '..' or empty segments, no characters Windows rejects in paths.
|
|
20
|
+
*/
|
|
21
|
+
export const isValidGuestPath = (guest) => {
|
|
22
|
+
const m = DRIVE_PATH.exec(guest);
|
|
23
|
+
if (!m)
|
|
24
|
+
return false;
|
|
25
|
+
const letter = m[1].toUpperCase();
|
|
26
|
+
const rest = m[2].replace(/\\+$/, '');
|
|
27
|
+
if (rest === '' || BAD_CHARS.test(rest))
|
|
28
|
+
return false;
|
|
29
|
+
if (rest.split('\\').some((segment) => segment === '' || segment === '.' || segment === '..' || /[. ]$/.test(segment)))
|
|
30
|
+
return false;
|
|
31
|
+
if (letter === 'C')
|
|
32
|
+
return !RESERVED_GUEST.test('C:\\' + rest);
|
|
33
|
+
return MIRROR_LETTER.test(letter);
|
|
34
|
+
};
|
|
35
|
+
/** A guest path as typed, tidied: '/' -> '\', no doubled or trailing backslashes, upper-case drive letter. */
|
|
36
|
+
export const tidyGuestPath = (guest) => {
|
|
37
|
+
const p = guest
|
|
38
|
+
.trim()
|
|
39
|
+
.replace(/\//g, '\\')
|
|
40
|
+
.replace(/\\{2,}/g, '\\')
|
|
41
|
+
.replace(/\\+$/, '');
|
|
42
|
+
return /^[a-z]:/.test(p) ? p[0].toUpperCase() + p.slice(1) : p;
|
|
43
|
+
};
|
|
44
|
+
/** Why a guest path cannot be used as it is (null: it can). Short, plain English. */
|
|
45
|
+
export const guestPathProblem = (guest) => {
|
|
46
|
+
if (isValidGuestPath(guest))
|
|
47
|
+
return null;
|
|
48
|
+
const letter = guestDrive(guest);
|
|
49
|
+
if (letter === 'C' && RESERVED_GUEST.test(guest))
|
|
50
|
+
return guest + ' is a folder the sandbox keeps for itself (Windows, Program Files, Users, AgentData, ...)';
|
|
51
|
+
if (letter && !MIRROR_LETTER.test(letter) && letter !== 'C')
|
|
52
|
+
return 'the sandbox cannot show drive ' + letter + ':';
|
|
53
|
+
if (letter && /^[A-Za-z]:\\?$/.test(guest))
|
|
54
|
+
return guest + ' is a whole drive';
|
|
55
|
+
if (!letter)
|
|
56
|
+
return (guest +
|
|
57
|
+
' is not a full path (guest paths start with a drive, such as C:\\Games\\' +
|
|
58
|
+
(guest.split('\\').pop() || 'Name') +
|
|
59
|
+
')');
|
|
60
|
+
return guest + ' is not a folder path the sandbox can use';
|
|
61
|
+
};
|
|
62
|
+
/** Two guest folders overlap where they really are (F:\x is C:\Mirror\F\x): the same, or one inside the other. */
|
|
63
|
+
export const guestOverlaps = (a, b) => {
|
|
64
|
+
const x = sandboxFolder(a).replace(/\\+$/, '').toLowerCase();
|
|
65
|
+
const y = sandboxFolder(b).replace(/\\+$/, '').toLowerCase();
|
|
66
|
+
return x === y || x.startsWith(y + '\\') || y.startsWith(x + '\\');
|
|
67
|
+
};
|
|
68
|
+
/** How to fix a mapping whose guest path cannot be used: `guest` is what it asked for (none = the PC path). */
|
|
69
|
+
export const guestFix = (guest) => guest
|
|
70
|
+
? 'set "guest" to a full path of a free folder, such as C:\\Games\\<name>, or leave it out to use the same path as on this PC.'
|
|
71
|
+
: 'its path on this PC cannot be used inside the sandbox; give it a "guest" path such as C:\\Games\\<name>.';
|
|
72
|
+
/**
|
|
73
|
+
* Why a folder cannot appear at `guest` in the sandbox (null: it can): a path the sandbox cannot use, or one that
|
|
74
|
+
* overlaps a folder in `taken`. Folders are never moved somewhere else: the launch names the problem and the fix.
|
|
75
|
+
*/
|
|
76
|
+
export const guestConflict = (guest, taken) => {
|
|
77
|
+
const problem = guestPathProblem(guest);
|
|
78
|
+
if (problem)
|
|
79
|
+
return problem;
|
|
80
|
+
const other = taken.find((t) => guestOverlaps(guest, t.guest));
|
|
81
|
+
if (!other)
|
|
82
|
+
return null;
|
|
83
|
+
return (guest +
|
|
84
|
+
' is already used by ' +
|
|
85
|
+
other.what +
|
|
86
|
+
(other.guest.toLowerCase() === guest.toLowerCase() ? '' : ' (' + other.guest + ')'));
|
|
87
|
+
};
|
|
88
|
+
/**
|
|
89
|
+
* The guest path a mapping asks for when it gives none: a folder inside the project at the same place in the project's
|
|
90
|
+
* guest folder, any other folder at the same path as on this PC (D: to Z: through C:\Mirror and subst).
|
|
91
|
+
*/
|
|
92
|
+
export const deriveGuest = (host, projectHost, projectGuest) => {
|
|
93
|
+
const rel = win32.relative(win32.resolve(projectHost), win32.resolve(host));
|
|
94
|
+
const inside = rel === '' || (!rel.startsWith('..') && !win32.isAbsolute(rel));
|
|
95
|
+
return inside ? (rel ? win32.join(projectGuest, rel) : projectGuest) : tidyGuestPath(win32.resolve(host));
|
|
96
|
+
};
|
|
97
|
+
/** Where a guest path really is inside the sandbox (the .wsb SandboxFolder): C: paths as-is, F:\x -> C:\Mirror\F\x. */
|
|
98
|
+
export const sandboxFolder = (guest) => {
|
|
99
|
+
const m = DRIVE_PATH.exec(guest);
|
|
100
|
+
if (!m || m[1].toUpperCase() === 'C')
|
|
101
|
+
return guest;
|
|
102
|
+
return MIRROR_ROOT + '\\' + m[1].toUpperCase() + (m[2] ? '\\' + m[2] : '');
|
|
103
|
+
};
|
|
104
|
+
/** The subst drives the guest must create at boot for these guest paths, one per letter, sorted. */
|
|
105
|
+
export const substDrives = (guests) => {
|
|
106
|
+
const letters = [...new Set(guests.map(guestDrive).filter((l) => l !== null && l !== 'C'))].sort();
|
|
107
|
+
return letters.map((letter) => ({ letter, target: MIRROR_ROOT + '\\' + letter }));
|
|
108
|
+
};
|
|
109
|
+
/**
|
|
110
|
+
* guestWorkspace "mirror": the workspace at the same path as on this PC, so absolute paths (configs, build caches,
|
|
111
|
+
* cargo fingerprints, Claude's project folder) match. Falls back to `fallback` (C:\Workspace\<name>) when the host
|
|
112
|
+
* path cannot be used inside the sandbox (C:\Users\..., a UNC path, A:/B:, odd characters), with a note saying why.
|
|
113
|
+
*/
|
|
114
|
+
export const planMirrorWorkspace = (workspaceHost, fallback) => {
|
|
115
|
+
const host = workspaceHost.replace(/\\+$/, '');
|
|
116
|
+
if (isValidGuestPath(host)) {
|
|
117
|
+
const letter = guestDrive(host);
|
|
118
|
+
return {
|
|
119
|
+
guest: letter + host.slice(1),
|
|
120
|
+
note: letter === 'C'
|
|
121
|
+
? null
|
|
122
|
+
: 'guestWorkspace "mirror": ' +
|
|
123
|
+
host +
|
|
124
|
+
' is mapped to ' +
|
|
125
|
+
sandboxFolder(letter + host.slice(1)) +
|
|
126
|
+
' and shown as ' +
|
|
127
|
+
letter +
|
|
128
|
+
': (subst) inside the sandbox.',
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
const why = !guestDrive(host)
|
|
132
|
+
? 'it is not on a drive letter'
|
|
133
|
+
: guestDrive(host) === 'C' && RESERVED_GUEST.test(host)
|
|
134
|
+
? 'that folder is reserved inside the sandbox (Windows, Program Files, Users, ...)'
|
|
135
|
+
: 'the sandbox cannot show a folder at that path';
|
|
136
|
+
return {
|
|
137
|
+
guest: fallback,
|
|
138
|
+
note: 'guestWorkspace "mirror": ' +
|
|
139
|
+
host +
|
|
140
|
+
' cannot appear at the same path (' +
|
|
141
|
+
why +
|
|
142
|
+
'); using ' +
|
|
143
|
+
fallback +
|
|
144
|
+
' instead.',
|
|
145
|
+
};
|
|
146
|
+
};
|
|
@@ -1,5 +1,12 @@
|
|
|
1
|
-
/** Where roots
|
|
1
|
+
/** Where project roots appear inside the sandbox. */
|
|
2
2
|
export declare const PROJECTS_GUEST = "C:\\Projects";
|
|
3
|
+
/** Where projects mapped on their own appear (the launch folder with guestWorkspace "auto", boot-mapped and shared ones). */
|
|
4
|
+
export declare const WORKSPACES_GUEST = "C:\\Workspace";
|
|
5
|
+
/**
|
|
6
|
+
* guestWorkspace "auto" for a folder: C:\Workspace\<folder name>. Keeping the real folder name means Claude's
|
|
7
|
+
* per-project history and claude-mem's project name match this PC instead of every project being "Workspace".
|
|
8
|
+
*/
|
|
9
|
+
export declare const autoGuestFolder: (hostDir: string) => string;
|
|
3
10
|
/** How a project got into the sandbox. */
|
|
4
11
|
export type Mechanism = 'launch' | 'root' | 'boot' | 'wsb';
|
|
5
12
|
/** One project the running sandbox works on. */
|
|
@@ -37,17 +44,33 @@ export declare const hostDirFor: (mapped: {
|
|
|
37
44
|
}, guestDir: string) => string;
|
|
38
45
|
/** Strictly below `parent` (never `parent` itself). */
|
|
39
46
|
export declare const isBelow: (parent: string, child: string) => boolean;
|
|
40
|
-
/**
|
|
47
|
+
/**
|
|
48
|
+
* A guest folder some project can be in: below C:\Projects or C:\Workspace (projects mapped on their own, also shared
|
|
49
|
+
* after boot), or inside one of `roots` (the roots' and boot-mapped projects' guest paths).
|
|
50
|
+
*/
|
|
41
51
|
export declare const insideProjects: (guestDir: string, roots?: string[], projectsDir?: string) => boolean;
|
|
42
52
|
export interface RootMapping {
|
|
43
53
|
host: string;
|
|
44
54
|
guest: string;
|
|
45
55
|
}
|
|
56
|
+
/** The project roots that are mapped, in order: existing folders, none inside a root listed before it. */
|
|
57
|
+
export declare const usableRoots: (roots: string[], exists: (dir: string) => boolean) => string[];
|
|
46
58
|
/**
|
|
47
|
-
*
|
|
48
|
-
*
|
|
59
|
+
* Where a project mapped on its own appears, the same place it has as the launch folder: with "mirror" its PC path
|
|
60
|
+
* when the sandbox can show it there, else C:\Workspace\<name>. -2, -3, ... when that overlaps a folder in `taken`.
|
|
61
|
+
*/
|
|
62
|
+
export declare const ownGuestFolder: (hostDir: string, mirror: boolean, taken?: string[]) => string;
|
|
63
|
+
/**
|
|
64
|
+
* Guest folders for the project roots (C:\Projects\<name>, unique; with guestWorkspace "mirror" at its PC path when
|
|
65
|
+
* the sandbox can show it there) and the projects mapped at boot (ownGuestFolder, unique against `taken` and each
|
|
66
|
+
* other). A root's folder depends only on the roots, so every launch with the same roots shows them at the same place.
|
|
49
67
|
*/
|
|
50
68
|
export declare const planProjectMappings: (roots: string[], projects: string[], mirror: boolean, taken?: string[]) => {
|
|
51
69
|
roots: RootMapping[];
|
|
52
70
|
projects: RootMapping[];
|
|
53
71
|
};
|
|
72
|
+
/**
|
|
73
|
+
* Where a folder inside one of the (usable) roots appears: under the root's guest folder, whichever project started
|
|
74
|
+
* the sandbox. Null when it is in no root.
|
|
75
|
+
*/
|
|
76
|
+
export declare const rootGuestDir: (roots: string[], mirror: boolean, hostDir: string) => string | null;
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
// Several projects in one running sandbox. Windows Sandbox fixes its mapped folders at boot, so a project can only
|
|
2
|
+
// join a running sandbox when it is already visible inside:
|
|
3
|
+
// - the launch folder (mapped directly, or shown by the project root it is in);
|
|
4
|
+
// - a folder inside a project root (projects.roots: whole folders of projects, mapped at every start), including
|
|
5
|
+
// projects created after boot;
|
|
6
|
+
// - projects mapped at boot because they were in use when the sandbox was restarted to add them;
|
|
7
|
+
// - a folder shared into the running sandbox with `wsb share` (Windows 11 24H2+, untested).
|
|
8
|
+
// A project is at the same place inside the sandbox whichever project started it (git worktrees and Claude's project
|
|
9
|
+
// folders store absolute paths):
|
|
10
|
+
// - a project inside a root is always under the root's folder, C:\Projects\<root>\<name> (also as the launch folder);
|
|
11
|
+
// - any other project, mapped on its own, is always at C:\Workspace\<name> (also when it is mapped at boot or shared).
|
|
12
|
+
// With guestWorkspace "mirror" both appear at their PC paths when the sandbox can show them there.
|
|
13
|
+
// Pure functions only: used by the host (registration, commands), the guest (daemon checks) and the tests.
|
|
14
|
+
import path from 'node:path';
|
|
15
|
+
import { isValidGuestPath, planMirrorWorkspace } from './guest-paths.js';
|
|
16
|
+
/** Where project roots appear inside the sandbox. */
|
|
17
|
+
export const PROJECTS_GUEST = 'C:\\Projects';
|
|
18
|
+
/** Where projects mapped on their own appear (the launch folder with guestWorkspace "auto", boot-mapped and shared ones). */
|
|
19
|
+
export const WORKSPACES_GUEST = 'C:\\Workspace';
|
|
20
|
+
/**
|
|
21
|
+
* guestWorkspace "auto" for a folder: C:\Workspace\<folder name>. Keeping the real folder name means Claude's
|
|
22
|
+
* per-project history and claude-mem's project name match this PC instead of every project being "Workspace".
|
|
23
|
+
*/
|
|
24
|
+
export const autoGuestFolder = (hostDir) => {
|
|
25
|
+
const name = path.win32
|
|
26
|
+
.basename(hostDir.replace(/[\\/]+$/, ''))
|
|
27
|
+
.replace(/[^A-Za-z0-9._ -]/g, '_')
|
|
28
|
+
.replace(/^[. ]+|[. ]+$/g, '');
|
|
29
|
+
return WORKSPACES_GUEST + '\\' + (name || 'project');
|
|
30
|
+
};
|
|
31
|
+
const norm = (p) => path.win32
|
|
32
|
+
.resolve(p)
|
|
33
|
+
.replace(/[\\/]+$/, '')
|
|
34
|
+
.toLowerCase();
|
|
35
|
+
/** `child` is `parent` or somewhere below it (Windows paths, case-insensitive). */
|
|
36
|
+
export const isWithin = (parent, child) => {
|
|
37
|
+
const a = norm(parent);
|
|
38
|
+
const b = norm(child);
|
|
39
|
+
return a === b || b.startsWith(a.endsWith('\\') ? a : a + '\\');
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* A project id (also its folder name under C:\Projects) for a folder: its name with only letters, digits, '-' and
|
|
43
|
+
* '_' (ids become file names on both sides), at most 48 characters, made unique against `taken` with -2, -3, ...
|
|
44
|
+
*/
|
|
45
|
+
export const hubName = (hostDir, taken) => {
|
|
46
|
+
const base = path.win32
|
|
47
|
+
.basename(path.win32.resolve(hostDir))
|
|
48
|
+
.replace(/[^A-Za-z0-9_-]+/g, '-')
|
|
49
|
+
.replace(/^-+|-+$/g, '')
|
|
50
|
+
.slice(0, 48) || 'project';
|
|
51
|
+
const used = new Set([...taken].map((t) => t.toLowerCase()));
|
|
52
|
+
if (!used.has(base.toLowerCase()))
|
|
53
|
+
return base;
|
|
54
|
+
for (let i = 2;; i++)
|
|
55
|
+
if (!used.has((base + '-' + i).toLowerCase()))
|
|
56
|
+
return base + '-' + i;
|
|
57
|
+
};
|
|
58
|
+
/** The project a folder on this PC belongs to: the most specific one that contains it (a project inside another wins). */
|
|
59
|
+
export const projectForHostDir = (projects, hostDir) => projects.filter((p) => isWithin(p.host, hostDir)).sort((a, b) => b.host.length - a.host.length)[0] ?? null;
|
|
60
|
+
/** The same for a folder inside the sandbox. */
|
|
61
|
+
export const projectForGuestDir = (projects, guestDir) => projects.filter((p) => isWithin(p.guest, guestDir)).sort((a, b) => b.guest.length - a.guest.length)[0] ?? null;
|
|
62
|
+
/** Where a folder on this PC appears inside the sandbox, given the mapped folder (project or root) that contains it. */
|
|
63
|
+
export const guestDirFor = (mapped, hostDir) => {
|
|
64
|
+
const rel = path.win32.relative(path.win32.resolve(mapped.host), path.win32.resolve(hostDir));
|
|
65
|
+
return rel ? path.win32.join(mapped.guest, rel) : mapped.guest;
|
|
66
|
+
};
|
|
67
|
+
/** The other way: where a folder inside the sandbox is on this PC, given the mapped folder that contains it. */
|
|
68
|
+
export const hostDirFor = (mapped, guestDir) => {
|
|
69
|
+
const rel = path.win32.relative(path.win32.resolve(mapped.guest), path.win32.resolve(guestDir));
|
|
70
|
+
return rel ? path.win32.join(mapped.host, rel) : mapped.host;
|
|
71
|
+
};
|
|
72
|
+
/** Strictly below `parent` (never `parent` itself). */
|
|
73
|
+
export const isBelow = (parent, child) => isWithin(parent, child) && norm(parent) !== norm(child);
|
|
74
|
+
/**
|
|
75
|
+
* A guest folder some project can be in: below C:\Projects or C:\Workspace (projects mapped on their own, also shared
|
|
76
|
+
* after boot), or inside one of `roots` (the roots' and boot-mapped projects' guest paths).
|
|
77
|
+
*/
|
|
78
|
+
export const insideProjects = (guestDir, roots = [], projectsDir = PROJECTS_GUEST) => isBelow(projectsDir, guestDir) || isBelow(WORKSPACES_GUEST, guestDir) || roots.some((r) => isWithin(r, guestDir));
|
|
79
|
+
const resolveDir = (dir) => path.win32.resolve(dir).replace(/[\\/]+$/, '');
|
|
80
|
+
/** The project roots that are mapped, in order: existing folders, none inside a root listed before it. */
|
|
81
|
+
export const usableRoots = (roots, exists) => {
|
|
82
|
+
const out = [];
|
|
83
|
+
for (const root of roots.map(resolveDir))
|
|
84
|
+
if (exists(root) && !out.some((r) => isWithin(r, root)))
|
|
85
|
+
out.push(root);
|
|
86
|
+
return out;
|
|
87
|
+
};
|
|
88
|
+
/**
|
|
89
|
+
* Where a project mapped on its own appears, the same place it has as the launch folder: with "mirror" its PC path
|
|
90
|
+
* when the sandbox can show it there, else C:\Workspace\<name>. -2, -3, ... when that overlaps a folder in `taken`.
|
|
91
|
+
*/
|
|
92
|
+
export const ownGuestFolder = (hostDir, mirror, taken = []) => {
|
|
93
|
+
const host = resolveDir(hostDir);
|
|
94
|
+
const free = (guest) => !taken.some((t) => isWithin(t, guest) || isWithin(guest, t));
|
|
95
|
+
const mirrored = mirror ? planMirrorWorkspace(host, '').guest : '';
|
|
96
|
+
if (mirrored && !isWithin(PROJECTS_GUEST, mirrored) && !isWithin(WORKSPACES_GUEST, mirrored) && free(mirrored))
|
|
97
|
+
return mirrored;
|
|
98
|
+
const base = autoGuestFolder(host);
|
|
99
|
+
if (free(base))
|
|
100
|
+
return base;
|
|
101
|
+
for (let i = 2;; i++)
|
|
102
|
+
if (free(base + '-' + i))
|
|
103
|
+
return base + '-' + i;
|
|
104
|
+
};
|
|
105
|
+
/**
|
|
106
|
+
* Guest folders for the project roots (C:\Projects\<name>, unique; with guestWorkspace "mirror" at its PC path when
|
|
107
|
+
* the sandbox can show it there) and the projects mapped at boot (ownGuestFolder, unique against `taken` and each
|
|
108
|
+
* other). A root's folder depends only on the roots, so every launch with the same roots shows them at the same place.
|
|
109
|
+
*/
|
|
110
|
+
export const planProjectMappings = (roots, projects, mirror, taken = []) => {
|
|
111
|
+
const names = [];
|
|
112
|
+
const placeRoot = (host) => {
|
|
113
|
+
const resolved = resolveDir(host);
|
|
114
|
+
if (mirror && isValidGuestPath(resolved) && !isWithin(PROJECTS_GUEST, resolved))
|
|
115
|
+
return { host: resolved, guest: resolved };
|
|
116
|
+
const name = hubName(resolved, names);
|
|
117
|
+
names.push(name);
|
|
118
|
+
return { host: resolved, guest: path.win32.join(PROJECTS_GUEST, name) };
|
|
119
|
+
};
|
|
120
|
+
const planned = roots.map(placeRoot);
|
|
121
|
+
const used = [...taken, ...planned.map((r) => r.guest)];
|
|
122
|
+
const placed = projects.map((p) => {
|
|
123
|
+
const guest = ownGuestFolder(p, mirror, used);
|
|
124
|
+
used.push(guest);
|
|
125
|
+
return { host: resolveDir(p), guest };
|
|
126
|
+
});
|
|
127
|
+
return { roots: planned, projects: placed };
|
|
128
|
+
};
|
|
129
|
+
/**
|
|
130
|
+
* Where a folder inside one of the (usable) roots appears: under the root's guest folder, whichever project started
|
|
131
|
+
* the sandbox. Null when it is in no root.
|
|
132
|
+
*/
|
|
133
|
+
export const rootGuestDir = (roots, mirror, hostDir) => {
|
|
134
|
+
const root = projectForHostDir(planProjectMappings(roots, [], mirror).roots, hostDir);
|
|
135
|
+
return root ? guestDirFor(root, hostDir) : null;
|
|
136
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import net from 'node:net';
|
|
2
|
+
export interface Endpoint {
|
|
3
|
+
addresses: string[];
|
|
4
|
+
port: number;
|
|
5
|
+
token: string;
|
|
6
|
+
}
|
|
7
|
+
/** Tries every address the sandbox published and returns the first one that answers. */
|
|
8
|
+
export declare const connect: (endpoint: Endpoint, timeoutMs?: number) => Promise<net.Socket>;
|
|
9
|
+
/** Sends one control frame (e.g. RESTART) without taking over the screen. */
|
|
10
|
+
export declare const sendControl: (endpoint: Endpoint, type: number) => Promise<void>;
|
|
11
|
+
/** Who is watching a session right now: `remote` counts viewers on the PC (not the sandbox's own tabs). */
|
|
12
|
+
export interface Viewers {
|
|
13
|
+
viewers: number;
|
|
14
|
+
remote: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Asks a session's ptyhost who is attached. Only viewers heard from in the last few seconds count, so a terminal that
|
|
18
|
+
* was closed (or a PC that went to sleep) is not reported. null when the session does not answer: an older ptyhost
|
|
19
|
+
* treats the query as a silent control connection, so the caller must not assume anything.
|
|
20
|
+
*/
|
|
21
|
+
export declare const queryViewers: (endpoint: Endpoint, timeoutMs?: number) => Promise<Viewers | null>;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import net from 'node:net';
|
|
2
|
+
import { helloFrame, HelloFlag, encodeFrame, FrameReader, FrameType } from './protocol.js';
|
|
3
|
+
const connectOnce = (host, port, timeoutMs) => {
|
|
4
|
+
return new Promise((resolve, reject) => {
|
|
5
|
+
const socket = net.connect({ host, port });
|
|
6
|
+
const timer = setTimeout(() => {
|
|
7
|
+
socket.destroy();
|
|
8
|
+
reject(new Error('timed out connecting to ' + host + ':' + port));
|
|
9
|
+
}, timeoutMs);
|
|
10
|
+
socket.once('connect', () => {
|
|
11
|
+
clearTimeout(timer);
|
|
12
|
+
socket.setNoDelay(true);
|
|
13
|
+
resolve(socket);
|
|
14
|
+
});
|
|
15
|
+
socket.once('error', (e) => {
|
|
16
|
+
clearTimeout(timer);
|
|
17
|
+
reject(e);
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
/** Tries every address the sandbox published and returns the first one that answers. */
|
|
22
|
+
export const connect = async (endpoint, timeoutMs = 3000) => {
|
|
23
|
+
const errors = [];
|
|
24
|
+
for (const address of endpoint.addresses) {
|
|
25
|
+
try {
|
|
26
|
+
return await connectOnce(address, endpoint.port, timeoutMs);
|
|
27
|
+
}
|
|
28
|
+
catch (e) {
|
|
29
|
+
errors.push(address + ': ' + (e instanceof Error ? e.message : String(e)));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
throw new Error('Could not reach the sandbox session (' + errors.join('; ') + ')');
|
|
33
|
+
};
|
|
34
|
+
/** Sends one control frame (e.g. RESTART) without taking over the screen. */
|
|
35
|
+
export const sendControl = async (endpoint, type) => {
|
|
36
|
+
const socket = await connect(endpoint);
|
|
37
|
+
await new Promise((resolve) => socket.end(Buffer.concat([helloFrame(endpoint.token, 80, 24, HelloFlag.ControlOnly), encodeFrame(type)]), resolve));
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Asks a session's ptyhost who is attached. Only viewers heard from in the last few seconds count, so a terminal that
|
|
41
|
+
* was closed (or a PC that went to sleep) is not reported. null when the session does not answer: an older ptyhost
|
|
42
|
+
* treats the query as a silent control connection, so the caller must not assume anything.
|
|
43
|
+
*/
|
|
44
|
+
export const queryViewers = async (endpoint, timeoutMs = 2000) => {
|
|
45
|
+
let socket;
|
|
46
|
+
try {
|
|
47
|
+
socket = await connect(endpoint, timeoutMs);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
return new Promise((resolve) => {
|
|
53
|
+
const reader = new FrameReader();
|
|
54
|
+
const done = (value) => {
|
|
55
|
+
clearTimeout(timer);
|
|
56
|
+
socket.destroy();
|
|
57
|
+
resolve(value);
|
|
58
|
+
};
|
|
59
|
+
const timer = setTimeout(() => done(null), timeoutMs);
|
|
60
|
+
socket.on('data', (chunk) => {
|
|
61
|
+
let frames;
|
|
62
|
+
try {
|
|
63
|
+
frames = reader.push(chunk);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
done(null);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const status = frames.find((f) => f.type === FrameType.Status && f.payload.length >= 4);
|
|
70
|
+
if (status)
|
|
71
|
+
done({ viewers: status.payload.readInt16LE(0), remote: status.payload.readInt16LE(2) });
|
|
72
|
+
else if (frames.some((f) => f.type === FrameType.Error))
|
|
73
|
+
done(null);
|
|
74
|
+
});
|
|
75
|
+
socket.on('error', () => done(null));
|
|
76
|
+
socket.on('close', () => done(null));
|
|
77
|
+
socket.write(helloFrame(endpoint.token, 80, 24, HelloFlag.Query));
|
|
78
|
+
});
|
|
79
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface VtInput {
|
|
2
|
+
/** true once the console passes the terminal's input through (mouse reports included); false if it could not. */
|
|
3
|
+
ready: Promise<boolean>;
|
|
4
|
+
/** Stops a change still in progress; resolves when nothing can change the console mode any more. */
|
|
5
|
+
stop: () => Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Turns on ENABLE_VIRTUAL_TERMINAL_INPUT for this process's console. Call it after stdin.setRawMode(true) (which
|
|
9
|
+
* overwrites the mode); setRawMode(false) turns it off again. No-op off Windows or without a console.
|
|
10
|
+
*/
|
|
11
|
+
export declare const enableVtInput: () => VtInput;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
// Windows: lets the terminal's own input sequences (mouse clicks and wheel, focus) reach a Node process in raw mode.
|
|
2
|
+
// Node reads the console as key records in raw mode and drops every mouse record, so an agent that turned mouse
|
|
3
|
+
// tracking on (its terminal then sends the wheel and clicks as mouse reports) got neither. With
|
|
4
|
+
// ENABLE_VIRTUAL_TERMINAL_INPUT the console hands over the terminal's input as it is: mouse reports, focus, keys.
|
|
5
|
+
// Node has no API for the console mode, so a PowerShell child sets it on the console both share (the input mode
|
|
6
|
+
// belongs to the console, not to a handle). Only built-ins here: view.js bundles this.
|
|
7
|
+
import { spawn } from 'node:child_process';
|
|
8
|
+
import { SYSTEM } from '../system.js';
|
|
9
|
+
/**
|
|
10
|
+
* PowerShell starts in a console of its own, hidden (so it never retitles your tab or touches its modes), then switches
|
|
11
|
+
* to ours. Started without any console, powershell.exe does nothing at all.
|
|
12
|
+
*/
|
|
13
|
+
const script = (pid) => [
|
|
14
|
+
'Add-Type -TypeDefinition @"',
|
|
15
|
+
'using System; using System.Runtime.InteropServices;',
|
|
16
|
+
'public static class SbxVtInput {',
|
|
17
|
+
' [DllImport("kernel32.dll")] static extern bool FreeConsole();',
|
|
18
|
+
' [DllImport("kernel32.dll")] static extern bool AttachConsole(uint pid);',
|
|
19
|
+
' [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] static extern IntPtr CreateFileW(string name, uint access, uint share, IntPtr security, uint creation, uint flags, IntPtr template);',
|
|
20
|
+
' [DllImport("kernel32.dll")] static extern bool GetConsoleMode(IntPtr handle, out uint mode);',
|
|
21
|
+
' [DllImport("kernel32.dll")] static extern bool SetConsoleMode(IntPtr handle, uint mode);',
|
|
22
|
+
' [DllImport("kernel32.dll")] static extern bool CloseHandle(IntPtr handle);',
|
|
23
|
+
' public static int On(uint pid) {',
|
|
24
|
+
' FreeConsole();',
|
|
25
|
+
' if (!AttachConsole(pid)) return 2;',
|
|
26
|
+
' IntPtr input = CreateFileW("CONIN$", 0xC0000000, 3, IntPtr.Zero, 3, 0, IntPtr.Zero);',
|
|
27
|
+
' if (input == new IntPtr(-1)) return 3;',
|
|
28
|
+
' uint mode; bool ok = GetConsoleMode(input, out mode) && SetConsoleMode(input, mode | 0x200);',
|
|
29
|
+
' CloseHandle(input);',
|
|
30
|
+
' FreeConsole();',
|
|
31
|
+
' return ok ? 0 : 4;',
|
|
32
|
+
' }',
|
|
33
|
+
'}',
|
|
34
|
+
'"@',
|
|
35
|
+
'exit [SbxVtInput]::On(' + pid + ')',
|
|
36
|
+
].join('\n');
|
|
37
|
+
/**
|
|
38
|
+
* Turns on ENABLE_VIRTUAL_TERMINAL_INPUT for this process's console. Call it after stdin.setRawMode(true) (which
|
|
39
|
+
* overwrites the mode); setRawMode(false) turns it off again. No-op off Windows or without a console.
|
|
40
|
+
*/
|
|
41
|
+
export const enableVtInput = () => {
|
|
42
|
+
if (process.platform !== 'win32' || !process.stdin.isTTY)
|
|
43
|
+
return { ready: Promise.resolve(false), stop: () => Promise.resolve() };
|
|
44
|
+
let child = null;
|
|
45
|
+
let exited = Promise.resolve();
|
|
46
|
+
const ready = new Promise((resolve) => {
|
|
47
|
+
try {
|
|
48
|
+
child = spawn(SYSTEM.powershell(), [
|
|
49
|
+
'-NoLogo',
|
|
50
|
+
'-NoProfile',
|
|
51
|
+
'-NonInteractive',
|
|
52
|
+
'-ExecutionPolicy',
|
|
53
|
+
'Bypass',
|
|
54
|
+
'-EncodedCommand',
|
|
55
|
+
Buffer.from(script(process.pid), 'utf16le').toString('base64'),
|
|
56
|
+
], { stdio: 'ignore', windowsHide: true });
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
resolve(false);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
exited = new Promise((done) => {
|
|
63
|
+
child?.on('exit', (code) => {
|
|
64
|
+
resolve(code === 0);
|
|
65
|
+
done();
|
|
66
|
+
});
|
|
67
|
+
child?.on('error', () => {
|
|
68
|
+
resolve(false);
|
|
69
|
+
done();
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
return {
|
|
74
|
+
ready,
|
|
75
|
+
stop: () => {
|
|
76
|
+
if (child && child.exitCode === null && child.signalCode === null)
|
|
77
|
+
child.kill();
|
|
78
|
+
return exited;
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { FrameType, HelloFlag, PING_INTERVAL_MS, type Frame, DETACH_KEY, encodeFrame, helloFrame, resizeFrame, MAX_FRAME_BYTES, FrameReader, } from './protocol.js';
|
|
2
|
+
export { type Endpoint, connect, sendControl, type Viewers, queryViewers } from './client.js';
|
|
3
|
+
export { type ClientResult, MOUSE_OFF, fixWindowsKeys, runTerminalClient } from './terminal.js';
|
|
4
|
+
export { JOIN_MS, InputJoiner } from './input-joiner.js';
|
|
5
|
+
export { type VtInput, enableVtInput } from './console-input.js';
|
|
6
|
+
export { OutputFilter } from './output-filter.js';
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { FrameType, HelloFlag, PING_INTERVAL_MS, DETACH_KEY, encodeFrame, helloFrame, resizeFrame, MAX_FRAME_BYTES, FrameReader, } from './protocol.js';
|
|
2
|
+
export { connect, sendControl, queryViewers } from './client.js';
|
|
3
|
+
export { MOUSE_OFF, fixWindowsKeys, runTerminalClient } from './terminal.js';
|
|
4
|
+
export { JOIN_MS, InputJoiner } from './input-joiner.js';
|
|
5
|
+
export { enableVtInput } from './console-input.js';
|
|
6
|
+
export { OutputFilter } from './output-filter.js';
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** How long an unfinished escape sequence is held back waiting for the rest (a lone Esc key press waits this long). */
|
|
2
|
+
export declare const JOIN_MS = 30;
|
|
3
|
+
/**
|
|
4
|
+
* Keeps each escape sequence typed into your terminal (keys, mouse reports, the terminal's replies) in one INPUT frame.
|
|
5
|
+
* The console can hand one over in pieces; ConPTY reads a lone "ESC[" as Alt+[ and the rest as typed text, so a split
|
|
6
|
+
* Right arrow (ESC[C) left a stray "C" in the agent's prompt. An unfinished sequence at the end of a chunk is held
|
|
7
|
+
* until the rest arrives (or JOIN_MS passes).
|
|
8
|
+
*/
|
|
9
|
+
export declare class InputJoiner {
|
|
10
|
+
private held;
|
|
11
|
+
/** The bytes to send now; an unfinished sequence at the end is kept for the next chunk. */
|
|
12
|
+
push(chunk: Buffer): Buffer;
|
|
13
|
+
holding(): boolean;
|
|
14
|
+
flush(): Buffer;
|
|
15
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// Keeps escape sequences typed into your terminal whole, so ConPTY never sees half of one.
|
|
2
|
+
/** How long an unfinished escape sequence is held back waiting for the rest (a lone Esc key press waits this long). */
|
|
3
|
+
export const JOIN_MS = 30;
|
|
4
|
+
/** Longest sequence held back; anything longer is not a key, mouse report or terminal reply, and is sent as it is. */
|
|
5
|
+
const MAX_HELD = 64;
|
|
6
|
+
/**
|
|
7
|
+
* Keeps each escape sequence typed into your terminal (keys, mouse reports, the terminal's replies) in one INPUT frame.
|
|
8
|
+
* The console can hand one over in pieces; ConPTY reads a lone "ESC[" as Alt+[ and the rest as typed text, so a split
|
|
9
|
+
* Right arrow (ESC[C) left a stray "C" in the agent's prompt. An unfinished sequence at the end of a chunk is held
|
|
10
|
+
* until the rest arrives (or JOIN_MS passes).
|
|
11
|
+
*/
|
|
12
|
+
export class InputJoiner {
|
|
13
|
+
held = Buffer.alloc(0);
|
|
14
|
+
/** The bytes to send now; an unfinished sequence at the end is kept for the next chunk. */
|
|
15
|
+
push(chunk) {
|
|
16
|
+
const data = this.held.length ? Buffer.concat([this.held, chunk]) : chunk;
|
|
17
|
+
const cut = unfinishedSequence(data);
|
|
18
|
+
this.held = Buffer.from(data.subarray(cut));
|
|
19
|
+
return data.subarray(0, cut);
|
|
20
|
+
}
|
|
21
|
+
holding() {
|
|
22
|
+
return this.held.length > 0;
|
|
23
|
+
}
|
|
24
|
+
flush() {
|
|
25
|
+
const out = this.held;
|
|
26
|
+
this.held = Buffer.alloc(0);
|
|
27
|
+
return out;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/** Where an escape sequence that has not ended yet starts at the end of `data` (data.length if there is none). */
|
|
31
|
+
function unfinishedSequence(data) {
|
|
32
|
+
const start = data.lastIndexOf(0x1b, -1);
|
|
33
|
+
if (start === -1 || data.length - start > MAX_HELD)
|
|
34
|
+
return data.length;
|
|
35
|
+
const rest = data.subarray(start + 1);
|
|
36
|
+
if (rest.length === 0)
|
|
37
|
+
return start;
|
|
38
|
+
// ESC [ or ESC O (SS3) followed only by parameter / intermediate bytes: the final byte has not arrived yet.
|
|
39
|
+
if (rest[0] === 0x5b || rest[0] === 0x4f)
|
|
40
|
+
return rest.subarray(1).every((b) => b >= 0x20 && b <= 0x3f) && (rest[0] === 0x5b || rest.length === 1)
|
|
41
|
+
? start
|
|
42
|
+
: data.length;
|
|
43
|
+
return data.length;
|
|
44
|
+
}
|