@phnx-labs/agents-cli 1.22.39 → 1.22.41
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/CHANGELOG.md +316 -0
- package/README.md +116 -70
- package/dist/bin/agents +0 -0
- package/dist/bootstrap.js +45 -27
- package/dist/browser.js +2 -2
- package/dist/cli/command-registry.d.ts +135 -0
- package/dist/cli/command-registry.js +259 -0
- package/dist/commands/accounts.d.ts +20 -0
- package/dist/commands/accounts.js +186 -25
- package/dist/commands/apply.d.ts +3 -3
- package/dist/commands/apply.js +20 -63
- package/dist/commands/browser.d.ts +15 -0
- package/dist/commands/browser.js +318 -131
- package/dist/commands/budget.d.ts +7 -6
- package/dist/commands/budget.js +8 -7
- package/dist/commands/cloud.js +17 -20
- package/dist/commands/commands.js +1 -1
- package/dist/commands/computer-actions.d.ts +1 -35
- package/dist/commands/computer-actions.js +13 -181
- package/dist/commands/computer.d.ts +28 -3
- package/dist/commands/computer.js +93 -65
- package/dist/commands/config.js +16 -3
- package/dist/commands/cost.d.ts +2 -1
- package/dist/commands/cost.js +7 -6
- package/dist/commands/daemon.js +151 -4
- package/dist/commands/detach.js +1 -1
- package/dist/commands/doctor.js +19 -11
- package/dist/commands/events.js +1 -1
- package/dist/commands/exec.d.ts +2 -50
- package/dist/commands/exec.js +160 -215
- package/dist/commands/factory.js +1 -1
- package/dist/commands/feed.d.ts +2 -2
- package/dist/commands/feed.js +12 -23
- package/dist/commands/fleet-capture.js +25 -27
- package/dist/commands/focus.d.ts +2 -3
- package/dist/commands/focus.js +34 -9
- package/dist/commands/go.js +15 -5
- package/dist/commands/harness.d.ts +3 -3
- package/dist/commands/harness.js +53 -5
- package/dist/commands/hooks.js +1 -1
- package/dist/commands/import.js +2 -2
- package/dist/commands/insights.d.ts +5 -5
- package/dist/commands/insights.js +15 -9
- package/dist/commands/inspect.d.ts +2 -3
- package/dist/commands/inspect.js +4 -16
- package/dist/commands/logs.d.ts +2 -2
- package/dist/commands/logs.js +9 -9
- package/dist/commands/mcp.js +2 -2
- package/dist/commands/memory.js +1 -1
- package/dist/commands/message.d.ts +1 -1
- package/dist/commands/message.js +7 -7
- package/dist/commands/mine.d.ts +11 -8
- package/dist/commands/mine.js +11 -10
- package/dist/commands/models.js +1 -1
- package/dist/commands/modes.js +1 -1
- package/dist/commands/monitors.js +23 -6
- package/dist/commands/output.d.ts +7 -6
- package/dist/commands/output.js +11 -10
- package/dist/commands/packages.js +4 -4
- package/dist/commands/perf.js +1 -1
- package/dist/commands/permissions.js +49 -32
- package/dist/commands/plugins.d.ts +1 -1
- package/dist/commands/plugins.js +3 -3
- package/dist/commands/profiles.d.ts +6 -9
- package/dist/commands/profiles.js +8 -321
- package/dist/commands/projects.d.ts +9 -0
- package/dist/commands/projects.js +140 -8
- package/dist/commands/prune.js +5 -13
- package/dist/commands/refresh-rules.js +1 -1
- package/dist/commands/repo.d.ts +5 -7
- package/dist/commands/repo.js +34 -18
- package/dist/commands/resource-view.js +4 -0
- package/dist/commands/resume.d.ts +11 -7
- package/dist/commands/resume.js +82 -98
- package/dist/commands/route.d.ts +12 -0
- package/dist/commands/route.js +261 -0
- package/dist/commands/routines.d.ts +2 -3
- package/dist/commands/routines.js +120 -145
- package/dist/commands/rules.js +1 -1
- package/dist/commands/run-account-picker.d.ts +1 -1
- package/dist/commands/run-account-picker.js +2 -2
- package/dist/commands/run-broadcast.d.ts +21 -0
- package/dist/commands/run-broadcast.js +89 -0
- package/dist/commands/run-cloud.js +1 -1
- package/dist/commands/secrets-vault.d.ts +10 -0
- package/dist/commands/{login.js → secrets-vault.js} +34 -14
- package/dist/commands/secrets.d.ts +4 -4
- package/dist/commands/secrets.js +158 -159
- package/dist/commands/sessions-backfill.js +1 -1
- package/dist/commands/sessions-browser.d.ts +1 -1
- package/dist/commands/sessions-browser.js +9 -5
- package/dist/commands/sessions-export.js +2 -2
- package/dist/commands/sessions-inject.js +4 -5
- package/dist/commands/sessions-migrate.js +16 -27
- package/dist/commands/sessions-picker.d.ts +14 -0
- package/dist/commands/sessions-picker.js +209 -13
- package/dist/commands/sessions-resume.d.ts +7 -3
- package/dist/commands/sessions-resume.js +81 -33
- package/dist/commands/sessions-share.d.ts +25 -0
- package/dist/commands/sessions-share.js +166 -0
- package/dist/commands/sessions-stats.js +2 -2
- package/dist/commands/sessions.d.ts +75 -68
- package/dist/commands/sessions.js +144 -180
- package/dist/commands/setup-browser.js +1 -1
- package/dist/commands/setup-computer.js +1 -1
- package/dist/commands/setup-fleet.js +3 -0
- package/dist/commands/setup-mine.d.ts +7 -3
- package/dist/commands/setup-mine.js +13 -8
- package/dist/commands/setup-preferences.js +2 -2
- package/dist/commands/setup-secrets.js +2 -2
- package/dist/commands/setup-watchdog.js +2 -2
- package/dist/commands/setup.js +7 -2
- package/dist/commands/share.d.ts +65 -0
- package/dist/commands/share.js +253 -20
- package/dist/commands/skills.js +3 -3
- package/dist/commands/snapshot.d.ts +2 -2
- package/dist/commands/snapshot.js +9 -9
- package/dist/commands/ssh.d.ts +1 -1
- package/dist/commands/ssh.js +186 -64
- package/dist/commands/subagents.js +1 -1
- package/dist/commands/sync.js +24 -9
- package/dist/commands/teams.d.ts +2 -2
- package/dist/commands/teams.js +9 -18
- package/dist/commands/tmux.js +5 -1
- package/dist/commands/trash.js +1 -1
- package/dist/commands/usage.d.ts +1 -1
- package/dist/commands/usage.js +2 -2
- package/dist/commands/utils.d.ts +4 -14
- package/dist/commands/utils.js +6 -27
- package/dist/commands/versions.js +2 -2
- package/dist/commands/view.d.ts +9 -77
- package/dist/commands/view.js +23 -8
- package/dist/commands/watchdog.js +1 -1
- package/dist/commands/webhook.js +25 -34
- package/dist/commands/workflows.js +1 -1
- package/dist/index.js +1 -1
- package/dist/lib/account-capabilities.d.ts +39 -0
- package/dist/lib/account-capabilities.js +59 -0
- package/dist/lib/account-catalog.js +1 -1
- package/dist/lib/account-registry.d.ts +66 -0
- package/dist/lib/account-registry.js +151 -5
- package/dist/lib/{rotate.d.ts → accounting/rotate.d.ts} +4 -4
- package/dist/lib/{rotate.js → accounting/rotate.js} +8 -8
- package/dist/lib/{usage.d.ts → accounting/usage.d.ts} +4 -4
- package/dist/lib/{usage.js → accounting/usage.js} +11 -11
- package/dist/lib/agent-spec/provider.js +1 -1
- package/dist/lib/agents.d.ts +72 -4
- package/dist/lib/agents.js +231 -199
- package/dist/lib/answer-router.d.ts +2 -2
- package/dist/lib/ask-classifier.d.ts +1 -1
- package/dist/lib/ask-classifier.js +1 -1
- package/dist/lib/audit/log.js +1 -1
- package/dist/lib/auth-health.d.ts +1 -1
- package/dist/lib/auth-health.js +2 -2
- package/dist/lib/brand.js +1 -1
- package/dist/lib/browser/caller-identity.d.ts +28 -0
- package/dist/lib/browser/caller-identity.js +156 -0
- package/dist/lib/browser/cdp.js +5 -1
- package/dist/lib/browser/chrome.js +12 -1
- package/dist/lib/browser/drivers/ssh.d.ts +1 -1
- package/dist/lib/browser/drivers/ssh.js +3 -2
- package/dist/lib/browser/hygiene.d.ts +10 -2
- package/dist/lib/browser/hygiene.js +7 -4
- package/dist/lib/browser/ipc.d.ts +22 -2
- package/dist/lib/browser/ipc.js +185 -21
- package/dist/lib/browser/profiles.d.ts +69 -5
- package/dist/lib/browser/profiles.js +135 -13
- package/dist/lib/browser/remote-control.d.ts +2 -2
- package/dist/lib/browser/remote-control.js +3 -3
- package/dist/lib/browser/runtime-state.d.ts +79 -0
- package/dist/lib/browser/runtime-state.js +119 -1
- package/dist/lib/browser/service.d.ts +137 -2
- package/dist/lib/browser/service.js +492 -54
- package/dist/lib/browser/sessions-list.d.ts +2 -1
- package/dist/lib/browser/sessions-list.js +4 -13
- package/dist/lib/browser/types.d.ts +19 -1
- package/dist/lib/budget/config.js +1 -1
- package/dist/lib/budget/ledger.js +1 -1
- package/dist/lib/byok-usage.js +1 -1
- package/dist/lib/capabilities.js +3 -15
- package/dist/lib/catchup.d.ts +1 -1
- package/dist/lib/catchup.js +1 -1
- package/dist/lib/cloud/dispatch.js +1 -1
- package/dist/lib/cloud/host.d.ts +3 -3
- package/dist/lib/cloud/host.js +5 -5
- package/dist/lib/cloud/rush.d.ts +9 -21
- package/dist/lib/cloud/rush.js +33 -120
- package/dist/lib/cloud/types.d.ts +2 -2
- package/dist/lib/commands.js +3 -13
- package/dist/lib/computer/actions.d.ts +36 -0
- package/dist/lib/computer/actions.js +162 -0
- package/dist/lib/computer/dispatch.d.ts +2 -2
- package/dist/lib/computer/dispatch.js +2 -2
- package/dist/lib/computer/sessions-list.d.ts +3 -3
- package/dist/lib/computer/sessions-list.js +2 -2
- package/dist/lib/config-keys.d.ts +2 -1
- package/dist/lib/config-keys.js +8 -4
- package/dist/lib/config-machine-keys.d.ts +4 -2
- package/dist/lib/config-machine-keys.js +5 -2
- package/dist/lib/crabbox/lease.js +9 -1
- package/dist/lib/crabbox/runtimes.d.ts +32 -7
- package/dist/lib/crabbox/runtimes.js +72 -30
- package/dist/lib/{daemon.d.ts → daemon/daemon.d.ts} +59 -1
- package/dist/lib/{daemon.js → daemon/daemon.js} +237 -49
- package/dist/lib/daemon-services.d.ts +1 -1
- package/dist/lib/daemon-services.js +5 -0
- package/dist/lib/daemon-ticks.d.ts +25 -0
- package/dist/lib/daemon-ticks.js +31 -1
- package/dist/lib/daemon-webhooks.d.ts +104 -0
- package/dist/lib/daemon-webhooks.js +215 -0
- package/dist/lib/device-config.d.ts +85 -75
- package/dist/lib/device-config.js +280 -142
- package/dist/lib/devices/config-migration.d.ts +29 -34
- package/dist/lib/devices/config-migration.js +209 -130
- package/dist/lib/devices/connect.d.ts +2 -2
- package/dist/lib/devices/connect.js +2 -2
- package/dist/lib/devices/discovery-policy.d.ts +30 -0
- package/dist/lib/devices/discovery-policy.js +101 -0
- package/dist/lib/devices/fleet-inventory.js +8 -3
- package/dist/lib/devices/harness-inventory.d.ts +1 -1
- package/dist/lib/devices/harness-inventory.js +12 -3
- package/dist/lib/devices/known-hosts.js +1 -1
- package/dist/lib/devices/pool.d.ts +10 -5
- package/dist/lib/devices/pool.js +5 -7
- package/dist/lib/devices/registry.d.ts +1 -1
- package/dist/lib/devices/registry.js +1 -1
- package/dist/lib/devices/resolve-profile.d.ts +2 -2
- package/dist/lib/devices/resolve-profile.js +2 -2
- package/dist/lib/devices/resolve-target.d.ts +1 -1
- package/dist/lib/devices/resolve-target.js +4 -4
- package/dist/lib/devices/self-host.d.ts +1 -1
- package/dist/lib/devices/self-host.js +3 -3
- package/dist/lib/devices/ssh-config.d.ts +1 -1
- package/dist/lib/devices/stats-cache.js +1 -1
- package/dist/lib/devices/sync.d.ts +3 -1
- package/dist/lib/devices/sync.js +3 -3
- package/dist/lib/doctor-diff.js +4 -4
- package/dist/lib/drift-sync.js +2 -2
- package/dist/lib/drift.js +2 -2
- package/dist/lib/event-families.d.ts +1 -1
- package/dist/lib/event-stream.d.ts +1 -1
- package/dist/lib/event-stream.js +2 -2
- package/dist/lib/events-ingest.js +2 -2
- package/dist/lib/exec.d.ts +4 -4
- package/dist/lib/exec.js +11 -11
- package/dist/lib/factory/snapshot.d.ts +1 -1
- package/dist/lib/factory/snapshot.js +1 -1
- package/dist/lib/{activity.d.ts → feed/activity.d.ts} +1 -1
- package/dist/lib/{activity.js → feed/activity.js} +7 -7
- package/dist/lib/{events.d.ts → feed/events.d.ts} +2 -2
- package/dist/lib/{events.js → feed/events.js} +5 -5
- package/dist/lib/{feed.js → feed/feed.js} +4 -4
- package/dist/lib/feed-outcome.d.ts +1 -1
- package/dist/lib/feed-policy.d.ts +1 -1
- package/dist/lib/feed-policy.js +1 -1
- package/dist/lib/feed-post.d.ts +1 -1
- package/dist/lib/feed-post.js +1 -1
- package/dist/lib/feed-ranking.d.ts +1 -1
- package/dist/lib/fleet/apply.d.ts +0 -6
- package/dist/lib/fleet/apply.js +18 -45
- package/dist/lib/fleet/auth-sync.d.ts +16 -35
- package/dist/lib/fleet/auth-sync.js +16 -75
- package/dist/lib/fleet/capture.js +8 -6
- package/dist/lib/fleet/manifest.js +23 -11
- package/dist/lib/fleet/types.d.ts +19 -7
- package/dist/lib/fleet-cache.d.ts +1 -1
- package/dist/lib/fleet-cache.js +1 -1
- package/dist/lib/format.d.ts +19 -0
- package/dist/lib/format.js +44 -1
- package/dist/lib/friction-heuristics.d.ts +1 -1
- package/dist/lib/git.d.ts +24 -1
- package/dist/lib/git.js +82 -38
- package/dist/lib/heal.js +3 -3
- package/dist/lib/hooks.d.ts +18 -0
- package/dist/lib/hooks.js +113 -1
- package/dist/lib/hosts/credentials.d.ts +30 -10
- package/dist/lib/hosts/credentials.js +38 -26
- package/dist/lib/hosts/dispatch.d.ts +3 -3
- package/dist/lib/hosts/dispatch.js +3 -3
- package/dist/lib/hosts/option.d.ts +3 -3
- package/dist/lib/hosts/option.js +7 -8
- package/dist/lib/hosts/passthrough.d.ts +17 -17
- package/dist/lib/hosts/passthrough.js +67 -50
- package/dist/lib/hosts/providers/devices.d.ts +1 -1
- package/dist/lib/hosts/providers/devices.js +1 -1
- package/dist/lib/hosts/reconcile.d.ts +1 -1
- package/dist/lib/hosts/reconcile.js +1 -1
- package/dist/lib/hosts/reconnect.d.ts +1 -1
- package/dist/lib/hosts/reconnect.js +2 -2
- package/dist/lib/hosts/registry.d.ts +5 -5
- package/dist/lib/hosts/registry.js +5 -5
- package/dist/lib/hosts/remote-cmd.d.ts +10 -10
- package/dist/lib/hosts/remote-cmd.js +25 -18
- package/dist/lib/hosts/remote-os.d.ts +4 -4
- package/dist/lib/hosts/remote-os.js +4 -4
- package/dist/lib/hosts/remote-session-id.d.ts +2 -2
- package/dist/lib/hosts/remote-session-id.js +2 -2
- package/dist/lib/hosts/routing-flag.d.ts +3 -3
- package/dist/lib/hosts/routing-flag.js +4 -5
- package/dist/lib/hosts/run-target.d.ts +4 -4
- package/dist/lib/hosts/run-target.js +4 -4
- package/dist/lib/hosts/session-index.d.ts +2 -2
- package/dist/lib/hosts/session-index.js +1 -1
- package/dist/lib/hosts/session-marker.d.ts +1 -1
- package/dist/lib/hosts/session-marker.js +1 -1
- package/dist/lib/hosts/types.d.ts +2 -2
- package/dist/lib/hosts/types.js +2 -2
- package/dist/lib/import.js +1 -1
- package/dist/lib/{migrate.d.ts → installations/migrate.d.ts} +13 -1
- package/dist/lib/{migrate.js → installations/migrate.js} +160 -40
- package/dist/lib/installations/resolve.js +1 -1
- package/dist/lib/installations/strategies.js +1 -1
- package/dist/lib/installations/update.js +2 -2
- package/dist/lib/{versions.d.ts → installations/versions.d.ts} +12 -3
- package/dist/lib/{versions.js → installations/versions.js} +51 -31
- package/dist/lib/isolation-boundary-report.js +1 -1
- package/dist/lib/linear-projects.d.ts +28 -0
- package/dist/lib/linear-projects.js +30 -0
- package/dist/lib/loop.js +1 -1
- package/dist/lib/mailbox-gc.js +1 -1
- package/dist/lib/mailbox.js +1 -1
- package/dist/lib/mcp-registry.d.ts +62 -0
- package/dist/lib/mcp-registry.js +177 -0
- package/dist/lib/mcp.d.ts +5 -0
- package/dist/lib/mcp.js +124 -307
- package/dist/lib/menubar/MenubarHelper.app/Contents/CodeResources +0 -0
- package/dist/lib/menubar/MenubarHelper.app/Contents/MacOS/MenubarHelper +0 -0
- package/dist/lib/menubar/install-menubar.d.ts +7 -0
- package/dist/lib/menubar/install-menubar.js +24 -6
- package/dist/lib/menubar/snapshot.d.ts +7 -0
- package/dist/lib/menubar/snapshot.js +8 -6
- package/dist/lib/models.js +1 -1
- package/dist/lib/monitors/config.d.ts +12 -0
- package/dist/lib/monitors/config.js +3 -0
- package/dist/lib/monitors/dispatch.js +26 -5
- package/dist/lib/monitors/engine.js +10 -0
- package/dist/lib/monitors/sources/webhook.d.ts +1 -1
- package/dist/lib/monitors/state.d.ts +42 -0
- package/dist/lib/monitors/state.js +30 -0
- package/dist/lib/notify.d.ts +1 -1
- package/dist/lib/observe-aliases.d.ts +3 -3
- package/dist/lib/observe-aliases.js +3 -21
- package/dist/lib/output/git-output.js +2 -2
- package/dist/lib/overdue.d.ts +1 -1
- package/dist/lib/overdue.js +1 -1
- package/dist/lib/permissions-registry.d.ts +65 -0
- package/dist/lib/permissions-registry.js +599 -0
- package/dist/lib/permissions.d.ts +24 -13
- package/dist/lib/permissions.js +52 -271
- package/dist/lib/picker.d.ts +16 -0
- package/dist/lib/picker.js +33 -3
- package/dist/lib/placement.d.ts +1 -1
- package/dist/lib/placement.js +4 -4
- package/dist/lib/platform/paths.d.ts +8 -0
- package/dist/lib/platform/paths.js +11 -0
- package/dist/lib/platform/posixpath.js +3 -3
- package/dist/lib/{plugin-marketplace.d.ts → plugins/plugin-marketplace.d.ts} +1 -1
- package/dist/lib/{plugin-marketplace.js → plugins/plugin-marketplace.js} +2 -2
- package/dist/lib/{plugins.d.ts → plugins/plugins.d.ts} +1 -1
- package/dist/lib/{plugins.js → plugins/plugins.js} +7 -7
- package/dist/lib/{skills.d.ts → plugins/skills.d.ts} +1 -1
- package/dist/lib/{skills.js → plugins/skills.js} +7 -7
- package/dist/lib/pricing/cost.d.ts +1 -1
- package/dist/lib/pricing/cost.js +1 -1
- package/dist/lib/profiles-presets.d.ts +1 -1
- package/dist/lib/profiles-presets.js +1 -1
- package/dist/lib/profiles.js +2 -2
- package/dist/lib/project-import.js +4 -1
- package/dist/lib/project-key.js +7 -0
- package/dist/lib/project-launch.d.ts +1 -1
- package/dist/lib/project-launch.js +3 -3
- package/dist/lib/project-pull.d.ts +128 -0
- package/dist/lib/project-pull.js +384 -0
- package/dist/lib/project-root.d.ts +2 -2
- package/dist/lib/project-root.js +2 -2
- package/dist/lib/project-status.js +1 -1
- package/dist/lib/projects.d.ts +23 -0
- package/dist/lib/projects.js +29 -6
- package/dist/lib/refresh.d.ts +12 -1
- package/dist/lib/refresh.js +16 -9
- package/dist/lib/registry.d.ts +9 -2
- package/dist/lib/registry.js +11 -4
- package/dist/lib/resources.d.ts +2 -2
- package/dist/lib/resources.js +2 -2
- package/dist/lib/routers.d.ts +81 -0
- package/dist/lib/routers.js +153 -0
- package/dist/lib/routine-context.d.ts +1 -0
- package/dist/lib/routine-context.js +7 -2
- package/dist/lib/routine-notify-owner.d.ts +1 -1
- package/dist/lib/routine-notify.d.ts +1 -1
- package/dist/lib/routine-notify.js +1 -1
- package/dist/lib/routine-process-cleanup.d.ts +1 -1
- package/dist/lib/routine-readiness.d.ts +1 -1
- package/dist/lib/routine-readiness.js +11 -4
- package/dist/lib/routines-placement.d.ts +12 -2
- package/dist/lib/routines-placement.js +20 -3
- package/dist/lib/routines-project.d.ts +1 -1
- package/dist/lib/routines-project.js +1 -1
- package/dist/lib/rules/compile.d.ts +1 -0
- package/dist/lib/rules/compile.js +10 -2
- package/dist/lib/rules/rules.js +1 -1
- package/dist/lib/run-notify.js +1 -1
- package/dist/lib/runner.d.ts +80 -2
- package/dist/lib/runner.js +261 -67
- package/dist/lib/sandbox.d.ts +1 -1
- package/dist/lib/scheduler.d.ts +1 -1
- package/dist/lib/scheduler.js +1 -1
- package/dist/lib/{routines.d.ts → scheduling/routines.d.ts} +54 -9
- package/dist/lib/{routines.js → scheduling/routines.js} +173 -14
- package/dist/lib/secrets/Agents CLI.app/Contents/CodeResources +0 -0
- package/dist/lib/secrets/Agents CLI.app/Contents/MacOS/Agents CLI +0 -0
- package/dist/lib/secrets/agent.js +2 -2
- package/dist/lib/secrets/audit.js +1 -1
- package/dist/lib/secrets/bundles.d.ts +4 -4
- package/dist/lib/secrets/bundles.js +8 -8
- package/dist/lib/secrets/headless.d.ts +16 -0
- package/dist/lib/secrets/headless.js +21 -0
- package/dist/lib/secrets/index.js +1 -1
- package/dist/lib/secrets/list-filter.d.ts +1 -1
- package/dist/lib/secrets/list-filter.js +2 -2
- package/dist/lib/secrets/push.d.ts +1 -1
- package/dist/lib/secrets/push.js +10 -12
- package/dist/lib/secrets/remote.d.ts +21 -17
- package/dist/lib/secrets/remote.js +39 -23
- package/dist/lib/secrets/vault.js +2 -2
- package/dist/lib/self-heal/checks/shadowing.js +1 -1
- package/dist/lib/self-heal/checks/shims.js +1 -1
- package/dist/lib/self-update.d.ts +39 -4
- package/dist/lib/self-update.js +78 -25
- package/dist/lib/serve/control.d.ts +1 -1
- package/dist/lib/serve/control.js +4 -4
- package/dist/lib/serve/data.d.ts +1 -1
- package/dist/lib/serve/data.js +1 -1
- package/dist/lib/serve/stream.js +1 -1
- package/dist/lib/service-manifest.d.ts +29 -0
- package/dist/lib/service-manifest.js +80 -0
- package/dist/lib/session/active.d.ts +59 -7
- package/dist/lib/session/active.js +158 -17
- package/dist/lib/session/bash-command.js +1 -1
- package/dist/lib/session/claude-accounts.d.ts +1 -1
- package/dist/lib/session/claude-accounts.js +1 -1
- package/dist/lib/session/db.d.ts +10 -2
- package/dist/lib/session/db.js +25 -6
- package/dist/lib/session/discover.d.ts +77 -0
- package/dist/lib/session/discover.js +130 -25
- package/dist/lib/session/fork.js +1 -1
- package/dist/lib/session/inject.d.ts +1 -1
- package/dist/lib/session/insights.d.ts +1 -1
- package/dist/lib/session/insights.js +1 -1
- package/dist/lib/session/live-metadata.d.ts +15 -0
- package/dist/lib/session/live-metadata.js +76 -0
- package/dist/lib/session/migrate-targets.d.ts +1 -1
- package/dist/lib/session/recovery.d.ts +1 -1
- package/dist/lib/session/recovery.js +2 -2
- package/dist/lib/session/remote-active.d.ts +10 -1
- package/dist/lib/session/remote-active.js +8 -3
- package/dist/lib/session/remote-bundle.d.ts +1 -1
- package/dist/lib/session/remote-bundle.js +2 -2
- package/dist/lib/session/remote-list.d.ts +15 -4
- package/dist/lib/session/remote-list.js +40 -3
- package/dist/lib/session/remote.d.ts +5 -5
- package/dist/lib/session/remote.js +13 -17
- package/dist/lib/session/resume-command.d.ts +3 -2
- package/dist/lib/session/resume-command.js +4 -3
- package/dist/lib/session/resume-owner.d.ts +3 -3
- package/dist/lib/session/resume-owner.js +3 -3
- package/dist/lib/session/session-cache.d.ts +12 -0
- package/dist/lib/session/session-cache.js +2 -0
- package/dist/lib/session/share-html.d.ts +55 -0
- package/dist/lib/session/share-html.js +319 -0
- package/dist/lib/session/shell-programs.js +1 -1
- package/dist/lib/session/state.js +5 -5
- package/dist/lib/session/team-filter.d.ts +1 -1
- package/dist/lib/session/team-filter.js +1 -1
- package/dist/lib/session/types.d.ts +3 -3
- package/dist/lib/session/width.d.ts +2 -2
- package/dist/lib/session/width.js +2 -2
- package/dist/lib/settings-manifest.d.ts +2 -0
- package/dist/lib/settings-manifest.js +81 -3
- package/dist/lib/share/delete.d.ts +21 -0
- package/dist/lib/share/delete.js +42 -0
- package/dist/lib/share/publish.d.ts +120 -0
- package/dist/lib/share/publish.js +243 -18
- package/dist/lib/share/worker-template.js +172 -9
- package/dist/lib/shims.js +35 -7
- package/dist/lib/smart-launch.d.ts +4 -4
- package/dist/lib/smart-launch.js +6 -4
- package/dist/lib/snapshot.d.ts +4 -4
- package/dist/lib/snapshot.js +2 -2
- package/dist/lib/ssh-exec.d.ts +1 -1
- package/dist/lib/ssh-exec.js +2 -2
- package/dist/lib/ssh-tunnel.d.ts +10 -10
- package/dist/lib/ssh-tunnel.js +12 -12
- package/dist/lib/staleness/checkers/hooks.d.ts +1 -1
- package/dist/lib/staleness/checkers/hooks.js +1 -1
- package/dist/lib/staleness/detectors/permissions.js +0 -23
- package/dist/lib/staleness/detectors/plugins.js +1 -1
- package/dist/lib/staleness/fingerprint.js +1 -1
- package/dist/lib/staleness/layers.d.ts +1 -1
- package/dist/lib/staleness/layers.js +1 -1
- package/dist/lib/staleness/writers/mcp.js +3 -1
- package/dist/lib/staleness/writers/plugins.js +1 -1
- package/dist/lib/staleness/writers/types.d.ts +8 -0
- package/dist/lib/startup/command-registry.d.ts +6 -147
- package/dist/lib/startup/command-registry.js +40 -303
- package/dist/lib/startup/dev-build.d.ts +0 -21
- package/dist/lib/startup/dev-build.js +29 -8
- package/dist/lib/state.d.ts +19 -1
- package/dist/lib/state.js +120 -51
- package/dist/lib/subagents.js +1 -1
- package/dist/lib/sync-status.js +1 -1
- package/dist/lib/sync-umbrella.d.ts +6 -1
- package/dist/lib/sync-umbrella.js +9 -4
- package/dist/lib/teams/agents.js +2 -2
- package/dist/lib/teams/registry.js +1 -1
- package/dist/lib/terminal/backends/vscodium-agent.js +1 -1
- package/dist/lib/terminal/engine.js +1 -1
- package/dist/lib/terminal/index.d.ts +4 -0
- package/dist/lib/terminal/index.js +3 -0
- package/dist/lib/terminal/inject.d.ts +2 -2
- package/dist/lib/terminal/inject.js +2 -2
- package/dist/lib/terminal/transport.js +1 -1
- package/dist/lib/tmux/index.d.ts +1 -1
- package/dist/lib/tmux/index.js +1 -1
- package/dist/lib/tmux/session.d.ts +21 -5
- package/dist/lib/tmux/session.js +76 -22
- package/dist/lib/triggers/handlers.d.ts +38 -3
- package/dist/lib/triggers/handlers.js +58 -7
- package/dist/lib/triggers/webhook.d.ts +113 -5
- package/dist/lib/triggers/webhook.js +223 -44
- package/dist/lib/types.d.ts +19 -7
- package/dist/lib/usage-fleet.d.ts +1 -1
- package/dist/lib/usage-fleet.js +1 -1
- package/dist/lib/usage-refresh.d.ts +1 -1
- package/dist/lib/usage-refresh.js +3 -3
- package/dist/lib/version-duplicates.js +2 -2
- package/dist/lib/view-types.d.ts +56 -0
- package/dist/lib/view-types.js +1 -0
- package/dist/lib/watchdog/rotate.d.ts +2 -2
- package/dist/lib/watchdog/rotate.js +3 -3
- package/dist/lib/watchdog/runner.d.ts +2 -3
- package/dist/lib/watchdog/runner.js +3 -4
- package/dist/lib/workflows.js +1 -1
- package/dist/lib/wrap.d.ts +33 -0
- package/dist/lib/wrap.js +70 -0
- package/package.json +2 -1
- package/scripts/postinstall.js +2 -2
- package/dist/commands/bench.d.ts +0 -2
- package/dist/commands/bench.js +0 -101
- package/dist/commands/cp.d.ts +0 -84
- package/dist/commands/cp.js +0 -231
- package/dist/commands/login.d.ts +0 -2
- package/dist/lib/resources/commands.d.ts +0 -46
- package/dist/lib/resources/commands.js +0 -211
- package/dist/lib/resources/hooks.d.ts +0 -16
- package/dist/lib/resources/hooks.js +0 -153
- package/dist/lib/resources/mcp.d.ts +0 -34
- package/dist/lib/resources/mcp.js +0 -250
- package/dist/lib/resources/memory.d.ts +0 -15
- package/dist/lib/resources/memory.js +0 -46
- package/dist/lib/resources/permissions.d.ts +0 -13
- package/dist/lib/resources/permissions.js +0 -202
- package/dist/lib/resources/rules.d.ts +0 -46
- package/dist/lib/resources/rules.js +0 -179
- package/dist/lib/resources/skills.d.ts +0 -37
- package/dist/lib/resources/skills.js +0 -247
- package/dist/lib/resources/subagents.d.ts +0 -46
- package/dist/lib/resources/subagents.js +0 -202
- /package/dist/lib/{feed.d.ts → feed/feed.d.ts} +0 -0
package/dist/lib/secrets/push.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Push one bundle's values to a remote host over SSH — the provisioning
|
|
3
|
-
* primitive behind `agents secrets export --
|
|
3
|
+
* primitive behind `agents secrets export --device` and, from RUSH-1968, behind
|
|
4
4
|
* `agents fleet apply --provision-secrets`.
|
|
5
5
|
*
|
|
6
|
-
* This logic used to live inline in the `export --
|
|
6
|
+
* This logic used to live inline in the `export --device` command action. It moved
|
|
7
7
|
* here because `lib/fleet/apply.ts` needs it and a lib MUST NOT import a command
|
|
8
8
|
* module — and because the absence of a callable primitive is part of why
|
|
9
9
|
* `fleet apply` never provisioned secrets at all, leaving an operator to
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* interleaving stray lines into it.
|
|
18
18
|
* - **Resolve once, push N times.** `resolveBundleForPush` is separate because
|
|
19
19
|
* reading a bundle can prompt (Touch ID); doing it per host would prompt per
|
|
20
|
-
* host. `export --
|
|
20
|
+
* host. `export --device a,b,c` resolves once and pushes three times.
|
|
21
21
|
*/
|
|
22
22
|
import { sshExec } from '../ssh-exec.js';
|
|
23
23
|
import { remoteShellFor, buildWindowsStdinImportCommand } from '../hosts/remote-cmd.js';
|
|
@@ -89,6 +89,7 @@ export function planPushTransport(resolved, bundle, host, opts) {
|
|
|
89
89
|
const { remoteCmd, input } = buildRemoteFileImportCommand(bundle, resolved.dotenv, {
|
|
90
90
|
passphrase: opts.passphrase ?? '',
|
|
91
91
|
force: opts.force,
|
|
92
|
+
policyNever: opts.policyNever,
|
|
92
93
|
});
|
|
93
94
|
return { kind: 'ssh', remoteCmd, input, multiplex: false };
|
|
94
95
|
}
|
|
@@ -100,7 +101,7 @@ export function planPushTransport(resolved, bundle, host, opts) {
|
|
|
100
101
|
// the wire over ssh stdin.
|
|
101
102
|
return {
|
|
102
103
|
kind: 'ssh',
|
|
103
|
-
remoteCmd: buildWindowsStdinImportCommand(bundle, { force: opts.force }),
|
|
104
|
+
remoteCmd: buildWindowsStdinImportCommand(bundle, { force: opts.force, policyNever: opts.policyNever }),
|
|
104
105
|
input: resolved.dotenv,
|
|
105
106
|
multiplex: false,
|
|
106
107
|
};
|
|
@@ -110,7 +111,11 @@ export function planPushTransport(resolved, bundle, host, opts) {
|
|
|
110
111
|
// path the READ inverse (`remoteResolveEnv`) uses.
|
|
111
112
|
return {
|
|
112
113
|
kind: 'remote-secrets',
|
|
113
|
-
args: [
|
|
114
|
+
args: [
|
|
115
|
+
'import', bundle, '--from', '-',
|
|
116
|
+
...(opts.force ? ['--force'] : []),
|
|
117
|
+
...(opts.policyNever ? ['--policy', 'never', '--i-understand'] : []),
|
|
118
|
+
],
|
|
114
119
|
input: resolved.dotenv,
|
|
115
120
|
multiplex: false,
|
|
116
121
|
};
|
|
@@ -158,13 +163,6 @@ export function pushResolvedBundleToHost(resolved, bundle, host, opts) {
|
|
|
158
163
|
: `pushed '${bundle}' but could not verify it on the remote: ${verdict.reason}`);
|
|
159
164
|
}
|
|
160
165
|
}
|
|
161
|
-
if (opts.policyNever) {
|
|
162
|
-
const policy = remoteSecretsRaw(host, ['policy', bundle, 'never', '--i-understand'], { osLookupName: host, secret: true });
|
|
163
|
-
if (policy.code !== 0) {
|
|
164
|
-
const msg = (policy.stderr || policy.stdout || '').trim();
|
|
165
|
-
return fail(`pushed '${bundle}' but could not set remote policy never${msg ? `: ${msg}` : ''}`);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
166
|
for (const step of planLiteralRestoration(bundle, opts.literalValues)) {
|
|
169
167
|
const removed = remoteSecretsRaw(host, step.removeArgs, { osLookupName: host, secret: true });
|
|
170
168
|
if (removed.code !== 0) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Remote secrets — read and use `agents secrets` bundles that live on another
|
|
3
|
-
* host, over the same hardened SSH path that `agents secrets export --
|
|
3
|
+
* host, over the same hardened SSH path that `agents secrets export --device`
|
|
4
4
|
* (the write inverse) already uses.
|
|
5
5
|
*
|
|
6
6
|
* This is the READ / USE direction:
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* inject it ephemerally — never written to this machine's keychain.
|
|
11
11
|
*
|
|
12
12
|
* Trust model: relies on the operator's existing SSH access to the host (same
|
|
13
|
-
* boundary as `export --
|
|
13
|
+
* boundary as `export --device` / `run --device`). Bundle names are shell-quoted
|
|
14
14
|
* into the remote command; resolved VALUES return over ssh stdout; a forwarded
|
|
15
15
|
* file-backend passphrase travels over ssh stdin (first line) so it never lands
|
|
16
16
|
* in argv / `ps` / remote shell history. Nothing is persisted locally.
|
|
@@ -27,9 +27,8 @@ import { type SshExecResult } from '../ssh-exec.js';
|
|
|
27
27
|
* - **Managed pinned host keys.** Verify against the CLI-owned known_hosts
|
|
28
28
|
* store (`known-hosts.ts`), not `~/.ssh/known_hosts`. A CHANGED key on a
|
|
29
29
|
* known host is refused (`StrictHostKeyChecking` `yes` once pinned,
|
|
30
|
-
* `accept-new`
|
|
31
|
-
*
|
|
32
|
-
* key can never receive or return a secret.
|
|
30
|
+
* `accept-new` before that). Callers that copy durable provider credentials
|
|
31
|
+
* must separately require an existing pin before invoking this transport.
|
|
33
32
|
* - **No multiplex reuse.** `multiplex: false` — a credential channel never
|
|
34
33
|
* leaves a persistent `ControlMaster` socket lingering (60s `ControlPersist`)
|
|
35
34
|
* that any other `agents` invocation to that host would silently reuse.
|
|
@@ -38,6 +37,8 @@ export declare function credentialTransportSshOpts(target: string): {
|
|
|
38
37
|
hostKeyOpts: string[];
|
|
39
38
|
multiplex: false;
|
|
40
39
|
};
|
|
40
|
+
/** Refuse durable credential transfer until the destination SSH key is pinned. */
|
|
41
|
+
export declare function assertCredentialTransportHostPinned(target: string, pinned?: boolean): void;
|
|
41
42
|
/**
|
|
42
43
|
* Trust boundary for a remote-resolved env map. A peer's `secrets export` output
|
|
43
44
|
* is untrusted input: a compromised or misconfigured host could return keys that
|
|
@@ -56,9 +57,9 @@ export declare function credentialTransportSshOpts(target: string): {
|
|
|
56
57
|
*/
|
|
57
58
|
export declare function isDangerousRemoteEnvKey(name: string): boolean;
|
|
58
59
|
/**
|
|
59
|
-
* Resolve a `--
|
|
60
|
+
* Resolve a `--device` value to an ssh target STRING for the remote-secrets path.
|
|
60
61
|
* Delegates to the single host/device resolver (`resolveHost`, RUSH-1967) so a
|
|
61
|
-
* name here dials the exact same box `run --
|
|
62
|
+
* name here dials the exact same box `run --device` does; on a miss, treats the
|
|
62
63
|
* value as a raw ssh target and validates it against injection. Named distinctly
|
|
63
64
|
* from `../devices/resolve-target.ts` (which returns richer shapes) so importing
|
|
64
65
|
* the wrong one can't silently change which machine you dial.
|
|
@@ -67,7 +68,7 @@ export declare function resolveHostSshTarget(nameOrAlias: string): Promise<strin
|
|
|
67
68
|
/**
|
|
68
69
|
* Merge `--host <single>` / `--hosts <a,b,c>` (and their `--device` / `--devices`
|
|
69
70
|
* aliases) into an ordered, de-duplicated list. All four flags compose; any alone
|
|
70
|
-
* works. `--device`/`--devices` resolve identically to `--
|
|
71
|
+
* works. `--device`/`--devices` resolve identically to `--device`/`--hosts` so the
|
|
71
72
|
* fleet-wide `--device` vocabulary (see `agents run --device`, `agents feed --host`)
|
|
72
73
|
* works on the secrets remote commands too. Empty when none is set.
|
|
73
74
|
*/
|
|
@@ -109,7 +110,7 @@ export declare function remoteSecretsRaw(target: string, args: string[], opts?:
|
|
|
109
110
|
* appear (the macOS file-store guard then hard-errors "needs
|
|
110
111
|
* AGENTS_SECRETS_PASSPHRASE") — this inherits the caller's real terminal, so the
|
|
111
112
|
* remote sees a genuine TTY and its hidden passphrase prompt surfaces and reads
|
|
112
|
-
* the keystrokes. This is the transport for `unlock --
|
|
113
|
+
* the keystrokes. This is the transport for `unlock --device`: you type the remote
|
|
113
114
|
* bundle's passphrase at your own terminal. Output is NOT captured (it streams
|
|
114
115
|
* to the terminal); only the exit code is returned.
|
|
115
116
|
*/
|
|
@@ -168,9 +169,10 @@ export type RemoteKeychainWriteVerification = {
|
|
|
168
169
|
* metadata `noAcl` last — bundles.ts writeBundleWithItems). The metadata-only bundle
|
|
169
170
|
* then fails every later read with the confusing `Bundle '<b>' key '<k>': stored
|
|
170
171
|
* item '<item>' not found` (bundles.ts resolveBundleEnv). We catch it by reading
|
|
171
|
-
* the bundle back the same way a
|
|
172
|
-
* json
|
|
173
|
-
* any keychain read — no Touch ID prompt) and confirming every pushed key
|
|
172
|
+
* the bundle back the same way a later `secrets exec`/resolve will (the marker-gated
|
|
173
|
+
* json transport, driven headlessly on the remote so its `agentOnly` guard FAILS FAST
|
|
174
|
+
* before any keychain read — no Touch ID prompt) and confirming every pushed key
|
|
175
|
+
* returned.
|
|
174
176
|
*
|
|
175
177
|
* Pure so both branches are unit-testable without a real locked keychain: inject the
|
|
176
178
|
* "read-back failed / key absent" condition through `readBack`.
|
|
@@ -192,10 +194,11 @@ export declare function keychainWriteFailureMessage(host: string, bundle: string
|
|
|
192
194
|
/**
|
|
193
195
|
* Read a bundle back from a remote over SSH (headlessly, so it fails fast rather
|
|
194
196
|
* than prompting Touch ID) and confirm the pushed keys materialized. Drives the
|
|
195
|
-
* remote's
|
|
196
|
-
*
|
|
197
|
-
* are dropped immediately and never retained or
|
|
198
|
-
* verdict; the caller renders
|
|
197
|
+
* remote's marker-gated json transport (`secrets export <bundle> --plaintext
|
|
198
|
+
* --format json` under AGENTS_SECRETS_REMOTE_TRANSPORT) but keeps only the KEY
|
|
199
|
+
* NAMES; the plaintext values are dropped immediately and never retained or
|
|
200
|
+
* logged. Returns a verification verdict; the caller renders
|
|
201
|
+
* `keychainWriteFailureMessage` on failure.
|
|
199
202
|
*/
|
|
200
203
|
export declare function verifyRemoteKeychainPush(target: string, bundle: string, pushedKeys: string[], opts?: {
|
|
201
204
|
osLookupName?: string;
|
|
@@ -203,7 +206,7 @@ export declare function verifyRemoteKeychainPush(target: string, bundle: string,
|
|
|
203
206
|
}): RemoteKeychainWriteVerification;
|
|
204
207
|
/**
|
|
205
208
|
* The `bash -lc` command + stdin payload that drives a **file-backed** remote
|
|
206
|
-
* import for `secrets export --
|
|
209
|
+
* import for `secrets export --device … --remote-backend file`.
|
|
207
210
|
*
|
|
208
211
|
* The file store is passphrase-free by default: with `AGENTS_SECRETS_PASSPHRASE`
|
|
209
212
|
* unset the remote `agents secrets import --backend file` auto-provisions the
|
|
@@ -226,6 +229,7 @@ export declare function verifyRemoteKeychainPush(target: string, bundle: string,
|
|
|
226
229
|
export declare function buildRemoteFileImportCommand(bundle: string, dotenv: string, opts?: {
|
|
227
230
|
passphrase?: string;
|
|
228
231
|
force?: boolean;
|
|
232
|
+
policyNever?: boolean;
|
|
229
233
|
}): {
|
|
230
234
|
remoteCmd: string;
|
|
231
235
|
input: string;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Remote secrets — read and use `agents secrets` bundles that live on another
|
|
3
|
-
* host, over the same hardened SSH path that `agents secrets export --
|
|
3
|
+
* host, over the same hardened SSH path that `agents secrets export --device`
|
|
4
4
|
* (the write inverse) already uses.
|
|
5
5
|
*
|
|
6
6
|
* This is the READ / USE direction:
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* inject it ephemerally — never written to this machine's keychain.
|
|
11
11
|
*
|
|
12
12
|
* Trust model: relies on the operator's existing SSH access to the host (same
|
|
13
|
-
* boundary as `export --
|
|
13
|
+
* boundary as `export --device` / `run --device`). Bundle names are shell-quoted
|
|
14
14
|
* into the remote command; resolved VALUES return over ssh stdout; a forwarded
|
|
15
15
|
* file-backend passphrase travels over ssh stdin (first line) so it never lands
|
|
16
16
|
* in argv / `ps` / remote shell history. Nothing is persisted locally.
|
|
@@ -39,9 +39,8 @@ function hostKeyLookupName(target) {
|
|
|
39
39
|
* - **Managed pinned host keys.** Verify against the CLI-owned known_hosts
|
|
40
40
|
* store (`known-hosts.ts`), not `~/.ssh/known_hosts`. A CHANGED key on a
|
|
41
41
|
* known host is refused (`StrictHostKeyChecking` `yes` once pinned,
|
|
42
|
-
* `accept-new`
|
|
43
|
-
*
|
|
44
|
-
* key can never receive or return a secret.
|
|
42
|
+
* `accept-new` before that). Callers that copy durable provider credentials
|
|
43
|
+
* must separately require an existing pin before invoking this transport.
|
|
45
44
|
* - **No multiplex reuse.** `multiplex: false` — a credential channel never
|
|
46
45
|
* leaves a persistent `ControlMaster` socket lingering (60s `ControlPersist`)
|
|
47
46
|
* that any other `agents` invocation to that host would silently reuse.
|
|
@@ -49,6 +48,13 @@ function hostKeyLookupName(target) {
|
|
|
49
48
|
export function credentialTransportSshOpts(target) {
|
|
50
49
|
return { hostKeyOpts: hostKeyCheckingOpts(isHostPinned(hostKeyLookupName(target))), multiplex: false };
|
|
51
50
|
}
|
|
51
|
+
/** Refuse durable credential transfer until the destination SSH key is pinned. */
|
|
52
|
+
export function assertCredentialTransportHostPinned(target, pinned = isHostPinned(hostKeyLookupName(target))) {
|
|
53
|
+
if (pinned)
|
|
54
|
+
return;
|
|
55
|
+
throw new Error(`Refusing to transfer provider credentials to '${target}' before its SSH host key is pinned. ` +
|
|
56
|
+
`Connect once with 'agents ssh ${target}' and verify the host, then retry.`);
|
|
57
|
+
}
|
|
52
58
|
/**
|
|
53
59
|
* Trust boundary for a remote-resolved env map. A peer's `secrets export` output
|
|
54
60
|
* is untrusted input: a compromised or misconfigured host could return keys that
|
|
@@ -85,9 +91,9 @@ function osForTarget(target, lookupName) {
|
|
|
85
91
|
return byName ?? resolveRemoteOsSync(target.split('@').pop() ?? target);
|
|
86
92
|
}
|
|
87
93
|
/**
|
|
88
|
-
* Resolve a `--
|
|
94
|
+
* Resolve a `--device` value to an ssh target STRING for the remote-secrets path.
|
|
89
95
|
* Delegates to the single host/device resolver (`resolveHost`, RUSH-1967) so a
|
|
90
|
-
* name here dials the exact same box `run --
|
|
96
|
+
* name here dials the exact same box `run --device` does; on a miss, treats the
|
|
91
97
|
* value as a raw ssh target and validates it against injection. Named distinctly
|
|
92
98
|
* from `../devices/resolve-target.ts` (which returns richer shapes) so importing
|
|
93
99
|
* the wrong one can't silently change which machine you dial.
|
|
@@ -102,7 +108,7 @@ export async function resolveHostSshTarget(nameOrAlias) {
|
|
|
102
108
|
/**
|
|
103
109
|
* Merge `--host <single>` / `--hosts <a,b,c>` (and their `--device` / `--devices`
|
|
104
110
|
* aliases) into an ordered, de-duplicated list. All four flags compose; any alone
|
|
105
|
-
* works. `--device`/`--devices` resolve identically to `--
|
|
111
|
+
* works. `--device`/`--devices` resolve identically to `--device`/`--hosts` so the
|
|
106
112
|
* fleet-wide `--device` vocabulary (see `agents run --device`, `agents feed --host`)
|
|
107
113
|
* works on the secrets remote commands too. Empty when none is set.
|
|
108
114
|
*/
|
|
@@ -158,7 +164,7 @@ export function remoteSecretsRaw(target, args, opts = {}) {
|
|
|
158
164
|
// to multiplex — see `credentialTransportSshOpts` (RUSH-2527). A `-tt` session
|
|
159
165
|
// (a remote reveal/passphrase prompt) additionally allocates a PTY and never
|
|
160
166
|
// multiplexes, and it COMPOSES with the secret posture: a `view --reveal` over
|
|
161
|
-
// `--
|
|
167
|
+
// `--device` both prompts AND streams the plaintext value back over ssh stdout,
|
|
162
168
|
// so it needs the managed host-key pin too — `tty` must not short-circuit past
|
|
163
169
|
// `secret`. A plain browse `list` passes neither and keeps the shared baseline.
|
|
164
170
|
const posture = opts.secret ? credentialTransportSshOpts(target) : {};
|
|
@@ -180,13 +186,13 @@ export function remoteSecretsRaw(target, args, opts = {}) {
|
|
|
180
186
|
* appear (the macOS file-store guard then hard-errors "needs
|
|
181
187
|
* AGENTS_SECRETS_PASSPHRASE") — this inherits the caller's real terminal, so the
|
|
182
188
|
* remote sees a genuine TTY and its hidden passphrase prompt surfaces and reads
|
|
183
|
-
* the keystrokes. This is the transport for `unlock --
|
|
189
|
+
* the keystrokes. This is the transport for `unlock --device`: you type the remote
|
|
184
190
|
* bundle's passphrase at your own terminal. Output is NOT captured (it streams
|
|
185
191
|
* to the terminal); only the exit code is returned.
|
|
186
192
|
*/
|
|
187
193
|
export function remoteSecretsStream(target, args, opts = {}) {
|
|
188
194
|
const remoteCmd = buildRemoteAgentsInvocation(['secrets', ...args], undefined, osForTarget(target, opts.osLookupName));
|
|
189
|
-
// `unlock --
|
|
195
|
+
// `unlock --device` carries the remote bundle's passphrase to the destination over
|
|
190
196
|
// this interactive channel, so it is secret-bearing: pin the managed host key
|
|
191
197
|
// (a changed key is refused) and never multiplex (RUSH-2527).
|
|
192
198
|
return sshStream(target, remoteCmd, { tty: true, ...credentialTransportSshOpts(target) });
|
|
@@ -206,7 +212,12 @@ export function remoteSecretsStream(target, args, opts = {}) {
|
|
|
206
212
|
*/
|
|
207
213
|
export async function remoteResolveEnv(target, bundle, opts = {}) {
|
|
208
214
|
assertValidSshTarget(target);
|
|
209
|
-
|
|
215
|
+
// AGENTS_SECRETS_REMOTE_TRANSPORT is the marker that lets the remote's
|
|
216
|
+
// `export --plaintext --format json` emit at all — the public shell-eval
|
|
217
|
+
// export mode was removed (RUSH-2774), and this machine-to-machine resolve is
|
|
218
|
+
// the only surviving caller of the JSON emitter. Riding the legacy argv keeps
|
|
219
|
+
// a new driver compatible with an old remote during a fleet rollout.
|
|
220
|
+
const remoteCmd = buildRemoteAgentsInvocation(['secrets', 'export', bundle, '--plaintext', '--format', 'json'], undefined, osForTarget(target, opts.osLookupName), { AGENTS_SECRETS_REMOTE_TRANSPORT: '1' });
|
|
210
221
|
// Resolving a remote bundle streams its plaintext values back over ssh stdout,
|
|
211
222
|
// so this read is secret-bearing: pin the managed host key and never leave a
|
|
212
223
|
// reusable control master to the source (RUSH-2527, `credentialTransportSshOpts`).
|
|
@@ -293,9 +304,10 @@ function isLockedKeychainReadBackError(stderr) {
|
|
|
293
304
|
* metadata `noAcl` last — bundles.ts writeBundleWithItems). The metadata-only bundle
|
|
294
305
|
* then fails every later read with the confusing `Bundle '<b>' key '<k>': stored
|
|
295
306
|
* item '<item>' not found` (bundles.ts resolveBundleEnv). We catch it by reading
|
|
296
|
-
* the bundle back the same way a
|
|
297
|
-
* json
|
|
298
|
-
* any keychain read — no Touch ID prompt) and confirming every pushed key
|
|
307
|
+
* the bundle back the same way a later `secrets exec`/resolve will (the marker-gated
|
|
308
|
+
* json transport, driven headlessly on the remote so its `agentOnly` guard FAILS FAST
|
|
309
|
+
* before any keychain read — no Touch ID prompt) and confirming every pushed key
|
|
310
|
+
* returned.
|
|
299
311
|
*
|
|
300
312
|
* Pure so both branches are unit-testable without a real locked keychain: inject the
|
|
301
313
|
* "read-back failed / key absent" condition through `readBack`.
|
|
@@ -346,20 +358,23 @@ export function keychainWriteFailureMessage(host, bundle, reason) {
|
|
|
346
358
|
`A macOS login keychain is LOCKED under headless SSH, so a keychain-backed write ` +
|
|
347
359
|
`lands the bundle metadata but no readable secret items, and later reads fail with ` +
|
|
348
360
|
`"stored item '…' not found". Re-run with a headless-readable backend:\n` +
|
|
349
|
-
` agents secrets export ${bundle} --
|
|
361
|
+
` agents secrets export ${bundle} --device ${host} --remote-backend file\n` +
|
|
350
362
|
`(needs AGENTS_SECRETS_PASSPHRASE set locally), or unlock the remote keychain first ` +
|
|
351
363
|
`(e.g. an interactive login / \`agents secrets unlock\` on ${host}) and retry.`);
|
|
352
364
|
}
|
|
353
365
|
/**
|
|
354
366
|
* Read a bundle back from a remote over SSH (headlessly, so it fails fast rather
|
|
355
367
|
* than prompting Touch ID) and confirm the pushed keys materialized. Drives the
|
|
356
|
-
* remote's
|
|
357
|
-
*
|
|
358
|
-
* are dropped immediately and never retained or
|
|
359
|
-
* verdict; the caller renders
|
|
368
|
+
* remote's marker-gated json transport (`secrets export <bundle> --plaintext
|
|
369
|
+
* --format json` under AGENTS_SECRETS_REMOTE_TRANSPORT) but keeps only the KEY
|
|
370
|
+
* NAMES; the plaintext values are dropped immediately and never retained or
|
|
371
|
+
* logged. Returns a verification verdict; the caller renders
|
|
372
|
+
* `keychainWriteFailureMessage` on failure.
|
|
360
373
|
*/
|
|
361
374
|
export function verifyRemoteKeychainPush(target, bundle, pushedKeys, opts = {}) {
|
|
362
|
-
const remoteCmd = buildRemoteAgentsInvocation(['secrets', 'export', bundle, '--plaintext', '--format', 'json'], undefined, osForTarget(target, opts.osLookupName)
|
|
375
|
+
const remoteCmd = buildRemoteAgentsInvocation(['secrets', 'export', bundle, '--plaintext', '--format', 'json'], undefined, osForTarget(target, opts.osLookupName),
|
|
376
|
+
// Same transport marker as remoteResolveEnv — see the comment there (RUSH-2774).
|
|
377
|
+
{ AGENTS_SECRETS_REMOTE_TRANSPORT: '1' });
|
|
363
378
|
// This read-back streams the just-pushed plaintext over ssh stdout, so it is
|
|
364
379
|
// as secret-bearing as the push itself — the push path passes `secret: true`
|
|
365
380
|
// so it too pins the managed host key and leaves no reusable control master to
|
|
@@ -400,7 +415,7 @@ export function verifyRemoteKeychainPush(target, bundle, pushedKeys, opts = {})
|
|
|
400
415
|
}
|
|
401
416
|
/**
|
|
402
417
|
* The `bash -lc` command + stdin payload that drives a **file-backed** remote
|
|
403
|
-
* import for `secrets export --
|
|
418
|
+
* import for `secrets export --device … --remote-backend file`.
|
|
404
419
|
*
|
|
405
420
|
* The file store is passphrase-free by default: with `AGENTS_SECRETS_PASSPHRASE`
|
|
406
421
|
* unset the remote `agents secrets import --backend file` auto-provisions the
|
|
@@ -422,7 +437,8 @@ export function verifyRemoteKeychainPush(target, bundle, pushedKeys, opts = {})
|
|
|
422
437
|
*/
|
|
423
438
|
export function buildRemoteFileImportCommand(bundle, dotenv, opts = {}) {
|
|
424
439
|
const force = opts.force ? ' --force' : '';
|
|
425
|
-
const
|
|
440
|
+
const policy = opts.policyNever ? ' --policy never --i-understand' : '';
|
|
441
|
+
const importCmd = `agents secrets import ${shellQuote(bundle)} --from - --backend file${force}${policy}`;
|
|
426
442
|
const passphrase = opts.passphrase ?? '';
|
|
427
443
|
if (passphrase) {
|
|
428
444
|
// Opt-in shared passphrase: read it off the FIRST stdin line, export it, then
|
|
@@ -237,7 +237,7 @@ export function getVaultSession() {
|
|
|
237
237
|
function requireVaultKey() {
|
|
238
238
|
const session = getVaultSession();
|
|
239
239
|
if (!session.loggedIn) {
|
|
240
|
-
throw new Error('
|
|
240
|
+
throw new Error('Synced secrets locked. Run: agents secrets vault unlock');
|
|
241
241
|
}
|
|
242
242
|
return session.key;
|
|
243
243
|
}
|
|
@@ -259,7 +259,7 @@ function parseVaultItem(item) {
|
|
|
259
259
|
function vaultMissingError(file) {
|
|
260
260
|
return new Error(`Vault file is missing: ${file}. A vault was created but the file is gone` +
|
|
261
261
|
' (a sync conflict, an undownloaded placeholder, or an accidental move/delete).' +
|
|
262
|
-
' Restore it before writing, or run: agents
|
|
262
|
+
' Restore it before writing, or run: agents secrets vault unlock --create --force to start over.');
|
|
263
263
|
}
|
|
264
264
|
function readVaultData() {
|
|
265
265
|
const file = vaultPath();
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import { resultOf } from '../types.js';
|
|
7
7
|
import { AGENTS } from '../../agents.js';
|
|
8
8
|
import { getPathShadowingExecutable, adoptShadowingLauncher, listAgentsWithNonIsolatedInstalledVersions, } from '../../shims.js';
|
|
9
|
-
import { getGlobalDefault } from '../../versions.js';
|
|
9
|
+
import { getGlobalDefault } from '../../installations/versions.js';
|
|
10
10
|
export const shadowingCheck = {
|
|
11
11
|
id: 'shadowing',
|
|
12
12
|
title: 'Launcher shadowing the version-managed shim',
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
import { resultOf } from '../types.js';
|
|
6
6
|
import { AGENTS } from '../../agents.js';
|
|
7
7
|
import { createShim, ensureShimCurrent, ensureVersionedAliasCurrent, isShimCurrent, isVersionedAliasCurrent, removeShim, shimExists, shimPointsAtLiveInstall, removeLegacyUserShim, listAgentsWithInstalledVersions, listAgentsWithNonIsolatedInstalledVersions, listShimFileNames, pruneOrphanedCommandShim, } from '../../shims.js';
|
|
8
|
-
import { listInstalledVersions } from '../../versions.js';
|
|
8
|
+
import { listInstalledVersions } from '../../installations/versions.js';
|
|
9
9
|
export const shimsCheck = {
|
|
10
10
|
id: 'shims',
|
|
11
11
|
title: 'Dispatch shims + versioned aliases',
|
|
@@ -200,7 +200,24 @@ export interface MultiInstallInventoryEntry {
|
|
|
200
200
|
packageRoot: string;
|
|
201
201
|
version: string;
|
|
202
202
|
note: string;
|
|
203
|
+
/** True for the copy that is currently executing. */
|
|
204
|
+
running: boolean;
|
|
205
|
+
/**
|
|
206
|
+
* True when a bare `agents doctor --fix` deletes this copy (RUSH-2415:
|
|
207
|
+
* npx-cache / unsafe-legacy / pre-1.22.30 with a fixed peer). False for the
|
|
208
|
+
* running copy and for any duplicate --fix will not touch — a healthy
|
|
209
|
+
* >=1.22.30 peer, or a pre-1.22.30 copy with no fixed peer to fall back to;
|
|
210
|
+
* both need the manual command from manualUninstallCommand() (RUSH-2705/2713).
|
|
211
|
+
*/
|
|
212
|
+
autoPurgeable: boolean;
|
|
203
213
|
}
|
|
214
|
+
/**
|
|
215
|
+
* The exact shell command that removes the install at `packageRoot` by hand —
|
|
216
|
+
* the remedy for duplicates `doctor --fix` deliberately will not purge
|
|
217
|
+
* (RUSH-2705). `--prefix` pins the target tree no matter which npm binary
|
|
218
|
+
* PATH resolves, mirroring installPackageIntoPrefix.
|
|
219
|
+
*/
|
|
220
|
+
export declare function manualUninstallCommand(packageRoot: string): string;
|
|
204
221
|
export declare function buildMultiInstallInventory(runningRoot: string, runningVersion: string, installs: AgentsCliInstall[]): MultiInstallInventoryEntry[];
|
|
205
222
|
/** Why a discovered install is safe to delete without an interactive confirm. */
|
|
206
223
|
export type RemovableInstallReason = 'npx-cache' | 'unsafe-legacy-helper' | 'pre-fixed-version';
|
|
@@ -250,6 +267,27 @@ export declare function purgeRemovableAgentsCliInstalls(candidates: RemovableAge
|
|
|
250
267
|
dryRun?: boolean;
|
|
251
268
|
runningRoot?: string;
|
|
252
269
|
}): PurgeRemovableInstallsResult;
|
|
270
|
+
/** A detected duplicate that `doctor --fix` will not purge (RUSH-2705). */
|
|
271
|
+
export interface UnresolvedDuplicateInstall {
|
|
272
|
+
packageRoot: string;
|
|
273
|
+
version: string;
|
|
274
|
+
/** Exact shell command that removes this copy by hand. */
|
|
275
|
+
manualRemoveCommand: string;
|
|
276
|
+
}
|
|
277
|
+
export interface RemediateStaleInstallsResult extends PurgeRemovableInstallsResult {
|
|
278
|
+
inventory: MultiInstallInventoryEntry[];
|
|
279
|
+
candidates: RemovableAgentsCliInstall[];
|
|
280
|
+
/**
|
|
281
|
+
* Duplicates detected but NOT auto-purged, for either reason:
|
|
282
|
+
* 1. a healthy >=1.22.30 global (safe, just redundant), or
|
|
283
|
+
* 2. a pre-1.22.30 copy left alone only because no fixed peer exists to fall
|
|
284
|
+
* back to (the anti-stranding guard) — this one is genuinely vulnerable,
|
|
285
|
+
* not healthy.
|
|
286
|
+
* Either way the caller must surface manualRemoveCommand — otherwise the
|
|
287
|
+
* multi-install warning keeps firing with no working remedy (RUSH-2705/2713).
|
|
288
|
+
*/
|
|
289
|
+
unresolved: UnresolvedDuplicateInstall[];
|
|
290
|
+
}
|
|
253
291
|
/**
|
|
254
292
|
* Scan + classify + purge in one call. Used by `agents doctor --fix` and
|
|
255
293
|
* `agents upgrade` so both paths remediate the same set of latent copies.
|
|
@@ -260,10 +298,7 @@ export declare function remediateStaleAgentsCliInstalls(opts: {
|
|
|
260
298
|
pathEnv?: string;
|
|
261
299
|
findOpts?: FindAgentsCliInstallsOptions;
|
|
262
300
|
dryRun?: boolean;
|
|
263
|
-
}):
|
|
264
|
-
inventory: MultiInstallInventoryEntry[];
|
|
265
|
-
candidates: RemovableAgentsCliInstall[];
|
|
266
|
-
};
|
|
301
|
+
}): RemediateStaleInstallsResult;
|
|
267
302
|
/**
|
|
268
303
|
* Resolve every `agents` entrypoint on PATH, then inspect the bounded global
|
|
269
304
|
* install layouts used by NVM, fnm, Volta, Bun, npm, and npx. More than one
|
package/dist/lib/self-update.js
CHANGED
|
@@ -145,6 +145,13 @@ export function readMultiInstallScanCache(file) {
|
|
|
145
145
|
!Array.isArray(raw.inventory)) {
|
|
146
146
|
return null;
|
|
147
147
|
}
|
|
148
|
+
// A cache written before the entries carried running/autoPurgeable
|
|
149
|
+
// (RUSH-2705) cannot drive the banner's remedy choice — treat it as
|
|
150
|
+
// corrupt so the caller re-scans rather than mis-advertising --fix.
|
|
151
|
+
const entries = raw.inventory;
|
|
152
|
+
if (entries.some((entry) => typeof entry?.running !== 'boolean' || typeof entry?.autoPurgeable !== 'boolean')) {
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
148
155
|
return raw;
|
|
149
156
|
}
|
|
150
157
|
catch {
|
|
@@ -415,11 +422,67 @@ function packageRootForEntry(real) {
|
|
|
415
422
|
}
|
|
416
423
|
return null;
|
|
417
424
|
}
|
|
425
|
+
/** Best-effort canonical path; keeps the input when realpath fails. */
|
|
426
|
+
function canonicalPath(p) {
|
|
427
|
+
try {
|
|
428
|
+
return fs.realpathSync(p);
|
|
429
|
+
}
|
|
430
|
+
catch {
|
|
431
|
+
return p;
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
/**
|
|
435
|
+
* Ensure the running copy participates in classification (the "has a fixed
|
|
436
|
+
* peer" check) even when the PATH scan missed it — a source tree or unusual
|
|
437
|
+
* layout. The running root is never deleted regardless.
|
|
438
|
+
*/
|
|
439
|
+
function withRunningInstall(installs, runningRoot, runningVersion) {
|
|
440
|
+
const runningCanonical = canonicalPath(runningRoot);
|
|
441
|
+
const already = installs.some((install) => canonicalPath(install.packageRoot) === runningCanonical);
|
|
442
|
+
if (already)
|
|
443
|
+
return installs;
|
|
444
|
+
return [...installs, {
|
|
445
|
+
packageRoot: runningRoot,
|
|
446
|
+
version: runningVersion,
|
|
447
|
+
// Unknown for a synthetic entry — classify only uses version for the
|
|
448
|
+
// fixed-peer check; the running root is never deleted regardless.
|
|
449
|
+
atomicHelperInstall: true,
|
|
450
|
+
}];
|
|
451
|
+
}
|
|
452
|
+
/**
|
|
453
|
+
* The exact shell command that removes the install at `packageRoot` by hand —
|
|
454
|
+
* the remedy for duplicates `doctor --fix` deliberately will not purge
|
|
455
|
+
* (RUSH-2705). `--prefix` pins the target tree no matter which npm binary
|
|
456
|
+
* PATH resolves, mirroring installPackageIntoPrefix.
|
|
457
|
+
*/
|
|
458
|
+
export function manualUninstallCommand(packageRoot) {
|
|
459
|
+
const resolved = path.resolve(packageRoot);
|
|
460
|
+
if (detectPackageManager(resolved) === 'bun') {
|
|
461
|
+
return `bun remove -g ${NPM_PACKAGE_NAME}`;
|
|
462
|
+
}
|
|
463
|
+
try {
|
|
464
|
+
return `npm uninstall -g --prefix '${deriveGlobalPrefix(resolved)}' ${NPM_PACKAGE_NAME}`;
|
|
465
|
+
}
|
|
466
|
+
catch {
|
|
467
|
+
// Not inside a node_modules tree — no npm prefix owns it; deleting the
|
|
468
|
+
// directory is the only removal there is.
|
|
469
|
+
return `rm -rf '${resolved}'`;
|
|
470
|
+
}
|
|
471
|
+
}
|
|
418
472
|
export function buildMultiInstallInventory(runningRoot, runningVersion, installs) {
|
|
473
|
+
const runningCanonical = canonicalPath(runningRoot);
|
|
474
|
+
const removableRoots = new Set(classifyRemovableAgentsCliInstalls(runningRoot, withRunningInstall(installs, runningRoot, runningVersion)).map((candidate) => candidate.packageRoot));
|
|
419
475
|
const byRoot = new Map();
|
|
420
|
-
byRoot.set(runningRoot, {
|
|
476
|
+
byRoot.set(runningRoot, {
|
|
477
|
+
packageRoot: runningRoot,
|
|
478
|
+
version: runningVersion,
|
|
479
|
+
note: 'running',
|
|
480
|
+
running: true,
|
|
481
|
+
autoPurgeable: false,
|
|
482
|
+
});
|
|
421
483
|
for (const install of installs) {
|
|
422
|
-
const
|
|
484
|
+
const running = canonicalPath(install.packageRoot) === runningCanonical;
|
|
485
|
+
const notes = [running
|
|
423
486
|
? 'running'
|
|
424
487
|
: install.binPath
|
|
425
488
|
? `agents on PATH: ${install.binPath}`
|
|
@@ -430,6 +493,8 @@ export function buildMultiInstallInventory(runningRoot, runningVersion, installs
|
|
|
430
493
|
packageRoot: install.packageRoot,
|
|
431
494
|
version: install.version,
|
|
432
495
|
note: notes.join('; '),
|
|
496
|
+
running,
|
|
497
|
+
autoPurgeable: !running && removableRoots.has(canonicalPath(install.packageRoot)),
|
|
433
498
|
});
|
|
434
499
|
}
|
|
435
500
|
return [...byRoot.values()];
|
|
@@ -588,38 +653,26 @@ export function purgeRemovableAgentsCliInstalls(candidates, opts = {}) {
|
|
|
588
653
|
*/
|
|
589
654
|
export function remediateStaleAgentsCliInstalls(opts) {
|
|
590
655
|
const pathEnv = opts.pathEnv ?? (process.env.PATH || '');
|
|
591
|
-
|
|
656
|
+
let installs = findAgentsCliInstalls(pathEnv, opts.findOpts);
|
|
592
657
|
// Ensure the running root participates in "has a fixed peer" even when the
|
|
593
658
|
// PATH scan missed it (source tree, unusual layout).
|
|
594
659
|
if (opts.runningVersion) {
|
|
595
|
-
|
|
596
|
-
try {
|
|
597
|
-
return fs.realpathSync(i.packageRoot) === fs.realpathSync(opts.runningRoot);
|
|
598
|
-
}
|
|
599
|
-
catch {
|
|
600
|
-
return i.packageRoot === opts.runningRoot;
|
|
601
|
-
}
|
|
602
|
-
});
|
|
603
|
-
if (!already) {
|
|
604
|
-
installs.push({
|
|
605
|
-
packageRoot: opts.runningRoot,
|
|
606
|
-
version: opts.runningVersion,
|
|
607
|
-
// Unknown for a synthetic entry — classify only uses version for the
|
|
608
|
-
// fixed-peer check; the running root is never deleted regardless.
|
|
609
|
-
atomicHelperInstall: true,
|
|
610
|
-
});
|
|
611
|
-
}
|
|
660
|
+
installs = withRunningInstall(installs, opts.runningRoot, opts.runningVersion);
|
|
612
661
|
}
|
|
613
662
|
const candidates = classifyRemovableAgentsCliInstalls(opts.runningRoot, installs);
|
|
614
663
|
const purge = purgeRemovableAgentsCliInstalls(candidates, {
|
|
615
664
|
dryRun: opts.dryRun,
|
|
616
665
|
runningRoot: opts.runningRoot,
|
|
617
666
|
});
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
667
|
+
const inventory = buildMultiInstallInventory(opts.runningRoot, opts.runningVersion ?? 'unknown', installs);
|
|
668
|
+
const unresolved = inventory
|
|
669
|
+
.filter((entry) => !entry.running && !entry.autoPurgeable)
|
|
670
|
+
.map((entry) => ({
|
|
671
|
+
packageRoot: entry.packageRoot,
|
|
672
|
+
version: entry.version,
|
|
673
|
+
manualRemoveCommand: manualUninstallCommand(entry.packageRoot),
|
|
674
|
+
}));
|
|
675
|
+
return { ...purge, candidates, inventory, unresolved };
|
|
623
676
|
}
|
|
624
677
|
function childDirectories(parent) {
|
|
625
678
|
try {
|
|
@@ -77,7 +77,7 @@ export declare function spawnDetached(command: string, args: string[], stdio?: S
|
|
|
77
77
|
/**
|
|
78
78
|
* Default run dispatcher: re-invoke `agents run` with a server-minted id so the
|
|
79
79
|
* run is addressable, detached so it outlives this request (and the anchor
|
|
80
|
-
* process). Local runs detach here; `--
|
|
80
|
+
* process). Local runs detach here; `--device` runs detach on the executor via
|
|
81
81
|
* the existing dispatch path.
|
|
82
82
|
*/
|
|
83
83
|
export declare const defaultRunner: RunDispatcher;
|
|
@@ -2,7 +2,7 @@ import { createServer } from 'http';
|
|
|
2
2
|
import fs from 'fs';
|
|
3
3
|
import { spawn } from 'child_process';
|
|
4
4
|
import { randomUUID, randomBytes } from 'crypto';
|
|
5
|
-
import { getAgentsInvocation } from '../daemon.js';
|
|
5
|
+
import { getAgentsInvocation } from '../daemon/daemon.js';
|
|
6
6
|
import { handleServeGet, resolveServeContext } from './server.js';
|
|
7
7
|
import { verifyControlToken } from './token.js';
|
|
8
8
|
import { readNewEvents, streamDir, streamLogPath } from './stream.js';
|
|
@@ -127,7 +127,7 @@ export function spawnDetached(command, args, stdio = 'ignore') {
|
|
|
127
127
|
/**
|
|
128
128
|
* Default run dispatcher: re-invoke `agents run` with a server-minted id so the
|
|
129
129
|
* run is addressable, detached so it outlives this request (and the anchor
|
|
130
|
-
* process). Local runs detach here; `--
|
|
130
|
+
* process). Local runs detach here; `--device` runs detach on the executor via
|
|
131
131
|
* the existing dispatch path.
|
|
132
132
|
*/
|
|
133
133
|
export const defaultRunner = async (req) => {
|
|
@@ -144,7 +144,7 @@ export const defaultRunner = async (req) => {
|
|
|
144
144
|
if (req.mode)
|
|
145
145
|
argv.push('--mode', req.mode);
|
|
146
146
|
if (req.host)
|
|
147
|
-
argv.push('--
|
|
147
|
+
argv.push('--device', req.host);
|
|
148
148
|
if (req.cwd)
|
|
149
149
|
argv.push('--cwd', req.cwd);
|
|
150
150
|
const inv = getAgentsInvocation(argv);
|
|
@@ -152,7 +152,7 @@ export const defaultRunner = async (req) => {
|
|
|
152
152
|
// unhandled 'error' that crashes the anchor for every other session.
|
|
153
153
|
//
|
|
154
154
|
// For an anchor-local run, capture the `--json` NDJSON to a per-session file
|
|
155
|
-
// so `GET /api/session/:id/stream` can offset-tail it. A `--
|
|
155
|
+
// so `GET /api/session/:id/stream` can offset-tail it. A `--device` run emits
|
|
156
156
|
// its NDJSON on the remote box (streaming that reuses pullRemoteLogDelta — a
|
|
157
157
|
// follow-up), so we don't capture the local dispatcher's output.
|
|
158
158
|
if (req.host) {
|
package/dist/lib/serve/data.d.ts
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import { AgentManager } from '../teams/agents.js';
|
|
17
17
|
import type { AgentStatusSummary } from '../teams/api.js';
|
|
18
|
-
import type { JobConfig } from '../routines.js';
|
|
18
|
+
import type { JobConfig } from '../scheduling/routines.js';
|
|
19
19
|
import type { CloudTask } from '../cloud/types.js';
|
|
20
20
|
/** One teammate's worktree and its current uncommitted diff. */
|
|
21
21
|
export interface WorktreeDiff {
|