windows-development-sandbox 1.4.1 → 1.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config.example.json +3 -1
- package/dist/api.js +27 -16
- package/dist/cli/args.d.ts +4 -6
- package/dist/cli/args.js +67 -34
- package/dist/cli/argv.d.ts +9 -0
- package/dist/cli/argv.js +22 -0
- package/dist/cli/commands/accounts.d.ts +1 -1
- package/dist/cli/commands/accounts.js +42 -27
- package/dist/cli/commands/agent-commands.d.ts +3 -3
- package/dist/cli/commands/agent-commands.js +27 -18
- package/dist/cli/commands/context.d.ts +9 -11
- package/dist/cli/commands/context.js +35 -32
- package/dist/cli/commands/data/clean.d.ts +2 -2
- package/dist/cli/commands/data/clean.js +27 -11
- package/dist/cli/commands/data/collect.d.ts +6 -3
- package/dist/cli/commands/data/collect.js +46 -15
- package/dist/cli/commands/data/index.d.ts +2 -2
- package/dist/cli/commands/data/index.js +30 -12
- package/dist/cli/commands/data/remove.d.ts +1 -1
- package/dist/cli/commands/data/remove.js +4 -4
- package/dist/cli/commands/index.d.ts +5 -4
- package/dist/cli/commands/index.js +5 -4
- package/dist/cli/commands/launch/add-root.d.ts +7 -0
- package/dist/cli/commands/launch/add-root.js +64 -0
- package/dist/cli/commands/launch/boot-progress.d.ts +7 -0
- package/dist/cli/commands/launch/boot-progress.js +48 -0
- package/dist/cli/commands/launch/boot-wants.d.ts +11 -0
- package/dist/cli/commands/launch/boot-wants.js +48 -0
- package/dist/cli/commands/launch/first-start.d.ts +10 -0
- package/dist/cli/commands/launch/first-start.js +53 -0
- package/dist/cli/commands/launch/index.d.ts +6 -0
- package/dist/cli/commands/launch/index.js +6 -0
- package/dist/cli/commands/launch/launch.d.ts +8 -0
- package/dist/cli/commands/launch/launch.js +211 -0
- package/dist/cli/commands/launch/prepare.d.ts +23 -0
- package/dist/cli/commands/launch/prepare.js +109 -0
- package/dist/cli/commands/launch/running.d.ts +45 -0
- package/dist/cli/commands/launch/running.js +218 -0
- package/dist/cli/commands/launch/summary.d.ts +8 -0
- package/dist/cli/commands/launch/summary.js +98 -0
- package/dist/cli/commands/maintenance/audit.d.ts +3 -0
- package/dist/cli/commands/maintenance/audit.js +58 -0
- package/dist/cli/commands/maintenance/clean.d.ts +2 -0
- package/dist/cli/commands/maintenance/clean.js +10 -0
- package/dist/cli/commands/maintenance/config.d.ts +2 -0
- package/dist/cli/commands/maintenance/config.js +145 -0
- package/dist/cli/commands/maintenance/doctor.d.ts +2 -0
- package/dist/cli/commands/maintenance/doctor.js +52 -0
- package/dist/cli/commands/maintenance/host-claude.d.ts +2 -0
- package/dist/cli/commands/maintenance/host-claude.js +4 -0
- package/dist/cli/commands/maintenance/index.d.ts +8 -0
- package/dist/cli/commands/maintenance/index.js +9 -0
- package/dist/cli/commands/maintenance/logs.d.ts +2 -0
- package/dist/cli/commands/maintenance/logs.js +44 -0
- package/dist/cli/commands/maintenance/sync.d.ts +2 -0
- package/dist/cli/commands/maintenance/sync.js +12 -0
- package/dist/cli/commands/maintenance/watch.d.ts +3 -0
- package/dist/cli/commands/maintenance/watch.js +6 -0
- package/dist/cli/commands/projects/describe-sessions.d.ts +3 -0
- package/dist/cli/commands/projects/describe-sessions.js +15 -0
- package/dist/cli/commands/projects/here.d.ts +38 -0
- package/dist/cli/commands/projects/here.js +145 -0
- package/dist/cli/commands/projects/index.d.ts +4 -0
- package/dist/cli/commands/projects/index.js +4 -0
- package/dist/cli/commands/projects/projects.d.ts +14 -0
- package/dist/cli/commands/projects/projects.js +213 -0
- package/dist/cli/commands/projects/restart.d.ts +15 -0
- package/dist/cli/commands/projects/restart.js +149 -0
- package/dist/cli/commands/registry.d.ts +3 -0
- package/dist/cli/commands/registry.js +34 -0
- package/dist/cli/commands/repair/checks.js +105 -29
- package/dist/cli/commands/repair/finders.d.ts +13 -10
- package/dist/cli/commands/repair/finders.js +63 -43
- package/dist/cli/commands/repair/index.d.ts +4 -4
- package/dist/cli/commands/repair/index.js +47 -21
- package/dist/cli/commands/repair/types.d.ts +2 -2
- package/dist/cli/commands/repair/types.js +7 -2
- package/dist/cli/commands/sessions/attach.d.ts +2 -0
- package/dist/cli/commands/sessions/attach.js +45 -0
- package/dist/cli/commands/sessions/control.d.ts +4 -0
- package/dist/cli/commands/sessions/control.js +62 -0
- package/dist/cli/commands/sessions/exec.d.ts +6 -0
- package/dist/cli/commands/sessions/exec.js +72 -0
- package/dist/cli/commands/sessions/index.d.ts +6 -0
- package/dist/cli/commands/sessions/index.js +9 -0
- package/dist/cli/commands/sessions/list.d.ts +15 -0
- package/dist/cli/commands/sessions/list.js +65 -0
- package/dist/cli/commands/sessions/status.d.ts +2 -0
- package/dist/cli/commands/sessions/status.js +153 -0
- package/dist/cli/commands/sessions/window.d.ts +3 -0
- package/dist/cli/commands/sessions/window.js +18 -0
- package/dist/cli/commands/setup/checks.d.ts +4 -4
- package/dist/cli/commands/setup/checks.js +36 -19
- package/dist/cli/commands/setup/facts.d.ts +6 -6
- package/dist/cli/commands/setup/facts.js +23 -11
- package/dist/cli/commands/setup/index.d.ts +1 -1
- package/dist/cli/commands/setup/index.js +25 -12
- package/dist/cli/commands/user-config.d.ts +5 -5
- package/dist/cli/commands/user-config.js +14 -12
- package/dist/cli/history.d.ts +5 -4
- package/dist/cli/history.js +23 -11
- package/dist/cli/index.d.ts +4 -14
- package/dist/cli/index.js +27 -77
- package/dist/cli/manifest.d.ts +464 -10
- package/dist/cli/manifest.js +327 -53
- package/dist/cli/menu/apps.d.ts +7 -5
- package/dist/cli/menu/apps.js +64 -16
- package/dist/cli/menu/command-fields.d.ts +15 -0
- package/dist/cli/menu/command-fields.js +23 -0
- package/dist/cli/menu/command-form.d.ts +3 -5
- package/dist/cli/menu/command-form.js +116 -48
- package/dist/cli/menu/home.d.ts +22 -0
- package/dist/cli/menu/home.js +72 -0
- package/dist/cli/menu/index.d.ts +2 -24
- package/dist/cli/menu/index.js +4 -178
- package/dist/cli/menu/menu.d.ts +23 -0
- package/dist/cli/menu/menu.js +185 -0
- package/dist/cli/menu/settings/categories.d.ts +2 -2
- package/dist/cli/menu/settings/categories.js +123 -20
- package/dist/cli/menu/settings/collections/collection-editor.d.ts +23 -0
- package/dist/cli/menu/settings/collections/collection-editor.js +89 -0
- package/dist/cli/menu/settings/collections/map-editor.d.ts +10 -0
- package/dist/cli/menu/settings/collections/map-editor.js +34 -0
- package/dist/cli/menu/settings/collections/object-list-editor.d.ts +10 -0
- package/dist/cli/menu/settings/collections/object-list-editor.js +23 -0
- package/dist/cli/menu/settings/collections/object-map-editor.d.ts +10 -0
- package/dist/cli/menu/settings/collections/object-map-editor.js +35 -0
- package/dist/cli/menu/settings/collections/string-list-editor.d.ts +12 -0
- package/dist/cli/menu/settings/collections/string-list-editor.js +39 -0
- package/dist/cli/menu/settings/config-file.d.ts +2 -2
- package/dist/cli/menu/settings/config-file.js +42 -19
- package/dist/cli/menu/settings/editor-actions.d.ts +2 -0
- package/dist/cli/menu/settings/editor-actions.js +2 -0
- package/dist/cli/menu/settings/format.d.ts +5 -0
- package/dist/cli/menu/settings/format.js +39 -0
- package/dist/cli/menu/settings/index.d.ts +1 -29
- package/dist/cli/menu/settings/index.js +1 -133
- package/dist/cli/menu/settings/object-editor.d.ts +12 -0
- package/dist/cli/menu/settings/object-editor.js +86 -0
- package/dist/cli/menu/settings/schema-node.d.ts +3 -1
- package/dist/cli/menu/settings/schema-node.js +71 -24
- package/dist/cli/menu/settings/settings-editor.d.ts +30 -0
- package/dist/cli/menu/settings/settings-editor.js +176 -0
- package/dist/cli/menu/settings/{editors.d.ts → value-editor.d.ts} +2 -13
- package/dist/cli/menu/settings/value-editor.js +137 -0
- package/dist/cli/menu/several.d.ts +4 -4
- package/dist/cli/menu/several.js +61 -20
- package/dist/cli/{colors.d.ts → output/colors.d.ts} +8 -8
- package/dist/cli/{colors.js → output/colors.js} +32 -14
- package/dist/cli/output/index.d.ts +3 -0
- package/dist/cli/output/index.js +3 -0
- package/dist/cli/output/print.d.ts +5 -0
- package/dist/cli/output/print.js +14 -0
- package/dist/cli/{progress.d.ts → output/progress.d.ts} +5 -5
- package/dist/cli/{progress.js → output/progress.js} +42 -19
- package/dist/cli/report.d.ts +2 -0
- package/dist/cli/report.js +20 -0
- package/dist/cli/tui/app.d.ts +6 -16
- package/dist/cli/tui/app.js +28 -8
- package/dist/cli/tui/dialogs/confirm-screen.d.ts +20 -0
- package/dist/cli/tui/dialogs/confirm-screen.js +50 -0
- package/dist/cli/tui/dialogs/message-screen.d.ts +17 -0
- package/dist/cli/tui/dialogs/message-screen.js +55 -0
- package/dist/cli/tui/dialogs/paragraphs.d.ts +2 -0
- package/dist/cli/tui/dialogs/paragraphs.js +5 -0
- package/dist/cli/tui/dialogs/text-screen.d.ts +26 -0
- package/dist/cli/tui/dialogs/text-screen.js +107 -0
- package/dist/cli/tui/frame.js +3 -1
- package/dist/cli/tui/index.d.ts +7 -3
- package/dist/cli/tui/index.js +4 -2
- package/dist/cli/tui/list/list-screen.d.ts +29 -0
- package/dist/cli/tui/{list-screen.js → list/list-screen.js} +86 -23
- package/dist/cli/tui/{list-screen.d.ts → list/list-types.d.ts} +0 -28
- package/dist/cli/tui/screen.d.ts +14 -0
- package/dist/cli/tui/terminal.js +34 -10
- package/dist/cli/tui/text.d.ts +2 -1
- package/dist/cli/tui/text.js +37 -7
- package/dist/cli/tui/theme.js +27 -9
- package/dist/cli/validate.d.ts +8 -8
- package/dist/cli/validate.js +32 -21
- package/dist/core/config/defaults.d.ts +2 -0
- package/dist/core/config/defaults.js +203 -0
- package/dist/core/config/index.d.ts +2 -0
- package/dist/core/config/index.js +3 -0
- package/dist/core/{config.d.ts → config/loader.d.ts} +1 -2
- package/dist/core/config/loader.js +47 -0
- package/dist/core/{detect-databases.js → detect/databases.js} +111 -23
- package/dist/core/detect/index.d.ts +4 -0
- package/dist/core/detect/index.js +4 -0
- package/dist/core/{detect-pwsh.d.ts → detect/pwsh.d.ts} +1 -1
- package/dist/core/{detect-pwsh.js → detect/pwsh.js} +25 -11
- package/dist/core/{detect-toolchains.d.ts → detect/toolchains.d.ts} +1 -1
- package/dist/core/{detect-toolchains.js → detect/toolchains.js} +42 -5
- package/dist/{guest/toolchains → core/detect}/versions.js +28 -12
- package/dist/core/disk.d.ts +2 -0
- package/dist/core/disk.js +46 -3
- package/dist/core/local-config/boot-wants.d.ts +45 -0
- package/dist/core/local-config/boot-wants.js +120 -0
- package/dist/core/local-config/file.d.ts +3 -0
- package/dist/core/local-config/file.js +16 -0
- package/dist/core/local-config/index.d.ts +5 -0
- package/dist/core/local-config/index.js +7 -0
- package/dist/core/{local-config.d.ts → local-config/overrides.d.ts} +3 -18
- package/dist/core/{local-config.js → local-config/overrides.js} +45 -52
- package/dist/core/local-config/policy.d.ts +19 -0
- package/dist/core/local-config/policy.js +45 -0
- package/dist/core/local-config/trust.d.ts +13 -0
- package/dist/core/local-config/trust.js +43 -0
- package/dist/core/package-info.d.ts +4 -0
- package/dist/core/package-info.js +13 -0
- package/dist/core/run/guest-workspace.d.ts +23 -0
- package/dist/core/run/guest-workspace.js +47 -0
- package/dist/core/run/index.d.ts +3 -0
- package/dist/core/run/index.js +3 -0
- package/dist/core/run/resolve-run.d.ts +3 -0
- package/dist/core/run/resolve-run.js +202 -0
- package/dist/core/run/versions.d.ts +13 -0
- package/dist/core/run/versions.js +65 -0
- package/dist/core/safe-paths.js +17 -5
- package/dist/core/schema/apps.d.ts +4 -4
- package/dist/core/schema/apps.js +55 -21
- package/dist/core/schema/common.d.ts +13 -10
- package/dist/core/schema/common.js +16 -10
- package/dist/core/schema/config.d.ts +15 -10
- package/dist/core/schema/config.js +78 -53
- package/dist/core/schema/databases.d.ts +4 -3
- package/dist/core/schema/databases.js +16 -12
- package/dist/core/schema/harness.d.ts +1 -1
- package/dist/core/schema/harness.js +17 -7
- package/dist/core/schema/index.d.ts +6 -0
- package/dist/core/schema/index.js +8 -0
- package/dist/core/schema/json-schema.js +10 -5
- package/dist/core/schema/profile.d.ts +4 -4
- package/dist/core/schema/profile.js +37 -17
- package/dist/core/schema/projects.d.ts +1 -1
- package/dist/core/schema/projects.js +16 -6
- package/dist/core/schema/sandbox.d.ts +11 -11
- package/dist/core/schema/sandbox.js +101 -37
- package/dist/core/schema/toolchains.d.ts +6 -1
- package/dist/core/schema/toolchains.js +84 -34
- package/dist/core/types.d.ts +19 -9
- package/dist/core/util/errors.d.ts +8 -0
- package/dist/core/util/errors.js +14 -0
- package/dist/core/util/fs.d.ts +8 -0
- package/dist/core/util/fs.js +40 -0
- package/dist/core/util/index.d.ts +7 -0
- package/dist/core/util/index.js +7 -0
- package/dist/core/util/jsonc.d.ts +6 -0
- package/dist/core/util/jsonc.js +25 -0
- package/dist/core/util/links.d.ts +10 -0
- package/dist/core/util/links.js +39 -0
- package/dist/core/util/paths.d.ts +7 -0
- package/dist/core/util/paths.js +33 -0
- package/dist/core/util/process.d.ts +15 -0
- package/dist/core/util/process.js +54 -0
- package/dist/core/util/text.d.ts +8 -0
- package/dist/core/util/text.js +8 -0
- package/dist/guest/{setup/agents.js → agents/agent-installer.js} +24 -4
- package/dist/guest/apps/after-install.d.ts +3 -0
- package/dist/guest/apps/after-install.js +47 -0
- package/dist/guest/apps/app-installer.d.ts +22 -0
- package/dist/guest/apps/app-installer.js +116 -0
- package/dist/guest/apps/find-exe.d.ts +5 -0
- package/dist/guest/apps/find-exe.js +41 -0
- package/dist/guest/apps/index.d.ts +3 -10
- package/dist/guest/apps/index.js +6 -206
- package/dist/guest/apps/resolvers.js +37 -9
- package/dist/guest/apps/shortcuts.d.ts +6 -0
- package/dist/guest/apps/shortcuts.js +28 -0
- package/dist/guest/apps/sources.d.ts +4 -0
- package/dist/guest/apps/sources.js +17 -0
- package/dist/guest/apps/unpack.d.ts +3 -0
- package/dist/guest/apps/unpack.js +47 -0
- package/dist/guest/{audit-parse.js → audit/parse.js} +39 -3
- package/dist/guest/{audit.d.ts → audit/process-audit.d.ts} +3 -1
- package/dist/guest/{audit.js → audit/process-audit.js} +33 -8
- package/dist/guest/boot/boot-env.d.ts +4 -0
- package/dist/guest/{boot-env.js → boot/boot-env.js} +7 -5
- package/dist/guest/boot/boot.d.ts +1 -0
- package/dist/guest/{main.js → boot/boot.js} +96 -50
- package/dist/guest/{guide.js → boot/guide.js} +32 -7
- package/dist/guest/{project-env.d.ts → boot/project-env.d.ts} +3 -3
- package/dist/guest/{project-env.js → boot/project-env.js} +12 -4
- package/dist/guest/boot/project-status.d.ts +5 -0
- package/dist/guest/boot/project-status.js +28 -0
- package/dist/guest/daemon/daemon.d.ts +1 -0
- package/dist/guest/daemon/daemon.js +51 -0
- package/dist/guest/daemon/exec.js +18 -6
- package/dist/guest/daemon/{shutdown.js → idle-shutdown.js} +5 -4
- package/dist/guest/daemon/{project.d.ts → project-provisioner.d.ts} +3 -3
- package/dist/guest/daemon/{project.js → project-provisioner.js} +60 -22
- package/dist/guest/daemon/relays.js +5 -3
- package/dist/guest/daemon/{session.js → sessions.js} +84 -24
- package/dist/guest/daemon/state.d.ts +4 -1
- package/dist/guest/daemon/state.js +34 -20
- package/dist/guest/databases/database-server.d.ts +13 -0
- package/dist/guest/databases/database-server.js +35 -0
- package/dist/guest/databases/dynamodb.d.ts +12 -0
- package/dist/guest/databases/dynamodb.js +81 -0
- package/dist/guest/databases/index.d.ts +2 -0
- package/dist/guest/databases/index.js +2 -0
- package/dist/guest/databases/mongodb.d.ts +7 -0
- package/dist/guest/databases/mongodb.js +46 -0
- package/dist/guest/databases/mysql.d.ts +7 -0
- package/dist/guest/databases/mysql.js +59 -0
- package/dist/guest/databases/names.d.ts +5 -0
- package/dist/guest/databases/names.js +8 -0
- package/dist/guest/databases/postgres.d.ts +9 -0
- package/dist/guest/databases/postgres.js +85 -0
- package/dist/guest/databases/redis.d.ts +7 -0
- package/dist/guest/databases/redis.js +25 -0
- package/dist/guest/databases/registry.d.ts +5 -0
- package/dist/guest/databases/registry.js +51 -0
- package/dist/guest/databases/sbx-db.d.ts +1 -0
- package/dist/guest/{db.js → databases/sbx-db.js} +13 -13
- package/dist/guest/{toolchains/databases → databases}/server.d.ts +5 -5
- package/dist/guest/{toolchains/databases → databases}/server.js +18 -13
- package/dist/guest/entries/daemon.js +16 -0
- package/dist/guest/entries/db.js +10 -0
- package/dist/guest/entries/gitguard.js +20 -0
- package/dist/guest/entries/main.d.ts +1 -0
- package/dist/guest/entries/main.js +24 -0
- package/dist/guest/entries/netproxy.d.ts +1 -0
- package/dist/guest/entries/netproxy.js +7 -0
- package/dist/guest/entries/view.d.ts +1 -0
- package/dist/guest/entries/view.js +11 -0
- package/dist/guest/{gitguard.js → git/decision.js} +49 -26
- package/dist/guest/network/addresses.d.ts +2 -0
- package/dist/guest/network/addresses.js +6 -0
- package/dist/guest/{setup/network.d.ts → network/allow-only.d.ts} +0 -10
- package/dist/guest/network/allow-only.js +84 -0
- package/dist/guest/network/firewall.d.ts +9 -0
- package/dist/guest/{setup/network.js → network/firewall.js} +58 -63
- package/dist/guest/network/proxy-server.d.ts +2 -0
- package/dist/guest/{netproxy.js → network/proxy-server.js} +37 -18
- package/dist/guest/{helpers.d.ts → runtime/csc.d.ts} +1 -1
- package/dist/guest/{helpers.js → runtime/csc.js} +7 -2
- package/dist/guest/runtime/fs.d.ts +2 -0
- package/dist/guest/runtime/fs.js +6 -0
- package/dist/guest/runtime/log.d.ts +3 -0
- package/dist/guest/runtime/log.js +22 -0
- package/dist/guest/runtime/paths.d.ts +13 -0
- package/dist/guest/runtime/paths.js +14 -0
- package/dist/guest/{ports.js → runtime/ports.js} +8 -2
- package/dist/guest/runtime/process.d.ts +15 -0
- package/dist/guest/runtime/process.js +59 -0
- package/dist/guest/{project-context.js → runtime/project-context.js} +1 -1
- package/dist/guest/runtime/session.d.ts +5 -0
- package/dist/guest/runtime/session.js +10 -0
- package/dist/guest/runtime/status.d.ts +7 -0
- package/dist/guest/runtime/status.js +57 -0
- package/dist/guest/{cmdline.js → sessions/cmdline.js} +10 -4
- package/dist/guest/{ptyhost.js → sessions/pty-host.js} +12 -5
- package/dist/guest/{view.js → sessions/viewer.js} +8 -11
- package/dist/guest/setup/claude-mem.d.ts +10 -0
- package/dist/guest/setup/{claude.js → claude-mem.js} +18 -78
- package/dist/guest/setup/{claude.d.ts → claude-profile.d.ts} +0 -10
- package/dist/guest/setup/claude-profile.js +89 -0
- package/dist/guest/setup/desktop.d.ts +2 -0
- package/dist/guest/setup/desktop.js +32 -0
- package/dist/guest/setup/environment.js +28 -5
- package/dist/guest/setup/{user.d.ts → git-identity.d.ts} +0 -2
- package/dist/guest/setup/git-identity.js +34 -0
- package/dist/guest/{gitrules.d.ts → setup/git-rules.d.ts} +1 -1
- package/dist/guest/setup/git-rules.js +50 -0
- package/dist/guest/setup/hooks.js +22 -5
- package/dist/guest/setup/{policy.js → managed-policy.js} +2 -2
- package/dist/guest/toolchains/catalogue.d.ts +4 -4
- package/dist/guest/toolchains/catalogue.js +30 -7
- package/dist/guest/toolchains/detect.d.ts +12 -0
- package/dist/guest/toolchains/detect.js +54 -0
- package/dist/guest/toolchains/index.d.ts +3 -17
- package/dist/guest/toolchains/index.js +1 -106
- package/dist/guest/toolchains/install.d.ts +20 -0
- package/dist/guest/toolchains/install.js +29 -0
- package/dist/guest/toolchains/languages/go.d.ts +3 -0
- package/dist/guest/toolchains/{go.js → languages/go.js} +27 -9
- package/dist/guest/toolchains/languages/java.d.ts +8 -0
- package/dist/guest/toolchains/{java.js → languages/java.js} +57 -18
- package/dist/guest/toolchains/languages/node.d.ts +3 -0
- package/dist/guest/toolchains/{node.js → languages/node.js} +51 -18
- package/dist/guest/toolchains/languages/php.d.ts +3 -0
- package/dist/guest/toolchains/{scripting → languages}/php.js +36 -11
- package/dist/guest/toolchains/languages/python-tools.d.ts +3 -0
- package/dist/guest/toolchains/languages/python-tools.js +12 -0
- package/dist/guest/toolchains/languages/python.d.ts +3 -0
- package/dist/guest/toolchains/{python.js → languages/python.js} +29 -16
- package/dist/guest/toolchains/languages/ruby.d.ts +3 -0
- package/dist/guest/toolchains/{scripting → languages}/ruby.js +28 -10
- package/dist/guest/toolchains/leftovers.d.ts +1 -1
- package/dist/guest/toolchains/leftovers.js +13 -11
- package/dist/guest/toolchains/managers.d.ts +6 -6
- package/dist/guest/toolchains/managers.js +38 -17
- package/dist/guest/toolchains/native/binstall.d.ts +3 -2
- package/dist/guest/toolchains/native/binstall.js +20 -8
- package/dist/guest/toolchains/native/cpp.d.ts +2 -2
- package/dist/guest/toolchains/native/cpp.js +23 -8
- package/dist/guest/toolchains/native/dotnet.d.ts +5 -3
- package/dist/guest/toolchains/native/dotnet.js +72 -24
- package/dist/guest/toolchains/native/mesa.d.ts +2 -2
- package/dist/guest/toolchains/native/mesa.js +27 -10
- package/dist/guest/toolchains/native/msvc/environment.d.ts +4 -4
- package/dist/guest/toolchains/native/msvc/environment.js +30 -16
- package/dist/guest/toolchains/native/msvc/index.d.ts +3 -3
- package/dist/guest/toolchains/native/msvc/index.js +10 -8
- package/dist/guest/toolchains/native/msvc/packages.d.ts +1 -1
- package/dist/guest/toolchains/native/msvc/packages.js +69 -23
- package/dist/guest/toolchains/native/msvc/tree.d.ts +6 -6
- package/dist/guest/toolchains/native/msvc/tree.js +15 -9
- package/dist/guest/toolchains/native/rust-extras.d.ts +23 -0
- package/dist/guest/toolchains/native/rust-extras.js +100 -0
- package/dist/guest/toolchains/native/rust.d.ts +2 -2
- package/dist/guest/toolchains/native/rust.js +41 -10
- package/dist/guest/toolchains/{scripting → native}/vcruntime.d.ts +2 -2
- package/dist/guest/toolchains/{scripting → native}/vcruntime.js +17 -7
- package/dist/guest/toolchains/package-ledger.d.ts +17 -0
- package/dist/guest/toolchains/package-ledger.js +54 -0
- package/dist/guest/toolchains/plan.d.ts +3 -24
- package/dist/guest/toolchains/plan.js +99 -111
- package/dist/guest/toolchains/runtimes.d.ts +6 -6
- package/dist/guest/toolchains/runtimes.js +31 -13
- package/dist/guest/toolchains/scheduler.d.ts +22 -0
- package/dist/guest/toolchains/scheduler.js +123 -0
- package/dist/guest/toolchains/setup.d.ts +10 -0
- package/dist/guest/toolchains/setup.js +22 -0
- package/dist/guest/toolchains/state-file.d.ts +3 -0
- package/dist/guest/toolchains/state-file.js +10 -0
- package/dist/guest/toolchains/step.d.ts +24 -0
- package/dist/guest/toolchains/step.js +1 -0
- package/dist/guest/toolchains/tool-env.d.ts +12 -0
- package/dist/guest/toolchains/tool-env.js +16 -0
- package/dist/guest/toolchains/tools/cli.d.ts +10 -0
- package/dist/guest/toolchains/{cli.js → tools/cli.js} +35 -15
- package/dist/guest/toolchains/tools/git.d.ts +3 -0
- package/dist/guest/toolchains/{git.js → tools/git.js} +38 -15
- package/dist/guest/toolchains/tools/pwsh.d.ts +4 -0
- package/dist/guest/toolchains/{pwsh.js → tools/pwsh.js} +14 -7
- package/dist/guest/toolchains/{vscode-profile.d.ts → tools/vscode-profile.d.ts} +6 -6
- package/dist/guest/toolchains/{vscode-profile.js → tools/vscode-profile.js} +28 -12
- package/dist/guest/toolchains/{vscode.d.ts → tools/vscode.d.ts} +6 -6
- package/dist/guest/toolchains/{vscode.js → tools/vscode.js} +67 -21
- package/dist/guest/toolchains/version-cache.d.ts +16 -0
- package/dist/guest/toolchains/version-cache.js +67 -0
- package/dist/host/agent-commands/commands.d.ts +13 -0
- package/dist/host/agent-commands/commands.js +33 -0
- package/dist/host/agent-commands/forwarders.d.ts +7 -0
- package/dist/host/agent-commands/forwarders.js +31 -0
- package/dist/host/agent-commands/index.d.ts +4 -0
- package/dist/host/agent-commands/index.js +4 -0
- package/dist/host/agent-commands/reconcile.d.ts +12 -0
- package/dist/host/agent-commands/reconcile.js +69 -0
- package/dist/host/agent-commands/user-path.d.ts +2 -0
- package/dist/host/agent-commands/user-path.js +33 -0
- package/dist/host/audit/collect.d.ts +2 -2
- package/dist/host/audit/collect.js +59 -22
- package/dist/host/audit/log.d.ts +2 -2
- package/dist/host/audit/log.js +24 -8
- package/dist/host/{attach.d.ts → channel/attach.d.ts} +2 -2
- package/dist/host/{attach.js → channel/attach.js} +33 -15
- package/dist/host/channel/channel.d.ts +51 -0
- package/dist/host/channel/channel.js +196 -0
- package/dist/host/channel/index.d.ts +2 -0
- package/dist/host/channel/index.js +2 -0
- package/dist/host/guard/agent-files.d.ts +7 -0
- package/dist/host/guard/agent-files.js +103 -0
- package/dist/host/guard/commands.d.ts +10 -0
- package/dist/host/guard/commands.js +123 -0
- package/dist/host/guard/file-hash.d.ts +4 -0
- package/dist/host/guard/file-hash.js +37 -0
- package/dist/host/guard/git-config.d.ts +5 -0
- package/dist/host/guard/git-config.js +62 -0
- package/dist/host/guard/git-dirs.d.ts +12 -0
- package/dist/host/guard/git-dirs.js +53 -0
- package/dist/host/guard/index.d.ts +5 -0
- package/dist/host/guard/index.js +4 -0
- package/dist/host/guard/mark-of-the-web.d.ts +8 -0
- package/dist/host/guard/mark-of-the-web.js +74 -0
- package/dist/host/guard/nested-repos.d.ts +14 -0
- package/dist/host/guard/nested-repos.js +88 -0
- package/dist/host/guard/quarantine.d.ts +3 -0
- package/dist/host/guard/quarantine.js +24 -0
- package/dist/host/guard/repo-guard.d.ts +10 -0
- package/dist/host/guard/repo-guard.js +36 -0
- package/dist/host/guard/store.d.ts +40 -0
- package/dist/host/guard/store.js +145 -0
- package/dist/host/guard/types.d.ts +27 -0
- package/dist/host/guard/types.js +3 -0
- package/dist/host/guard/watch-state.d.ts +9 -0
- package/dist/host/guard/watch-state.js +26 -0
- package/dist/host/launch/boot-projects.d.ts +17 -0
- package/dist/host/launch/{projects.js → boot-projects.js} +22 -13
- package/dist/host/{database-plan.d.ts → launch/database-plan.d.ts} +5 -5
- package/dist/host/{database-plan.js → launch/database-plan.js} +24 -13
- package/dist/host/launch/generate.d.ts +4 -0
- package/dist/host/launch/generate.js +77 -0
- package/dist/host/launch/index.d.ts +10 -0
- package/dist/host/launch/index.js +10 -0
- package/dist/host/launch/mappings.d.ts +5 -5
- package/dist/host/launch/mappings.js +37 -24
- package/dist/host/launch/pc-scan.d.ts +5 -0
- package/dist/host/{pc-scan.js → launch/pc-scan.js} +20 -13
- package/dist/host/launch/project-scan.d.ts +7 -0
- package/dist/host/{project-scan.js → launch/project-scan.js} +29 -21
- package/dist/host/launch/session-file.d.ts +23 -0
- package/dist/host/launch/session-file.js +73 -0
- package/dist/host/launch/stage.d.ts +5 -5
- package/dist/host/launch/stage.js +14 -13
- package/dist/host/launch/toolchains.d.ts +4 -0
- package/dist/host/launch/toolchains.js +11 -0
- package/dist/host/launch/{wsb.d.ts → wsb-file.d.ts} +4 -2
- package/dist/host/launch/wsb-file.js +56 -0
- package/dist/host/life/crash-report.d.ts +8 -0
- package/dist/host/life/crash-report.js +87 -0
- package/dist/host/life/index.d.ts +6 -0
- package/dist/host/life/index.js +6 -0
- package/dist/host/life/keep-awake.d.ts +10 -0
- package/dist/host/life/keep-awake.js +29 -0
- package/dist/host/life/life-record.d.ts +48 -0
- package/dist/host/life/life-record.js +76 -0
- package/dist/host/life/stop-events.d.ts +27 -0
- package/dist/host/life/stop-events.js +96 -0
- package/dist/host/life/stop-warning.d.ts +4 -0
- package/dist/host/life/stop-warning.js +25 -0
- package/dist/host/life/windows-update.d.ts +3 -0
- package/dist/host/life/windows-update.js +11 -0
- package/dist/host/native.d.ts +4 -0
- package/dist/host/native.js +11 -0
- package/dist/host/network/index.d.ts +1 -0
- package/dist/host/network/index.js +1 -0
- package/dist/host/{port-forward.d.ts → network/port-forward.d.ts} +1 -1
- package/dist/host/{port-forward.js → network/port-forward.js} +16 -10
- package/dist/host/profile/accounts.d.ts +37 -0
- package/dist/host/profile/accounts.js +146 -0
- package/dist/host/profile/claude-login.d.ts +22 -0
- package/dist/host/profile/claude-login.js +57 -0
- package/dist/host/{claude-profile.d.ts → profile/claude-profile.d.ts} +9 -9
- package/dist/host/{claude-profile.js → profile/claude-profile.js} +32 -22
- package/dist/host/profile/index.d.ts +7 -0
- package/dist/host/profile/index.js +7 -0
- package/dist/host/profile/personalize.d.ts +2 -0
- package/dist/host/profile/personalize.js +127 -0
- package/dist/host/profile/reg-file.d.ts +8 -0
- package/dist/host/profile/reg-file.js +45 -0
- package/dist/host/profile/secret-files.d.ts +2 -0
- package/dist/host/profile/secret-files.js +25 -0
- package/dist/host/profile/secret-patterns.d.ts +6 -0
- package/dist/host/profile/secret-patterns.js +128 -0
- package/dist/host/profile/secrets.d.ts +12 -0
- package/dist/host/profile/secrets.js +100 -0
- package/dist/host/projects/index.d.ts +4 -0
- package/dist/host/projects/index.js +4 -0
- package/dist/host/{join.d.ts → projects/join.d.ts} +12 -9
- package/dist/host/{join.js → projects/join.js} +62 -33
- package/dist/host/projects/known.d.ts +28 -0
- package/dist/host/projects/known.js +55 -0
- package/dist/host/projects/mapper.d.ts +29 -0
- package/dist/host/projects/mapper.js +88 -0
- package/dist/host/projects/registry.d.ts +83 -0
- package/dist/host/projects/registry.js +136 -0
- package/dist/host/sandbox/doctor.d.ts +2 -0
- package/dist/host/sandbox/doctor.js +42 -0
- package/dist/host/sandbox/host-claude.d.ts +1 -0
- package/dist/host/sandbox/host-claude.js +26 -0
- package/dist/host/sandbox/index.d.ts +6 -0
- package/dist/host/sandbox/index.js +6 -0
- package/dist/host/{platform.d.ts → sandbox/platform.d.ts} +0 -5
- package/dist/host/sandbox/platform.js +60 -0
- package/dist/host/sandbox/probe.d.ts +3 -0
- package/dist/host/sandbox/probe.js +47 -0
- package/dist/host/{window.js → sandbox/window.js} +7 -5
- package/dist/host/{wsb.js → sandbox/wsb-cli.js} +31 -8
- package/dist/host/{cleanup.js → storage/cleanup.js} +27 -12
- package/dist/host/storage/index.d.ts +2 -0
- package/dist/host/storage/index.js +2 -0
- package/dist/host/storage/state-files.d.ts +4 -0
- package/dist/host/storage/state-files.js +10 -0
- package/dist/host/test-guard.js +1 -1
- package/dist/host/tools/conpty.d.ts +8 -0
- package/dist/host/tools/conpty.js +58 -0
- package/dist/host/tools/index.d.ts +2 -0
- package/dist/host/tools/index.js +2 -0
- package/dist/host/{terminal.d.ts → tools/windows-terminal.d.ts} +2 -10
- package/dist/host/{terminal.js → tools/windows-terminal.js} +33 -57
- package/dist/host/workspace-view/active-views.d.ts +3 -0
- package/dist/host/workspace-view/active-views.js +22 -0
- package/dist/host/workspace-view/index.d.ts +2 -18
- package/dist/host/workspace-view/index.js +2 -49
- package/dist/host/workspace-view/plan.d.ts +16 -0
- package/dist/host/workspace-view/plan.js +50 -0
- package/dist/host/workspace-view/rules.js +10 -3
- package/dist/host/workspace-view/view-state.d.ts +10 -0
- package/dist/host/workspace-view/view-state.js +31 -0
- package/dist/host/workspace-view/view.d.ts +1 -0
- package/dist/host/workspace-view/view.js +51 -55
- package/dist/runtime/daemon.js +4220 -1968
- package/dist/runtime/db.js +2134 -849
- package/dist/runtime/gitguard.js +29 -11
- package/dist/runtime/main.js +4687 -2243
- package/dist/runtime/netproxy.js +1644 -420
- package/dist/runtime/view.js +1356 -428
- package/dist/selftest/accounts.test.d.ts +1 -1
- package/dist/selftest/accounts.test.js +20 -17
- package/dist/selftest/agent-commands.test.d.ts +1 -1
- package/dist/selftest/agent-commands.test.js +9 -5
- package/dist/selftest/audit.test.d.ts +1 -1
- package/dist/selftest/audit.test.js +46 -13
- package/dist/selftest/channel.test.d.ts +1 -1
- package/dist/selftest/channel.test.js +63 -16
- package/dist/selftest/cli.test.d.ts +1 -1
- package/dist/selftest/cli.test.js +68 -16
- package/dist/selftest/cmdline.test.d.ts +1 -1
- package/dist/selftest/cmdline.test.js +36 -7
- package/dist/selftest/config.test.d.ts +1 -1
- package/dist/selftest/config.test.js +12 -5
- package/dist/selftest/data.test.d.ts +1 -1
- package/dist/selftest/data.test.js +35 -6
- package/dist/selftest/detect.test.d.ts +1 -1
- package/dist/selftest/detect.test.js +22 -9
- package/dist/selftest/generate.test.d.ts +1 -1
- package/dist/selftest/generate.test.js +33 -9
- package/dist/selftest/git-access.test.d.ts +1 -1
- package/dist/selftest/git-access.test.js +42 -4
- package/dist/selftest/guest-boot.test.d.ts +1 -1
- package/dist/selftest/guest-boot.test.js +25 -7
- package/dist/selftest/host-sim.test.d.ts +1 -1
- package/dist/selftest/host-sim.test.js +27 -3
- package/dist/selftest/hostile-input.test.d.ts +1 -1
- package/dist/selftest/hostile-input.test.js +5 -5
- package/dist/selftest/index.d.ts +1 -1
- package/dist/selftest/index.js +72 -16
- package/dist/selftest/layout.test.d.ts +2 -0
- package/dist/selftest/layout.test.js +131 -0
- package/dist/selftest/links.test.d.ts +1 -1
- package/dist/selftest/links.test.js +16 -11
- package/dist/selftest/live-daemon.test.d.ts +1 -1
- package/dist/selftest/live-daemon.test.js +20 -8
- package/dist/selftest/live-git.test.d.ts +1 -1
- package/dist/selftest/live-git.test.js +13 -4
- package/dist/selftest/live-network.test.d.ts +1 -1
- package/dist/selftest/live-network.test.js +24 -9
- package/dist/selftest/live-projects.test.d.ts +1 -1
- package/dist/selftest/live-projects.test.js +47 -20
- package/dist/selftest/live-terminal.test.d.ts +1 -1
- package/dist/selftest/live-terminal.test.js +41 -15
- package/dist/selftest/local-config.test.d.ts +1 -1
- package/dist/selftest/local-config.test.js +64 -16
- package/dist/selftest/mirror.test.d.ts +1 -1
- package/dist/selftest/mirror.test.js +102 -32
- package/dist/selftest/network.test.d.ts +1 -1
- package/dist/selftest/network.test.js +17 -8
- package/dist/selftest/personalization.test.d.ts +1 -1
- package/dist/selftest/personalization.test.js +12 -5
- package/dist/selftest/projects.test.d.ts +1 -1
- package/dist/selftest/projects.test.js +280 -85
- package/dist/selftest/repair.test.d.ts +1 -1
- package/dist/selftest/repair.test.js +17 -5
- package/dist/selftest/repo-guard.test.d.ts +1 -1
- package/dist/selftest/repo-guard.test.js +21 -20
- package/dist/selftest/secrets.test.d.ts +1 -1
- package/dist/selftest/secrets.test.js +57 -13
- package/dist/selftest/setup.test.d.ts +1 -1
- package/dist/selftest/setup.test.js +25 -5
- package/dist/selftest/{fixtures.d.ts → support/fixtures.d.ts} +5 -3
- package/dist/selftest/{fixtures.js → support/fixtures.js} +95 -17
- package/dist/selftest/{harness.js → support/harness.js} +24 -7
- package/dist/selftest/{live.d.ts → support/live.d.ts} +2 -2
- package/dist/selftest/{live.js → support/live.js} +34 -10
- package/dist/selftest/support/suite.js +1 -0
- package/dist/selftest/sync.test.d.ts +1 -1
- package/dist/selftest/sync.test.js +64 -26
- package/dist/selftest/test-guard.test.d.ts +1 -1
- package/dist/selftest/test-guard.test.js +43 -15
- package/dist/selftest/toolchains.test.d.ts +1 -1
- package/dist/selftest/toolchains.test.js +135 -36
- package/dist/selftest/workspace-view.test.d.ts +1 -1
- package/dist/selftest/workspace-view.test.js +48 -11
- package/dist/selftest/workspace.test.d.ts +1 -1
- package/dist/selftest/workspace.test.js +13 -4
- package/dist/shared/{apps.d.ts → apps/catalogue.d.ts} +1 -11
- package/dist/shared/apps/catalogue.js +768 -0
- package/dist/shared/apps/index.d.ts +2 -0
- package/dist/shared/apps/index.js +2 -0
- package/dist/shared/apps/selection.d.ts +11 -0
- package/dist/shared/apps/selection.js +40 -0
- package/dist/shared/channel/index.d.ts +2 -0
- package/dist/shared/channel/index.js +2 -0
- package/dist/shared/channel/run-dir.d.ts +30 -0
- package/dist/shared/channel/run-dir.js +84 -0
- package/dist/shared/{schema.d.ts → channel/schema.d.ts} +38 -21
- package/dist/shared/{schema.js → channel/schema.js} +62 -35
- package/dist/shared/download/archive.d.ts +13 -0
- package/dist/shared/download/archive.js +57 -0
- package/dist/shared/download/downloader.d.ts +35 -0
- package/dist/shared/download/downloader.js +110 -0
- package/dist/shared/download/github.d.ts +16 -0
- package/dist/shared/download/github.js +74 -0
- package/dist/shared/download/http.d.ts +5 -0
- package/dist/shared/download/http.js +30 -0
- package/dist/shared/download/index.d.ts +5 -0
- package/dist/shared/download/index.js +5 -0
- package/dist/shared/download/spawn.d.ts +2 -0
- package/dist/shared/download/spawn.js +7 -0
- package/dist/shared/io/index.d.ts +3 -0
- package/dist/shared/io/index.js +3 -0
- package/dist/shared/io/json-file.d.ts +10 -0
- package/dist/shared/io/json-file.js +21 -0
- package/dist/shared/io/json.d.ts +13 -0
- package/dist/shared/io/json.js +49 -0
- package/dist/shared/{safe-remove.js → io/safe-remove.js} +32 -7
- package/dist/shared/{netrules.js → network/firewall-rules.js} +36 -5
- package/dist/shared/network/index.d.ts +2 -0
- package/dist/shared/network/index.js +2 -0
- package/dist/shared/{netpolicy.js → network/policy.js} +66 -11
- package/dist/shared/{paths.js → paths/claude-paths.js} +12 -2
- package/dist/shared/{guest-paths.d.ts → paths/guest-paths.d.ts} +6 -12
- package/dist/shared/{guest-paths.js → paths/guest-paths.js} +53 -36
- package/dist/shared/paths/index.d.ts +3 -0
- package/dist/shared/paths/index.js +3 -0
- package/dist/shared/{projects.js → paths/projects.js} +13 -3
- package/dist/shared/pty/client.d.ts +21 -0
- package/dist/shared/pty/client.js +79 -0
- package/dist/shared/{console-input.js → pty/console-input.js} +26 -6
- package/dist/shared/pty/index.d.ts +6 -0
- package/dist/shared/pty/index.js +6 -0
- package/dist/shared/pty/input-joiner.d.ts +15 -0
- package/dist/shared/pty/input-joiner.js +44 -0
- package/dist/shared/pty/output-filter.d.ts +13 -0
- package/dist/shared/pty/output-filter.js +140 -0
- package/dist/shared/pty/protocol.d.ts +36 -0
- package/dist/shared/pty/protocol.js +60 -0
- package/dist/shared/pty/terminal.d.ts +24 -0
- package/dist/shared/pty/terminal.js +147 -0
- package/dist/shared/test-guard.js +3 -1
- package/dist/sync/claude-mem.d.ts +1 -1
- package/dist/sync/claude-mem.js +9 -4
- package/dist/sync/history.d.ts +1 -29
- package/dist/sync/history.js +57 -45
- package/dist/sync/index.d.ts +5 -0
- package/dist/sync/index.js +5 -0
- package/dist/sync/sync-cycle.d.ts +18 -0
- package/dist/sync/sync-cycle.js +85 -0
- package/dist/sync/sync-state.d.ts +32 -0
- package/dist/sync/sync-state.js +37 -0
- package/dist/sync/watcher.d.ts +0 -18
- package/dist/sync/watcher.js +66 -100
- package/native/keep-awake.ps1 +8 -0
- package/native/power.cs +23 -0
- package/native/stop-events.ps1 +38 -0
- package/package.json +11 -3
- package/sandbox/linkgate.cs +98 -0
- package/sandbox/memlog.ps1 +15 -6
- package/schemas/config.schema.json +34 -1
- package/schemas/sandbox-config.schema.json +34 -1
- package/dist/cli/boot-progress.d.ts +0 -22
- package/dist/cli/boot-progress.js +0 -59
- package/dist/cli/commands/launch.d.ts +0 -32
- package/dist/cli/commands/launch.js +0 -421
- package/dist/cli/commands/maintenance.d.ts +0 -10
- package/dist/cli/commands/maintenance.js +0 -220
- package/dist/cli/commands/project.d.ts +0 -33
- package/dist/cli/commands/project.js +0 -102
- package/dist/cli/commands/projects.d.ts +0 -14
- package/dist/cli/commands/projects.js +0 -146
- package/dist/cli/commands/restart.d.ts +0 -6
- package/dist/cli/commands/restart.js +0 -95
- package/dist/cli/commands/sessions.d.ts +0 -12
- package/dist/cli/commands/sessions.js +0 -258
- package/dist/cli/menu/settings/editors.js +0 -305
- package/dist/cli/tui/dialogs.d.ts +0 -57
- package/dist/cli/tui/dialogs.js +0 -162
- package/dist/core/config.js +0 -109
- package/dist/core/project-policy.d.ts +0 -62
- package/dist/core/project-policy.js +0 -121
- package/dist/core/schema.d.ts +0 -6
- package/dist/core/schema.js +0 -8
- package/dist/core/util.d.ts +0 -62
- package/dist/core/util.js +0 -156
- package/dist/core/workspace.d.ts +0 -35
- package/dist/core/workspace.js +0 -206
- package/dist/guest/boot-env.d.ts +0 -4
- package/dist/guest/daemon.js +0 -57
- package/dist/guest/env.d.ts +0 -56
- package/dist/guest/env.js +0 -115
- package/dist/guest/gitrules.js +0 -11
- package/dist/guest/project-status.d.ts +0 -5
- package/dist/guest/project-status.js +0 -17
- package/dist/guest/setup/user.js +0 -51
- package/dist/guest/toolchains/cli.d.ts +0 -10
- package/dist/guest/toolchains/common.d.ts +0 -54
- package/dist/guest/toolchains/common.js +0 -147
- package/dist/guest/toolchains/databases/dynamodb.d.ts +0 -8
- package/dist/guest/toolchains/databases/dynamodb.js +0 -52
- package/dist/guest/toolchains/databases/index.d.ts +0 -6
- package/dist/guest/toolchains/databases/index.js +0 -62
- package/dist/guest/toolchains/databases/mongodb.d.ts +0 -3
- package/dist/guest/toolchains/databases/mongodb.js +0 -31
- package/dist/guest/toolchains/databases/mysql.d.ts +0 -3
- package/dist/guest/toolchains/databases/mysql.js +0 -38
- package/dist/guest/toolchains/databases/postgres.d.ts +0 -5
- package/dist/guest/toolchains/databases/postgres.js +0 -38
- package/dist/guest/toolchains/databases/redis.d.ts +0 -3
- package/dist/guest/toolchains/databases/redis.js +0 -16
- package/dist/guest/toolchains/git.d.ts +0 -3
- package/dist/guest/toolchains/go.d.ts +0 -3
- package/dist/guest/toolchains/java.d.ts +0 -8
- package/dist/guest/toolchains/node.d.ts +0 -3
- package/dist/guest/toolchains/pwsh.d.ts +0 -4
- package/dist/guest/toolchains/python.d.ts +0 -3
- package/dist/guest/toolchains/scripting/php.d.ts +0 -3
- package/dist/guest/toolchains/scripting/ruby.d.ts +0 -3
- package/dist/host/accounts.d.ts +0 -32
- package/dist/host/accounts.js +0 -128
- package/dist/host/agent-commands.d.ts +0 -25
- package/dist/host/agent-commands.js +0 -145
- package/dist/host/channel.d.ts +0 -38
- package/dist/host/channel.js +0 -163
- package/dist/host/generate.d.ts +0 -13
- package/dist/host/generate.js +0 -115
- package/dist/host/launch/projects.d.ts +0 -17
- package/dist/host/launch/wsb.js +0 -34
- package/dist/host/motw.d.ts +0 -17
- package/dist/host/motw.js +0 -74
- package/dist/host/pc-scan.d.ts +0 -6
- package/dist/host/personalize.d.ts +0 -10
- package/dist/host/personalize.js +0 -97
- package/dist/host/platform.js +0 -129
- package/dist/host/project-scan.d.ts +0 -7
- package/dist/host/projects.d.ts +0 -123
- package/dist/host/projects.js +0 -196
- package/dist/host/repo-guard.d.ts +0 -43
- package/dist/host/repo-guard.js +0 -347
- package/dist/host/secrets.d.ts +0 -14
- package/dist/host/secrets.js +0 -133
- package/dist/host/stops.d.ts +0 -67
- package/dist/host/stops.js +0 -126
- package/dist/shared/apps.js +0 -114
- package/dist/shared/download.d.ts +0 -63
- package/dist/shared/download.js +0 -238
- package/dist/shared/pty-client.d.ts +0 -108
- package/dist/shared/pty-client.js +0 -406
- package/dist/shared/rundir.d.ts +0 -41
- package/dist/shared/rundir.js +0 -96
- /package/dist/{guest/daemon.d.ts → cli/tui/list/list-types.js} +0 -0
- /package/dist/{guest/db.d.ts → cli/tui/screen.js} +0 -0
- /package/dist/core/{detect-databases.d.ts → detect/databases.d.ts} +0 -0
- /package/dist/{guest/toolchains → core/detect}/versions.d.ts +0 -0
- /package/dist/guest/{setup/agents.d.ts → agents/agent-installer.d.ts} +0 -0
- /package/dist/guest/{audit-parse.d.ts → audit/parse.d.ts} +0 -0
- /package/dist/guest/{guide.d.ts → boot/guide.d.ts} +0 -0
- /package/dist/guest/daemon/{shutdown.d.ts → idle-shutdown.d.ts} +0 -0
- /package/dist/guest/daemon/{session.d.ts → sessions.d.ts} +0 -0
- /package/dist/guest/{main.d.ts → entries/daemon.d.ts} +0 -0
- /package/dist/guest/{netproxy.d.ts → entries/db.d.ts} +0 -0
- /package/dist/{selftest/suite.js → guest/entries/gitguard.d.ts} +0 -0
- /package/dist/guest/{gitguard.d.ts → git/decision.d.ts} +0 -0
- /package/dist/guest/{ports.d.ts → runtime/ports.d.ts} +0 -0
- /package/dist/guest/{project-context.d.ts → runtime/project-context.d.ts} +0 -0
- /package/dist/guest/{cmdline.d.ts → sessions/cmdline.d.ts} +0 -0
- /package/dist/guest/{ptyhost.d.ts → sessions/pty-host.d.ts} +0 -0
- /package/dist/guest/{view.d.ts → sessions/viewer.d.ts} +0 -0
- /package/dist/guest/setup/{policy.d.ts → managed-policy.d.ts} +0 -0
- /package/dist/host/{window.d.ts → sandbox/window.d.ts} +0 -0
- /package/dist/host/{wsb.d.ts → sandbox/wsb-cli.d.ts} +0 -0
- /package/dist/host/{cleanup.d.ts → storage/cleanup.d.ts} +0 -0
- /package/dist/selftest/{harness.d.ts → support/harness.d.ts} +0 -0
- /package/dist/selftest/{suite.d.ts → support/suite.d.ts} +0 -0
- /package/dist/shared/{safe-remove.d.ts → io/safe-remove.d.ts} +0 -0
- /package/dist/shared/{netrules.d.ts → network/firewall-rules.d.ts} +0 -0
- /package/dist/shared/{netpolicy.d.ts → network/policy.d.ts} +0 -0
- /package/dist/shared/{paths.d.ts → paths/claude-paths.d.ts} +0 -0
- /package/dist/shared/{projects.d.ts → paths/projects.d.ts} +0 -0
- /package/dist/shared/{console-input.d.ts → pty/console-input.d.ts} +0 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// Client side of the ptyhost protocol (see sandbox/ptyhost.cs). Used by the window inside the sandbox and by
|
|
2
|
+
// `--terminal` / `attach` on the host, so it only depends on Node built-ins.
|
|
3
|
+
export const FrameType = {
|
|
4
|
+
Hello: 1,
|
|
5
|
+
Input: 2,
|
|
6
|
+
Resize: 3,
|
|
7
|
+
Restart: 4,
|
|
8
|
+
Ping: 5,
|
|
9
|
+
Output: 16,
|
|
10
|
+
Exit: 17,
|
|
11
|
+
Error: 18,
|
|
12
|
+
Restarting: 19,
|
|
13
|
+
Status: 20,
|
|
14
|
+
Console: 21,
|
|
15
|
+
};
|
|
16
|
+
/** HELLO flags: control-only connections get no output and never size the console; a query only asks for STATUS. */
|
|
17
|
+
export const HelloFlag = { ControlOnly: 1, Query: 2 };
|
|
18
|
+
/** Viewers ping this often; ptyhost counts a viewer as gone after 15 s of silence (e.g. its terminal tab was closed). */
|
|
19
|
+
export const PING_INTERVAL_MS = 5000;
|
|
20
|
+
/** Ctrl+] — the same detach key telnet uses; Claude Code does not bind it. */
|
|
21
|
+
export const DETACH_KEY = 0x1d;
|
|
22
|
+
export const encodeFrame = (type, payload = Buffer.alloc(0)) => {
|
|
23
|
+
const header = Buffer.alloc(5);
|
|
24
|
+
header.writeUInt8(type, 0);
|
|
25
|
+
header.writeUInt32LE(payload.length, 1);
|
|
26
|
+
return Buffer.concat([header, payload]);
|
|
27
|
+
};
|
|
28
|
+
export const helloFrame = (token, cols, rows, flags = 0) => {
|
|
29
|
+
const head = Buffer.alloc(5);
|
|
30
|
+
head.writeInt16LE(cols, 0);
|
|
31
|
+
head.writeInt16LE(rows, 2);
|
|
32
|
+
head.writeUInt8(flags, 4);
|
|
33
|
+
return encodeFrame(FrameType.Hello, Buffer.concat([head, Buffer.from(token, 'utf8')]));
|
|
34
|
+
};
|
|
35
|
+
export const resizeFrame = (cols, rows) => {
|
|
36
|
+
const payload = Buffer.alloc(4);
|
|
37
|
+
payload.writeInt16LE(cols, 0);
|
|
38
|
+
payload.writeInt16LE(rows, 2);
|
|
39
|
+
return encodeFrame(FrameType.Resize, payload);
|
|
40
|
+
};
|
|
41
|
+
/** Same limit as ptyhost.cs; a peer announcing more is broken or hostile. */
|
|
42
|
+
export const MAX_FRAME_BYTES = 1 << 20;
|
|
43
|
+
/** Splits a TCP byte stream back into frames. */
|
|
44
|
+
export class FrameReader {
|
|
45
|
+
pending = Buffer.alloc(0);
|
|
46
|
+
push(chunk) {
|
|
47
|
+
this.pending = Buffer.concat([this.pending, chunk]);
|
|
48
|
+
const frames = [];
|
|
49
|
+
while (this.pending.length >= 5) {
|
|
50
|
+
const length = this.pending.readUInt32LE(1);
|
|
51
|
+
if (length > MAX_FRAME_BYTES)
|
|
52
|
+
throw new Error('frame too large (' + length + ' bytes)');
|
|
53
|
+
if (this.pending.length < 5 + length)
|
|
54
|
+
break;
|
|
55
|
+
frames.push({ type: this.pending[0], payload: this.pending.subarray(5, 5 + length) });
|
|
56
|
+
this.pending = this.pending.subarray(5 + length);
|
|
57
|
+
}
|
|
58
|
+
return frames;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import net from 'node:net';
|
|
2
|
+
export type ClientResult = {
|
|
3
|
+
reason: 'exit';
|
|
4
|
+
exitCode: number;
|
|
5
|
+
} | {
|
|
6
|
+
reason: 'detach' | 'closed';
|
|
7
|
+
} | {
|
|
8
|
+
reason: 'error';
|
|
9
|
+
message: string;
|
|
10
|
+
};
|
|
11
|
+
/** Turns off every mouse tracking mode a program may have turned on in your terminal (normal, button, any, UTF-8, SGR, urxvt). */
|
|
12
|
+
export declare const MOUSE_OFF = "\u001B[?1000l\u001B[?1002l\u001B[?1003l\u001B[?1005l\u001B[?1006l\u001B[?1015l";
|
|
13
|
+
/**
|
|
14
|
+
* Node on Windows reads keys through the console API, where Backspace is ^H and Ctrl+Backspace is DEL: the reverse of
|
|
15
|
+
* what terminals send. ConPTY reads ^H as Ctrl+Backspace (delete a word), so swap them back.
|
|
16
|
+
*/
|
|
17
|
+
export declare const fixWindowsKeys: (chunk: Buffer) => Buffer;
|
|
18
|
+
/**
|
|
19
|
+
* Bridges this process's terminal to the remote program until it exits, the connection drops, or the user presses
|
|
20
|
+
* the detach key. Restores the terminal before resolving.
|
|
21
|
+
*/
|
|
22
|
+
export declare const runTerminalClient: (socket: net.Socket, token: string, options?: {
|
|
23
|
+
detachKey?: number;
|
|
24
|
+
}) => Promise<ClientResult>;
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { FrameReader, encodeFrame, FrameType, resizeFrame, PING_INTERVAL_MS, helloFrame, } from './protocol.js';
|
|
2
|
+
import { OutputFilter } from './output-filter.js';
|
|
3
|
+
import { enableVtInput } from './console-input.js';
|
|
4
|
+
import { InputJoiner, JOIN_MS } from './input-joiner.js';
|
|
5
|
+
/** Turns off every mouse tracking mode a program may have turned on in your terminal (normal, button, any, UTF-8, SGR, urxvt). */
|
|
6
|
+
export const MOUSE_OFF = '\x1b[?1000l\x1b[?1002l\x1b[?1003l\x1b[?1005l\x1b[?1006l\x1b[?1015l';
|
|
7
|
+
/**
|
|
8
|
+
* Node on Windows reads keys through the console API, where Backspace is ^H and Ctrl+Backspace is DEL: the reverse of
|
|
9
|
+
* what terminals send. ConPTY reads ^H as Ctrl+Backspace (delete a word), so swap them back.
|
|
10
|
+
*/
|
|
11
|
+
export const fixWindowsKeys = (chunk) => {
|
|
12
|
+
if (!chunk.includes(0x08) && !chunk.includes(0x7f))
|
|
13
|
+
return chunk;
|
|
14
|
+
return Buffer.from(chunk.map((b) => (b === 0x08 ? 0x7f : b === 0x7f ? 0x08 : b)));
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Bridges this process's terminal to the remote program until it exits, the connection drops, or the user presses
|
|
18
|
+
* the detach key. Restores the terminal before resolving.
|
|
19
|
+
*/
|
|
20
|
+
export const runTerminalClient = (socket, token, options = {}) => {
|
|
21
|
+
const stdin = process.stdin;
|
|
22
|
+
const stdout = process.stdout;
|
|
23
|
+
// getWindowSize asks the console every time; columns/rows only change when Node noticed a resize.
|
|
24
|
+
const size = () => {
|
|
25
|
+
const [c, r] = stdout.isTTY ? stdout.getWindowSize() : [0, 0];
|
|
26
|
+
return [c || 120, r || 30];
|
|
27
|
+
};
|
|
28
|
+
// Until the console passes the terminal's input through as it is (enableVtInput), Node turns Backspace into ^H.
|
|
29
|
+
let swapKeys = process.platform === 'win32' && stdin.isTTY;
|
|
30
|
+
return new Promise((resolve) => {
|
|
31
|
+
let done = false;
|
|
32
|
+
const reader = new FrameReader();
|
|
33
|
+
const filter = new OutputFilter();
|
|
34
|
+
let sent = size();
|
|
35
|
+
let resizeTimer;
|
|
36
|
+
let vtInput;
|
|
37
|
+
const finish = (result) => {
|
|
38
|
+
if (done)
|
|
39
|
+
return;
|
|
40
|
+
done = true;
|
|
41
|
+
stdin.off('data', onInput);
|
|
42
|
+
stdout.off('resize', onResize);
|
|
43
|
+
clearTimeout(resizeTimer);
|
|
44
|
+
clearInterval(heartbeat);
|
|
45
|
+
clearInterval(sizeWatch);
|
|
46
|
+
clearTimeout(joinTimer);
|
|
47
|
+
socket.destroy();
|
|
48
|
+
// The agent's mouse tracking ends with it: your terminal's wheel scrolls again (and clicks select text).
|
|
49
|
+
stdout.write('\x1b[0m\x1b[?25h' + MOUSE_OFF + '\r\n');
|
|
50
|
+
// Wait for a console-mode change still in progress, then give the console back in its normal mode.
|
|
51
|
+
void (vtInput?.stop() ?? Promise.resolve()).then(() => {
|
|
52
|
+
if (stdin.isTTY)
|
|
53
|
+
stdin.setRawMode(false);
|
|
54
|
+
stdin.pause();
|
|
55
|
+
resolve(result);
|
|
56
|
+
});
|
|
57
|
+
};
|
|
58
|
+
const joiner = new InputJoiner();
|
|
59
|
+
let joinTimer;
|
|
60
|
+
const sendInput = (data) => {
|
|
61
|
+
if (data.length && !done)
|
|
62
|
+
socket.write(encodeFrame(FrameType.Input, swapKeys ? fixWindowsKeys(data) : data));
|
|
63
|
+
};
|
|
64
|
+
const onInput = (chunk) => {
|
|
65
|
+
if (options.detachKey !== undefined && chunk.includes(options.detachKey)) {
|
|
66
|
+
finish({ reason: 'detach' });
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
clearTimeout(joinTimer);
|
|
70
|
+
sendInput(joiner.push(chunk));
|
|
71
|
+
// A lone Esc key press is a "sequence" that never completes: send it after a moment.
|
|
72
|
+
if (joiner.holding())
|
|
73
|
+
joinTimer = setTimeout(() => sendInput(joiner.flush()), JOIN_MS);
|
|
74
|
+
};
|
|
75
|
+
// Windows' own ConPTY repaints the whole screen on every resize; dragging a window edge fires dozens of them, and
|
|
76
|
+
// repaints racing each other left the screen garbled. Wait until the size settles, clear what this terminal
|
|
77
|
+
// reflowed on its own, then let ptyhost repaint everything once at the new size. With conpty.dll (passthrough)
|
|
78
|
+
// nothing is repainted: this terminal's own reflow and scrollback stay, and the program redraws what it needs.
|
|
79
|
+
let passthrough = false;
|
|
80
|
+
const sendSize = () => {
|
|
81
|
+
const [c, r] = size();
|
|
82
|
+
if (c === sent[0] && r === sent[1])
|
|
83
|
+
return;
|
|
84
|
+
sent = [c, r];
|
|
85
|
+
if (!passthrough)
|
|
86
|
+
stdout.write('\x1b[H\x1b[J');
|
|
87
|
+
socket.write(resizeFrame(c, r));
|
|
88
|
+
};
|
|
89
|
+
const onResize = () => {
|
|
90
|
+
clearTimeout(resizeTimer);
|
|
91
|
+
resizeTimer = setTimeout(() => {
|
|
92
|
+
resizeTimer = undefined;
|
|
93
|
+
sendSize();
|
|
94
|
+
}, 120);
|
|
95
|
+
};
|
|
96
|
+
const heartbeat = setInterval(() => socket.write(encodeFrame(FrameType.Ping)), PING_INTERVAL_MS);
|
|
97
|
+
// Windows does not always report a resize in raw mode, so the size is also checked twice a second.
|
|
98
|
+
const sizeWatch = setInterval(() => {
|
|
99
|
+
if (!resizeTimer)
|
|
100
|
+
sendSize();
|
|
101
|
+
}, 500);
|
|
102
|
+
socket.on('data', (chunk) => {
|
|
103
|
+
let frames;
|
|
104
|
+
try {
|
|
105
|
+
frames = reader.push(chunk);
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
finish({ reason: 'error', message: 'invalid data from the sandbox' });
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
for (const frame of frames) {
|
|
112
|
+
if (frame.type === FrameType.Output)
|
|
113
|
+
stdout.write(filter.push(frame.payload));
|
|
114
|
+
else if (frame.type === FrameType.Console)
|
|
115
|
+
passthrough = frame.payload.toString('latin1') === 'conpty.dll';
|
|
116
|
+
else if (frame.type === FrameType.Restarting)
|
|
117
|
+
stdout.write(MOUSE_OFF + '\x1b[2J\x1b[3J\x1b[H');
|
|
118
|
+
else if (frame.type === FrameType.Exit)
|
|
119
|
+
finish({ reason: 'exit', exitCode: frame.payload.length >= 4 ? frame.payload.readInt32LE(0) : 1 });
|
|
120
|
+
else if (frame.type === FrameType.Error)
|
|
121
|
+
finish({
|
|
122
|
+
reason: 'error',
|
|
123
|
+
message: frame.payload
|
|
124
|
+
.toString('utf8')
|
|
125
|
+
.slice(0, 500)
|
|
126
|
+
.replace(/[\x00-\x1f\x7f]/g, ' '),
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
socket.on('close', () => finish({ reason: 'closed' }));
|
|
131
|
+
socket.on('error', () => finish({ reason: 'closed' }));
|
|
132
|
+
const [c, r] = size();
|
|
133
|
+
stdout.write('\x1b[2J\x1b[3J\x1b[H');
|
|
134
|
+
socket.write(helloFrame(token, c, r));
|
|
135
|
+
if (stdin.isTTY)
|
|
136
|
+
stdin.setRawMode(true);
|
|
137
|
+
// After setRawMode (which sets the console mode): mouse reports, focus and keys then arrive as the terminal sent them.
|
|
138
|
+
vtInput = enableVtInput();
|
|
139
|
+
void vtInput.ready.then((on) => {
|
|
140
|
+
if (on)
|
|
141
|
+
swapKeys = false;
|
|
142
|
+
});
|
|
143
|
+
stdin.on('data', onInput);
|
|
144
|
+
stdin.resume();
|
|
145
|
+
stdout.on('resize', onResize);
|
|
146
|
+
});
|
|
147
|
+
};
|
|
@@ -28,7 +28,9 @@ export const testWriteRefusal = (target) => {
|
|
|
28
28
|
return null;
|
|
29
29
|
const temp = canonical(os.tmpdir());
|
|
30
30
|
const t = canonical(target);
|
|
31
|
-
return t === temp || t.startsWith(temp + path.sep)
|
|
31
|
+
return t === temp || t.startsWith(temp + path.sep)
|
|
32
|
+
? null
|
|
33
|
+
: 'The self-test refused to change ' + target + ': it only works in temp folders, so it can never change this PC.';
|
|
32
34
|
};
|
|
33
35
|
export const assertTestWritable = (target) => {
|
|
34
36
|
const refusal = testWriteRefusal(target);
|
package/dist/sync/claude-mem.js
CHANGED
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
import fs from 'node:fs';
|
|
8
8
|
import path from 'node:path';
|
|
9
9
|
import _ from 'lodash';
|
|
10
|
-
import { dirExists, homeDir, isLink } from '../core/util.js';
|
|
11
|
-
import { safeRemove } from '../shared/
|
|
10
|
+
import { dirExists, homeDir, isLink } from '../core/util/index.js';
|
|
11
|
+
import { safeRemove } from '../shared/io/index.js';
|
|
12
12
|
import { assertTestWritable } from '../host/test-guard.js';
|
|
13
13
|
// Never in: its settings (provider API keys), .env files and backups; nor run-time files that mean nothing elsewhere.
|
|
14
14
|
const SKIP_IN = /(^logs$|^backups?$|^settings\.json$|^\.env|\.pid$|\.port$|\.lock$|^worker.*\.json$|\.incoming$|\.conflict-\d+$)/i;
|
|
@@ -17,14 +17,19 @@ const DATABASE = /^claude-mem\.db(-wal|-shm)?$/i;
|
|
|
17
17
|
const MAX_DB_BYTES = 2 * 1024 * 1024 * 1024;
|
|
18
18
|
export const hostClaudeMemDir = () => process.env.CLAUDE_MEM_DATA_DIR ?? path.join(homeDir(), '.claude-mem');
|
|
19
19
|
/** Plain database files at the top of a claude-mem folder (links and anything else are ignored). */
|
|
20
|
-
const databaseFiles = (dir) => dirExists(dir) && !isLink(dir)
|
|
20
|
+
const databaseFiles = (dir) => dirExists(dir) && !isLink(dir)
|
|
21
|
+
? fs.readdirSync(dir).filter((f) => DATABASE.test(f) && fs.lstatSync(path.join(dir, f)).isFile())
|
|
22
|
+
: [];
|
|
21
23
|
/** Newest database file time: the only thing that matters for deciding the direction. */
|
|
22
24
|
const stampOf = (dir) => _.max(databaseFiles(dir).map((f) => fs.statSync(path.join(dir, f)).mtimeMs)) ?? 0;
|
|
23
25
|
/** Host -> sandbox: replace the sandbox store with a copy of this PC's folder (staging folder, then swap). */
|
|
24
26
|
const mirrorIn = (hostDir, store) => {
|
|
25
27
|
const incoming = store + '.incoming';
|
|
26
28
|
safeRemove(incoming, path.dirname(store));
|
|
27
|
-
fs.cpSync(hostDir, incoming, {
|
|
29
|
+
fs.cpSync(hostDir, incoming, {
|
|
30
|
+
recursive: true,
|
|
31
|
+
filter: (src) => src === hostDir || (!SKIP_IN.test(path.basename(src)) && !isLink(src)),
|
|
32
|
+
});
|
|
28
33
|
safeRemove(store, path.dirname(store));
|
|
29
34
|
fs.renameSync(incoming, store);
|
|
30
35
|
};
|
package/dist/sync/history.d.ts
CHANGED
|
@@ -1,25 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { projectFolderName, translatePaths } from '../shared/paths.js';
|
|
1
|
+
import { projectFolderName, translatePaths } from '../shared/paths/index.js';
|
|
3
2
|
export { projectFolderName, translatePaths };
|
|
4
|
-
declare const SyncStateSchema: z.ZodObject<{
|
|
5
|
-
hostClaudeDir: z.ZodString;
|
|
6
|
-
hostWorkspace: z.ZodString;
|
|
7
|
-
guestWorkspace: z.ZodString;
|
|
8
|
-
syncHistory: z.ZodOptional<z.ZodBoolean>;
|
|
9
|
-
syncClaudeMem: z.ZodOptional<z.ZodBoolean>;
|
|
10
|
-
syncClaudeMemBack: z.ZodOptional<z.ZodBoolean>;
|
|
11
|
-
historyScope: z.ZodOptional<z.ZodEnum<{
|
|
12
|
-
project: "project";
|
|
13
|
-
all: "all";
|
|
14
|
-
}>>;
|
|
15
|
-
memHostStamp: z.ZodOptional<z.ZodNumber>;
|
|
16
|
-
memGuestStamp: z.ZodOptional<z.ZodNumber>;
|
|
17
|
-
projects: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
18
|
-
hostWorkspace: z.ZodString;
|
|
19
|
-
guestWorkspace: z.ZodString;
|
|
20
|
-
}, z.core.$strip>>>;
|
|
21
|
-
}, z.core.$strip>;
|
|
22
|
-
export type SyncState = z.output<typeof SyncStateSchema>;
|
|
23
3
|
export interface WorkspacePair {
|
|
24
4
|
hostWorkspace: string;
|
|
25
5
|
guestWorkspace: string;
|
|
@@ -37,11 +17,3 @@ export declare const syncHistoryIn: (p: SyncPaths, options?: {
|
|
|
37
17
|
}) => number;
|
|
38
18
|
/** Copies new sandbox history back to this PC (safe while the sandbox runs: transcripts are append-only). */
|
|
39
19
|
export declare const syncHistoryOut: (p: SyncPaths) => number;
|
|
40
|
-
/**
|
|
41
|
-
* Host-only: <storage>\sync\<dataName>.json. It records which folder on this PC history flows back into, so it must
|
|
42
|
-
* never live in the data folder the sandbox can write (a forged copy could redirect writes anywhere on this PC).
|
|
43
|
-
*/
|
|
44
|
-
export declare const syncStatePath: (dataPath: string) => string;
|
|
45
|
-
/** A state file that is missing, oversized or not in this shape counts as no state (nothing syncs back until the next launch). */
|
|
46
|
-
export declare const readSyncState: (dataPath: string) => SyncState | null;
|
|
47
|
-
export declare const writeSyncState: (dataPath: string, state: SyncState) => void;
|
package/dist/sync/history.js
CHANGED
|
@@ -15,25 +15,13 @@
|
|
|
15
15
|
import fs from 'node:fs';
|
|
16
16
|
import path from 'node:path';
|
|
17
17
|
import _ from 'lodash';
|
|
18
|
-
import {
|
|
19
|
-
import { guestWorkspaceAliases, isSafeFileName, projectFolderName, translatePaths } from '../shared/paths.js';
|
|
20
|
-
import { readValid, writeJsonAtomic } from '../shared/rundir.js';
|
|
18
|
+
import { guestWorkspaceAliases, isSafeFileName, projectFolderName, translatePaths } from '../shared/paths/index.js';
|
|
21
19
|
import { assertTestWritable } from '../host/test-guard.js';
|
|
22
|
-
import { dirExists, ensureDir, fileExists, isLink, removeLink } from '../core/util.js';
|
|
20
|
+
import { dirExists, ensureDir, fileExists, isLink, removeLink } from '../core/util/index.js';
|
|
23
21
|
export { projectFolderName, translatePaths };
|
|
24
22
|
const SESSION_DIRS = ['todos', 'plans', 'file-history'];
|
|
25
23
|
const DATA_FILE = /\.(jsonl?|txt|md)$/i;
|
|
26
24
|
const MAX_FILE_BYTES = 100 * 1024 * 1024;
|
|
27
|
-
/** Host-only record of the last launch: which folders map to each other and what syncs (from the effective config). */
|
|
28
|
-
const AbsolutePath = z.string().max(1024).refine((p) => path.isAbsolute(p), 'must be an absolute path');
|
|
29
|
-
const SyncStateSchema = z.object({
|
|
30
|
-
hostClaudeDir: AbsolutePath, hostWorkspace: AbsolutePath, guestWorkspace: z.string().max(1024),
|
|
31
|
-
syncHistory: z.boolean().optional(), syncClaudeMem: z.boolean().optional(), syncClaudeMemBack: z.boolean().optional(), historyScope: z.enum(['project', 'all']).optional(),
|
|
32
|
-
/** Newest claude-mem database time on each side right after the last sync (detects edits on both sides). */
|
|
33
|
-
memHostStamp: z.number().optional(), memGuestStamp: z.number().optional(),
|
|
34
|
-
/** Projects registered while the sandbox ran (their history goes back to their own folders). */
|
|
35
|
-
projects: z.array(z.object({ hostWorkspace: AbsolutePath, guestWorkspace: z.string().max(1024) })).max(256).optional(),
|
|
36
|
-
});
|
|
37
25
|
const anyFile = () => true;
|
|
38
26
|
const transcript = (name) => name.endsWith('.jsonl');
|
|
39
27
|
const json = (name) => name.endsWith('.json');
|
|
@@ -86,30 +74,40 @@ const copyNewer = (from, to, options = {}) => {
|
|
|
86
74
|
return 1;
|
|
87
75
|
});
|
|
88
76
|
};
|
|
89
|
-
const readLines = (file) => fileExists(file) && !isLink(file) && fs.statSync(file).size <= MAX_FILE_BYTES
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
77
|
+
const readLines = (file) => fileExists(file) && !isLink(file) && fs.statSync(file).size <= MAX_FILE_BYTES
|
|
78
|
+
? fs
|
|
79
|
+
.readFileSync(file, 'utf8')
|
|
80
|
+
.split(/\r?\n/)
|
|
81
|
+
.filter((l) => l.trim() !== '')
|
|
82
|
+
: [];
|
|
83
|
+
const isJsonObject = (line) => {
|
|
84
|
+
try {
|
|
85
|
+
const v = JSON.parse(line);
|
|
86
|
+
return typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
};
|
|
97
92
|
/** A prompt-history line whose project is one of `workspaces` (on this PC's side). */
|
|
98
93
|
const inProjects = (line, workspaces) => {
|
|
99
94
|
try {
|
|
100
95
|
const project = JSON.parse(line).project;
|
|
101
|
-
return typeof project === 'string' &&
|
|
96
|
+
return (typeof project === 'string' &&
|
|
97
|
+
workspaces.some((w) => path.resolve(w).toLowerCase() === path.resolve(project).toLowerCase()));
|
|
102
98
|
}
|
|
103
99
|
catch {
|
|
104
100
|
return false;
|
|
105
101
|
}
|
|
106
102
|
};
|
|
107
|
-
const lineTime = (line) => {
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
103
|
+
const lineTime = (line) => {
|
|
104
|
+
try {
|
|
105
|
+
return Number(JSON.parse(line).timestamp) || 0;
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return 0;
|
|
109
|
+
}
|
|
110
|
+
};
|
|
113
111
|
/** Every workspace pair of the sandbox: the launch folder's, then the projects registered later (most specific first). */
|
|
114
112
|
const pairsOf = (p) => _.sortBy([{ hostWorkspace: p.hostWorkspace, guestWorkspace: p.guestWorkspace }, ...(p.extra ?? [])], (x) => -x.hostWorkspace.length);
|
|
115
113
|
const translateAll = (text, pairs) => pairs.reduce((out, [from, to]) => translatePaths(out, from, to), text);
|
|
@@ -122,17 +120,28 @@ export const syncHistoryIn = (p, options = {}) => {
|
|
|
122
120
|
const guestNames = new Set(pairs.map((x) => projectFolderName(x.guestWorkspace)));
|
|
123
121
|
const transform = (t) => translateAll(t, pairs.map((x) => [x.hostWorkspace, x.guestWorkspace]));
|
|
124
122
|
const hostProjects = path.join(p.hostClaudeDir, 'projects');
|
|
125
|
-
const names = dirExists(hostProjects)
|
|
123
|
+
const names = dirExists(hostProjects)
|
|
124
|
+
? fs
|
|
125
|
+
.readdirSync(hostProjects)
|
|
126
|
+
.filter((name) => isSafeFileName(name) && (all ? !guestNames.has(name) || byHost.has(name) : byHost.has(name)))
|
|
127
|
+
: [];
|
|
126
128
|
const projects = _.sumBy(names, (name) => byHost.has(name)
|
|
127
|
-
? copyNewer(path.join(hostProjects, name), path.join(p.guestClaudeDir, 'projects', byHost.get(name)), {
|
|
129
|
+
? copyNewer(path.join(hostProjects, name), path.join(p.guestClaudeDir, 'projects', byHost.get(name)), {
|
|
130
|
+
transform,
|
|
131
|
+
})
|
|
128
132
|
: copyNewer(path.join(hostProjects, name), path.join(p.guestClaudeDir, 'projects', name)));
|
|
129
133
|
// To-do lists, plans and file backups are kept by session, not by project: only with historyScope "all".
|
|
130
|
-
const sessions = all
|
|
134
|
+
const sessions = all
|
|
135
|
+
? _.sumBy(SESSION_DIRS, (dir) => copyNewer(path.join(p.hostClaudeDir, dir), path.join(p.guestClaudeDir, dir)))
|
|
136
|
+
: 0;
|
|
131
137
|
if (options.promptHistory === false)
|
|
132
138
|
return projects + sessions;
|
|
133
139
|
// Prompt history: rebuild the sandbox copy from this PC's file plus anything only the sandbox has.
|
|
134
140
|
const target = path.join(p.guestClaudeDir, 'history.jsonl');
|
|
135
|
-
const hostLines = readLines(path.join(p.hostClaudeDir, 'history.jsonl'))
|
|
141
|
+
const hostLines = readLines(path.join(p.hostClaudeDir, 'history.jsonl'))
|
|
142
|
+
.filter((l) => all ||
|
|
143
|
+
inProjects(l, pairs.map((x) => x.hostWorkspace)))
|
|
144
|
+
.map(transform);
|
|
136
145
|
const known = new Set(hostLines);
|
|
137
146
|
const merged = _.sortBy([...hostLines, ...readLines(target).filter((l) => !known.has(l))], lineTime);
|
|
138
147
|
if (merged.length) {
|
|
@@ -150,27 +159,30 @@ export const syncHistoryOut = (p) => {
|
|
|
150
159
|
const byGuest = new Map(pairs.map(([guest, host]) => [projectFolderName(guest), projectFolderName(host)]));
|
|
151
160
|
const transform = (t) => translateAll(t, pairs);
|
|
152
161
|
const guestProjectsDir = path.join(p.guestClaudeDir, 'projects');
|
|
153
|
-
const names = dirExists(guestProjectsDir) && !isLink(guestProjectsDir)
|
|
162
|
+
const names = dirExists(guestProjectsDir) && !isLink(guestProjectsDir)
|
|
163
|
+
? fs.readdirSync(guestProjectsDir).filter(isSafeFileName)
|
|
164
|
+
: [];
|
|
154
165
|
// Only this sandbox's projects: a transcript under any other folder name would be planted into that project on this PC.
|
|
155
|
-
const projects = _.sumBy(names.filter((name) => byGuest.has(name)), (name) => copyNewer(path.join(guestProjectsDir, name), path.join(p.hostClaudeDir, 'projects', byGuest.get(name)), {
|
|
166
|
+
const projects = _.sumBy(names.filter((name) => byGuest.has(name)), (name) => copyNewer(path.join(guestProjectsDir, name), path.join(p.hostClaudeDir, 'projects', byGuest.get(name)), {
|
|
167
|
+
accept: transcript,
|
|
168
|
+
skipDirs: NO_MEMORY,
|
|
169
|
+
transform,
|
|
170
|
+
}));
|
|
156
171
|
// Only to-do lists come back besides transcripts; plans and file backups stay in the sandbox.
|
|
157
|
-
const sessions = copyNewer(path.join(p.guestClaudeDir, 'todos'), path.join(p.hostClaudeDir, 'todos'), {
|
|
172
|
+
const sessions = copyNewer(path.join(p.guestClaudeDir, 'todos'), path.join(p.hostClaudeDir, 'todos'), {
|
|
173
|
+
accept: json,
|
|
174
|
+
});
|
|
158
175
|
const hostFile = path.join(p.hostClaudeDir, 'history.jsonl');
|
|
159
176
|
const known = new Set(readLines(hostFile));
|
|
160
177
|
// Only prompt-history entries (one JSON object per line) of this sandbox's projects come back.
|
|
161
178
|
const hostWorkspaces = pairsOf(p).map((x) => x.hostWorkspace);
|
|
162
|
-
const missing = readLines(path.join(p.guestClaudeDir, 'history.jsonl'))
|
|
179
|
+
const missing = readLines(path.join(p.guestClaudeDir, 'history.jsonl'))
|
|
180
|
+
.filter(isJsonObject)
|
|
181
|
+
.map(transform)
|
|
182
|
+
.filter((l) => inProjects(l, hostWorkspaces) && !known.has(l));
|
|
163
183
|
if (missing.length) {
|
|
164
184
|
ensureDir(p.hostClaudeDir);
|
|
165
185
|
fs.appendFileSync(hostFile, missing.join('\n') + '\n', 'utf8');
|
|
166
186
|
}
|
|
167
187
|
return projects + sessions + missing.length;
|
|
168
188
|
};
|
|
169
|
-
/**
|
|
170
|
-
* Host-only: <storage>\sync\<dataName>.json. It records which folder on this PC history flows back into, so it must
|
|
171
|
-
* never live in the data folder the sandbox can write (a forged copy could redirect writes anywhere on this PC).
|
|
172
|
-
*/
|
|
173
|
-
export const syncStatePath = (dataPath) => path.join(path.dirname(path.dirname(dataPath)), 'sync', path.basename(dataPath) + '.json');
|
|
174
|
-
/** A state file that is missing, oversized or not in this shape counts as no state (nothing syncs back until the next launch). */
|
|
175
|
-
export const readSyncState = (dataPath) => readValid(SyncStateSchema, syncStatePath(dataPath));
|
|
176
|
-
export const writeSyncState = (dataPath, state) => writeJsonAtomic(syncStatePath(dataPath), state);
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Config } from '../core/types.js';
|
|
2
|
+
import { type MemResult } from './claude-mem.js';
|
|
3
|
+
/**
|
|
4
|
+
* A project registered while the sandbox runs: its history comes in now (the sandbox's copy only gains files), and
|
|
5
|
+
* from now on syncs back to its own folder on this PC.
|
|
6
|
+
*/
|
|
7
|
+
export declare const syncProjectIn: (dataPath: string, project: {
|
|
8
|
+
hostWorkspace: string;
|
|
9
|
+
guestWorkspace: string;
|
|
10
|
+
}) => number;
|
|
11
|
+
export interface SyncSummary {
|
|
12
|
+
history: number;
|
|
13
|
+
claudeMem: MemResult | 'disabled';
|
|
14
|
+
}
|
|
15
|
+
/** Before launch: finish syncing the previous run out, then bring this PC's history (and claude-mem) in. */
|
|
16
|
+
export declare const syncBeforeLaunch: (config: Config, dataPath: string, hostWorkspace: string) => SyncSummary;
|
|
17
|
+
/** Syncs the sandbox's history (and, when `final`, claude-mem) back to this PC, as configured for the last launch. */
|
|
18
|
+
export declare const syncBack: (dataPath: string, final: boolean) => SyncSummary;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { assertNoLinks } from '../core/util/index.js';
|
|
3
|
+
import { hostClaudeDir } from '../host/profile/index.js';
|
|
4
|
+
import { hostClaudeMemDir, syncClaudeMem } from './claude-mem.js';
|
|
5
|
+
import { readSyncState, writeSyncState } from './sync-state.js';
|
|
6
|
+
import { syncHistoryIn, syncHistoryOut } from './history.js';
|
|
7
|
+
const guestClaude = (dataPath) => path.join(dataPath, 'state', 'claude');
|
|
8
|
+
const guestMem = (dataPath) => path.join(dataPath, 'state', 'claude-mem');
|
|
9
|
+
/** Sync paths for the sandbox side, after checking nothing on the way there is a link planted by the sandbox. */
|
|
10
|
+
const toPaths = (state, dataPath) => {
|
|
11
|
+
assertNoLinks(dataPath, guestClaude(dataPath));
|
|
12
|
+
return {
|
|
13
|
+
hostClaudeDir: state.hostClaudeDir,
|
|
14
|
+
guestClaudeDir: guestClaude(dataPath),
|
|
15
|
+
hostWorkspace: state.hostWorkspace,
|
|
16
|
+
guestWorkspace: state.guestWorkspace,
|
|
17
|
+
extra: state.projects ?? [],
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* A project registered while the sandbox runs: its history comes in now (the sandbox's copy only gains files), and
|
|
22
|
+
* from now on syncs back to its own folder on this PC.
|
|
23
|
+
*/
|
|
24
|
+
export const syncProjectIn = (dataPath, project) => {
|
|
25
|
+
const state = readSyncState(dataPath);
|
|
26
|
+
if (!state)
|
|
27
|
+
return 0;
|
|
28
|
+
const projects = [
|
|
29
|
+
...(state.projects ?? []).filter((p) => p.hostWorkspace.toLowerCase() !== project.hostWorkspace.toLowerCase()),
|
|
30
|
+
project,
|
|
31
|
+
];
|
|
32
|
+
const next = { ...state, projects };
|
|
33
|
+
writeSyncState(dataPath, next);
|
|
34
|
+
// Prompt history is left alone: sessions are appending to the sandbox's copy right now.
|
|
35
|
+
return state.syncHistory
|
|
36
|
+
? syncHistoryIn(toPaths(next, dataPath), { promptHistory: false, scope: state.historyScope })
|
|
37
|
+
: 0;
|
|
38
|
+
};
|
|
39
|
+
const memSync = (dataPath, state, direction) => {
|
|
40
|
+
assertNoLinks(dataPath, guestMem(dataPath));
|
|
41
|
+
return syncClaudeMem(hostClaudeMemDir(), guestMem(dataPath), state, direction);
|
|
42
|
+
};
|
|
43
|
+
/** Before launch: finish syncing the previous run out, then bring this PC's history (and claude-mem) in. */
|
|
44
|
+
export const syncBeforeLaunch = (config, dataPath, hostWorkspace) => {
|
|
45
|
+
const profile = config.claudeProfile;
|
|
46
|
+
const summary = { history: 0, claudeMem: 'disabled' };
|
|
47
|
+
if (!config.storage.persistAgentState)
|
|
48
|
+
return summary;
|
|
49
|
+
const previous = readSyncState(dataPath);
|
|
50
|
+
if (previous?.syncHistory)
|
|
51
|
+
syncHistoryOut(toPaths(previous, dataPath));
|
|
52
|
+
const state = {
|
|
53
|
+
...previous,
|
|
54
|
+
hostClaudeDir: hostClaudeDir(profile),
|
|
55
|
+
hostWorkspace,
|
|
56
|
+
guestWorkspace: config.guestWorkspace,
|
|
57
|
+
syncHistory: profile.syncHistory,
|
|
58
|
+
historyScope: profile.historyScope,
|
|
59
|
+
syncClaudeMem: profile.syncClaudeMem,
|
|
60
|
+
syncClaudeMemBack: profile.syncClaudeMemBack,
|
|
61
|
+
projects: [],
|
|
62
|
+
};
|
|
63
|
+
if (profile.syncHistory)
|
|
64
|
+
summary.history = syncHistoryIn(toPaths(state, dataPath), { scope: profile.historyScope });
|
|
65
|
+
if (profile.syncClaudeMem) {
|
|
66
|
+
if (previous?.syncClaudeMem && previous.syncClaudeMemBack)
|
|
67
|
+
memSync(dataPath, state, 'out');
|
|
68
|
+
summary.claudeMem = memSync(dataPath, state, 'in');
|
|
69
|
+
}
|
|
70
|
+
writeSyncState(dataPath, state);
|
|
71
|
+
return summary;
|
|
72
|
+
};
|
|
73
|
+
/** Syncs the sandbox's history (and, when `final`, claude-mem) back to this PC, as configured for the last launch. */
|
|
74
|
+
export const syncBack = (dataPath, final) => {
|
|
75
|
+
const state = readSyncState(dataPath);
|
|
76
|
+
const summary = { history: 0, claudeMem: 'disabled' };
|
|
77
|
+
if (!state)
|
|
78
|
+
return summary;
|
|
79
|
+
if (state.syncHistory)
|
|
80
|
+
summary.history = syncHistoryOut(toPaths(state, dataPath));
|
|
81
|
+
if (final && state.syncClaudeMem && state.syncClaudeMemBack)
|
|
82
|
+
summary.claudeMem = memSync(dataPath, state, 'out');
|
|
83
|
+
writeSyncState(dataPath, state);
|
|
84
|
+
return summary;
|
|
85
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
declare const SyncStateSchema: z.ZodObject<{
|
|
3
|
+
hostClaudeDir: z.ZodString;
|
|
4
|
+
hostWorkspace: z.ZodString;
|
|
5
|
+
guestWorkspace: z.ZodString;
|
|
6
|
+
syncHistory: z.ZodOptional<z.ZodBoolean>;
|
|
7
|
+
syncClaudeMem: z.ZodOptional<z.ZodBoolean>;
|
|
8
|
+
syncClaudeMemBack: z.ZodOptional<z.ZodBoolean>;
|
|
9
|
+
historyScope: z.ZodOptional<z.ZodEnum<{
|
|
10
|
+
project: "project";
|
|
11
|
+
all: "all";
|
|
12
|
+
}>>;
|
|
13
|
+
memHostStamp: z.ZodOptional<z.ZodNumber>;
|
|
14
|
+
memGuestStamp: z.ZodOptional<z.ZodNumber>;
|
|
15
|
+
projects: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
16
|
+
hostWorkspace: z.ZodString;
|
|
17
|
+
guestWorkspace: z.ZodString;
|
|
18
|
+
}, z.core.$strip>>>;
|
|
19
|
+
}, z.core.$strip>;
|
|
20
|
+
export type SyncState = z.output<typeof SyncStateSchema>;
|
|
21
|
+
/**
|
|
22
|
+
* Host-only: <storage>\sync\<dataName>.json. It records which folder on this PC history flows back into, so it must
|
|
23
|
+
* never live in the data folder the sandbox can write (a forged copy could redirect writes anywhere on this PC).
|
|
24
|
+
*/
|
|
25
|
+
export declare const syncStatePath: (dataPath: string) => string;
|
|
26
|
+
/**
|
|
27
|
+
* A state file that is missing, oversized or not in this shape counts as no state (nothing syncs back until the next
|
|
28
|
+
* launch).
|
|
29
|
+
*/
|
|
30
|
+
export declare const readSyncState: (dataPath: string) => SyncState | null;
|
|
31
|
+
export declare const writeSyncState: (dataPath: string, state: SyncState) => void;
|
|
32
|
+
export {};
|