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
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 {};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { JsonFile } from '../shared/io/index.js';
|
|
4
|
+
import { hostStateFile, storageOf } from '../host/storage/index.js';
|
|
5
|
+
/** Host-only record of the last launch: which folders map to each other and what syncs (from the effective config). */
|
|
6
|
+
const AbsolutePathSchema = z
|
|
7
|
+
.string()
|
|
8
|
+
.max(1024)
|
|
9
|
+
.refine((p) => path.isAbsolute(p), 'must be an absolute path');
|
|
10
|
+
const SyncStateSchema = z.object({
|
|
11
|
+
hostClaudeDir: AbsolutePathSchema,
|
|
12
|
+
hostWorkspace: AbsolutePathSchema,
|
|
13
|
+
guestWorkspace: z.string().max(1024),
|
|
14
|
+
syncHistory: z.boolean().optional(),
|
|
15
|
+
syncClaudeMem: z.boolean().optional(),
|
|
16
|
+
syncClaudeMemBack: z.boolean().optional(),
|
|
17
|
+
historyScope: z.enum(['project', 'all']).optional(),
|
|
18
|
+
/** Newest claude-mem database time on each side right after the last sync (detects edits on both sides). */
|
|
19
|
+
memHostStamp: z.number().optional(),
|
|
20
|
+
memGuestStamp: z.number().optional(),
|
|
21
|
+
/** Projects registered while the sandbox ran (their history goes back to their own folders). */
|
|
22
|
+
projects: z
|
|
23
|
+
.array(z.object({ hostWorkspace: AbsolutePathSchema, guestWorkspace: z.string().max(1024) }))
|
|
24
|
+
.max(256)
|
|
25
|
+
.optional(),
|
|
26
|
+
});
|
|
27
|
+
/**
|
|
28
|
+
* Host-only: <storage>\sync\<dataName>.json. It records which folder on this PC history flows back into, so it must
|
|
29
|
+
* never live in the data folder the sandbox can write (a forged copy could redirect writes anywhere on this PC).
|
|
30
|
+
*/
|
|
31
|
+
export const syncStatePath = (dataPath) => hostStateFile(storageOf(dataPath), dataPath, '.json');
|
|
32
|
+
/**
|
|
33
|
+
* A state file that is missing, oversized or not in this shape counts as no state (nothing syncs back until the next
|
|
34
|
+
* launch).
|
|
35
|
+
*/
|
|
36
|
+
export const readSyncState = (dataPath) => new JsonFile(SyncStateSchema, syncStatePath(dataPath)).read();
|
|
37
|
+
export const writeSyncState = (dataPath, state) => new JsonFile(SyncStateSchema, syncStatePath(dataPath)).write(state);
|
package/dist/sync/watcher.d.ts
CHANGED
|
@@ -1,21 +1,3 @@
|
|
|
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;
|
|
19
1
|
export declare const watcherRunning: (dataPath: string) => boolean;
|
|
20
2
|
/** Body of the detached watcher process (`agent-sandbox _watch`). */
|
|
21
3
|
export declare const watch: (dataPath: string) => Promise<void>;
|
package/dist/sync/watcher.js
CHANGED
|
@@ -3,92 +3,38 @@
|
|
|
3
3
|
// Its pid file and log live in host-only storage, never in the data folder the sandbox can write.
|
|
4
4
|
import fs from 'node:fs';
|
|
5
5
|
import path from 'node:path';
|
|
6
|
-
import { writeFileAtomic } from '../shared/
|
|
6
|
+
import { writeFileAtomic } from '../shared/io/index.js';
|
|
7
7
|
import { refuseInSelfTest } from '../host/test-guard.js';
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import { readForwards, sandboxAddress, startPortForwards } from '../host/
|
|
8
|
+
import { errMsg, sleep } from '../core/util/index.js';
|
|
9
|
+
import { RepoGuardStore } from '../host/guard/index.js';
|
|
10
|
+
import { isSandboxRunning } from '../host/sandbox/index.js';
|
|
11
|
+
import { readActiveViews } from '../host/workspace-view/index.js';
|
|
12
|
+
import { WorkspaceView } from '../host/workspace-view/index.js';
|
|
13
|
+
import { readForwards, sandboxAddress, startPortForwards } from '../host/network/index.js';
|
|
14
14
|
import { AuditCollector, readAuditSettings } from '../host/audit/collect.js';
|
|
15
|
-
import { readMarkedProjects, saveDataSize, watchAndMark } from '../host/
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
15
|
+
import { readMarkedProjects, saveDataSize, watchAndMark } from '../host/guard/index.js';
|
|
16
|
+
import { sizeWithin } from '../core/disk.js';
|
|
17
|
+
import { causeSince, KeepAwake, LifeRecord, saveCrashReport } from '../host/life/index.js';
|
|
18
|
+
import { storageOf } from '../host/storage/index.js';
|
|
19
|
+
import { syncBack } from './sync-cycle.js';
|
|
20
20
|
const WATCH_INTERVAL_MS = 60 * 1000;
|
|
21
|
-
const storageOf = (dataPath) => path.dirname(path.dirname(dataPath));
|
|
22
|
-
const guestClaude = (dataPath) => path.join(dataPath, 'state', 'claude');
|
|
23
|
-
const guestMem = (dataPath) => path.join(dataPath, 'state', 'claude-mem');
|
|
24
|
-
/** Sync paths for the sandbox side, after checking nothing on the way there is a link planted by the sandbox. */
|
|
25
|
-
const toPaths = (state, dataPath) => {
|
|
26
|
-
assertNoLinks(dataPath, guestClaude(dataPath));
|
|
27
|
-
return { hostClaudeDir: state.hostClaudeDir, guestClaudeDir: guestClaude(dataPath), hostWorkspace: state.hostWorkspace, guestWorkspace: state.guestWorkspace, extra: state.projects ?? [] };
|
|
28
|
-
};
|
|
29
|
-
/**
|
|
30
|
-
* A project registered while the sandbox runs: its history comes in now (the sandbox's copy only gains files), and
|
|
31
|
-
* from now on syncs back to its own folder on this PC.
|
|
32
|
-
*/
|
|
33
|
-
export const syncProjectIn = (dataPath, project) => {
|
|
34
|
-
const state = readSyncState(dataPath);
|
|
35
|
-
if (!state)
|
|
36
|
-
return 0;
|
|
37
|
-
const projects = [...(state.projects ?? []).filter((p) => p.hostWorkspace.toLowerCase() !== project.hostWorkspace.toLowerCase()), project];
|
|
38
|
-
const next = { ...state, projects };
|
|
39
|
-
writeSyncState(dataPath, next);
|
|
40
|
-
// Prompt history is left alone: sessions are appending to the sandbox's copy right now.
|
|
41
|
-
return state.syncHistory ? syncHistoryIn(toPaths(next, dataPath), { promptHistory: false, scope: state.historyScope }) : 0;
|
|
42
|
-
};
|
|
43
|
-
const memSync = (dataPath, state, direction) => {
|
|
44
|
-
assertNoLinks(dataPath, guestMem(dataPath));
|
|
45
|
-
return syncClaudeMem(hostClaudeMemDir(), guestMem(dataPath), state, direction);
|
|
46
|
-
};
|
|
47
|
-
/** Before launch: finish syncing the previous run out, then bring this PC's history (and claude-mem) in. */
|
|
48
|
-
export const syncBeforeLaunch = (config, dataPath, hostWorkspace) => {
|
|
49
|
-
const profile = config.claudeProfile;
|
|
50
|
-
const summary = { history: 0, claudeMem: 'disabled' };
|
|
51
|
-
if (!config.storage.persistAgentState)
|
|
52
|
-
return summary;
|
|
53
|
-
const previous = readSyncState(dataPath);
|
|
54
|
-
if (previous?.syncHistory)
|
|
55
|
-
syncHistoryOut(toPaths(previous, dataPath));
|
|
56
|
-
const state = { ...previous, hostClaudeDir: hostClaudeDir(profile), hostWorkspace, guestWorkspace: config.guestWorkspace, syncHistory: profile.syncHistory, historyScope: profile.historyScope, syncClaudeMem: profile.syncClaudeMem, syncClaudeMemBack: profile.syncClaudeMemBack, projects: [] };
|
|
57
|
-
if (profile.syncHistory)
|
|
58
|
-
summary.history = syncHistoryIn(toPaths(state, dataPath), { scope: profile.historyScope });
|
|
59
|
-
if (profile.syncClaudeMem) {
|
|
60
|
-
if (previous?.syncClaudeMem && previous.syncClaudeMemBack)
|
|
61
|
-
memSync(dataPath, state, 'out');
|
|
62
|
-
summary.claudeMem = memSync(dataPath, state, 'in');
|
|
63
|
-
}
|
|
64
|
-
writeSyncState(dataPath, state);
|
|
65
|
-
return summary;
|
|
66
|
-
};
|
|
67
|
-
/** Syncs the sandbox's history (and, when `final`, claude-mem) back to this PC, as configured for the last launch. */
|
|
68
|
-
export const syncBack = (dataPath, final) => {
|
|
69
|
-
const state = readSyncState(dataPath);
|
|
70
|
-
const summary = { history: 0, claudeMem: 'disabled' };
|
|
71
|
-
if (!state)
|
|
72
|
-
return summary;
|
|
73
|
-
if (state.syncHistory)
|
|
74
|
-
summary.history = syncHistoryOut(toPaths(state, dataPath));
|
|
75
|
-
if (final && state.syncClaudeMem && state.syncClaudeMemBack)
|
|
76
|
-
summary.claudeMem = memSync(dataPath, state, 'out');
|
|
77
|
-
writeSyncState(dataPath, state);
|
|
78
|
-
return summary;
|
|
79
|
-
};
|
|
80
21
|
const hostRunDir = (dataPath) => path.join(storageOf(dataPath), 'run');
|
|
22
|
+
/** The longest the watcher may take after the sandbox closed (final syncs) before it stops anyway. */
|
|
23
|
+
const END_DEADLINE_MS = 3 * 60 * 1000;
|
|
81
24
|
const watcherPidFile = (dataPath) => path.join(hostRunDir(dataPath), 'watcher-' + path.basename(dataPath) + '.pid');
|
|
82
25
|
const watcherLog = (dataPath) => path.join(storageOf(dataPath), 'logs', 'host-sync-' + path.basename(dataPath) + '.log');
|
|
83
26
|
// Signal 0 only asks whether the process exists. pid 0 would mean "my own process group", so it never counts.
|
|
84
|
-
const alive = (pid) => {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
27
|
+
const alive = (pid) => {
|
|
28
|
+
if (!Number.isInteger(pid) || pid <= 0)
|
|
29
|
+
return false;
|
|
30
|
+
try {
|
|
31
|
+
process.kill(pid, 0);
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
};
|
|
92
38
|
export const watcherRunning = (dataPath) => {
|
|
93
39
|
try {
|
|
94
40
|
return alive(Number(fs.readFileSync(watcherPidFile(dataPath), 'utf8')));
|
|
@@ -105,13 +51,17 @@ export const watch = async (dataPath) => {
|
|
|
105
51
|
fs.mkdirSync(hostRunDir(dataPath), { recursive: true });
|
|
106
52
|
fs.mkdirSync(path.dirname(watcherLog(dataPath)), { recursive: true });
|
|
107
53
|
writeFileAtomic(watcherPidFile(dataPath), String(process.pid));
|
|
108
|
-
const note = (message) => {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
54
|
+
const note = (message) => {
|
|
55
|
+
try {
|
|
56
|
+
fs.appendFileSync(watcherLog(dataPath), new Date().toISOString() + ' ' + message + '\n');
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
/* ignore */
|
|
60
|
+
}
|
|
61
|
+
};
|
|
112
62
|
const sync = (final) => {
|
|
113
63
|
try {
|
|
114
|
-
for (const finding of
|
|
64
|
+
for (const finding of new RepoGuardStore(dataPath).check()) {
|
|
115
65
|
note('SECURITY: neutralised a git ' + finding.kind + ' added inside the sandbox: ' + finding.detail);
|
|
116
66
|
audit?.guard(finding.kind + ': ' + finding.detail);
|
|
117
67
|
}
|
|
@@ -133,12 +83,16 @@ export const watch = async (dataPath) => {
|
|
|
133
83
|
const auditSettings = readAuditSettings(storageOf(dataPath), dataPath);
|
|
134
84
|
const audit = auditSettings?.enabled ? new AuditCollector(dataPath, storageOf(dataPath), auditSettings) : null;
|
|
135
85
|
audit?.start();
|
|
136
|
-
const auditTimer = audit
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
86
|
+
const auditTimer = audit
|
|
87
|
+
? setInterval(() => {
|
|
88
|
+
try {
|
|
89
|
+
audit.flush();
|
|
90
|
+
}
|
|
91
|
+
catch (e) {
|
|
92
|
+
note('audit: ' + errMsg(e));
|
|
93
|
+
}
|
|
94
|
+
}, 10000)
|
|
95
|
+
: null;
|
|
142
96
|
// storage.markSandboxFiles: programs and scripts that appear in the projects get the "from the internet" mark.
|
|
143
97
|
const stopMarking = watchAndMark(readMarkedProjects(storageOf(dataPath), dataPath), (m) => note(m));
|
|
144
98
|
// network.forwardPorts: localhost on this PC reaches servers in the sandbox while it runs.
|
|
@@ -154,29 +108,37 @@ export const watch = async (dataPath) => {
|
|
|
154
108
|
}
|
|
155
109
|
});
|
|
156
110
|
// sandbox.keepAwake, and the life record that tells the next launch how this run ended (host/stops.ts).
|
|
157
|
-
const
|
|
111
|
+
const life = new LifeRecord(storageOf(dataPath), dataPath);
|
|
112
|
+
const awake = life.read()?.keepAwake ? KeepAwake.start(process.pid) : null;
|
|
158
113
|
try {
|
|
159
114
|
await sleep(30000);
|
|
160
115
|
while (isSandboxRunning()) {
|
|
161
|
-
|
|
116
|
+
life.beat();
|
|
162
117
|
sync(false);
|
|
163
118
|
await sleep(WATCH_INTERVAL_MS);
|
|
164
119
|
}
|
|
165
120
|
try {
|
|
166
|
-
const
|
|
167
|
-
const cause =
|
|
168
|
-
|
|
121
|
+
const last = life.read();
|
|
122
|
+
const cause = last ? causeSince(last.lastSeen) : null;
|
|
123
|
+
const report = last && cause ? saveCrashReport(storageOf(dataPath), dataPath, last.lastSeen) : null;
|
|
124
|
+
life.end(cause, new Date(), report);
|
|
169
125
|
if (cause)
|
|
170
|
-
note('sandbox ended: ' + cause.text);
|
|
126
|
+
note('sandbox ended: ' + cause.text + (report ? '; crash report: ' + report : ''));
|
|
171
127
|
}
|
|
172
128
|
catch (e) {
|
|
173
129
|
note('could not record how the sandbox ended: ' + errMsg(e));
|
|
174
130
|
}
|
|
175
131
|
await sleep(3000);
|
|
132
|
+
// The sandbox is gone: this process ends within minutes whatever happens below (it must never outlive the sandbox).
|
|
133
|
+
setTimeout(() => {
|
|
134
|
+
note('final work took too long; stopped.');
|
|
135
|
+
fs.rmSync(watcherPidFile(dataPath), { force: true });
|
|
136
|
+
process.exit(0);
|
|
137
|
+
}, END_DEADLINE_MS).unref();
|
|
176
138
|
sync(true);
|
|
177
139
|
}
|
|
178
140
|
finally {
|
|
179
|
-
awake?.
|
|
141
|
+
awake?.stop();
|
|
180
142
|
stops.forEach((stop) => stop());
|
|
181
143
|
stopForwards();
|
|
182
144
|
stopMarking();
|
|
@@ -197,11 +159,15 @@ export const watch = async (dataPath) => {
|
|
|
197
159
|
note('workspace ' + v.host + ': final sync failed: ' + errMsg(e));
|
|
198
160
|
}
|
|
199
161
|
}
|
|
200
|
-
// For the next launch's storage.warnDataGb
|
|
162
|
+
// For the next launch's storage.warnDataGb, only when it can be measured quickly (a big data folder takes minutes).
|
|
201
163
|
try {
|
|
202
|
-
|
|
164
|
+
const bytes = sizeWithin(dataPath, 20000);
|
|
165
|
+
if (bytes !== null)
|
|
166
|
+
saveDataSize(storageOf(dataPath), dataPath, bytes);
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
/* best effort */
|
|
203
170
|
}
|
|
204
|
-
catch { /* best effort */ }
|
|
205
171
|
fs.rmSync(watcherPidFile(dataPath), { force: true });
|
|
206
172
|
}
|
|
207
173
|
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
#Requires -Version 5.1
|
|
2
|
+
# Keeps this PC awake (the screen may still turn off) until the process -OwnerId ends: the background watcher, which
|
|
3
|
+
# ends with the sandbox. Used by host/stops.ts for sandbox.keepAwake.
|
|
4
|
+
param([Parameter(Mandatory = $true)][int]$OwnerId)
|
|
5
|
+
$ErrorActionPreference = 'Stop'
|
|
6
|
+
Add-Type -Path (Join-Path $PSScriptRoot 'power.cs')
|
|
7
|
+
[AgentSandbox.Power]::StayAwake()
|
|
8
|
+
Wait-Process -Id $OwnerId -ErrorAction SilentlyContinue
|
package/native/power.cs
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// Keeps this PC from sleeping while a sandbox runs (sandbox.keepAwake). Loaded by keep-awake.ps1 (Add-Type). C# 5.
|
|
2
|
+
using System.Runtime.InteropServices;
|
|
3
|
+
|
|
4
|
+
namespace AgentSandbox
|
|
5
|
+
{
|
|
6
|
+
public static class Power
|
|
7
|
+
{
|
|
8
|
+
// ES_CONTINUOUS | ES_SYSTEM_REQUIRED: the system stays awake until this thread ends or clears it.
|
|
9
|
+
private const uint ContinuousSystemRequired = 0x80000001;
|
|
10
|
+
|
|
11
|
+
private static class NativeMethods
|
|
12
|
+
{
|
|
13
|
+
[DllImport("kernel32.dll")]
|
|
14
|
+
public static extern uint SetThreadExecutionState(uint flags);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/// <summary>Asks Windows not to sleep for as long as the calling thread runs.</summary>
|
|
18
|
+
public static void StayAwake()
|
|
19
|
+
{
|
|
20
|
+
NativeMethods.SetThreadExecutionState(ContinuousSystemRequired);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|