@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
|
@@ -8,10 +8,11 @@
|
|
|
8
8
|
* FleetInventory} that both the local baseline and every remote box serialize
|
|
9
9
|
* into their doctor payload; the comparator then diffs those payloads.
|
|
10
10
|
*/
|
|
11
|
-
import { getAvailableResources, getVersionHomePath, isVersionIsolated, listInstalledVersions } from '../versions.js';
|
|
11
|
+
import { getAvailableResources, getVersionHomePath, isVersionIsolated, listInstalledVersions } from '../installations/versions.js';
|
|
12
12
|
import { supports } from '../capabilities.js';
|
|
13
13
|
import { checkVersionHookWiring } from '../hooks.js';
|
|
14
|
-
import { getUserAgentsDir, getSystemAgentsDir } from '../state.js';
|
|
14
|
+
import { getUserAgentsDir, getSystemAgentsDir, readMeta } from '../state.js';
|
|
15
|
+
import { listNativeAccounts } from '../account-registry.js';
|
|
15
16
|
import { readRepoState } from '../git.js';
|
|
16
17
|
import { ALL_AGENT_IDS, accountDisplayLabel, credentialPresence, getAccountInfo, supportsAccountInspection, } from '../agents.js';
|
|
17
18
|
import { FLEET_RESOURCE_KINDS, } from './fleet-divergence.js';
|
|
@@ -43,7 +44,11 @@ export async function collectLocalFleetSignIn() {
|
|
|
43
44
|
try {
|
|
44
45
|
const info = await getAccountInfo(agent, home);
|
|
45
46
|
signedIn = info.signedIn;
|
|
46
|
-
account
|
|
47
|
+
// Prefix the durable account name when this identity has been named.
|
|
48
|
+
const display = accountDisplayLabel(info);
|
|
49
|
+
const identityKey = info.accountKey ?? info.email?.toLowerCase();
|
|
50
|
+
const saved = identityKey ? listNativeAccounts(readMeta()).find(item => item.agent === agent && item.identityKey === identityKey) : undefined;
|
|
51
|
+
account = (saved ? `${saved.name} · ${display || saved.identityLabel || identityKey}` : display) || null;
|
|
47
52
|
}
|
|
48
53
|
catch {
|
|
49
54
|
/* advisory only — treat as logged out, provability decided below */
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type AccountInfo } from '../agents.js';
|
|
2
2
|
import type { AgentId } from '../types.js';
|
|
3
|
-
import { type UsageSnapshot } from '../usage.js';
|
|
3
|
+
import { type UsageSnapshot } from '../accounting/usage.js';
|
|
4
4
|
/** An account's usage headroom rolled into one glanceable summary. */
|
|
5
5
|
export interface QuotaSummary {
|
|
6
6
|
/**
|
|
@@ -15,8 +15,10 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import chalk from 'chalk';
|
|
17
17
|
import { ALL_AGENT_IDS, accountDisplayLabel, getAccountInfo, } from '../agents.js';
|
|
18
|
-
import { deriveUsageStatusFromSnapshot, getUsageInfoByIdentity, getUsageLookupKey, } from '../usage.js';
|
|
19
|
-
import { getVersionHomePath, listInstalledVersions } from '../versions.js';
|
|
18
|
+
import { deriveUsageStatusFromSnapshot, getUsageInfoByIdentity, getUsageLookupKey, } from '../accounting/usage.js';
|
|
19
|
+
import { getVersionHomePath, listInstalledVersions } from '../installations/versions.js';
|
|
20
|
+
import { readMeta } from '../state.js';
|
|
21
|
+
import { listNativeAccounts } from '../account-registry.js';
|
|
20
22
|
/**
|
|
21
23
|
* Roll one usage snapshot into a {@link QuotaSummary}. Mirrors the blocking-window
|
|
22
24
|
* selection of {@link deriveUsageStatusFromSnapshot} (the model-specific
|
|
@@ -99,6 +101,7 @@ export async function collectLocalHarnessInventory(opts) {
|
|
|
99
101
|
const usageByKey = usageInputs.length
|
|
100
102
|
? (await getUsageInfoByIdentity(usageInputs, opts?.refresh ? { forceRefresh: true } : undefined)).usageByKey
|
|
101
103
|
: new Map();
|
|
104
|
+
const savedNative = listNativeAccounts(readMeta());
|
|
102
105
|
return pending.map(({ agent, version, info }) => {
|
|
103
106
|
const key = getUsageLookupKey(info);
|
|
104
107
|
const usage = key ? usageByKey.get(key) : undefined;
|
|
@@ -106,7 +109,10 @@ export async function collectLocalHarnessInventory(opts) {
|
|
|
106
109
|
const quota = summarizeQuota(snapshot, usage?.error ?? null, info?.usageStatus ?? null);
|
|
107
110
|
const signedIn = !!info?.signedIn;
|
|
108
111
|
const { ready, reason } = computeReady(signedIn, quota);
|
|
109
|
-
const
|
|
112
|
+
const display = info ? accountDisplayLabel(info) || null : null;
|
|
113
|
+
const identityKey = info?.accountKey ?? info?.email?.toLowerCase();
|
|
114
|
+
const saved = identityKey ? savedNative.find(item => item.agent === agent && item.identityKey === identityKey) : undefined;
|
|
115
|
+
const account = saved ? `${saved.name} · ${display || saved.identityLabel || identityKey}` : display;
|
|
110
116
|
return { agent, version, account, signedIn, quota, ready, reason };
|
|
111
117
|
});
|
|
112
118
|
}
|
|
@@ -121,6 +127,9 @@ export function groupByAccount(rows) {
|
|
|
121
127
|
const order = [];
|
|
122
128
|
const groups = new Map();
|
|
123
129
|
for (const row of rows) {
|
|
130
|
+
// Signed-out rows share one bucket under a sentinel key. Use the NUL-prefixed
|
|
131
|
+
// literal (a TS `\0` escape, NOT a raw NUL byte in the source) so the key can
|
|
132
|
+
// never collide with a real account label named literally "signed-out".
|
|
124
133
|
const key = row.account ?? '\0signed-out';
|
|
125
134
|
if (!groups.has(key)) {
|
|
126
135
|
groups.set(key, []);
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
*
|
|
13
13
|
* The learn-then-pin flow: the first `agents ssh`/fleet connection to a host is
|
|
14
14
|
* still `accept-new`, but it writes the learned key into THIS store, which pins
|
|
15
|
-
* it for every subsequent connect. Credential copies (`run --
|
|
15
|
+
* it for every subsequent connect. Credential copies (`run --device --copy-creds`)
|
|
16
16
|
* refuse to run against a host that isn't pinned here — see
|
|
17
17
|
* `commands/exec.ts` — so tokens never ride an unverified first connect.
|
|
18
18
|
*/
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The automatic-placement pool — which devices `--device auto` may pick from.
|
|
3
|
+
*
|
|
4
|
+
* One rule, in one place, so every automatic-placement path agrees: `agents run
|
|
5
|
+
* --device auto`, `agents teams add --device auto`, the generic host resolver,
|
|
6
|
+
* and the AGI EXT launch commands (which emit `--device auto` rather than
|
|
7
|
+
* scoring devices themselves) all draw from {@link filterAutoPool}.
|
|
8
|
+
*
|
|
9
|
+
* The pool is an ALLOWLIST the moment the operator marks a worker. Roles are
|
|
10
|
+
* stored in that device's tracked per-device doc
|
|
11
|
+
* (`devices/<name>/agents.yaml` `config.role`, see `lib/device-config.ts`)
|
|
12
|
+
* and sync with `agents repo push/pull`.
|
|
13
|
+
*
|
|
14
|
+
* | Fleet state | `--device auto` picks from |
|
|
15
|
+
* |---|---|
|
|
16
|
+
* | no device marked | every online device (unchanged behavior) |
|
|
17
|
+
* | some marked `worker` | ONLY those workers |
|
|
18
|
+
* | marked `personal` | never, under either state |
|
|
19
|
+
*
|
|
20
|
+
* `auto.pool all` turns the allowlist off; `personal` stays excluded, because a
|
|
21
|
+
* machine the user sits at is marked precisely so agents stay off it.
|
|
22
|
+
*
|
|
23
|
+
* Paired cockpits (an iPhone/iPad, `role: control` in the device registry, set
|
|
24
|
+
* by `agents devices pair-ios`) are excluded by the CALLER that reads the
|
|
25
|
+
* registry — `listOnlineDeviceNames` in `lib/smart-launch.ts` — not here. That
|
|
26
|
+
* role is machine-local by nature and already has a home; duplicating it in the
|
|
27
|
+
* shared config would be a second store for one concept.
|
|
28
|
+
*/
|
|
29
|
+
import { type AutoPoolMode, type ConfiguredDeviceRole } from '../device-config.js';
|
|
30
|
+
export interface AutoPoolOptions {
|
|
31
|
+
/** Pool mode; defaults to the configured `auto.pool`. */
|
|
32
|
+
mode?: AutoPoolMode;
|
|
33
|
+
/** Configured roles by device name; defaults to the fleet-shared block. */
|
|
34
|
+
roles?: Record<string, ConfiguredDeviceRole>;
|
|
35
|
+
/**
|
|
36
|
+
* Device names to resolve roles for when `roles` is not given directly —
|
|
37
|
+
* so a fleet-wide role default reaches a device with no per-device doc of
|
|
38
|
+
* its own. Ignored once `roles` is supplied. See
|
|
39
|
+
* {@link listConfiguredDeviceRoles}.
|
|
40
|
+
*/
|
|
41
|
+
roster?: string[];
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Narrow a candidate host list to the devices automatic placement may pick.
|
|
45
|
+
*
|
|
46
|
+
* Returns the input order, minus the excluded devices. An empty result is a
|
|
47
|
+
* real answer — "you marked workers and none of them is a candidate right now"
|
|
48
|
+
* — and callers surface it as their own no-healthy-device error rather than
|
|
49
|
+
* quietly widening back to the full fleet.
|
|
50
|
+
*/
|
|
51
|
+
export declare function filterAutoPool(pool: string[], opts?: AutoPoolOptions): string[];
|
|
52
|
+
/** True when this host is one automatic placement may pick. */
|
|
53
|
+
export declare function isAutoPoolMember(host: string, opts?: AutoPoolOptions): boolean;
|
|
54
|
+
/** Device names explicitly marked `worker`, in registry order. */
|
|
55
|
+
export declare function listWorkerDevices(opts?: Pick<AutoPoolOptions, 'roles'>): string[];
|
|
56
|
+
/**
|
|
57
|
+
* One line naming why the pool is what it is, for the `--device auto` banner and
|
|
58
|
+
* the no-healthy-device error. Empty string when no role narrows anything, so
|
|
59
|
+
* callers can append it unconditionally.
|
|
60
|
+
*/
|
|
61
|
+
export declare function describeAutoPool(opts?: AutoPoolOptions): string;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The automatic-placement pool — which devices `--device auto` may pick from.
|
|
3
|
+
*
|
|
4
|
+
* One rule, in one place, so every automatic-placement path agrees: `agents run
|
|
5
|
+
* --device auto`, `agents teams add --device auto`, the generic host resolver,
|
|
6
|
+
* and the AGI EXT launch commands (which emit `--device auto` rather than
|
|
7
|
+
* scoring devices themselves) all draw from {@link filterAutoPool}.
|
|
8
|
+
*
|
|
9
|
+
* The pool is an ALLOWLIST the moment the operator marks a worker. Roles are
|
|
10
|
+
* stored in that device's tracked per-device doc
|
|
11
|
+
* (`devices/<name>/agents.yaml` `config.role`, see `lib/device-config.ts`)
|
|
12
|
+
* and sync with `agents repo push/pull`.
|
|
13
|
+
*
|
|
14
|
+
* | Fleet state | `--device auto` picks from |
|
|
15
|
+
* |---|---|
|
|
16
|
+
* | no device marked | every online device (unchanged behavior) |
|
|
17
|
+
* | some marked `worker` | ONLY those workers |
|
|
18
|
+
* | marked `personal` | never, under either state |
|
|
19
|
+
*
|
|
20
|
+
* `auto.pool all` turns the allowlist off; `personal` stays excluded, because a
|
|
21
|
+
* machine the user sits at is marked precisely so agents stay off it.
|
|
22
|
+
*
|
|
23
|
+
* Paired cockpits (an iPhone/iPad, `role: control` in the device registry, set
|
|
24
|
+
* by `agents devices pair-ios`) are excluded by the CALLER that reads the
|
|
25
|
+
* registry — `listOnlineDeviceNames` in `lib/smart-launch.ts` — not here. That
|
|
26
|
+
* role is machine-local by nature and already has a home; duplicating it in the
|
|
27
|
+
* shared config would be a second store for one concept.
|
|
28
|
+
*/
|
|
29
|
+
import { autoPoolMode, listConfiguredDeviceRoles } from '../device-config.js';
|
|
30
|
+
import { normalizeHost } from '../machine-id.js';
|
|
31
|
+
/** Roles that automatic placement never picks, whatever the pool mode. */
|
|
32
|
+
const NEVER_AUTO = new Set(['personal']);
|
|
33
|
+
/**
|
|
34
|
+
* Narrow a candidate host list to the devices automatic placement may pick.
|
|
35
|
+
*
|
|
36
|
+
* Returns the input order, minus the excluded devices. An empty result is a
|
|
37
|
+
* real answer — "you marked workers and none of them is a candidate right now"
|
|
38
|
+
* — and callers surface it as their own no-healthy-device error rather than
|
|
39
|
+
* quietly widening back to the full fleet.
|
|
40
|
+
*/
|
|
41
|
+
export function filterAutoPool(pool, opts = {}) {
|
|
42
|
+
const roles = opts.roles ?? listConfiguredDeviceRoles(opts.roster ?? pool);
|
|
43
|
+
const byHost = new Map(Object.entries(roles).map(([name, role]) => [normalizeHost(name), role]));
|
|
44
|
+
const roleOf = (host) => byHost.get(normalizeHost(host));
|
|
45
|
+
const eligible = pool.filter((host) => {
|
|
46
|
+
const role = roleOf(host);
|
|
47
|
+
return role === undefined || !NEVER_AUTO.has(role);
|
|
48
|
+
});
|
|
49
|
+
const mode = opts.mode ?? autoPoolMode();
|
|
50
|
+
if (mode === 'all')
|
|
51
|
+
return eligible;
|
|
52
|
+
const anyWorkerMarked = [...byHost.values()].some((role) => role === 'worker');
|
|
53
|
+
if (!anyWorkerMarked)
|
|
54
|
+
return eligible;
|
|
55
|
+
return eligible.filter((host) => roleOf(host) === 'worker');
|
|
56
|
+
}
|
|
57
|
+
/** True when this host is one automatic placement may pick. */
|
|
58
|
+
export function isAutoPoolMember(host, opts = {}) {
|
|
59
|
+
return filterAutoPool([host], opts).length > 0;
|
|
60
|
+
}
|
|
61
|
+
/** Device names explicitly marked `worker`, in registry order. */
|
|
62
|
+
export function listWorkerDevices(opts = {}) {
|
|
63
|
+
const roles = opts.roles ?? listConfiguredDeviceRoles();
|
|
64
|
+
return Object.entries(roles)
|
|
65
|
+
.filter(([, role]) => role === 'worker')
|
|
66
|
+
.map(([name]) => name);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* One line naming why the pool is what it is, for the `--device auto` banner and
|
|
70
|
+
* the no-healthy-device error. Empty string when no role narrows anything, so
|
|
71
|
+
* callers can append it unconditionally.
|
|
72
|
+
*/
|
|
73
|
+
export function describeAutoPool(opts = {}) {
|
|
74
|
+
const roles = opts.roles ?? listConfiguredDeviceRoles(opts.roster);
|
|
75
|
+
const mode = opts.mode ?? autoPoolMode();
|
|
76
|
+
const workers = listWorkerDevices({ roles });
|
|
77
|
+
if (mode === 'all') {
|
|
78
|
+
return workers.length > 0 ? 'auto.pool=all (worker marks ignored)' : '';
|
|
79
|
+
}
|
|
80
|
+
if (workers.length === 0)
|
|
81
|
+
return '';
|
|
82
|
+
return `workers: ${workers.join(', ')}`;
|
|
83
|
+
}
|
|
@@ -112,7 +112,7 @@ export declare function shellForPlatform(platform: DevicePlatform): DeviceShell;
|
|
|
112
112
|
export declare function loadDevices(): Promise<DeviceRegistry>;
|
|
113
113
|
/**
|
|
114
114
|
* Synchronous {@link loadDevices} for callers already on a sync path (e.g. the
|
|
115
|
-
* `agents sessions --
|
|
115
|
+
* `agents sessions --device` fan-out builds its ssh command strings synchronously
|
|
116
116
|
* and only needs the target's platform to pick POSIX vs PowerShell). Same
|
|
117
117
|
* missing-file/corruption contract as {@link loadDevices}.
|
|
118
118
|
*/
|
|
@@ -164,7 +164,7 @@ export async function loadDevices() {
|
|
|
164
164
|
}
|
|
165
165
|
/**
|
|
166
166
|
* Synchronous {@link loadDevices} for callers already on a sync path (e.g. the
|
|
167
|
-
* `agents sessions --
|
|
167
|
+
* `agents sessions --device` fan-out builds its ssh command strings synchronously
|
|
168
168
|
* and only needs the target's platform to pick POSIX vs PowerShell). Same
|
|
169
169
|
* missing-file/corruption contract as {@link loadDevices}.
|
|
170
170
|
*/
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The effective device profile: the registry's discovery record overlaid with
|
|
3
|
-
* the operator's
|
|
4
|
-
*
|
|
3
|
+
* the operator's config (the per-device doc `devices/<name>/agents.yaml`
|
|
4
|
+
* `config:` block over central `fleet.defaults.config`).
|
|
5
5
|
*
|
|
6
6
|
* The registry (`~/.agents/.history/devices/registry.json`) stays the
|
|
7
7
|
* discovery cache — address, Tailscale snapshot, reachability, createdAt. The
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The effective device profile: the registry's discovery record overlaid with
|
|
3
|
-
* the operator's
|
|
4
|
-
*
|
|
3
|
+
* the operator's config (the per-device doc `devices/<name>/agents.yaml`
|
|
4
|
+
* `config:` block over central `fleet.defaults.config`).
|
|
5
5
|
*
|
|
6
6
|
* The registry (`~/.agents/.history/devices/registry.json`) stays the
|
|
7
7
|
* discovery cache — address, Tailscale snapshot, reachability, createdAt. The
|
|
@@ -27,7 +27,7 @@ export interface ResolvedExplicitTargetSet {
|
|
|
27
27
|
*/
|
|
28
28
|
export declare function resolveDeviceTarget(token: string, opts?: Pick<MatchHostOptions, 'resolveAuto'>): Promise<DeviceProfile | undefined>;
|
|
29
29
|
/**
|
|
30
|
-
* Resolve an explicit `--
|
|
30
|
+
* Resolve an explicit `--device`/`--device` list to dialable targets. A token that
|
|
31
31
|
* fails the injection guard or names nothing reachable is skipped with a stderr
|
|
32
32
|
* note (never fatal — one bad token must not blank the fan-out). Shared by every
|
|
33
33
|
* cross-machine fan-out so they can never diverge onto two routes.
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Fan-out + `agents ssh` adapters over the single host/device resolver.
|
|
3
3
|
*
|
|
4
|
-
* Every `--
|
|
4
|
+
* Every `--device` / `--device` token becomes a concrete target through one core,
|
|
5
5
|
* {@link matchHost} in ../hosts/registry.ts — the merged directory that reads the
|
|
6
6
|
* devices registry, the agents.yaml overlay, AND ssh_config (RUSH-1967). This
|
|
7
7
|
* module is only the two thin adapters the fan-out and interactive-ssh paths
|
|
8
8
|
* need on top of that core:
|
|
9
9
|
* - {@link resolveExplicitTargets} — a token list → dialable `{target, machine,
|
|
10
|
-
* name, os}` rows, so `sessions --
|
|
11
|
-
* dial the exact same address (and machine id) `run --
|
|
10
|
+
* name, os}` rows, so `sessions --device` / session bundles / remote agents-json
|
|
11
|
+
* dial the exact same address (and machine id) `run --device` does.
|
|
12
12
|
* - {@link resolveDeviceTarget} — a token → the full {@link DeviceProfile}
|
|
13
13
|
* `agents ssh` needs (auth, shell, tailscale metadata), with the same
|
|
14
14
|
* grammar; a bare unregistered alias returns undefined ("Unknown device").
|
|
@@ -98,7 +98,7 @@ export async function resolveDeviceTarget(token, opts = {}) {
|
|
|
98
98
|
return undefined;
|
|
99
99
|
}
|
|
100
100
|
/**
|
|
101
|
-
* Resolve an explicit `--
|
|
101
|
+
* Resolve an explicit `--device`/`--device` list to dialable targets. A token that
|
|
102
102
|
* fails the injection guard or names nothing reachable is skipped with a stderr
|
|
103
103
|
* note (never fatal — one bad token must not blank the fan-out). Shared by every
|
|
104
104
|
* cross-machine fan-out so they can never diverge onto two routes.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* True when `name` refers to the local machine. Case-insensitive and
|
|
3
|
-
* trailing-dot-tolerant. Use this everywhere a `--
|
|
3
|
+
* trailing-dot-tolerant. Use this everywhere a `--device`/fleet target is compared
|
|
4
4
|
* against "self" so a tailscale-name reference short-circuits to a local run
|
|
5
5
|
* instead of self-SSHing.
|
|
6
6
|
*/
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
* "Is this hostname the local machine?" — matched against every identity the box
|
|
3
3
|
* answers to, not just its short id.
|
|
4
4
|
*
|
|
5
|
-
* The self-checks that gate `--
|
|
5
|
+
* The self-checks that gate `--device` dispatch and the fleet-health fan-out used to
|
|
6
6
|
* compare only against {@link machineId} (the lowercased short hostname, e.g.
|
|
7
7
|
* `zion`). A caller that referenced the box by its **tailscale MagicDNS name**
|
|
8
8
|
* (`zion.tail1a85a1.ts.net`) — which is exactly what `fleetDialTarget` and the
|
|
9
|
-
* Factory floor's `--
|
|
9
|
+
* Factory floor's `--device` probes use — slipped past the check and SSH'd to the
|
|
10
10
|
* LOCAL box over its own tailscale name. On a loaded machine that self-SSH'd
|
|
11
11
|
* `doctor --json` orphaned on timeout and piled up until the host was crushed
|
|
12
12
|
* (RUSH-2114). Matching the full identity set closes that gap at the source.
|
|
@@ -45,7 +45,7 @@ function selfAliases() {
|
|
|
45
45
|
}
|
|
46
46
|
/**
|
|
47
47
|
* True when `name` refers to the local machine. Case-insensitive and
|
|
48
|
-
* trailing-dot-tolerant. Use this everywhere a `--
|
|
48
|
+
* trailing-dot-tolerant. Use this everywhere a `--device`/fleet target is compared
|
|
49
49
|
* against "self" so a tailscale-name reference short-circuits to a local run
|
|
50
50
|
* instead of self-SSHing.
|
|
51
51
|
*/
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Writing a managed include (e.g. `~/.ssh/config.d/agents`) makes every tool
|
|
5
5
|
* that speaks ssh — plain `ssh`/`scp`/`rsync`/`git`, and `agents sessions
|
|
6
|
-
* --
|
|
6
|
+
* --device` — resolve the registry's logical device names transparently, without
|
|
7
7
|
* each of them learning about the registry. `agents ssh` stays the value-add
|
|
8
8
|
* layer (preflight, password-from-bundle auth, platform-aware exec) on top.
|
|
9
9
|
*
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* - **`--refresh` / `--live`:** skip the cache and live-probe every device,
|
|
16
16
|
* rewriting the cache.
|
|
17
17
|
*
|
|
18
|
-
* The daemon warms this cache (~every 3 min, see `lib/daemon.ts
|
|
18
|
+
* The daemon warms this cache (~every 3 min, see `lib/daemon/daemon.ts
|
|
19
19
|
* runFleetCacheWarm`), so in steady state a default read has zero
|
|
20
20
|
* remote ssh round-trips and returns immediately with data that is at most a
|
|
21
21
|
* few minutes old — surfaced to the user as an "as of …" freshness note.
|
|
@@ -6,7 +6,7 @@ import type { PendingDevice } from './pending.js';
|
|
|
6
6
|
* node's OS and address but NOT the account you ssh in as, so we materialize the
|
|
7
7
|
* local operator's username — tailnet devices are overwhelmingly one person's
|
|
8
8
|
* boxes, and this is exactly the account ssh would already fall back to. Pinning
|
|
9
|
-
* it in the registry makes `--
|
|
9
|
+
* it in the registry makes `--device <device>` dial that account no matter which
|
|
10
10
|
* machine launches the fan-out (a peer whose local user differs otherwise dials
|
|
11
11
|
* the wrong account). Returns undefined when the username isn't a safe ssh
|
|
12
12
|
* identifier, so a weird value never lands in the registry. */
|
|
@@ -40,6 +40,8 @@ export interface DeviceSyncResult {
|
|
|
40
40
|
ok: boolean;
|
|
41
41
|
/** Number of tailscale nodes upserted into the registry. */
|
|
42
42
|
synced: number;
|
|
43
|
+
/** Names upserted, for explicit onboarding surfaces to persist approval. */
|
|
44
|
+
syncedNames: string[];
|
|
43
45
|
/** Nodes discovered but neither registered-before nor ignored (name+platform). */
|
|
44
46
|
pending: PendingDevice[];
|
|
45
47
|
/** Populated when ok is false: why discovery was skipped. */
|
package/dist/lib/devices/sync.js
CHANGED
|
@@ -22,7 +22,7 @@ import { nodeToDeviceInput, parseTailscaleStatus, tailscaleStatusJson, } from '.
|
|
|
22
22
|
* node's OS and address but NOT the account you ssh in as, so we materialize the
|
|
23
23
|
* local operator's username — tailnet devices are overwhelmingly one person's
|
|
24
24
|
* boxes, and this is exactly the account ssh would already fall back to. Pinning
|
|
25
|
-
* it in the registry makes `--
|
|
25
|
+
* it in the registry makes `--device <device>` dial that account no matter which
|
|
26
26
|
* machine launches the fan-out (a peer whose local user differs otherwise dials
|
|
27
27
|
* the wrong account). Returns undefined when the username isn't a safe ssh
|
|
28
28
|
* identifier, so a weird value never lands in the registry. */
|
|
@@ -138,11 +138,11 @@ export async function runDeviceSync(opts = {}) {
|
|
|
138
138
|
const input = withDefaultUser(nodeToDeviceInput(node), registeredBefore[node.name]?.user, localUser);
|
|
139
139
|
await upsertDevice(node.name, input);
|
|
140
140
|
}
|
|
141
|
-
return { ok: true, synced: toUpsert.length, pending };
|
|
141
|
+
return { ok: true, synced: toUpsert.length, syncedNames: toUpsert.map((node) => node.name), pending };
|
|
142
142
|
}
|
|
143
143
|
catch (err) {
|
|
144
144
|
if (opts.soft) {
|
|
145
|
-
return { ok: false, synced: 0, pending: [], reason: err?.message ?? String(err) };
|
|
145
|
+
return { ok: false, synced: 0, syncedNames: [], pending: [], reason: err?.message ?? String(err) };
|
|
146
146
|
}
|
|
147
147
|
throw err;
|
|
148
148
|
}
|
package/dist/lib/doctor-diff.js
CHANGED
|
@@ -24,15 +24,15 @@ import * as path from 'path';
|
|
|
24
24
|
import { AGENTS, agentConfigDirName } from './agents.js';
|
|
25
25
|
import { getProjectAgentsDir, getUserAgentsDir, getSystemAgentsDir, getEnabledExtraRepos, getResolvedRulesDir, getUserRulesDir, getEffectivePromptcutsPath, getActiveRulesPreset, } from './state.js';
|
|
26
26
|
import { composeRulesFromState } from './rules/compose.js';
|
|
27
|
-
import { getAvailableResources, getActuallySyncedResources, getVersionHomePath, compareVersions, } from './versions.js';
|
|
28
|
-
import { discoverPlugins, marketplaceSpecForName } from './plugins.js';
|
|
29
|
-
import { pluginInstallDir, repairableManifestFields } from './plugin-marketplace.js';
|
|
27
|
+
import { getAvailableResources, getActuallySyncedResources, getVersionHomePath, compareVersions, } from './installations/versions.js';
|
|
28
|
+
import { discoverPlugins, marketplaceSpecForName } from './plugins/plugins.js';
|
|
29
|
+
import { pluginInstallDir, repairableManifestFields } from './plugins/plugin-marketplace.js';
|
|
30
30
|
import { markdownToToml } from './convert.js';
|
|
31
31
|
import { listCommandsInVersionHome, getVersionCommandsDir, listPluginCommandNames } from './commands.js';
|
|
32
32
|
import { shouldInstallCommandAsSkill, commandSkillMatches, commandSkillName } from './command-skills.js';
|
|
33
33
|
import { gooseCommandMatches, gooseCommandsDir } from './goose-commands.js';
|
|
34
34
|
import { supports } from './capabilities.js';
|
|
35
|
-
import { listSkillsInVersionHome, getVersionSkillsDir } from './skills.js';
|
|
35
|
+
import { listSkillsInVersionHome, getVersionSkillsDir } from './plugins/skills.js';
|
|
36
36
|
import { listHookEntriesFromDir } from './hooks.js';
|
|
37
37
|
import { getResourceInventory } from './resource-inventory.js';
|
|
38
38
|
const RULES_DOC_FILENAME = 'README.md';
|
package/dist/lib/drift-sync.js
CHANGED
|
@@ -20,8 +20,8 @@ import { select, confirm } from '@inquirer/prompts';
|
|
|
20
20
|
import { AGENTS } from './agents.js';
|
|
21
21
|
import { pullRepo } from './git.js';
|
|
22
22
|
import { heal } from './heal.js';
|
|
23
|
-
import { promptAgentVersionSelection } from './versions.js';
|
|
24
|
-
import { isInteractiveTerminal, isPromptCancelled } from '
|
|
23
|
+
import { promptAgentVersionSelection } from './installations/versions.js';
|
|
24
|
+
import { isInteractiveTerminal, isPromptCancelled } from './format.js';
|
|
25
25
|
import { computeSyncStatus, } from './sync-status.js';
|
|
26
26
|
const agentName = (id) => AGENTS[id]?.name ?? id;
|
|
27
27
|
/** "claude@2.1.170 2 drifted · 1 missing" for one version. */
|
package/dist/lib/drift.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { ALL_AGENT_IDS } from './agents.js';
|
|
2
|
-
import { getGlobalDefault, listInstalledVersions } from './versions.js';
|
|
2
|
+
import { getGlobalDefault, listInstalledVersions } from './installations/versions.js';
|
|
3
3
|
import { loadManifest, isStale } from './staleness/index.js';
|
|
4
4
|
import { diffVersionResources } from './doctor-diff.js';
|
|
5
5
|
import { diffVersionCommands, iterCommandsCapableVersions } from './commands.js';
|
|
6
|
-
import { diffVersionSkills, iterSkillsCapableVersions } from './skills.js';
|
|
6
|
+
import { diffVersionSkills, iterSkillsCapableVersions } from './plugins/skills.js';
|
|
7
7
|
import { iterHooksCapableVersions, listUnmanagedHooksInVersionHome, checkVersionHookWiring } from './hooks.js';
|
|
8
8
|
import { commitsBehindUpstream } from './git.js';
|
|
9
9
|
import { getUserAgentsDir, getSystemAgentsDir, getEnabledExtraRepos } from './state.js';
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* event reader. One vocabulary maps onto existing filters (includeActivity,
|
|
4
4
|
* eventTypes, level) so the engine stays single-path.
|
|
5
5
|
*/
|
|
6
|
-
import type { EventType } from './events.js';
|
|
6
|
+
import type { EventType } from './feed/events.js';
|
|
7
7
|
import type { UnifiedQuery } from './event-stream.js';
|
|
8
8
|
export declare const EVENT_FAMILIES: readonly ["ops", "activity", "commands", "runs", "security"];
|
|
9
9
|
export type EventFamily = (typeof EVENT_FAMILIES)[number];
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* per-session shards (high frequency, one writer each). This module is the
|
|
12
12
|
* single READ surface that merges them; nothing here writes.
|
|
13
13
|
*/
|
|
14
|
-
import { type EventRecord, type EventType, type EventLevel } from './events.js';
|
|
14
|
+
import { type EventRecord, type EventType, type EventLevel } from './feed/events.js';
|
|
15
15
|
import { type EventFamily } from './event-families.js';
|
|
16
16
|
export interface UnifiedQuery {
|
|
17
17
|
startDate?: Date;
|
package/dist/lib/event-stream.js
CHANGED
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
* per-session shards (high frequency, one writer each). This module is the
|
|
12
12
|
* single READ surface that merges them; nothing here writes.
|
|
13
13
|
*/
|
|
14
|
-
import { query, levelFor } from './events.js';
|
|
15
|
-
import { readActivityAsEventRecords } from './activity.js';
|
|
14
|
+
import { query, levelFor } from './feed/events.js';
|
|
15
|
+
import { readActivityAsEventRecords } from './feed/activity.js';
|
|
16
16
|
import { applyFamilies } from './event-families.js';
|
|
17
17
|
/** Apply the same filters query() applies, to an activity-derived record. */
|
|
18
18
|
function matches(r, q) {
|
|
@@ -17,8 +17,8 @@
|
|
|
17
17
|
* Pure except for the two writers it calls, so the routing and validation rules
|
|
18
18
|
* below are unit-testable against a temp events path + activity root.
|
|
19
19
|
*/
|
|
20
|
-
import { emit, isEventType, } from './events.js';
|
|
21
|
-
import { appendActivityEvent, tierForEvent, } from './activity.js';
|
|
20
|
+
import { emit, isEventType, } from './feed/events.js';
|
|
21
|
+
import { appendActivityEvent, tierForEvent, } from './feed/activity.js';
|
|
22
22
|
/** Envelope keys an incoming line may set directly; everything else is payload. */
|
|
23
23
|
const ENVELOPE_KEYS = [
|
|
24
24
|
'event', 'ts', 'sessionId', 'mailboxId', 'terminalId', 'launchId', 'tmuxPane',
|
package/dist/lib/exec.d.ts
CHANGED
|
@@ -161,7 +161,7 @@ export interface ExecOptions {
|
|
|
161
161
|
captureStdoutTail?: boolean;
|
|
162
162
|
/**
|
|
163
163
|
* Print the run's resolved session id to stdout as a one-line sentinel once the
|
|
164
|
-
* child exits (see hosts/session-marker.ts). Set by the `--
|
|
164
|
+
* child exits (see hosts/session-marker.ts). Set by the `--device` dispatch so the
|
|
165
165
|
* LAUNCHER can relate the remote-created session back to itself — Claude's id is
|
|
166
166
|
* forced up front, but every other agent coins its own id on the remote box, and
|
|
167
167
|
* this marker is how that id rides the followed log home. Headless-only and inert
|
|
@@ -219,10 +219,10 @@ export declare function parseExecEnv(entries: string[]): Record<string, string>
|
|
|
219
219
|
* alongside the agent's real session id (terminals/sessions/<pid>.json), so it
|
|
220
220
|
* is what maps a launch to its exact session even when the hook runs under a
|
|
221
221
|
* different pid (tmux pane leaf / cmd.exe wrapper) — and, across an SSH hop, what
|
|
222
|
-
* lets a `--
|
|
222
|
+
* lets a `--device` launcher resolve the remote-coined id for agents that never
|
|
223
223
|
* accept a forced `--session-id`.
|
|
224
224
|
*
|
|
225
|
-
* ADOPT a caller-supplied `AGENT_LAUNCH_ID` (a `--
|
|
225
|
+
* ADOPT a caller-supplied `AGENT_LAUNCH_ID` (a `--device` launcher forwards one via
|
|
226
226
|
* `--env` so it controls the key end-to-end); MINT a fresh one otherwise (every
|
|
227
227
|
* local run, which passes none). A malformed inbound value is ignored in favour
|
|
228
228
|
* of a fresh mint — the key must be a real correlation id, never an empty string.
|
|
@@ -365,7 +365,7 @@ export declare function shouldRecapDeadPane(status: number | undefined, interact
|
|
|
365
365
|
* Why this is not `status ?? 0`: an interactive run whose tmux server died mid-
|
|
366
366
|
* work landed on exactly those unknown branches and returned 0, so `agents run`
|
|
367
367
|
* printed a failure banner while handing its caller a success code. The same
|
|
368
|
-
* "1 if unknown" rule already governs the `--
|
|
368
|
+
* "1 if unknown" rule already governs the `--device` follow path
|
|
369
369
|
* (`docs/specifications.md` §Agent execution, exit-code table).
|
|
370
370
|
*
|
|
371
371
|
* @param pane What `paneExitStatus` read back for the agent pane.
|
|
@@ -398,6 +398,8 @@ export interface TmuxWrapContext {
|
|
|
398
398
|
raw: boolean;
|
|
399
399
|
/** The AGENTS_NO_TMUX=1 escape hatch. */
|
|
400
400
|
noTmuxEnv: boolean;
|
|
401
|
+
/** This device's `tmux.enabled` config — false turns the wrap off for every launch on this box. */
|
|
402
|
+
configEnabled: boolean;
|
|
401
403
|
/** Whether a tmux binary is on PATH. */
|
|
402
404
|
tmuxAvailable: boolean;
|
|
403
405
|
}
|
|
@@ -410,12 +412,13 @@ export interface TmuxWrapContext {
|
|
|
410
412
|
* focus` re-attach a live session without forking it. Pure so the gate is unit-
|
|
411
413
|
* tested independently of the (side-effecting) spawn.
|
|
412
414
|
*
|
|
413
|
-
* All
|
|
415
|
+
* All seven guards must pass:
|
|
414
416
|
* - interactive — a headless `-p` run has no TTY to attach; keep bare spawn.
|
|
415
417
|
* - not Windows — no tmux path on win32.
|
|
416
418
|
* - not already in tmux — nesting tmux-in-tmux is pointless and confusing.
|
|
417
419
|
* - not --raw — explicit opt-out.
|
|
418
420
|
* - not AGENTS_NO_TMUX=1 — env opt-out (CI, scripts, the shim passthrough path).
|
|
421
|
+
* - tmux.enabled — this device's durable opt-out, for a box whose tmux is broken.
|
|
419
422
|
* - tmux installed — otherwise there is nothing to wrap with.
|
|
420
423
|
*/
|
|
421
424
|
export declare function shouldWrapInTmux(ctx: TmuxWrapContext): boolean;
|