windows-development-sandbox 1.4.1 → 1.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config.example.json +3 -1
- package/dist/api.js +27 -16
- package/dist/cli/args.d.ts +4 -6
- package/dist/cli/args.js +67 -34
- package/dist/cli/argv.d.ts +9 -0
- package/dist/cli/argv.js +22 -0
- package/dist/cli/commands/accounts.d.ts +1 -1
- package/dist/cli/commands/accounts.js +42 -27
- package/dist/cli/commands/agent-commands.d.ts +3 -3
- package/dist/cli/commands/agent-commands.js +27 -18
- package/dist/cli/commands/context.d.ts +9 -11
- package/dist/cli/commands/context.js +35 -32
- package/dist/cli/commands/data/clean.d.ts +2 -2
- package/dist/cli/commands/data/clean.js +27 -11
- package/dist/cli/commands/data/collect.d.ts +6 -3
- package/dist/cli/commands/data/collect.js +46 -15
- package/dist/cli/commands/data/index.d.ts +2 -2
- package/dist/cli/commands/data/index.js +30 -12
- package/dist/cli/commands/data/remove.d.ts +1 -1
- package/dist/cli/commands/data/remove.js +4 -4
- package/dist/cli/commands/index.d.ts +5 -4
- package/dist/cli/commands/index.js +5 -4
- package/dist/cli/commands/launch/add-root.d.ts +7 -0
- package/dist/cli/commands/launch/add-root.js +64 -0
- package/dist/cli/commands/launch/boot-progress.d.ts +7 -0
- package/dist/cli/commands/launch/boot-progress.js +48 -0
- package/dist/cli/commands/launch/boot-wants.d.ts +11 -0
- package/dist/cli/commands/launch/boot-wants.js +48 -0
- package/dist/cli/commands/launch/first-start.d.ts +10 -0
- package/dist/cli/commands/launch/first-start.js +53 -0
- package/dist/cli/commands/launch/index.d.ts +6 -0
- package/dist/cli/commands/launch/index.js +6 -0
- package/dist/cli/commands/launch/launch.d.ts +8 -0
- package/dist/cli/commands/launch/launch.js +211 -0
- package/dist/cli/commands/launch/prepare.d.ts +23 -0
- package/dist/cli/commands/launch/prepare.js +109 -0
- package/dist/cli/commands/launch/running.d.ts +45 -0
- package/dist/cli/commands/launch/running.js +218 -0
- package/dist/cli/commands/launch/summary.d.ts +8 -0
- package/dist/cli/commands/launch/summary.js +98 -0
- package/dist/cli/commands/maintenance/audit.d.ts +3 -0
- package/dist/cli/commands/maintenance/audit.js +58 -0
- package/dist/cli/commands/maintenance/clean.d.ts +2 -0
- package/dist/cli/commands/maintenance/clean.js +10 -0
- package/dist/cli/commands/maintenance/config.d.ts +2 -0
- package/dist/cli/commands/maintenance/config.js +145 -0
- package/dist/cli/commands/maintenance/doctor.d.ts +2 -0
- package/dist/cli/commands/maintenance/doctor.js +52 -0
- package/dist/cli/commands/maintenance/host-claude.d.ts +2 -0
- package/dist/cli/commands/maintenance/host-claude.js +4 -0
- package/dist/cli/commands/maintenance/index.d.ts +8 -0
- package/dist/cli/commands/maintenance/index.js +9 -0
- package/dist/cli/commands/maintenance/logs.d.ts +2 -0
- package/dist/cli/commands/maintenance/logs.js +44 -0
- package/dist/cli/commands/maintenance/sync.d.ts +2 -0
- package/dist/cli/commands/maintenance/sync.js +12 -0
- package/dist/cli/commands/maintenance/watch.d.ts +3 -0
- package/dist/cli/commands/maintenance/watch.js +6 -0
- package/dist/cli/commands/projects/describe-sessions.d.ts +3 -0
- package/dist/cli/commands/projects/describe-sessions.js +15 -0
- package/dist/cli/commands/projects/here.d.ts +38 -0
- package/dist/cli/commands/projects/here.js +145 -0
- package/dist/cli/commands/projects/index.d.ts +4 -0
- package/dist/cli/commands/projects/index.js +4 -0
- package/dist/cli/commands/projects/projects.d.ts +14 -0
- package/dist/cli/commands/projects/projects.js +213 -0
- package/dist/cli/commands/projects/restart.d.ts +15 -0
- package/dist/cli/commands/projects/restart.js +149 -0
- package/dist/cli/commands/registry.d.ts +3 -0
- package/dist/cli/commands/registry.js +34 -0
- package/dist/cli/commands/repair/checks.js +105 -29
- package/dist/cli/commands/repair/finders.d.ts +13 -10
- package/dist/cli/commands/repair/finders.js +63 -43
- package/dist/cli/commands/repair/index.d.ts +4 -4
- package/dist/cli/commands/repair/index.js +47 -21
- package/dist/cli/commands/repair/types.d.ts +2 -2
- package/dist/cli/commands/repair/types.js +7 -2
- package/dist/cli/commands/sessions/attach.d.ts +2 -0
- package/dist/cli/commands/sessions/attach.js +45 -0
- package/dist/cli/commands/sessions/control.d.ts +4 -0
- package/dist/cli/commands/sessions/control.js +62 -0
- package/dist/cli/commands/sessions/exec.d.ts +6 -0
- package/dist/cli/commands/sessions/exec.js +72 -0
- package/dist/cli/commands/sessions/index.d.ts +6 -0
- package/dist/cli/commands/sessions/index.js +9 -0
- package/dist/cli/commands/sessions/list.d.ts +15 -0
- package/dist/cli/commands/sessions/list.js +65 -0
- package/dist/cli/commands/sessions/status.d.ts +2 -0
- package/dist/cli/commands/sessions/status.js +153 -0
- package/dist/cli/commands/sessions/window.d.ts +3 -0
- package/dist/cli/commands/sessions/window.js +18 -0
- package/dist/cli/commands/setup/checks.d.ts +4 -4
- package/dist/cli/commands/setup/checks.js +36 -19
- package/dist/cli/commands/setup/facts.d.ts +6 -6
- package/dist/cli/commands/setup/facts.js +23 -11
- package/dist/cli/commands/setup/index.d.ts +1 -1
- package/dist/cli/commands/setup/index.js +25 -12
- package/dist/cli/commands/user-config.d.ts +5 -5
- package/dist/cli/commands/user-config.js +14 -12
- package/dist/cli/history.d.ts +5 -4
- package/dist/cli/history.js +23 -11
- package/dist/cli/index.d.ts +4 -14
- package/dist/cli/index.js +27 -77
- package/dist/cli/manifest.d.ts +464 -10
- package/dist/cli/manifest.js +327 -53
- package/dist/cli/menu/apps.d.ts +7 -5
- package/dist/cli/menu/apps.js +64 -16
- package/dist/cli/menu/command-fields.d.ts +15 -0
- package/dist/cli/menu/command-fields.js +23 -0
- package/dist/cli/menu/command-form.d.ts +3 -5
- package/dist/cli/menu/command-form.js +116 -48
- package/dist/cli/menu/home.d.ts +22 -0
- package/dist/cli/menu/home.js +72 -0
- package/dist/cli/menu/index.d.ts +2 -24
- package/dist/cli/menu/index.js +4 -178
- package/dist/cli/menu/menu.d.ts +23 -0
- package/dist/cli/menu/menu.js +185 -0
- package/dist/cli/menu/settings/categories.d.ts +2 -2
- package/dist/cli/menu/settings/categories.js +123 -20
- package/dist/cli/menu/settings/collections/collection-editor.d.ts +23 -0
- package/dist/cli/menu/settings/collections/collection-editor.js +89 -0
- package/dist/cli/menu/settings/collections/map-editor.d.ts +10 -0
- package/dist/cli/menu/settings/collections/map-editor.js +34 -0
- package/dist/cli/menu/settings/collections/object-list-editor.d.ts +10 -0
- package/dist/cli/menu/settings/collections/object-list-editor.js +23 -0
- package/dist/cli/menu/settings/collections/object-map-editor.d.ts +10 -0
- package/dist/cli/menu/settings/collections/object-map-editor.js +35 -0
- package/dist/cli/menu/settings/collections/string-list-editor.d.ts +12 -0
- package/dist/cli/menu/settings/collections/string-list-editor.js +39 -0
- package/dist/cli/menu/settings/config-file.d.ts +2 -2
- package/dist/cli/menu/settings/config-file.js +42 -19
- package/dist/cli/menu/settings/editor-actions.d.ts +2 -0
- package/dist/cli/menu/settings/editor-actions.js +2 -0
- package/dist/cli/menu/settings/format.d.ts +5 -0
- package/dist/cli/menu/settings/format.js +39 -0
- package/dist/cli/menu/settings/index.d.ts +1 -29
- package/dist/cli/menu/settings/index.js +1 -133
- package/dist/cli/menu/settings/object-editor.d.ts +12 -0
- package/dist/cli/menu/settings/object-editor.js +86 -0
- package/dist/cli/menu/settings/schema-node.d.ts +3 -1
- package/dist/cli/menu/settings/schema-node.js +71 -24
- package/dist/cli/menu/settings/settings-editor.d.ts +30 -0
- package/dist/cli/menu/settings/settings-editor.js +176 -0
- package/dist/cli/menu/settings/{editors.d.ts → value-editor.d.ts} +2 -13
- package/dist/cli/menu/settings/value-editor.js +137 -0
- package/dist/cli/menu/several.d.ts +4 -4
- package/dist/cli/menu/several.js +61 -20
- package/dist/cli/{colors.d.ts → output/colors.d.ts} +8 -8
- package/dist/cli/{colors.js → output/colors.js} +32 -14
- package/dist/cli/output/index.d.ts +3 -0
- package/dist/cli/output/index.js +3 -0
- package/dist/cli/output/print.d.ts +5 -0
- package/dist/cli/output/print.js +14 -0
- package/dist/cli/{progress.d.ts → output/progress.d.ts} +5 -5
- package/dist/cli/{progress.js → output/progress.js} +42 -19
- package/dist/cli/report.d.ts +2 -0
- package/dist/cli/report.js +20 -0
- package/dist/cli/tui/app.d.ts +6 -16
- package/dist/cli/tui/app.js +28 -8
- package/dist/cli/tui/dialogs/confirm-screen.d.ts +20 -0
- package/dist/cli/tui/dialogs/confirm-screen.js +50 -0
- package/dist/cli/tui/dialogs/message-screen.d.ts +17 -0
- package/dist/cli/tui/dialogs/message-screen.js +55 -0
- package/dist/cli/tui/dialogs/paragraphs.d.ts +2 -0
- package/dist/cli/tui/dialogs/paragraphs.js +5 -0
- package/dist/cli/tui/dialogs/text-screen.d.ts +26 -0
- package/dist/cli/tui/dialogs/text-screen.js +107 -0
- package/dist/cli/tui/frame.js +3 -1
- package/dist/cli/tui/index.d.ts +7 -3
- package/dist/cli/tui/index.js +4 -2
- package/dist/cli/tui/list/list-screen.d.ts +29 -0
- package/dist/cli/tui/{list-screen.js → list/list-screen.js} +86 -23
- package/dist/cli/tui/{list-screen.d.ts → list/list-types.d.ts} +0 -28
- package/dist/cli/tui/screen.d.ts +14 -0
- package/dist/cli/tui/terminal.js +34 -10
- package/dist/cli/tui/text.d.ts +2 -1
- package/dist/cli/tui/text.js +37 -7
- package/dist/cli/tui/theme.js +27 -9
- package/dist/cli/validate.d.ts +8 -8
- package/dist/cli/validate.js +32 -21
- package/dist/core/config/defaults.d.ts +2 -0
- package/dist/core/config/defaults.js +203 -0
- package/dist/core/config/index.d.ts +2 -0
- package/dist/core/config/index.js +3 -0
- package/dist/core/{config.d.ts → config/loader.d.ts} +1 -2
- package/dist/core/config/loader.js +47 -0
- package/dist/core/{detect-databases.js → detect/databases.js} +111 -23
- package/dist/core/detect/index.d.ts +4 -0
- package/dist/core/detect/index.js +4 -0
- package/dist/core/{detect-pwsh.d.ts → detect/pwsh.d.ts} +1 -1
- package/dist/core/{detect-pwsh.js → detect/pwsh.js} +25 -11
- package/dist/core/{detect-toolchains.d.ts → detect/toolchains.d.ts} +1 -1
- package/dist/core/{detect-toolchains.js → detect/toolchains.js} +42 -5
- package/dist/{guest/toolchains → core/detect}/versions.js +28 -12
- package/dist/core/disk.d.ts +2 -0
- package/dist/core/disk.js +46 -3
- package/dist/core/local-config/boot-wants.d.ts +45 -0
- package/dist/core/local-config/boot-wants.js +120 -0
- package/dist/core/local-config/file.d.ts +3 -0
- package/dist/core/local-config/file.js +16 -0
- package/dist/core/local-config/index.d.ts +5 -0
- package/dist/core/local-config/index.js +7 -0
- package/dist/core/{local-config.d.ts → local-config/overrides.d.ts} +3 -18
- package/dist/core/{local-config.js → local-config/overrides.js} +45 -52
- package/dist/core/local-config/policy.d.ts +19 -0
- package/dist/core/local-config/policy.js +45 -0
- package/dist/core/local-config/trust.d.ts +13 -0
- package/dist/core/local-config/trust.js +43 -0
- package/dist/core/package-info.d.ts +4 -0
- package/dist/core/package-info.js +13 -0
- package/dist/core/run/guest-workspace.d.ts +23 -0
- package/dist/core/run/guest-workspace.js +47 -0
- package/dist/core/run/index.d.ts +3 -0
- package/dist/core/run/index.js +3 -0
- package/dist/core/run/resolve-run.d.ts +3 -0
- package/dist/core/run/resolve-run.js +202 -0
- package/dist/core/run/versions.d.ts +13 -0
- package/dist/core/run/versions.js +65 -0
- package/dist/core/safe-paths.js +17 -5
- package/dist/core/schema/apps.d.ts +4 -4
- package/dist/core/schema/apps.js +55 -21
- package/dist/core/schema/common.d.ts +13 -10
- package/dist/core/schema/common.js +16 -10
- package/dist/core/schema/config.d.ts +15 -10
- package/dist/core/schema/config.js +78 -53
- package/dist/core/schema/databases.d.ts +4 -3
- package/dist/core/schema/databases.js +16 -12
- package/dist/core/schema/harness.d.ts +1 -1
- package/dist/core/schema/harness.js +17 -7
- package/dist/core/schema/index.d.ts +6 -0
- package/dist/core/schema/index.js +8 -0
- package/dist/core/schema/json-schema.js +10 -5
- package/dist/core/schema/profile.d.ts +4 -4
- package/dist/core/schema/profile.js +37 -17
- package/dist/core/schema/projects.d.ts +1 -1
- package/dist/core/schema/projects.js +16 -6
- package/dist/core/schema/sandbox.d.ts +11 -11
- package/dist/core/schema/sandbox.js +101 -37
- package/dist/core/schema/toolchains.d.ts +6 -1
- package/dist/core/schema/toolchains.js +84 -34
- package/dist/core/types.d.ts +19 -9
- package/dist/core/util/errors.d.ts +8 -0
- package/dist/core/util/errors.js +14 -0
- package/dist/core/util/fs.d.ts +8 -0
- package/dist/core/util/fs.js +40 -0
- package/dist/core/util/index.d.ts +7 -0
- package/dist/core/util/index.js +7 -0
- package/dist/core/util/jsonc.d.ts +6 -0
- package/dist/core/util/jsonc.js +25 -0
- package/dist/core/util/links.d.ts +10 -0
- package/dist/core/util/links.js +39 -0
- package/dist/core/util/paths.d.ts +7 -0
- package/dist/core/util/paths.js +33 -0
- package/dist/core/util/process.d.ts +15 -0
- package/dist/core/util/process.js +54 -0
- package/dist/core/util/text.d.ts +8 -0
- package/dist/core/util/text.js +8 -0
- package/dist/guest/{setup/agents.js → agents/agent-installer.js} +24 -4
- package/dist/guest/apps/after-install.d.ts +3 -0
- package/dist/guest/apps/after-install.js +47 -0
- package/dist/guest/apps/app-installer.d.ts +22 -0
- package/dist/guest/apps/app-installer.js +116 -0
- package/dist/guest/apps/find-exe.d.ts +5 -0
- package/dist/guest/apps/find-exe.js +41 -0
- package/dist/guest/apps/index.d.ts +3 -10
- package/dist/guest/apps/index.js +6 -206
- package/dist/guest/apps/resolvers.js +37 -9
- package/dist/guest/apps/shortcuts.d.ts +6 -0
- package/dist/guest/apps/shortcuts.js +28 -0
- package/dist/guest/apps/sources.d.ts +4 -0
- package/dist/guest/apps/sources.js +17 -0
- package/dist/guest/apps/unpack.d.ts +3 -0
- package/dist/guest/apps/unpack.js +47 -0
- package/dist/guest/{audit-parse.js → audit/parse.js} +39 -3
- package/dist/guest/{audit.d.ts → audit/process-audit.d.ts} +3 -1
- package/dist/guest/{audit.js → audit/process-audit.js} +33 -8
- package/dist/guest/boot/boot-env.d.ts +4 -0
- package/dist/guest/{boot-env.js → boot/boot-env.js} +7 -5
- package/dist/guest/boot/boot.d.ts +1 -0
- package/dist/guest/{main.js → boot/boot.js} +96 -50
- package/dist/guest/{guide.js → boot/guide.js} +32 -7
- package/dist/guest/{project-env.d.ts → boot/project-env.d.ts} +3 -3
- package/dist/guest/{project-env.js → boot/project-env.js} +12 -4
- package/dist/guest/boot/project-status.d.ts +5 -0
- package/dist/guest/boot/project-status.js +28 -0
- package/dist/guest/daemon/daemon.d.ts +1 -0
- package/dist/guest/daemon/daemon.js +51 -0
- package/dist/guest/daemon/exec.js +18 -6
- package/dist/guest/daemon/{shutdown.js → idle-shutdown.js} +5 -4
- package/dist/guest/daemon/{project.d.ts → project-provisioner.d.ts} +3 -3
- package/dist/guest/daemon/{project.js → project-provisioner.js} +60 -22
- package/dist/guest/daemon/relays.js +5 -3
- package/dist/guest/daemon/{session.js → sessions.js} +84 -24
- package/dist/guest/daemon/state.d.ts +4 -1
- package/dist/guest/daemon/state.js +34 -20
- package/dist/guest/databases/database-server.d.ts +13 -0
- package/dist/guest/databases/database-server.js +35 -0
- package/dist/guest/databases/dynamodb.d.ts +12 -0
- package/dist/guest/databases/dynamodb.js +81 -0
- package/dist/guest/databases/index.d.ts +2 -0
- package/dist/guest/databases/index.js +2 -0
- package/dist/guest/databases/mongodb.d.ts +7 -0
- package/dist/guest/databases/mongodb.js +46 -0
- package/dist/guest/databases/mysql.d.ts +7 -0
- package/dist/guest/databases/mysql.js +59 -0
- package/dist/guest/databases/names.d.ts +5 -0
- package/dist/guest/databases/names.js +8 -0
- package/dist/guest/databases/postgres.d.ts +9 -0
- package/dist/guest/databases/postgres.js +85 -0
- package/dist/guest/databases/redis.d.ts +7 -0
- package/dist/guest/databases/redis.js +25 -0
- package/dist/guest/databases/registry.d.ts +5 -0
- package/dist/guest/databases/registry.js +51 -0
- package/dist/guest/databases/sbx-db.d.ts +1 -0
- package/dist/guest/{db.js → databases/sbx-db.js} +13 -13
- package/dist/guest/{toolchains/databases → databases}/server.d.ts +5 -5
- package/dist/guest/{toolchains/databases → databases}/server.js +18 -13
- package/dist/guest/entries/daemon.js +16 -0
- package/dist/guest/entries/db.js +10 -0
- package/dist/guest/entries/gitguard.js +20 -0
- package/dist/guest/entries/main.d.ts +1 -0
- package/dist/guest/entries/main.js +24 -0
- package/dist/guest/entries/netproxy.d.ts +1 -0
- package/dist/guest/entries/netproxy.js +7 -0
- package/dist/guest/entries/view.d.ts +1 -0
- package/dist/guest/entries/view.js +11 -0
- package/dist/guest/{gitguard.js → git/decision.js} +49 -26
- package/dist/guest/network/addresses.d.ts +2 -0
- package/dist/guest/network/addresses.js +6 -0
- package/dist/guest/{setup/network.d.ts → network/allow-only.d.ts} +0 -10
- package/dist/guest/network/allow-only.js +84 -0
- package/dist/guest/network/firewall.d.ts +9 -0
- package/dist/guest/{setup/network.js → network/firewall.js} +58 -63
- package/dist/guest/network/proxy-server.d.ts +2 -0
- package/dist/guest/{netproxy.js → network/proxy-server.js} +37 -18
- package/dist/guest/{helpers.d.ts → runtime/csc.d.ts} +1 -1
- package/dist/guest/{helpers.js → runtime/csc.js} +7 -2
- package/dist/guest/runtime/fs.d.ts +2 -0
- package/dist/guest/runtime/fs.js +6 -0
- package/dist/guest/runtime/log.d.ts +3 -0
- package/dist/guest/runtime/log.js +22 -0
- package/dist/guest/runtime/paths.d.ts +13 -0
- package/dist/guest/runtime/paths.js +14 -0
- package/dist/guest/{ports.js → runtime/ports.js} +8 -2
- package/dist/guest/runtime/process.d.ts +15 -0
- package/dist/guest/runtime/process.js +59 -0
- package/dist/guest/{project-context.js → runtime/project-context.js} +1 -1
- package/dist/guest/runtime/session.d.ts +5 -0
- package/dist/guest/runtime/session.js +10 -0
- package/dist/guest/runtime/status.d.ts +7 -0
- package/dist/guest/runtime/status.js +57 -0
- package/dist/guest/{cmdline.js → sessions/cmdline.js} +10 -4
- package/dist/guest/{ptyhost.js → sessions/pty-host.js} +12 -5
- package/dist/guest/{view.js → sessions/viewer.js} +8 -11
- package/dist/guest/setup/claude-mem.d.ts +10 -0
- package/dist/guest/setup/{claude.js → claude-mem.js} +18 -78
- package/dist/guest/setup/{claude.d.ts → claude-profile.d.ts} +0 -10
- package/dist/guest/setup/claude-profile.js +89 -0
- package/dist/guest/setup/desktop.d.ts +2 -0
- package/dist/guest/setup/desktop.js +32 -0
- package/dist/guest/setup/environment.js +28 -5
- package/dist/guest/setup/{user.d.ts → git-identity.d.ts} +0 -2
- package/dist/guest/setup/git-identity.js +34 -0
- package/dist/guest/{gitrules.d.ts → setup/git-rules.d.ts} +1 -1
- package/dist/guest/setup/git-rules.js +50 -0
- package/dist/guest/setup/hooks.js +22 -5
- package/dist/guest/setup/{policy.js → managed-policy.js} +2 -2
- package/dist/guest/toolchains/catalogue.d.ts +4 -4
- package/dist/guest/toolchains/catalogue.js +30 -7
- package/dist/guest/toolchains/detect.d.ts +12 -0
- package/dist/guest/toolchains/detect.js +54 -0
- package/dist/guest/toolchains/index.d.ts +3 -17
- package/dist/guest/toolchains/index.js +1 -106
- package/dist/guest/toolchains/install.d.ts +20 -0
- package/dist/guest/toolchains/install.js +29 -0
- package/dist/guest/toolchains/languages/go.d.ts +3 -0
- package/dist/guest/toolchains/{go.js → languages/go.js} +27 -9
- package/dist/guest/toolchains/languages/java.d.ts +8 -0
- package/dist/guest/toolchains/{java.js → languages/java.js} +57 -18
- package/dist/guest/toolchains/languages/node.d.ts +3 -0
- package/dist/guest/toolchains/{node.js → languages/node.js} +51 -18
- package/dist/guest/toolchains/languages/php.d.ts +3 -0
- package/dist/guest/toolchains/{scripting → languages}/php.js +36 -11
- package/dist/guest/toolchains/languages/python-tools.d.ts +3 -0
- package/dist/guest/toolchains/languages/python-tools.js +12 -0
- package/dist/guest/toolchains/languages/python.d.ts +3 -0
- package/dist/guest/toolchains/{python.js → languages/python.js} +29 -16
- package/dist/guest/toolchains/languages/ruby.d.ts +3 -0
- package/dist/guest/toolchains/{scripting → languages}/ruby.js +28 -10
- package/dist/guest/toolchains/leftovers.d.ts +1 -1
- package/dist/guest/toolchains/leftovers.js +13 -11
- package/dist/guest/toolchains/managers.d.ts +6 -6
- package/dist/guest/toolchains/managers.js +38 -17
- package/dist/guest/toolchains/native/binstall.d.ts +3 -2
- package/dist/guest/toolchains/native/binstall.js +20 -8
- package/dist/guest/toolchains/native/cpp.d.ts +2 -2
- package/dist/guest/toolchains/native/cpp.js +23 -8
- package/dist/guest/toolchains/native/dotnet.d.ts +5 -3
- package/dist/guest/toolchains/native/dotnet.js +72 -24
- package/dist/guest/toolchains/native/mesa.d.ts +2 -2
- package/dist/guest/toolchains/native/mesa.js +27 -10
- package/dist/guest/toolchains/native/msvc/environment.d.ts +4 -4
- package/dist/guest/toolchains/native/msvc/environment.js +30 -16
- package/dist/guest/toolchains/native/msvc/index.d.ts +3 -3
- package/dist/guest/toolchains/native/msvc/index.js +10 -8
- package/dist/guest/toolchains/native/msvc/packages.d.ts +1 -1
- package/dist/guest/toolchains/native/msvc/packages.js +69 -23
- package/dist/guest/toolchains/native/msvc/tree.d.ts +6 -6
- package/dist/guest/toolchains/native/msvc/tree.js +15 -9
- package/dist/guest/toolchains/native/rust-extras.d.ts +23 -0
- package/dist/guest/toolchains/native/rust-extras.js +100 -0
- package/dist/guest/toolchains/native/rust.d.ts +2 -2
- package/dist/guest/toolchains/native/rust.js +41 -10
- package/dist/guest/toolchains/{scripting → native}/vcruntime.d.ts +2 -2
- package/dist/guest/toolchains/{scripting → native}/vcruntime.js +17 -7
- package/dist/guest/toolchains/package-ledger.d.ts +17 -0
- package/dist/guest/toolchains/package-ledger.js +54 -0
- package/dist/guest/toolchains/plan.d.ts +3 -24
- package/dist/guest/toolchains/plan.js +99 -111
- package/dist/guest/toolchains/runtimes.d.ts +6 -6
- package/dist/guest/toolchains/runtimes.js +31 -13
- package/dist/guest/toolchains/scheduler.d.ts +22 -0
- package/dist/guest/toolchains/scheduler.js +123 -0
- package/dist/guest/toolchains/setup.d.ts +10 -0
- package/dist/guest/toolchains/setup.js +22 -0
- package/dist/guest/toolchains/state-file.d.ts +3 -0
- package/dist/guest/toolchains/state-file.js +10 -0
- package/dist/guest/toolchains/step.d.ts +24 -0
- package/dist/guest/toolchains/step.js +1 -0
- package/dist/guest/toolchains/tool-env.d.ts +12 -0
- package/dist/guest/toolchains/tool-env.js +16 -0
- package/dist/guest/toolchains/tools/cli.d.ts +10 -0
- package/dist/guest/toolchains/{cli.js → tools/cli.js} +35 -15
- package/dist/guest/toolchains/tools/git.d.ts +3 -0
- package/dist/guest/toolchains/{git.js → tools/git.js} +38 -15
- package/dist/guest/toolchains/tools/pwsh.d.ts +4 -0
- package/dist/guest/toolchains/{pwsh.js → tools/pwsh.js} +14 -7
- package/dist/guest/toolchains/{vscode-profile.d.ts → tools/vscode-profile.d.ts} +6 -6
- package/dist/guest/toolchains/{vscode-profile.js → tools/vscode-profile.js} +28 -12
- package/dist/guest/toolchains/{vscode.d.ts → tools/vscode.d.ts} +6 -6
- package/dist/guest/toolchains/{vscode.js → tools/vscode.js} +67 -21
- package/dist/guest/toolchains/version-cache.d.ts +16 -0
- package/dist/guest/toolchains/version-cache.js +67 -0
- package/dist/host/agent-commands/commands.d.ts +13 -0
- package/dist/host/agent-commands/commands.js +33 -0
- package/dist/host/agent-commands/forwarders.d.ts +7 -0
- package/dist/host/agent-commands/forwarders.js +31 -0
- package/dist/host/agent-commands/index.d.ts +4 -0
- package/dist/host/agent-commands/index.js +4 -0
- package/dist/host/agent-commands/reconcile.d.ts +12 -0
- package/dist/host/agent-commands/reconcile.js +69 -0
- package/dist/host/agent-commands/user-path.d.ts +2 -0
- package/dist/host/agent-commands/user-path.js +33 -0
- package/dist/host/audit/collect.d.ts +2 -2
- package/dist/host/audit/collect.js +59 -22
- package/dist/host/audit/log.d.ts +2 -2
- package/dist/host/audit/log.js +24 -8
- package/dist/host/{attach.d.ts → channel/attach.d.ts} +2 -2
- package/dist/host/{attach.js → channel/attach.js} +33 -15
- package/dist/host/channel/channel.d.ts +51 -0
- package/dist/host/channel/channel.js +196 -0
- package/dist/host/channel/index.d.ts +2 -0
- package/dist/host/channel/index.js +2 -0
- package/dist/host/guard/agent-files.d.ts +7 -0
- package/dist/host/guard/agent-files.js +103 -0
- package/dist/host/guard/commands.d.ts +10 -0
- package/dist/host/guard/commands.js +123 -0
- package/dist/host/guard/file-hash.d.ts +4 -0
- package/dist/host/guard/file-hash.js +37 -0
- package/dist/host/guard/git-config.d.ts +5 -0
- package/dist/host/guard/git-config.js +62 -0
- package/dist/host/guard/git-dirs.d.ts +12 -0
- package/dist/host/guard/git-dirs.js +53 -0
- package/dist/host/guard/index.d.ts +5 -0
- package/dist/host/guard/index.js +4 -0
- package/dist/host/guard/mark-of-the-web.d.ts +8 -0
- package/dist/host/guard/mark-of-the-web.js +74 -0
- package/dist/host/guard/nested-repos.d.ts +14 -0
- package/dist/host/guard/nested-repos.js +88 -0
- package/dist/host/guard/quarantine.d.ts +3 -0
- package/dist/host/guard/quarantine.js +24 -0
- package/dist/host/guard/repo-guard.d.ts +10 -0
- package/dist/host/guard/repo-guard.js +36 -0
- package/dist/host/guard/store.d.ts +40 -0
- package/dist/host/guard/store.js +145 -0
- package/dist/host/guard/types.d.ts +27 -0
- package/dist/host/guard/types.js +3 -0
- package/dist/host/guard/watch-state.d.ts +9 -0
- package/dist/host/guard/watch-state.js +26 -0
- package/dist/host/launch/boot-projects.d.ts +17 -0
- package/dist/host/launch/{projects.js → boot-projects.js} +22 -13
- package/dist/host/{database-plan.d.ts → launch/database-plan.d.ts} +5 -5
- package/dist/host/{database-plan.js → launch/database-plan.js} +24 -13
- package/dist/host/launch/generate.d.ts +4 -0
- package/dist/host/launch/generate.js +77 -0
- package/dist/host/launch/index.d.ts +10 -0
- package/dist/host/launch/index.js +10 -0
- package/dist/host/launch/mappings.d.ts +5 -5
- package/dist/host/launch/mappings.js +37 -24
- package/dist/host/launch/pc-scan.d.ts +5 -0
- package/dist/host/{pc-scan.js → launch/pc-scan.js} +20 -13
- package/dist/host/launch/project-scan.d.ts +7 -0
- package/dist/host/{project-scan.js → launch/project-scan.js} +29 -21
- package/dist/host/launch/session-file.d.ts +23 -0
- package/dist/host/launch/session-file.js +73 -0
- package/dist/host/launch/stage.d.ts +5 -5
- package/dist/host/launch/stage.js +14 -13
- package/dist/host/launch/toolchains.d.ts +4 -0
- package/dist/host/launch/toolchains.js +11 -0
- package/dist/host/launch/{wsb.d.ts → wsb-file.d.ts} +4 -2
- package/dist/host/launch/wsb-file.js +56 -0
- package/dist/host/life/crash-report.d.ts +8 -0
- package/dist/host/life/crash-report.js +87 -0
- package/dist/host/life/index.d.ts +6 -0
- package/dist/host/life/index.js +6 -0
- package/dist/host/life/keep-awake.d.ts +10 -0
- package/dist/host/life/keep-awake.js +29 -0
- package/dist/host/life/life-record.d.ts +48 -0
- package/dist/host/life/life-record.js +76 -0
- package/dist/host/life/stop-events.d.ts +27 -0
- package/dist/host/life/stop-events.js +96 -0
- package/dist/host/life/stop-warning.d.ts +4 -0
- package/dist/host/life/stop-warning.js +25 -0
- package/dist/host/life/windows-update.d.ts +3 -0
- package/dist/host/life/windows-update.js +11 -0
- package/dist/host/native.d.ts +4 -0
- package/dist/host/native.js +11 -0
- package/dist/host/network/index.d.ts +1 -0
- package/dist/host/network/index.js +1 -0
- package/dist/host/{port-forward.d.ts → network/port-forward.d.ts} +1 -1
- package/dist/host/{port-forward.js → network/port-forward.js} +16 -10
- package/dist/host/profile/accounts.d.ts +37 -0
- package/dist/host/profile/accounts.js +146 -0
- package/dist/host/profile/claude-login.d.ts +22 -0
- package/dist/host/profile/claude-login.js +57 -0
- package/dist/host/{claude-profile.d.ts → profile/claude-profile.d.ts} +9 -9
- package/dist/host/{claude-profile.js → profile/claude-profile.js} +32 -22
- package/dist/host/profile/index.d.ts +7 -0
- package/dist/host/profile/index.js +7 -0
- package/dist/host/profile/personalize.d.ts +2 -0
- package/dist/host/profile/personalize.js +127 -0
- package/dist/host/profile/reg-file.d.ts +8 -0
- package/dist/host/profile/reg-file.js +45 -0
- package/dist/host/profile/secret-files.d.ts +2 -0
- package/dist/host/profile/secret-files.js +25 -0
- package/dist/host/profile/secret-patterns.d.ts +6 -0
- package/dist/host/profile/secret-patterns.js +128 -0
- package/dist/host/profile/secrets.d.ts +12 -0
- package/dist/host/profile/secrets.js +100 -0
- package/dist/host/projects/index.d.ts +4 -0
- package/dist/host/projects/index.js +4 -0
- package/dist/host/{join.d.ts → projects/join.d.ts} +12 -9
- package/dist/host/{join.js → projects/join.js} +62 -33
- package/dist/host/projects/known.d.ts +28 -0
- package/dist/host/projects/known.js +55 -0
- package/dist/host/projects/mapper.d.ts +29 -0
- package/dist/host/projects/mapper.js +88 -0
- package/dist/host/projects/registry.d.ts +83 -0
- package/dist/host/projects/registry.js +136 -0
- package/dist/host/sandbox/doctor.d.ts +2 -0
- package/dist/host/sandbox/doctor.js +42 -0
- package/dist/host/sandbox/host-claude.d.ts +1 -0
- package/dist/host/sandbox/host-claude.js +26 -0
- package/dist/host/sandbox/index.d.ts +6 -0
- package/dist/host/sandbox/index.js +6 -0
- package/dist/host/{platform.d.ts → sandbox/platform.d.ts} +0 -5
- package/dist/host/sandbox/platform.js +60 -0
- package/dist/host/sandbox/probe.d.ts +3 -0
- package/dist/host/sandbox/probe.js +47 -0
- package/dist/host/{window.js → sandbox/window.js} +7 -5
- package/dist/host/{wsb.js → sandbox/wsb-cli.js} +31 -8
- package/dist/host/{cleanup.js → storage/cleanup.js} +27 -12
- package/dist/host/storage/index.d.ts +2 -0
- package/dist/host/storage/index.js +2 -0
- package/dist/host/storage/state-files.d.ts +4 -0
- package/dist/host/storage/state-files.js +10 -0
- package/dist/host/test-guard.js +1 -1
- package/dist/host/tools/conpty.d.ts +8 -0
- package/dist/host/tools/conpty.js +58 -0
- package/dist/host/tools/index.d.ts +2 -0
- package/dist/host/tools/index.js +2 -0
- package/dist/host/{terminal.d.ts → tools/windows-terminal.d.ts} +2 -10
- package/dist/host/{terminal.js → tools/windows-terminal.js} +33 -57
- package/dist/host/workspace-view/active-views.d.ts +3 -0
- package/dist/host/workspace-view/active-views.js +22 -0
- package/dist/host/workspace-view/index.d.ts +2 -18
- package/dist/host/workspace-view/index.js +2 -49
- package/dist/host/workspace-view/plan.d.ts +16 -0
- package/dist/host/workspace-view/plan.js +50 -0
- package/dist/host/workspace-view/rules.js +10 -3
- package/dist/host/workspace-view/view-state.d.ts +10 -0
- package/dist/host/workspace-view/view-state.js +31 -0
- package/dist/host/workspace-view/view.d.ts +1 -0
- package/dist/host/workspace-view/view.js +51 -55
- package/dist/runtime/daemon.js +4220 -1968
- package/dist/runtime/db.js +2134 -849
- package/dist/runtime/gitguard.js +29 -11
- package/dist/runtime/main.js +4687 -2243
- package/dist/runtime/netproxy.js +1644 -420
- package/dist/runtime/view.js +1356 -428
- package/dist/selftest/accounts.test.d.ts +1 -1
- package/dist/selftest/accounts.test.js +20 -17
- package/dist/selftest/agent-commands.test.d.ts +1 -1
- package/dist/selftest/agent-commands.test.js +9 -5
- package/dist/selftest/audit.test.d.ts +1 -1
- package/dist/selftest/audit.test.js +46 -13
- package/dist/selftest/channel.test.d.ts +1 -1
- package/dist/selftest/channel.test.js +63 -16
- package/dist/selftest/cli.test.d.ts +1 -1
- package/dist/selftest/cli.test.js +68 -16
- package/dist/selftest/cmdline.test.d.ts +1 -1
- package/dist/selftest/cmdline.test.js +36 -7
- package/dist/selftest/config.test.d.ts +1 -1
- package/dist/selftest/config.test.js +12 -5
- package/dist/selftest/data.test.d.ts +1 -1
- package/dist/selftest/data.test.js +35 -6
- package/dist/selftest/detect.test.d.ts +1 -1
- package/dist/selftest/detect.test.js +22 -9
- package/dist/selftest/generate.test.d.ts +1 -1
- package/dist/selftest/generate.test.js +33 -9
- package/dist/selftest/git-access.test.d.ts +1 -1
- package/dist/selftest/git-access.test.js +42 -4
- package/dist/selftest/guest-boot.test.d.ts +1 -1
- package/dist/selftest/guest-boot.test.js +25 -7
- package/dist/selftest/host-sim.test.d.ts +1 -1
- package/dist/selftest/host-sim.test.js +27 -3
- package/dist/selftest/hostile-input.test.d.ts +1 -1
- package/dist/selftest/hostile-input.test.js +5 -5
- package/dist/selftest/index.d.ts +1 -1
- package/dist/selftest/index.js +72 -16
- package/dist/selftest/layout.test.d.ts +2 -0
- package/dist/selftest/layout.test.js +131 -0
- package/dist/selftest/links.test.d.ts +1 -1
- package/dist/selftest/links.test.js +16 -11
- package/dist/selftest/live-daemon.test.d.ts +1 -1
- package/dist/selftest/live-daemon.test.js +20 -8
- package/dist/selftest/live-git.test.d.ts +1 -1
- package/dist/selftest/live-git.test.js +13 -4
- package/dist/selftest/live-network.test.d.ts +1 -1
- package/dist/selftest/live-network.test.js +24 -9
- package/dist/selftest/live-projects.test.d.ts +1 -1
- package/dist/selftest/live-projects.test.js +47 -20
- package/dist/selftest/live-terminal.test.d.ts +1 -1
- package/dist/selftest/live-terminal.test.js +41 -15
- package/dist/selftest/local-config.test.d.ts +1 -1
- package/dist/selftest/local-config.test.js +64 -16
- package/dist/selftest/mirror.test.d.ts +1 -1
- package/dist/selftest/mirror.test.js +102 -32
- package/dist/selftest/network.test.d.ts +1 -1
- package/dist/selftest/network.test.js +17 -8
- package/dist/selftest/personalization.test.d.ts +1 -1
- package/dist/selftest/personalization.test.js +12 -5
- package/dist/selftest/projects.test.d.ts +1 -1
- package/dist/selftest/projects.test.js +280 -85
- package/dist/selftest/repair.test.d.ts +1 -1
- package/dist/selftest/repair.test.js +17 -5
- package/dist/selftest/repo-guard.test.d.ts +1 -1
- package/dist/selftest/repo-guard.test.js +21 -20
- package/dist/selftest/secrets.test.d.ts +1 -1
- package/dist/selftest/secrets.test.js +57 -13
- package/dist/selftest/setup.test.d.ts +1 -1
- package/dist/selftest/setup.test.js +25 -5
- package/dist/selftest/{fixtures.d.ts → support/fixtures.d.ts} +5 -3
- package/dist/selftest/{fixtures.js → support/fixtures.js} +95 -17
- package/dist/selftest/{harness.js → support/harness.js} +24 -7
- package/dist/selftest/{live.d.ts → support/live.d.ts} +2 -2
- package/dist/selftest/{live.js → support/live.js} +34 -10
- package/dist/selftest/support/suite.js +1 -0
- package/dist/selftest/sync.test.d.ts +1 -1
- package/dist/selftest/sync.test.js +64 -26
- package/dist/selftest/test-guard.test.d.ts +1 -1
- package/dist/selftest/test-guard.test.js +43 -15
- package/dist/selftest/toolchains.test.d.ts +1 -1
- package/dist/selftest/toolchains.test.js +135 -36
- package/dist/selftest/workspace-view.test.d.ts +1 -1
- package/dist/selftest/workspace-view.test.js +48 -11
- package/dist/selftest/workspace.test.d.ts +1 -1
- package/dist/selftest/workspace.test.js +13 -4
- package/dist/shared/{apps.d.ts → apps/catalogue.d.ts} +1 -11
- package/dist/shared/apps/catalogue.js +768 -0
- package/dist/shared/apps/index.d.ts +2 -0
- package/dist/shared/apps/index.js +2 -0
- package/dist/shared/apps/selection.d.ts +11 -0
- package/dist/shared/apps/selection.js +40 -0
- package/dist/shared/channel/index.d.ts +2 -0
- package/dist/shared/channel/index.js +2 -0
- package/dist/shared/channel/run-dir.d.ts +30 -0
- package/dist/shared/channel/run-dir.js +84 -0
- package/dist/shared/{schema.d.ts → channel/schema.d.ts} +38 -21
- package/dist/shared/{schema.js → channel/schema.js} +62 -35
- package/dist/shared/download/archive.d.ts +13 -0
- package/dist/shared/download/archive.js +57 -0
- package/dist/shared/download/downloader.d.ts +35 -0
- package/dist/shared/download/downloader.js +110 -0
- package/dist/shared/download/github.d.ts +16 -0
- package/dist/shared/download/github.js +74 -0
- package/dist/shared/download/http.d.ts +5 -0
- package/dist/shared/download/http.js +30 -0
- package/dist/shared/download/index.d.ts +5 -0
- package/dist/shared/download/index.js +5 -0
- package/dist/shared/download/spawn.d.ts +2 -0
- package/dist/shared/download/spawn.js +7 -0
- package/dist/shared/io/index.d.ts +3 -0
- package/dist/shared/io/index.js +3 -0
- package/dist/shared/io/json-file.d.ts +10 -0
- package/dist/shared/io/json-file.js +21 -0
- package/dist/shared/io/json.d.ts +13 -0
- package/dist/shared/io/json.js +49 -0
- package/dist/shared/{safe-remove.js → io/safe-remove.js} +32 -7
- package/dist/shared/{netrules.js → network/firewall-rules.js} +36 -5
- package/dist/shared/network/index.d.ts +2 -0
- package/dist/shared/network/index.js +2 -0
- package/dist/shared/{netpolicy.js → network/policy.js} +66 -11
- package/dist/shared/{paths.js → paths/claude-paths.js} +12 -2
- package/dist/shared/{guest-paths.d.ts → paths/guest-paths.d.ts} +6 -12
- package/dist/shared/{guest-paths.js → paths/guest-paths.js} +53 -36
- package/dist/shared/paths/index.d.ts +3 -0
- package/dist/shared/paths/index.js +3 -0
- package/dist/shared/{projects.js → paths/projects.js} +13 -3
- package/dist/shared/pty/client.d.ts +21 -0
- package/dist/shared/pty/client.js +79 -0
- package/dist/shared/{console-input.js → pty/console-input.js} +26 -6
- package/dist/shared/pty/index.d.ts +6 -0
- package/dist/shared/pty/index.js +6 -0
- package/dist/shared/pty/input-joiner.d.ts +15 -0
- package/dist/shared/pty/input-joiner.js +44 -0
- package/dist/shared/pty/output-filter.d.ts +13 -0
- package/dist/shared/pty/output-filter.js +140 -0
- package/dist/shared/pty/protocol.d.ts +36 -0
- package/dist/shared/pty/protocol.js +60 -0
- package/dist/shared/pty/terminal.d.ts +24 -0
- package/dist/shared/pty/terminal.js +147 -0
- package/dist/shared/test-guard.js +3 -1
- package/dist/sync/claude-mem.d.ts +1 -1
- package/dist/sync/claude-mem.js +9 -4
- package/dist/sync/history.d.ts +1 -29
- package/dist/sync/history.js +57 -45
- package/dist/sync/index.d.ts +5 -0
- package/dist/sync/index.js +5 -0
- package/dist/sync/sync-cycle.d.ts +18 -0
- package/dist/sync/sync-cycle.js +85 -0
- package/dist/sync/sync-state.d.ts +32 -0
- package/dist/sync/sync-state.js +37 -0
- package/dist/sync/watcher.d.ts +0 -18
- package/dist/sync/watcher.js +66 -100
- package/native/keep-awake.ps1 +8 -0
- package/native/power.cs +23 -0
- package/native/stop-events.ps1 +38 -0
- package/package.json +11 -3
- package/sandbox/linkgate.cs +98 -0
- package/sandbox/memlog.ps1 +15 -6
- package/schemas/config.schema.json +34 -1
- package/schemas/sandbox-config.schema.json +34 -1
- package/dist/cli/boot-progress.d.ts +0 -22
- package/dist/cli/boot-progress.js +0 -59
- package/dist/cli/commands/launch.d.ts +0 -32
- package/dist/cli/commands/launch.js +0 -421
- package/dist/cli/commands/maintenance.d.ts +0 -10
- package/dist/cli/commands/maintenance.js +0 -220
- package/dist/cli/commands/project.d.ts +0 -33
- package/dist/cli/commands/project.js +0 -102
- package/dist/cli/commands/projects.d.ts +0 -14
- package/dist/cli/commands/projects.js +0 -146
- package/dist/cli/commands/restart.d.ts +0 -6
- package/dist/cli/commands/restart.js +0 -95
- package/dist/cli/commands/sessions.d.ts +0 -12
- package/dist/cli/commands/sessions.js +0 -258
- package/dist/cli/menu/settings/editors.js +0 -305
- package/dist/cli/tui/dialogs.d.ts +0 -57
- package/dist/cli/tui/dialogs.js +0 -162
- package/dist/core/config.js +0 -109
- package/dist/core/project-policy.d.ts +0 -62
- package/dist/core/project-policy.js +0 -121
- package/dist/core/schema.d.ts +0 -6
- package/dist/core/schema.js +0 -8
- package/dist/core/util.d.ts +0 -62
- package/dist/core/util.js +0 -156
- package/dist/core/workspace.d.ts +0 -35
- package/dist/core/workspace.js +0 -206
- package/dist/guest/boot-env.d.ts +0 -4
- package/dist/guest/daemon.js +0 -57
- package/dist/guest/env.d.ts +0 -56
- package/dist/guest/env.js +0 -115
- package/dist/guest/gitrules.js +0 -11
- package/dist/guest/project-status.d.ts +0 -5
- package/dist/guest/project-status.js +0 -17
- package/dist/guest/setup/user.js +0 -51
- package/dist/guest/toolchains/cli.d.ts +0 -10
- package/dist/guest/toolchains/common.d.ts +0 -54
- package/dist/guest/toolchains/common.js +0 -147
- package/dist/guest/toolchains/databases/dynamodb.d.ts +0 -8
- package/dist/guest/toolchains/databases/dynamodb.js +0 -52
- package/dist/guest/toolchains/databases/index.d.ts +0 -6
- package/dist/guest/toolchains/databases/index.js +0 -62
- package/dist/guest/toolchains/databases/mongodb.d.ts +0 -3
- package/dist/guest/toolchains/databases/mongodb.js +0 -31
- package/dist/guest/toolchains/databases/mysql.d.ts +0 -3
- package/dist/guest/toolchains/databases/mysql.js +0 -38
- package/dist/guest/toolchains/databases/postgres.d.ts +0 -5
- package/dist/guest/toolchains/databases/postgres.js +0 -38
- package/dist/guest/toolchains/databases/redis.d.ts +0 -3
- package/dist/guest/toolchains/databases/redis.js +0 -16
- package/dist/guest/toolchains/git.d.ts +0 -3
- package/dist/guest/toolchains/go.d.ts +0 -3
- package/dist/guest/toolchains/java.d.ts +0 -8
- package/dist/guest/toolchains/node.d.ts +0 -3
- package/dist/guest/toolchains/pwsh.d.ts +0 -4
- package/dist/guest/toolchains/python.d.ts +0 -3
- package/dist/guest/toolchains/scripting/php.d.ts +0 -3
- package/dist/guest/toolchains/scripting/ruby.d.ts +0 -3
- package/dist/host/accounts.d.ts +0 -32
- package/dist/host/accounts.js +0 -128
- package/dist/host/agent-commands.d.ts +0 -25
- package/dist/host/agent-commands.js +0 -145
- package/dist/host/channel.d.ts +0 -38
- package/dist/host/channel.js +0 -163
- package/dist/host/generate.d.ts +0 -13
- package/dist/host/generate.js +0 -115
- package/dist/host/launch/projects.d.ts +0 -17
- package/dist/host/launch/wsb.js +0 -34
- package/dist/host/motw.d.ts +0 -17
- package/dist/host/motw.js +0 -74
- package/dist/host/pc-scan.d.ts +0 -6
- package/dist/host/personalize.d.ts +0 -10
- package/dist/host/personalize.js +0 -97
- package/dist/host/platform.js +0 -129
- package/dist/host/project-scan.d.ts +0 -7
- package/dist/host/projects.d.ts +0 -123
- package/dist/host/projects.js +0 -196
- package/dist/host/repo-guard.d.ts +0 -43
- package/dist/host/repo-guard.js +0 -347
- package/dist/host/secrets.d.ts +0 -14
- package/dist/host/secrets.js +0 -133
- package/dist/host/stops.d.ts +0 -67
- package/dist/host/stops.js +0 -126
- package/dist/shared/apps.js +0 -114
- package/dist/shared/download.d.ts +0 -63
- package/dist/shared/download.js +0 -238
- package/dist/shared/pty-client.d.ts +0 -108
- package/dist/shared/pty-client.js +0 -406
- package/dist/shared/rundir.d.ts +0 -41
- package/dist/shared/rundir.js +0 -96
- /package/dist/{guest/daemon.d.ts → cli/tui/list/list-types.js} +0 -0
- /package/dist/{guest/db.d.ts → cli/tui/screen.js} +0 -0
- /package/dist/core/{detect-databases.d.ts → detect/databases.d.ts} +0 -0
- /package/dist/{guest/toolchains → core/detect}/versions.d.ts +0 -0
- /package/dist/guest/{setup/agents.d.ts → agents/agent-installer.d.ts} +0 -0
- /package/dist/guest/{audit-parse.d.ts → audit/parse.d.ts} +0 -0
- /package/dist/guest/{guide.d.ts → boot/guide.d.ts} +0 -0
- /package/dist/guest/daemon/{shutdown.d.ts → idle-shutdown.d.ts} +0 -0
- /package/dist/guest/daemon/{session.d.ts → sessions.d.ts} +0 -0
- /package/dist/guest/{main.d.ts → entries/daemon.d.ts} +0 -0
- /package/dist/guest/{netproxy.d.ts → entries/db.d.ts} +0 -0
- /package/dist/{selftest/suite.js → guest/entries/gitguard.d.ts} +0 -0
- /package/dist/guest/{gitguard.d.ts → git/decision.d.ts} +0 -0
- /package/dist/guest/{ports.d.ts → runtime/ports.d.ts} +0 -0
- /package/dist/guest/{project-context.d.ts → runtime/project-context.d.ts} +0 -0
- /package/dist/guest/{cmdline.d.ts → sessions/cmdline.d.ts} +0 -0
- /package/dist/guest/{ptyhost.d.ts → sessions/pty-host.d.ts} +0 -0
- /package/dist/guest/{view.d.ts → sessions/viewer.d.ts} +0 -0
- /package/dist/guest/setup/{policy.d.ts → managed-policy.d.ts} +0 -0
- /package/dist/host/{window.d.ts → sandbox/window.d.ts} +0 -0
- /package/dist/host/{wsb.d.ts → sandbox/wsb-cli.d.ts} +0 -0
- /package/dist/host/{cleanup.d.ts → storage/cleanup.d.ts} +0 -0
- /package/dist/selftest/{harness.d.ts → support/harness.d.ts} +0 -0
- /package/dist/selftest/{suite.d.ts → support/suite.d.ts} +0 -0
- /package/dist/shared/{safe-remove.d.ts → io/safe-remove.d.ts} +0 -0
- /package/dist/shared/{netrules.d.ts → network/firewall-rules.d.ts} +0 -0
- /package/dist/shared/{netpolicy.d.ts → network/policy.d.ts} +0 -0
- /package/dist/shared/{paths.d.ts → paths/claude-paths.d.ts} +0 -0
- /package/dist/shared/{projects.d.ts → paths/projects.d.ts} +0 -0
- /package/dist/shared/{console-input.d.ts → pty/console-input.d.ts} +0 -0
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
// The architecture rules, checked on the compiled output (dist/**/*.js): which areas may import which, the guest's
|
|
2
|
+
// portable core, the pure guest files the host and tests may load without the guest runtime's side effects, and no
|
|
3
|
+
// import cycles. The bundled dist/runtime is left out (it has no imports).
|
|
4
|
+
import fs from 'node:fs';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
const STATIC = /^\s*(?:import|export)\b[^;]*?\bfrom\s*(['"])([^'"\n]+)\1;?\s*$|^\s*import\s*(['"])([^'"\n]+)\3;?\s*$/gm;
|
|
7
|
+
const DYNAMIC = /\bimport\(\s*(['"])([^'"\n]+)\1\s*\)/g;
|
|
8
|
+
const PORTABLE_CORE = [
|
|
9
|
+
/^core\/types\.js$/,
|
|
10
|
+
/^core\/schema\//,
|
|
11
|
+
/^core\/detect\/(toolchains|versions)\.js$/,
|
|
12
|
+
/^core\/util\/errors\.js$/,
|
|
13
|
+
];
|
|
14
|
+
const PURE_GUEST = [
|
|
15
|
+
'guest/git/decision.js',
|
|
16
|
+
'guest/setup/git-rules.js',
|
|
17
|
+
'guest/boot/project-env.js',
|
|
18
|
+
'guest/audit/parse.js',
|
|
19
|
+
'guest/sessions/cmdline.js',
|
|
20
|
+
'guest/toolchains/catalogue.js',
|
|
21
|
+
'guest/toolchains/tools/vscode-profile.js',
|
|
22
|
+
];
|
|
23
|
+
const SIDE_EFFECTS = ['guest/runtime/session.js', 'guest/runtime/log.js'];
|
|
24
|
+
const readModules = (dist) => {
|
|
25
|
+
const files = fs
|
|
26
|
+
.readdirSync(dist, { recursive: true, encoding: 'utf8' })
|
|
27
|
+
.map((f) => f.split(path.sep).join('/'))
|
|
28
|
+
.filter((f) => f.endsWith('.js') && !f.startsWith('runtime/'));
|
|
29
|
+
const modules = new Map();
|
|
30
|
+
for (const file of files) {
|
|
31
|
+
const text = fs.readFileSync(path.join(dist, file), 'utf8');
|
|
32
|
+
const resolve = (spec) => path.posix.normalize(path.posix.join(path.posix.dirname(file), spec));
|
|
33
|
+
const statics = [];
|
|
34
|
+
const bare = [];
|
|
35
|
+
for (const m of text.matchAll(STATIC)) {
|
|
36
|
+
const spec = m[2] ?? m[4];
|
|
37
|
+
if (spec.startsWith('.'))
|
|
38
|
+
statics.push(resolve(spec));
|
|
39
|
+
else
|
|
40
|
+
bare.push(spec);
|
|
41
|
+
}
|
|
42
|
+
const dynamics = [...text.matchAll(DYNAMIC)]
|
|
43
|
+
.map((m) => m[2])
|
|
44
|
+
.filter((s) => s.startsWith('.'))
|
|
45
|
+
.map(resolve);
|
|
46
|
+
modules.set(file, { statics, dynamics, bare });
|
|
47
|
+
}
|
|
48
|
+
return modules;
|
|
49
|
+
};
|
|
50
|
+
/** Every file reached from `start` through static imports (start included). */
|
|
51
|
+
const closure = (modules, start) => {
|
|
52
|
+
const seen = new Set();
|
|
53
|
+
const visit = (f) => {
|
|
54
|
+
if (seen.has(f))
|
|
55
|
+
return;
|
|
56
|
+
seen.add(f);
|
|
57
|
+
for (const d of modules.get(f)?.statics ?? [])
|
|
58
|
+
visit(d);
|
|
59
|
+
};
|
|
60
|
+
visit(start);
|
|
61
|
+
return seen;
|
|
62
|
+
};
|
|
63
|
+
const findCycle = (modules) => {
|
|
64
|
+
const state = new Map();
|
|
65
|
+
const stack = [];
|
|
66
|
+
const visit = (f) => {
|
|
67
|
+
state.set(f, 'open');
|
|
68
|
+
stack.push(f);
|
|
69
|
+
for (const d of modules.get(f)?.statics ?? []) {
|
|
70
|
+
if (state.get(d) === 'open')
|
|
71
|
+
return [...stack.slice(stack.indexOf(d)), d];
|
|
72
|
+
if (!state.has(d)) {
|
|
73
|
+
const found = visit(d);
|
|
74
|
+
if (found)
|
|
75
|
+
return found;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
stack.pop();
|
|
79
|
+
state.set(f, 'done');
|
|
80
|
+
return null;
|
|
81
|
+
};
|
|
82
|
+
for (const f of modules.keys()) {
|
|
83
|
+
if (state.has(f))
|
|
84
|
+
continue;
|
|
85
|
+
const found = visit(f);
|
|
86
|
+
if (found)
|
|
87
|
+
return found;
|
|
88
|
+
}
|
|
89
|
+
return null;
|
|
90
|
+
};
|
|
91
|
+
const area = (file) => file.split('/')[0];
|
|
92
|
+
const list = (items) => items.slice(0, 10).join('\n') + (items.length > 10 ? '\n...' : '');
|
|
93
|
+
export const layoutSuite = {
|
|
94
|
+
name: 'layout',
|
|
95
|
+
title: 'architecture rules on the compiled code (areas, portable core, pure guest files, cycles)',
|
|
96
|
+
run: (t) => {
|
|
97
|
+
const modules = readModules(path.join(t.packageRoot, 'dist'));
|
|
98
|
+
const files = [...modules.keys()];
|
|
99
|
+
t.check(files.length > 100 && modules.has('guest/entries/main.js'), 'the compiled code is there to check');
|
|
100
|
+
t.section('areas');
|
|
101
|
+
const guestFiles = files.filter((f) => area(f) === 'guest');
|
|
102
|
+
const guestReach = new Set(guestFiles.flatMap((f) => [...closure(modules, f)]));
|
|
103
|
+
const guestBad = [...guestReach].filter((f) => ['host', 'cli', 'sync', 'selftest'].includes(area(f)) ||
|
|
104
|
+
(area(f) === 'core' && !PORTABLE_CORE.some((p) => p.test(f))));
|
|
105
|
+
t.check(!guestBad.length, 'guest code reaches no host, cli, sync or selftest file, and only the portable core', list(guestBad));
|
|
106
|
+
const hostSide = files.filter((f) => ['host', 'cli', 'core', 'sync', 'shared'].includes(area(f)));
|
|
107
|
+
const intoGuest = hostSide.flatMap((f) => [...modules.get(f).statics, ...modules.get(f).dynamics]
|
|
108
|
+
.filter((d) => area(d) === 'guest')
|
|
109
|
+
.map((d) => f + ' -> ' + d));
|
|
110
|
+
t.check(!intoGuest.length, 'host, cli, core, sync and shared import no guest file', list(intoGuest));
|
|
111
|
+
t.section('pure guest files');
|
|
112
|
+
for (const pure of PURE_GUEST) {
|
|
113
|
+
t.check(modules.has(pure), pure + ' exists');
|
|
114
|
+
const reached = [...closure(modules, pure)].filter((f) => SIDE_EFFECTS.includes(f));
|
|
115
|
+
t.check(!reached.length, pure + ' never loads the guest runtime (session.json, log folder)', list(reached));
|
|
116
|
+
}
|
|
117
|
+
const guard = 'guest/entries/gitguard.js';
|
|
118
|
+
const guardReach = [...closure(modules, guard)].filter((f) => f !== guard && f !== 'guest/git/decision.js');
|
|
119
|
+
const guardBare = [...closure(modules, guard)]
|
|
120
|
+
.flatMap((f) => modules.get(f)?.bare ?? [])
|
|
121
|
+
.filter((b) => !b.startsWith('node:'));
|
|
122
|
+
t.check(!guardReach.length && !guardBare.length, 'the git guard loads only git/decision.js and Node built-ins', list([...guardReach, ...guardBare]));
|
|
123
|
+
t.section('imports');
|
|
124
|
+
const cycle = findCycle(modules);
|
|
125
|
+
t.check(!cycle, 'no static import cycles', cycle?.join(' -> '));
|
|
126
|
+
const intoEntries = files.flatMap((f) => [...modules.get(f).statics, ...modules.get(f).dynamics]
|
|
127
|
+
.filter((d) => d.startsWith('guest/entries/'))
|
|
128
|
+
.map((d) => f + ' -> ' + d));
|
|
129
|
+
t.check(!intoEntries.length, 'nothing imports an entry point (guest/entries)', list(intoEntries));
|
|
130
|
+
},
|
|
131
|
+
};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { Suite } from './suite.js';
|
|
1
|
+
import type { Suite } from './support/suite.js';
|
|
2
2
|
export declare const linksSuite: Suite;
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
// must never write, delete or walk through them.
|
|
3
3
|
import fs from 'node:fs';
|
|
4
4
|
import path from 'node:path';
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { pruneStorage } from '../host/
|
|
8
|
-
import { assertNoLinks } from '../core/util.js';
|
|
9
|
-
import { syncHistoryIn } from '../sync/
|
|
5
|
+
import { AccountStore } from '../host/profile/index.js';
|
|
6
|
+
import { SandboxChannel } from '../host/channel/index.js';
|
|
7
|
+
import { pruneStorage } from '../host/storage/index.js';
|
|
8
|
+
import { assertNoLinks } from '../core/util/index.js';
|
|
9
|
+
import { syncHistoryIn } from '../sync/index.js';
|
|
10
10
|
export const linksSuite = {
|
|
11
11
|
name: 'links',
|
|
12
12
|
title: 'links planted by the sandbox are never followed',
|
|
@@ -19,10 +19,15 @@ export const linksSuite = {
|
|
|
19
19
|
t.section('writes under the data folder');
|
|
20
20
|
fs.symlinkSync(victim, path.join(data, 'state', 'claude'), 'junction');
|
|
21
21
|
await t.throws(() => assertNoLinks(data, path.join(data, 'state', 'claude', 'x.json')), 'is a link', 'any host write under the data folder through a junction is refused');
|
|
22
|
-
await t.throws(() =>
|
|
23
|
-
await t.throws(() =>
|
|
22
|
+
await t.throws(() => new AccountStore(storage).activate(data, 'any'), 'Unknown account', 'accounts never read through a sandbox junction');
|
|
23
|
+
await t.throws(() => new AccountStore(storage).save(data, 'a', null), 'is a link', 'accounts never write through a sandbox junction');
|
|
24
24
|
t.section('history sync');
|
|
25
|
-
const sides = {
|
|
25
|
+
const sides = {
|
|
26
|
+
hostClaudeDir: t.at('link-host'),
|
|
27
|
+
guestClaudeDir: t.at('link-guest'),
|
|
28
|
+
hostWorkspace: 'D:\\Code\\my-app',
|
|
29
|
+
guestWorkspace: 'C:\\Workspace\\my-app',
|
|
30
|
+
};
|
|
26
31
|
t.dir('link-guest', 'projects');
|
|
27
32
|
fs.symlinkSync(victim, path.join(sides.guestClaudeDir, 'projects', 'C--Workspace-my-app'), 'junction');
|
|
28
33
|
t.write(path.join(sides.hostClaudeDir, 'projects', 'D--Code-my-app', 's.jsonl'), '{}\n');
|
|
@@ -35,10 +40,10 @@ export const linksSuite = {
|
|
|
35
40
|
t.section('the run folder and cleanup');
|
|
36
41
|
t.dir('evil-storage', 'data', 'd', 'run');
|
|
37
42
|
fs.symlinkSync(victim, path.join(data, 'run', 'requests'), 'junction');
|
|
38
|
-
await t.throws(() =>
|
|
39
|
-
t.check(!fs.existsSync(path.join(victim, 'p1.json')),
|
|
43
|
+
await t.throws(() => new SandboxChannel(data).send({ kind: 'ping', id: 'p1', createdAt: '' }), 'is a link', 'requests are never written through a junction');
|
|
44
|
+
t.check(!fs.existsSync(path.join(victim, 'p1.json')), "nothing was written into the junction's target");
|
|
40
45
|
fs.symlinkSync(victim, path.join(data, 'run', 'sessions'), 'junction');
|
|
41
|
-
|
|
46
|
+
new SandboxChannel(data).reset();
|
|
42
47
|
t.check(!fs.existsSync(path.join(data, 'run', 'sessions')), 'resetting the run folder removes a junction itself...');
|
|
43
48
|
t.check(fs.existsSync(precious), '... never its target');
|
|
44
49
|
fs.symlinkSync(victim, path.join(data, 'logs'), 'junction');
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { Suite } from './suite.js';
|
|
1
|
+
import type { Suite } from './support/suite.js';
|
|
2
2
|
export declare const liveDaemonSuite: Suite;
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
// cmd.exe standing in for the agent. One daemon serves all the checks below, in order (compiling ptyhost is slow).
|
|
3
3
|
import fs from 'node:fs';
|
|
4
4
|
import path from 'node:path';
|
|
5
|
-
import { queryViewers } from '../shared/pty
|
|
6
|
-
import { copyCmdAsFakeAgent, openViewer, sees, startDaemon, tail, viewersWhen, WAIT } from './live.js';
|
|
5
|
+
import { queryViewers } from '../shared/pty/index.js';
|
|
6
|
+
import { copyCmdAsFakeAgent, openViewer, sees, startDaemon, tail, viewersWhen, WAIT } from './support/live.js';
|
|
7
7
|
export const liveDaemonSuite = {
|
|
8
8
|
name: 'live-daemon',
|
|
9
9
|
title: 'live: session daemon + ptyhost (start, attach, viewers, exec, restart, exit)',
|
|
@@ -16,7 +16,10 @@ export const liveDaemonSuite = {
|
|
|
16
16
|
copyCmdAsFakeAgent(data);
|
|
17
17
|
const session = f.readJson(gen.sessionPath);
|
|
18
18
|
Object.assign(session, { workspace, attach: { enabled: true } });
|
|
19
|
-
Object.assign(session.harness, {
|
|
19
|
+
Object.assign(session.harness, {
|
|
20
|
+
arguments: ['/d', '/k', 'echo LIVE-AGENT-READY'],
|
|
21
|
+
resumeArguments: ['/d', '/k', 'echo LIVE-AGENT-RESUMED'],
|
|
22
|
+
});
|
|
20
23
|
t.writeJson(gen.sessionPath, session);
|
|
21
24
|
const daemon = startDaemon(t, f, { launchPath: gen.launchPath, data, workspace });
|
|
22
25
|
const viewers = [];
|
|
@@ -34,7 +37,7 @@ export const liveDaemonSuite = {
|
|
|
34
37
|
const viewer = await openViewer(attach);
|
|
35
38
|
viewers.push(viewer);
|
|
36
39
|
const sawReady = await sees(t, viewer, 'LIVE-AGENT-READY');
|
|
37
|
-
t.check(Boolean(sawReady),
|
|
40
|
+
t.check(Boolean(sawReady), "an attached client sees the agent's screen", 'screen so far: ' + tail(viewer.output()) + '\n' + daemon.diagnostics());
|
|
38
41
|
viewer.type('echo TYPED-%USERNAME:~0,0%OK');
|
|
39
42
|
const sawTyped = await sees(t, viewer, 'TYPED-OK');
|
|
40
43
|
t.check(Boolean(sawTyped), 'keystrokes reach the agent', 'screen so far: ' + tail(viewer.output()));
|
|
@@ -59,7 +62,13 @@ export const liveDaemonSuite = {
|
|
|
59
62
|
t.equal(daemon.status('live1')?.phase, 'running', 'the session keeps running when a terminal closes');
|
|
60
63
|
t.equal(await queryViewers({ ...local, token: 'wrong-token' }, 10000), null, 'the viewer query needs the session token too');
|
|
61
64
|
t.section('live: exec and requests');
|
|
62
|
-
daemon.request({
|
|
65
|
+
daemon.request({
|
|
66
|
+
kind: 'exec',
|
|
67
|
+
id: 'exec1',
|
|
68
|
+
command: ['echo', 'hello from exec'],
|
|
69
|
+
cwd: workspace,
|
|
70
|
+
timeoutSeconds: 30,
|
|
71
|
+
});
|
|
63
72
|
const exec = await daemon.response('exec1');
|
|
64
73
|
t.check(Boolean(exec?.ok && exec.stdout?.includes('hello from exec')), 'exec runs a command in the sandbox and returns its output', JSON.stringify(exec));
|
|
65
74
|
daemon.request({ kind: 'exec', id: 'exec2', command: ['dir'], cwd: 'C:\\Windows', timeoutSeconds: 30 });
|
|
@@ -78,9 +87,12 @@ export const liveDaemonSuite = {
|
|
|
78
87
|
t.check(Boolean(sawResumed), 'restart relaunches the agent with its resume arguments while attached', 'screen so far: ' + tail(viewer.output()) + '\n' + daemon.diagnostics());
|
|
79
88
|
viewer.type('exit 3');
|
|
80
89
|
const gotExit = await t.waitFor(() => viewer.exitCode() !== null, WAIT.exit);
|
|
81
|
-
const ended = await t.waitFor(() => {
|
|
82
|
-
|
|
83
|
-
|
|
90
|
+
const ended = await t.waitFor(() => {
|
|
91
|
+
const s = daemon.status('live1');
|
|
92
|
+
return s?.phase === 'exited' ? s : null;
|
|
93
|
+
}, WAIT.exit);
|
|
94
|
+
t.equal(gotExit ? viewer.exitCode() : null, 3, "the agent's exit code reaches the attached client");
|
|
95
|
+
t.equal(ended?.exitCode, 3, "the agent's exit code reaches the session status");
|
|
84
96
|
}
|
|
85
97
|
finally {
|
|
86
98
|
for (const v of viewers)
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { Suite } from './suite.js';
|
|
1
|
+
import type { Suite } from './support/suite.js';
|
|
2
2
|
export declare const liveGitSuite: Suite;
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
import fs from 'node:fs';
|
|
4
4
|
import path from 'node:path';
|
|
5
5
|
import { spawnSync } from 'node:child_process';
|
|
6
|
-
import { findOnPath } from '../core/util.js';
|
|
7
|
-
import { CSC } from './live.js';
|
|
6
|
+
import { findOnPath } from '../core/util/index.js';
|
|
7
|
+
import { CSC } from './support/live.js';
|
|
8
8
|
export const liveGitSuite = {
|
|
9
9
|
name: 'live-git',
|
|
10
10
|
title: 'live: the git access guard (compiled git.exe stand-in, Git Bash)',
|
|
@@ -17,7 +17,12 @@ export const liveGitSuite = {
|
|
|
17
17
|
}
|
|
18
18
|
const gen = await f.launch();
|
|
19
19
|
const shimDir = t.dir('gitshim');
|
|
20
|
-
const compiled = spawnSync(CSC, [
|
|
20
|
+
const compiled = spawnSync(CSC, [
|
|
21
|
+
'/nologo',
|
|
22
|
+
'/optimize',
|
|
23
|
+
'/out:' + path.join(shimDir, 'git.exe'),
|
|
24
|
+
path.join(gen.launchPath, 'sandbox', 'gitshim.cs'),
|
|
25
|
+
], { encoding: 'utf8' });
|
|
21
26
|
t.check(compiled.status === 0, 'gitshim.cs compiles with the .NET Framework compiler', compiled.stdout + compiled.stderr);
|
|
22
27
|
if (compiled.status !== 0)
|
|
23
28
|
return;
|
|
@@ -54,7 +59,11 @@ export const liveGitSuite = {
|
|
|
54
59
|
}
|
|
55
60
|
const posix = (p) => p.replace(/\\/g, '/');
|
|
56
61
|
const bashEnv = t.write(t.at('gitshim', 'bashenv.sh'), 'git() { "' + posix(process.execPath) + '" "' + posix(guard) + '" "$@"; }\nexport -f git\n');
|
|
57
|
-
const viaBash = spawnSync(bash, ['-c', 'git commit -m x'], {
|
|
62
|
+
const viaBash = spawnSync(bash, ['-c', 'git commit -m x'], {
|
|
63
|
+
cwd: repo,
|
|
64
|
+
env: { ...env('readonly'), BASH_ENV: posix(bashEnv) },
|
|
65
|
+
encoding: 'utf8',
|
|
66
|
+
});
|
|
58
67
|
t.check(viaBash.status === 128 && viaBash.stderr.includes('read-only'), 'readonly: git inside Git Bash goes through the guard too (BASH_ENV)', 'exit ' + viaBash.status + ' ' + viaBash.stderr);
|
|
59
68
|
},
|
|
60
69
|
};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { Suite } from './suite.js';
|
|
1
|
+
import type { Suite } from './support/suite.js';
|
|
2
2
|
export declare const liveNetworkSuite: Suite;
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
import net from 'node:net';
|
|
4
4
|
import path from 'node:path';
|
|
5
5
|
import { spawn, spawnSync } from 'node:child_process';
|
|
6
|
-
import { startPortForwards } from '../host/
|
|
7
|
-
import { PROXY_PORT, relayPort } from '../shared/
|
|
8
|
-
import { CSC } from './live.js';
|
|
6
|
+
import { startPortForwards } from '../host/network/index.js';
|
|
7
|
+
import { PROXY_PORT, relayPort } from '../shared/network/index.js';
|
|
8
|
+
import { CSC } from './support/live.js';
|
|
9
9
|
/** A TCP server that answers every line with "echo:<line>". */
|
|
10
10
|
const echoServer = (port = 0) => new Promise((resolve) => {
|
|
11
11
|
const server = net.createServer((s) => s.on('data', (d) => s.write('echo:' + d.toString())));
|
|
@@ -16,11 +16,17 @@ const portOf = (server) => server.address().port;
|
|
|
16
16
|
const talk = (port, preamble, text) => new Promise((resolve) => {
|
|
17
17
|
const socket = net.connect(port, '127.0.0.1');
|
|
18
18
|
let got = '';
|
|
19
|
-
socket.on('data', (d) => {
|
|
20
|
-
|
|
19
|
+
socket.on('data', (d) => {
|
|
20
|
+
got += d.toString();
|
|
21
|
+
if (preamble && got.includes('\r\n\r\n') && got.startsWith('HTTP/1.1 200') && !got.includes('echo:'))
|
|
22
|
+
socket.write(text);
|
|
23
|
+
});
|
|
21
24
|
socket.on('error', () => resolve(got));
|
|
22
25
|
socket.on('connect', () => socket.write(preamble || text));
|
|
23
|
-
setTimeout(() => {
|
|
26
|
+
setTimeout(() => {
|
|
27
|
+
socket.destroy();
|
|
28
|
+
resolve(got);
|
|
29
|
+
}, 1500);
|
|
24
30
|
});
|
|
25
31
|
export const liveNetworkSuite = {
|
|
26
32
|
name: 'live-network',
|
|
@@ -30,9 +36,18 @@ export const liveNetworkSuite = {
|
|
|
30
36
|
t.section('allowOnly proxy');
|
|
31
37
|
const gen = await f.launch({}, { config: { ...f.baseConfig, network: { ...f.baseConfig.network, allowOnly: ['localhost'] } } });
|
|
32
38
|
const echo = await echoServer();
|
|
33
|
-
const proxy = spawn(process.execPath, [path.join(gen.launchPath, 'runtime', 'netproxy.js')], {
|
|
39
|
+
const proxy = spawn(process.execPath, [path.join(gen.launchPath, 'runtime', 'netproxy.js')], {
|
|
40
|
+
env: { ...process.env, AGENT_LAUNCH_DIR: gen.launchPath, AGENT_DATA_DIR: t.dir('netproxy-data') },
|
|
41
|
+
stdio: 'ignore',
|
|
42
|
+
});
|
|
34
43
|
try {
|
|
35
|
-
const up = await t.waitFor(() => new Promise((resolve) => {
|
|
44
|
+
const up = await t.waitFor(() => new Promise((resolve) => {
|
|
45
|
+
const s = net.connect(PROXY_PORT, '127.0.0.1', () => {
|
|
46
|
+
s.destroy();
|
|
47
|
+
resolve(true);
|
|
48
|
+
});
|
|
49
|
+
s.on('error', () => resolve(false));
|
|
50
|
+
}), 10000, 200);
|
|
36
51
|
t.check(Boolean(up), 'the proxy listens on localhost');
|
|
37
52
|
const allowed = await talk(PROXY_PORT, 'CONNECT localhost:' + portOf(echo) + ' HTTP/1.1\r\nHost: localhost\r\n\r\n', 'hi');
|
|
38
53
|
t.check(allowed.startsWith('HTTP/1.1 200') && allowed.includes('echo:hi'), 'an allowed host is tunnelled through', allowed);
|
|
@@ -54,7 +69,7 @@ export const liveNetworkSuite = {
|
|
|
54
69
|
const forwarded = await talk(pcPort, '', 'ping');
|
|
55
70
|
stop();
|
|
56
71
|
relay.close();
|
|
57
|
-
t.equal(forwarded, 'echo:ping',
|
|
72
|
+
t.equal(forwarded, 'echo:ping', "localhost:<pc> on this PC reaches the sandbox's relay");
|
|
58
73
|
t.section('cargo shim');
|
|
59
74
|
const out = path.join(t.dir('cargoshim'), 'cargo.exe');
|
|
60
75
|
const compiled = spawnSync(CSC, ['/nologo', '/optimize', '/out:' + out, path.join(gen.launchPath, 'sandbox', 'cargoshim.cs')], { encoding: 'utf8' });
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { Suite } from './suite.js';
|
|
1
|
+
import type { Suite } from './support/suite.js';
|
|
2
2
|
export declare const liveProjectsSuite: Suite;
|
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
// Toolchain installers run as a dry run (no downloads); everything else is real. cmd.exe stands in for the agent.
|
|
5
5
|
import fs from 'node:fs';
|
|
6
6
|
import path from 'node:path';
|
|
7
|
-
import { projectSpec } from '../host/
|
|
8
|
-
import { resizeFrame } from '../shared/pty
|
|
9
|
-
import { readJsonFile } from '../shared/
|
|
10
|
-
import { copyCmdAsFakeAgent, openViewer, sees, startDaemon, tail, viewersWhen } from './live.js';
|
|
7
|
+
import { projectSpec } from '../host/projects/index.js';
|
|
8
|
+
import { resizeFrame } from '../shared/pty/index.js';
|
|
9
|
+
import { readJsonFile } from '../shared/io/index.js';
|
|
10
|
+
import { copyCmdAsFakeAgent, openViewer, sees, startDaemon, tail, viewersWhen } from './support/live.js';
|
|
11
11
|
export const liveProjectsSuite = {
|
|
12
12
|
name: 'live-projects',
|
|
13
13
|
title: 'live: two projects, several sessions, several viewers',
|
|
@@ -21,11 +21,25 @@ export const liveProjectsSuite = {
|
|
|
21
21
|
copyCmdAsFakeAgent(data);
|
|
22
22
|
const session = f.readJson(gen.sessionPath);
|
|
23
23
|
// B's root appears at its own path here (like guestWorkspace "mirror"), so host and guest paths are the same.
|
|
24
|
-
Object.assign(session, {
|
|
25
|
-
|
|
24
|
+
Object.assign(session, {
|
|
25
|
+
workspace: f.workA,
|
|
26
|
+
attach: { enabled: true },
|
|
27
|
+
projectsDir: t.at('live-projects'),
|
|
28
|
+
roots: [root],
|
|
29
|
+
projectId: 'work-a',
|
|
30
|
+
});
|
|
31
|
+
Object.assign(session.harness, {
|
|
32
|
+
arguments: ['/d', '/k', 'echo AGENT-READY'],
|
|
33
|
+
resumeArguments: ['/d', '/k', 'echo AGENT-RESUMED'],
|
|
34
|
+
});
|
|
26
35
|
t.writeJson(gen.sessionPath, session);
|
|
27
36
|
const local = t.at('live-multi-local');
|
|
28
|
-
const daemon = startDaemon(t, f, {
|
|
37
|
+
const daemon = startDaemon(t, f, {
|
|
38
|
+
launchPath: gen.launchPath,
|
|
39
|
+
data,
|
|
40
|
+
workspace: f.workA,
|
|
41
|
+
env: { AGENT_LOCAL_DIR: local, AGENT_DRY_RUN: '1', AGENT_MANAGED_DIR: t.at('live-managed') },
|
|
42
|
+
});
|
|
29
43
|
const viewers = [];
|
|
30
44
|
const view = async (attach, cols = 100) => {
|
|
31
45
|
const v = await openViewer(attach, { cols });
|
|
@@ -49,9 +63,13 @@ export const liveProjectsSuite = {
|
|
|
49
63
|
if (notRunning.length > 0)
|
|
50
64
|
return;
|
|
51
65
|
t.equal([a1.project, b1.project, b2.project], ['work-a', 'projB', 'projB'], 'each session knows its project');
|
|
52
|
-
const log = fs
|
|
66
|
+
const log = fs
|
|
67
|
+
.readdirSync(path.join(data, 'logs'))
|
|
68
|
+
.filter((n) => n.startsWith('daemon'))
|
|
69
|
+
.map((n) => fs.readFileSync(path.join(data, 'logs', n), 'utf8'))
|
|
70
|
+
.join('\n');
|
|
53
71
|
t.equal((log.match(/Project projB: setting up/g) ?? []).length, 1, 'two sessions for the same new project at once share one setup (no second provisioning run)');
|
|
54
|
-
t.equal(readJsonFile(path.join(daemon.run, 'projects', 'projB.json'))?.phase, 'ready',
|
|
72
|
+
t.equal(readJsonFile(path.join(daemon.run, 'projects', 'projB.json'))?.phase, 'ready', "the project's setup status is written for the host (sandbox status)");
|
|
55
73
|
t.section('live: each session has its own folder and environment');
|
|
56
74
|
const views = await Promise.all(all.map((s) => view(s.attach)));
|
|
57
75
|
for (const v of views)
|
|
@@ -59,13 +77,13 @@ export const liveProjectsSuite = {
|
|
|
59
77
|
for (const v of views)
|
|
60
78
|
v.type('echo P=%AGENT_PROJECT% W=%AGENT_WORKSPACE% B=[%LIVE_B%]');
|
|
61
79
|
const bSees = await sees(t, views[2], 'P=projB W=' + projB + ' B=[b-env]');
|
|
62
|
-
t.check(Boolean(bSees),
|
|
63
|
-
t.check(Boolean(await sees(t, views[3], 'B=[b-env]')),
|
|
80
|
+
t.check(Boolean(bSees), "B's first session runs with B's workspace, project and variables", tail(views[2].output()));
|
|
81
|
+
t.check(Boolean(await sees(t, views[3], 'B=[b-env]')), "B's second session runs with B's variables", tail(views[3].output()));
|
|
64
82
|
// (The daemon here runs without the boot's environment, so A's own AGENT_* variables are not set at all.)
|
|
65
|
-
t.check(Boolean(await sees(t, views[0], 'B=[%LIVE_B%]')),
|
|
66
|
-
t.check(Boolean(await sees(t, views[1], 'B=[%LIVE_B%]')),
|
|
83
|
+
t.check(Boolean(await sees(t, views[0], 'B=[%LIVE_B%]')), "A's first session is untouched by B (B's variables never reach it)", tail(views[0].output()));
|
|
84
|
+
t.check(Boolean(await sees(t, views[1], 'B=[%LIVE_B%]')), "A's second session is untouched by B", tail(views[1].output()));
|
|
67
85
|
views[2].type('echo CWD=%CD%.');
|
|
68
|
-
t.check(Boolean(await sees(t, views[2], 'CWD=' + projB + '.')),
|
|
86
|
+
t.check(Boolean(await sees(t, views[2], 'CWD=' + projB + '.')), "B's session starts in B's folder", tail(views[2].output()));
|
|
69
87
|
t.section('live: several viewers on one session');
|
|
70
88
|
const second = await view(b1.attach, 60);
|
|
71
89
|
const two = await viewersWhen(t, b1.attach, (v) => v.viewers === 2);
|
|
@@ -91,9 +109,16 @@ export const liveProjectsSuite = {
|
|
|
91
109
|
daemon.request({ kind: 'exec', id: 'xb', command: ['echo', '%LIVE_B%'], cwd: projB, timeoutSeconds: 30 });
|
|
92
110
|
daemon.request({ kind: 'exec', id: 'xa', command: ['echo', '[%LIVE_B%]'], cwd: f.workA, timeoutSeconds: 30 });
|
|
93
111
|
const [xb, xa] = await Promise.all([daemon.response('xb'), daemon.response('xa')]);
|
|
94
|
-
t.check(Boolean(xb?.stdout?.includes('b-env')),
|
|
95
|
-
t.check(Boolean(xa?.stdout?.includes('[%LIVE_B%]')),
|
|
96
|
-
daemon.request({
|
|
112
|
+
t.check(Boolean(xb?.stdout?.includes('b-env')), "exec in B's folder gets B's environment", JSON.stringify(xb));
|
|
113
|
+
t.check(Boolean(xa?.stdout?.includes('[%LIVE_B%]')), "exec in A's folder gets A's", JSON.stringify(xa));
|
|
114
|
+
daemon.request({
|
|
115
|
+
kind: 'session',
|
|
116
|
+
id: 'bad1',
|
|
117
|
+
harness: 'claude',
|
|
118
|
+
args: [],
|
|
119
|
+
cwd: f.workB,
|
|
120
|
+
project: { ...spec, name: 'outside', workspace: f.workB },
|
|
121
|
+
});
|
|
97
122
|
const bad = await daemon.started('bad1');
|
|
98
123
|
t.check(bad?.phase === 'failed' && bad.message.includes('not visible inside the sandbox'), 'a project outside the launch folder, the roots and C:\\Projects is refused', JSON.stringify(bad));
|
|
99
124
|
daemon.request({ kind: 'session', id: 'bad2', harness: 'claude', args: [], cwd: f.workA, project: spec });
|
|
@@ -102,8 +127,8 @@ export const liveProjectsSuite = {
|
|
|
102
127
|
daemon.request({ kind: 'restart', id: 'rb', harness: null, cwd: projB });
|
|
103
128
|
t.equal((await daemon.response('rb'))?.message, 'restarted 2 session(s)', 'restart scoped to a project restarts only its sessions');
|
|
104
129
|
t.check(fs.existsSync(path.join(local, 'projects', 'projB', 'shell.cmd')), 'sbx-shell projB has a shell script');
|
|
105
|
-
t.includes(fs.readFileSync(path.join(local, 'projects', 'projB', 'env.cmd'), 'utf8'), 'LIVE_B=b-env',
|
|
106
|
-
t.check(fs.existsSync(path.join(local, 'bin', 'sbx-shell.cmd')),
|
|
130
|
+
t.includes(fs.readFileSync(path.join(local, 'projects', 'projB', 'env.cmd'), 'utf8'), 'LIVE_B=b-env', "sbx-shell projB opens with B's environment");
|
|
131
|
+
t.check(fs.existsSync(path.join(local, 'bin', 'sbx-shell.cmd')), "sbx-shell is on the sandbox's PATH");
|
|
107
132
|
}
|
|
108
133
|
finally {
|
|
109
134
|
for (const v of viewers)
|
|
@@ -119,7 +144,9 @@ export const liveProjectsSuite = {
|
|
|
119
144
|
await t.waitFor(() => v.exitCode() !== null, 10000);
|
|
120
145
|
v.close();
|
|
121
146
|
}
|
|
122
|
-
catch {
|
|
147
|
+
catch {
|
|
148
|
+
/* already gone */
|
|
149
|
+
}
|
|
123
150
|
}
|
|
124
151
|
await daemon.stop();
|
|
125
152
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { Suite } from './suite.js';
|
|
1
|
+
import type { Suite } from './support/suite.js';
|
|
2
2
|
export declare const liveTerminalSuite: Suite;
|
|
@@ -9,8 +9,8 @@ import net from 'node:net';
|
|
|
9
9
|
import path from 'node:path';
|
|
10
10
|
import { spawn, spawnSync } from 'node:child_process';
|
|
11
11
|
import { pathToFileURL } from 'node:url';
|
|
12
|
-
import { encodeFrame, FrameType } from '../shared/pty
|
|
13
|
-
import { CSC, openViewer, tail, WAIT } from './live.js';
|
|
12
|
+
import { encodeFrame, FrameType } from '../shared/pty/index.js';
|
|
13
|
+
import { CSC, openViewer, tail, WAIT } from './support/live.js';
|
|
14
14
|
/** The stand-in agent: VT input and SGR mouse tracking on, echoes what it reads ("got <1b>[<0;10;5M"). L prints 500 lines, K clears the screen, q quits. */
|
|
15
15
|
const AGENT_CS = String.raw `
|
|
16
16
|
using System;
|
|
@@ -50,11 +50,19 @@ static class MouseAgent
|
|
|
50
50
|
const freePort = () => new Promise((resolve, reject) => {
|
|
51
51
|
const server = net.createServer();
|
|
52
52
|
server.on('error', reject);
|
|
53
|
-
server.listen(0, '127.0.0.1', () => {
|
|
53
|
+
server.listen(0, '127.0.0.1', () => {
|
|
54
|
+
const port = server.address().port;
|
|
55
|
+
server.close(() => resolve(port));
|
|
56
|
+
});
|
|
54
57
|
});
|
|
55
58
|
const compile = (source, exe) => {
|
|
56
|
-
const result = spawnSync(CSC, ['/nologo', '/optimize', '/target:exe', '/out:' + exe, source], {
|
|
57
|
-
|
|
59
|
+
const result = spawnSync(CSC, ['/nologo', '/optimize', '/target:exe', '/out:' + exe, source], {
|
|
60
|
+
encoding: 'utf8',
|
|
61
|
+
windowsHide: true,
|
|
62
|
+
});
|
|
63
|
+
return result.status === 0
|
|
64
|
+
? ''
|
|
65
|
+
: ((result.stdout ?? '') + (result.stderr ?? '')).trim().slice(0, 1500) || 'csc failed';
|
|
58
66
|
};
|
|
59
67
|
/** conpty.dll as a sandbox has it (C:\AgentData\tools\conpty), when this machine has one; else only Windows' own is tested. */
|
|
60
68
|
const conptyDll = () => {
|
|
@@ -76,7 +84,9 @@ export const liveTerminalSuite = {
|
|
|
76
84
|
return;
|
|
77
85
|
const client = t.at('client.mjs');
|
|
78
86
|
fs.writeFileSync(client, [
|
|
79
|
-
'import { connect, runTerminalClient } from ' +
|
|
87
|
+
'import { connect, runTerminalClient } from ' +
|
|
88
|
+
JSON.stringify(pathToFileURL(path.join(t.packageRoot, 'dist', 'shared', 'pty', 'index.js')).href) +
|
|
89
|
+
';',
|
|
80
90
|
'const socket = await connect({ addresses: ["127.0.0.1"], port: Number(process.argv[2]), token: "tok" });',
|
|
81
91
|
'const result = await runTerminalClient(socket, "tok");',
|
|
82
92
|
'console.log("CLIENT-DONE " + result.reason);',
|
|
@@ -84,9 +94,9 @@ export const liveTerminalSuite = {
|
|
|
84
94
|
const dll = conptyDll();
|
|
85
95
|
const kinds = dll ? [dll, null] : [null];
|
|
86
96
|
if (!dll)
|
|
87
|
-
t.skip(
|
|
97
|
+
t.skip("conpty.dll not found on this machine: only Windows' own pseudo console is tested");
|
|
88
98
|
for (const kind of kinds) {
|
|
89
|
-
const label = kind ? 'conpty.dll' :
|
|
99
|
+
const label = kind ? 'conpty.dll' : "Windows' pseudo console";
|
|
90
100
|
t.section('live terminal (' + label + ')');
|
|
91
101
|
const children = [];
|
|
92
102
|
const viewers = [];
|
|
@@ -95,7 +105,11 @@ export const liveTerminalSuite = {
|
|
|
95
105
|
delete env.PTYHOST_CONPTY;
|
|
96
106
|
if (kind)
|
|
97
107
|
env.PTYHOST_CONPTY = kind;
|
|
98
|
-
children.push(spawn(ptyhost, [String(port), 'tok', '100', '30', t.at(log), command], {
|
|
108
|
+
children.push(spawn(ptyhost, [String(port), 'tok', '100', '30', t.at(log), command], {
|
|
109
|
+
env,
|
|
110
|
+
stdio: 'ignore',
|
|
111
|
+
windowsHide: true,
|
|
112
|
+
}));
|
|
99
113
|
};
|
|
100
114
|
try {
|
|
101
115
|
const innerPort = await freePort();
|
|
@@ -106,15 +120,20 @@ export const liveTerminalSuite = {
|
|
|
106
120
|
const terminal = await openViewer({ addresses: ['127.0.0.1'], port: outerPort, token: 'tok' });
|
|
107
121
|
viewers.push(terminal);
|
|
108
122
|
const screen = () => terminal.output();
|
|
109
|
-
const send = (text) => {
|
|
123
|
+
const send = (text) => {
|
|
124
|
+
terminal.socket.write(encodeFrame(FrameType.Input, Buffer.from(text, 'latin1')));
|
|
125
|
+
};
|
|
110
126
|
const ready = await t.waitFor(() => screen().includes('AGENT-READY'), WAIT.screen);
|
|
111
127
|
t.check(Boolean(ready), 'the client shows the agent', 'screen: ' + tail(screen()));
|
|
112
128
|
if (!ready)
|
|
113
129
|
continue;
|
|
114
130
|
// The client switches its console to pass the terminal's input through as it is; until then clicks are lost.
|
|
115
131
|
const click = '\x1b[<0;10;5M\x1b[<0;10;5m';
|
|
116
|
-
const clicked = await t.waitFor(() => {
|
|
117
|
-
|
|
132
|
+
const clicked = await t.waitFor(() => {
|
|
133
|
+
if (!screen().includes('got <1b>[<0;10;5M'))
|
|
134
|
+
send(click);
|
|
135
|
+
return screen().includes('got <1b>[<0;10;5M');
|
|
136
|
+
}, WAIT.screen, 1000);
|
|
118
137
|
t.check(Boolean(clicked), 'a mouse click in the terminal reaches the agent (SGR mouse report)', 'screen: ' + tail(screen(), 800));
|
|
119
138
|
const mark = screen().length;
|
|
120
139
|
const after = () => screen().slice(mark);
|
|
@@ -133,11 +152,18 @@ export const liveTerminalSuite = {
|
|
|
133
152
|
const done = await t.waitFor(() => screen().includes('LINES-DONE'), WAIT.screen);
|
|
134
153
|
const printed = screen().slice(before);
|
|
135
154
|
const seen = new Set([...printed.matchAll(/line (\d+)\b/g)].map((m) => Number(m[1])));
|
|
136
|
-
const missing = Array.from({ length: 500 }, (_, i) => i + 1)
|
|
155
|
+
const missing = Array.from({ length: 500 }, (_, i) => i + 1)
|
|
156
|
+
.filter((n) => !seen.has(n))
|
|
157
|
+
.map((n) => 'line ' + n);
|
|
137
158
|
t.check(Boolean(done) && missing.length === 0, 'all 500 printed lines reach the terminal as lines', 'missing: ' + missing.slice(0, 10).join(', ') + '\n' + tail(printed));
|
|
138
159
|
// (The client clears the tab once when it starts; from then on nothing may take the scrollback away.)
|
|
139
160
|
const session = screen().slice(screen().indexOf('AGENT-READY'));
|
|
140
|
-
for (const [sequence, what] of [
|
|
161
|
+
for (const [sequence, what] of [
|
|
162
|
+
['\x1b[?1049h', 'alternate screen'],
|
|
163
|
+
['\x1b[?47h', 'alternate screen (47)'],
|
|
164
|
+
['\x1b[?1047h', 'alternate screen (1047)'],
|
|
165
|
+
['\x1b[3J', 'clear scrollback'],
|
|
166
|
+
]) {
|
|
141
167
|
t.excludes(session, sequence, 'the terminal is never sent ' + what + ' (' + JSON.stringify(sequence) + ')');
|
|
142
168
|
}
|
|
143
169
|
if (kind) {
|
|
@@ -148,7 +174,7 @@ export const liveTerminalSuite = {
|
|
|
148
174
|
viewers.push(late);
|
|
149
175
|
await t.waitFor(() => late.output().includes('CLEARED'), WAIT.screen);
|
|
150
176
|
const head = late.output().slice(0, late.output().indexOf('CLEARED'));
|
|
151
|
-
t.check(head.includes('\x1b[?1000h') && head.includes('\x1b[?1006h'),
|
|
177
|
+
t.check(head.includes('\x1b[?1000h') && head.includes('\x1b[?1006h'), "a viewer joining after a screen clear gets the agent's mouse tracking before the replay", 'late viewer: ' + JSON.stringify(late.output().slice(0, 300)));
|
|
152
178
|
late.close();
|
|
153
179
|
}
|
|
154
180
|
send('q');
|