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
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import { writeJsonAtomic } from '../../shared/io/index.js';
|
|
3
|
+
export const ensureDir = (p) => {
|
|
4
|
+
fs.mkdirSync(p, { recursive: true });
|
|
5
|
+
};
|
|
6
|
+
export const dirExists = (p) => {
|
|
7
|
+
try {
|
|
8
|
+
return fs.statSync(p).isDirectory();
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
export const fileExists = (p) => {
|
|
15
|
+
try {
|
|
16
|
+
return fs.statSync(p).isFile();
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
export const readJson = (p) => JSON.parse(fs.readFileSync(p, 'utf8').replace(/^\uFEFF/, ''));
|
|
23
|
+
export const tryReadJson = (p) => {
|
|
24
|
+
try {
|
|
25
|
+
return readJson(p);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
/** Atomic (a crash or a second command never leaves half a file); refused outside temp during the self-test. */
|
|
32
|
+
export const writeJson = (p, value) => writeJsonAtomic(p, value);
|
|
33
|
+
export const realPath = (p) => {
|
|
34
|
+
try {
|
|
35
|
+
return fs.realpathSync(p);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return p;
|
|
39
|
+
}
|
|
40
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { isWin, sleep, runPowerShell, captureOutput, runPowerShellAsync } from './process.js';
|
|
2
|
+
export { UserError, fail, errMsg } from './errors.js';
|
|
3
|
+
export { parseJsonc, readJsonc } from './jsonc.js';
|
|
4
|
+
export { ensureDir, dirExists, fileExists, readJson, tryReadJson, writeJson, realPath } from './fs.js';
|
|
5
|
+
export { xmlEscape, safeText, plainText } from './text.js';
|
|
6
|
+
export { homeDir, expandPath, isRootPath, isUserProfile, isInsideOrEqual, findOnPath } from './paths.js';
|
|
7
|
+
export { isLink, removeLink, assertNoLinks } from './links.js';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { isWin, sleep, runPowerShell, captureOutput, runPowerShellAsync } from './process.js';
|
|
2
|
+
export { UserError, fail, errMsg } from './errors.js';
|
|
3
|
+
export { parseJsonc, readJsonc } from './jsonc.js';
|
|
4
|
+
export { ensureDir, dirExists, fileExists, readJson, tryReadJson, writeJson, realPath } from './fs.js';
|
|
5
|
+
export { xmlEscape, safeText, plainText } from './text.js';
|
|
6
|
+
export { homeDir, expandPath, isRootPath, isUserProfile, isInsideOrEqual, findOnPath } from './paths.js';
|
|
7
|
+
export { isLink, removeLink, assertNoLinks } from './links.js';
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parses JSON with comments and trailing commas (JSONC, like VS Code's settings.json). Errors name the file, line
|
|
3
|
+
* and column, and say what to fix.
|
|
4
|
+
*/
|
|
5
|
+
export declare const parseJsonc: <T>(text: string, source: string) => T;
|
|
6
|
+
export declare const readJsonc: <T>(file: string) => T;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import { parse as parseJsoncText, printParseErrorCode } from 'jsonc-parser';
|
|
3
|
+
import { fail } from './errors.js';
|
|
4
|
+
/**
|
|
5
|
+
* Parses JSON with comments and trailing commas (JSONC, like VS Code's settings.json). Errors name the file, line
|
|
6
|
+
* and column, and say what to fix.
|
|
7
|
+
*/
|
|
8
|
+
export const parseJsonc = (text, source) => {
|
|
9
|
+
const errors = [];
|
|
10
|
+
const value = parseJsoncText(text.replace(/^/, ''), errors, { allowTrailingComma: true, disallowComments: false });
|
|
11
|
+
if (errors.length) {
|
|
12
|
+
const { offset, error } = errors[0];
|
|
13
|
+
const before = text.slice(0, offset).split(/\r?\n/);
|
|
14
|
+
fail(source +
|
|
15
|
+
' is not valid JSON (line ' +
|
|
16
|
+
before.length +
|
|
17
|
+
', column ' +
|
|
18
|
+
(before[before.length - 1].length + 1) +
|
|
19
|
+
': ' +
|
|
20
|
+
printParseErrorCode(error) +
|
|
21
|
+
').', 'Fix that spot in the file. Comments (// and /* */) and trailing commas are fine.');
|
|
22
|
+
}
|
|
23
|
+
return value;
|
|
24
|
+
};
|
|
25
|
+
export const readJsonc = (file) => parseJsonc(fs.readFileSync(file, 'utf8'), file);
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** True if `p` itself is a symlink or junction (lstat; never follows it). */
|
|
2
|
+
export declare const isLink: (p: string) => boolean;
|
|
3
|
+
/** Removes a symlink or junction itself (never its target). Junctions need rmdir on Windows. */
|
|
4
|
+
export declare const removeLink: (p: string) => void;
|
|
5
|
+
/**
|
|
6
|
+
* The sandbox can write anywhere in its data folder, so it could swap a folder for a junction that points at this
|
|
7
|
+
* PC's own disk. Before the host reads, writes or deletes anything under `root`, every existing path component from
|
|
8
|
+
* `root` down to `target` must be a plain folder/file. Throws otherwise.
|
|
9
|
+
*/
|
|
10
|
+
export declare const assertNoLinks: (root: string, target: string) => void;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { assertTestWritable } from '../../shared/test-guard.js';
|
|
4
|
+
import { fail } from './errors.js';
|
|
5
|
+
/** True if `p` itself is a symlink or junction (lstat; never follows it). */
|
|
6
|
+
export const isLink = (p) => {
|
|
7
|
+
try {
|
|
8
|
+
return fs.lstatSync(p).isSymbolicLink();
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
/** Removes a symlink or junction itself (never its target). Junctions need rmdir on Windows. */
|
|
15
|
+
export const removeLink = (p) => {
|
|
16
|
+
assertTestWritable(p);
|
|
17
|
+
try {
|
|
18
|
+
fs.unlinkSync(p);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
fs.rmdirSync(p);
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* The sandbox can write anywhere in its data folder, so it could swap a folder for a junction that points at this
|
|
26
|
+
* PC's own disk. Before the host reads, writes or deletes anything under `root`, every existing path component from
|
|
27
|
+
* `root` down to `target` must be a plain folder/file. Throws otherwise.
|
|
28
|
+
*/
|
|
29
|
+
export const assertNoLinks = (root, target) => {
|
|
30
|
+
const rel = path.relative(path.resolve(root), path.resolve(target));
|
|
31
|
+
if (rel.startsWith('..') || path.isAbsolute(rel))
|
|
32
|
+
fail('Refusing to touch ' + target + ': it is outside ' + root);
|
|
33
|
+
let current = path.resolve(root);
|
|
34
|
+
for (const part of ['', ...rel.split(path.sep).filter(Boolean)]) {
|
|
35
|
+
current = part ? path.join(current, part) : current;
|
|
36
|
+
if (isLink(current))
|
|
37
|
+
fail('Refusing to touch ' + target + ': ' + current + ' is a link (possible escape attempt from the sandbox).');
|
|
38
|
+
}
|
|
39
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const homeDir: () => string;
|
|
2
|
+
/** Expands %VAR% and resolves relative paths against `base`. */
|
|
3
|
+
export declare const expandPath: (input: string, base: string) => string;
|
|
4
|
+
export declare const isRootPath: (p: string) => boolean;
|
|
5
|
+
export declare const isUserProfile: (p: string) => boolean;
|
|
6
|
+
export declare const isInsideOrEqual: (parent: string, child: string) => boolean;
|
|
7
|
+
export declare const findOnPath: (names: string[]) => string | null;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import os from 'node:os';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { fileExists } from './fs.js';
|
|
4
|
+
export const homeDir = () => process.env.USERPROFILE ?? os.homedir();
|
|
5
|
+
/** Expands %VAR% and resolves relative paths against `base`. */
|
|
6
|
+
export const expandPath = (input, base) => {
|
|
7
|
+
const expanded = input
|
|
8
|
+
.replace(/%([^%]+)%/g, (_m, name) => process.env[name] ?? '%' + name + '%')
|
|
9
|
+
.replace(/^~(?=$|[\\/])/, homeDir());
|
|
10
|
+
return path.resolve(path.isAbsolute(expanded) ? expanded : path.join(base, expanded));
|
|
11
|
+
};
|
|
12
|
+
export const isRootPath = (p) => {
|
|
13
|
+
const n = path.resolve(p);
|
|
14
|
+
return n.toLowerCase() === path.parse(n).root.toLowerCase();
|
|
15
|
+
};
|
|
16
|
+
export const isUserProfile = (p) => {
|
|
17
|
+
const profile = process.env.USERPROFILE ?? process.env.HOME ?? '';
|
|
18
|
+
return profile !== '' && path.resolve(p).toLowerCase() === path.resolve(profile).toLowerCase();
|
|
19
|
+
};
|
|
20
|
+
export const isInsideOrEqual = (parent, child) => {
|
|
21
|
+
const rel = path.relative(path.resolve(parent).toLowerCase(), path.resolve(child).toLowerCase());
|
|
22
|
+
return rel === '' || (!rel.startsWith('..') && !path.isAbsolute(rel));
|
|
23
|
+
};
|
|
24
|
+
export const findOnPath = (names) => {
|
|
25
|
+
const dirs = (process.env.PATH ?? process.env.Path ?? '').split(path.delimiter).filter((d) => d !== '');
|
|
26
|
+
for (const name of names)
|
|
27
|
+
for (const dir of dirs) {
|
|
28
|
+
const candidate = path.join(dir, name);
|
|
29
|
+
if (fileExists(candidate))
|
|
30
|
+
return candidate;
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare const isWin: boolean;
|
|
2
|
+
export declare const sleep: (ms: number) => Promise<void>;
|
|
3
|
+
/** Runs a PowerShell script and returns its exit code (and stdout when `capture`). */
|
|
4
|
+
export declare const runPowerShell: (script: string, capture?: boolean) => {
|
|
5
|
+
status: number;
|
|
6
|
+
stdout: string;
|
|
7
|
+
};
|
|
8
|
+
/** Runs a program (an absolute path: `SYSTEM.*`, never a bare name) and returns its stdout, or '' if it failed or timed out. */
|
|
9
|
+
export declare const captureOutput: (file: string, args: string[], options?: {
|
|
10
|
+
timeout?: number;
|
|
11
|
+
cwd?: string;
|
|
12
|
+
maxBuffer?: number;
|
|
13
|
+
}) => string;
|
|
14
|
+
/** Async variant (does not block the event loop), resolving with stdout. */
|
|
15
|
+
export declare const runPowerShellAsync: (script: string) => Promise<string>;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { spawn, spawnSync } from 'node:child_process';
|
|
2
|
+
import { SYSTEM } from '../../shared/system.js';
|
|
3
|
+
export const isWin = process.platform === 'win32';
|
|
4
|
+
export const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
5
|
+
/**
|
|
6
|
+
* PowerShell arguments for a script passed encoded (no quoting issues, no progress-bar noise on stderr). Output is
|
|
7
|
+
* UTF-8: Windows PowerShell 5.1 otherwise writes redirected stdout in the OEM code page, mangling non-ASCII (regional
|
|
8
|
+
* date formats, wallpaper paths). UTF8Encoding($false): no byte-order mark in front of the output.
|
|
9
|
+
*/
|
|
10
|
+
const powerShellArgs = (script) => {
|
|
11
|
+
const prelude = "[Console]::OutputEncoding = New-Object System.Text.UTF8Encoding $false\n$ProgressPreference = 'SilentlyContinue'\n";
|
|
12
|
+
const encoded = Buffer.from(prelude + script, 'utf16le').toString('base64');
|
|
13
|
+
// -OutputFormat Text: with redirected output PowerShell would otherwise print its progress stream as "#< CLIXML" XML.
|
|
14
|
+
return [
|
|
15
|
+
'-NoLogo',
|
|
16
|
+
'-NoProfile',
|
|
17
|
+
'-NonInteractive',
|
|
18
|
+
'-OutputFormat',
|
|
19
|
+
'Text',
|
|
20
|
+
'-ExecutionPolicy',
|
|
21
|
+
'Bypass',
|
|
22
|
+
'-EncodedCommand',
|
|
23
|
+
encoded,
|
|
24
|
+
];
|
|
25
|
+
};
|
|
26
|
+
/** Runs a PowerShell script and returns its exit code (and stdout when `capture`). */
|
|
27
|
+
export const runPowerShell = (script, capture = false) => {
|
|
28
|
+
const result = spawnSync(SYSTEM.powershell(), powerShellArgs(script), {
|
|
29
|
+
stdio: capture ? ['ignore', 'pipe', 'inherit'] : 'inherit',
|
|
30
|
+
encoding: 'utf8',
|
|
31
|
+
windowsHide: true,
|
|
32
|
+
});
|
|
33
|
+
if (result.error)
|
|
34
|
+
throw result.error;
|
|
35
|
+
return { status: result.status ?? 1, stdout: result.stdout ?? '' };
|
|
36
|
+
};
|
|
37
|
+
/** Runs a program (an absolute path: `SYSTEM.*`, never a bare name) and returns its stdout, or '' if it failed or timed out. */
|
|
38
|
+
export const captureOutput = (file, args, options = {}) => {
|
|
39
|
+
const result = spawnSync(file, args, { encoding: 'utf8', windowsHide: true, timeout: 60000, ...options });
|
|
40
|
+
return result.status === 0 ? (result.stdout ?? '') : '';
|
|
41
|
+
};
|
|
42
|
+
/** Async variant (does not block the event loop), resolving with stdout. */
|
|
43
|
+
export const runPowerShellAsync = (script) => new Promise((resolve, reject) => {
|
|
44
|
+
const child = spawn(SYSTEM.powershell(), powerShellArgs(script), {
|
|
45
|
+
stdio: ['ignore', 'pipe', 'inherit'],
|
|
46
|
+
windowsHide: true,
|
|
47
|
+
});
|
|
48
|
+
let out = '';
|
|
49
|
+
child.stdout.on('data', (d) => {
|
|
50
|
+
out += d.toString('utf8');
|
|
51
|
+
});
|
|
52
|
+
child.on('error', reject);
|
|
53
|
+
child.on('close', () => resolve(out));
|
|
54
|
+
});
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const xmlEscape: (v: string) => string;
|
|
2
|
+
/**
|
|
3
|
+
* Text that came from the sandbox, made safe to print: control characters and escape sequences are removed except
|
|
4
|
+
* plain colours (SGR), so nothing written by the sandbox can drive your terminal (titles, clipboard, cursor tricks).
|
|
5
|
+
*/
|
|
6
|
+
export declare const safeText: (text: string) => string;
|
|
7
|
+
/** safeText without colours either: for text you are asked to approve, which must not be able to hide parts of itself. */
|
|
8
|
+
export declare const plainText: (text: string) => string;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export const xmlEscape = (v) => v.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/'/g, ''');
|
|
2
|
+
/**
|
|
3
|
+
* Text that came from the sandbox, made safe to print: control characters and escape sequences are removed except
|
|
4
|
+
* plain colours (SGR), so nothing written by the sandbox can drive your terminal (titles, clipboard, cursor tricks).
|
|
5
|
+
*/
|
|
6
|
+
export const safeText = (text) => text.replace(/\x1b\[[0-9;]*m|\x1b(\[[0-9;?]*[ -\/]*[@-~]|\][^\x07\x1b]*(\x07|\x1b\\)|[@-Z\\-_])|[\x00-\x08\x0b-\x1f\x7f-\x9f]/g, (m) => (/^\x1b\[[0-9;]*m$/.test(m) ? m : ''));
|
|
7
|
+
/** safeText without colours either: for text you are asked to approve, which must not be able to hide parts of itself. */
|
|
8
|
+
export const plainText = (text) => safeText(text).replace(/\x1b\[[0-9;]*m/g, '');
|
|
@@ -3,11 +3,20 @@ import fs from 'node:fs';
|
|
|
3
3
|
import path from 'node:path';
|
|
4
4
|
import { SYSTEM } from '../../shared/system.js';
|
|
5
5
|
import { uvVars } from '../toolchains/runtimes.js';
|
|
6
|
-
import { dryRun,
|
|
6
|
+
import { dryRun, hostToolsDir, isWin, toolsDir } from '../runtime/paths.js';
|
|
7
|
+
import { execAsync } from '../runtime/process.js';
|
|
8
|
+
import { exists, mkdirp } from '../runtime/fs.js';
|
|
9
|
+
import { log, warn } from '../runtime/log.js';
|
|
10
|
+
import { session } from '../runtime/session.js';
|
|
11
|
+
import { addMachineEnvironment } from '../setup/environment.js';
|
|
7
12
|
const harnessPaths = (name, harness) => {
|
|
8
13
|
const dir = path.join(toolsDir, 'agents', name);
|
|
9
14
|
const exe = harness.hostExecutable ?? (harness.uvBin ? harness.uvBin + '.exe' : null);
|
|
10
|
-
return {
|
|
15
|
+
return {
|
|
16
|
+
dir,
|
|
17
|
+
exe: exe ? path.join(dir, exe) : null,
|
|
18
|
+
cmd: harness.npmBin ? path.join(dir, harness.npmBin + '.cmd') : null,
|
|
19
|
+
};
|
|
11
20
|
};
|
|
12
21
|
/** npm install with the runner's own npm into tools\agents\<name> (no global state outside persistent storage). */
|
|
13
22
|
const installViaNpm = async (name, harness, dir, env) => {
|
|
@@ -34,7 +43,9 @@ const installViaUv = async (name, harness, dir, env) => {
|
|
|
34
43
|
}
|
|
35
44
|
if (!exists(uv))
|
|
36
45
|
throw new Error(name + ' is installed with uv; enable toolchains.uv');
|
|
37
|
-
await execAsync(uv, ['tool', 'install', '--force', '--python', '3.12', harness.uvPackage], {
|
|
46
|
+
await execAsync(uv, ['tool', 'install', '--force', '--python', '3.12', harness.uvPackage], {
|
|
47
|
+
env: { ...env, ...uvVars(), UV_TOOL_BIN_DIR: dir },
|
|
48
|
+
});
|
|
38
49
|
};
|
|
39
50
|
/** One install per agent at a time: two sessions asking for a new agent at once share the first one's install. */
|
|
40
51
|
const installing = new Map();
|
|
@@ -46,10 +57,19 @@ export const provisionHarness = (name, harness, env, refresh = session.provision
|
|
|
46
57
|
const current = installing.get(name);
|
|
47
58
|
if (current)
|
|
48
59
|
return current;
|
|
49
|
-
const work = installHarness(name, harness, env, refresh)
|
|
60
|
+
const work = installHarness(name, harness, env, refresh)
|
|
61
|
+
.then(() => onPath(harnessPaths(name, harness).dir, env))
|
|
62
|
+
.finally(() => installing.delete(name));
|
|
50
63
|
installing.set(name, work);
|
|
51
64
|
return work;
|
|
52
65
|
};
|
|
66
|
+
/** The agent's folder at the end of PATH: `claude` (or `codex` ...) works in every new terminal tab and in sessions. */
|
|
67
|
+
const onPath = (dir, env) => {
|
|
68
|
+
const parts = (env.PATH ?? '').split(path.delimiter);
|
|
69
|
+
if (!parts.some((p) => p.toLowerCase() === dir.toLowerCase()))
|
|
70
|
+
env.PATH = [...parts, dir].join(path.delimiter);
|
|
71
|
+
addMachineEnvironment({}, [dir], true);
|
|
72
|
+
};
|
|
53
73
|
const installHarness = async (name, harness, env, refresh) => {
|
|
54
74
|
const p = harnessPaths(name, harness);
|
|
55
75
|
const cached = (p.exe !== null && exists(p.exe)) || (p.cmd !== null && exists(p.cmd));
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { SYSTEM } from '../../shared/system.js';
|
|
4
|
+
import { execAsync } from '../runtime/process.js';
|
|
5
|
+
import { exists, mkdirp } from '../runtime/fs.js';
|
|
6
|
+
import { arch, tool } from '../toolchains/tool-env.js';
|
|
7
|
+
/** The Sysinternals tools whose EULA is accepted up front (each asks once otherwise). */
|
|
8
|
+
const SYSINTERNALS_TOOLS = [
|
|
9
|
+
'Process Explorer',
|
|
10
|
+
'Process Monitor',
|
|
11
|
+
'Autoruns',
|
|
12
|
+
'TCPView',
|
|
13
|
+
'PsExec',
|
|
14
|
+
'PsList',
|
|
15
|
+
'PsKill',
|
|
16
|
+
'Handle',
|
|
17
|
+
'ListDLLs',
|
|
18
|
+
'Sigcheck',
|
|
19
|
+
'Strings',
|
|
20
|
+
'VMMap',
|
|
21
|
+
'RAMMap',
|
|
22
|
+
'DebugView',
|
|
23
|
+
'Disk2vhd',
|
|
24
|
+
'Du',
|
|
25
|
+
'ZoomIt',
|
|
26
|
+
];
|
|
27
|
+
/** Settings an app needs on every boot (the sandbox's registry is new each time), and files next to its program. */
|
|
28
|
+
export async function afterInstall(entry, exe) {
|
|
29
|
+
const dir = path.dirname(exe);
|
|
30
|
+
if (entry.needs?.includes('mesa')) {
|
|
31
|
+
const mesa = tool('mesa', arch === 'arm64' ? 'arm64' : 'x64');
|
|
32
|
+
for (const dll of ['opengl32.dll', 'libgallium_wgl.dll', 'dxil.dll']) {
|
|
33
|
+
if (exists(path.join(mesa, dll)) && !exists(path.join(dir, dll)))
|
|
34
|
+
fs.copyFileSync(path.join(mesa, dll), path.join(dir, dll));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// Godot and Sublime keep their settings next to the program instead of in the profile, which is wiped on close.
|
|
38
|
+
if (entry.id === 'godot' && !exists(path.join(dir, '._sc_')))
|
|
39
|
+
fs.writeFileSync(path.join(dir, '._sc_'), '');
|
|
40
|
+
if (entry.id === 'sublime')
|
|
41
|
+
mkdirp(path.join(dir, 'Data'));
|
|
42
|
+
if (entry.id === 'sysinternals') {
|
|
43
|
+
for (const name of SYSINTERNALS_TOOLS) {
|
|
44
|
+
await execAsync(SYSTEM.reg(), ['add', 'HKCU\\Software\\Sysinternals\\' + name, '/v', 'EulaAccepted', '/t', 'REG_DWORD', '/d', '1', '/f'], { stdio: 'ignore' }).catch(() => undefined);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Config, GitAccess } from '../../core/types.js';
|
|
2
|
+
import { type AppEntry } from '../../shared/apps/index.js';
|
|
3
|
+
import { type ToolEnv } from '../toolchains/tool-env.js';
|
|
4
|
+
export interface AppsOptions {
|
|
5
|
+
gitAccess: GitAccess;
|
|
6
|
+
refresh: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare class AppInstaller {
|
|
9
|
+
private readonly env;
|
|
10
|
+
private readonly options;
|
|
11
|
+
private readonly parallel;
|
|
12
|
+
private readonly gui;
|
|
13
|
+
private readonly installed;
|
|
14
|
+
constructor(env: ToolEnv, options: AppsOptions, parallel?: number);
|
|
15
|
+
/** Installs the entries (7-Zip first: the NSIS apps need it to unpack), then their shortcuts. */
|
|
16
|
+
installAll(entries: readonly AppEntry[]): Promise<void>;
|
|
17
|
+
private installOne;
|
|
18
|
+
/** Downloads and unpacks one entry into its folder (replaced in one step: never half there). */
|
|
19
|
+
private download;
|
|
20
|
+
}
|
|
21
|
+
/** Installs apps.install and apps.custom (skipped ones are listed in the summary). */
|
|
22
|
+
export declare function setupApps(env: ToolEnv, apps: Config['apps'], o: AppsOptions): Promise<void>;
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
// Installs the chosen apps into tools\apps, a few at a time, each once (a marker file says it is complete). One app
|
|
2
|
+
// failing is reported and never stops the others.
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { appsToInstall } from '../../shared/apps/index.js';
|
|
6
|
+
import { downloader, moveIntoPlace, stagingFolder } from '../../shared/download/index.js';
|
|
7
|
+
import { safeRemove } from '../../shared/io/safe-remove.js';
|
|
8
|
+
import { dryRun } from '../runtime/paths.js';
|
|
9
|
+
import { execAsync } from '../runtime/process.js';
|
|
10
|
+
import { exists, mkdirp } from '../runtime/fs.js';
|
|
11
|
+
import { log, warn } from '../runtime/log.js';
|
|
12
|
+
import { errMsg } from '../../core/util/errors.js';
|
|
13
|
+
import { tool } from '../toolchains/tool-env.js';
|
|
14
|
+
import { afterInstall } from './after-install.js';
|
|
15
|
+
import { findExe } from './find-exe.js';
|
|
16
|
+
import { shortcuts } from './shortcuts.js';
|
|
17
|
+
import { resolve } from './sources.js';
|
|
18
|
+
import { unpack } from './unpack.js';
|
|
19
|
+
const MARKER = '.agent-sandbox-app';
|
|
20
|
+
/** How many apps download and unpack at once (they are big: a few at a time keeps the disk and network busy). */
|
|
21
|
+
const PARALLEL = 3;
|
|
22
|
+
export class AppInstaller {
|
|
23
|
+
env;
|
|
24
|
+
options;
|
|
25
|
+
parallel;
|
|
26
|
+
gui = [];
|
|
27
|
+
installed = [];
|
|
28
|
+
constructor(env, options, parallel = PARALLEL) {
|
|
29
|
+
this.env = env;
|
|
30
|
+
this.options = options;
|
|
31
|
+
this.parallel = parallel;
|
|
32
|
+
}
|
|
33
|
+
/** Installs the entries (7-Zip first: the NSIS apps need it to unpack), then their shortcuts. */
|
|
34
|
+
async installAll(entries) {
|
|
35
|
+
const [first, rest] = entries[0]?.id === '7zip' ? [[entries[0]], entries.slice(1)] : [[], entries];
|
|
36
|
+
for (const e of first)
|
|
37
|
+
await this.installOne(e);
|
|
38
|
+
const queue = [...rest];
|
|
39
|
+
await Promise.all(Array.from({ length: Math.min(this.parallel, queue.length) }, async () => {
|
|
40
|
+
for (let e = queue.shift(); e; e = queue.shift())
|
|
41
|
+
await this.installOne(e);
|
|
42
|
+
}));
|
|
43
|
+
try {
|
|
44
|
+
shortcuts(this.gui);
|
|
45
|
+
}
|
|
46
|
+
catch (e) {
|
|
47
|
+
warn('App shortcuts could not be created: ' + errMsg(e));
|
|
48
|
+
}
|
|
49
|
+
if (this.installed.length)
|
|
50
|
+
this.env.summary.push('apps: ' + this.installed.join(', ') + ' (shortcuts on the desktop and in Start > Sandbox apps)');
|
|
51
|
+
}
|
|
52
|
+
async installOne(entry) {
|
|
53
|
+
try {
|
|
54
|
+
const dest = tool('apps', ...entry.id.split('/'));
|
|
55
|
+
if (!exists(path.join(dest, MARKER)) || this.options.refresh)
|
|
56
|
+
await this.download(entry, dest);
|
|
57
|
+
const exe = findExe(dest, entry.exe);
|
|
58
|
+
if (!exe)
|
|
59
|
+
throw new Error(entry.exe + ' not found in the download');
|
|
60
|
+
await afterInstall(entry, exe);
|
|
61
|
+
if (entry.cli || entry.id === 'sysinternals')
|
|
62
|
+
this.env.prepend.push(path.dirname(exe));
|
|
63
|
+
if (!entry.cli)
|
|
64
|
+
this.gui.push({ name: entry.name, exe });
|
|
65
|
+
this.installed.push(entry.name);
|
|
66
|
+
}
|
|
67
|
+
catch (e) {
|
|
68
|
+
warn(entry.name + ' could not be installed and is skipped; the other apps are not affected. Reason: ' + errMsg(e));
|
|
69
|
+
this.env.summary.push(entry.name + ': FAILED');
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/** Downloads and unpacks one entry into its folder (replaced in one step: never half there). */
|
|
73
|
+
async download(entry, dest) {
|
|
74
|
+
const work = stagingFolder(dest);
|
|
75
|
+
const out = path.join(work, 'out');
|
|
76
|
+
try {
|
|
77
|
+
if ('npm' in entry.source) {
|
|
78
|
+
const npmCli = path.join(path.dirname(process.execPath), 'node_modules', 'npm', 'bin', 'npm-cli.js');
|
|
79
|
+
log('Installing ' + entry.name + ' (npm) ...');
|
|
80
|
+
await execAsync(process.execPath, [
|
|
81
|
+
npmCli,
|
|
82
|
+
'install',
|
|
83
|
+
'--prefix',
|
|
84
|
+
mkdirp(out),
|
|
85
|
+
'--no-audit',
|
|
86
|
+
'--no-fund',
|
|
87
|
+
'--loglevel=error',
|
|
88
|
+
entry.source.npm,
|
|
89
|
+
]);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
const d = await resolve(entry);
|
|
93
|
+
log('Downloading ' + entry.name + ' (' + d.fileName + ', ~' + entry.size + ' once) ...');
|
|
94
|
+
const file = path.join(mkdirp(work), d.fileName.replace(/[\\/:*?"<>|]/g, '_'));
|
|
95
|
+
await downloader.file(d.url, file, { sha256: d.sha256 ?? null });
|
|
96
|
+
await unpack(entry, file, out, d);
|
|
97
|
+
}
|
|
98
|
+
fs.writeFileSync(path.join(out, MARKER), JSON.stringify({ id: entry.id, at: new Date().toISOString() }));
|
|
99
|
+
moveIntoPlace(out, dest);
|
|
100
|
+
}
|
|
101
|
+
finally {
|
|
102
|
+
safeRemove(work, path.dirname(work));
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/** Installs apps.install and apps.custom (skipped ones are listed in the summary). */
|
|
107
|
+
export async function setupApps(env, apps, o) {
|
|
108
|
+
const { entries, skipped } = appsToInstall(apps, o.gitAccess);
|
|
109
|
+
for (const s of skipped)
|
|
110
|
+
env.summary.push('app skipped: ' + s);
|
|
111
|
+
if (dryRun) {
|
|
112
|
+
log('(dry run) would install apps: ' + entries.map((e) => e.name).join(', '));
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
await new AppInstaller(env, o).installAll(entries);
|
|
116
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { exeMatcher } from '../../shared/apps/index.js';
|
|
4
|
+
const MAX_DEPTH = 7;
|
|
5
|
+
const MAX_ENTRIES = 50000;
|
|
6
|
+
/** A folder for 64-bit x86 builds (zips that ship amd64\ and i386\ copies of the same program). */
|
|
7
|
+
const X64_FOLDER = /(^|[\\/])(amd64|x64|x86_64|win64)([\\/]|$)/i;
|
|
8
|
+
/**
|
|
9
|
+
* The program in an installed folder (breadth first, bounded: big apps have tens of thousands of files). Of several
|
|
10
|
+
* copies at the same depth, one in an amd64/x64 folder wins.
|
|
11
|
+
*/
|
|
12
|
+
export function findExe(root, exe) {
|
|
13
|
+
const match = exeMatcher(exe);
|
|
14
|
+
const best = (hits) => hits.find((h) => X64_FOLDER.test(path.relative(root, h))) ?? hits[0] ?? null;
|
|
15
|
+
let queue = [root];
|
|
16
|
+
let seen = 0;
|
|
17
|
+
for (let depth = 0; depth < MAX_DEPTH && queue.length; depth++) {
|
|
18
|
+
const next = [];
|
|
19
|
+
const hits = [];
|
|
20
|
+
for (const dir of queue) {
|
|
21
|
+
let entries;
|
|
22
|
+
try {
|
|
23
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
const hit = entries.find((e) => e.isFile() && match(e.name));
|
|
29
|
+
if (hit)
|
|
30
|
+
hits.push(path.join(dir, hit.name));
|
|
31
|
+
else
|
|
32
|
+
next.push(...entries.filter((e) => e.isDirectory() && !e.isSymbolicLink()).map((e) => path.join(dir, e.name)));
|
|
33
|
+
if ((seen += entries.length) > MAX_ENTRIES)
|
|
34
|
+
return best(hits);
|
|
35
|
+
}
|
|
36
|
+
if (hits.length)
|
|
37
|
+
return best(hits);
|
|
38
|
+
queue = next;
|
|
39
|
+
}
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
@@ -1,10 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export {
|
|
4
|
-
export interface AppsOptions {
|
|
5
|
-
gitAccess: GitAccess;
|
|
6
|
-
refresh: boolean;
|
|
7
|
-
}
|
|
8
|
-
/** The program in an installed folder (breadth first, bounded: big apps have tens of thousands of files). */
|
|
9
|
-
export declare const findExe: (root: string, exe: string) => string | null;
|
|
10
|
-
export declare const setupApps: (env: ToolEnv, apps: Config["apps"], o: AppsOptions) => Promise<void>;
|
|
1
|
+
export { appsNeedMesa } from '../../shared/apps/index.js';
|
|
2
|
+
export { setupApps, type AppsOptions } from './app-installer.js';
|
|
3
|
+
export { findExe } from './find-exe.js';
|