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
|
@@ -3,18 +3,21 @@
|
|
|
3
3
|
// only to an address the sandbox published that is on this PC's Hyper-V network (isSandboxAddress). Bytes are passed
|
|
4
4
|
// through, never looked at. No admin rights needed (no netsh portproxy).
|
|
5
5
|
import net from 'node:net';
|
|
6
|
-
import path from 'node:path';
|
|
7
6
|
import { z } from 'zod';
|
|
8
|
-
import { relayPort } from '
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
|
|
7
|
+
import { relayPort } from '../../shared/network/index.js';
|
|
8
|
+
import { RunDir } from '../../shared/channel/index.js';
|
|
9
|
+
import { JsonFile } from '../../shared/io/index.js';
|
|
10
|
+
import { hostStateFile } from '../storage/index.js';
|
|
11
|
+
import { isSandboxAddress } from '../channel/index.js';
|
|
12
|
+
const ForwardsSchema = z
|
|
13
|
+
.array(z.object({ pc: z.number().int().min(1).max(65535), sandbox: z.number().int().min(1).max(65535) }))
|
|
14
|
+
.max(64);
|
|
15
|
+
const forwardsFile = (storageRoot, dataPath) => new JsonFile(ForwardsSchema, hostStateFile(storageRoot, dataPath, '-forwards.json'));
|
|
13
16
|
/** Host-only: the forwards of the running sandbox (written at launch, read by the watcher). */
|
|
14
|
-
export const saveForwards = (storageRoot, dataPath, forwards) =>
|
|
15
|
-
export const readForwards = (storageRoot, dataPath) =>
|
|
17
|
+
export const saveForwards = (storageRoot, dataPath, forwards) => forwardsFile(storageRoot, dataPath).write(forwards);
|
|
18
|
+
export const readForwards = (storageRoot, dataPath) => forwardsFile(storageRoot, dataPath).read() ?? [];
|
|
16
19
|
/** The sandbox's address on this PC's Hyper-V network, from its status (null until it has one). */
|
|
17
|
-
export const sandboxAddress = (dataPath) =>
|
|
20
|
+
export const sandboxAddress = (dataPath) => new RunDir(dataPath).readSandboxStatus()?.addresses?.find((a) => isSandboxAddress(a)) ?? null;
|
|
18
21
|
/** Starts one listener per forward; returns a function that stops them. */
|
|
19
22
|
export const startPortForwards = (forwards, address, note = () => undefined) => {
|
|
20
23
|
const servers = forwards.map((f, i) => {
|
|
@@ -29,7 +32,10 @@ export const startPortForwards = (forwards, address, note = () => undefined) =>
|
|
|
29
32
|
target.on('error', () => client.destroy());
|
|
30
33
|
client.on('error', () => target.destroy());
|
|
31
34
|
});
|
|
32
|
-
server.on('error', (e) => note('localhost:' +
|
|
35
|
+
server.on('error', (e) => note('localhost:' +
|
|
36
|
+
f.pc +
|
|
37
|
+
' could not be forwarded' +
|
|
38
|
+
(e.code === 'EADDRINUSE' ? ': something on this PC already uses that port' : ': ' + e.message)));
|
|
33
39
|
server.listen(f.pc, '127.0.0.1', () => note('localhost:' + f.pc + ' -> sandbox port ' + f.sandbox));
|
|
34
40
|
return server;
|
|
35
41
|
});
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { type LoginFiles } from './claude-login.js';
|
|
2
|
+
export interface Account {
|
|
3
|
+
readonly name: string;
|
|
4
|
+
readonly savedAt: string;
|
|
5
|
+
readonly email: string | null;
|
|
6
|
+
readonly credentials: unknown;
|
|
7
|
+
readonly oauthAccount: unknown;
|
|
8
|
+
}
|
|
9
|
+
export interface AccountRow {
|
|
10
|
+
readonly name: string;
|
|
11
|
+
readonly email: string | null;
|
|
12
|
+
readonly isDefault: boolean;
|
|
13
|
+
readonly isActive: boolean;
|
|
14
|
+
readonly savedAt: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function accountsDir(storageRoot: string): string;
|
|
17
|
+
/** The saved Claude logins under <storage>\accounts, and which one each sandbox data folder uses. */
|
|
18
|
+
export declare class AccountStore {
|
|
19
|
+
private readonly storageRoot;
|
|
20
|
+
constructor(storageRoot: string);
|
|
21
|
+
private file;
|
|
22
|
+
private store;
|
|
23
|
+
read(name: string): Account | null;
|
|
24
|
+
defaultName(): string | null;
|
|
25
|
+
/** The account a data folder uses (kept in the index of the storage folder that data folder is in). */
|
|
26
|
+
activeFor(dataPath: string): string | null;
|
|
27
|
+
list(dataPath: string): AccountRow[];
|
|
28
|
+
/** Saves the sandbox's current login (or this PC's, with fromHost) under `name`. */
|
|
29
|
+
save(dataPath: string, name: string, fromHost: LoginFiles | null): Account;
|
|
30
|
+
/**
|
|
31
|
+
* Makes `name` the sandbox's login. Claude refreshes (rotates) tokens while it runs, so the outgoing account's
|
|
32
|
+
* current tokens are saved back first; otherwise its stored refresh token could already be invalid.
|
|
33
|
+
*/
|
|
34
|
+
activate(dataPath: string, name: string): Account;
|
|
35
|
+
setDefault(name: string | null): void;
|
|
36
|
+
remove(name: string): void;
|
|
37
|
+
}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
// Several Claude logins for the sandbox. Each account is a saved copy of Claude's .credentials.json plus the
|
|
2
|
+
// `oauthAccount` block of .claude.json, kept in host-only storage (<storage>\accounts, never mapped into a sandbox).
|
|
3
|
+
// Switching writes them into the sandbox's persistent Claude state; when the sandbox is running the agent is then
|
|
4
|
+
// restarted in place with --continue so the conversation carries on.
|
|
5
|
+
import fs from 'node:fs';
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
import { isSafeFileName } from '../../shared/paths/index.js';
|
|
9
|
+
import { JsonFile } from '../../shared/io/index.js';
|
|
10
|
+
import { storageOf } from '../storage/index.js';
|
|
11
|
+
import { fail, fileExists } from '../../core/util/index.js';
|
|
12
|
+
import { clearAccountCaches, emailOf, MAX_STATE_BYTES, readLogin, readUntrusted, sandboxLogin, writeSandboxJson, } from './claude-login.js';
|
|
13
|
+
const NAME = /^[A-Za-z0-9_-]{1,40}$/;
|
|
14
|
+
const AccountSchema = z.object({
|
|
15
|
+
name: z.string().regex(NAME),
|
|
16
|
+
savedAt: z.string().max(64),
|
|
17
|
+
email: z.string().max(200).nullable(),
|
|
18
|
+
credentials: z.looseObject({}),
|
|
19
|
+
oauthAccount: z.unknown(),
|
|
20
|
+
});
|
|
21
|
+
const IndexSchema = z.object({
|
|
22
|
+
default: z.string().regex(NAME).optional(),
|
|
23
|
+
active: z.record(z.string().max(200), z.string().regex(NAME)).optional(),
|
|
24
|
+
});
|
|
25
|
+
export function accountsDir(storageRoot) {
|
|
26
|
+
return path.join(storageRoot, 'accounts');
|
|
27
|
+
}
|
|
28
|
+
function dataName(dataPath) {
|
|
29
|
+
return path.basename(dataPath);
|
|
30
|
+
}
|
|
31
|
+
function indexFile(storageRoot) {
|
|
32
|
+
return new JsonFile(IndexSchema, path.join(accountsDir(storageRoot), 'index.json'));
|
|
33
|
+
}
|
|
34
|
+
function readIndex(storageRoot) {
|
|
35
|
+
return indexFile(storageRoot).read() ?? {};
|
|
36
|
+
}
|
|
37
|
+
function updateIndex(storageRoot, change) {
|
|
38
|
+
indexFile(storageRoot).write(change(readIndex(storageRoot)));
|
|
39
|
+
}
|
|
40
|
+
function setActive(dataPath, name) {
|
|
41
|
+
updateIndex(storageOf(dataPath), (i) => ({ ...i, active: { ...i.active, [dataName(dataPath)]: name } }));
|
|
42
|
+
}
|
|
43
|
+
/** A file name of its own: not "index" (the index file), not a Windows device name such as con or nul. */
|
|
44
|
+
function validName(name) {
|
|
45
|
+
return NAME.test(name) && name.toLowerCase() !== 'index' && isSafeFileName(name + '.json');
|
|
46
|
+
}
|
|
47
|
+
function assertName(name) {
|
|
48
|
+
if (!validName(name))
|
|
49
|
+
fail('Invalid account name "' + name + '".', 'Use letters, numbers, - and _ only (max 40), e.g. work or personal.');
|
|
50
|
+
}
|
|
51
|
+
/** The saved Claude logins under <storage>\accounts, and which one each sandbox data folder uses. */
|
|
52
|
+
export class AccountStore {
|
|
53
|
+
storageRoot;
|
|
54
|
+
constructor(storageRoot) {
|
|
55
|
+
this.storageRoot = storageRoot;
|
|
56
|
+
}
|
|
57
|
+
file(name) {
|
|
58
|
+
return new JsonFile(AccountSchema, path.join(accountsDir(this.storageRoot), name + '.json'));
|
|
59
|
+
}
|
|
60
|
+
store(name, login) {
|
|
61
|
+
const account = { name, savedAt: new Date().toISOString(), email: emailOf(login.oauthAccount), ...login };
|
|
62
|
+
this.file(name).write(account);
|
|
63
|
+
return account;
|
|
64
|
+
}
|
|
65
|
+
read(name) {
|
|
66
|
+
return validName(name) ? this.file(name).read() : null;
|
|
67
|
+
}
|
|
68
|
+
defaultName() {
|
|
69
|
+
return readIndex(this.storageRoot).default ?? null;
|
|
70
|
+
}
|
|
71
|
+
/** The account a data folder uses (kept in the index of the storage folder that data folder is in). */
|
|
72
|
+
activeFor(dataPath) {
|
|
73
|
+
return readIndex(storageOf(dataPath)).active?.[dataName(dataPath)] ?? null;
|
|
74
|
+
}
|
|
75
|
+
list(dataPath) {
|
|
76
|
+
const dir = accountsDir(this.storageRoot);
|
|
77
|
+
if (!fs.existsSync(dir))
|
|
78
|
+
return [];
|
|
79
|
+
const def = this.defaultName();
|
|
80
|
+
const active = this.activeFor(dataPath);
|
|
81
|
+
return fs
|
|
82
|
+
.readdirSync(dir)
|
|
83
|
+
.filter((f) => f.endsWith('.json') && f !== 'index.json')
|
|
84
|
+
.map((f) => this.read(f.slice(0, -5)))
|
|
85
|
+
.filter((a) => a !== null)
|
|
86
|
+
.map((a) => ({
|
|
87
|
+
name: a.name,
|
|
88
|
+
email: a.email,
|
|
89
|
+
isDefault: a.name === def,
|
|
90
|
+
isActive: a.name === active,
|
|
91
|
+
savedAt: a.savedAt,
|
|
92
|
+
}));
|
|
93
|
+
}
|
|
94
|
+
/** Saves the sandbox's current login (or this PC's, with fromHost) under `name`. */
|
|
95
|
+
save(dataPath, name, fromHost) {
|
|
96
|
+
assertName(name);
|
|
97
|
+
const source = fromHost ?? sandboxLogin(dataPath);
|
|
98
|
+
const account = this.store(name, readLogin(source.claudeDir, source.globalStateFile));
|
|
99
|
+
if (!fromHost)
|
|
100
|
+
setActive(dataPath, name);
|
|
101
|
+
if (!this.defaultName())
|
|
102
|
+
this.setDefault(name);
|
|
103
|
+
return account;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Makes `name` the sandbox's login. Claude refreshes (rotates) tokens while it runs, so the outgoing account's
|
|
107
|
+
* current tokens are saved back first; otherwise its stored refresh token could already be invalid.
|
|
108
|
+
*/
|
|
109
|
+
activate(dataPath, name) {
|
|
110
|
+
const account = this.read(name) ??
|
|
111
|
+
fail('Unknown account "' + name + '".', 'Saved accounts: ' +
|
|
112
|
+
(this.list(dataPath)
|
|
113
|
+
.map((a) => a.name)
|
|
114
|
+
.join(', ') || 'none yet; save one with sandbox account save <name>'));
|
|
115
|
+
const { claudeDir, globalStateFile } = sandboxLogin(dataPath);
|
|
116
|
+
const outgoing = this.activeFor(dataPath);
|
|
117
|
+
if (outgoing && outgoing !== name && this.read(outgoing) && fileExists(path.join(claudeDir, '.credentials.json'))) {
|
|
118
|
+
try {
|
|
119
|
+
this.store(outgoing, readLogin(claudeDir, globalStateFile));
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
/* nothing usable to save back */
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
fs.mkdirSync(claudeDir, { recursive: true });
|
|
126
|
+
clearAccountCaches(claudeDir);
|
|
127
|
+
writeSandboxJson(path.join(claudeDir, '.credentials.json'), account.credentials);
|
|
128
|
+
const state = readUntrusted(globalStateFile, MAX_STATE_BYTES);
|
|
129
|
+
if (account.oauthAccount && (state || !fileExists(globalStateFile)))
|
|
130
|
+
writeSandboxJson(globalStateFile, { ...(state ?? {}), oauthAccount: account.oauthAccount });
|
|
131
|
+
setActive(dataPath, name);
|
|
132
|
+
return account;
|
|
133
|
+
}
|
|
134
|
+
setDefault(name) {
|
|
135
|
+
if (name !== null && !this.read(name))
|
|
136
|
+
fail('Unknown account "' + name + '".', 'See your accounts with: sandbox account list');
|
|
137
|
+
updateIndex(this.storageRoot, (i) => ({ ...i, default: name ?? undefined }));
|
|
138
|
+
}
|
|
139
|
+
remove(name) {
|
|
140
|
+
if (!this.read(name))
|
|
141
|
+
fail('Unknown account "' + name + '".', 'See your accounts with: sandbox account list');
|
|
142
|
+
fs.rmSync(this.file(name).file);
|
|
143
|
+
if (this.defaultName() === name)
|
|
144
|
+
this.setDefault(null);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface Login {
|
|
2
|
+
readonly credentials: unknown;
|
|
3
|
+
readonly oauthAccount: unknown;
|
|
4
|
+
}
|
|
5
|
+
export interface LoginFiles {
|
|
6
|
+
readonly claudeDir: string;
|
|
7
|
+
readonly globalStateFile: string;
|
|
8
|
+
}
|
|
9
|
+
/** .claude.json holds per-project state and can be large; still capped so a hostile file cannot exhaust memory. */
|
|
10
|
+
export declare const MAX_STATE_BYTES: number;
|
|
11
|
+
export declare function sandboxClaudeDir(dataPath: string): string;
|
|
12
|
+
export declare function emailOf(oauthAccount: unknown): string | null;
|
|
13
|
+
/** Reads a JSON file that may be sandbox-written: no links, size-capped. */
|
|
14
|
+
export declare function readUntrusted(file: string, max: number): unknown;
|
|
15
|
+
/** The login currently in a Claude config folder (+ its global state file). */
|
|
16
|
+
export declare function readLogin(claudeDir: string, globalStateFile: string): Login;
|
|
17
|
+
/** The sandbox's Claude login files (refuses when the data folder holds a link on the way). */
|
|
18
|
+
export declare function sandboxLogin(dataPath: string): LoginFiles;
|
|
19
|
+
/** Replaces a file that may be a sandbox-planted link instead of writing through it. */
|
|
20
|
+
export declare function writeSandboxJson(file: string, value: unknown): void;
|
|
21
|
+
/** Removes the previous account's caches; otherwise its org policy could linger. A link is removed, not followed. */
|
|
22
|
+
export declare function clearAccountCaches(claudeDir: string): void;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// A Claude login as files: .credentials.json plus the `oauthAccount` block of .claude.json. The sandbox's copies are
|
|
2
|
+
// guest-written: read without following links and size-capped; links are replaced, never written through.
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { assertTestWritable } from '../test-guard.js';
|
|
6
|
+
import { assertNoLinks, fail, fileExists, isLink, removeLink, tryReadJson, writeJson } from '../../core/util/index.js';
|
|
7
|
+
const MAX_LOGIN_BYTES = 1024 * 1024;
|
|
8
|
+
/** .claude.json holds per-project state and can be large; still capped so a hostile file cannot exhaust memory. */
|
|
9
|
+
export const MAX_STATE_BYTES = 256 * 1024 * 1024;
|
|
10
|
+
/** Caches tied to an account (Claude deletes these on /logout). */
|
|
11
|
+
const ACCOUNT_CACHES = ['remote-settings.json', 'policy-limits.json', 'policy-limits.json.stamp.json'];
|
|
12
|
+
export function sandboxClaudeDir(dataPath) {
|
|
13
|
+
return path.join(dataPath, 'state', 'claude');
|
|
14
|
+
}
|
|
15
|
+
export function emailOf(oauthAccount) {
|
|
16
|
+
const email = oauthAccount?.emailAddress;
|
|
17
|
+
return typeof email === 'string' ? email.slice(0, 200) : null;
|
|
18
|
+
}
|
|
19
|
+
/** Reads a JSON file that may be sandbox-written: no links, size-capped. */
|
|
20
|
+
export function readUntrusted(file, max) {
|
|
21
|
+
return fileExists(file) && !isLink(file) && fs.statSync(file).size <= max ? tryReadJson(file) : null;
|
|
22
|
+
}
|
|
23
|
+
/** The login currently in a Claude config folder (+ its global state file). */
|
|
24
|
+
export function readLogin(claudeDir, globalStateFile) {
|
|
25
|
+
const credentials = readUntrusted(path.join(claudeDir, '.credentials.json'), MAX_LOGIN_BYTES);
|
|
26
|
+
if (!credentials || typeof credentials !== 'object')
|
|
27
|
+
fail('No Claude login found in ' + claudeDir + '.', 'Sign in to Claude first (inside the sandbox, or on this PC with --from-host), then save it again.');
|
|
28
|
+
return {
|
|
29
|
+
credentials,
|
|
30
|
+
oauthAccount: readUntrusted(globalStateFile, MAX_STATE_BYTES)?.oauthAccount ?? null,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/** The sandbox's Claude login files (refuses when the data folder holds a link on the way). */
|
|
34
|
+
export function sandboxLogin(dataPath) {
|
|
35
|
+
assertNoLinks(dataPath, sandboxClaudeDir(dataPath));
|
|
36
|
+
return {
|
|
37
|
+
claudeDir: sandboxClaudeDir(dataPath),
|
|
38
|
+
globalStateFile: path.join(sandboxClaudeDir(dataPath), '.claude.json'),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/** Replaces a file that may be a sandbox-planted link instead of writing through it. */
|
|
42
|
+
export function writeSandboxJson(file, value) {
|
|
43
|
+
assertTestWritable(file);
|
|
44
|
+
if (isLink(file))
|
|
45
|
+
removeLink(file);
|
|
46
|
+
writeJson(file, value);
|
|
47
|
+
}
|
|
48
|
+
/** Removes the previous account's caches; otherwise its org policy could linger. A link is removed, not followed. */
|
|
49
|
+
export function clearAccountCaches(claudeDir) {
|
|
50
|
+
for (const cache of ACCOUNT_CACHES) {
|
|
51
|
+
const file = path.join(claudeDir, cache);
|
|
52
|
+
if (isLink(file))
|
|
53
|
+
removeLink(file);
|
|
54
|
+
else
|
|
55
|
+
fs.rmSync(file, { force: true });
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import type { ClaudeProfileConfig, ProfileResult } from '
|
|
1
|
+
import type { ClaudeProfileConfig, ProfileResult } from '../../core/types.js';
|
|
2
2
|
import { type SecretsConfig } from './secrets.js';
|
|
3
|
-
export declare
|
|
4
|
-
export declare
|
|
5
|
-
/**
|
|
6
|
-
* Copies SELECTED Claude settings from this PC into the launch folder. Conversation history is handled
|
|
7
|
-
* separately by history.ts (it needs path translation), and the login only travels when copyCredentials is on.
|
|
8
|
-
*/
|
|
3
|
+
export declare function hostClaudeDir(settings: ClaudeProfileConfig): string;
|
|
4
|
+
export declare function hostGlobalStateFile(settings: ClaudeProfileConfig): string;
|
|
9
5
|
/**
|
|
10
6
|
* What of your .claude.json the sandbox gets: everything except secrets and other projects. API keys and the account
|
|
11
7
|
* block stay on this PC (logins travel only through `sandbox account`), and of the per-project entries only
|
|
12
8
|
* this workspace's (with its MCP servers) is kept; other projects' entries can hold their MCP servers' tokens.
|
|
13
9
|
*/
|
|
14
|
-
export declare
|
|
15
|
-
|
|
10
|
+
export declare function sandboxGlobalState(state: Record<string, unknown>, workspaceHost: string): Record<string, unknown>;
|
|
11
|
+
/**
|
|
12
|
+
* Copies SELECTED Claude settings from this PC into the launch folder. Conversation history is handled
|
|
13
|
+
* separately by history.ts (it needs path translation), and the login only travels when copyCredentials is on.
|
|
14
|
+
*/
|
|
15
|
+
export declare function stageClaudeProfile(settings: ClaudeProfileConfig, launchPath: string, workspaceHost: string, secrets: SecretsConfig): ProfileResult;
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
// Your Claude settings from this PC, staged into the launch folder for the sandbox with secrets stripped.
|
|
1
2
|
import fs from 'node:fs';
|
|
2
3
|
import path from 'node:path';
|
|
4
|
+
import { dirExists, ensureDir, fileExists, homeDir, isLink, readJson, writeJson } from '../../core/util/index.js';
|
|
3
5
|
import { stripMcpServers, stripSettings } from './secrets.js';
|
|
4
|
-
import { dirExists, ensureDir, fileExists, homeDir, isLink, readJson, writeJson } from '../core/util.js';
|
|
5
6
|
const MAX_BYTES = 250 * 1024 * 1024;
|
|
6
7
|
/** Real files only: a link inside ~/.claude (even a loop or a dead one) is neither followed nor counted nor copied. */
|
|
7
|
-
|
|
8
|
+
function directorySize(dir) {
|
|
8
9
|
let total = 0;
|
|
9
10
|
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
10
11
|
const full = path.join(dir, entry.name);
|
|
@@ -14,8 +15,8 @@ const directorySize = (dir) => {
|
|
|
14
15
|
total += fs.statSync(full).size;
|
|
15
16
|
}
|
|
16
17
|
return total;
|
|
17
|
-
}
|
|
18
|
-
|
|
18
|
+
}
|
|
19
|
+
function validJson(file) {
|
|
19
20
|
try {
|
|
20
21
|
JSON.parse(fs.readFileSync(file, 'utf8').replace(/^\uFEFF/, ''));
|
|
21
22
|
return true;
|
|
@@ -23,31 +24,36 @@ const validJson = (file) => {
|
|
|
23
24
|
catch {
|
|
24
25
|
return false;
|
|
25
26
|
}
|
|
26
|
-
}
|
|
27
|
-
export
|
|
28
|
-
return settings.hostDir === 'auto'
|
|
29
|
-
|
|
30
|
-
|
|
27
|
+
}
|
|
28
|
+
export function hostClaudeDir(settings) {
|
|
29
|
+
return settings.hostDir === 'auto'
|
|
30
|
+
? (process.env.CLAUDE_CONFIG_DIR ?? path.join(homeDir(), '.claude'))
|
|
31
|
+
: settings.hostDir;
|
|
32
|
+
}
|
|
33
|
+
export function hostGlobalStateFile(settings) {
|
|
31
34
|
if (settings.globalStateFile !== 'auto')
|
|
32
35
|
return settings.globalStateFile;
|
|
33
|
-
return process.env.CLAUDE_CONFIG_DIR
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
* separately by history.ts (it needs path translation), and the login only travels when copyCredentials is on.
|
|
38
|
-
*/
|
|
36
|
+
return process.env.CLAUDE_CONFIG_DIR
|
|
37
|
+
? path.join(process.env.CLAUDE_CONFIG_DIR, '.claude.json')
|
|
38
|
+
: path.join(homeDir(), '.claude.json');
|
|
39
|
+
}
|
|
39
40
|
/**
|
|
40
41
|
* What of your .claude.json the sandbox gets: everything except secrets and other projects. API keys and the account
|
|
41
42
|
* block stay on this PC (logins travel only through `sandbox account`), and of the per-project entries only
|
|
42
43
|
* this workspace's (with its MCP servers) is kept; other projects' entries can hold their MCP servers' tokens.
|
|
43
44
|
*/
|
|
44
|
-
export
|
|
45
|
+
export function sandboxGlobalState(state, workspaceHost) {
|
|
45
46
|
const { primaryApiKey: _key, customApiKeyResponses: _responses, oauthAccount: _account, projects, ...rest } = state;
|
|
46
|
-
const same = (key) => key.replace(/\\/g, '/').replace(/\/+$/, '').toLowerCase() ===
|
|
47
|
+
const same = (key) => key.replace(/\\/g, '/').replace(/\/+$/, '').toLowerCase() ===
|
|
48
|
+
workspaceHost.replace(/\\/g, '/').replace(/\/+$/, '').toLowerCase();
|
|
47
49
|
const own = Object.entries((projects ?? {})).filter(([key]) => same(key));
|
|
48
50
|
return { ...rest, projects: Object.fromEntries(own) };
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Copies SELECTED Claude settings from this PC into the launch folder. Conversation history is handled
|
|
54
|
+
* separately by history.ts (it needs path translation), and the login only travels when copyCredentials is on.
|
|
55
|
+
*/
|
|
56
|
+
export function stageClaudeProfile(settings, launchPath, workspaceHost, secrets) {
|
|
51
57
|
const result = { hostDir: null, staged: [], skipped: [], credentials: false, secretsRemoved: [] };
|
|
52
58
|
if (!settings.enabled)
|
|
53
59
|
return result;
|
|
@@ -55,7 +61,7 @@ export const stageClaudeProfile = (settings, launchPath, workspaceHost, secrets)
|
|
|
55
61
|
result.hostDir = hostDir;
|
|
56
62
|
const target = path.join(launchPath, 'claude-profile');
|
|
57
63
|
ensureDir(target);
|
|
58
|
-
// The login
|
|
64
|
+
// The login goes only through copyCredentials (a project file asking for it is flagged); include never copies it.
|
|
59
65
|
const items = settings.include.filter((name) => name.toLowerCase() !== '.credentials.json');
|
|
60
66
|
if (settings.copyCredentials)
|
|
61
67
|
items.push('.credentials.json');
|
|
@@ -82,7 +88,11 @@ export const stageClaudeProfile = (settings, launchPath, workspaceHost, secrets)
|
|
|
82
88
|
result.skipped.push(name + ' (over 250 MB)');
|
|
83
89
|
continue;
|
|
84
90
|
}
|
|
85
|
-
fs.cpSync(source, destination, {
|
|
91
|
+
fs.cpSync(source, destination, {
|
|
92
|
+
recursive: true,
|
|
93
|
+
force: true,
|
|
94
|
+
filter: (from) => from === source || !isLink(from),
|
|
95
|
+
});
|
|
86
96
|
}
|
|
87
97
|
else {
|
|
88
98
|
result.skipped.push(name + ' (not found)');
|
|
@@ -104,4 +114,4 @@ export const stageClaudeProfile = (settings, launchPath, workspaceHost, secrets)
|
|
|
104
114
|
}
|
|
105
115
|
}
|
|
106
116
|
return result;
|
|
107
|
-
}
|
|
117
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { isSecretName, isSecretValue, mayPass, stripMcpServers, stripSettings, stripVariables, type SecretsConfig, } from './secrets.js';
|
|
2
|
+
export { findSecretFiles } from './secret-files.js';
|
|
3
|
+
export { hostClaudeDir, hostGlobalStateFile, sandboxGlobalState, stageClaudeProfile } from './claude-profile.js';
|
|
4
|
+
export { capturePersonalization } from './personalize.js';
|
|
5
|
+
export { toRegFile, type RegValue } from './reg-file.js';
|
|
6
|
+
export { AccountStore, accountsDir, type Account, type AccountRow } from './accounts.js';
|
|
7
|
+
export { sandboxClaudeDir } from './claude-login.js';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { isSecretName, isSecretValue, mayPass, stripMcpServers, stripSettings, stripVariables, } from './secrets.js';
|
|
2
|
+
export { findSecretFiles } from './secret-files.js';
|
|
3
|
+
export { hostClaudeDir, hostGlobalStateFile, sandboxGlobalState, stageClaudeProfile } from './claude-profile.js';
|
|
4
|
+
export { capturePersonalization } from './personalize.js';
|
|
5
|
+
export { toRegFile } from './reg-file.js';
|
|
6
|
+
export { AccountStore, accountsDir } from './accounts.js';
|
|
7
|
+
export { sandboxClaudeDir } from './claude-login.js';
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
// Captures the look of this desktop (theme, accent colour, taskbar, Explorer options, wallpaper, mouse/keyboard,
|
|
2
|
+
// regional formats) from HKCU as a .reg file the sandbox imports at logon. Only an allow-list of values is read.
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { ensureDir, errMsg, fileExists, isWin, runPowerShell } from '../../core/util/index.js';
|
|
6
|
+
import { toRegFile } from './reg-file.js';
|
|
7
|
+
/** The HKCU values captured, by key. */
|
|
8
|
+
const VALUES = {
|
|
9
|
+
'Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize': [
|
|
10
|
+
'AppsUseLightTheme',
|
|
11
|
+
'SystemUsesLightTheme',
|
|
12
|
+
'EnableTransparency',
|
|
13
|
+
'ColorPrevalence',
|
|
14
|
+
],
|
|
15
|
+
'Software\\Microsoft\\Windows\\DWM': [
|
|
16
|
+
'AccentColor',
|
|
17
|
+
'AccentColorInactive',
|
|
18
|
+
'ColorizationColor',
|
|
19
|
+
'ColorizationAfterglow',
|
|
20
|
+
'ColorizationColorBalance',
|
|
21
|
+
'ColorPrevalence',
|
|
22
|
+
'EnableWindowColorization',
|
|
23
|
+
],
|
|
24
|
+
'Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Accent': [
|
|
25
|
+
'AccentPalette',
|
|
26
|
+
'AccentColorMenu',
|
|
27
|
+
'StartColorMenu',
|
|
28
|
+
],
|
|
29
|
+
'Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced': [
|
|
30
|
+
'TaskbarAl',
|
|
31
|
+
'TaskbarSi',
|
|
32
|
+
'TaskbarDa',
|
|
33
|
+
'TaskbarMn',
|
|
34
|
+
'TaskbarGlomLevel',
|
|
35
|
+
'ShowTaskViewButton',
|
|
36
|
+
'Hidden',
|
|
37
|
+
'HideFileExt',
|
|
38
|
+
'ShowSuperHidden',
|
|
39
|
+
'LaunchTo',
|
|
40
|
+
'NavPaneExpandToCurrentFolder',
|
|
41
|
+
'NavPaneShowAllFolders',
|
|
42
|
+
'ShowCopilotButton',
|
|
43
|
+
'Start_TrackDocs',
|
|
44
|
+
'Start_Layout',
|
|
45
|
+
],
|
|
46
|
+
'Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\StuckRects3': ['Settings'],
|
|
47
|
+
'Software\\Microsoft\\Windows\\CurrentVersion\\Search': ['SearchboxTaskbarMode'],
|
|
48
|
+
'Control Panel\\Desktop': [
|
|
49
|
+
'WallpaperStyle',
|
|
50
|
+
'TileWallpaper',
|
|
51
|
+
'MenuShowDelay',
|
|
52
|
+
'CursorBlinkRate',
|
|
53
|
+
'DragFullWindows',
|
|
54
|
+
'FontSmoothing',
|
|
55
|
+
'FontSmoothingType',
|
|
56
|
+
'UserPreferencesMask',
|
|
57
|
+
],
|
|
58
|
+
'Control Panel\\Colors': ['Background', 'Hilight', 'HotTrackingColor'],
|
|
59
|
+
'Control Panel\\Mouse': [
|
|
60
|
+
'MouseSpeed',
|
|
61
|
+
'MouseSensitivity',
|
|
62
|
+
'MouseThreshold1',
|
|
63
|
+
'MouseThreshold2',
|
|
64
|
+
'DoubleClickSpeed',
|
|
65
|
+
'SwapMouseButtons',
|
|
66
|
+
],
|
|
67
|
+
'Control Panel\\Keyboard': ['KeyboardDelay', 'KeyboardSpeed'],
|
|
68
|
+
'Control Panel\\International': [
|
|
69
|
+
'sShortDate',
|
|
70
|
+
'sLongDate',
|
|
71
|
+
'sShortTime',
|
|
72
|
+
'sTimeFormat',
|
|
73
|
+
'iFirstDayOfWeek',
|
|
74
|
+
'sDecimal',
|
|
75
|
+
'sThousand',
|
|
76
|
+
'sList',
|
|
77
|
+
'iMeasure',
|
|
78
|
+
'iTime',
|
|
79
|
+
'iTLZero',
|
|
80
|
+
],
|
|
81
|
+
'Control Panel\\Accessibility\\StickyKeys': ['Flags'],
|
|
82
|
+
};
|
|
83
|
+
function captureScript(spec) {
|
|
84
|
+
return [
|
|
85
|
+
'$ErrorActionPreference = "SilentlyContinue"',
|
|
86
|
+
"$spec = '" + JSON.stringify(spec).replace(/'/g, "''") + "' | ConvertFrom-Json",
|
|
87
|
+
'$out = @()',
|
|
88
|
+
'foreach ($p in $spec.PSObject.Properties) {',
|
|
89
|
+
' $key = Get-Item -LiteralPath ("HKCU:\\" + $p.Name)',
|
|
90
|
+
' if (-not $key) { continue }',
|
|
91
|
+
' foreach ($name in $p.Value) {',
|
|
92
|
+
' $raw = $key.GetValue($name, $null, "DoNotExpandEnvironmentNames")',
|
|
93
|
+
' if ($null -eq $raw) { continue }',
|
|
94
|
+
' $kind = $key.GetValueKind($name).ToString()',
|
|
95
|
+
' if ($kind -eq "Binary") { $raw = [Convert]::ToBase64String([byte[]]$raw) }',
|
|
96
|
+
' $out += [pscustomobject]@{ key = $p.Name; name = $name; kind = $kind; value = $raw }',
|
|
97
|
+
' }',
|
|
98
|
+
'}',
|
|
99
|
+
'$wall = (Get-ItemProperty -LiteralPath "HKCU:\\Control Panel\\Desktop").WallPaper',
|
|
100
|
+
'[pscustomobject]@{ values = $out; wallpaper = $wall } | ConvertTo-Json -Depth 5 -Compress',
|
|
101
|
+
].join('\n');
|
|
102
|
+
}
|
|
103
|
+
/** Writes personalize.reg (+ the wallpaper image) into `<launch>\personalize`. Returns a short summary. */
|
|
104
|
+
export function capturePersonalization(launchPath) {
|
|
105
|
+
if (!isWin)
|
|
106
|
+
return 'skipped (not Windows)';
|
|
107
|
+
try {
|
|
108
|
+
const { status, stdout } = runPowerShell(captureScript(VALUES), true);
|
|
109
|
+
if (status !== 0)
|
|
110
|
+
return 'skipped (registry read failed)';
|
|
111
|
+
// runPowerShell has PowerShell write UTF-8 (non-ASCII date formats and wallpaper paths survive); a BOM is allowed.
|
|
112
|
+
const parsed = JSON.parse(stdout.replace(/^\uFEFF/, '').trim());
|
|
113
|
+
const values = parsed.values === null ? [] : Array.isArray(parsed.values) ? parsed.values : [parsed.values];
|
|
114
|
+
const dir = path.join(launchPath, 'personalize');
|
|
115
|
+
ensureDir(dir);
|
|
116
|
+
fs.writeFileSync(path.join(dir, 'personalize.reg'), '\uFEFF' + toRegFile(values), 'utf16le');
|
|
117
|
+
const wallpaper = parsed.wallpaper ?? '';
|
|
118
|
+
const themesCopy = path.join(process.env.APPDATA ?? '', 'Microsoft', 'Windows', 'Themes', 'TranscodedWallpaper');
|
|
119
|
+
const source = fileExists(wallpaper) ? wallpaper : fileExists(themesCopy) ? themesCopy : null;
|
|
120
|
+
if (source)
|
|
121
|
+
fs.copyFileSync(source, path.join(dir, 'wallpaper' + (path.extname(source) || '.jpg')));
|
|
122
|
+
return values.length + ' settings' + (source ? ' + wallpaper' : '');
|
|
123
|
+
}
|
|
124
|
+
catch (e) {
|
|
125
|
+
return 'skipped (' + errMsg(e) + ')';
|
|
126
|
+
}
|
|
127
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface RegValue {
|
|
2
|
+
readonly key: string;
|
|
3
|
+
readonly name: string;
|
|
4
|
+
readonly kind: string;
|
|
5
|
+
readonly value: string | number | string[];
|
|
6
|
+
}
|
|
7
|
+
/** Formats captured values as a .reg file (UTF-16 friendly text; written as UTF-16LE with BOM). */
|
|
8
|
+
export declare function toRegFile(values: RegValue[]): string;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// The .reg file format (as regedit imports it) for values captured from HKCU.
|
|
2
|
+
function toHex(bytes) {
|
|
3
|
+
return [...bytes].map((b) => b.toString(16).padStart(2, '0')).join(',');
|
|
4
|
+
}
|
|
5
|
+
function regString(s) {
|
|
6
|
+
return '"' + s.replace(/\\/g, '\\\\').replace(/"/g, '\\"') + '"';
|
|
7
|
+
}
|
|
8
|
+
/** Formats captured values as a .reg file (UTF-16 friendly text; written as UTF-16LE with BOM). */
|
|
9
|
+
export function toRegFile(values) {
|
|
10
|
+
const byKey = new Map();
|
|
11
|
+
for (const v of values)
|
|
12
|
+
byKey.set(v.key, [...(byKey.get(v.key) ?? []), v]);
|
|
13
|
+
const lines = ['Windows Registry Editor Version 5.00', ''];
|
|
14
|
+
for (const [key, list] of byKey) {
|
|
15
|
+
lines.push('[HKEY_CURRENT_USER\\' + key + ']');
|
|
16
|
+
for (const v of list) {
|
|
17
|
+
const name = regString(v.name);
|
|
18
|
+
switch (v.kind) {
|
|
19
|
+
case 'DWord':
|
|
20
|
+
lines.push(name + '=dword:' + (Number(v.value) >>> 0).toString(16).padStart(8, '0'));
|
|
21
|
+
break;
|
|
22
|
+
case 'QWord':
|
|
23
|
+
lines.push(name +
|
|
24
|
+
'=hex(b):' +
|
|
25
|
+
toHex(Buffer.from(BigInt.asUintN(64, BigInt(v.value))
|
|
26
|
+
.toString(16)
|
|
27
|
+
.padStart(16, '0'), 'hex').reverse()));
|
|
28
|
+
break;
|
|
29
|
+
case 'Binary':
|
|
30
|
+
lines.push(name + '=hex:' + toHex(Buffer.from(String(v.value), 'base64')));
|
|
31
|
+
break;
|
|
32
|
+
case 'ExpandString':
|
|
33
|
+
lines.push(name + '=hex(2):' + toHex(Buffer.from(String(v.value) + '\0', 'utf16le')));
|
|
34
|
+
break;
|
|
35
|
+
case 'MultiString':
|
|
36
|
+
lines.push(name + '=hex(7):' + toHex(Buffer.from(v.value.join('\0') + '\0\0', 'utf16le')));
|
|
37
|
+
break;
|
|
38
|
+
default:
|
|
39
|
+
lines.push(name + '=' + regString(String(v.value)));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
lines.push('');
|
|
43
|
+
}
|
|
44
|
+
return lines.join('\r\n');
|
|
45
|
+
}
|