@phnx-labs/agents-cli 1.22.39 → 1.22.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +316 -0
- package/README.md +116 -70
- package/dist/bin/agents +0 -0
- package/dist/bootstrap.js +45 -27
- package/dist/browser.js +2 -2
- package/dist/cli/command-registry.d.ts +135 -0
- package/dist/cli/command-registry.js +259 -0
- package/dist/commands/accounts.d.ts +20 -0
- package/dist/commands/accounts.js +186 -25
- package/dist/commands/apply.d.ts +3 -3
- package/dist/commands/apply.js +20 -63
- package/dist/commands/browser.d.ts +15 -0
- package/dist/commands/browser.js +318 -131
- package/dist/commands/budget.d.ts +7 -6
- package/dist/commands/budget.js +8 -7
- package/dist/commands/cloud.js +17 -20
- package/dist/commands/commands.js +1 -1
- package/dist/commands/computer-actions.d.ts +1 -35
- package/dist/commands/computer-actions.js +13 -181
- package/dist/commands/computer.d.ts +28 -3
- package/dist/commands/computer.js +93 -65
- package/dist/commands/config.js +16 -3
- package/dist/commands/cost.d.ts +2 -1
- package/dist/commands/cost.js +7 -6
- package/dist/commands/daemon.js +151 -4
- package/dist/commands/detach.js +1 -1
- package/dist/commands/doctor.js +19 -11
- package/dist/commands/events.js +1 -1
- package/dist/commands/exec.d.ts +2 -50
- package/dist/commands/exec.js +160 -215
- package/dist/commands/factory.js +1 -1
- package/dist/commands/feed.d.ts +2 -2
- package/dist/commands/feed.js +12 -23
- package/dist/commands/fleet-capture.js +25 -27
- package/dist/commands/focus.d.ts +2 -3
- package/dist/commands/focus.js +34 -9
- package/dist/commands/go.js +15 -5
- package/dist/commands/harness.d.ts +3 -3
- package/dist/commands/harness.js +53 -5
- package/dist/commands/hooks.js +1 -1
- package/dist/commands/import.js +2 -2
- package/dist/commands/insights.d.ts +5 -5
- package/dist/commands/insights.js +15 -9
- package/dist/commands/inspect.d.ts +2 -3
- package/dist/commands/inspect.js +4 -16
- package/dist/commands/logs.d.ts +2 -2
- package/dist/commands/logs.js +9 -9
- package/dist/commands/mcp.js +2 -2
- package/dist/commands/memory.js +1 -1
- package/dist/commands/message.d.ts +1 -1
- package/dist/commands/message.js +7 -7
- package/dist/commands/mine.d.ts +11 -8
- package/dist/commands/mine.js +11 -10
- package/dist/commands/models.js +1 -1
- package/dist/commands/modes.js +1 -1
- package/dist/commands/monitors.js +23 -6
- package/dist/commands/output.d.ts +7 -6
- package/dist/commands/output.js +11 -10
- package/dist/commands/packages.js +4 -4
- package/dist/commands/perf.js +1 -1
- package/dist/commands/permissions.js +49 -32
- package/dist/commands/plugins.d.ts +1 -1
- package/dist/commands/plugins.js +3 -3
- package/dist/commands/profiles.d.ts +6 -9
- package/dist/commands/profiles.js +8 -321
- package/dist/commands/projects.d.ts +9 -0
- package/dist/commands/projects.js +140 -8
- package/dist/commands/prune.js +5 -13
- package/dist/commands/refresh-rules.js +1 -1
- package/dist/commands/repo.d.ts +5 -7
- package/dist/commands/repo.js +34 -18
- package/dist/commands/resource-view.js +4 -0
- package/dist/commands/resume.d.ts +11 -7
- package/dist/commands/resume.js +82 -98
- package/dist/commands/route.d.ts +12 -0
- package/dist/commands/route.js +261 -0
- package/dist/commands/routines.d.ts +2 -3
- package/dist/commands/routines.js +120 -145
- package/dist/commands/rules.js +1 -1
- package/dist/commands/run-account-picker.d.ts +1 -1
- package/dist/commands/run-account-picker.js +2 -2
- package/dist/commands/run-broadcast.d.ts +21 -0
- package/dist/commands/run-broadcast.js +89 -0
- package/dist/commands/run-cloud.js +1 -1
- package/dist/commands/secrets-vault.d.ts +10 -0
- package/dist/commands/{login.js → secrets-vault.js} +34 -14
- package/dist/commands/secrets.d.ts +4 -4
- package/dist/commands/secrets.js +158 -159
- package/dist/commands/sessions-backfill.js +1 -1
- package/dist/commands/sessions-browser.d.ts +1 -1
- package/dist/commands/sessions-browser.js +9 -5
- package/dist/commands/sessions-export.js +2 -2
- package/dist/commands/sessions-inject.js +4 -5
- package/dist/commands/sessions-migrate.js +16 -27
- package/dist/commands/sessions-picker.d.ts +14 -0
- package/dist/commands/sessions-picker.js +209 -13
- package/dist/commands/sessions-resume.d.ts +7 -3
- package/dist/commands/sessions-resume.js +81 -33
- package/dist/commands/sessions-share.d.ts +25 -0
- package/dist/commands/sessions-share.js +166 -0
- package/dist/commands/sessions-stats.js +2 -2
- package/dist/commands/sessions.d.ts +75 -68
- package/dist/commands/sessions.js +144 -180
- package/dist/commands/setup-browser.js +1 -1
- package/dist/commands/setup-computer.js +1 -1
- package/dist/commands/setup-fleet.js +3 -0
- package/dist/commands/setup-mine.d.ts +7 -3
- package/dist/commands/setup-mine.js +13 -8
- package/dist/commands/setup-preferences.js +2 -2
- package/dist/commands/setup-secrets.js +2 -2
- package/dist/commands/setup-watchdog.js +2 -2
- package/dist/commands/setup.js +7 -2
- package/dist/commands/share.d.ts +65 -0
- package/dist/commands/share.js +253 -20
- package/dist/commands/skills.js +3 -3
- package/dist/commands/snapshot.d.ts +2 -2
- package/dist/commands/snapshot.js +9 -9
- package/dist/commands/ssh.d.ts +1 -1
- package/dist/commands/ssh.js +186 -64
- package/dist/commands/subagents.js +1 -1
- package/dist/commands/sync.js +24 -9
- package/dist/commands/teams.d.ts +2 -2
- package/dist/commands/teams.js +9 -18
- package/dist/commands/tmux.js +5 -1
- package/dist/commands/trash.js +1 -1
- package/dist/commands/usage.d.ts +1 -1
- package/dist/commands/usage.js +2 -2
- package/dist/commands/utils.d.ts +4 -14
- package/dist/commands/utils.js +6 -27
- package/dist/commands/versions.js +2 -2
- package/dist/commands/view.d.ts +9 -77
- package/dist/commands/view.js +23 -8
- package/dist/commands/watchdog.js +1 -1
- package/dist/commands/webhook.js +25 -34
- package/dist/commands/workflows.js +1 -1
- package/dist/index.js +1 -1
- package/dist/lib/account-capabilities.d.ts +39 -0
- package/dist/lib/account-capabilities.js +59 -0
- package/dist/lib/account-catalog.js +1 -1
- package/dist/lib/account-registry.d.ts +66 -0
- package/dist/lib/account-registry.js +151 -5
- package/dist/lib/{rotate.d.ts → accounting/rotate.d.ts} +4 -4
- package/dist/lib/{rotate.js → accounting/rotate.js} +8 -8
- package/dist/lib/{usage.d.ts → accounting/usage.d.ts} +4 -4
- package/dist/lib/{usage.js → accounting/usage.js} +11 -11
- package/dist/lib/agent-spec/provider.js +1 -1
- package/dist/lib/agents.d.ts +72 -4
- package/dist/lib/agents.js +231 -199
- package/dist/lib/answer-router.d.ts +2 -2
- package/dist/lib/ask-classifier.d.ts +1 -1
- package/dist/lib/ask-classifier.js +1 -1
- package/dist/lib/audit/log.js +1 -1
- package/dist/lib/auth-health.d.ts +1 -1
- package/dist/lib/auth-health.js +2 -2
- package/dist/lib/brand.js +1 -1
- package/dist/lib/browser/caller-identity.d.ts +28 -0
- package/dist/lib/browser/caller-identity.js +156 -0
- package/dist/lib/browser/cdp.js +5 -1
- package/dist/lib/browser/chrome.js +12 -1
- package/dist/lib/browser/drivers/ssh.d.ts +1 -1
- package/dist/lib/browser/drivers/ssh.js +3 -2
- package/dist/lib/browser/hygiene.d.ts +10 -2
- package/dist/lib/browser/hygiene.js +7 -4
- package/dist/lib/browser/ipc.d.ts +22 -2
- package/dist/lib/browser/ipc.js +185 -21
- package/dist/lib/browser/profiles.d.ts +69 -5
- package/dist/lib/browser/profiles.js +135 -13
- package/dist/lib/browser/remote-control.d.ts +2 -2
- package/dist/lib/browser/remote-control.js +3 -3
- package/dist/lib/browser/runtime-state.d.ts +79 -0
- package/dist/lib/browser/runtime-state.js +119 -1
- package/dist/lib/browser/service.d.ts +137 -2
- package/dist/lib/browser/service.js +492 -54
- package/dist/lib/browser/sessions-list.d.ts +2 -1
- package/dist/lib/browser/sessions-list.js +4 -13
- package/dist/lib/browser/types.d.ts +19 -1
- package/dist/lib/budget/config.js +1 -1
- package/dist/lib/budget/ledger.js +1 -1
- package/dist/lib/byok-usage.js +1 -1
- package/dist/lib/capabilities.js +3 -15
- package/dist/lib/catchup.d.ts +1 -1
- package/dist/lib/catchup.js +1 -1
- package/dist/lib/cloud/dispatch.js +1 -1
- package/dist/lib/cloud/host.d.ts +3 -3
- package/dist/lib/cloud/host.js +5 -5
- package/dist/lib/cloud/rush.d.ts +9 -21
- package/dist/lib/cloud/rush.js +33 -120
- package/dist/lib/cloud/types.d.ts +2 -2
- package/dist/lib/commands.js +3 -13
- package/dist/lib/computer/actions.d.ts +36 -0
- package/dist/lib/computer/actions.js +162 -0
- package/dist/lib/computer/dispatch.d.ts +2 -2
- package/dist/lib/computer/dispatch.js +2 -2
- package/dist/lib/computer/sessions-list.d.ts +3 -3
- package/dist/lib/computer/sessions-list.js +2 -2
- package/dist/lib/config-keys.d.ts +2 -1
- package/dist/lib/config-keys.js +8 -4
- package/dist/lib/config-machine-keys.d.ts +4 -2
- package/dist/lib/config-machine-keys.js +5 -2
- package/dist/lib/crabbox/lease.js +9 -1
- package/dist/lib/crabbox/runtimes.d.ts +32 -7
- package/dist/lib/crabbox/runtimes.js +72 -30
- package/dist/lib/{daemon.d.ts → daemon/daemon.d.ts} +59 -1
- package/dist/lib/{daemon.js → daemon/daemon.js} +237 -49
- package/dist/lib/daemon-services.d.ts +1 -1
- package/dist/lib/daemon-services.js +5 -0
- package/dist/lib/daemon-ticks.d.ts +25 -0
- package/dist/lib/daemon-ticks.js +31 -1
- package/dist/lib/daemon-webhooks.d.ts +104 -0
- package/dist/lib/daemon-webhooks.js +215 -0
- package/dist/lib/device-config.d.ts +85 -75
- package/dist/lib/device-config.js +280 -142
- package/dist/lib/devices/config-migration.d.ts +29 -34
- package/dist/lib/devices/config-migration.js +209 -130
- package/dist/lib/devices/connect.d.ts +2 -2
- package/dist/lib/devices/connect.js +2 -2
- package/dist/lib/devices/discovery-policy.d.ts +30 -0
- package/dist/lib/devices/discovery-policy.js +101 -0
- package/dist/lib/devices/fleet-inventory.js +8 -3
- package/dist/lib/devices/harness-inventory.d.ts +1 -1
- package/dist/lib/devices/harness-inventory.js +12 -3
- package/dist/lib/devices/known-hosts.js +1 -1
- package/dist/lib/devices/pool.d.ts +10 -5
- package/dist/lib/devices/pool.js +5 -7
- package/dist/lib/devices/registry.d.ts +1 -1
- package/dist/lib/devices/registry.js +1 -1
- package/dist/lib/devices/resolve-profile.d.ts +2 -2
- package/dist/lib/devices/resolve-profile.js +2 -2
- package/dist/lib/devices/resolve-target.d.ts +1 -1
- package/dist/lib/devices/resolve-target.js +4 -4
- package/dist/lib/devices/self-host.d.ts +1 -1
- package/dist/lib/devices/self-host.js +3 -3
- package/dist/lib/devices/ssh-config.d.ts +1 -1
- package/dist/lib/devices/stats-cache.js +1 -1
- package/dist/lib/devices/sync.d.ts +3 -1
- package/dist/lib/devices/sync.js +3 -3
- package/dist/lib/doctor-diff.js +4 -4
- package/dist/lib/drift-sync.js +2 -2
- package/dist/lib/drift.js +2 -2
- package/dist/lib/event-families.d.ts +1 -1
- package/dist/lib/event-stream.d.ts +1 -1
- package/dist/lib/event-stream.js +2 -2
- package/dist/lib/events-ingest.js +2 -2
- package/dist/lib/exec.d.ts +4 -4
- package/dist/lib/exec.js +11 -11
- package/dist/lib/factory/snapshot.d.ts +1 -1
- package/dist/lib/factory/snapshot.js +1 -1
- package/dist/lib/{activity.d.ts → feed/activity.d.ts} +1 -1
- package/dist/lib/{activity.js → feed/activity.js} +7 -7
- package/dist/lib/{events.d.ts → feed/events.d.ts} +2 -2
- package/dist/lib/{events.js → feed/events.js} +5 -5
- package/dist/lib/{feed.js → feed/feed.js} +4 -4
- package/dist/lib/feed-outcome.d.ts +1 -1
- package/dist/lib/feed-policy.d.ts +1 -1
- package/dist/lib/feed-policy.js +1 -1
- package/dist/lib/feed-post.d.ts +1 -1
- package/dist/lib/feed-post.js +1 -1
- package/dist/lib/feed-ranking.d.ts +1 -1
- package/dist/lib/fleet/apply.d.ts +0 -6
- package/dist/lib/fleet/apply.js +18 -45
- package/dist/lib/fleet/auth-sync.d.ts +16 -35
- package/dist/lib/fleet/auth-sync.js +16 -75
- package/dist/lib/fleet/capture.js +8 -6
- package/dist/lib/fleet/manifest.js +23 -11
- package/dist/lib/fleet/types.d.ts +19 -7
- package/dist/lib/fleet-cache.d.ts +1 -1
- package/dist/lib/fleet-cache.js +1 -1
- package/dist/lib/format.d.ts +19 -0
- package/dist/lib/format.js +44 -1
- package/dist/lib/friction-heuristics.d.ts +1 -1
- package/dist/lib/git.d.ts +24 -1
- package/dist/lib/git.js +82 -38
- package/dist/lib/heal.js +3 -3
- package/dist/lib/hooks.d.ts +18 -0
- package/dist/lib/hooks.js +113 -1
- package/dist/lib/hosts/credentials.d.ts +30 -10
- package/dist/lib/hosts/credentials.js +38 -26
- package/dist/lib/hosts/dispatch.d.ts +3 -3
- package/dist/lib/hosts/dispatch.js +3 -3
- package/dist/lib/hosts/option.d.ts +3 -3
- package/dist/lib/hosts/option.js +7 -8
- package/dist/lib/hosts/passthrough.d.ts +17 -17
- package/dist/lib/hosts/passthrough.js +67 -50
- package/dist/lib/hosts/providers/devices.d.ts +1 -1
- package/dist/lib/hosts/providers/devices.js +1 -1
- package/dist/lib/hosts/reconcile.d.ts +1 -1
- package/dist/lib/hosts/reconcile.js +1 -1
- package/dist/lib/hosts/reconnect.d.ts +1 -1
- package/dist/lib/hosts/reconnect.js +2 -2
- package/dist/lib/hosts/registry.d.ts +5 -5
- package/dist/lib/hosts/registry.js +5 -5
- package/dist/lib/hosts/remote-cmd.d.ts +10 -10
- package/dist/lib/hosts/remote-cmd.js +25 -18
- package/dist/lib/hosts/remote-os.d.ts +4 -4
- package/dist/lib/hosts/remote-os.js +4 -4
- package/dist/lib/hosts/remote-session-id.d.ts +2 -2
- package/dist/lib/hosts/remote-session-id.js +2 -2
- package/dist/lib/hosts/routing-flag.d.ts +3 -3
- package/dist/lib/hosts/routing-flag.js +4 -5
- package/dist/lib/hosts/run-target.d.ts +4 -4
- package/dist/lib/hosts/run-target.js +4 -4
- package/dist/lib/hosts/session-index.d.ts +2 -2
- package/dist/lib/hosts/session-index.js +1 -1
- package/dist/lib/hosts/session-marker.d.ts +1 -1
- package/dist/lib/hosts/session-marker.js +1 -1
- package/dist/lib/hosts/types.d.ts +2 -2
- package/dist/lib/hosts/types.js +2 -2
- package/dist/lib/import.js +1 -1
- package/dist/lib/{migrate.d.ts → installations/migrate.d.ts} +13 -1
- package/dist/lib/{migrate.js → installations/migrate.js} +160 -40
- package/dist/lib/installations/resolve.js +1 -1
- package/dist/lib/installations/strategies.js +1 -1
- package/dist/lib/installations/update.js +2 -2
- package/dist/lib/{versions.d.ts → installations/versions.d.ts} +12 -3
- package/dist/lib/{versions.js → installations/versions.js} +51 -31
- package/dist/lib/isolation-boundary-report.js +1 -1
- package/dist/lib/linear-projects.d.ts +28 -0
- package/dist/lib/linear-projects.js +30 -0
- package/dist/lib/loop.js +1 -1
- package/dist/lib/mailbox-gc.js +1 -1
- package/dist/lib/mailbox.js +1 -1
- package/dist/lib/mcp-registry.d.ts +62 -0
- package/dist/lib/mcp-registry.js +177 -0
- package/dist/lib/mcp.d.ts +5 -0
- package/dist/lib/mcp.js +124 -307
- package/dist/lib/menubar/MenubarHelper.app/Contents/CodeResources +0 -0
- package/dist/lib/menubar/MenubarHelper.app/Contents/MacOS/MenubarHelper +0 -0
- package/dist/lib/menubar/install-menubar.d.ts +7 -0
- package/dist/lib/menubar/install-menubar.js +24 -6
- package/dist/lib/menubar/snapshot.d.ts +7 -0
- package/dist/lib/menubar/snapshot.js +8 -6
- package/dist/lib/models.js +1 -1
- package/dist/lib/monitors/config.d.ts +12 -0
- package/dist/lib/monitors/config.js +3 -0
- package/dist/lib/monitors/dispatch.js +26 -5
- package/dist/lib/monitors/engine.js +10 -0
- package/dist/lib/monitors/sources/webhook.d.ts +1 -1
- package/dist/lib/monitors/state.d.ts +42 -0
- package/dist/lib/monitors/state.js +30 -0
- package/dist/lib/notify.d.ts +1 -1
- package/dist/lib/observe-aliases.d.ts +3 -3
- package/dist/lib/observe-aliases.js +3 -21
- package/dist/lib/output/git-output.js +2 -2
- package/dist/lib/overdue.d.ts +1 -1
- package/dist/lib/overdue.js +1 -1
- package/dist/lib/permissions-registry.d.ts +65 -0
- package/dist/lib/permissions-registry.js +599 -0
- package/dist/lib/permissions.d.ts +24 -13
- package/dist/lib/permissions.js +52 -271
- package/dist/lib/picker.d.ts +16 -0
- package/dist/lib/picker.js +33 -3
- package/dist/lib/placement.d.ts +1 -1
- package/dist/lib/placement.js +4 -4
- package/dist/lib/platform/paths.d.ts +8 -0
- package/dist/lib/platform/paths.js +11 -0
- package/dist/lib/platform/posixpath.js +3 -3
- package/dist/lib/{plugin-marketplace.d.ts → plugins/plugin-marketplace.d.ts} +1 -1
- package/dist/lib/{plugin-marketplace.js → plugins/plugin-marketplace.js} +2 -2
- package/dist/lib/{plugins.d.ts → plugins/plugins.d.ts} +1 -1
- package/dist/lib/{plugins.js → plugins/plugins.js} +7 -7
- package/dist/lib/{skills.d.ts → plugins/skills.d.ts} +1 -1
- package/dist/lib/{skills.js → plugins/skills.js} +7 -7
- package/dist/lib/pricing/cost.d.ts +1 -1
- package/dist/lib/pricing/cost.js +1 -1
- package/dist/lib/profiles-presets.d.ts +1 -1
- package/dist/lib/profiles-presets.js +1 -1
- package/dist/lib/profiles.js +2 -2
- package/dist/lib/project-import.js +4 -1
- package/dist/lib/project-key.js +7 -0
- package/dist/lib/project-launch.d.ts +1 -1
- package/dist/lib/project-launch.js +3 -3
- package/dist/lib/project-pull.d.ts +128 -0
- package/dist/lib/project-pull.js +384 -0
- package/dist/lib/project-root.d.ts +2 -2
- package/dist/lib/project-root.js +2 -2
- package/dist/lib/project-status.js +1 -1
- package/dist/lib/projects.d.ts +23 -0
- package/dist/lib/projects.js +29 -6
- package/dist/lib/refresh.d.ts +12 -1
- package/dist/lib/refresh.js +16 -9
- package/dist/lib/registry.d.ts +9 -2
- package/dist/lib/registry.js +11 -4
- package/dist/lib/resources.d.ts +2 -2
- package/dist/lib/resources.js +2 -2
- package/dist/lib/routers.d.ts +81 -0
- package/dist/lib/routers.js +153 -0
- package/dist/lib/routine-context.d.ts +1 -0
- package/dist/lib/routine-context.js +7 -2
- package/dist/lib/routine-notify-owner.d.ts +1 -1
- package/dist/lib/routine-notify.d.ts +1 -1
- package/dist/lib/routine-notify.js +1 -1
- package/dist/lib/routine-process-cleanup.d.ts +1 -1
- package/dist/lib/routine-readiness.d.ts +1 -1
- package/dist/lib/routine-readiness.js +11 -4
- package/dist/lib/routines-placement.d.ts +12 -2
- package/dist/lib/routines-placement.js +20 -3
- package/dist/lib/routines-project.d.ts +1 -1
- package/dist/lib/routines-project.js +1 -1
- package/dist/lib/rules/compile.d.ts +1 -0
- package/dist/lib/rules/compile.js +10 -2
- package/dist/lib/rules/rules.js +1 -1
- package/dist/lib/run-notify.js +1 -1
- package/dist/lib/runner.d.ts +80 -2
- package/dist/lib/runner.js +261 -67
- package/dist/lib/sandbox.d.ts +1 -1
- package/dist/lib/scheduler.d.ts +1 -1
- package/dist/lib/scheduler.js +1 -1
- package/dist/lib/{routines.d.ts → scheduling/routines.d.ts} +54 -9
- package/dist/lib/{routines.js → scheduling/routines.js} +173 -14
- package/dist/lib/secrets/Agents CLI.app/Contents/CodeResources +0 -0
- package/dist/lib/secrets/Agents CLI.app/Contents/MacOS/Agents CLI +0 -0
- package/dist/lib/secrets/agent.js +2 -2
- package/dist/lib/secrets/audit.js +1 -1
- package/dist/lib/secrets/bundles.d.ts +4 -4
- package/dist/lib/secrets/bundles.js +8 -8
- package/dist/lib/secrets/headless.d.ts +16 -0
- package/dist/lib/secrets/headless.js +21 -0
- package/dist/lib/secrets/index.js +1 -1
- package/dist/lib/secrets/list-filter.d.ts +1 -1
- package/dist/lib/secrets/list-filter.js +2 -2
- package/dist/lib/secrets/push.d.ts +1 -1
- package/dist/lib/secrets/push.js +10 -12
- package/dist/lib/secrets/remote.d.ts +21 -17
- package/dist/lib/secrets/remote.js +39 -23
- package/dist/lib/secrets/vault.js +2 -2
- package/dist/lib/self-heal/checks/shadowing.js +1 -1
- package/dist/lib/self-heal/checks/shims.js +1 -1
- package/dist/lib/self-update.d.ts +39 -4
- package/dist/lib/self-update.js +78 -25
- package/dist/lib/serve/control.d.ts +1 -1
- package/dist/lib/serve/control.js +4 -4
- package/dist/lib/serve/data.d.ts +1 -1
- package/dist/lib/serve/data.js +1 -1
- package/dist/lib/serve/stream.js +1 -1
- package/dist/lib/service-manifest.d.ts +29 -0
- package/dist/lib/service-manifest.js +80 -0
- package/dist/lib/session/active.d.ts +59 -7
- package/dist/lib/session/active.js +158 -17
- package/dist/lib/session/bash-command.js +1 -1
- package/dist/lib/session/claude-accounts.d.ts +1 -1
- package/dist/lib/session/claude-accounts.js +1 -1
- package/dist/lib/session/db.d.ts +10 -2
- package/dist/lib/session/db.js +25 -6
- package/dist/lib/session/discover.d.ts +77 -0
- package/dist/lib/session/discover.js +130 -25
- package/dist/lib/session/fork.js +1 -1
- package/dist/lib/session/inject.d.ts +1 -1
- package/dist/lib/session/insights.d.ts +1 -1
- package/dist/lib/session/insights.js +1 -1
- package/dist/lib/session/live-metadata.d.ts +15 -0
- package/dist/lib/session/live-metadata.js +76 -0
- package/dist/lib/session/migrate-targets.d.ts +1 -1
- package/dist/lib/session/recovery.d.ts +1 -1
- package/dist/lib/session/recovery.js +2 -2
- package/dist/lib/session/remote-active.d.ts +10 -1
- package/dist/lib/session/remote-active.js +8 -3
- package/dist/lib/session/remote-bundle.d.ts +1 -1
- package/dist/lib/session/remote-bundle.js +2 -2
- package/dist/lib/session/remote-list.d.ts +15 -4
- package/dist/lib/session/remote-list.js +40 -3
- package/dist/lib/session/remote.d.ts +5 -5
- package/dist/lib/session/remote.js +13 -17
- package/dist/lib/session/resume-command.d.ts +3 -2
- package/dist/lib/session/resume-command.js +4 -3
- package/dist/lib/session/resume-owner.d.ts +3 -3
- package/dist/lib/session/resume-owner.js +3 -3
- package/dist/lib/session/session-cache.d.ts +12 -0
- package/dist/lib/session/session-cache.js +2 -0
- package/dist/lib/session/share-html.d.ts +55 -0
- package/dist/lib/session/share-html.js +319 -0
- package/dist/lib/session/shell-programs.js +1 -1
- package/dist/lib/session/state.js +5 -5
- package/dist/lib/session/team-filter.d.ts +1 -1
- package/dist/lib/session/team-filter.js +1 -1
- package/dist/lib/session/types.d.ts +3 -3
- package/dist/lib/session/width.d.ts +2 -2
- package/dist/lib/session/width.js +2 -2
- package/dist/lib/settings-manifest.d.ts +2 -0
- package/dist/lib/settings-manifest.js +81 -3
- package/dist/lib/share/delete.d.ts +21 -0
- package/dist/lib/share/delete.js +42 -0
- package/dist/lib/share/publish.d.ts +120 -0
- package/dist/lib/share/publish.js +243 -18
- package/dist/lib/share/worker-template.js +172 -9
- package/dist/lib/shims.js +35 -7
- package/dist/lib/smart-launch.d.ts +4 -4
- package/dist/lib/smart-launch.js +6 -4
- package/dist/lib/snapshot.d.ts +4 -4
- package/dist/lib/snapshot.js +2 -2
- package/dist/lib/ssh-exec.d.ts +1 -1
- package/dist/lib/ssh-exec.js +2 -2
- package/dist/lib/ssh-tunnel.d.ts +10 -10
- package/dist/lib/ssh-tunnel.js +12 -12
- package/dist/lib/staleness/checkers/hooks.d.ts +1 -1
- package/dist/lib/staleness/checkers/hooks.js +1 -1
- package/dist/lib/staleness/detectors/permissions.js +0 -23
- package/dist/lib/staleness/detectors/plugins.js +1 -1
- package/dist/lib/staleness/fingerprint.js +1 -1
- package/dist/lib/staleness/layers.d.ts +1 -1
- package/dist/lib/staleness/layers.js +1 -1
- package/dist/lib/staleness/writers/mcp.js +3 -1
- package/dist/lib/staleness/writers/plugins.js +1 -1
- package/dist/lib/staleness/writers/types.d.ts +8 -0
- package/dist/lib/startup/command-registry.d.ts +6 -147
- package/dist/lib/startup/command-registry.js +40 -303
- package/dist/lib/startup/dev-build.d.ts +0 -21
- package/dist/lib/startup/dev-build.js +29 -8
- package/dist/lib/state.d.ts +19 -1
- package/dist/lib/state.js +120 -51
- package/dist/lib/subagents.js +1 -1
- package/dist/lib/sync-status.js +1 -1
- package/dist/lib/sync-umbrella.d.ts +6 -1
- package/dist/lib/sync-umbrella.js +9 -4
- package/dist/lib/teams/agents.js +2 -2
- package/dist/lib/teams/registry.js +1 -1
- package/dist/lib/terminal/backends/vscodium-agent.js +1 -1
- package/dist/lib/terminal/engine.js +1 -1
- package/dist/lib/terminal/index.d.ts +4 -0
- package/dist/lib/terminal/index.js +3 -0
- package/dist/lib/terminal/inject.d.ts +2 -2
- package/dist/lib/terminal/inject.js +2 -2
- package/dist/lib/terminal/transport.js +1 -1
- package/dist/lib/tmux/index.d.ts +1 -1
- package/dist/lib/tmux/index.js +1 -1
- package/dist/lib/tmux/session.d.ts +21 -5
- package/dist/lib/tmux/session.js +76 -22
- package/dist/lib/triggers/handlers.d.ts +38 -3
- package/dist/lib/triggers/handlers.js +58 -7
- package/dist/lib/triggers/webhook.d.ts +113 -5
- package/dist/lib/triggers/webhook.js +223 -44
- package/dist/lib/types.d.ts +19 -7
- package/dist/lib/usage-fleet.d.ts +1 -1
- package/dist/lib/usage-fleet.js +1 -1
- package/dist/lib/usage-refresh.d.ts +1 -1
- package/dist/lib/usage-refresh.js +3 -3
- package/dist/lib/version-duplicates.js +2 -2
- package/dist/lib/view-types.d.ts +56 -0
- package/dist/lib/view-types.js +1 -0
- package/dist/lib/watchdog/rotate.d.ts +2 -2
- package/dist/lib/watchdog/rotate.js +3 -3
- package/dist/lib/watchdog/runner.d.ts +2 -3
- package/dist/lib/watchdog/runner.js +3 -4
- package/dist/lib/workflows.js +1 -1
- package/dist/lib/wrap.d.ts +33 -0
- package/dist/lib/wrap.js +70 -0
- package/package.json +2 -1
- package/scripts/postinstall.js +2 -2
- package/dist/commands/bench.d.ts +0 -2
- package/dist/commands/bench.js +0 -101
- package/dist/commands/cp.d.ts +0 -84
- package/dist/commands/cp.js +0 -231
- package/dist/commands/login.d.ts +0 -2
- package/dist/lib/resources/commands.d.ts +0 -46
- package/dist/lib/resources/commands.js +0 -211
- package/dist/lib/resources/hooks.d.ts +0 -16
- package/dist/lib/resources/hooks.js +0 -153
- package/dist/lib/resources/mcp.d.ts +0 -34
- package/dist/lib/resources/mcp.js +0 -250
- package/dist/lib/resources/memory.d.ts +0 -15
- package/dist/lib/resources/memory.js +0 -46
- package/dist/lib/resources/permissions.d.ts +0 -13
- package/dist/lib/resources/permissions.js +0 -202
- package/dist/lib/resources/rules.d.ts +0 -46
- package/dist/lib/resources/rules.js +0 -179
- package/dist/lib/resources/skills.d.ts +0 -37
- package/dist/lib/resources/skills.js +0 -247
- package/dist/lib/resources/subagents.d.ts +0 -46
- package/dist/lib/resources/subagents.js +0 -202
- /package/dist/lib/{feed.d.ts → feed/feed.d.ts} +0 -0
package/dist/lib/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
|
|
@@ -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
|
|
@@ -99,7 +99,7 @@ export declare function remoteExitNotice(sessionId: string, host: string): strin
|
|
|
99
99
|
* {@link REMOTE_EXIT_255_REMAPPED} before the wrapper exits — see the file
|
|
100
100
|
* header for why. Every other code (0, 1, …) passes through unchanged. This
|
|
101
101
|
* carries no PATH bootstrap of its own — `ensureHostReady`/`readyProbe` already
|
|
102
|
-
* gates every `--
|
|
102
|
+
* gates every `--device` dispatch on `bash -lc 'agents --version'` succeeding
|
|
103
103
|
* before a run is attempted at all, so the peer's login shell resolving `agents`
|
|
104
104
|
* is an established precondition here too. Pure string-building, so it is
|
|
105
105
|
* unit-tested without SSH (and, since the constructed script is ordinary POSIX,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Auto-reconnect for an interactive `agents run --device
|
|
2
|
+
* Auto-reconnect for an interactive `agents run --device` session whose
|
|
3
3
|
* SSH link dropped.
|
|
4
4
|
*
|
|
5
5
|
* A remote interactive agent runs in a DETACHED tmux session on the peer (see
|
|
@@ -174,7 +174,7 @@ export function remoteExitNotice(sessionId, host) {
|
|
|
174
174
|
* {@link REMOTE_EXIT_255_REMAPPED} before the wrapper exits — see the file
|
|
175
175
|
* header for why. Every other code (0, 1, …) passes through unchanged. This
|
|
176
176
|
* carries no PATH bootstrap of its own — `ensureHostReady`/`readyProbe` already
|
|
177
|
-
* gates every `--
|
|
177
|
+
* gates every `--device` dispatch on `bash -lc 'agents --version'` succeeding
|
|
178
178
|
* before a run is attempted at all, so the peer's login shell resolving `agents`
|
|
179
179
|
* is an established precondition here too. Pure string-building, so it is
|
|
180
180
|
* unit-tested without SSH (and, since the constructed script is ordinary POSIX,
|
|
@@ -58,7 +58,7 @@ export interface MatchHostOptions {
|
|
|
58
58
|
resolveAuto?: () => DeviceAffinityPlan;
|
|
59
59
|
}
|
|
60
60
|
/**
|
|
61
|
-
* The one place a `--
|
|
61
|
+
* The one place a `--device` / `--device` token becomes a resolved host. Reads the
|
|
62
62
|
* devices registry, the agents.yaml overlay, and ssh_config, and merges them
|
|
63
63
|
* per-field (see {@link deviceHost}). One grammar for every caller: `name`,
|
|
64
64
|
* `user@name`, a tailnet FQDN, an ssh_config alias, and a literal `user@host`
|
|
@@ -77,8 +77,8 @@ export declare function matchHost(name: string, opts?: MatchHostOptions): Promis
|
|
|
77
77
|
* with it). Provider order still decides the base row (`local` first). */
|
|
78
78
|
export declare function listAllHosts(): Promise<Host[]>;
|
|
79
79
|
/**
|
|
80
|
-
* Resolve a `--
|
|
81
|
-
* caller consumes (`run --
|
|
80
|
+
* Resolve a `--device`/`--device` token for DISPATCH — the shape every offload
|
|
81
|
+
* caller consumes (`run --device`, the generic passthrough, teams placement, the
|
|
82
82
|
* cloud host provider, doctor, funnel, remote secrets). Grammar and merge come
|
|
83
83
|
* from {@link matchHost}; on top, this layer applies the device-only dispatch
|
|
84
84
|
* refusals so they hold even when an inline overlay shadows the device:
|
|
@@ -88,11 +88,11 @@ export declare function listAllHosts(): Promise<Host[]>;
|
|
|
88
88
|
* - an addressless device has nothing to dial.
|
|
89
89
|
*
|
|
90
90
|
* A bare unknown name returns null so capability-tag routing (`resolveHostByCap`,
|
|
91
|
-
* e.g. `--
|
|
91
|
+
* e.g. `--device gpu`) stays reachable, and an ad-hoc `user@host` still resolves.
|
|
92
92
|
*/
|
|
93
93
|
export declare function resolveHost(name: string): Promise<Host | null>;
|
|
94
94
|
/**
|
|
95
|
-
* Resolve a host by capability tag (e.g. `--
|
|
95
|
+
* Resolve a host by capability tag (e.g. `--device gpu`). Returns the single
|
|
96
96
|
* matching host, or throws on 0 or >1 matches unless `any` is set (then first).
|
|
97
97
|
*/
|
|
98
98
|
export declare function resolveHostByCap(cap: string, any?: boolean): Promise<Host>;
|
|
@@ -141,7 +141,7 @@ function literalHost(token, host, user) {
|
|
|
141
141
|
};
|
|
142
142
|
}
|
|
143
143
|
/**
|
|
144
|
-
* The one place a `--
|
|
144
|
+
* The one place a `--device` / `--device` token becomes a resolved host. Reads the
|
|
145
145
|
* devices registry, the agents.yaml overlay, and ssh_config, and merges them
|
|
146
146
|
* per-field (see {@link deviceHost}). One grammar for every caller: `name`,
|
|
147
147
|
* `user@name`, a tailnet FQDN, an ssh_config alias, and a literal `user@host`
|
|
@@ -236,8 +236,8 @@ export async function listAllHosts() {
|
|
|
236
236
|
return [...byName.values()].sort((a, b) => a.name.localeCompare(b.name));
|
|
237
237
|
}
|
|
238
238
|
/**
|
|
239
|
-
* Resolve a `--
|
|
240
|
-
* caller consumes (`run --
|
|
239
|
+
* Resolve a `--device`/`--device` token for DISPATCH — the shape every offload
|
|
240
|
+
* caller consumes (`run --device`, the generic passthrough, teams placement, the
|
|
241
241
|
* cloud host provider, doctor, funnel, remote secrets). Grammar and merge come
|
|
242
242
|
* from {@link matchHost}; on top, this layer applies the device-only dispatch
|
|
243
243
|
* refusals so they hold even when an inline overlay shadows the device:
|
|
@@ -247,7 +247,7 @@ export async function listAllHosts() {
|
|
|
247
247
|
* - an addressless device has nothing to dial.
|
|
248
248
|
*
|
|
249
249
|
* A bare unknown name returns null so capability-tag routing (`resolveHostByCap`,
|
|
250
|
-
* e.g. `--
|
|
250
|
+
* e.g. `--device gpu`) stays reachable, and an ad-hoc `user@host` still resolves.
|
|
251
251
|
*/
|
|
252
252
|
export async function resolveHost(name) {
|
|
253
253
|
const host = await matchHost(name);
|
|
@@ -267,7 +267,7 @@ export async function resolveHost(name) {
|
|
|
267
267
|
return host;
|
|
268
268
|
}
|
|
269
269
|
/**
|
|
270
|
-
* Resolve a host by capability tag (e.g. `--
|
|
270
|
+
* Resolve a host by capability tag (e.g. `--device gpu`). Returns the single
|
|
271
271
|
* matching host, or throws on 0 or >1 matches unless `any` is set (then first).
|
|
272
272
|
*/
|
|
273
273
|
export async function resolveHostByCap(cap, any = false) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Pure argv helpers for `--
|
|
2
|
+
* Pure argv helpers for `--device` passthrough — build the remote `agents …`
|
|
3
3
|
* invocation and strip the local-only routing flags before forwarding.
|
|
4
4
|
*
|
|
5
5
|
* Kept free of any SSH/process side effects so the two-layer quoting and the
|
|
@@ -13,7 +13,7 @@ export interface StripSpec {
|
|
|
13
13
|
long: string;
|
|
14
14
|
/** Optional single-letter short form without the dash, e.g. `H`. */
|
|
15
15
|
short?: string;
|
|
16
|
-
/** True when the flag takes a following value token (`--
|
|
16
|
+
/** True when the flag takes a following value token (`--device <name>`). */
|
|
17
17
|
takesValue: boolean;
|
|
18
18
|
}
|
|
19
19
|
/**
|
|
@@ -26,14 +26,13 @@ export interface StripSpec {
|
|
|
26
26
|
*/
|
|
27
27
|
export declare function stripRoutingFlags(args: string[], specs: StripSpec[]): string[];
|
|
28
28
|
/**
|
|
29
|
-
* The routing flags every `--
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
* binary (which would re-trigger routing).
|
|
29
|
+
* The routing flags every `--device`-capable command shares. Stripped before
|
|
30
|
+
* forwarding so the flag never leaks to the remote binary (which would
|
|
31
|
+
* re-trigger routing). `--host`/`-H` are kept for backward-compat strip only
|
|
32
|
+
* (they are no longer user-facing routing flags).
|
|
34
33
|
*/
|
|
35
34
|
export declare const HOST_ROUTING_SPECS: StripSpec[];
|
|
36
|
-
/** How one `agents run` option behaves when the run is offloaded with `--
|
|
35
|
+
/** How one `agents run` option behaves when the run is offloaded with `--device`. */
|
|
37
36
|
export type RunOptionForwarding =
|
|
38
37
|
/** Appended to the remote `agents run` argv — same behavior local or remote. */
|
|
39
38
|
'forward'
|
|
@@ -42,7 +41,7 @@ export type RunOptionForwarding =
|
|
|
42
41
|
/** Consumed by the dispatching side (routing, follow rendering, cwd portability). */
|
|
43
42
|
| 'local-only';
|
|
44
43
|
/**
|
|
45
|
-
* The forwarding contract for `agents run … --
|
|
44
|
+
* The forwarding contract for `agents run … --device`: every option of the `run`
|
|
46
45
|
* command is classified here, keyed by its commander attribute name. A
|
|
47
46
|
* commander-introspection test (run-forwarding.test.ts) fails when a run
|
|
48
47
|
* option is missing from this table, so a new option can never silently drop
|
|
@@ -161,7 +160,7 @@ export declare function windowsAgentsScript(cmd: WindowsAgentsCommand): string;
|
|
|
161
160
|
/**
|
|
162
161
|
* Build the `ssh <target> <cmd>` string for one `agents …` invocation on a
|
|
163
162
|
* Windows remote: a `powershell -NoProfile -EncodedCommand <base64>` call. The
|
|
164
|
-
* Windows counterpart of `bash -lc '<...>'`, shared by every `--
|
|
163
|
+
* Windows counterpart of `bash -lc '<...>'`, shared by every `--device` site.
|
|
165
164
|
*/
|
|
166
165
|
export declare function buildWindowsAgentsCommand(cmd: WindowsAgentsCommand): string;
|
|
167
166
|
/**
|
|
@@ -180,4 +179,5 @@ export declare function buildWindowsAgentsCommand(cmd: WindowsAgentsCommand): st
|
|
|
180
179
|
*/
|
|
181
180
|
export declare function buildWindowsStdinImportCommand(bundle: string, opts?: {
|
|
182
181
|
force?: boolean;
|
|
182
|
+
policyNever?: boolean;
|
|
183
183
|
}): string;
|