@phnx-labs/agents-cli 1.22.38 → 1.22.40
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 +302 -0
- package/README.md +111 -70
- package/dist/bin/agents +0 -0
- package/dist/bootstrap.js +46 -27
- package/dist/browser.js +2 -2
- package/dist/cli/command-registry.d.ts +135 -0
- package/dist/cli/command-registry.js +260 -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.js +206 -94
- 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 +47 -4
- 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 +161 -216
- package/dist/commands/factory.js +1 -1
- package/dist/commands/feed.d.ts +2 -2
- package/dist/commands/feed.js +9 -12
- 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 +72 -63
- 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 +13 -0
- package/dist/commands/sessions-picker.js +182 -8
- package/dist/commands/sessions-resume.d.ts +7 -3
- package/dist/commands/sessions-resume.js +81 -33
- package/dist/commands/sessions-stats.js +2 -2
- package/dist/commands/sessions.d.ts +75 -68
- package/dist/commands/sessions.js +142 -180
- 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-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 +318 -48
- 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 +11 -25
- 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 +1 -1
- package/dist/lib/browser/drivers/ssh.d.ts +1 -1
- package/dist/lib/browser/drivers/ssh.js +2 -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 +67 -3
- package/dist/lib/browser/profiles.js +129 -7
- 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 +113 -1
- package/dist/lib/browser/service.js +454 -40
- 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 +18 -0
- 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 +12 -3
- package/dist/lib/config-keys.js +29 -6
- package/dist/lib/config-machine-keys.d.ts +4 -2
- package/dist/lib/config-machine-keys.js +6 -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 +102 -0
- package/dist/lib/daemon-webhooks.js +210 -0
- package/dist/lib/device-config.d.ts +116 -72
- package/dist/lib/device-config.js +366 -132
- 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 +61 -0
- package/dist/lib/devices/pool.js +83 -0
- 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 +8 -5
- package/dist/lib/exec.js +19 -13
- 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} +49 -1
- package/dist/lib/{migrate.js → installations/migrate.js} +265 -38
- 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 +2 -2
- package/dist/lib/observe-aliases.js +2 -11
- 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-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 +241 -62
- 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 +3 -3
- package/dist/lib/secrets/bundles.js +7 -7
- 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 +12 -10
- package/dist/lib/secrets/remote.js +21 -14
- 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/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/share/delete.d.ts +21 -0
- package/dist/lib/share/delete.js +42 -0
- package/dist/lib/share/publish.d.ts +82 -0
- package/dist/lib/share/publish.js +170 -18
- package/dist/lib/share/worker-template.js +172 -9
- package/dist/lib/shims.js +35 -7
- package/dist/lib/smart-launch.d.ts +36 -6
- package/dist/lib/smart-launch.js +65 -8
- 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 +5 -147
- package/dist/lib/startup/command-registry.js +38 -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 +1 -1
- package/dist/lib/triggers/handlers.js +2 -2
- package/dist/lib/triggers/webhook.d.ts +36 -2
- package/dist/lib/triggers/webhook.js +97 -42
- package/dist/lib/types.d.ts +18 -6
- 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/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,28 +1,48 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Credential provisioning for `agents run --
|
|
2
|
+
* Credential provisioning for `agents run --device --copy-creds`.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* persistent host
|
|
6
|
-
*
|
|
7
|
-
*
|
|
4
|
+
* `--copy-creds` USED TO copy each signed-in runtime's native login to a
|
|
5
|
+
* persistent host — the Claude OAuth token (`.claude/.credentials.json`) plus
|
|
6
|
+
* codex/grok/gemini `auth.json`-style files — so the box booted logged-in. Every
|
|
7
|
+
* one of those is a **rotating, interactive OAuth / session credential**, and
|
|
8
|
+
* copying it between devices is forbidden by the fleet-auth contract
|
|
9
|
+
* (`docs/specifications.md` SING-1b, `docs/credential-management.md` invariant 2):
|
|
10
|
+
* a shared refresh token rotates server-side on the next refresh and invalidates
|
|
11
|
+
* every other copy — the "droid collapsed 10 boxes to 1 overnight" failure.
|
|
12
|
+
*
|
|
13
|
+
* So this module no longer serializes native logins at all. It REFUSES the
|
|
14
|
+
* transfer and steers to the portable path — a long-lived, non-rotating provider
|
|
15
|
+
* account (`agents accounts add` / `agents accounts sync`), whose bundle is
|
|
16
|
+
* policy-`never` and safe to reuse on many devices. That sync rides its own
|
|
17
|
+
* hardened SSH transport (RUSH-2527); it never touches this path.
|
|
8
18
|
*/
|
|
9
19
|
import type { AgentId } from '../types.js';
|
|
10
|
-
import {
|
|
20
|
+
import type { DetectedRuntime } from '../crabbox/runtimes.js';
|
|
21
|
+
export { isNativeOAuthRuntime, nativeOAuthTransferRefusal } from '../crabbox/runtimes.js';
|
|
11
22
|
export interface HostCredentials {
|
|
12
23
|
runtimes: AgentId[];
|
|
13
24
|
detected: DetectedRuntime[];
|
|
14
25
|
claudeCredentialsJson?: string | null;
|
|
15
26
|
}
|
|
16
27
|
/**
|
|
17
|
-
* Build the setup
|
|
18
|
-
*
|
|
28
|
+
* Build the setup/teardown scripts for a `--copy-creds` host run.
|
|
29
|
+
*
|
|
30
|
+
* Every runtime `--copy-creds` handles is a native OAuth / session login, so this
|
|
31
|
+
* REFUSES rather than serialize one across the wire (SING-1b) — it throws with the
|
|
32
|
+
* concrete `agents accounts` steer. The refusal happens BEFORE anything is
|
|
33
|
+
* serialized, so a native credential can never reach a remote-write script. An
|
|
34
|
+
* empty runtime set is a no-op (nothing to provision, nothing forbidden).
|
|
19
35
|
*/
|
|
20
36
|
export declare function buildHostCredentialScript(opts: HostCredentials): {
|
|
21
37
|
setup: string;
|
|
22
38
|
teardown: string;
|
|
23
39
|
};
|
|
24
40
|
/**
|
|
25
|
-
* Wrap a remote command
|
|
26
|
-
*
|
|
41
|
+
* Wrap a remote command with credential setup/teardown for a `--copy-creds` run.
|
|
42
|
+
*
|
|
43
|
+
* Delegates to {@link buildHostCredentialScript}, which now refuses to transfer a
|
|
44
|
+
* native OAuth login — so a `--copy-creds` run against a signed-in native runtime
|
|
45
|
+
* fails loudly here (before dispatch) with the `agents accounts sync` steer,
|
|
46
|
+
* rather than shipping a rotating token to another device.
|
|
27
47
|
*/
|
|
28
48
|
export declare function wrapHostCommandWithCredentials(innerCommand: string, opts: HostCredentials): string;
|
|
@@ -1,37 +1,49 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Credential provisioning for `agents run --
|
|
2
|
+
* Credential provisioning for `agents run --device --copy-creds`.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* persistent host
|
|
6
|
-
*
|
|
7
|
-
*
|
|
4
|
+
* `--copy-creds` USED TO copy each signed-in runtime's native login to a
|
|
5
|
+
* persistent host — the Claude OAuth token (`.claude/.credentials.json`) plus
|
|
6
|
+
* codex/grok/gemini `auth.json`-style files — so the box booted logged-in. Every
|
|
7
|
+
* one of those is a **rotating, interactive OAuth / session credential**, and
|
|
8
|
+
* copying it between devices is forbidden by the fleet-auth contract
|
|
9
|
+
* (`docs/specifications.md` SING-1b, `docs/credential-management.md` invariant 2):
|
|
10
|
+
* a shared refresh token rotates server-side on the next refresh and invalidates
|
|
11
|
+
* every other copy — the "droid collapsed 10 boxes to 1 overnight" failure.
|
|
12
|
+
*
|
|
13
|
+
* So this module no longer serializes native logins at all. It REFUSES the
|
|
14
|
+
* transfer and steers to the portable path — a long-lived, non-rotating provider
|
|
15
|
+
* account (`agents accounts add` / `agents accounts sync`), whose bundle is
|
|
16
|
+
* policy-`never` and safe to reuse on many devices. That sync rides its own
|
|
17
|
+
* hardened SSH transport (RUSH-2527); it never touches this path.
|
|
8
18
|
*/
|
|
9
|
-
import {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
gemini: ['.gemini/google_accounts.json'],
|
|
15
|
-
grok: ['.grok/auth.json'],
|
|
16
|
-
};
|
|
17
|
-
return runtimes.flatMap((id) => pathsById[id] ?? []);
|
|
18
|
-
}
|
|
19
|
+
import { isNativeOAuthRuntime, nativeOAuthTransferRefusal } from '../crabbox/runtimes.js';
|
|
20
|
+
// The native-OAuth predicate + refusal are canonical in `crabbox/runtimes.ts`
|
|
21
|
+
// (next to `LEASE_RUNTIMES`), so `--copy-creds` here and `--lease` there refuse
|
|
22
|
+
// against exactly the same set. Re-export for this module's existing consumers.
|
|
23
|
+
export { isNativeOAuthRuntime, nativeOAuthTransferRefusal } from '../crabbox/runtimes.js';
|
|
19
24
|
/**
|
|
20
|
-
* Build the setup
|
|
21
|
-
*
|
|
25
|
+
* Build the setup/teardown scripts for a `--copy-creds` host run.
|
|
26
|
+
*
|
|
27
|
+
* Every runtime `--copy-creds` handles is a native OAuth / session login, so this
|
|
28
|
+
* REFUSES rather than serialize one across the wire (SING-1b) — it throws with the
|
|
29
|
+
* concrete `agents accounts` steer. The refusal happens BEFORE anything is
|
|
30
|
+
* serialized, so a native credential can never reach a remote-write script. An
|
|
31
|
+
* empty runtime set is a no-op (nothing to provision, nothing forbidden).
|
|
22
32
|
*/
|
|
23
33
|
export function buildHostCredentialScript(opts) {
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
.join('\n');
|
|
30
|
-
return { setup, teardown };
|
|
34
|
+
const native = opts.runtimes.filter(isNativeOAuthRuntime);
|
|
35
|
+
if (native.length > 0) {
|
|
36
|
+
throw new Error(nativeOAuthTransferRefusal(native));
|
|
37
|
+
}
|
|
38
|
+
return { setup: '', teardown: '' };
|
|
31
39
|
}
|
|
32
40
|
/**
|
|
33
|
-
* Wrap a remote command
|
|
34
|
-
*
|
|
41
|
+
* Wrap a remote command with credential setup/teardown for a `--copy-creds` run.
|
|
42
|
+
*
|
|
43
|
+
* Delegates to {@link buildHostCredentialScript}, which now refuses to transfer a
|
|
44
|
+
* native OAuth login — so a `--copy-creds` run against a signed-in native runtime
|
|
45
|
+
* fails loudly here (before dispatch) with the `agents accounts sync` steer,
|
|
46
|
+
* rather than shipping a rotating token to another device.
|
|
35
47
|
*/
|
|
36
48
|
export function wrapHostCommandWithCredentials(innerCommand, opts) {
|
|
37
49
|
const { setup, teardown } = buildHostCredentialScript(opts);
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* remote log and its exit code to a sibling `.exit` file, so progress survives a
|
|
6
6
|
* dropped connection (followed via offset-tail in progress.ts). This is the
|
|
7
7
|
* offload win: the process/thread/file fan-out happens on the host, not the
|
|
8
|
-
* laptop. `agents run` uses it; `agents teams start --watch --
|
|
8
|
+
* laptop. `agents run` uses it; `agents teams start --watch --device` reuses the
|
|
9
9
|
* same core so a remote team supervisor keeps running after you disconnect.
|
|
10
10
|
*/
|
|
11
11
|
import type { Host } from './types.js';
|
|
@@ -221,7 +221,7 @@ export declare function buildInteractiveRunForwardedArgs(opts: InteractiveDispat
|
|
|
221
221
|
* tmux wrapping; the local machine is just the transport.
|
|
222
222
|
*/
|
|
223
223
|
export declare function runInteractiveOnHost(host: Host, opts: InteractiveDispatchOptions): Promise<number>;
|
|
224
|
-
/** Dispatch an `agents run <agent> "<prompt>"` onto a host (the `run --
|
|
224
|
+
/** Dispatch an `agents run <agent> "<prompt>"` onto a host (the `run --device` path). */
|
|
225
225
|
export declare function dispatchToHost(host: Host, opts: DispatchOptions): Promise<DispatchResult>;
|
|
226
226
|
export interface CommandDispatchOptions {
|
|
227
227
|
/** `agents …` args (command name first), already stripped of routing flags. */
|
|
@@ -232,7 +232,7 @@ export interface CommandDispatchOptions {
|
|
|
232
232
|
}
|
|
233
233
|
/**
|
|
234
234
|
* Dispatch an arbitrary long-running `agents <command>` onto a host detached —
|
|
235
|
-
* used for `teams start --watch --
|
|
235
|
+
* used for `teams start --watch --device`, whose supervisor must outlive the SSH
|
|
236
236
|
* connection. Reachability is assumed (the caller has already resolved the host);
|
|
237
237
|
* a launch failure surfaces the remote stderr.
|
|
238
238
|
*/
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* remote log and its exit code to a sibling `.exit` file, so progress survives a
|
|
6
6
|
* dropped connection (followed via offset-tail in progress.ts). This is the
|
|
7
7
|
* offload win: the process/thread/file fan-out happens on the host, not the
|
|
8
|
-
* laptop. `agents run` uses it; `agents teams start --watch --
|
|
8
|
+
* laptop. `agents run` uses it; `agents teams start --watch --device` reuses the
|
|
9
9
|
* same core so a remote team supervisor keeps running after you disconnect.
|
|
10
10
|
*/
|
|
11
11
|
import { randomUUID } from 'crypto';
|
|
@@ -499,7 +499,7 @@ export async function runInteractiveOnHost(host, opts) {
|
|
|
499
499
|
extraSshArgs: hostIdentityArgs(host),
|
|
500
500
|
});
|
|
501
501
|
}
|
|
502
|
-
/** Dispatch an `agents run <agent> "<prompt>"` onto a host (the `run --
|
|
502
|
+
/** Dispatch an `agents run <agent> "<prompt>"` onto a host (the `run --device` path). */
|
|
503
503
|
export async function dispatchToHost(host, opts) {
|
|
504
504
|
const target = sshTargetFor(host);
|
|
505
505
|
// Concrete agent@version pins fail loud before we print "Dispatched" and
|
|
@@ -524,7 +524,7 @@ export async function dispatchToHost(host, opts) {
|
|
|
524
524
|
}
|
|
525
525
|
/**
|
|
526
526
|
* Dispatch an arbitrary long-running `agents <command>` onto a host detached —
|
|
527
|
-
* used for `teams start --watch --
|
|
527
|
+
* used for `teams start --watch --device`, whose supervisor must outlive the SSH
|
|
528
528
|
* connection. Reachability is assumed (the caller has already resolved the host);
|
|
529
529
|
* a launch failure surfaces the remote stderr.
|
|
530
530
|
*/
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Shared `--
|
|
2
|
+
* Shared `--device` option registrar. Every command that can run on a remote device
|
|
3
3
|
* declares the flag through here, so its spelling, help text, and companions
|
|
4
4
|
* (`--remote-cwd`, `--no-tty`, `--any`) stay identical everywhere and show up in
|
|
5
5
|
* each command's `--help`.
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
* The flags are consumed centrally by `maybeRunOnHost` (passthrough.ts) *before*
|
|
8
8
|
* commander parses, so for a real remote run the local action never sees them.
|
|
9
9
|
* Registering them here still matters: it documents the flag and keeps the local
|
|
10
|
-
* fall-through (e.g. `--
|
|
10
|
+
* fall-through (e.g. `--device <this-machine>`) from erroring on an unknown option.
|
|
11
11
|
*/
|
|
12
12
|
import type { Command } from 'commander';
|
|
13
|
-
/** Attach the standard `--
|
|
13
|
+
/** Attach the standard `--device` flag family to a command and return it (chainable). */
|
|
14
14
|
export declare function addHostOption(cmd: Command): Command;
|
package/dist/lib/hosts/option.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Shared `--
|
|
2
|
+
* Shared `--device` option registrar. Every command that can run on a remote device
|
|
3
3
|
* declares the flag through here, so its spelling, help text, and companions
|
|
4
4
|
* (`--remote-cwd`, `--no-tty`, `--any`) stay identical everywhere and show up in
|
|
5
5
|
* each command's `--help`.
|
|
@@ -7,14 +7,13 @@
|
|
|
7
7
|
* The flags are consumed centrally by `maybeRunOnHost` (passthrough.ts) *before*
|
|
8
8
|
* commander parses, so for a real remote run the local action never sees them.
|
|
9
9
|
* Registering them here still matters: it documents the flag and keeps the local
|
|
10
|
-
* fall-through (e.g. `--
|
|
10
|
+
* fall-through (e.g. `--device <this-machine>`) from erroring on an unknown option.
|
|
11
11
|
*/
|
|
12
|
-
/** Attach the standard `--
|
|
12
|
+
/** Attach the standard `--device` flag family to a command and return it (chainable). */
|
|
13
13
|
export function addHostOption(cmd) {
|
|
14
14
|
return cmd
|
|
15
|
-
.option('-
|
|
16
|
-
.option('--
|
|
17
|
-
.option('--
|
|
18
|
-
.option('--
|
|
19
|
-
.option('--any', 'With --host <cap> (a capability tag), pick any matching host instead of erroring when several match.');
|
|
15
|
+
.option('-D, --device <name>', 'Run this command on another machine over SSH instead of locally — a registered device, user@host, or `all` to fan out across every registered device. See `agents devices` / `agents hosts`.')
|
|
16
|
+
.option('--remote-cwd <dir>', "Working directory on the device for --device runs. Resolves on the REMOTE device — pass a '$HOME'-relative path (single-quoted so your local shell doesn't expand it) or a valid remote absolute path; a local ~ expands here and won't exist there (/Users/you vs /home/you). No effect on 'teams add'.")
|
|
17
|
+
.option('--no-tty', 'Force non-interactive output for --device runs even from a terminal.')
|
|
18
|
+
.option('--any', 'With --device <cap> (a capability tag), pick any matching device instead of erroring when several match.');
|
|
20
19
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Generic `--
|
|
2
|
+
* Generic `--device` passthrough — the single choke point that runs an allowlisted
|
|
3
3
|
* `agents <command>` on a remote host instead of locally. Called once from
|
|
4
4
|
* `index.ts` before commander parses; returns `true` when it handled the
|
|
5
5
|
* invocation (the local command must then NOT run).
|
|
@@ -10,10 +10,10 @@
|
|
|
10
10
|
* long-running case — `teams start --watch` — dispatches detached so the remote
|
|
11
11
|
* supervisor outlives a dropped connection.
|
|
12
12
|
*
|
|
13
|
-
* Commands with their own richer `--
|
|
13
|
+
* Commands with their own richer `--device` handling (`run`/`sessions`/`feed`/
|
|
14
14
|
* `computer`/`secrets`/`logs`/…) are listed in {@link OWN_HOST_COMMANDS} and
|
|
15
15
|
* fall through to their local actions. Everything else either routes via this
|
|
16
|
-
* table or, when `--
|
|
16
|
+
* table or, when `--device` is present, exits with a clear
|
|
17
17
|
* "not supported" message — never commander's raw `unknown option`.
|
|
18
18
|
*/
|
|
19
19
|
import { type Host } from './types.js';
|
|
@@ -28,7 +28,7 @@ interface RemoteSpec {
|
|
|
28
28
|
}
|
|
29
29
|
/**
|
|
30
30
|
* First-class groups that run transparently on a remote via SSH when
|
|
31
|
-
* `--
|
|
31
|
+
* `--device` is present. Keep both canonical names and aliases
|
|
32
32
|
* (`repo`/`repos`, `exec`/`run`) so either argv form routes the same way.
|
|
33
33
|
*
|
|
34
34
|
* Prefer adding here over per-command SSH code — this is the single choke point.
|
|
@@ -43,7 +43,7 @@ interface RemoteSpec {
|
|
|
43
43
|
*/
|
|
44
44
|
export declare const REMOTE_PASSTHROUGH: Record<string, RemoteSpec>;
|
|
45
45
|
/**
|
|
46
|
-
* Commands that register and interpret `--
|
|
46
|
+
* Commands that register and interpret `--device` themselves — must
|
|
47
47
|
* fall through to local commander even when the flag is present. Do not add
|
|
48
48
|
* these to {@link REMOTE_PASSTHROUGH}.
|
|
49
49
|
*/
|
|
@@ -71,34 +71,34 @@ export declare function markFleetRemote(cmd: string[], device: DeviceProfile): s
|
|
|
71
71
|
/** Run `agents <command> …` across every registered device and render the roster. */
|
|
72
72
|
export declare function runFleetPassthrough(command: string, allArgs: string[], spec: RemoteSpec, opts?: FleetPassthroughOptions): Promise<boolean>;
|
|
73
73
|
/**
|
|
74
|
-
* Route `agents <command> … --
|
|
75
|
-
*
|
|
76
|
-
* `false` (run locally) when
|
|
77
|
-
*
|
|
78
|
-
* local action. Returns `true` after printing a clear
|
|
79
|
-
* present on a command that is neither routable nor
|
|
80
|
-
* never sees commander's raw `unknown option
|
|
74
|
+
* Route `agents <command> … --device <name>` to a remote if the command is
|
|
75
|
+
* device-routable and `--device` (or a fleet sentinel `--hosts`/`--devices`) was
|
|
76
|
+
* given. Returns `false` (run locally) when no routing flag is present, the
|
|
77
|
+
* command owns its own device handling, the target is this very machine, or
|
|
78
|
+
* placement flags need the local action. Returns `true` after printing a clear
|
|
79
|
+
* error when the flag is present on a command that is neither routable nor
|
|
80
|
+
* self-handling — so the user never sees commander's raw `unknown option`.
|
|
81
81
|
*
|
|
82
82
|
* @param command the resolved subcommand name (`process.argv`'s first non-flag).
|
|
83
83
|
* @param allArgs `process.argv.slice(2)` — the command name followed by its args.
|
|
84
84
|
*/
|
|
85
85
|
export declare function maybeRunOnHost(command: string, allArgs: string[], opts?: FleetPassthroughOptions): Promise<boolean>;
|
|
86
86
|
/**
|
|
87
|
-
* `--
|
|
87
|
+
* `--device` passthrough for a **standalone binary** whose command name is fixed by
|
|
88
88
|
* the binary itself (the `browser`/`computer` bins, `dist/browser.js` etc.) rather
|
|
89
89
|
* than being the first argv token.
|
|
90
90
|
*
|
|
91
|
-
* `agents browser … --
|
|
91
|
+
* `agents browser … --device <box>` routes through {@link maybeRunOnHost} in
|
|
92
92
|
* index.ts, but the standalone `browser` binary never enters index.ts — so without
|
|
93
|
-
* this it dropped `--
|
|
94
|
-
* '--
|
|
93
|
+
* this it dropped `--device` entirely (commander errored with `unknown option
|
|
94
|
+
* '--device'`). This wires the identical routing: it synthesizes the implicit command
|
|
95
95
|
* token (`browser`) at the front of the argv so the remote invocation builds as
|
|
96
96
|
* `agents browser …`, delegates to {@link maybeRunOnHost}, and returns `true` when
|
|
97
97
|
* it dispatched the run to a remote (the local program must then NOT parse).
|
|
98
98
|
*
|
|
99
99
|
* On a local / self-host fall-through it rewrites `process.argv` to the ORIGINAL
|
|
100
100
|
* args minus the routing flags — never the synthetic command token — so the
|
|
101
|
-
* standalone commander program parses cleanly and never sees an unknown `--
|
|
101
|
+
* standalone commander program parses cleanly and never sees an unknown `--device`.
|
|
102
102
|
* When no routing flag is present it leaves `process.argv` untouched (the common
|
|
103
103
|
* case), so an unrelated flag like `--no-tty` is never stripped from a purely local
|
|
104
104
|
* run.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Generic `--
|
|
2
|
+
* Generic `--device` passthrough — the single choke point that runs an allowlisted
|
|
3
3
|
* `agents <command>` on a remote host instead of locally. Called once from
|
|
4
4
|
* `index.ts` before commander parses; returns `true` when it handled the
|
|
5
5
|
* invocation (the local command must then NOT run).
|
|
@@ -10,10 +10,10 @@
|
|
|
10
10
|
* long-running case — `teams start --watch` — dispatches detached so the remote
|
|
11
11
|
* supervisor outlives a dropped connection.
|
|
12
12
|
*
|
|
13
|
-
* Commands with their own richer `--
|
|
13
|
+
* Commands with their own richer `--device` handling (`run`/`sessions`/`feed`/
|
|
14
14
|
* `computer`/`secrets`/`logs`/…) are listed in {@link OWN_HOST_COMMANDS} and
|
|
15
15
|
* fall through to their local actions. Everything else either routes via this
|
|
16
|
-
* table or, when `--
|
|
16
|
+
* table or, when `--device` is present, exits with a clear
|
|
17
17
|
* "not supported" message — never commander's raw `unknown option`.
|
|
18
18
|
*/
|
|
19
19
|
import chalk from 'chalk';
|
|
@@ -38,7 +38,7 @@ import { isKnownTopLevelCommand } from '../startup/command-registry.js';
|
|
|
38
38
|
export { flagValue, hasHostRoutingFlag } from './routing-flag.js';
|
|
39
39
|
/**
|
|
40
40
|
* First-class groups that run transparently on a remote via SSH when
|
|
41
|
-
* `--
|
|
41
|
+
* `--device` is present. Keep both canonical names and aliases
|
|
42
42
|
* (`repo`/`repos`, `exec`/`run`) so either argv form routes the same way.
|
|
43
43
|
*
|
|
44
44
|
* Prefer adding here over per-command SSH code — this is the single choke point.
|
|
@@ -60,11 +60,9 @@ export const REMOTE_PASSTHROUGH = {
|
|
|
60
60
|
check: {},
|
|
61
61
|
list: {},
|
|
62
62
|
usage: {},
|
|
63
|
-
cost: {},
|
|
64
63
|
insights: {},
|
|
65
|
-
output: {},
|
|
66
|
-
budget: {},
|
|
67
64
|
// config / resources
|
|
65
|
+
config: {},
|
|
68
66
|
sync: { nonInteractive: ['--yes'] },
|
|
69
67
|
pull: {},
|
|
70
68
|
push: {},
|
|
@@ -82,7 +80,6 @@ export const REMOTE_PASSTHROUGH = {
|
|
|
82
80
|
subagents: {},
|
|
83
81
|
workflows: {},
|
|
84
82
|
models: {},
|
|
85
|
-
profiles: {},
|
|
86
83
|
defaults: {},
|
|
87
84
|
alias: {},
|
|
88
85
|
// Installations are per-machine, so updating one on a peer means running it
|
|
@@ -109,14 +106,14 @@ export const REMOTE_PASSTHROUGH = {
|
|
|
109
106
|
browser: {},
|
|
110
107
|
};
|
|
111
108
|
/**
|
|
112
|
-
* Commands that register and interpret `--
|
|
109
|
+
* Commands that register and interpret `--device` themselves — must
|
|
113
110
|
* fall through to local commander even when the flag is present. Do not add
|
|
114
111
|
* these to {@link REMOTE_PASSTHROUGH}.
|
|
115
112
|
*/
|
|
116
113
|
export const OWN_HOST_COMMANDS = new Set([
|
|
117
114
|
'run',
|
|
118
115
|
'exec', // deprecated alias of run
|
|
119
|
-
'harness', // `--host <agent>` names the host CLI to run under
|
|
116
|
+
'harness', // `--host <agent>` names the host CLI to run under (not a device routing flag)
|
|
120
117
|
'harnesses',
|
|
121
118
|
'sessions',
|
|
122
119
|
'feed',
|
|
@@ -149,7 +146,7 @@ function syntheticHost(target) {
|
|
|
149
146
|
// Bare name: ssh resolves it from ~/.ssh/config, or connects to it as a hostname.
|
|
150
147
|
return { name: target, provider: 'local', source: 'ssh-config' };
|
|
151
148
|
}
|
|
152
|
-
/** Resolve a `--
|
|
149
|
+
/** Resolve a `--device` value to a Host: enrolled name → capability tag → raw target. */
|
|
153
150
|
async function resolveTargetHost(name, any) {
|
|
154
151
|
const enrolled = await resolveHost(name);
|
|
155
152
|
if (enrolled)
|
|
@@ -238,7 +235,7 @@ function formatCompactTokens(n) {
|
|
|
238
235
|
return `${(n / 1e3).toFixed(1)}K`;
|
|
239
236
|
return String(n);
|
|
240
237
|
}
|
|
241
|
-
/** One-line summary of a per-device `agents output --json` payload. */
|
|
238
|
+
/** One-line summary of a per-device `agents insights output --json` payload. */
|
|
242
239
|
function summarizeOutputResult(json) {
|
|
243
240
|
const p = json;
|
|
244
241
|
const burn = p?.burn;
|
|
@@ -254,12 +251,38 @@ function summarizeOutputResult(json) {
|
|
|
254
251
|
parts.push(`${commits} commits`);
|
|
255
252
|
return parts.length ? parts.join(' · ') : 'ok';
|
|
256
253
|
}
|
|
254
|
+
/**
|
|
255
|
+
* Summarize a `sync` payload, surfacing anything the peer REFUSED to write.
|
|
256
|
+
*
|
|
257
|
+
* The fan-out injects `--json`, so each peer returns the corrected `ok` and
|
|
258
|
+
* `declined` from RUSH-2700 — but the roster rendered a flat `ok` regardless,
|
|
259
|
+
* so `agents sync --device all` printed a green row for every box even when a
|
|
260
|
+
* harness's config was never written. That is the fleet-wide silent success
|
|
261
|
+
* this ticket exists to remove, one layer above where it was fixed.
|
|
262
|
+
*
|
|
263
|
+
* Covers both payload shapes: the umbrella carries a flat `declined`, the
|
|
264
|
+
* per-agent modes carry one per version.
|
|
265
|
+
*/
|
|
266
|
+
function summarizeSyncResult(json) {
|
|
267
|
+
const p = json;
|
|
268
|
+
const flat = Array.isArray(p?.declined) ? p.declined : [];
|
|
269
|
+
const perVersion = Array.isArray(p?.versions)
|
|
270
|
+
? p.versions.flatMap((v) => (Array.isArray(v?.declined) ? v.declined : []))
|
|
271
|
+
: [];
|
|
272
|
+
const declined = [...flat, ...perVersion];
|
|
273
|
+
if (declined.length === 0)
|
|
274
|
+
return 'ok';
|
|
275
|
+
return `${declined.length} not written`;
|
|
276
|
+
}
|
|
257
277
|
/** Best-effort summary of any per-device JSON payload. */
|
|
258
278
|
function summarizeResult(command, forwarded, json) {
|
|
259
279
|
if (command === 'view')
|
|
260
280
|
return summarizeViewResult(forwarded, json);
|
|
261
|
-
|
|
281
|
+
// #2621 nested `output` under `insights`; main added a sync declined tally.
|
|
282
|
+
if (command === 'insights' && forwarded[1] === 'output')
|
|
262
283
|
return summarizeOutputResult(json);
|
|
284
|
+
if (command === 'sync')
|
|
285
|
+
return summarizeSyncResult(json);
|
|
263
286
|
return 'ok';
|
|
264
287
|
}
|
|
265
288
|
const GROUP_ORDER = ['macOS', 'Linux', 'Windows', 'Other'];
|
|
@@ -382,39 +405,37 @@ export async function runFleetPassthrough(command, allArgs, spec, opts = {}) {
|
|
|
382
405
|
return true;
|
|
383
406
|
}
|
|
384
407
|
/**
|
|
385
|
-
* Route `agents <command> … --
|
|
386
|
-
*
|
|
387
|
-
* `false` (run locally) when
|
|
388
|
-
*
|
|
389
|
-
* local action. Returns `true` after printing a clear
|
|
390
|
-
* present on a command that is neither routable nor
|
|
391
|
-
* never sees commander's raw `unknown option
|
|
408
|
+
* Route `agents <command> … --device <name>` to a remote if the command is
|
|
409
|
+
* device-routable and `--device` (or a fleet sentinel `--hosts`/`--devices`) was
|
|
410
|
+
* given. Returns `false` (run locally) when no routing flag is present, the
|
|
411
|
+
* command owns its own device handling, the target is this very machine, or
|
|
412
|
+
* placement flags need the local action. Returns `true` after printing a clear
|
|
413
|
+
* error when the flag is present on a command that is neither routable nor
|
|
414
|
+
* self-handling — so the user never sees commander's raw `unknown option`.
|
|
392
415
|
*
|
|
393
416
|
* @param command the resolved subcommand name (`process.argv`'s first non-flag).
|
|
394
417
|
* @param allArgs `process.argv.slice(2)` — the command name followed by its args.
|
|
395
418
|
*/
|
|
396
419
|
export async function maybeRunOnHost(command, allArgs, opts) {
|
|
397
|
-
const
|
|
398
|
-
const deviceFlag = flagValue(allArgs, 'device');
|
|
420
|
+
const deviceFlag = flagValue(allArgs, 'device', 'D');
|
|
399
421
|
const hostsFlag = flagValue(allArgs, 'hosts');
|
|
400
422
|
const devicesFlag = flagValue(allArgs, 'devices');
|
|
401
|
-
let hostName =
|
|
402
|
-
const fleetAll = isFleetAllSentinel(
|
|
423
|
+
let hostName = deviceFlag;
|
|
424
|
+
const fleetAll = isFleetAllSentinel(undefined, deviceFlag, hostsFlag, devicesFlag);
|
|
403
425
|
// Proceed when any routing flag is present, including the plural fleet flags
|
|
404
426
|
// that may carry the `all` sentinel.
|
|
405
427
|
if (!hostName && !hostsFlag && !devicesFlag)
|
|
406
428
|
return false;
|
|
407
|
-
// Commands with their own richer --
|
|
408
|
-
//
|
|
409
|
-
//
|
|
410
|
-
// `agents sessions --host a --device b` / `agents feed --host a --device b`.
|
|
429
|
+
// Commands with their own richer --device semantics must reach local commander
|
|
430
|
+
// directly. sessions/feed handle multi-host lists themselves; fall through so
|
|
431
|
+
// those flags reach the local action.
|
|
411
432
|
if (OWN_HOST_COMMANDS.has(command))
|
|
412
433
|
return false;
|
|
413
434
|
// Placement, not routing: `teams add`/`teams create` read `--device`/`--devices`
|
|
414
|
-
// (and `--
|
|
435
|
+
// (and `--hosts`) as WHERE to place a teammate / the team pool — the
|
|
415
436
|
// command itself always runs locally on the orchestrator. Bail before the
|
|
416
437
|
// generic teams routing below so those flags reach the local action. Every
|
|
417
|
-
// other teams subcommand (`status`/`logs`/`stop`/…) keeps `--
|
|
438
|
+
// other teams subcommand (`status`/`logs`/`stop`/…) keeps `--device` routing.
|
|
418
439
|
// Find the subcommand = the first non-flag token AFTER `teams` (robust to any
|
|
419
440
|
// leading global flags), then bail for the add/create aliases.
|
|
420
441
|
if (command === 'teams') {
|
|
@@ -428,7 +449,7 @@ export async function maybeRunOnHost(command, allArgs, opts) {
|
|
|
428
449
|
// the `all` sentinel, which this module fans out generically. On `routines`,
|
|
429
450
|
// a non-all `--devices` value is placement (which devices may run the routine).
|
|
430
451
|
if (allArgs.includes('--hosts') && hostsFlag?.toLowerCase() !== 'all')
|
|
431
|
-
return false;
|
|
452
|
+
return false; // legacy plural sentinel; prefer --devices
|
|
432
453
|
if (allArgs.includes('--devices')) {
|
|
433
454
|
if (devicesFlag === undefined)
|
|
434
455
|
return false; // malformed, let commander error
|
|
@@ -438,8 +459,8 @@ export async function maybeRunOnHost(command, allArgs, opts) {
|
|
|
438
459
|
}
|
|
439
460
|
// A command that does not exist is an unknown-command error, not a routing
|
|
440
461
|
// error. The router runs BEFORE commander parses, so without this gate a typo
|
|
441
|
-
// (`agents session resume --
|
|
442
|
-
// --
|
|
462
|
+
// (`agents session resume --device box`) was answered with "does not support
|
|
463
|
+
// --device" — a true statement about a command the user never typed,
|
|
443
464
|
// and the exact opposite of the truth for the `sessions` they meant, which
|
|
444
465
|
// does support it. Fall through so commander reports `unknown command` (and
|
|
445
466
|
// its did-you-mean). RUSH-2022.
|
|
@@ -449,25 +470,21 @@ export async function maybeRunOnHost(command, allArgs, opts) {
|
|
|
449
470
|
if (!spec) {
|
|
450
471
|
// Flag was accepted (no raw commander "unknown option") but this group has
|
|
451
472
|
// no remote semantics — say so clearly instead of falling through.
|
|
452
|
-
console.error(chalk.red(`\`agents ${command}\` does not support --
|
|
453
|
-
chalk.gray(' Run without the flag, or use a
|
|
454
|
-
process.exitCode = 1;
|
|
455
|
-
return true;
|
|
456
|
-
}
|
|
457
|
-
// Reject a conflicting --host/--device pair before either the fleet fan-out
|
|
458
|
-
// or single-target path runs. Equal values (e.g. both `all`) are allowed.
|
|
459
|
-
if (hostFlag && deviceFlag && hostFlag !== deviceFlag) {
|
|
460
|
-
console.error(chalk.red('Conflicting --host/--device values — pass just one.'));
|
|
473
|
+
console.error(chalk.red(`\`agents ${command}\` does not support --device (no remote interpretation).`) +
|
|
474
|
+
chalk.gray(' Run without the flag, or use a device-routable group (repos, view, sync, teams, doctor, …).'));
|
|
461
475
|
process.exitCode = 1;
|
|
462
476
|
return true;
|
|
463
477
|
}
|
|
478
|
+
// Reject duplicate --device flags before either the fleet fan-out
|
|
479
|
+
// or single-target path runs. (Conflict detection: only --device exists now.)
|
|
480
|
+
// No conflict gate needed — a single canonical flag cannot conflict with itself.
|
|
464
481
|
// Generic fleet fan-out for the `all` sentinel — before single-host resolution
|
|
465
482
|
// so `all` is never treated as a literal hostname.
|
|
466
483
|
if (fleetAll) {
|
|
467
484
|
return runFleetPassthrough(command, allArgs, spec, opts);
|
|
468
485
|
}
|
|
469
486
|
// After the bailouts and fleet fan-out above, the only remaining path is a
|
|
470
|
-
// single-target --
|
|
487
|
+
// single-target --device. Guard for the type checker: plural non-all
|
|
471
488
|
// flags and bare flags were already handled.
|
|
472
489
|
if (!hostName)
|
|
473
490
|
return false;
|
|
@@ -489,10 +506,10 @@ export async function maybeRunOnHost(command, allArgs, opts) {
|
|
|
489
506
|
}
|
|
490
507
|
// Running against your own machine is just a local run — skip the SSH round-trip.
|
|
491
508
|
// Match EVERY identity the box answers to (short id, loopback, tailscale
|
|
492
|
-
// dnsName), not just machineId() — a `--
|
|
509
|
+
// dnsName), not just machineId() — a `--device <self-dnsName>` used to slip past a
|
|
493
510
|
// short-hostname-only check and self-SSH (RUSH-2114). Strip the routing flags
|
|
494
511
|
// from process.argv so the local command never sees an unregistered
|
|
495
|
-
// `--
|
|
512
|
+
// `--device` and dies with "unknown option".
|
|
496
513
|
if (isSelfHost(hostName)) {
|
|
497
514
|
const stripped = stripRoutingFlags(allArgs, STRIP_SPECS);
|
|
498
515
|
process.argv = [process.argv[0], process.argv[1], ...stripped];
|
|
@@ -551,21 +568,21 @@ export async function maybeRunOnHost(command, allArgs, opts) {
|
|
|
551
568
|
return true;
|
|
552
569
|
}
|
|
553
570
|
/**
|
|
554
|
-
* `--
|
|
571
|
+
* `--device` passthrough for a **standalone binary** whose command name is fixed by
|
|
555
572
|
* the binary itself (the `browser`/`computer` bins, `dist/browser.js` etc.) rather
|
|
556
573
|
* than being the first argv token.
|
|
557
574
|
*
|
|
558
|
-
* `agents browser … --
|
|
575
|
+
* `agents browser … --device <box>` routes through {@link maybeRunOnHost} in
|
|
559
576
|
* index.ts, but the standalone `browser` binary never enters index.ts — so without
|
|
560
|
-
* this it dropped `--
|
|
561
|
-
* '--
|
|
577
|
+
* this it dropped `--device` entirely (commander errored with `unknown option
|
|
578
|
+
* '--device'`). This wires the identical routing: it synthesizes the implicit command
|
|
562
579
|
* token (`browser`) at the front of the argv so the remote invocation builds as
|
|
563
580
|
* `agents browser …`, delegates to {@link maybeRunOnHost}, and returns `true` when
|
|
564
581
|
* it dispatched the run to a remote (the local program must then NOT parse).
|
|
565
582
|
*
|
|
566
583
|
* On a local / self-host fall-through it rewrites `process.argv` to the ORIGINAL
|
|
567
584
|
* args minus the routing flags — never the synthetic command token — so the
|
|
568
|
-
* standalone commander program parses cleanly and never sees an unknown `--
|
|
585
|
+
* standalone commander program parses cleanly and never sees an unknown `--device`.
|
|
569
586
|
* When no routing flag is present it leaves `process.argv` untouched (the common
|
|
570
587
|
* case), so an unrelated flag like `--no-tty` is never stripped from a purely local
|
|
571
588
|
* run.
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* registry.json) into the host pool behind the same `HostProvider` seam as
|
|
6
6
|
* `local` — the "tailscale provider" fast-follow named in docs/hosts.md. With
|
|
7
7
|
* it, a machine registered once via `agents devices sync` becomes a resolvable
|
|
8
|
-
* `--
|
|
8
|
+
* `--device`/`--device` dispatch target, participates in capability routing, and
|
|
9
9
|
* is enumerable by target pickers — not just resolvable by exact name.
|
|
10
10
|
*
|
|
11
11
|
* Password-auth devices are listed (the pool stays honest about what exists)
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* registry.json) into the host pool behind the same `HostProvider` seam as
|
|
6
6
|
* `local` — the "tailscale provider" fast-follow named in docs/hosts.md. With
|
|
7
7
|
* it, a machine registered once via `agents devices sync` becomes a resolvable
|
|
8
|
-
* `--
|
|
8
|
+
* `--device`/`--device` dispatch target, participates in capability routing, and
|
|
9
9
|
* is enumerable by target pickers — not just resolvable by exact name.
|
|
10
10
|
*
|
|
11
11
|
* Password-auth devices are listed (the pool stays honest about what exists)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Reconcile a local host-task record against the remote run's ground truth.
|
|
3
3
|
*
|
|
4
|
-
* A detached `--
|
|
4
|
+
* A detached `--device` run outlives the local follower: it keeps running and
|
|
5
5
|
* writes its exit code to `<id>.exit` on the host even if the laptop sleeps or
|
|
6
6
|
* the SSH connection drops mid-follow. When that happens the local record is
|
|
7
7
|
* left at `status:'running'` forever, because the only path that finalizes it
|