@phnx-labs/agents-cli 1.22.34 → 1.22.37
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 +672 -2
- package/README.md +82 -35
- package/dist/bin/agents +0 -0
- package/dist/bootstrap.d.ts +15 -0
- package/dist/bootstrap.js +1211 -0
- package/dist/commands/accounts.d.ts +4 -11
- package/dist/commands/accounts.js +159 -27
- package/dist/commands/attach.js +17 -4
- package/dist/commands/audit.d.ts +8 -8
- package/dist/commands/audit.js +57 -47
- package/dist/commands/browser.js +15 -11
- package/dist/commands/cloud.js +1 -1
- package/dist/commands/commands.js +0 -11
- package/dist/commands/computer-actions.js +33 -0
- package/dist/commands/computer-sessions-picker.d.ts +21 -0
- package/dist/commands/computer-sessions-picker.js +141 -0
- package/dist/commands/computer.d.ts +16 -0
- package/dist/commands/computer.js +37 -0
- package/dist/commands/config.d.ts +17 -0
- package/dist/commands/config.js +401 -0
- package/dist/commands/cp.d.ts +84 -0
- package/dist/commands/cp.js +231 -0
- package/dist/commands/daemon.js +243 -14
- package/dist/commands/detach-core.d.ts +1 -1
- package/dist/commands/detach-core.js +12 -2
- package/dist/commands/detach.js +1 -1
- package/dist/commands/doctor.js +64 -5
- package/dist/commands/events.d.ts +24 -12
- package/dist/commands/events.js +144 -28
- package/dist/commands/exec.js +85 -41
- package/dist/commands/feed.d.ts +1 -1
- package/dist/commands/feed.js +16 -8
- package/dist/commands/focus.d.ts +33 -1
- package/dist/commands/focus.js +177 -17
- package/dist/commands/funnel.d.ts +1 -1
- package/dist/commands/go.js +9 -8
- package/dist/commands/harness-wizard.d.ts +1 -0
- package/dist/commands/harness-wizard.js +18 -20
- package/dist/commands/harness.d.ts +2 -0
- package/dist/commands/harness.js +59 -26
- package/dist/commands/hooks.js +0 -11
- package/dist/commands/inspect.d.ts +94 -1
- package/dist/commands/inspect.js +866 -40
- package/dist/commands/lease.d.ts +4 -4
- package/dist/commands/lease.js +6 -6
- package/dist/commands/login.js +0 -13
- package/dist/commands/logs.d.ts +2 -2
- package/dist/commands/logs.js +2 -2
- package/dist/commands/mcp.js +7 -2
- package/dist/commands/memory.js +7 -2
- package/dist/commands/message.d.ts +1 -1
- package/dist/commands/message.js +37 -6
- package/dist/commands/models.js +4 -0
- package/dist/commands/monitors.d.ts +0 -1
- package/dist/commands/monitors.js +199 -16
- package/dist/commands/open.d.ts +18 -0
- package/dist/commands/open.js +57 -0
- package/dist/commands/packages.js +2 -107
- package/dist/commands/plugins.js +6 -3
- package/dist/commands/profiles.d.ts +1 -0
- package/dist/commands/profiles.js +16 -160
- package/dist/commands/projects.d.ts +28 -0
- package/dist/commands/projects.js +125 -5
- package/dist/commands/reconnect.js +9 -3
- package/dist/commands/repo.js +42 -1
- package/dist/commands/resource-view.d.ts +17 -0
- package/dist/commands/resource-view.js +36 -14
- package/dist/commands/resume.js +9 -2
- package/dist/commands/routines.d.ts +0 -2
- package/dist/commands/routines.js +473 -289
- package/dist/commands/secrets.js +52 -9
- package/dist/commands/sessions-export.d.ts +47 -0
- package/dist/commands/sessions-export.js +116 -6
- package/dist/commands/sessions-import.d.ts +17 -0
- package/dist/commands/sessions-import.js +114 -6
- package/dist/commands/sessions-migrate.d.ts +27 -0
- package/dist/commands/sessions-migrate.js +50 -9
- package/dist/commands/sessions-picker.js +23 -4
- package/dist/commands/sessions-resume.d.ts +5 -3
- package/dist/commands/sessions-resume.js +30 -8
- package/dist/commands/sessions-watch.d.ts +2 -0
- package/dist/commands/sessions-watch.js +53 -0
- package/dist/commands/sessions.d.ts +66 -3
- package/dist/commands/sessions.js +298 -47
- package/dist/commands/set.d.ts +1 -1
- package/dist/commands/set.js +2 -2
- package/dist/commands/setup-browser.js +2 -2
- package/dist/commands/setup-mine.js +0 -1
- package/dist/commands/setup-preferences.js +1 -1
- package/dist/commands/setup-share.js +34 -4
- package/dist/commands/setup.d.ts +5 -0
- package/dist/commands/setup.js +26 -0
- package/dist/commands/share.d.ts +85 -0
- package/dist/commands/share.js +379 -8
- package/dist/commands/skills.js +0 -11
- package/dist/commands/snapshot.js +1 -1
- package/dist/commands/ssh.d.ts +18 -0
- package/dist/commands/ssh.js +549 -210
- package/dist/commands/sync.d.ts +5 -0
- package/dist/commands/sync.js +212 -32
- package/dist/commands/teams.d.ts +13 -0
- package/dist/commands/teams.js +187 -30
- package/dist/commands/tickets.d.ts +2 -0
- package/dist/commands/tickets.js +43 -0
- package/dist/commands/update.js +2 -4
- package/dist/commands/usage.js +5 -3
- package/dist/commands/versions.js +11 -5
- package/dist/commands/view.js +15 -7
- package/dist/commands/webhook.d.ts +2 -2
- package/dist/commands/webhook.js +7 -7
- package/dist/index.d.ts +18 -2
- package/dist/index.js +53 -1264
- package/dist/lib/account-catalog.d.ts +18 -0
- package/dist/lib/account-catalog.js +38 -0
- package/dist/lib/account-provider-registry.d.ts +18 -0
- package/dist/lib/account-provider-registry.js +59 -0
- package/dist/lib/account-registry.d.ts +40 -0
- package/dist/lib/account-registry.js +239 -0
- package/dist/lib/account-schema.d.ts +44 -0
- package/dist/lib/account-schema.js +91 -0
- package/dist/lib/account-state-service.d.ts +21 -0
- package/dist/lib/account-state-service.js +60 -0
- package/dist/lib/activity.d.ts +1 -1
- package/dist/lib/activity.js +8 -1
- package/dist/lib/add-dir.d.ts +80 -0
- package/dist/lib/add-dir.js +241 -0
- package/dist/lib/agent-cli-commands.d.ts +11 -0
- package/dist/lib/agent-cli-commands.js +30 -0
- package/dist/lib/agents.js +44 -36
- package/dist/lib/answer-router.js +1 -1
- package/dist/lib/audit/log.d.ts +10 -27
- package/dist/lib/audit/log.js +20 -33
- package/dist/lib/auth-health.d.ts +9 -2
- package/dist/lib/auth-health.js +42 -9
- package/dist/lib/auto-pull-worker.js +7 -3
- package/dist/lib/auto-pull.d.ts +44 -3
- package/dist/lib/auto-pull.js +88 -5
- package/dist/lib/binary-shadow.d.ts +28 -0
- package/dist/lib/binary-shadow.js +121 -0
- package/dist/lib/brand.js +9 -3
- package/dist/lib/browser/ipc.d.ts +30 -0
- package/dist/lib/browser/ipc.js +81 -4
- package/dist/lib/browser/profiles.d.ts +3 -2
- package/dist/lib/browser/profiles.js +65 -22
- package/dist/lib/browser/service.d.ts +4 -0
- package/dist/lib/browser/service.js +30 -3
- package/dist/lib/browser/sessions-list.d.ts +22 -2
- package/dist/lib/browser/sessions-list.js +54 -6
- package/dist/lib/browser/stream.d.ts +2 -0
- package/dist/lib/browser/stream.js +1 -0
- package/dist/lib/browser/types.d.ts +19 -0
- package/dist/lib/byok-usage.d.ts +9 -2
- package/dist/lib/byok-usage.js +133 -31
- package/dist/lib/cli-entry.d.ts +11 -0
- package/dist/lib/cli-entry.js +46 -0
- package/dist/lib/cloud/host.d.ts +1 -1
- package/dist/lib/cloud/host.js +2 -2
- package/dist/lib/cloud/registry.js +1 -1
- package/dist/lib/cloud/types.d.ts +1 -1
- package/dist/lib/codex-policy.d.ts +9 -1
- package/dist/lib/codex-policy.js +17 -2
- package/dist/lib/commands.d.ts +2 -0
- package/dist/lib/commands.js +2 -0
- package/dist/lib/computer/sessions-list.d.ts +150 -0
- package/dist/lib/computer/sessions-list.js +363 -0
- package/dist/lib/config-keys.d.ts +86 -0
- package/dist/lib/config-keys.js +193 -0
- package/dist/lib/config-machine-keys.d.ts +12 -0
- package/dist/lib/config-machine-keys.js +17 -0
- package/dist/lib/config-transfer.js +3 -4
- package/dist/lib/crabbox/cli.d.ts +2 -2
- package/dist/lib/crabbox/cli.js +3 -3
- package/dist/lib/daemon-health.d.ts +22 -0
- package/dist/lib/daemon-health.js +33 -3
- package/dist/lib/daemon-services.d.ts +50 -0
- package/dist/lib/daemon-services.js +147 -0
- package/dist/lib/daemon-ticks.d.ts +35 -66
- package/dist/lib/daemon-ticks.js +77 -159
- package/dist/lib/daemon.d.ts +72 -4
- package/dist/lib/daemon.js +792 -202
- package/dist/lib/deeplink/register.d.ts +49 -0
- package/dist/lib/deeplink/register.js +253 -0
- package/dist/lib/deeplink/url.d.ts +34 -0
- package/dist/lib/deeplink/url.js +78 -0
- package/dist/lib/device-config.d.ts +124 -29
- package/dist/lib/device-config.js +346 -141
- package/dist/lib/devices/config-migration.d.ts +42 -0
- package/dist/lib/devices/config-migration.js +203 -0
- package/dist/lib/devices/connect.js +14 -7
- package/dist/lib/devices/doctor-findings.d.ts +4 -1
- package/dist/lib/devices/doctor-findings.js +20 -1
- package/dist/lib/devices/harness-inventory.d.ts +11 -2
- package/dist/lib/devices/harness-inventory.js +0 -0
- package/dist/lib/devices/health.d.ts +1 -1
- package/dist/lib/devices/health.js +1 -1
- package/dist/lib/devices/pending.d.ts +22 -1
- package/dist/lib/devices/pending.js +67 -2
- package/dist/lib/devices/registry.d.ts +0 -25
- package/dist/lib/devices/registry.js +2 -83
- package/dist/lib/devices/resolve-profile.d.ts +20 -0
- package/dist/lib/devices/resolve-profile.js +44 -0
- package/dist/lib/devices/rollout-verify.d.ts +101 -0
- package/dist/lib/devices/rollout-verify.js +193 -0
- package/dist/lib/devices/ssh-config.js +10 -6
- package/dist/lib/event-families.d.ts +28 -0
- package/dist/lib/event-families.js +159 -0
- package/dist/lib/event-stream.d.ts +9 -1
- package/dist/lib/event-stream.js +26 -9
- package/dist/lib/events.d.ts +9 -1
- package/dist/lib/events.js +21 -6
- package/dist/lib/exec.d.ts +30 -0
- package/dist/lib/exec.js +220 -122
- package/dist/lib/feed-broadcast.d.ts +25 -0
- package/dist/lib/feed-broadcast.js +33 -0
- package/dist/lib/feed.d.ts +1 -1
- package/dist/lib/feed.js +12 -2
- package/dist/lib/fleet/capture.js +15 -0
- package/dist/lib/fleet/manifest.js +9 -0
- package/dist/lib/fleet/types.d.ts +9 -0
- package/dist/lib/fleet-status.js +10 -8
- package/dist/lib/git.d.ts +20 -6
- package/dist/lib/git.js +121 -17
- package/dist/lib/hosts/dispatch.d.ts +8 -3
- package/dist/lib/hosts/dispatch.js +29 -3
- package/dist/lib/hosts/logs.d.ts +2 -2
- package/dist/lib/hosts/logs.js +2 -2
- package/dist/lib/hosts/option.js +1 -1
- package/dist/lib/hosts/passthrough.d.ts +2 -3
- package/dist/lib/hosts/passthrough.js +10 -24
- package/dist/lib/hosts/progress.js +2 -2
- package/dist/lib/hosts/providers/devices.d.ts +3 -3
- package/dist/lib/hosts/providers/devices.js +18 -12
- package/dist/lib/hosts/ready.d.ts +5 -1
- package/dist/lib/hosts/ready.js +9 -3
- package/dist/lib/hosts/reconcile.d.ts +2 -2
- package/dist/lib/hosts/reconcile.js +2 -2
- package/dist/lib/hosts/registry.js +14 -9
- package/dist/lib/hosts/remote-cmd.js +1 -1
- package/dist/lib/hosts/remote-os.d.ts +9 -6
- package/dist/lib/hosts/remote-os.js +13 -6
- package/dist/lib/hosts/routing-flag.d.ts +23 -0
- package/dist/lib/hosts/routing-flag.js +41 -0
- package/dist/lib/hosts/run-target.js +1 -1
- package/dist/lib/hosts/session-index.js +1 -1
- package/dist/lib/hosts/tasks.d.ts +6 -6
- package/dist/lib/hosts/tasks.js +4 -4
- package/dist/lib/hosts/types.js +1 -2
- package/dist/lib/installations/resolve.js +2 -8
- package/dist/lib/isolation-boundary-report.js +0 -1
- package/dist/lib/linear-cache.d.ts +7 -0
- package/dist/lib/linear-cache.js +31 -4
- package/dist/lib/linear-project-counts.d.ts +1 -1
- package/dist/lib/linear-project-counts.js +2 -3
- package/dist/lib/linear-projects.js +1 -1
- package/dist/lib/loop.d.ts +2 -2
- package/dist/lib/loop.js +1 -1
- package/dist/lib/mailbox-target.d.ts +1 -1
- package/dist/lib/mailbox-target.js +1 -1
- package/dist/lib/manifest.js +7 -4
- 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/snapshot.d.ts +3 -2
- package/dist/lib/menubar/snapshot.js +6 -2
- package/dist/lib/migrate-fold.d.ts +33 -0
- package/dist/lib/migrate-fold.js +130 -0
- package/dist/lib/migrate.d.ts +34 -34
- package/dist/lib/migrate.js +106 -128
- package/dist/lib/model-tier-overrides.d.ts +1 -1
- package/dist/lib/model-tier-overrides.js +15 -2
- package/dist/lib/monitors/config.d.ts +17 -3
- package/dist/lib/monitors/config.js +52 -18
- package/dist/lib/monitors/engine.d.ts +32 -1
- package/dist/lib/monitors/engine.js +94 -11
- package/dist/lib/monitors/fingerprint.d.ts +46 -0
- package/dist/lib/monitors/fingerprint.js +100 -0
- package/dist/lib/monitors/remote.d.ts +47 -0
- package/dist/lib/monitors/remote.js +81 -0
- package/dist/lib/monitors/state.d.ts +39 -0
- package/dist/lib/monitors/state.js +56 -0
- package/dist/lib/onepassword.d.ts +17 -0
- package/dist/lib/onepassword.js +52 -22
- package/dist/lib/open-url.js +1 -1
- package/dist/lib/picker.d.ts +14 -2
- package/dist/lib/picker.js +35 -13
- package/dist/lib/placement.d.ts +1 -1
- package/dist/lib/placement.js +1 -1
- package/dist/lib/pr-land-detach.d.ts +32 -0
- package/dist/lib/pr-land-detach.js +79 -0
- package/dist/lib/profiles-presets.js +13 -0
- package/dist/lib/profiles.d.ts +2 -0
- package/dist/lib/profiles.js +44 -1
- package/dist/lib/project-focus.d.ts +1 -1
- package/dist/lib/project-focus.js +1 -1
- package/dist/lib/project-key.d.ts +17 -0
- package/dist/lib/project-key.js +26 -0
- package/dist/lib/project-probe.d.ts +4 -1
- package/dist/lib/project-probe.js +5 -4
- package/dist/lib/project-resources.js +2 -18
- package/dist/lib/project-root.d.ts +16 -0
- package/dist/lib/project-root.js +20 -2
- package/dist/lib/projects.d.ts +20 -1
- package/dist/lib/projects.js +78 -1
- package/dist/lib/refresh-coordinator.d.ts +24 -0
- package/dist/lib/refresh-coordinator.js +52 -0
- package/dist/lib/registry.d.ts +2 -2
- package/dist/lib/registry.js +1 -1
- package/dist/lib/resource-aliases.d.ts +13 -0
- package/dist/lib/resource-aliases.js +26 -0
- package/dist/lib/resources/types.d.ts +1 -1
- package/dist/lib/resources.d.ts +16 -0
- package/dist/lib/resources.js +66 -10
- package/dist/lib/rotate.d.ts +3 -4
- package/dist/lib/rotate.js +4 -5
- package/dist/lib/routine-activation.d.ts +22 -2
- package/dist/lib/routine-activation.js +63 -16
- package/dist/lib/routine-context.d.ts +9 -2
- package/dist/lib/routine-context.js +21 -6
- package/dist/lib/routines-project.d.ts +58 -48
- package/dist/lib/routines-project.js +190 -159
- package/dist/lib/routines.d.ts +41 -6
- package/dist/lib/routines.js +92 -34
- package/dist/lib/run-defaults.d.ts +5 -0
- package/dist/lib/run-defaults.js +11 -1
- package/dist/lib/runner.d.ts +10 -8
- package/dist/lib/runner.js +122 -39
- 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.d.ts +10 -3
- package/dist/lib/secrets/agent.js +43 -8
- package/dist/lib/secrets/bundles.d.ts +1 -0
- package/dist/lib/secrets/bundles.js +92 -80
- package/dist/lib/secrets/index.js +32 -9
- package/dist/lib/secrets/install-helper.d.ts +4 -4
- package/dist/lib/secrets/install-helper.js +4 -4
- package/dist/lib/secrets/push.d.ts +40 -6
- package/dist/lib/secrets/push.js +58 -11
- package/dist/lib/secrets/read-backoff.d.ts +1 -1
- package/dist/lib/secrets/read-backoff.js +1 -1
- package/dist/lib/secrets/remote.d.ts +24 -0
- package/dist/lib/secrets/remote.js +54 -4
- package/dist/lib/self-update.d.ts +108 -0
- package/dist/lib/self-update.js +276 -1
- package/dist/lib/session/active.d.ts +89 -5
- package/dist/lib/session/active.js +165 -10
- package/dist/lib/session/actor-sidecar.d.ts +1 -1
- package/dist/lib/session/actor-sidecar.js +2 -1
- package/dist/lib/session/db.d.ts +176 -2
- package/dist/lib/session/db.js +484 -17
- package/dist/lib/session/discover.js +27 -4
- package/dist/lib/session/hook-sessions.js +2 -2
- package/dist/lib/session/host-link.d.ts +2 -2
- package/dist/lib/session/host-link.js +2 -2
- package/dist/lib/session/pid-registry.d.ts +21 -0
- package/dist/lib/session/pid-registry.js +57 -0
- package/dist/lib/session/remote-active.js +15 -1
- package/dist/lib/session/remote.js +2 -2
- package/dist/lib/session/session-cache.d.ts +14 -7
- package/dist/lib/session/session-cache.js +51 -9
- package/dist/lib/session/state.d.ts +2 -2
- package/dist/lib/session/state.js +1 -1
- package/dist/lib/session/sync/config.d.ts +10 -10
- package/dist/lib/session/sync/config.js +10 -10
- package/dist/lib/session/sync/r2.d.ts +34 -0
- package/dist/lib/session/sync/r2.js +123 -0
- package/dist/lib/session/throughput.d.ts +1 -1
- package/dist/lib/session/throughput.js +1 -1
- package/dist/lib/session/types.d.ts +23 -1
- package/dist/lib/session/types.js +15 -0
- package/dist/lib/session/viewing-in.d.ts +1 -1
- package/dist/lib/session/viewing-in.js +1 -1
- package/dist/lib/session/watch.d.ts +101 -0
- package/dist/lib/session/watch.js +242 -0
- package/dist/lib/share/config.d.ts +4 -0
- package/dist/lib/share/config.js +1 -0
- package/dist/lib/share/delete.d.ts +93 -0
- package/dist/lib/share/delete.js +127 -0
- package/dist/lib/share/provision.d.ts +38 -0
- package/dist/lib/share/provision.js +50 -0
- package/dist/lib/share/publish.d.ts +40 -1
- package/dist/lib/share/publish.js +116 -3
- package/dist/lib/share/worker-template.js +71 -6
- package/dist/lib/shims.d.ts +17 -3
- package/dist/lib/shims.js +136 -27
- package/dist/lib/signin-badge.js +3 -2
- package/dist/lib/skills.js +2 -0
- package/dist/lib/smart-launch.d.ts +8 -8
- package/dist/lib/smart-launch.js +80 -59
- package/dist/lib/ssh-exec.d.ts +1 -1
- package/dist/lib/ssh-exec.js +1 -1
- package/dist/lib/staleness/prune.d.ts +88 -0
- package/dist/lib/staleness/prune.js +69 -0
- package/dist/lib/staleness/registry.d.ts +1 -1
- package/dist/lib/staleness/writers/commands.js +34 -2
- package/dist/lib/staleness/writers/hooks.js +16 -0
- package/dist/lib/staleness/writers/kinds.d.ts +6 -0
- package/dist/lib/staleness/writers/skills.js +19 -0
- package/dist/lib/staleness/writers/subagents.d.ts +2 -3
- package/dist/lib/staleness/writers/subagents.js +0 -4
- package/dist/lib/staleness/writers/types.d.ts +32 -0
- package/dist/lib/startup/command-registry.d.ts +6 -12
- package/dist/lib/startup/command-registry.js +14 -31
- package/dist/lib/startup/dev-build.d.ts +10 -0
- package/dist/lib/startup/dev-build.js +13 -1
- package/dist/lib/startup/spellcheck.d.ts +18 -0
- package/dist/lib/startup/spellcheck.js +45 -0
- package/dist/lib/state.d.ts +36 -9
- package/dist/lib/state.js +96 -46
- package/dist/lib/subagents-registry.d.ts +0 -7
- package/dist/lib/subagents-registry.js +38 -65
- package/dist/lib/subagents.d.ts +0 -33
- package/dist/lib/subagents.js +0 -75
- package/dist/lib/sync-umbrella.js +1 -1
- package/dist/lib/teams/agents.d.ts +41 -1
- package/dist/lib/teams/agents.js +187 -9
- package/dist/lib/teams/api.d.ts +11 -1
- package/dist/lib/teams/api.js +11 -2
- package/dist/lib/teams/delivery.d.ts +41 -0
- package/dist/lib/teams/delivery.js +60 -0
- package/dist/lib/teams/registry.d.ts +14 -0
- package/dist/lib/teams/registry.js +51 -1
- package/dist/lib/teams/remoteWorktree.d.ts +19 -0
- package/dist/lib/teams/remoteWorktree.js +29 -0
- package/dist/lib/teams/scheduler.d.ts +1 -1
- package/dist/lib/teams/scheduler.js +1 -1
- package/dist/lib/teams/worktree.d.ts +24 -0
- package/dist/lib/teams/worktree.js +42 -0
- package/dist/lib/terminal/backends/vscodium-agent.d.ts +10 -1
- package/dist/lib/terminal/backends/vscodium-agent.js +16 -5
- package/dist/lib/terminal/engine.d.ts +4 -0
- package/dist/lib/terminal/engine.js +8 -2
- package/dist/lib/terminal/types.d.ts +21 -2
- package/dist/lib/testdata/refresh-coordinator-worker.d.ts +1 -0
- package/dist/lib/testdata/refresh-coordinator-worker.js +23 -0
- package/dist/lib/tickets/list.d.ts +53 -0
- package/dist/lib/tickets/list.js +153 -0
- package/dist/lib/tmux/orphan-reap.d.ts +320 -0
- package/dist/lib/tmux/orphan-reap.js +644 -0
- package/dist/lib/tmux/session.d.ts +68 -3
- package/dist/lib/tmux/session.js +95 -5
- package/dist/lib/triggers/handlers.d.ts +20 -0
- package/dist/lib/triggers/handlers.js +6 -1
- package/dist/lib/types.d.ts +46 -34
- package/dist/lib/usage-fleet.d.ts +32 -0
- package/dist/lib/usage-fleet.js +125 -0
- package/dist/lib/usage-refresh.d.ts +3 -3
- package/dist/lib/usage-refresh.js +19 -16
- package/dist/lib/usage.d.ts +51 -47
- package/dist/lib/usage.js +145 -153
- package/dist/lib/version-duplicates.js +2 -2
- package/dist/lib/versions.d.ts +56 -13
- package/dist/lib/versions.js +195 -45
- package/dist/lib/watchdog/log.d.ts +1 -1
- package/dist/lib/watchdog/log.js +3 -3
- package/dist/lib/watchdog/rotate.d.ts +6 -6
- package/dist/lib/watchdog/rotate.js +6 -6
- package/dist/lib/workflows.d.ts +1 -1
- package/dist/lib/yaml-io.d.ts +47 -0
- package/dist/lib/yaml-io.js +55 -0
- package/package.json +2 -1
- package/scripts/install-helper.js +2 -2
- package/scripts/postinstall.js +23 -20
- package/dist/commands/defaults.d.ts +0 -7
- package/dist/commands/defaults.js +0 -107
- package/dist/commands/export.d.ts +0 -11
- package/dist/commands/export.js +0 -215
- package/dist/commands/helper.d.ts +0 -12
- package/dist/commands/helper.js +0 -87
- package/dist/commands/hosts.d.ts +0 -11
- package/dist/commands/hosts.js +0 -330
- package/dist/commands/lock.d.ts +0 -12
- package/dist/commands/lock.js +0 -70
- package/dist/commands/pull.d.ts +0 -17
- package/dist/commands/pull.js +0 -39
- package/dist/commands/push.d.ts +0 -14
- package/dist/commands/push.js +0 -30
- package/dist/commands/wallet.d.ts +0 -20
- package/dist/commands/wallet.js +0 -216
- package/dist/commands/worktree.d.ts +0 -19
- package/dist/commands/worktree.js +0 -272
- package/dist/lib/account-labels.d.ts +0 -24
- package/dist/lib/account-labels.js +0 -72
- package/dist/lib/auto-dispatch-linear.d.ts +0 -18
- package/dist/lib/auto-dispatch-linear.js +0 -107
- package/dist/lib/auto-dispatch-provider.d.ts +0 -10
- package/dist/lib/auto-dispatch-provider.js +0 -30
- package/dist/lib/auto-dispatch.d.ts +0 -93
- package/dist/lib/auto-dispatch.js +0 -128
- package/dist/lib/export.d.ts +0 -72
- package/dist/lib/export.js +0 -269
- package/dist/lib/lock.d.ts +0 -93
- package/dist/lib/lock.js +0 -207
- package/dist/lib/wallet/index.d.ts +0 -78
- package/dist/lib/wallet/index.js +0 -253
|
@@ -21,7 +21,7 @@ import { getActiveSessions } from '../lib/session/active.js';
|
|
|
21
21
|
import { gatherRemoteActive } from '../lib/session/remote-active.js';
|
|
22
22
|
import { gatherRemoteAgentsJson } from '../lib/remote-agents-json.js';
|
|
23
23
|
import { formatFleetSummary, formatFleetWorkspaces, parseRemoteProbe, probeProjectWorkspaces, workspaceTargetsForDef, workspaceWarnings, } from '../lib/project-probe.js';
|
|
24
|
-
import { listProjectDefs, loadProjectDef, writeProjectDef, removeProjectDef, projectDefPath, isSafeProjectName, validateProjectDef, } from '../lib/projects.js';
|
|
24
|
+
import { listProjectDefs, loadProjectDef, writeProjectDef, removeProjectDef, projectDefPath, isSafeProjectName, validateProjectDef, projectNameForCwd, } from '../lib/projects.js';
|
|
25
25
|
import { rollupSessionsByProject, withDefaultMachine, isDeadStatus, formatDeadSummary, liveDeadSplit, enrichProjectSignals, formatProjectMembersByHost, formatProjectWarnings, } from '../lib/project-status.js';
|
|
26
26
|
import { fetchLinearProjectCounts } from '../lib/linear-project-counts.js';
|
|
27
27
|
import { listLinearProjects, pickLinearProject } from '../lib/linear-projects.js';
|
|
@@ -33,6 +33,18 @@ import { buildLinearImportCandidates, validateImportOpts, } from '../lib/project
|
|
|
33
33
|
export const PROJECTS_NO_FANOUT_ENV = 'AGENTS_PROJECTS_LOCAL';
|
|
34
34
|
/** Max peers named in the skipped note before the rest collapse to `+N`. */
|
|
35
35
|
const SKIPPED_NAME_LIMIT = 4;
|
|
36
|
+
/**
|
|
37
|
+
* Render `agents projects for-cwd`'s output for a resolved (or absent)
|
|
38
|
+
* project name — `--json` always prints `{"name": ...}` even on no match, so
|
|
39
|
+
* a scripted caller can distinguish "ran and found nothing" from a crash;
|
|
40
|
+
* the plain-text form prints nothing on no match. Returns '' when nothing
|
|
41
|
+
* should be printed.
|
|
42
|
+
*/
|
|
43
|
+
export function formatForCwdOutput(name, json) {
|
|
44
|
+
if (json)
|
|
45
|
+
return JSON.stringify({ name: name ?? null });
|
|
46
|
+
return name ?? '';
|
|
47
|
+
}
|
|
36
48
|
/**
|
|
37
49
|
* One compact trailing note for peers that didn't answer the `--fleet`
|
|
38
50
|
* fan-out — unreachable, running an agents-cli too old to carry `projects
|
|
@@ -88,6 +100,34 @@ export function originSlug(cwd) {
|
|
|
88
100
|
return undefined;
|
|
89
101
|
}
|
|
90
102
|
}
|
|
103
|
+
/**
|
|
104
|
+
* Turn a `--dir` / `--add-dir` value into a `repos[]` row.
|
|
105
|
+
*
|
|
106
|
+
* The slug comes from the DIRECTORY'S OWN origin remote, never from its path:
|
|
107
|
+
* a checkout at `~/src/github.com/muqsitnawaz/agents-cli` whose origin is
|
|
108
|
+
* `phnx-labs/agents-cli` must record the remote it actually pushes to. Pass
|
|
109
|
+
* `slugOverride` for a directory with no origin (a vendored tree, a fresh
|
|
110
|
+
* `git init`).
|
|
111
|
+
*
|
|
112
|
+
* The stored `path` is left for `writeProjectDef` to normalize home-relative,
|
|
113
|
+
* so the same definition re-roots on every machine.
|
|
114
|
+
*/
|
|
115
|
+
export function projectRepoFromDir(dir, slugOverride) {
|
|
116
|
+
const abs = path.resolve(expandLocalHome(dir));
|
|
117
|
+
if (!fs.existsSync(abs))
|
|
118
|
+
return { ok: false, error: `No such directory: ${abs}` };
|
|
119
|
+
if (!fs.statSync(abs).isDirectory())
|
|
120
|
+
return { ok: false, error: `Not a directory: ${abs}` };
|
|
121
|
+
const slug = slugOverride ?? originSlug(abs);
|
|
122
|
+
if (!slug) {
|
|
123
|
+
return {
|
|
124
|
+
ok: false,
|
|
125
|
+
error: `${abs} has no origin remote, so its slug cannot be inferred.\n` +
|
|
126
|
+
` Name it explicitly: --add-dir ${dir} --slug <owner/repo>`,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
return { ok: true, repo: { slug, path: toHomeRelative(abs) } };
|
|
130
|
+
}
|
|
91
131
|
/**
|
|
92
132
|
* List the workspace's Linear projects and plan their import, binding each to a
|
|
93
133
|
* local checkout under the configured projects root when the names match
|
|
@@ -411,9 +451,12 @@ export function registerProjectsCommands(program) {
|
|
|
411
451
|
examples: `
|
|
412
452
|
agents projects import --from-linear # the projects you actually track
|
|
413
453
|
agents projects add rush --repo phnx-labs/rush --path apps/web
|
|
454
|
+
agents projects add rush --root ~/src/rush --dir ~/src/rush-infra # bind another dir
|
|
455
|
+
agents projects set rush --add-dir ~/.agents/.system # bind one more
|
|
456
|
+
agents projects set rush --rm-dir ~/src/rush-infra # unbind it again
|
|
414
457
|
agents projects list # definitions only (no session scan)
|
|
415
458
|
agents projects list --with-agents # opt-in local active counts
|
|
416
|
-
agents projects list --json # machine-readable defs (
|
|
459
|
+
agents projects list --json # machine-readable defs (AGI EXT uses this)
|
|
417
460
|
echo '{...}' | agents projects save --json # create/update one def from stdin
|
|
418
461
|
agents projects rm rush --json # machine-readable delete
|
|
419
462
|
agents projects status # every project, across the whole fleet
|
|
@@ -425,8 +468,14 @@ export function registerProjectsCommands(program) {
|
|
|
425
468
|
`,
|
|
426
469
|
notes: `
|
|
427
470
|
Definitions are hand-editable YAML in ~/.agents/projects/ and sync across
|
|
428
|
-
machines with 'agents push/
|
|
429
|
-
these commands — never
|
|
471
|
+
machines with 'agents repo push user' / 'agents repo pull user'. AGI EXT
|
|
472
|
+
reads and writes only through these commands — never
|
|
473
|
+
~/.agents/factory/projects.json.
|
|
474
|
+
|
|
475
|
+
A project may bind several directories ('--dir' / '--add-dir'). The cwd an
|
|
476
|
+
agent lands in is 'defaultPath' (else 'root') — set it with --root/--path,
|
|
477
|
+
not with --dir. Every bound directory other than that cwd rides along as
|
|
478
|
+
an --add-dir grant (Claude, Codex, Cursor, Kimi, Grok consume it; others ignore).
|
|
430
479
|
`,
|
|
431
480
|
});
|
|
432
481
|
// ---- list ----
|
|
@@ -465,6 +514,17 @@ export function registerProjectsCommands(program) {
|
|
|
465
514
|
console.log(` ${chalk.bold(row.name.padEnd(w.name))} ${chalk.dim(row.path.padEnd(w.path))} ${chalk.cyan(row.repo.padEnd(w.repo))}${agentsSuffix}`);
|
|
466
515
|
}
|
|
467
516
|
});
|
|
517
|
+
// ---- for-cwd ----
|
|
518
|
+
projects
|
|
519
|
+
.command('for-cwd [cwd]')
|
|
520
|
+
.description('Resolve a directory to its defined project name (root or a repos[].path/subpath match). Defaults to the current directory.')
|
|
521
|
+
.option('--json', 'Machine-readable output: {"name": string | null}')
|
|
522
|
+
.action((cwdArg, opts) => {
|
|
523
|
+
const name = projectNameForCwd(cwdArg ?? process.cwd(), listProjectDefs());
|
|
524
|
+
const out = formatForCwdOutput(name, !!opts.json);
|
|
525
|
+
if (out)
|
|
526
|
+
console.log(out);
|
|
527
|
+
});
|
|
468
528
|
// ---- add ----
|
|
469
529
|
projects
|
|
470
530
|
.command('add <name>')
|
|
@@ -472,6 +532,7 @@ export function registerProjectsCommands(program) {
|
|
|
472
532
|
.option('--root <path>', 'Repo / monorepo root (defaults to the current git repo root)')
|
|
473
533
|
.option('--path <subdir>', 'Default cwd for agents (a monorepo subdir)')
|
|
474
534
|
.option('--repo <owner/repo>', 'Primary GitHub slug (defaults to the origin remote)')
|
|
535
|
+
.option('--dir <path...>', 'A directory this project binds; slug read from its origin. Repeatable')
|
|
475
536
|
.option('--context <path:purpose...>', 'A described starting point; repeatable')
|
|
476
537
|
.option('--goal <objective:measure...>', 'An outcome the project serves; repeatable')
|
|
477
538
|
.option('--linear <url-or-id>', 'Linear project URL or id')
|
|
@@ -502,6 +563,18 @@ export function registerProjectsCommands(program) {
|
|
|
502
563
|
def.defaultPath = `${root.replace(/\/$/, '')}/${opts.path.replace(/^\//, '')}`;
|
|
503
564
|
if (repo)
|
|
504
565
|
def.repo = repo;
|
|
566
|
+
if (opts.dir?.length) {
|
|
567
|
+
const repos = [];
|
|
568
|
+
for (const d of opts.dir) {
|
|
569
|
+
const r = projectRepoFromDir(d);
|
|
570
|
+
if (!r.ok) {
|
|
571
|
+
console.error(chalk.red(r.error));
|
|
572
|
+
process.exit(1);
|
|
573
|
+
}
|
|
574
|
+
repos.push(r.repo);
|
|
575
|
+
}
|
|
576
|
+
def.repos = repos;
|
|
577
|
+
}
|
|
505
578
|
if (opts.context?.length)
|
|
506
579
|
def.contexts = opts.context.map(parseContextFlag);
|
|
507
580
|
if (opts.goal?.length)
|
|
@@ -513,6 +586,8 @@ export function registerProjectsCommands(program) {
|
|
|
513
586
|
console.log(chalk.green(`Defined project "${name}"`));
|
|
514
587
|
console.log(chalk.gray(` ${target}`));
|
|
515
588
|
console.log(chalk.gray(` root ${def.root}${def.repo ? ` · repo ${def.repo}` : ''}`));
|
|
589
|
+
for (const r of def.repos ?? [])
|
|
590
|
+
console.log(chalk.gray(` dir ${r.path} · ${r.slug}`));
|
|
516
591
|
});
|
|
517
592
|
/** Merge `--device a b` (variadic) and `--devices a,b,c` (comma list) into one
|
|
518
593
|
* deduped device filter; undefined when neither was given (= whole fleet). */
|
|
@@ -748,6 +823,9 @@ export function registerProjectsCommands(program) {
|
|
|
748
823
|
.option('--path <subdir>', 'Default cwd for agents (a monorepo subdir)')
|
|
749
824
|
.option('--description <text>', 'One-line description shown on the card')
|
|
750
825
|
.option('--goal <objective:measure...>', 'Replace the goals this project serves; repeatable')
|
|
826
|
+
.option('--add-dir <path>', 'Bind another directory to this project; repeatable', (val, prev) => [...prev, val], [])
|
|
827
|
+
.option('--rm-dir <path>', 'Unbind a directory from this project; repeatable', (val, prev) => [...prev, val], [])
|
|
828
|
+
.option('--slug <owner/repo>', 'Slug for a single --add-dir whose origin cannot be read')
|
|
751
829
|
.action((name, opts) => {
|
|
752
830
|
const def = loadProjectDef(name);
|
|
753
831
|
if (!def) {
|
|
@@ -755,10 +833,17 @@ export function registerProjectsCommands(program) {
|
|
|
755
833
|
process.exit(1);
|
|
756
834
|
}
|
|
757
835
|
const fields = ['repo', 'root', 'path', 'description'].filter((k) => opts[k] !== undefined);
|
|
758
|
-
|
|
836
|
+
const dirWork = opts.addDir.length > 0 || opts.rmDir.length > 0;
|
|
837
|
+
if (fields.length === 0 && !opts.goal?.length && !dirWork) {
|
|
759
838
|
console.error(chalk.red('Nothing to set. Pass a field, e.g. --repo <owner/repo>.'));
|
|
760
839
|
process.exit(1);
|
|
761
840
|
}
|
|
841
|
+
// One --slug cannot name two directories. Refuse rather than guess which
|
|
842
|
+
// --add-dir it was meant for.
|
|
843
|
+
if (opts.slug && opts.addDir.length !== 1) {
|
|
844
|
+
console.error(chalk.red('--slug names a single --add-dir; pass exactly one --add-dir with it.'));
|
|
845
|
+
process.exit(1);
|
|
846
|
+
}
|
|
762
847
|
// Load, mutate the named fields, write back — the `link` pattern. NEVER
|
|
763
848
|
// the `add --force` pattern, which rebuilds the def from flags alone and
|
|
764
849
|
// silently drops linear/contexts/integrations that were not re-passed.
|
|
@@ -784,12 +869,47 @@ export function registerProjectsCommands(program) {
|
|
|
784
869
|
}
|
|
785
870
|
def.defaultPath = `${base}/${opts.path.replace(/^\//, '')}`;
|
|
786
871
|
}
|
|
872
|
+
// --rm-dir before --add-dir, so re-pointing one directory in a single
|
|
873
|
+
// command (`--rm-dir old --add-dir new`) does what it reads like.
|
|
874
|
+
const removed = [];
|
|
875
|
+
for (const d of opts.rmDir) {
|
|
876
|
+
const target = path.resolve(expandLocalHome(d));
|
|
877
|
+
const before = def.repos?.length ?? 0;
|
|
878
|
+
def.repos = (def.repos ?? []).filter((r) => !r.path || path.resolve(expandLocalHome(r.path)) !== target);
|
|
879
|
+
if ((def.repos.length ?? 0) === before) {
|
|
880
|
+
console.error(chalk.red(`"${def.name}" does not bind ${target} — nothing to remove.`));
|
|
881
|
+
process.exit(1);
|
|
882
|
+
}
|
|
883
|
+
removed.push(target);
|
|
884
|
+
}
|
|
885
|
+
const added = [];
|
|
886
|
+
for (const d of opts.addDir) {
|
|
887
|
+
const r = projectRepoFromDir(d, opts.slug);
|
|
888
|
+
if (!r.ok) {
|
|
889
|
+
console.error(chalk.red(r.error));
|
|
890
|
+
process.exit(1);
|
|
891
|
+
}
|
|
892
|
+
const target = path.resolve(expandLocalHome(r.repo.path));
|
|
893
|
+
const dup = (def.repos ?? []).some((x) => x.path && path.resolve(expandLocalHome(x.path)) === target);
|
|
894
|
+
if (dup) {
|
|
895
|
+
console.error(chalk.red(`"${def.name}" already binds ${target}.`));
|
|
896
|
+
process.exit(1);
|
|
897
|
+
}
|
|
898
|
+
def.repos = [...(def.repos ?? []), r.repo];
|
|
899
|
+
added.push(r.repo);
|
|
900
|
+
}
|
|
901
|
+
if (def.repos?.length === 0)
|
|
902
|
+
delete def.repos;
|
|
787
903
|
writeProjectDef(def);
|
|
788
904
|
console.log(chalk.green(`Updated ${def.name}`));
|
|
789
905
|
for (const f of fields)
|
|
790
906
|
console.log(chalk.gray(` ${f} ${f === 'path' ? def.defaultPath : def[f]}`));
|
|
791
907
|
if (opts.goal?.length)
|
|
792
908
|
console.log(chalk.gray(` goals ${def.goals?.map((g) => g.objective).join(' · ')}`));
|
|
909
|
+
for (const r of removed)
|
|
910
|
+
console.log(chalk.gray(` - dir ${toHomeRelative(r)}`));
|
|
911
|
+
for (const r of added)
|
|
912
|
+
console.log(chalk.gray(` + dir ${r.path} · ${r.slug}`));
|
|
793
913
|
});
|
|
794
914
|
// ---- link ----
|
|
795
915
|
projects
|
|
@@ -81,11 +81,17 @@ export async function reconnectAction(id) {
|
|
|
81
81
|
await focusAction(recent.id, {});
|
|
82
82
|
}
|
|
83
83
|
export function registerReconnectCommand(program) {
|
|
84
|
+
// Deprecated: superseded by `agents sessions resume`, which does the same
|
|
85
|
+
// attach-else-recover and additionally takes a tmux alias. Hidden + warned +
|
|
86
|
+
// functional for one release. Bare `reconnect` targeted the most recent
|
|
87
|
+
// session in this directory; that default now lives on `resume`'s picker.
|
|
84
88
|
const cmd = program
|
|
85
|
-
.command('reconnect')
|
|
89
|
+
.command('reconnect', { hidden: true })
|
|
86
90
|
.argument('[session-id]', 'Session id/prefix to reconnect (default: the most recent session started here)')
|
|
87
|
-
.description('
|
|
91
|
+
.description('Deprecated — use `agents sessions resume` instead.')
|
|
88
92
|
.action(async (id) => {
|
|
93
|
+
console.warn(chalk.yellow('`agents reconnect` is deprecated — use `agents sessions resume` instead:'));
|
|
94
|
+
console.warn(chalk.gray(` agents sessions resume${id ? ` ${id}` : ''}`));
|
|
89
95
|
await reconnectAction(id);
|
|
90
96
|
});
|
|
91
97
|
setHelpSections(cmd, {
|
|
@@ -103,7 +109,7 @@ export function registerReconnectCommand(program) {
|
|
|
103
109
|
- Best-effort recovery: a living remote tmux pane is JOINED (a second client, no fork); a dropped one is RESUMED on its origin device (a copy if it was mid-run, a /continue if idle).
|
|
104
110
|
- With no id, targets the most recent session started from this directory (the terminal that most likely just dropped), not the full fleet picker. Falls back to the most recent session anywhere when this directory has none.
|
|
105
111
|
- This is the manual companion to the automatic reconnect that runs during a live 'agents run --device <box>' when the network blinks; use it after that gave up or the terminal tab closed.
|
|
106
|
-
-
|
|
112
|
+
- Deprecated: use 'agents sessions resume' — it attaches a live pane, foregrounds a headless session, or recovers an ended one.
|
|
107
113
|
`,
|
|
108
114
|
});
|
|
109
115
|
}
|
package/dist/commands/repo.js
CHANGED
|
@@ -29,7 +29,7 @@ function resolveRepoPath(target) {
|
|
|
29
29
|
return path.join(HOME, `.agents-${trimmed}`);
|
|
30
30
|
}
|
|
31
31
|
import { applyExtraAliasToVersions, ensureAgentsDir, getExtraRepoDir, getSystemAgentsDir, getUserAgentsDir, readMeta, resolveExtraRepoDir, updateMeta, } from '../lib/state.js';
|
|
32
|
-
import { parseSource, pullRepo, commitAndPush, isGitRepo, isSystemRepoOrigin, adoptRepo, getRemoteUrl, sameGitRemote, displayHomePath, } from '../lib/git.js';
|
|
32
|
+
import { parseSource, pullRepo, commitAndPush, isGitRepo, isSystemRepoOrigin, adoptRepo, getRemoteUrl, sameGitRemote, displayHomePath, syncRepoGit, } from '../lib/git.js';
|
|
33
33
|
import { DEFAULT_SYSTEM_REPO } from '../lib/types.js';
|
|
34
34
|
import { ALL_AGENT_IDS, isAgentName, resolveAgentName } from '../lib/agents.js';
|
|
35
35
|
import { refresh } from '../lib/refresh.js';
|
|
@@ -1089,6 +1089,47 @@ export function registerRepoCommands(program) {
|
|
|
1089
1089
|
}
|
|
1090
1090
|
}
|
|
1091
1091
|
});
|
|
1092
|
+
// agents repo sync <name> — git-level sync for a single DotAgents repo.
|
|
1093
|
+
// Replaces the git portion of the old `agents sync <repo>` verb.
|
|
1094
|
+
// Semantics: system is pull-only (push: false); user and enabled extras push.
|
|
1095
|
+
repoCmd
|
|
1096
|
+
.command('sync <alias>')
|
|
1097
|
+
.description('Git-sync a repo: pull (and push for user/extras). Aliases: "system", "user", or a registered extra.')
|
|
1098
|
+
.addHelpText('after', `
|
|
1099
|
+
Examples:
|
|
1100
|
+
# Pull the system repo (read-only mirror)
|
|
1101
|
+
agents repo sync system
|
|
1102
|
+
|
|
1103
|
+
# Pull and push the user repo
|
|
1104
|
+
agents repo sync user
|
|
1105
|
+
|
|
1106
|
+
# Sync a registered extra
|
|
1107
|
+
agents repo sync work
|
|
1108
|
+
`)
|
|
1109
|
+
.action(async (alias) => {
|
|
1110
|
+
const targets = collectRepoTargets(alias);
|
|
1111
|
+
if (!targets) {
|
|
1112
|
+
process.exitCode = 1;
|
|
1113
|
+
return;
|
|
1114
|
+
}
|
|
1115
|
+
for (const t of targets) {
|
|
1116
|
+
if (!fs.existsSync(t.dir) || !isGitRepo(t.dir)) {
|
|
1117
|
+
console.log(chalk.yellow(` ${t.alias}: not a git repo, skipping`));
|
|
1118
|
+
continue;
|
|
1119
|
+
}
|
|
1120
|
+
const push = t.alias !== 'system';
|
|
1121
|
+
const spinner = ora(`Syncing ${formatRepoTarget(t.alias, t.dir)}...`).start();
|
|
1122
|
+
const result = await syncRepoGit(t.dir, { push });
|
|
1123
|
+
if (result.success) {
|
|
1124
|
+
const pushed = result.pushed ? ' (pushed)' : '';
|
|
1125
|
+
spinner.succeed(`${formatRepoTarget(t.alias, t.dir)}: ${result.commit}${pushed}`);
|
|
1126
|
+
}
|
|
1127
|
+
else {
|
|
1128
|
+
spinner.fail(`${formatRepoTarget(t.alias, t.dir)}: ${result.error}`);
|
|
1129
|
+
process.exitCode = 1;
|
|
1130
|
+
}
|
|
1131
|
+
}
|
|
1132
|
+
});
|
|
1092
1133
|
// Deprecated: superseded by `agents sync`. `agents sync --local` runs the same
|
|
1093
1134
|
// reconcile stage (sync-umbrella.ts calls this exact `refresh()`), and `agents
|
|
1094
1135
|
// sync <agent>` targets one agent — with the added reach `refresh` lacks
|
|
@@ -35,6 +35,23 @@ export interface ResourceViewOptions {
|
|
|
35
35
|
filterVersion?: string;
|
|
36
36
|
/** Emit machine-readable JSON instead of the picker/table (for agents/scripts). */
|
|
37
37
|
json?: boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Show the "Synced" column. Default true — the central-storage commands all
|
|
40
|
+
* answer "which agent versions have this?". `agents inspect <repo>` does not:
|
|
41
|
+
* there the repo IS the source, and empty `targets` would render the
|
|
42
|
+
* misleading "no installed versions". Set false to drop the column entirely.
|
|
43
|
+
*/
|
|
44
|
+
showSync?: boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Cap for the Name column. Defaults to NAME_CAP (22), which suits the
|
|
47
|
+
* central-storage commands. Kinds whose rows have no description — hooks are
|
|
48
|
+
* all script names and no prose — want a wider cap, otherwise four pairs of
|
|
49
|
+
* `00-agent-verify-work-complete…` truncate to the same string while the
|
|
50
|
+
* empty Description column wastes the rest of the terminal.
|
|
51
|
+
*/
|
|
52
|
+
nameCap?: number;
|
|
53
|
+
/** Per-row OSC-8 link target, keyed by row name; makes names clickable. */
|
|
54
|
+
linkFor?: (row: ResourceRow) => string | undefined;
|
|
38
55
|
}
|
|
39
56
|
/** Display a resource list: interactive picker in TTY mode, plain table otherwise. */
|
|
40
57
|
export declare function showResourceList(opts: ResourceViewOptions): Promise<void>;
|
|
@@ -7,11 +7,15 @@
|
|
|
7
7
|
* filtering, and paging.
|
|
8
8
|
*/
|
|
9
9
|
import chalk from 'chalk';
|
|
10
|
-
import { truncate, padVisible } from '../lib/format.js';
|
|
10
|
+
import { truncate, padVisible, termLink } from '../lib/format.js';
|
|
11
11
|
import { agentLabel } from '../lib/agents.js';
|
|
12
12
|
import { itemPicker } from '../lib/picker.js';
|
|
13
13
|
import { isInteractiveTerminal, isPromptCancelled, printWithPager } from './utils.js';
|
|
14
14
|
import { terminalWidth, truncateToWidth, padToWidth, stringWidth, stripAnsi } from '../lib/session/width.js';
|
|
15
|
+
/** Whether the Synced column renders for this view. */
|
|
16
|
+
function syncEnabled(opts) {
|
|
17
|
+
return opts.showSync !== false;
|
|
18
|
+
}
|
|
15
19
|
/** Display a resource list: interactive picker in TTY mode, plain table otherwise. */
|
|
16
20
|
export async function showResourceList(opts) {
|
|
17
21
|
if (opts.json) {
|
|
@@ -74,7 +78,12 @@ function filterRows(rows, query) {
|
|
|
74
78
|
}
|
|
75
79
|
/** Row label rendered inside the picker list. */
|
|
76
80
|
function formatPickerRow(row, opts) {
|
|
77
|
-
|
|
81
|
+
// Link here, not in the wide table: that renders only when stdout is NOT a
|
|
82
|
+
// TTY, and termLink is a no-op off-TTY — so a link there could never appear.
|
|
83
|
+
// The picker is the TTY path, which is where the pre-picker list had one.
|
|
84
|
+
const linkTarget = opts.linkFor?.(row);
|
|
85
|
+
const padded = chalk.cyan(padVisible(row.name, opts.nameCap ?? 22));
|
|
86
|
+
const name = linkTarget ? termLink(padded, linkTarget) : padded;
|
|
78
87
|
const extra = opts.extraLabel
|
|
79
88
|
? chalk.gray(padVisible(row.extra ?? '-', 10))
|
|
80
89
|
: '';
|
|
@@ -82,6 +91,10 @@ function formatPickerRow(row, opts) {
|
|
|
82
91
|
? chalk.gray(padVisible(row.extra2 ?? '-', 16))
|
|
83
92
|
: '';
|
|
84
93
|
const descRaw = row.description ? truncate(row.description, 40) : '';
|
|
94
|
+
if (!syncEnabled(opts)) {
|
|
95
|
+
// No sync column: give the reclaimed width back to the description.
|
|
96
|
+
return `${name} ${extra}${extra2}${chalk.gray(row.description ? truncate(row.description, 84) : '')}`;
|
|
97
|
+
}
|
|
85
98
|
const desc = padVisible(chalk.gray(descRaw), 42);
|
|
86
99
|
const sync = formatSyncSummary(row.targets, opts);
|
|
87
100
|
return `${name} ${extra}${extra2}${desc} ${sync}`;
|
|
@@ -100,7 +113,9 @@ export function resourceLayout(cols, o) {
|
|
|
100
113
|
const extraW = o.hasExtra ? 10 : 0;
|
|
101
114
|
const extra2W = o.hasExtra2 ? 16 : 0;
|
|
102
115
|
// Cap Sync so a long "missing on …" tail can't starve the description.
|
|
103
|
-
|
|
116
|
+
// syncW 0 means the caller dropped the column — keep it 0 rather than
|
|
117
|
+
// floor it to 14, which would reserve width for a column we never draw.
|
|
118
|
+
const syncW = o.syncW === 0 ? 0 : Math.min(o.syncW, Math.max(14, Math.floor(cols * 0.32)));
|
|
104
119
|
const fixed = o.nameW + 1 + (extraW ? extraW + 1 : 0) + (extra2W ? extra2W + 1 : 0) + 1 + syncW;
|
|
105
120
|
const descW = cols - fixed;
|
|
106
121
|
return {
|
|
@@ -116,8 +131,10 @@ export function resourceLayout(cols, o) {
|
|
|
116
131
|
function printResourceTable(opts) {
|
|
117
132
|
const cols = terminalWidth();
|
|
118
133
|
const syncStrings = opts.rows.map((r) => formatSyncSummary(r.targets, opts));
|
|
119
|
-
const nameW = Math.min(NAME_CAP, Math.max('Name'.length, ...opts.rows.map((r) => stringWidth(r.name))));
|
|
120
|
-
const syncMax =
|
|
134
|
+
const nameW = Math.min(opts.nameCap ?? NAME_CAP, Math.max('Name'.length, ...opts.rows.map((r) => stringWidth(r.name))));
|
|
135
|
+
const syncMax = syncEnabled(opts)
|
|
136
|
+
? Math.max('Synced'.length, ...syncStrings.map((s) => stringWidth(s)))
|
|
137
|
+
: 0;
|
|
121
138
|
const layout = resourceLayout(cols, {
|
|
122
139
|
hasExtra: Boolean(opts.extraLabel),
|
|
123
140
|
hasExtra2: Boolean(opts.extra2Label),
|
|
@@ -153,28 +170,33 @@ function renderResourceWideTable(opts, L, syncStrings) {
|
|
|
153
170
|
if (L.extra2W)
|
|
154
171
|
headerParts.push(cell(opts.extra2Label ?? '', L.extra2W, chalk.bold));
|
|
155
172
|
headerParts.push(cell('Description', L.descW, chalk.bold));
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
173
|
+
if (L.syncW)
|
|
174
|
+
headerParts.push(chalk.bold('Synced'));
|
|
175
|
+
console.log(headerParts.join(' ').trimEnd());
|
|
176
|
+
const contentW = L.nameW + 1 + (L.extraW ? L.extraW + 1 : 0) + (L.extra2W ? L.extra2W + 1 : 0) + L.descW + (L.syncW ? 1 + L.syncW : 0);
|
|
159
177
|
console.log(chalk.gray('─'.repeat(Math.min(contentW, terminalWidth()))));
|
|
160
178
|
opts.rows.forEach((row, i) => {
|
|
179
|
+
// No link here: this path renders only when stdout is not a TTY, where
|
|
180
|
+
// termLink is a no-op. The picker (formatPickerRow) carries the link.
|
|
161
181
|
const parts = [cell(row.name, L.nameW, chalk.cyan)];
|
|
162
182
|
if (L.extraW)
|
|
163
183
|
parts.push(cell(row.extra ?? '-', L.extraW));
|
|
164
184
|
if (L.extra2W)
|
|
165
185
|
parts.push(cell(row.extra2 ?? '-', L.extra2W));
|
|
166
186
|
parts.push(cell(row.description ?? '-', L.descW, chalk.gray));
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
187
|
+
if (L.syncW) {
|
|
188
|
+
let sync = syncStrings[i] ?? '';
|
|
189
|
+
if (stringWidth(sync) > L.syncW)
|
|
190
|
+
sync = chalk.gray(truncateToWidth(sync, L.syncW));
|
|
191
|
+
parts.push(sync);
|
|
192
|
+
}
|
|
193
|
+
console.log(parts.join(' ').trimEnd());
|
|
172
194
|
});
|
|
173
195
|
}
|
|
174
196
|
/** Stacked cards for narrow terminals: name + meta on one line, description below. */
|
|
175
197
|
function renderResourceCards(opts, cols, syncStrings) {
|
|
176
198
|
opts.rows.forEach((row, i) => {
|
|
177
|
-
const meta = [row.extra, row.extra2, stripAnsi(syncStrings[i] ?? '')]
|
|
199
|
+
const meta = [row.extra, row.extra2, syncEnabled(opts) ? stripAnsi(syncStrings[i] ?? '') : '']
|
|
178
200
|
.filter((s) => Boolean(s && s.trim()))
|
|
179
201
|
.join(' · ');
|
|
180
202
|
const metaBudget = Math.max(8, cols - stringWidth(row.name) - 2);
|
package/dist/commands/resume.js
CHANGED
|
@@ -59,8 +59,15 @@ export function registerResumeCommand(program) {
|
|
|
59
59
|
const pinnedHere = consumeResumePinned() || !!options.here;
|
|
60
60
|
const outcome = await resolveSessionMetadataValue(sessionId.trim());
|
|
61
61
|
if (outcome.kind === 'partial') {
|
|
62
|
-
|
|
63
|
-
|
|
62
|
+
// RUSH-2492: an unreachable peer is a warning, not a hard failure. The
|
|
63
|
+
// resolver already resolves an id found on the reachable fleet (SES-9a),
|
|
64
|
+
// so reaching here means the session was not found on any device we COULD
|
|
65
|
+
// reach — it may live on an unreachable peer, which we could not check.
|
|
66
|
+
const offline = outcome.failedPeers;
|
|
67
|
+
console.error(chalk.yellow(`Warning: ${offline.length} device(s) unreachable, not checked: ${offline.join(', ')}`));
|
|
68
|
+
console.error(chalk.red(`No session matching "${sessionId}" on any reachable device (${offline.length} unreachable, not checked).`));
|
|
69
|
+
console.error(chalk.gray(' If it lives on an offline box, wake it (agents devices) or run there: agents ssh <device>'));
|
|
70
|
+
process.exitCode = 1;
|
|
64
71
|
return;
|
|
65
72
|
}
|
|
66
73
|
if (outcome.kind === 'not-found') {
|
|
@@ -46,8 +46,6 @@ export declare function groupRoutineJobsByDevice(jobs: JobConfig[], registry: De
|
|
|
46
46
|
*/
|
|
47
47
|
export declare function groupRoutineJobsByProject(jobs: JobConfig[], knownProjectNames: Set<string>): RoutineListGroup[];
|
|
48
48
|
export declare function buildRunsJson(runs: RunMeta[]): Record<string, unknown>[];
|
|
49
|
-
/** Build the exact structured routine rows shared by `routines list --json`
|
|
50
|
-
* and the one-process AGI Menu snapshot. */
|
|
51
49
|
export declare function buildRoutineListJson(): Record<string, unknown>[];
|
|
52
50
|
/** Register the `agents routines` command tree. */
|
|
53
51
|
export declare function registerRoutinesCommands(program: Command): void;
|