@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
|
@@ -1,15 +1,67 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import { password } from '@inquirer/prompts';
|
|
3
3
|
import { setHelpSections } from '../lib/help.js';
|
|
4
|
-
import { updateMeta } from '../lib/state.js';
|
|
5
|
-
import { ALL_AGENT_IDS } from '../lib/agents.js';
|
|
4
|
+
import { readMeta, updateMeta } from '../lib/state.js';
|
|
5
|
+
import { ALL_AGENT_IDS, getAccountInfo, resolveAgentName } from '../lib/agents.js';
|
|
6
|
+
import { getVersionHomePath, listInstalledVersions } from '../lib/installations/versions.js';
|
|
7
|
+
import { nativeAccountCapability, nativeAccountNameable, nativeIdentityKey } from '../lib/account-capabilities.js';
|
|
8
|
+
import { profileExists, readProfile } from '../lib/profiles.js';
|
|
6
9
|
import { pushBundleToHost } from '../lib/secrets/push.js';
|
|
10
|
+
import { assertCredentialTransportHostPinned, resolveHostSshTarget } from '../lib/secrets/remote.js';
|
|
7
11
|
import { resolveRemoteOsSync } from '../lib/hosts/remote-os.js';
|
|
8
12
|
import { runDevicesAccounts } from './ssh.js';
|
|
9
13
|
import { discoverNativeAccounts } from '../lib/account-catalog.js';
|
|
10
14
|
import { readAndResolveBundleEnv } from '../lib/secrets/bundles.js';
|
|
11
15
|
import { getAccountProvider, listAccountProviders } from '../lib/account-provider-registry.js';
|
|
12
|
-
import { addAccount, findAccount, inspectAccount, readAccountRegistry, removeAccount, renameAccount, setAccountSecret } from '../lib/account-registry.js';
|
|
16
|
+
import { accountBindings, addAccount, addNativeAccount, bindAccount, findAccount, findUnifiedAccount, inspectAccount, listNativeAccounts, readAccountRegistry, removeAccount, renameAccount, setAccountSecret, unbindAccount } from '../lib/account-registry.js';
|
|
17
|
+
function parseInstallation(raw) {
|
|
18
|
+
const at = raw.lastIndexOf('@');
|
|
19
|
+
if (at < 1 || at === raw.length - 1)
|
|
20
|
+
throw new Error(`Expected <agent>@<version>, got '${raw}'.`);
|
|
21
|
+
const agent = resolveAgentName(raw.slice(0, at));
|
|
22
|
+
if (!agent)
|
|
23
|
+
throw new Error(`Unknown agent '${raw.slice(0, at)}'.`);
|
|
24
|
+
return { agent, version: raw.slice(at + 1) };
|
|
25
|
+
}
|
|
26
|
+
async function nativeIdentityFromSource(raw) {
|
|
27
|
+
const parsed = parseInstallation(raw);
|
|
28
|
+
const capability = nativeAccountCapability(parsed.agent);
|
|
29
|
+
if (!nativeAccountNameable(parsed.agent)) {
|
|
30
|
+
throw new Error(`${parsed.agent} native accounts are ${capability.status}; agents-cli cannot safely name or attach this login.`);
|
|
31
|
+
}
|
|
32
|
+
if (!listInstalledVersions(parsed.agent).includes(parsed.version))
|
|
33
|
+
throw new Error(`${raw} is not installed.`);
|
|
34
|
+
const info = await getAccountInfo(parsed.agent, getVersionHomePath(parsed.agent, parsed.version));
|
|
35
|
+
const identityKey = nativeIdentityKey(info, capability);
|
|
36
|
+
if (!identityKey)
|
|
37
|
+
throw new Error(`${raw} has no stable signed-in identity. Run it and complete its normal login first.`);
|
|
38
|
+
return { agent: parsed.agent, version: parsed.version, identityKey, identityLabel: info.email ?? undefined, scope: capability.scope };
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Classify + validate an attach target, rejecting a typo BEFORE any binding is
|
|
42
|
+
* written: it must be an existing custom-harness profile, an installed
|
|
43
|
+
* `agent@version`, or a known harness id.
|
|
44
|
+
*/
|
|
45
|
+
export function classifyAttachTarget(target) {
|
|
46
|
+
if (profileExists(target))
|
|
47
|
+
return { kind: 'profile', profile: readProfile(target) };
|
|
48
|
+
if (target.includes('@')) {
|
|
49
|
+
const at = target.lastIndexOf('@');
|
|
50
|
+
const agent = resolveAgentName(target.slice(0, at));
|
|
51
|
+
const version = target.slice(at + 1);
|
|
52
|
+
if (!agent)
|
|
53
|
+
throw new Error(`Unknown harness '${target.slice(0, at)}' in target '${target}'.`);
|
|
54
|
+
if (!version)
|
|
55
|
+
throw new Error(`Target '${target}' is missing a version.`);
|
|
56
|
+
if (!listInstalledVersions(agent).includes(version))
|
|
57
|
+
throw new Error(`${agent}@${version} is not installed.`);
|
|
58
|
+
return { kind: 'installation', agent, version };
|
|
59
|
+
}
|
|
60
|
+
const agent = resolveAgentName(target);
|
|
61
|
+
if (agent)
|
|
62
|
+
return { kind: 'device-agent', agent };
|
|
63
|
+
throw new Error(`Unknown attach target '${target}'. Expected an installed <agent>@<version>, a harness id, or an existing custom harness profile.`);
|
|
64
|
+
}
|
|
13
65
|
export function parseBundleKey(raw) {
|
|
14
66
|
const colon = raw.indexOf(':');
|
|
15
67
|
if (colon < 1 || colon === raw.length - 1)
|
|
@@ -27,7 +79,12 @@ async function printAccounts(json, fleet = false) {
|
|
|
27
79
|
if (fleet)
|
|
28
80
|
return runDevicesAccounts({ json });
|
|
29
81
|
const records = Object.values(readAccountRegistry().accounts).sort((a, b) => a.name.localeCompare(b.name));
|
|
30
|
-
const
|
|
82
|
+
const discovered = await discoverNativeAccounts();
|
|
83
|
+
const savedNative = listNativeAccounts(readMeta());
|
|
84
|
+
const native = discovered.map(row => {
|
|
85
|
+
const saved = savedNative.find(account => account.agent === row.agent && account.identityKey === row.id);
|
|
86
|
+
return { ...row, name: saved?.name, id: saved?.id ?? row.id };
|
|
87
|
+
});
|
|
31
88
|
if (json) {
|
|
32
89
|
console.log(JSON.stringify([...records.map(account => publicAccount(inspectAccount(account.name))), ...native], null, 2));
|
|
33
90
|
return;
|
|
@@ -43,7 +100,7 @@ async function printAccounts(json, fleet = false) {
|
|
|
43
100
|
if (!native.length)
|
|
44
101
|
console.log(chalk.gray(' No signed-in native accounts found.'));
|
|
45
102
|
for (const account of native)
|
|
46
|
-
console.log(` ${chalk.cyan(account.
|
|
103
|
+
console.log(` ${account.name ? `${chalk.cyan(account.name)} · ` : ''}${account.display} ${account.agent} ${account.versions.join(', ')}`);
|
|
47
104
|
}
|
|
48
105
|
function parseAuth(raw) {
|
|
49
106
|
if (raw === 'api-key' || raw === 'setup-token' || raw === 'bearer-token')
|
|
@@ -78,22 +135,87 @@ export function registerAccountsCommand(program) {
|
|
|
78
135
|
.action(async (name, o) => {
|
|
79
136
|
const account = findAccount(name);
|
|
80
137
|
if (!account)
|
|
81
|
-
throw new Error(`Unknown account '${name}'.`);
|
|
138
|
+
throw new Error(`Unknown provider account '${name}'.`);
|
|
82
139
|
const secret = o.fromSecrets ? secretFromBundle(o.fromSecrets) : await password({ message: `Enter new ${account.provider} ${account.auth} for '${name}':` });
|
|
83
140
|
setAccountSecret(name, secret);
|
|
84
141
|
console.log(chalk.green(`Updated credential for account '${name}'.`));
|
|
85
142
|
});
|
|
86
|
-
accounts.command('
|
|
87
|
-
const
|
|
143
|
+
accounts.command('view <name>').alias('inspect').description('Show safe account metadata, custody, and attachments').option('--json', 'Machine-readable output').action((name, o, command) => {
|
|
144
|
+
const meta = readMeta();
|
|
145
|
+
const unified = findUnifiedAccount(name, meta);
|
|
146
|
+
if (!unified)
|
|
147
|
+
throw new Error(`Unknown account '${name}'.`);
|
|
148
|
+
const account = unified.kind === 'provider'
|
|
149
|
+
? { ...publicAccount(inspectAccount(unified.name)), custody: 'agents secrets (policy never)', attached: accountBindings(unified.id, meta) }
|
|
150
|
+
: { ...unified, custody: `${unified.agent} (not stored by agents-cli)`, attached: accountBindings(unified.id, meta) };
|
|
88
151
|
if (o.json || command.optsWithGlobals().json)
|
|
89
152
|
return console.log(JSON.stringify(account, null, 2));
|
|
90
|
-
console.log(
|
|
91
|
-
console.log(`
|
|
153
|
+
console.log(chalk.bold(account.name));
|
|
154
|
+
console.log(` kind: ${account.kind}`);
|
|
92
155
|
console.log(` id: ${account.id}`);
|
|
93
|
-
console.log(`
|
|
94
|
-
if (account.
|
|
95
|
-
console.log(`
|
|
96
|
-
|
|
156
|
+
console.log(` custody: ${account.custody}`);
|
|
157
|
+
if (account.kind === 'provider') {
|
|
158
|
+
console.log(` provider: ${account.provider}`);
|
|
159
|
+
console.log(` auth: ${account.auth}`);
|
|
160
|
+
console.log(` credential: ${account.secretPresent ? 'present on this device' : 'missing on this device'}`);
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
console.log(` identity: ${account.identityLabel ?? account.identityKey}`);
|
|
164
|
+
console.log(` scope: ${account.scope}`);
|
|
165
|
+
}
|
|
166
|
+
console.log(` attached: ${account.attached.length ? account.attached.join(', ') : 'none'}`);
|
|
167
|
+
});
|
|
168
|
+
accounts.command('name <source> <name>')
|
|
169
|
+
.description('Name a signed-in native installation without copying its OAuth credentials')
|
|
170
|
+
.action(async (source, name) => {
|
|
171
|
+
const identity = await nativeIdentityFromSource(source);
|
|
172
|
+
const account = addNativeAccount(name, identity.agent, identity.identityKey, identity.identityLabel, identity.scope);
|
|
173
|
+
console.log(chalk.green(`Named ${source} as ${account.name}.`));
|
|
174
|
+
if (account.scope === 'device')
|
|
175
|
+
console.log(chalk.gray(`${identity.agent} authentication is device-scoped; attach '${account.name}' to '${identity.agent}', not an individual version.`));
|
|
176
|
+
});
|
|
177
|
+
accounts.command('attach <account> <target>')
|
|
178
|
+
.description('Attach a named account to a native installation or custom harness')
|
|
179
|
+
.action(async (name, target) => {
|
|
180
|
+
const meta = readMeta();
|
|
181
|
+
const account = findUnifiedAccount(name, meta);
|
|
182
|
+
if (!account)
|
|
183
|
+
throw new Error(`Unknown account '${name}'.`);
|
|
184
|
+
// Validate the target exists before mutating any binding.
|
|
185
|
+
const t = classifyAttachTarget(target);
|
|
186
|
+
const targetAgent = t.kind === 'profile' ? t.profile.host.agent : t.agent;
|
|
187
|
+
if (account.kind === 'native') {
|
|
188
|
+
// A provider-backed profile injects provider env at spawn, which would run
|
|
189
|
+
// under a different credential than the native identity claims — refuse it.
|
|
190
|
+
if (t.kind === 'profile' && t.profile.provider) {
|
|
191
|
+
throw new Error(`Custom harness '${target}' is provider-backed (${t.profile.provider}); it cannot host the native login account '${account.name}'. Attach a matching provider account instead.`);
|
|
192
|
+
}
|
|
193
|
+
if (targetAgent !== account.agent)
|
|
194
|
+
throw new Error(`Account '${account.name}' is a ${account.agent} login; '${target}' runs ${targetAgent}.`);
|
|
195
|
+
if (account.scope === 'device') {
|
|
196
|
+
if (t.kind !== 'device-agent')
|
|
197
|
+
throw new Error(`${account.agent} authentication is device-scoped. Attach it with 'agents accounts attach ${account.name} ${account.agent}'.`);
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
if (t.kind !== 'installation')
|
|
201
|
+
throw new Error(`${account.agent} authentication is per-version. Attach '${account.name}' to a specific ${account.agent}@<version>.`);
|
|
202
|
+
const identity = await nativeIdentityFromSource(target);
|
|
203
|
+
if (identity.identityKey !== account.identityKey)
|
|
204
|
+
throw new Error(`'${target}' is signed in to a different identity than account '${account.name}'.`);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
// Provider account: it must be able to authenticate the target's harness.
|
|
209
|
+
getAccountProvider(account.provider).envFor(targetAgent, account.auth);
|
|
210
|
+
}
|
|
211
|
+
bindAccount(name, target);
|
|
212
|
+
console.log(chalk.green(`Attached ${account.name} to ${target}.`));
|
|
213
|
+
});
|
|
214
|
+
accounts.command('detach <account> <target>')
|
|
215
|
+
.description('Remove one account attachment')
|
|
216
|
+
.action((name, target) => {
|
|
217
|
+
unbindAccount(name, target);
|
|
218
|
+
console.log(chalk.green(`Detached ${name} from ${target}.`));
|
|
97
219
|
});
|
|
98
220
|
accounts.command('rename <old> <new>').description('Rename an account without changing its stable id').action((oldName, newName) => renameAccount(oldName, newName));
|
|
99
221
|
accounts.command('remove <name>').description('Remove an account and its device-local credential').action((name) => removeAccount(name));
|
|
@@ -124,22 +246,58 @@ export function registerAccountsCommand(program) {
|
|
|
124
246
|
});
|
|
125
247
|
console.log(chalk.green(`Cleared the default account for ${agentRaw}.`));
|
|
126
248
|
});
|
|
127
|
-
accounts.command('
|
|
249
|
+
accounts.command('logout <target>')
|
|
250
|
+
.description('Sign out a harness-native OAuth login. API-key / setup-token / bearer accounts use `accounts remove` instead.')
|
|
251
|
+
.action(async (target) => {
|
|
252
|
+
const provider = findAccount(target);
|
|
253
|
+
if (provider) {
|
|
254
|
+
throw new Error(`Account '${provider.name}' uses ${provider.auth}, not OAuth. Remove it with: agents accounts remove ${provider.name}`);
|
|
255
|
+
}
|
|
256
|
+
const agentRaw = target.split('@')[0];
|
|
257
|
+
if (!ALL_AGENT_IDS.includes(agentRaw)) {
|
|
258
|
+
throw new Error(`Unknown target '${target}'. Pass a native harness (claude, codex, …) or a provider account name. Provider API-key accounts use \`agents accounts remove\`.`);
|
|
259
|
+
}
|
|
260
|
+
const agent = agentRaw;
|
|
261
|
+
const { spawnSync } = await import('child_process');
|
|
262
|
+
const { getBinaryPath, getGlobalDefault, getVersionHomePath, listInstalledVersions } = await import('../lib/installations/versions.js');
|
|
263
|
+
const installed = listInstalledVersions(agent);
|
|
264
|
+
const version = getGlobalDefault(agent) ?? installed[installed.length - 1];
|
|
265
|
+
if (!version)
|
|
266
|
+
throw new Error(`No installed version of ${agent}. Install one with: agents add ${agent}`);
|
|
267
|
+
const bin = getBinaryPath(agent, version);
|
|
268
|
+
const home = getVersionHomePath(agent, version);
|
|
269
|
+
const result = spawnSync(bin, ['logout'], {
|
|
270
|
+
env: { ...process.env, HOME: home },
|
|
271
|
+
stdio: 'inherit',
|
|
272
|
+
});
|
|
273
|
+
if (result.error)
|
|
274
|
+
throw result.error;
|
|
275
|
+
if ((result.status ?? 1) !== 0) {
|
|
276
|
+
throw new Error(`${agent} logout exited ${result.status ?? 'null'}. If this harness has no logout verb, sign out from its own UI.`);
|
|
277
|
+
}
|
|
278
|
+
console.log(chalk.green(`Signed out native ${agent} login (${version}).`));
|
|
279
|
+
});
|
|
280
|
+
accounts.command('sync <name> [device]')
|
|
128
281
|
.description('Copy one provider account bundle to a worker device')
|
|
129
|
-
.
|
|
282
|
+
.option('--device <device>', 'Deprecated destination form; use the positional device')
|
|
130
283
|
.option('--force', 'Replace matching keys on the destination')
|
|
131
|
-
.action((name, o) => {
|
|
284
|
+
.action(async (name, deviceArg, o) => {
|
|
285
|
+
const device = deviceArg ?? o.device;
|
|
286
|
+
if (!device)
|
|
287
|
+
throw new Error('Missing destination device. Usage: agents accounts sync <account> <device>.');
|
|
132
288
|
const account = findAccount(name);
|
|
133
289
|
if (!account)
|
|
134
290
|
throw new Error(`Unknown provider account '${name}'.`);
|
|
135
|
-
const
|
|
291
|
+
const sshTarget = await resolveHostSshTarget(device);
|
|
292
|
+
assertCredentialTransportHostPinned(sshTarget);
|
|
293
|
+
const remoteBackend = resolveRemoteOsSync(device) === 'win32' ? 'keychain' : 'file';
|
|
136
294
|
const literalValues = {
|
|
137
295
|
ACCOUNT_ID: account.id,
|
|
138
296
|
PROVIDER: account.provider,
|
|
139
297
|
AUTH_TYPE: account.auth,
|
|
140
298
|
...(account.baseUrl ? { BASE_URL: account.baseUrl } : {}),
|
|
141
299
|
};
|
|
142
|
-
const result = pushBundleToHost(account.name,
|
|
300
|
+
const result = pushBundleToHost(account.name, device, {
|
|
143
301
|
remoteBackend,
|
|
144
302
|
force: o.force,
|
|
145
303
|
operation: 'accounts sync',
|
|
@@ -148,17 +306,20 @@ export function registerAccountsCommand(program) {
|
|
|
148
306
|
literalValues,
|
|
149
307
|
});
|
|
150
308
|
if (!result.ok)
|
|
151
|
-
throw new Error(`${result.message}\nRetry: agents accounts sync ${account.name}
|
|
152
|
-
console.log(chalk.green(`${account.name} synced to ${
|
|
309
|
+
throw new Error(`${result.message}\nRetry: agents accounts sync ${account.name} ${device}${o.force ? ' --force' : ''}`);
|
|
310
|
+
console.log(chalk.green(`${account.name} synced to ${device} (${result.keyCount} keys, ${remoteBackend} backend, policy never).`));
|
|
153
311
|
});
|
|
154
312
|
setHelpSections(accounts, {
|
|
155
313
|
examples: `agents accounts add work --provider anthropic --auth setup-token
|
|
156
314
|
agents accounts add openrouter-work --provider openrouter --auth api-key --from-secrets openrouter.ai:OPENROUTER_API_KEY
|
|
157
315
|
agents accounts set-key work
|
|
158
|
-
agents accounts
|
|
316
|
+
agents accounts name claude@2.1.220 work
|
|
317
|
+
agents accounts attach work claude@2.1.225
|
|
318
|
+
agents accounts view work --json
|
|
159
319
|
agents accounts set-default claude work
|
|
160
|
-
agents accounts sync work
|
|
161
|
-
agents run claude --account work
|
|
162
|
-
|
|
320
|
+
agents accounts sync openrouter-work yosemite-s0
|
|
321
|
+
agents run claude --account work
|
|
322
|
+
agents accounts logout claude`,
|
|
323
|
+
notes: 'Native account records contain metadata only; harness-owned OAuth credentials are never copied. Provider accounts are explicit portable bundles with policy never. Harness-native OAuth sign-out is `agents accounts logout <harness>` (API-key accounts use `accounts remove`). Synced vault unlock is `agents secrets vault unlock`.',
|
|
163
324
|
});
|
|
164
325
|
}
|
package/dist/commands/apply.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `agents apply` (alias `ag apply`) — reconcile the whole fleet to a declared
|
|
3
|
-
* profile in one command: install agents-cli + agents
|
|
4
|
-
*
|
|
5
|
-
*
|
|
3
|
+
* profile in one command: install agents-cli + agents and sync config. Native
|
|
4
|
+
* harness logins remain device-local; portable provider credentials move only
|
|
5
|
+
* through explicit `agents accounts sync`.
|
|
6
6
|
*
|
|
7
7
|
* The manifest is the `fleet:` block of any `-f` file (default `agents.yaml`).
|
|
8
8
|
*/
|
package/dist/commands/apply.js
CHANGED
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `agents apply` (alias `ag apply`) — reconcile the whole fleet to a declared
|
|
3
|
-
* profile in one command: install agents-cli + agents
|
|
4
|
-
*
|
|
5
|
-
*
|
|
3
|
+
* profile in one command: install agents-cli + agents and sync config. Native
|
|
4
|
+
* harness logins remain device-local; portable provider credentials move only
|
|
5
|
+
* through explicit `agents accounts sync`.
|
|
6
6
|
*
|
|
7
7
|
* The manifest is the `fleet:` block of any `-f` file (default `agents.yaml`).
|
|
8
8
|
*/
|
|
9
9
|
import * as fs from 'fs';
|
|
10
|
-
import * as os from 'os';
|
|
11
10
|
import * as path from 'path';
|
|
12
11
|
import { fileURLToPath } from 'url';
|
|
13
|
-
import { Option } from 'commander';
|
|
14
12
|
import chalk from 'chalk';
|
|
15
13
|
import { setHelpSections } from '../lib/help.js';
|
|
16
14
|
import { machineId } from '../lib/session/sync/config.js';
|
|
@@ -18,9 +16,9 @@ import { loadDevices, isControlDevice } from '../lib/devices/registry.js';
|
|
|
18
16
|
import { isHostPinned, managedKnownHostsPath } from '../lib/devices/known-hosts.js';
|
|
19
17
|
import { ensureDevicesRegistered } from '../lib/devices/sync.js';
|
|
20
18
|
import { readFleetFile, resolveDesired } from '../lib/fleet/manifest.js';
|
|
21
|
-
import { snapshotAuth
|
|
19
|
+
import { snapshotAuth } from '../lib/fleet/auth-sync.js';
|
|
22
20
|
import { agentIdOf, diffFleet, probeDevice, runFleetApply, pool, sourceHome, expandAllSpecs, rosterNeedsVersions, } from '../lib/fleet/apply.js';
|
|
23
|
-
import { listInstalledVersions } from '../lib/versions.js';
|
|
21
|
+
import { listInstalledVersions } from '../lib/installations/versions.js';
|
|
24
22
|
/** Version of the running agents-cli — the fleet target version. */
|
|
25
23
|
function localCliVersion() {
|
|
26
24
|
try {
|
|
@@ -32,23 +30,6 @@ function localCliVersion() {
|
|
|
32
30
|
return '';
|
|
33
31
|
}
|
|
34
32
|
}
|
|
35
|
-
async function readStdin() {
|
|
36
|
-
const chunks = [];
|
|
37
|
-
for await (const c of process.stdin)
|
|
38
|
-
chunks.push(c);
|
|
39
|
-
return Buffer.concat(chunks).toString('utf-8');
|
|
40
|
-
}
|
|
41
|
-
/** Hidden path: receive an auth bundle on stdin and materialize it locally. */
|
|
42
|
-
async function runRecvAuth() {
|
|
43
|
-
const raw = await readStdin();
|
|
44
|
-
const bundle = parseAuthBundle(raw);
|
|
45
|
-
const res = materializeAuth(bundle, { home: os.homedir() });
|
|
46
|
-
if (res.errors.length > 0) {
|
|
47
|
-
console.error(`recv-auth: ${res.errors.length} error(s): ${res.errors.join('; ')}`);
|
|
48
|
-
process.exit(1);
|
|
49
|
-
}
|
|
50
|
-
console.log(`recv-auth: wrote login for ${res.written.join(', ') || '(nothing)'}`);
|
|
51
|
-
}
|
|
52
33
|
function confirm(question) {
|
|
53
34
|
return new Promise((resolve) => {
|
|
54
35
|
process.stdout.write(question);
|
|
@@ -64,7 +45,7 @@ function confirm(question) {
|
|
|
64
45
|
const ONLY_KINDS = {
|
|
65
46
|
agents: new Set(['install-cli', 'upgrade-cli', 'add-agent']),
|
|
66
47
|
config: new Set(['sync-config']),
|
|
67
|
-
login: new Set(['
|
|
48
|
+
login: new Set(['needs-login']),
|
|
68
49
|
};
|
|
69
50
|
/** Render the device x dimension matrix (cribbed from `doctor --devices`). */
|
|
70
51
|
function renderPlan(plan) {
|
|
@@ -77,9 +58,8 @@ function renderPlan(plan) {
|
|
|
77
58
|
if (acts.length === 0)
|
|
78
59
|
return chalk.green(`ok ${okLabel}`);
|
|
79
60
|
if (acts.some((a) => a.kind === 'needs-login')) {
|
|
80
|
-
const push = acts.filter((a) => a.kind === 'push-login').length;
|
|
81
61
|
const need = acts.filter((a) => a.kind === 'needs-login').length;
|
|
82
|
-
return chalk.yellow(`${
|
|
62
|
+
return chalk.yellow(`${need} manual`);
|
|
83
63
|
}
|
|
84
64
|
return chalk.cyan('↑ ' + acts.map((a) => a.agent ?? a.kind.replace('-cli', '')).join(','));
|
|
85
65
|
};
|
|
@@ -103,7 +83,7 @@ function renderPlan(plan) {
|
|
|
103
83
|
const configCell = row.probe.reachable
|
|
104
84
|
? (row.actions.some((a) => a.kind === 'sync-config') ? chalk.cyan('↑ sync') : chalk.green('ok'))
|
|
105
85
|
: chalk.gray('-');
|
|
106
|
-
const loginCell = cell(row, ['
|
|
86
|
+
const loginCell = cell(row, ['needs-login'], `${row.desired.agents.length}/${row.desired.agents.length}`);
|
|
107
87
|
const secretsCell = (() => {
|
|
108
88
|
if (!anySecrets)
|
|
109
89
|
return '';
|
|
@@ -131,31 +111,14 @@ function renderPlan(plan) {
|
|
|
131
111
|
if (anySecrets && !rows.some((r) => r.actions.some((a) => a.kind === 'push-secret'))) {
|
|
132
112
|
console.log(chalk.gray(' secrets: not pushed. `--provision-secrets` pushes declared bundles to devices whose host key is pinned.'));
|
|
133
113
|
}
|
|
134
|
-
//
|
|
135
|
-
//
|
|
136
|
-
//
|
|
137
|
-
|
|
138
|
-
const
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
const tag = `${a}@${r.device}`;
|
|
143
|
-
if (!isCredentialSafeToPropagate(a))
|
|
144
|
-
rotating.push(tag);
|
|
145
|
-
else if (r.probe.platform === 'macos' && KEYCHAIN_BOUND_ON_MAC.has(a))
|
|
146
|
-
bound.push(tag);
|
|
147
|
-
else
|
|
148
|
-
noToken.push(tag);
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
if (rotating.length > 0) {
|
|
152
|
-
console.log(chalk.yellow(` manual login needed (single-use rotating refresh token): ${rotating.join(', ')}`));
|
|
153
|
-
}
|
|
154
|
-
if (bound.length > 0) {
|
|
155
|
-
console.log(chalk.yellow(` manual login needed (macOS keychain-bound): ${bound.join(', ')}`));
|
|
156
|
-
}
|
|
157
|
-
if (noToken.length > 0) {
|
|
158
|
-
console.log(chalk.yellow(` manual login needed (no portable token on source): ${noToken.join(', ')}`));
|
|
114
|
+
// `apply` no longer propagates ANY login (SING-1b: a native OAuth / session
|
|
115
|
+
// login is never copied between devices). Every login:sync agent that has a
|
|
116
|
+
// login to establish is surfaced here with the one honest reason + the portable
|
|
117
|
+
// alternative — never a silent skip.
|
|
118
|
+
const needsLogin = [...new Set(rows.flatMap((r) => r.loginBlocked.map((a) => `${a}@${r.device}`)))];
|
|
119
|
+
if (needsLogin.length > 0) {
|
|
120
|
+
console.log(chalk.yellow(` manual login needed — a native OAuth login is never copied between devices (SING-1b); ` +
|
|
121
|
+
`log in on the box itself, or sync a portable provider account (\`agents accounts sync\`): ${needsLogin.join(', ')}`));
|
|
159
122
|
}
|
|
160
123
|
// Secrets bundles are declared once for the fleet; surface the distinct set the
|
|
161
124
|
// gate did NOT push, so a refusal is never silent. "never pushed" used to be
|
|
@@ -260,8 +223,7 @@ async function runApply(opts) {
|
|
|
260
223
|
secretsBundles: manifest.secrets?.bundles,
|
|
261
224
|
provisionSecrets: opts.provisionSecrets === true,
|
|
262
225
|
forceSecrets: opts.force === true,
|
|
263
|
-
//
|
|
264
|
-
// to a host whose key we already pinned.
|
|
226
|
+
// Portable secret values only ever go to a host whose key is already pinned.
|
|
265
227
|
isHostPinned: (device) => isHostPinned(device, managedKnownHostsPath()),
|
|
266
228
|
});
|
|
267
229
|
// --only filter.
|
|
@@ -334,7 +296,7 @@ function reportResults(results) {
|
|
|
334
296
|
*/
|
|
335
297
|
export function configureApplyCommand(cmd) {
|
|
336
298
|
return cmd
|
|
337
|
-
.description('Reconcile the fleet to a declared profile: install agents
|
|
299
|
+
.description('Reconcile the fleet to a declared profile: install agents and sync config.')
|
|
338
300
|
.option('-f, --file <path>', 'Manifest file carrying a fleet: block (default: agents.yaml)')
|
|
339
301
|
.option('--plan', 'Show the reconcile plan and exit (no changes)')
|
|
340
302
|
.option('--dry-run', 'Alias for --plan')
|
|
@@ -342,16 +304,11 @@ export function configureApplyCommand(cmd) {
|
|
|
342
304
|
.option('--device <name>', 'Scope the apply to a single device')
|
|
343
305
|
.option('--agent <specs...>', 'Override the roster for targeted device(s): install these specs instead of the manifest\'s. Use `claude@all` to replicate every version installed on this machine.')
|
|
344
306
|
.option('--only <dims>', 'Limit to dimensions: comma list of agents,config,login')
|
|
345
|
-
.option('--no-login', '
|
|
307
|
+
.option('--no-login', 'Deprecated no-op: native logins are always device-local')
|
|
346
308
|
.option('--provision-secrets', "Push the manifest's declared secrets bundles to each device (OFF by default; moves credential values over SSH, and only to a device whose host key is already pinned)")
|
|
347
309
|
.option('--force', 'With --provision-secrets: re-push a bundle the device already has')
|
|
348
|
-
.addOption(new Option('--recv-auth', 'internal: receive an auth bundle on stdin').hideHelp())
|
|
349
310
|
.action(async (opts) => {
|
|
350
311
|
try {
|
|
351
|
-
if (opts.recvAuth) {
|
|
352
|
-
await runRecvAuth();
|
|
353
|
-
return;
|
|
354
|
-
}
|
|
355
312
|
await runApply(opts);
|
|
356
313
|
}
|
|
357
314
|
catch (e) {
|
|
@@ -367,7 +324,7 @@ export function registerApplyCommand(program) {
|
|
|
367
324
|
# Preview what would change across the fleet
|
|
368
325
|
agents apply --plan -f agents.yaml
|
|
369
326
|
|
|
370
|
-
# Bring every device to the profile (installs
|
|
327
|
+
# Bring every device to the profile (installs + config sync; native login stays local)
|
|
371
328
|
ag apply -f agents.yaml
|
|
372
329
|
|
|
373
330
|
# One device only
|
|
@@ -1,3 +1,18 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
+
import { type BrowserProfile } from '../lib/browser/profiles.js';
|
|
3
|
+
import { listInstalledBrowsers } from '../lib/browser/chrome.js';
|
|
2
4
|
export declare function registerBrowserCommand(program: Command): void;
|
|
3
5
|
export declare function registerBrowserSubcommands(program: Command): void;
|
|
6
|
+
interface BrowserUseOptions {
|
|
7
|
+
unset?: boolean;
|
|
8
|
+
}
|
|
9
|
+
interface BrowserUseChoice {
|
|
10
|
+
name: string;
|
|
11
|
+
value: {
|
|
12
|
+
name: string;
|
|
13
|
+
installed?: ReturnType<typeof listInstalledBrowsers>[number];
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export declare function buildBrowserUseChoices(profiles: BrowserProfile[], installed: ReturnType<typeof listInstalledBrowsers>, current?: string): BrowserUseChoice[];
|
|
17
|
+
export declare function runBrowserUse(name: string | undefined, opts: BrowserUseOptions, interactive?: boolean): Promise<boolean>;
|
|
18
|
+
export {};
|