@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
package/dist/lib/project-root.js
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* launch inside (the directory ABOVE the git root) and cached in `agents.yaml`
|
|
8
8
|
* so later runs resolve a bare slug from anywhere. It is stored home-relative
|
|
9
9
|
* (`~/…`) when it sits under `$HOME`, so the SAME value resolves on a remote
|
|
10
|
-
* host whose home differs (`/home/<user>` vs `/Users/<user>`): a `--
|
|
10
|
+
* host whose home differs (`/home/<user>` vs `/Users/<user>`): a `--device` run
|
|
11
11
|
* keeps the `~` and lets the remote login shell expand it (see `remoteCdPrefix`
|
|
12
12
|
* in `hosts/dispatch.ts`), while a local run expands `~` against the local home.
|
|
13
13
|
*/
|
|
@@ -80,7 +80,7 @@ export function homeRemainder(p) {
|
|
|
80
80
|
* caller gave no `--cwd`/`--remote-cwd` (and for an interactive `agents ssh`
|
|
81
81
|
* login with no command).
|
|
82
82
|
*
|
|
83
|
-
* Without this a `--
|
|
83
|
+
* Without this a `--device` run — or an `agents ssh <device>` login — lands in the
|
|
84
84
|
* remote `$HOME`, so an agent launched from a repo starts with no project
|
|
85
85
|
* context and the user has to `cd` by hand. Only a cwd under the LOCAL home is
|
|
86
86
|
* mirrored — that is the part with a meaningful remote analogue (`~/src/x`
|
|
@@ -15,7 +15,7 @@ import { execFile } from 'child_process';
|
|
|
15
15
|
import { promisify } from 'util';
|
|
16
16
|
import chalk from 'chalk';
|
|
17
17
|
import { projectNameForCwd } from './projects.js';
|
|
18
|
-
import { readRecentActivity } from './activity.js';
|
|
18
|
+
import { readRecentActivity } from './feed/activity.js';
|
|
19
19
|
const execFileAsync = promisify(execFile);
|
|
20
20
|
/**
|
|
21
21
|
* How many recent merges `gh` is asked for. A repo busy enough that all of them
|
package/dist/lib/projects.d.ts
CHANGED
|
@@ -40,6 +40,18 @@ export interface ProjectRepo {
|
|
|
40
40
|
*/
|
|
41
41
|
path?: string;
|
|
42
42
|
}
|
|
43
|
+
/**
|
|
44
|
+
* One checkout target for `projects pull`: a home-relative path plus the
|
|
45
|
+
* expected GitHub slug so the pull step can verify the remote matches before
|
|
46
|
+
* fast-forwarding. `expectedSlug` is absent when a bound dir has no declared
|
|
47
|
+
* slug (the pull still fast-forwards; it just skips the slug check).
|
|
48
|
+
*/
|
|
49
|
+
export interface ProjectRepoTarget {
|
|
50
|
+
/** Home-relative path — re-roots on each fleet device. */
|
|
51
|
+
path: string;
|
|
52
|
+
/** Expected GitHub slug (`owner/repo`) for the remote; absent = unchecked. */
|
|
53
|
+
expectedSlug?: string;
|
|
54
|
+
}
|
|
43
55
|
/**
|
|
44
56
|
* A described context anchor: a subdirectory plus what it is. Agents starting on
|
|
45
57
|
* the project read `purpose` to know where to look — an indexed starting point,
|
|
@@ -151,6 +163,17 @@ export declare function removeProjectDef(name: string): boolean;
|
|
|
151
163
|
* expanded against the local home. Returns undefined when neither is set.
|
|
152
164
|
*/
|
|
153
165
|
export declare function projectBasePath(def: ProjectDef, forRemote: boolean): string | undefined;
|
|
166
|
+
/**
|
|
167
|
+
* All checkout targets for a project definition, each tagged with its expected
|
|
168
|
+
* GitHub slug. The primary root carries `def.repo`; each `repos[i].path`
|
|
169
|
+
* carries `repos[i].slug`. Paths are home-relative (re-root per fleet device)
|
|
170
|
+
* and include missing checkouts so a remote peer can answer `missing` for them.
|
|
171
|
+
*
|
|
172
|
+
* This is the single authoritative expansion for both `projects status` (via
|
|
173
|
+
* {@link projectProbeTargets}) and `projects pull`, so the two commands always
|
|
174
|
+
* operate on exactly the same set of directories.
|
|
175
|
+
*/
|
|
176
|
+
export declare function projectRepoTargetsForDef(def: ProjectDef): ProjectRepoTarget[];
|
|
154
177
|
/**
|
|
155
178
|
* The directories `projects status` probes across the fleet: the repo root plus
|
|
156
179
|
* every bound checkout, home-relative so each host re-roots them, and including
|
package/dist/lib/projects.js
CHANGED
|
@@ -317,18 +317,41 @@ function projectDirList(def, opts) {
|
|
|
317
317
|
}
|
|
318
318
|
return out;
|
|
319
319
|
}
|
|
320
|
+
/**
|
|
321
|
+
* All checkout targets for a project definition, each tagged with its expected
|
|
322
|
+
* GitHub slug. The primary root carries `def.repo`; each `repos[i].path`
|
|
323
|
+
* carries `repos[i].slug`. Paths are home-relative (re-root per fleet device)
|
|
324
|
+
* and include missing checkouts so a remote peer can answer `missing` for them.
|
|
325
|
+
*
|
|
326
|
+
* This is the single authoritative expansion for both `projects status` (via
|
|
327
|
+
* {@link projectProbeTargets}) and `projects pull`, so the two commands always
|
|
328
|
+
* operate on exactly the same set of directories.
|
|
329
|
+
*/
|
|
330
|
+
export function projectRepoTargetsForDef(def) {
|
|
331
|
+
const targets = [];
|
|
332
|
+
const seen = new Set();
|
|
333
|
+
const addTarget = (rawPath, expectedSlug) => {
|
|
334
|
+
const abs = path.resolve(expandLocalHome(rawPath));
|
|
335
|
+
if (seen.has(abs))
|
|
336
|
+
return;
|
|
337
|
+
seen.add(abs);
|
|
338
|
+
targets.push({ path: toHomeRelative(abs), expectedSlug });
|
|
339
|
+
};
|
|
340
|
+
if (def.root && def.root.length > 0)
|
|
341
|
+
addTarget(def.root, def.repo);
|
|
342
|
+
for (const r of def.repos ?? []) {
|
|
343
|
+
if (r.path && r.path.length > 0)
|
|
344
|
+
addTarget(r.path, r.slug);
|
|
345
|
+
}
|
|
346
|
+
return targets;
|
|
347
|
+
}
|
|
320
348
|
/**
|
|
321
349
|
* The directories `projects status` probes across the fleet: the repo root plus
|
|
322
350
|
* every bound checkout, home-relative so each host re-roots them, and including
|
|
323
351
|
* directories absent here so a peer can still answer `✗ missing` for them.
|
|
324
352
|
*/
|
|
325
353
|
export function projectProbeTargets(def) {
|
|
326
|
-
return
|
|
327
|
-
primary: def.root,
|
|
328
|
-
forRemote: true,
|
|
329
|
-
keepMissing: true,
|
|
330
|
-
joinSubpath: false,
|
|
331
|
-
});
|
|
354
|
+
return projectRepoTargetsForDef(def).map((t) => t.path);
|
|
332
355
|
}
|
|
333
356
|
/**
|
|
334
357
|
* The directories an agent spawned on this project should reach: the cwd first
|
package/dist/lib/refresh.d.ts
CHANGED
|
@@ -30,4 +30,15 @@ export interface RefreshOptions {
|
|
|
30
30
|
*
|
|
31
31
|
* Idempotent — safe to run repeatedly. No network operations.
|
|
32
32
|
*/
|
|
33
|
-
|
|
33
|
+
/**
|
|
34
|
+
* What a reconcile pass refused to write, so callers can report it.
|
|
35
|
+
*
|
|
36
|
+
* `refresh` used to return void, so a resource agents-cli declined to write was
|
|
37
|
+
* visible only on the interactive path — `agents sync --yes` and the
|
|
38
|
+
* `--device all` fan-out reported a clean sync (RUSH-2700).
|
|
39
|
+
*/
|
|
40
|
+
export interface RefreshResult {
|
|
41
|
+
/** User-facing sentences, one per refused resource, prefixed with the agent. */
|
|
42
|
+
declined: string[];
|
|
43
|
+
}
|
|
44
|
+
export declare function refresh(options?: RefreshOptions): Promise<RefreshResult>;
|
package/dist/lib/refresh.js
CHANGED
|
@@ -18,11 +18,11 @@ import { capableAgents } from './capabilities.js';
|
|
|
18
18
|
import { AGENTS, MANAGED_AGENT_IDS, getAllCliStates, registerMcpToTargets, agentLabel, } from './agents.js';
|
|
19
19
|
import { readManifest, MANIFEST_FILENAME } from './manifest.js';
|
|
20
20
|
import { getUserAgentsDir } from './state.js';
|
|
21
|
-
import { installVersion, listInstalledVersions, isVersionIsolated, getGlobalDefault, setGlobalDefault, getVersionHomePath, syncResourcesToVersion, getAvailableResources, getActuallySyncedResources, getNewResources, getProjectOnlyResources, hasNewResources, promptNewResourceSelection, promptResourceSelection, resolveConfiguredAgentTargets, } from './versions.js';
|
|
21
|
+
import { installVersion, listInstalledVersions, isVersionIsolated, getGlobalDefault, setGlobalDefault, getVersionHomePath, syncResourcesToVersion, getAvailableResources, getActuallySyncedResources, getNewResources, getProjectOnlyResources, hasNewResources, promptNewResourceSelection, promptResourceSelection, resolveConfiguredAgentTargets, } from './installations/versions.js';
|
|
22
22
|
import { listCliStatus, installCli, describeMethod, describeCheck, selectInstallMethod, } from './cli-resources.js';
|
|
23
23
|
import { ensureShimCurrent, isShimsInPath, addShimsToPath, getPathSetupInstructions, switchConfigSymlink, switchHomeFileSymlinks, } from './shims.js';
|
|
24
24
|
import { parseHookManifest, registerHooksToSettings } from './hooks.js';
|
|
25
|
-
import { isPromptCancelled } from '
|
|
25
|
+
import { isPromptCancelled } from './format.js';
|
|
26
26
|
/**
|
|
27
27
|
* Old repo layout stored promptcuts under claude/promptcuts.yaml (agent-scoped).
|
|
28
28
|
* The new layout is `~/.agents/.system/promptcuts.yaml` at the repo root — the
|
|
@@ -49,19 +49,15 @@ function migratePromptcutsToRoot(agentsDir, quiet = false) {
|
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
51
|
}
|
|
52
|
-
/**
|
|
53
|
-
* Re-materialize local state from declared configuration: install CLI versions,
|
|
54
|
-
* register MCP servers, sync resources to version homes, register hooks, add
|
|
55
|
-
* shims to PATH, prompt for missing defaults, install declared host-CLIs.
|
|
56
|
-
*
|
|
57
|
-
* Idempotent — safe to run repeatedly. No network operations.
|
|
58
|
-
*/
|
|
59
52
|
export async function refresh(options = {}) {
|
|
60
53
|
const { agentFilter, skipPrompts = false, skipClis = false, quiet = false } = options;
|
|
61
54
|
const agentsDir = getUserAgentsDir();
|
|
62
55
|
// Gate every human progress line so --json / fleet fan-out can parse stdout.
|
|
63
56
|
const log = (...args) => { if (!quiet)
|
|
64
57
|
console.log(...args); };
|
|
58
|
+
// Resources this pass refused to write, surfaced by the caller. An empty
|
|
59
|
+
// synced list cannot also mean "declined and here is why" (RUSH-2700).
|
|
60
|
+
const declined = [];
|
|
65
61
|
migratePromptcutsToRoot(agentsDir, quiet);
|
|
66
62
|
const manifest = readManifest(agentsDir);
|
|
67
63
|
if (!manifest) {
|
|
@@ -194,6 +190,9 @@ export async function refresh(options = {}) {
|
|
|
194
190
|
kinds.add('mcp');
|
|
195
191
|
if (syncResult.plugins.length > 0)
|
|
196
192
|
kinds.add('plugins');
|
|
193
|
+
for (const reason of syncResult.declined) {
|
|
194
|
+
declined.push(`${agentLabel(agentId)}@${ver}: ${reason}`);
|
|
195
|
+
}
|
|
197
196
|
}
|
|
198
197
|
if (kinds.size > 0) {
|
|
199
198
|
const verNote = versionsToSync.length > 1
|
|
@@ -347,4 +346,12 @@ export async function refresh(options = {}) {
|
|
|
347
346
|
log(chalk.yellow(`CLI install skipped: ${err.message}`));
|
|
348
347
|
}
|
|
349
348
|
}
|
|
349
|
+
// A resource agents-cli refused to write is reported, never swallowed —
|
|
350
|
+
// an empty synced list on its own reads as "nothing to do" (RUSH-2700).
|
|
351
|
+
if (declined.length > 0) {
|
|
352
|
+
log(chalk.yellow('Not written:'));
|
|
353
|
+
for (const reason of declined)
|
|
354
|
+
log(` ${chalk.yellow(reason)}`);
|
|
355
|
+
}
|
|
356
|
+
return { declined };
|
|
350
357
|
}
|
package/dist/lib/registry.d.ts
CHANGED
|
@@ -93,8 +93,15 @@ export declare function resolvePackage(identifier: string): Promise<ResolvedPack
|
|
|
93
93
|
/** Lowercase hex sha256 of a file's bytes. Small files only (SKILL.md). */
|
|
94
94
|
export declare function sha256OfFile(file: string): string;
|
|
95
95
|
/**
|
|
96
|
-
* Parse an 'owner/repo' slug from a git remote URL (https or scp-style ssh)
|
|
97
|
-
*
|
|
96
|
+
* Parse an 'owner/repo' slug from a git remote URL (https or scp-style ssh) or
|
|
97
|
+
* a filesystem-path remote whose path is slug-shaped (`…/github.com/owner/repo`).
|
|
98
|
+
* Returns null if the remote is not a recognizable GitHub-style shape.
|
|
99
|
+
*
|
|
100
|
+
* Backslashes are folded to forward slashes first: a real git URL never
|
|
101
|
+
* contains one, but a local-path remote on Windows does
|
|
102
|
+
* (`C:\…\github.com\org\a.git`), and without the fold the same remote that
|
|
103
|
+
* parses as `org/a` on POSIX returns null on win32 — which made the
|
|
104
|
+
* projects-pull slug verification fail closed as `blocked` there (RUSH-2694).
|
|
98
105
|
*/
|
|
99
106
|
export declare function parseOwnerRepoFromRemote(remoteUrl: string): string | null;
|
|
100
107
|
/**
|
package/dist/lib/registry.js
CHANGED
|
@@ -10,7 +10,7 @@ import * as path from 'path';
|
|
|
10
10
|
import { createHash } from 'crypto';
|
|
11
11
|
import { DEFAULT_REGISTRIES, SEEDED_REGISTRIES } from './types.js';
|
|
12
12
|
import { readMeta, writeMeta } from './state.js';
|
|
13
|
-
import { discoverSkillsFromRepo } from './skills.js';
|
|
13
|
+
import { discoverSkillsFromRepo } from './plugins/skills.js';
|
|
14
14
|
const UNSAFE_PACKAGE_SPEC_CHARS = /[;&|`$\s\x00-\x1f\x7f]/;
|
|
15
15
|
const NPM_SPEC_PATTERN = /^(@[a-z0-9][a-z0-9-_.]*\/)?[a-z0-9][a-z0-9-_.]*(@[A-Za-z0-9._+-]+)?$/;
|
|
16
16
|
const PYPI_SPEC_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]*(\[[A-Za-z0-9,_-]+\])?(==[A-Za-z0-9._-]+)?$/;
|
|
@@ -481,11 +481,18 @@ export function sha256OfFile(file) {
|
|
|
481
481
|
return createHash('sha256').update(fs.readFileSync(file)).digest('hex');
|
|
482
482
|
}
|
|
483
483
|
/**
|
|
484
|
-
* Parse an 'owner/repo' slug from a git remote URL (https or scp-style ssh)
|
|
485
|
-
*
|
|
484
|
+
* Parse an 'owner/repo' slug from a git remote URL (https or scp-style ssh) or
|
|
485
|
+
* a filesystem-path remote whose path is slug-shaped (`…/github.com/owner/repo`).
|
|
486
|
+
* Returns null if the remote is not a recognizable GitHub-style shape.
|
|
487
|
+
*
|
|
488
|
+
* Backslashes are folded to forward slashes first: a real git URL never
|
|
489
|
+
* contains one, but a local-path remote on Windows does
|
|
490
|
+
* (`C:\…\github.com\org\a.git`), and without the fold the same remote that
|
|
491
|
+
* parses as `org/a` on POSIX returns null on win32 — which made the
|
|
492
|
+
* projects-pull slug verification fail closed as `blocked` there (RUSH-2694).
|
|
486
493
|
*/
|
|
487
494
|
export function parseOwnerRepoFromRemote(remoteUrl) {
|
|
488
|
-
const s = remoteUrl.trim().replace(/\.git$/, '');
|
|
495
|
+
const s = remoteUrl.trim().replace(/\\/g, '/').replace(/\.git$/, '');
|
|
489
496
|
// https://github.com/owner/repo or git@github.com:owner/repo
|
|
490
497
|
const m = s.match(/github\.com[/:]([^/]+\/[^/]+)$/);
|
|
491
498
|
return m ? m[1] : null;
|
package/dist/lib/resources.d.ts
CHANGED
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
* Scans filesystem (source of truth) to find all installed resources for an agent.
|
|
4
4
|
*/
|
|
5
5
|
import type { AgentId } from './types.js';
|
|
6
|
-
import { type SkillParseError } from './skills.js';
|
|
6
|
+
import { type SkillParseError } from './plugins/skills.js';
|
|
7
7
|
/** Resource kind — matches the subdirectory name under each repo root. */
|
|
8
|
-
export type ResourceKind = 'commands' | 'skills' | 'hooks' | 'rules' | 'mcp' | 'clis' | 'permissions' | 'subagents' | 'workflows' | 'profiles' | 'secrets';
|
|
8
|
+
export type ResourceKind = 'commands' | 'skills' | 'hooks' | 'rules' | 'mcp' | 'clis' | 'permissions' | 'subagents' | 'workflows' | 'profiles' | 'routers' | 'secrets';
|
|
9
9
|
/** A resource resolved with its origin. */
|
|
10
10
|
export interface ResolvedResource {
|
|
11
11
|
name: string;
|
package/dist/lib/resources.js
CHANGED
|
@@ -6,10 +6,10 @@ import * as fs from 'fs';
|
|
|
6
6
|
import * as path from 'path';
|
|
7
7
|
import { AGENTS, listInstalledMcpsWithScope } from './agents.js';
|
|
8
8
|
import { listInstalledCommandsWithScope, parseCommandMetadata } from './commands.js';
|
|
9
|
-
import { listInstalledSkillsWithScope, parseSkillMetadata } from './skills.js';
|
|
9
|
+
import { listInstalledSkillsWithScope, parseSkillMetadata } from './plugins/skills.js';
|
|
10
10
|
import { listOnDiskHooks } from './resource-inventory.js';
|
|
11
11
|
import { listInstalledInstructionsWithScope } from './rules/rules.js';
|
|
12
|
-
import { getEffectiveHome } from './versions.js';
|
|
12
|
+
import { getEffectiveHome } from './installations/versions.js';
|
|
13
13
|
import { listMcpServerConfigs } from './mcp.js';
|
|
14
14
|
import { WorkflowsHandler } from './resources/workflows.js';
|
|
15
15
|
import { isCapable } from './capabilities.js';
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Router management -- named, task-typed allowlists of (harness, model/tier,
|
|
3
|
+
* account) that constrain an Agent Router decision. A router is a
|
|
4
|
+
* generalization of a profile (a profile ≡ a router pinned to one harness and
|
|
5
|
+
* one account). Stored as YAML files under ~/.agents/routers/.
|
|
6
|
+
*
|
|
7
|
+
* Routers resolve as a layered resource (project > user > system, like other
|
|
8
|
+
* resources -- see resources.ts) but are always CREATED in the user layer,
|
|
9
|
+
* mirroring profiles.ts.
|
|
10
|
+
*/
|
|
11
|
+
/** Per-harness allowlist inside a router: eligible models/tiers + linked accounts. */
|
|
12
|
+
export interface RouterHarnessAllowlist {
|
|
13
|
+
/** Concrete model ids and/or tier tokens (cheap|default|best|ultra) eligible under this router. */
|
|
14
|
+
models: string[];
|
|
15
|
+
/** Durable credential accounts eligible under this router. Routing is limited to these. */
|
|
16
|
+
accounts?: string[];
|
|
17
|
+
}
|
|
18
|
+
/** A named router: a reusable, task-typed allowlist of harnesses x models/tiers x accounts. */
|
|
19
|
+
export interface Router {
|
|
20
|
+
name: string;
|
|
21
|
+
/** Free-text task type this router serves (e.g. "research", "prod-refactor"). */
|
|
22
|
+
task?: string;
|
|
23
|
+
/** Allowlist -- only these harness x model/tier x account combos are eligible under this router. */
|
|
24
|
+
harnesses: Record<string, RouterHarnessAllowlist>;
|
|
25
|
+
/** Scoped policy weights, applied within the router (consumed by routing, a later ticket). */
|
|
26
|
+
weights?: {
|
|
27
|
+
cost?: number;
|
|
28
|
+
success?: number;
|
|
29
|
+
headroom?: number;
|
|
30
|
+
};
|
|
31
|
+
/** Opt-in re-route of a pinned target when it's exhausted (consumed by routing, a later ticket). */
|
|
32
|
+
hijack?: boolean;
|
|
33
|
+
}
|
|
34
|
+
/** Directory this machine writes router YAML files to (user layer). */
|
|
35
|
+
export declare function routersDir(): string;
|
|
36
|
+
/** Validate a router name against the allowed pattern. Throws on invalid input. */
|
|
37
|
+
export declare function validateRouterName(name: string): void;
|
|
38
|
+
/** Check whether a router resolves, project > user > system (like other resources). */
|
|
39
|
+
export declare function routerExists(name: string, cwd?: string): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* The layer a router currently resolves from ('project' | 'user' | 'system' |
|
|
42
|
+
* an extra-repo alias), or null if it doesn't resolve. `writeRouter` and
|
|
43
|
+
* `deleteRouter` only ever touch the user layer, so a caller that edits or
|
|
44
|
+
* removes a router MUST check this first -- editing a router that resolves
|
|
45
|
+
* from a non-user layer would silently write to a user-layer file that stays
|
|
46
|
+
* permanently shadowed (the edit "succeeds" but is never read back).
|
|
47
|
+
*/
|
|
48
|
+
export declare function routerSource(name: string, cwd?: string): string | null;
|
|
49
|
+
/** Read a router, resolved project > user > system. Throws if not found or malformed. */
|
|
50
|
+
export declare function readRouter(name: string, cwd?: string): Router;
|
|
51
|
+
/** Write a router to disk atomically (write-to-tmp then rename). Always writes the user layer. */
|
|
52
|
+
export declare function writeRouter(router: Router): void;
|
|
53
|
+
/** Delete a router from the user layer. Returns false if it did not exist there. */
|
|
54
|
+
export declare function deleteRouter(name: string): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Fail-loud token validation (E1 of the Agent Router spec): a router MUST NOT
|
|
57
|
+
* persist a harness id or model/tier token this machine cannot vouch for.
|
|
58
|
+
* Throws naming the first invalid token found; the caller (route.ts) never
|
|
59
|
+
* calls {@link writeRouter} when this throws, so an invalid `create`/`allow`
|
|
60
|
+
* writes nothing.
|
|
61
|
+
*
|
|
62
|
+
* A harness id must be a real, registered agent (`AGENTS` in agents.ts) --
|
|
63
|
+
* checked regardless of whether that harness is installed on this machine,
|
|
64
|
+
* since a router is fleet-wide config and the harness may only run
|
|
65
|
+
* elsewhere. A model/tier token is valid when it is one of the four
|
|
66
|
+
* cross-harness tier tokens (cheap|default|best|ultra, always installable-
|
|
67
|
+
* agnostic), OR a concrete model id this machine can actually verify: either
|
|
68
|
+
* one of the harness's resolved tier rungs (`resolveTierMap` -- covers
|
|
69
|
+
* curated/no-catalog harnesses like Droid with zero install required) or a
|
|
70
|
+
* member of its extracted catalog (`getModelCatalog`, when a version of that
|
|
71
|
+
* harness is installed here). A concrete id for a harness with neither --
|
|
72
|
+
* not installed here, no curated ladder -- cannot be verified and is
|
|
73
|
+
* rejected rather than accepted unverified.
|
|
74
|
+
*/
|
|
75
|
+
export declare function validateRouter(router: Router): void;
|
|
76
|
+
/**
|
|
77
|
+
* List every router resolved project > user > system (deduplicated union,
|
|
78
|
+
* project wins on a name collision -- same precedence as {@link resolveResource}).
|
|
79
|
+
* Malformed files are silently skipped, surfaced via `agents route show <name>`.
|
|
80
|
+
*/
|
|
81
|
+
export declare function listRouters(cwd?: string): Router[];
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Router management -- named, task-typed allowlists of (harness, model/tier,
|
|
3
|
+
* account) that constrain an Agent Router decision. A router is a
|
|
4
|
+
* generalization of a profile (a profile ≡ a router pinned to one harness and
|
|
5
|
+
* one account). Stored as YAML files under ~/.agents/routers/.
|
|
6
|
+
*
|
|
7
|
+
* Routers resolve as a layered resource (project > user > system, like other
|
|
8
|
+
* resources -- see resources.ts) but are always CREATED in the user layer,
|
|
9
|
+
* mirroring profiles.ts.
|
|
10
|
+
*/
|
|
11
|
+
import * as fs from 'fs';
|
|
12
|
+
import * as path from 'path';
|
|
13
|
+
import * as yaml from 'yaml';
|
|
14
|
+
import { getUserAgentsDir } from './state.js';
|
|
15
|
+
import { resolveResource, listResources } from './resources.js';
|
|
16
|
+
import { ALL_AGENT_IDS } from './agents.js';
|
|
17
|
+
import { isTierToken, resolveTierMap, MODEL_TIERS } from './model-tiers.js';
|
|
18
|
+
import { getModelCatalog } from './models.js';
|
|
19
|
+
import { resolveVersion } from './installations/versions.js';
|
|
20
|
+
const ROUTER_NAME_PATTERN = /^[a-z0-9][a-z0-9-_]{0,48}$/i;
|
|
21
|
+
/** Directory this machine writes router YAML files to (user layer). */
|
|
22
|
+
export function routersDir() {
|
|
23
|
+
return path.join(getUserAgentsDir(), 'routers');
|
|
24
|
+
}
|
|
25
|
+
function routerPath(name) {
|
|
26
|
+
return path.join(routersDir(), `${name}.yml`);
|
|
27
|
+
}
|
|
28
|
+
/** Validate a router name against the allowed pattern. Throws on invalid input. */
|
|
29
|
+
export function validateRouterName(name) {
|
|
30
|
+
if (!ROUTER_NAME_PATTERN.test(name)) {
|
|
31
|
+
throw new Error(`Invalid router name '${name}'. Use letters, digits, dash, underscore (max 48 chars).`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/** Check whether a router resolves, project > user > system (like other resources). */
|
|
35
|
+
export function routerExists(name, cwd) {
|
|
36
|
+
validateRouterName(name);
|
|
37
|
+
return resolveResource('routers', name, cwd) !== null;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* The layer a router currently resolves from ('project' | 'user' | 'system' |
|
|
41
|
+
* an extra-repo alias), or null if it doesn't resolve. `writeRouter` and
|
|
42
|
+
* `deleteRouter` only ever touch the user layer, so a caller that edits or
|
|
43
|
+
* removes a router MUST check this first -- editing a router that resolves
|
|
44
|
+
* from a non-user layer would silently write to a user-layer file that stays
|
|
45
|
+
* permanently shadowed (the edit "succeeds" but is never read back).
|
|
46
|
+
*/
|
|
47
|
+
export function routerSource(name, cwd) {
|
|
48
|
+
validateRouterName(name);
|
|
49
|
+
return resolveResource('routers', name, cwd)?.source ?? null;
|
|
50
|
+
}
|
|
51
|
+
function parseRouterFile(file, name) {
|
|
52
|
+
const raw = fs.readFileSync(file, 'utf-8');
|
|
53
|
+
const parsed = yaml.parse(raw);
|
|
54
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
55
|
+
throw new Error(`Router '${name}' is malformed.`);
|
|
56
|
+
}
|
|
57
|
+
if (!parsed.name)
|
|
58
|
+
parsed.name = name;
|
|
59
|
+
if (!parsed.harnesses || typeof parsed.harnesses !== 'object')
|
|
60
|
+
parsed.harnesses = {};
|
|
61
|
+
return parsed;
|
|
62
|
+
}
|
|
63
|
+
/** Read a router, resolved project > user > system. Throws if not found or malformed. */
|
|
64
|
+
export function readRouter(name, cwd) {
|
|
65
|
+
validateRouterName(name);
|
|
66
|
+
const resolved = resolveResource('routers', name, cwd);
|
|
67
|
+
if (!resolved) {
|
|
68
|
+
throw new Error(`Router '${name}' not found.`);
|
|
69
|
+
}
|
|
70
|
+
return parseRouterFile(resolved.path, name);
|
|
71
|
+
}
|
|
72
|
+
/** Write a router to disk atomically (write-to-tmp then rename). Always writes the user layer. */
|
|
73
|
+
export function writeRouter(router) {
|
|
74
|
+
validateRouterName(router.name);
|
|
75
|
+
const dir = routersDir();
|
|
76
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
77
|
+
const body = yaml.stringify(router);
|
|
78
|
+
const file = routerPath(router.name);
|
|
79
|
+
const tmp = `${file}.tmp-${process.pid}`;
|
|
80
|
+
fs.writeFileSync(tmp, body, 'utf-8');
|
|
81
|
+
fs.renameSync(tmp, file);
|
|
82
|
+
}
|
|
83
|
+
/** Delete a router from the user layer. Returns false if it did not exist there. */
|
|
84
|
+
export function deleteRouter(name) {
|
|
85
|
+
validateRouterName(name);
|
|
86
|
+
const file = routerPath(name);
|
|
87
|
+
if (!fs.existsSync(file))
|
|
88
|
+
return false;
|
|
89
|
+
fs.unlinkSync(file);
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Fail-loud token validation (E1 of the Agent Router spec): a router MUST NOT
|
|
94
|
+
* persist a harness id or model/tier token this machine cannot vouch for.
|
|
95
|
+
* Throws naming the first invalid token found; the caller (route.ts) never
|
|
96
|
+
* calls {@link writeRouter} when this throws, so an invalid `create`/`allow`
|
|
97
|
+
* writes nothing.
|
|
98
|
+
*
|
|
99
|
+
* A harness id must be a real, registered agent (`AGENTS` in agents.ts) --
|
|
100
|
+
* checked regardless of whether that harness is installed on this machine,
|
|
101
|
+
* since a router is fleet-wide config and the harness may only run
|
|
102
|
+
* elsewhere. A model/tier token is valid when it is one of the four
|
|
103
|
+
* cross-harness tier tokens (cheap|default|best|ultra, always installable-
|
|
104
|
+
* agnostic), OR a concrete model id this machine can actually verify: either
|
|
105
|
+
* one of the harness's resolved tier rungs (`resolveTierMap` -- covers
|
|
106
|
+
* curated/no-catalog harnesses like Droid with zero install required) or a
|
|
107
|
+
* member of its extracted catalog (`getModelCatalog`, when a version of that
|
|
108
|
+
* harness is installed here). A concrete id for a harness with neither --
|
|
109
|
+
* not installed here, no curated ladder -- cannot be verified and is
|
|
110
|
+
* rejected rather than accepted unverified.
|
|
111
|
+
*/
|
|
112
|
+
export function validateRouter(router) {
|
|
113
|
+
for (const [harness, allowlist] of Object.entries(router.harnesses)) {
|
|
114
|
+
if (!ALL_AGENT_IDS.includes(harness)) {
|
|
115
|
+
throw new Error(`router '${router.name}': unknown harness '${harness}'. Known harnesses: ${ALL_AGENT_IDS.join(', ')}.`);
|
|
116
|
+
}
|
|
117
|
+
const agent = harness;
|
|
118
|
+
for (const token of allowlist.models) {
|
|
119
|
+
if (isTierToken(token))
|
|
120
|
+
continue;
|
|
121
|
+
const version = resolveVersion(agent) ?? '0.0.0';
|
|
122
|
+
const tierMap = resolveTierMap(agent, version);
|
|
123
|
+
const tierRungIds = new Set(MODEL_TIERS.map((t) => tierMap[t].model).filter((m) => m !== null));
|
|
124
|
+
if (tierRungIds.has(token))
|
|
125
|
+
continue;
|
|
126
|
+
const catalog = getModelCatalog(agent, version);
|
|
127
|
+
const inCatalog = catalog
|
|
128
|
+
? catalog.models.some((m) => m.id === token) || Boolean(catalog.aliases[token])
|
|
129
|
+
: false;
|
|
130
|
+
if (inCatalog)
|
|
131
|
+
continue;
|
|
132
|
+
throw new Error(`router '${router.name}': unknown model '${token}' for harness '${harness}'. ` +
|
|
133
|
+
`Use a tier token (${MODEL_TIERS.join('|')}) or a model id '${harness}' actually ships.`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* List every router resolved project > user > system (deduplicated union,
|
|
139
|
+
* project wins on a name collision -- same precedence as {@link resolveResource}).
|
|
140
|
+
* Malformed files are silently skipped, surfaced via `agents route show <name>`.
|
|
141
|
+
*/
|
|
142
|
+
export function listRouters(cwd) {
|
|
143
|
+
const routers = [];
|
|
144
|
+
for (const resolved of listResources('routers', cwd)) {
|
|
145
|
+
try {
|
|
146
|
+
routers.push(parseRouterFile(resolved.path, resolved.name));
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
// Skip malformed router files.
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return routers.sort((a, b) => a.name.localeCompare(b.name));
|
|
153
|
+
}
|
|
@@ -253,10 +253,15 @@ export function evaluateRoutineReadiness(context, probes = {}, opts = {}) {
|
|
|
253
253
|
});
|
|
254
254
|
}
|
|
255
255
|
if (probes.agentInstalled && !probes.agentInstalled()) {
|
|
256
|
+
// A pinned version names its exact miss — "no usable version" would send the
|
|
257
|
+
// operator hunting for a harness that IS installed, just not at the pin.
|
|
258
|
+
const pinned = opts.version && opts.agent ? `${opts.agent}@${opts.version}` : undefined;
|
|
256
259
|
return withBlocker(context, {
|
|
257
260
|
code: 'agent_unavailable',
|
|
258
|
-
message:
|
|
259
|
-
|
|
261
|
+
message: pinned
|
|
262
|
+
? `pinned ${pinned} is not installed on the target`
|
|
263
|
+
: `no usable version of ${opts.agent ?? 'the agent'} is installed on the target`,
|
|
264
|
+
repair: pinned ? `agents add ${pinned}` : (opts.agent ? `agents add ${opts.agent}@<version>` : undefined),
|
|
260
265
|
});
|
|
261
266
|
}
|
|
262
267
|
if (probes.codexTrusted && context.absoluteCwd && !probes.codexTrusted(context.absoluteCwd)) {
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
* delivers.
|
|
27
27
|
*/
|
|
28
28
|
import type { Meta } from './types.js';
|
|
29
|
-
import type { JobConfig, RunMeta } from './routines.js';
|
|
29
|
+
import type { JobConfig, RunMeta } from './scheduling/routines.js';
|
|
30
30
|
/**
|
|
31
31
|
* Owner-phone text for a routine FINISH, or null when the run did NOT fail. Only
|
|
32
32
|
* `failed` and `timeout` are failures worth an owner ping — a `completed` run
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
* return `null` when the threshold says "don't notify", and are unit-tested; the
|
|
22
22
|
* `notifyRoutine*` wrappers do the filesystem read + dispatch for the daemon.
|
|
23
23
|
*/
|
|
24
|
-
import type { JobConfig, RunMeta } from './routines.js';
|
|
24
|
+
import type { JobConfig, RunMeta } from './scheduling/routines.js';
|
|
25
25
|
import { type DesktopNotification } from './menubar/notify-desktop.js';
|
|
26
26
|
type RoutineKind = 'agent' | 'workflow' | 'command';
|
|
27
27
|
/** Which flavor of routine a config/meta describes — drives the notify threshold. */
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
*/
|
|
24
24
|
import * as fs from 'fs';
|
|
25
25
|
import * as path from 'path';
|
|
26
|
-
import { getRunDir } from './routines.js';
|
|
26
|
+
import { getRunDir } from './scheduling/routines.js';
|
|
27
27
|
import { notifyDesktop } from './menubar/notify-desktop.js';
|
|
28
28
|
/** Which flavor of routine a config/meta describes — drives the notify threshold. */
|
|
29
29
|
export function routineKind(r) {
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* add/edit/doctor/resume additionally call the live variant below, which probes
|
|
10
10
|
* authentication and Codex's native workspace-trust record before activation.
|
|
11
11
|
*/
|
|
12
|
-
import type { JobConfig } from './routines.js';
|
|
12
|
+
import type { JobConfig } from './scheduling/routines.js';
|
|
13
13
|
import { type RoutineReadinessResult } from './routine-context.js';
|
|
14
14
|
/**
|
|
15
15
|
* Evaluate whether a routine is ready to activate on this box. `probeAgent`
|
|
@@ -12,9 +12,9 @@
|
|
|
12
12
|
import * as fs from 'fs';
|
|
13
13
|
import * as path from 'path';
|
|
14
14
|
import * as TOML from 'smol-toml';
|
|
15
|
-
import { resolveJobExecutionContext, resolveHostStrategy } from './routines.js';
|
|
15
|
+
import { resolveJobExecutionContext, resolveHostStrategy } from './scheduling/routines.js';
|
|
16
16
|
import { evaluateRoutineReadiness } from './routine-context.js';
|
|
17
|
-
import { getVersionHomePath, resolveVersion } from './versions.js';
|
|
17
|
+
import { getVersionHomePath, isVersionInstalled, resolveVersion } from './installations/versions.js';
|
|
18
18
|
import { probeLocalFleetAuth } from './auth-health.js';
|
|
19
19
|
import { resolveHostRunTarget } from './hosts/run-target.js';
|
|
20
20
|
import { hostIdentityArgs, sshTargetFor } from './hosts/types.js';
|
|
@@ -36,14 +36,21 @@ export function evaluateActivationReadiness(config, deps = {}) {
|
|
|
36
36
|
mode,
|
|
37
37
|
probe: mode === 'local' ? undefined : null,
|
|
38
38
|
});
|
|
39
|
-
|
|
39
|
+
// A pinned version on LOCAL placement must exist here — accepting a routine
|
|
40
|
+
// whose exact pin is absent just moves the failure to fire time (RUSH-2719).
|
|
41
|
+
// Remote host/fleet targets defer the check: their installs are unreachable
|
|
42
|
+
// from this box until the RUSH-2290 execution-context-on-target resolver.
|
|
43
|
+
const pinnedLocally = mode === 'local' ? config.version : undefined;
|
|
44
|
+
const probeAgent = deps.probeAgent ?? ((agent) => pinnedLocally
|
|
45
|
+
? isVersionInstalled(agent, pinnedLocally)
|
|
46
|
+
: resolveVersion(agent) !== undefined);
|
|
40
47
|
return evaluateRoutineReadiness(context, {
|
|
41
48
|
// Command routines have no agent to install; workflow routines dispatch
|
|
42
49
|
// through `agents run` (claude under the hood) and are checked at run time.
|
|
43
50
|
agentInstalled: config.agent && !config.workflow && !config.command
|
|
44
51
|
? () => probeAgent(config.agent)
|
|
45
52
|
: undefined,
|
|
46
|
-
}, { agent: config.agent });
|
|
53
|
+
}, { agent: config.agent, version: pinnedLocally });
|
|
47
54
|
}
|
|
48
55
|
/** One-line human summary of a blocked readiness result, with its repair. */
|
|
49
56
|
export function formatReadinessBlocker(result) {
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* fire. Cross-device double-fire is prevented by requiring a `devices` firing
|
|
10
10
|
* pin for fleet/host/cloud strategies (applied at add/sync time).
|
|
11
11
|
*/
|
|
12
|
-
import type { JobConfig } from './routines.js';
|
|
12
|
+
import type { JobConfig } from './scheduling/routines.js';
|
|
13
13
|
import { type DevicePlatform } from './devices/registry.js';
|
|
14
14
|
export type PlacementTarget = {
|
|
15
15
|
mode: 'local';
|
|
@@ -35,5 +35,15 @@ export declare function pickFleetDevice(_config?: Pick<JobConfig, 'devices'>, pl
|
|
|
35
35
|
/**
|
|
36
36
|
* Resolve where a fired job's body should execute.
|
|
37
37
|
* Throws a human-readable Error when placement cannot be satisfied.
|
|
38
|
+
*
|
|
39
|
+
* `host: 'auto'` under `hostStrategy: fleet` re-picks a healthy, signed-in,
|
|
40
|
+
* unloaded device AT EACH FIRE via the same picker `agents run --device auto`
|
|
41
|
+
* uses (`resolveDeviceAuto`), instead of `pickFleetDevice`'s
|
|
42
|
+
* first-online-by-name order. The decision is deliberately not baked in at add
|
|
43
|
+
* time — fleet health at fire time is the whole point (RUSH-2719).
|
|
38
44
|
*/
|
|
39
|
-
export declare function resolvePlacementTarget(config: JobConfig
|
|
45
|
+
export declare function resolvePlacementTarget(config: JobConfig, deps?: {
|
|
46
|
+
resolveDeviceAuto?: (agent?: string) => Promise<{
|
|
47
|
+
pickedDeviceKey: string;
|
|
48
|
+
}>;
|
|
49
|
+
}): Promise<PlacementTarget>;
|