@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
package/dist/lib/versions.js
CHANGED
|
@@ -41,8 +41,9 @@ import { listInstalledSubagents } from './subagents.js';
|
|
|
41
41
|
import { listInstalledWorkflows } from './workflows.js';
|
|
42
42
|
import { parseHookManifest, registerHooksToSettings, selectHookManifest, pruneVersionHomeHookEntriesFromSettings } from './hooks.js';
|
|
43
43
|
import { supports, explainSkip } from './capabilities.js';
|
|
44
|
-
import { discoverPlugins, marketplaceSpecForName } from './plugins.js';
|
|
44
|
+
import { discoverPlugins, syncPluginToVersion, pluginSupportsAgent, cleanOrphanedPluginSkills, marketplaceSpecForName } from './plugins.js';
|
|
45
45
|
import { loadManifest, saveManifest, buildManifest as buildSyncManifest, isStale } from './staleness/index.js';
|
|
46
|
+
import { pruneRemovedResources } from './staleness/prune.js';
|
|
46
47
|
import { emit } from './events.js';
|
|
47
48
|
import { safeJoin } from './paths.js';
|
|
48
49
|
import { readSkillSourceCommandMarker, shouldAlsoInstallCommandAsSkill, shouldInstallCommandAsSkill, } from './command-skills.js';
|
|
@@ -896,6 +897,59 @@ export function parseAgentSpec(spec) {
|
|
|
896
897
|
export function getVersionDir(agent, version) {
|
|
897
898
|
return path.join(getVersionsDir(), agent, version);
|
|
898
899
|
}
|
|
900
|
+
/**
|
|
901
|
+
* Grok binaries are never trusted below this size when picking among several
|
|
902
|
+
* `grok-*` candidates with no exact version match (see
|
|
903
|
+
* {@link resolveGrokFallbackBinary}). Grok's real native binary is ~100MB+; a
|
|
904
|
+
* stray non-binary artifact sharing the `grok-*` naming pattern (a wrapper or
|
|
905
|
+
* alias script) is at most a few hundred bytes, so 1MB comfortably separates
|
|
906
|
+
* the two without depending on file content.
|
|
907
|
+
*/
|
|
908
|
+
const MIN_GROK_BINARY_BYTES = 1_000_000;
|
|
909
|
+
/**
|
|
910
|
+
* Pick the real grok binary among `grok-*` entries in `downloadsDir` when NO
|
|
911
|
+
* filename carries the pinned version string. Grok self-updates its binary in
|
|
912
|
+
* place while running under the shim, so a version-home's downloads dir can
|
|
913
|
+
* accumulate several `grok-*` files whose names have drifted away from that
|
|
914
|
+
* version-home's pinned version (RUSH-2459: on yosemite-s0, version-home
|
|
915
|
+
* `0.2.82` held `grok-1.0.0-linux-aarch64` after grok self-updated, plus a
|
|
916
|
+
* stale, unrelated 99-byte `grok-0.2.118-linux-aarch64` wrapper script that
|
|
917
|
+
* happened to sort alphabetically first).
|
|
918
|
+
*
|
|
919
|
+
* Never blindly take whatever `fs.readdirSync` returns first — that is exactly
|
|
920
|
+
* the bug this replaces. Instead: exclude anything under
|
|
921
|
+
* {@link MIN_GROK_BINARY_BYTES} (rejects wrapper/alias artifacts on size
|
|
922
|
+
* alone, no content sniffing needed) and, among the survivors, prefer the most
|
|
923
|
+
* recently modified — the file grok's self-updater actually wrote last.
|
|
924
|
+
* Returns null (fail loud, never guess) when nothing survives the size filter.
|
|
925
|
+
*/
|
|
926
|
+
export function resolveGrokFallbackBinary(downloadsDir) {
|
|
927
|
+
let entries;
|
|
928
|
+
try {
|
|
929
|
+
entries = fs.readdirSync(downloadsDir);
|
|
930
|
+
}
|
|
931
|
+
catch {
|
|
932
|
+
return null;
|
|
933
|
+
}
|
|
934
|
+
let best = null;
|
|
935
|
+
for (const entry of entries) {
|
|
936
|
+
if (!entry.startsWith('grok-'))
|
|
937
|
+
continue;
|
|
938
|
+
const full = path.join(downloadsDir, entry);
|
|
939
|
+
let stat;
|
|
940
|
+
try {
|
|
941
|
+
stat = fs.statSync(full);
|
|
942
|
+
}
|
|
943
|
+
catch {
|
|
944
|
+
continue;
|
|
945
|
+
}
|
|
946
|
+
if (!stat.isFile() || stat.size < MIN_GROK_BINARY_BYTES)
|
|
947
|
+
continue;
|
|
948
|
+
if (!best || stat.mtimeMs > best.mtimeMs)
|
|
949
|
+
best = { name: entry, mtimeMs: stat.mtimeMs };
|
|
950
|
+
}
|
|
951
|
+
return best ? path.join(downloadsDir, best.name) : null;
|
|
952
|
+
}
|
|
899
953
|
/**
|
|
900
954
|
* Get the binary path for a specific agent version.
|
|
901
955
|
*/
|
|
@@ -909,15 +963,15 @@ export function getBinaryPath(agent, version) {
|
|
|
909
963
|
const match = entries.find((e) => e.includes(version) && e.startsWith('grok-'));
|
|
910
964
|
if (match)
|
|
911
965
|
return path.join(grokDownloads, match);
|
|
912
|
-
const first = entries.find((e) => e.startsWith('grok-'));
|
|
913
|
-
if (first)
|
|
914
|
-
return path.join(grokDownloads, first);
|
|
915
966
|
}
|
|
916
967
|
catch { }
|
|
968
|
+
const fallback = resolveGrokFallbackBinary(grokDownloads);
|
|
969
|
+
if (fallback)
|
|
970
|
+
return fallback;
|
|
917
971
|
return path.join(grokDownloads, `grok-${version}`);
|
|
918
972
|
}
|
|
919
973
|
if (agent === 'droid') {
|
|
920
|
-
// Factory's installer drops a standalone native binary (no npm package,
|
|
974
|
+
// Factory.ai's installer drops a standalone native binary (no npm package,
|
|
921
975
|
// nothing in node_modules/.bin). The binary is global, not per-version —
|
|
922
976
|
// config isolation rides the ~/.factory symlink switch, not a separate
|
|
923
977
|
// binary per version. Install location is platform-specific:
|
|
@@ -941,19 +995,18 @@ export function getBinaryPath(agent, version) {
|
|
|
941
995
|
: path.join(getHomeDir(), '.local', 'bin', 'muse');
|
|
942
996
|
}
|
|
943
997
|
if (agent === 'warp') {
|
|
944
|
-
// Warp Agent CLI installs a single global, self-updating `
|
|
945
|
-
//
|
|
946
|
-
// droid/muse
|
|
947
|
-
//
|
|
948
|
-
//
|
|
949
|
-
//
|
|
950
|
-
|
|
951
|
-
const onPath = findInPath('oz');
|
|
998
|
+
// Warp Agent CLI installs a single global, self-updating `warp` binary at
|
|
999
|
+
// ~/.local/bin/warp via the curl installer (Windows: the agent-cli.ps1) —
|
|
1000
|
+
// like droid/muse. Resolve the real binary on PATH (findInPath skips our own
|
|
1001
|
+
// shims dir) so isVersionInstalled / agents view agree with what executes.
|
|
1002
|
+
// When warp is not installed, fall back to its default install path so
|
|
1003
|
+
// isVersionInstalled reports uninstalled honestly.
|
|
1004
|
+
const onPath = findInPath('warp');
|
|
952
1005
|
if (onPath)
|
|
953
1006
|
return onPath;
|
|
954
1007
|
return IS_WINDOWS
|
|
955
|
-
? path.join(getHomeDir(), 'bin', '
|
|
956
|
-
: '
|
|
1008
|
+
? path.join(getHomeDir(), 'bin', 'warp.exe')
|
|
1009
|
+
: path.join(getHomeDir(), '.local', 'bin', 'warp');
|
|
957
1010
|
}
|
|
958
1011
|
const versionDir = getVersionDir(agent, version);
|
|
959
1012
|
return path.join(versionDir, 'node_modules', '.bin', agentConfig.cliCommand);
|
|
@@ -2528,36 +2581,89 @@ function resourceSourceMap(kind, cwd, available) {
|
|
|
2528
2581
|
}
|
|
2529
2582
|
}
|
|
2530
2583
|
}
|
|
2584
|
+
/**
|
|
2585
|
+
* Build a ResourceSelection from source-pattern expansion and an optional
|
|
2586
|
+
* per-kind name filter. Both dimensions are optional and compose:
|
|
2587
|
+
*
|
|
2588
|
+
* patterns only → resources from those source layers (all matching names)
|
|
2589
|
+
* kindFilter only → only those specific kinds / names, no source restriction
|
|
2590
|
+
* both combined → patterns scope the source layer; kindFilter further
|
|
2591
|
+
* limits which names within each kind are included
|
|
2592
|
+
*
|
|
2593
|
+
* Typical callers:
|
|
2594
|
+
* `--repo system` → buildSelection(['system:*'])
|
|
2595
|
+
* `--plugin` → buildSelection([], { plugins: 'all' })
|
|
2596
|
+
* `--plugin fleet` → buildSelection([], { plugins: ['fleet'] })
|
|
2597
|
+
* no flags → buildSelection([]) → full selection
|
|
2598
|
+
*
|
|
2599
|
+
* Memory (`kindFilter.memory`):
|
|
2600
|
+
* - Always `'all'` when patterns are active (repo scope must recompile the
|
|
2601
|
+
* composed file from all layers, RUSH-1354).
|
|
2602
|
+
* - `'all'` when `kindFilter.memory` is set (--rule / --memory flag).
|
|
2603
|
+
* - Absent (skipped) when kindFilter is given but does not include memory,
|
|
2604
|
+
* so `--plugin fleet` does NOT trigger a memory recompile.
|
|
2605
|
+
* - `'all'` when no kindFilter is given (full sync includes everything).
|
|
2606
|
+
*/
|
|
2607
|
+
export function buildSelection(patterns, kindFilter, cwd = process.cwd()) {
|
|
2608
|
+
const hasPatterns = patterns.length > 0;
|
|
2609
|
+
const hasKindFilter = kindFilter !== undefined;
|
|
2610
|
+
// Fast path: no restrictions → sync every kind
|
|
2611
|
+
if (!hasPatterns && !hasKindFilter) {
|
|
2612
|
+
return {
|
|
2613
|
+
commands: 'all', skills: 'all', hooks: 'all',
|
|
2614
|
+
subagents: 'all', permissions: 'all', mcp: 'all',
|
|
2615
|
+
plugins: 'all', workflows: 'all', memory: 'all',
|
|
2616
|
+
};
|
|
2617
|
+
}
|
|
2618
|
+
const selection = {};
|
|
2619
|
+
const allKinds = [
|
|
2620
|
+
'commands', 'skills', 'hooks', 'subagents',
|
|
2621
|
+
'permissions', 'mcp', 'plugins', 'workflows',
|
|
2622
|
+
];
|
|
2623
|
+
const available = hasPatterns ? getAvailableResources(cwd) : undefined;
|
|
2624
|
+
for (const kind of allKinds) {
|
|
2625
|
+
const filterVal = kindFilter?.[kind];
|
|
2626
|
+
// When a kind filter is active, skip kinds not listed in it
|
|
2627
|
+
if (hasKindFilter && filterVal === undefined)
|
|
2628
|
+
continue;
|
|
2629
|
+
if (hasPatterns) {
|
|
2630
|
+
const sourceMap = resourceSourceMap(kind, cwd, available);
|
|
2631
|
+
const patternNames = expandPatterns(patterns, sourceMap);
|
|
2632
|
+
if (patternNames.length === 0)
|
|
2633
|
+
continue;
|
|
2634
|
+
if (!filterVal || filterVal === 'all') {
|
|
2635
|
+
selection[kind] = patternNames;
|
|
2636
|
+
}
|
|
2637
|
+
else {
|
|
2638
|
+
// Intersect pattern-expanded names with the caller's name filter
|
|
2639
|
+
const filterSet = new Set(filterVal);
|
|
2640
|
+
const intersected = patternNames.filter(n => filterSet.has(n));
|
|
2641
|
+
if (intersected.length > 0)
|
|
2642
|
+
selection[kind] = intersected;
|
|
2643
|
+
}
|
|
2644
|
+
}
|
|
2645
|
+
else {
|
|
2646
|
+
// Kind filter only — no pattern restriction; use the filter value directly
|
|
2647
|
+
selection[kind] = filterVal === 'all' || !filterVal ? 'all' : filterVal;
|
|
2648
|
+
}
|
|
2649
|
+
}
|
|
2650
|
+
// Memory is always 'all' when patterns are active (RUSH-1354), when the
|
|
2651
|
+
// memory/rule flag was given, or when no kind filter restricts what is synced.
|
|
2652
|
+
const memoryRequested = hasPatterns || kindFilter?.memory !== undefined || !hasKindFilter;
|
|
2653
|
+
if (memoryRequested)
|
|
2654
|
+
selection.memory = 'all';
|
|
2655
|
+
return selection;
|
|
2656
|
+
}
|
|
2531
2657
|
/**
|
|
2532
2658
|
* Build a ResourceSelection scoped to a single DotAgent repo (`system`,
|
|
2533
|
-
* `user`, `project`, or an extra-repo alias).
|
|
2534
|
-
*
|
|
2535
|
-
* name→source maps and `source:*` pattern expansion the persisted-pattern
|
|
2536
|
-
* sync path uses. Passing the result as an explicit `selection` means the sync
|
|
2537
|
-
* touches only that repo's resources — no orphan-sweep of the other layers.
|
|
2659
|
+
* `user`, `project`, or an extra-repo alias). Delegates to `buildSelection`
|
|
2660
|
+
* so the source-map and pattern-expansion logic stays in one place.
|
|
2538
2661
|
*
|
|
2539
|
-
* `memory` is
|
|
2540
|
-
*
|
|
2541
|
-
* recompile it in the same pass (RUSH-1354). Leaving it out — or using the
|
|
2542
|
-
* `[]` skip-sentinel — silently strands the memory file at its old content
|
|
2543
|
-
* whenever a repo-scoped sync runs after a rules change. `'all'` makes
|
|
2544
|
-
* `syncResourcesToVersion` recompose from every layer via the active preset,
|
|
2545
|
-
* exactly as an unscoped full reconcile does.
|
|
2662
|
+
* `memory` is always `'all'`: the composed rules-memory file spans all layers
|
|
2663
|
+
* and must be recompiled in the same pass (RUSH-1354).
|
|
2546
2664
|
*/
|
|
2547
2665
|
export function buildRepoScopedSelection(repo, cwd = process.cwd()) {
|
|
2548
|
-
|
|
2549
|
-
const available = getAvailableResources(cwd);
|
|
2550
|
-
const selection = {};
|
|
2551
|
-
const kinds = ['commands', 'skills', 'hooks', 'subagents', 'permissions', 'mcp', 'plugins', 'workflows'];
|
|
2552
|
-
for (const kind of kinds) {
|
|
2553
|
-
const names = expandPatterns(patterns, resourceSourceMap(kind, cwd, available));
|
|
2554
|
-
if (names.length > 0)
|
|
2555
|
-
selection[kind] = names;
|
|
2556
|
-
}
|
|
2557
|
-
// Recompile the memory file from all layers even under a repo scope — it is
|
|
2558
|
-
// composed, not a per-repo artifact (see skipMemory below and RUSH-1354).
|
|
2559
|
-
selection.memory = 'all';
|
|
2560
|
-
return selection;
|
|
2666
|
+
return buildSelection([`${repo}:*`], undefined, cwd);
|
|
2561
2667
|
}
|
|
2562
2668
|
/**
|
|
2563
2669
|
* Union several ResourceSelections into one, deduping names per kind. Pure — no
|
|
@@ -2605,7 +2711,7 @@ export function mergeRepoScopedSelections(repos, cwd = process.cwd()) {
|
|
|
2605
2711
|
*/
|
|
2606
2712
|
export function syncResourcesToVersion(agent, version, selection, options = {}) {
|
|
2607
2713
|
if (isAgentHardDeprecated(agent)) {
|
|
2608
|
-
return { commands: false, skills: false, hooks: false, memory: [], permissions: false, mcp: [], subagents: [], plugins: [], workflows: [], projectSkipped: [] };
|
|
2714
|
+
return { commands: false, skills: false, hooks: false, memory: [], permissions: false, mcp: [], subagents: [], plugins: [], workflows: [], projectSkipped: [], pruned: { commands: [], skills: [] } };
|
|
2609
2715
|
}
|
|
2610
2716
|
const agentConfig = AGENTS[agent];
|
|
2611
2717
|
const versionHome = getVersionHomePath(agent, version);
|
|
@@ -2616,7 +2722,7 @@ export function syncResourcesToVersion(agent, version, selection, options = {})
|
|
|
2616
2722
|
// care about the ORIGINAL intent: a caller passing no selection means
|
|
2617
2723
|
// "full sync; persist the staleness manifest after."
|
|
2618
2724
|
const userPassedSelection = selection !== undefined;
|
|
2619
|
-
const result = { commands: false, skills: false, hooks: false, memory: [], permissions: false, mcp: [], subagents: [], plugins: [], workflows: [], projectSkipped: [] };
|
|
2725
|
+
const result = { commands: false, skills: false, hooks: false, memory: [], permissions: false, mcp: [], subagents: [], plugins: [], workflows: [], projectSkipped: [], pruned: { commands: [], skills: [] } };
|
|
2620
2726
|
const cwd = options.cwd || process.cwd();
|
|
2621
2727
|
const projectAgentsDir = options.projectDir || getProjectAgentsDir(cwd);
|
|
2622
2728
|
const userAgentsDir = getUserAgentsDir();
|
|
@@ -3037,10 +3143,27 @@ export function syncResourcesToVersion(agent, version, selection, options = {})
|
|
|
3037
3143
|
}
|
|
3038
3144
|
}
|
|
3039
3145
|
}
|
|
3040
|
-
// Sync plugins — dispatch through WRITERS.plugins
|
|
3146
|
+
// Sync plugins — dispatch through WRITERS.plugins (or directly via
|
|
3147
|
+
// syncPluginToVersion when allowExecSurfaces is requested, since WriteArgs
|
|
3148
|
+
// has no channel for that option).
|
|
3041
3149
|
if (pluginsToSync.length > 0 && pluginsWriter) {
|
|
3042
|
-
|
|
3043
|
-
|
|
3150
|
+
if (options.allowExecSurfaces) {
|
|
3151
|
+
const allPlugins = discoverPlugins();
|
|
3152
|
+
cleanOrphanedPluginSkills(agent, versionHome, new Set(allPlugins.map(p => p.name)));
|
|
3153
|
+
const pluginMap = new Map(allPlugins.map(p => [p.name, p]));
|
|
3154
|
+
for (const name of pluginsToSync) {
|
|
3155
|
+
const plugin = pluginMap.get(name);
|
|
3156
|
+
if (!plugin || !pluginSupportsAgent(plugin, agent))
|
|
3157
|
+
continue;
|
|
3158
|
+
const r = syncPluginToVersion(plugin, agent, versionHome, { version, allowExecSurfaces: true });
|
|
3159
|
+
if (r.success)
|
|
3160
|
+
result.plugins.push(name);
|
|
3161
|
+
}
|
|
3162
|
+
}
|
|
3163
|
+
else {
|
|
3164
|
+
const r = pluginsWriter.write({ version, versionHome, selection: pluginsToSync, cwd });
|
|
3165
|
+
result.plugins.push(...r.synced);
|
|
3166
|
+
}
|
|
3044
3167
|
}
|
|
3045
3168
|
// Sync workflows — dispatch through WRITERS.workflows.
|
|
3046
3169
|
const workflowsWriter = getWriter('workflows', agent);
|
|
@@ -3068,6 +3191,33 @@ export function syncResourcesToVersion(agent, version, selection, options = {})
|
|
|
3068
3191
|
if (supports(agent, 'memory', version).ok) {
|
|
3069
3192
|
syncMemoryToVersionHome(agent, versionHome, cwd);
|
|
3070
3193
|
}
|
|
3194
|
+
// Prune resources deleted from source (RUSH-2438). Runs only on a repo-scope
|
|
3195
|
+
// reconcile (`options.prune`) with a caller selection — a full sync
|
|
3196
|
+
// (`!userPassedSelection`) already sweeps orphans above, and an additive
|
|
3197
|
+
// interactive/`agents add` selection must not delete anything. The prune is
|
|
3198
|
+
// manifest-bounded: only names the last full sync recorded are candidates,
|
|
3199
|
+
// and only when they are gone from ALL source layers — so a user-authored
|
|
3200
|
+
// file the sync never placed, or a same-named resource still provided by
|
|
3201
|
+
// another layer, is never removed. No manifest → fail loud (delete nothing).
|
|
3202
|
+
if (options.prune && userPassedSelection) {
|
|
3203
|
+
const previousManifest = loadManifest(agent, version);
|
|
3204
|
+
const outcome = pruneRemovedResources({
|
|
3205
|
+
agent,
|
|
3206
|
+
version,
|
|
3207
|
+
versionHome,
|
|
3208
|
+
cwd,
|
|
3209
|
+
previousManifest,
|
|
3210
|
+
sourceNames: {
|
|
3211
|
+
commands: available.commands,
|
|
3212
|
+
skills: available.skills,
|
|
3213
|
+
},
|
|
3214
|
+
});
|
|
3215
|
+
result.pruned = outcome.pruned;
|
|
3216
|
+
if (outcome.skippedNoManifest) {
|
|
3217
|
+
console.warn(`agents: prune skipped for ${agent}@${version} — no sync manifest yet, so no removed resources were pruned. ` +
|
|
3218
|
+
`Run 'agents sync ${agent}@${version}' (a full sync) to establish the baseline.`);
|
|
3219
|
+
}
|
|
3220
|
+
}
|
|
3071
3221
|
// Write manifest after a full sync (no user-passed selection) so the next
|
|
3072
3222
|
// launch can skip the slow path. Pattern-derived selections still count as
|
|
3073
3223
|
// "full" — the agents.yaml patterns describe the intended scope, not a
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** Same path the
|
|
1
|
+
/** Same path the Fleet reader pulls (apps/ext/src/core/watchdogLog.ts). */
|
|
2
2
|
export declare const WATCHDOG_LOG_PATH: string;
|
|
3
3
|
/** Kinds the Factory reader accepts. Keep in lockstep with watchdogLog.ts. */
|
|
4
4
|
export type WatchdogEventKind = 'tick' | 'decision' | 'nudge' | 'rotate' | 'error';
|
package/dist/lib/watchdog/log.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Canonical watchdog event log (watchdog-brain-v2).
|
|
3
3
|
*
|
|
4
|
-
* The
|
|
4
|
+
* The Fleet renders a read-only "Watchdog activity" card from the JSONL
|
|
5
5
|
* feed at ~/.agents/.cache/logs/watchdog.log. That feed was historically written
|
|
6
6
|
* by the retired extension-side watchdog; now the always-on CLI watchdog owns it.
|
|
7
7
|
*
|
|
8
8
|
* The event SHAPE here is a deliberate, verbatim replica of the reader in
|
|
9
|
-
* apps/
|
|
9
|
+
* apps/ext/src/core/watchdogLog.ts (WatchdogEvent / WatchdogEventKind /
|
|
10
10
|
* WATCHDOG_LOG_PATH / the trim cap). The repo forbids cross-app imports
|
|
11
11
|
* (CLAUDE.md repo map), so the two files are kept in sync by hand — a change to
|
|
12
12
|
* the Factory reader's shape must be mirrored here. There is no import between
|
|
@@ -16,7 +16,7 @@ import * as fs from 'fs';
|
|
|
16
16
|
import * as os from 'os';
|
|
17
17
|
import * as path from 'path';
|
|
18
18
|
import { withFileLock, atomicWriteFileSync, ensureLockTarget } from '../fs-atomic.js';
|
|
19
|
-
/** Same path the
|
|
19
|
+
/** Same path the Fleet reader pulls (apps/ext/src/core/watchdogLog.ts). */
|
|
20
20
|
export const WATCHDOG_LOG_PATH = path.join(os.homedir(), '.agents', '.cache', 'logs', 'watchdog.log');
|
|
21
21
|
const WATCHDOG_EVENT_KINDS = new Set(['tick', 'decision', 'nudge', 'rotate', 'error']);
|
|
22
22
|
/** Parse the audit log without letting a partial final append hide valid rows. */
|
|
@@ -7,13 +7,13 @@
|
|
|
7
7
|
* weekly limit · resets …"), the daemon watchdog rotates it instead of nudging:
|
|
8
8
|
*
|
|
9
9
|
* 1. DETECT — classifyTailForRotate() matches the tail against the limit
|
|
10
|
-
* patterns (ported from apps/
|
|
10
|
+
* patterns (ported from apps/ext/src/core/autoRotate.ts) and parses the
|
|
11
11
|
* `resets <time>` clause when present.
|
|
12
12
|
* 2. GATE — defaultRotateGate() runs the SAME first-party selection
|
|
13
13
|
* `agents run auto` would (collectHarnessCandidates + pickHarnessWeighted,
|
|
14
14
|
* ../rotate.ts). Zero healthy → ONE `rotate` skip event per cooldown window
|
|
15
15
|
* and the terminal is left untouched. No `agents view` subprocess anywhere.
|
|
16
|
-
* 3. RELAUNCH — the per-harness exit sequence (ported from apps/
|
|
16
|
+
* 3. RELAUNCH — the per-harness exit sequence (ported from apps/ext
|
|
17
17
|
* prewarm.ts PREWARM_CONFIGS) is injected, then
|
|
18
18
|
* `agents run auto --interactive --session-id <uuid>`.
|
|
19
19
|
* 4. REPLAY — when the new session's TUI is live (bounded wait, default
|
|
@@ -31,7 +31,7 @@ import type { InjectTarget } from '../terminal/inject.js';
|
|
|
31
31
|
import type { ActiveSession } from '../session/active.js';
|
|
32
32
|
/**
|
|
33
33
|
* Agent-reported hard-limit texts, matched against a session transcript tail.
|
|
34
|
-
* Ported verbatim from apps/
|
|
34
|
+
* Ported verbatim from apps/ext/src/core/autoRotate.ts RATE_LIMIT_PATTERNS —
|
|
35
35
|
* kept specific on purpose: a transcript carries prose, so a loose "rate limit"
|
|
36
36
|
* match would rotate terminals whose agent merely DISCUSSED limits. The first
|
|
37
37
|
* two patterns cover the weekly/session variants, including claude's
|
|
@@ -54,7 +54,7 @@ export type RotateTailVerdict = {
|
|
|
54
54
|
export declare function classifyTailForRotate(tailLines: string[], nowMs: number): RotateTailVerdict;
|
|
55
55
|
/**
|
|
56
56
|
* Parse the `resets <time>` clause of a limit line into an epoch-ms horizon.
|
|
57
|
-
* Ported from apps/
|
|
57
|
+
* Ported from apps/ext/src/core/autoRotate.ts parseResetTimeMs (behavior
|
|
58
58
|
* verbatim): the ISO form (milliseconds + Z) is matched EXPLICITLY and first —
|
|
59
59
|
* a generic capture stops at the milliseconds dot and drops the Z, which makes
|
|
60
60
|
* Date.parse read LOCAL time (the suppression would end hours off). Time-of-day
|
|
@@ -64,7 +64,7 @@ export declare function classifyTailForRotate(tailLines: string[], nowMs: number
|
|
|
64
64
|
*/
|
|
65
65
|
export declare function parseRotateResetMs(text: string, nowMs: number): number | undefined;
|
|
66
66
|
/**
|
|
67
|
-
* Clean-exit key sequences per harness, ported verbatim from apps/
|
|
67
|
+
* Clean-exit key sequences per harness, ported verbatim from apps/ext
|
|
68
68
|
* prewarm.ts PREWARM_CONFIGS. Injected as RAW BYTES with no trailing Enter — a
|
|
69
69
|
* literal \x03 written to the pty IS Ctrl+C (SIGINT), \x1b IS Esc. claude's Ink
|
|
70
70
|
* TUI needs the Esc first to leave any open mode before the interrupt pair.
|
|
@@ -76,7 +76,7 @@ export declare function exitSequenceFor(agent: string): string[];
|
|
|
76
76
|
/**
|
|
77
77
|
* The rotate relaunch, typed into the same tab: full auto — the CLI resolves
|
|
78
78
|
* host (affinity) → harness (cross-harness headroom) → account (balanced) and
|
|
79
|
-
* exits nonzero when every layer is exhausted. Ported from apps/
|
|
79
|
+
* exits nonzero when every layer is exhausted. Ported from apps/ext
|
|
80
80
|
* autoRotate.ts buildAutoRotateLaunchCommand. A terminal on a REMOTE device
|
|
81
81
|
* rotates ON that device (`--host`); a local terminal omits it. `--session-id`
|
|
82
82
|
* is honored only when the CLI picks claude (existing claude-only semantics)
|
|
@@ -7,13 +7,13 @@
|
|
|
7
7
|
* weekly limit · resets …"), the daemon watchdog rotates it instead of nudging:
|
|
8
8
|
*
|
|
9
9
|
* 1. DETECT — classifyTailForRotate() matches the tail against the limit
|
|
10
|
-
* patterns (ported from apps/
|
|
10
|
+
* patterns (ported from apps/ext/src/core/autoRotate.ts) and parses the
|
|
11
11
|
* `resets <time>` clause when present.
|
|
12
12
|
* 2. GATE — defaultRotateGate() runs the SAME first-party selection
|
|
13
13
|
* `agents run auto` would (collectHarnessCandidates + pickHarnessWeighted,
|
|
14
14
|
* ../rotate.ts). Zero healthy → ONE `rotate` skip event per cooldown window
|
|
15
15
|
* and the terminal is left untouched. No `agents view` subprocess anywhere.
|
|
16
|
-
* 3. RELAUNCH — the per-harness exit sequence (ported from apps/
|
|
16
|
+
* 3. RELAUNCH — the per-harness exit sequence (ported from apps/ext
|
|
17
17
|
* prewarm.ts PREWARM_CONFIGS) is injected, then
|
|
18
18
|
* `agents run auto --interactive --session-id <uuid>`.
|
|
19
19
|
* 4. REPLAY — when the new session's TUI is live (bounded wait, default
|
|
@@ -35,7 +35,7 @@ import { resolveWatchdogSessionPath } from './read.js';
|
|
|
35
35
|
// --- detection ---------------------------------------------------------------
|
|
36
36
|
/**
|
|
37
37
|
* Agent-reported hard-limit texts, matched against a session transcript tail.
|
|
38
|
-
* Ported verbatim from apps/
|
|
38
|
+
* Ported verbatim from apps/ext/src/core/autoRotate.ts RATE_LIMIT_PATTERNS —
|
|
39
39
|
* kept specific on purpose: a transcript carries prose, so a loose "rate limit"
|
|
40
40
|
* match would rotate terminals whose agent merely DISCUSSED limits. The first
|
|
41
41
|
* two patterns cover the weekly/session variants, including claude's
|
|
@@ -66,7 +66,7 @@ export function classifyTailForRotate(tailLines, nowMs) {
|
|
|
66
66
|
}
|
|
67
67
|
/**
|
|
68
68
|
* Parse the `resets <time>` clause of a limit line into an epoch-ms horizon.
|
|
69
|
-
* Ported from apps/
|
|
69
|
+
* Ported from apps/ext/src/core/autoRotate.ts parseResetTimeMs (behavior
|
|
70
70
|
* verbatim): the ISO form (milliseconds + Z) is matched EXPLICITLY and first —
|
|
71
71
|
* a generic capture stops at the milliseconds dot and drops the Z, which makes
|
|
72
72
|
* Date.parse read LOCAL time (the suppression would end hours off). Time-of-day
|
|
@@ -137,7 +137,7 @@ function nextOccurrenceMs(hour, minute, timeZone, nowMs) {
|
|
|
137
137
|
}
|
|
138
138
|
// --- exit sequences ------------------------------------------------------------
|
|
139
139
|
/**
|
|
140
|
-
* Clean-exit key sequences per harness, ported verbatim from apps/
|
|
140
|
+
* Clean-exit key sequences per harness, ported verbatim from apps/ext
|
|
141
141
|
* prewarm.ts PREWARM_CONFIGS. Injected as RAW BYTES with no trailing Enter — a
|
|
142
142
|
* literal \x03 written to the pty IS Ctrl+C (SIGINT), \x1b IS Esc. claude's Ink
|
|
143
143
|
* TUI needs the Esc first to leave any open mode before the interrupt pair.
|
|
@@ -158,7 +158,7 @@ export function exitSequenceFor(agent) {
|
|
|
158
158
|
/**
|
|
159
159
|
* The rotate relaunch, typed into the same tab: full auto — the CLI resolves
|
|
160
160
|
* host (affinity) → harness (cross-harness headroom) → account (balanced) and
|
|
161
|
-
* exits nonzero when every layer is exhausted. Ported from apps/
|
|
161
|
+
* exits nonzero when every layer is exhausted. Ported from apps/ext
|
|
162
162
|
* autoRotate.ts buildAutoRotateLaunchCommand. A terminal on a REMOTE device
|
|
163
163
|
* rotates ON that device (`--host`); a local terminal omits it. `--session-id`
|
|
164
164
|
* is honored only when the CLI picks claude (existing claude-only semantics)
|
package/dist/lib/workflows.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ import type { AgentId } from './types.js';
|
|
|
9
9
|
/**
|
|
10
10
|
* The `loop:` block as it appears in WORKFLOW.md frontmatter (YAML, snake_case).
|
|
11
11
|
* Parsed defensively and translated to the camelCase LoopConfig the driver
|
|
12
|
-
* consumes (src/lib/loop.ts). See docs/
|
|
12
|
+
* consumes (src/lib/loop.ts). See docs/entrypoints-and-loops.md.
|
|
13
13
|
*/
|
|
14
14
|
export interface LoopConfigRaw {
|
|
15
15
|
/** Stop condition. Only `signal` is supported today. */
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import * as yaml from 'yaml';
|
|
2
|
+
/**
|
|
3
|
+
* The single serialization used by every writer that edits a shared, committed
|
|
4
|
+
* YAML document in place.
|
|
5
|
+
*
|
|
6
|
+
* RUSH-2505 had two halves. The first: the `yaml` emitter pads flow collections
|
|
7
|
+
* by default, so a round trip rewrote
|
|
8
|
+
*
|
|
9
|
+
* command: [agents, notify, "{message}"]
|
|
10
|
+
* as
|
|
11
|
+
* command: [ agents, notify, "{message}" ]
|
|
12
|
+
*
|
|
13
|
+
* The second, which outlived the first fix: `agents.yaml` has five in-place
|
|
14
|
+
* writers, and they did not agree on collection style. `state.ts` and
|
|
15
|
+
* `manifest.ts` forced block while `feed.ts`, `activity.ts` and `migrate.ts`
|
|
16
|
+
* took the defaults, so an empty map came out as
|
|
17
|
+
*
|
|
18
|
+
* mcp: from two of them, and mcp: {}
|
|
19
|
+
* {} from the other three,
|
|
20
|
+
*
|
|
21
|
+
* and each group rewrote the other's output on the next command.
|
|
22
|
+
*
|
|
23
|
+
* Both diffs are semantically no-ops, which is what made them dangerous. The
|
|
24
|
+
* working tree went permanently dirty, then `agents repo pull` refused
|
|
25
|
+
* ("Blocked by local changes") and `git merge --ff-only` refused, so the box
|
|
26
|
+
* silently stopped receiving fleet config. Seven boxes fell 37-52 commits
|
|
27
|
+
* behind and nothing reported it.
|
|
28
|
+
*
|
|
29
|
+
* Two constraints pull in opposite directions, and both are real:
|
|
30
|
+
*
|
|
31
|
+
* - Forcing `collectionStyle: 'block'` unconditionally flattens a committed
|
|
32
|
+
* flow sequence into a block list — its own dirtying diff, asserted against
|
|
33
|
+
* by the RUSH-2505 case in `feed.test.ts`.
|
|
34
|
+
* - Never forcing it regresses what `state.ts` and `manifest.ts` were guarding:
|
|
35
|
+
* when the document ROOT is flow (a legacy `{}` or `{a: 1}` file), every
|
|
36
|
+
* edited node inherits flow, so a `doc.set()` yields
|
|
37
|
+
* `{a: 1, disabledCommands: [teams]}` instead of a block mapping.
|
|
38
|
+
*
|
|
39
|
+
* So block is forced exactly when the root is flow, which is the only case that
|
|
40
|
+
* needs it, and left alone otherwise. Every writer gets the same rule, so the
|
|
41
|
+
* same document can only produce one result and there is nothing left to
|
|
42
|
+
* oscillate.
|
|
43
|
+
*
|
|
44
|
+
* Caller options merge last, so a writer with a genuine reason to differ still
|
|
45
|
+
* can — but it then owns the drift it causes.
|
|
46
|
+
*/
|
|
47
|
+
export declare function stringifyDoc(doc: yaml.Document, options?: yaml.ToStringOptions): string;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The single serialization used by every writer that edits a shared, committed
|
|
3
|
+
* YAML document in place.
|
|
4
|
+
*
|
|
5
|
+
* RUSH-2505 had two halves. The first: the `yaml` emitter pads flow collections
|
|
6
|
+
* by default, so a round trip rewrote
|
|
7
|
+
*
|
|
8
|
+
* command: [agents, notify, "{message}"]
|
|
9
|
+
* as
|
|
10
|
+
* command: [ agents, notify, "{message}" ]
|
|
11
|
+
*
|
|
12
|
+
* The second, which outlived the first fix: `agents.yaml` has five in-place
|
|
13
|
+
* writers, and they did not agree on collection style. `state.ts` and
|
|
14
|
+
* `manifest.ts` forced block while `feed.ts`, `activity.ts` and `migrate.ts`
|
|
15
|
+
* took the defaults, so an empty map came out as
|
|
16
|
+
*
|
|
17
|
+
* mcp: from two of them, and mcp: {}
|
|
18
|
+
* {} from the other three,
|
|
19
|
+
*
|
|
20
|
+
* and each group rewrote the other's output on the next command.
|
|
21
|
+
*
|
|
22
|
+
* Both diffs are semantically no-ops, which is what made them dangerous. The
|
|
23
|
+
* working tree went permanently dirty, then `agents repo pull` refused
|
|
24
|
+
* ("Blocked by local changes") and `git merge --ff-only` refused, so the box
|
|
25
|
+
* silently stopped receiving fleet config. Seven boxes fell 37-52 commits
|
|
26
|
+
* behind and nothing reported it.
|
|
27
|
+
*
|
|
28
|
+
* Two constraints pull in opposite directions, and both are real:
|
|
29
|
+
*
|
|
30
|
+
* - Forcing `collectionStyle: 'block'` unconditionally flattens a committed
|
|
31
|
+
* flow sequence into a block list — its own dirtying diff, asserted against
|
|
32
|
+
* by the RUSH-2505 case in `feed.test.ts`.
|
|
33
|
+
* - Never forcing it regresses what `state.ts` and `manifest.ts` were guarding:
|
|
34
|
+
* when the document ROOT is flow (a legacy `{}` or `{a: 1}` file), every
|
|
35
|
+
* edited node inherits flow, so a `doc.set()` yields
|
|
36
|
+
* `{a: 1, disabledCommands: [teams]}` instead of a block mapping.
|
|
37
|
+
*
|
|
38
|
+
* So block is forced exactly when the root is flow, which is the only case that
|
|
39
|
+
* needs it, and left alone otherwise. Every writer gets the same rule, so the
|
|
40
|
+
* same document can only produce one result and there is nothing left to
|
|
41
|
+
* oscillate.
|
|
42
|
+
*
|
|
43
|
+
* Caller options merge last, so a writer with a genuine reason to differ still
|
|
44
|
+
* can — but it then owns the drift it causes.
|
|
45
|
+
*/
|
|
46
|
+
export function stringifyDoc(doc, options = {}) {
|
|
47
|
+
// A flow root makes every edited node render flow; normalize the whole doc to
|
|
48
|
+
// block in that case only. `contents.flow` is undefined for a block root.
|
|
49
|
+
const rootIsFlow = doc.contents?.flow === true;
|
|
50
|
+
return doc.toString({
|
|
51
|
+
flowCollectionPadding: false,
|
|
52
|
+
...(rootIsFlow ? { collectionStyle: 'block' } : {}),
|
|
53
|
+
...options,
|
|
54
|
+
});
|
|
55
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@phnx-labs/agents-cli",
|
|
3
|
-
"version": "1.22.
|
|
3
|
+
"version": "1.22.37",
|
|
4
4
|
"description": "One CLI for all your AI coding agents - versions, config, cloud dispatch, sessions, and teams (now with first-class Grok Build CLI support)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -95,6 +95,7 @@
|
|
|
95
95
|
"@zed-industries/agent-client-protocol": "0.4.5",
|
|
96
96
|
"acorn": "8.18.0",
|
|
97
97
|
"age-encryption": "0.3.0",
|
|
98
|
+
"aws4fetch": "1.0.20",
|
|
98
99
|
"chalk": "5.6.2",
|
|
99
100
|
"commander": "15.0.0",
|
|
100
101
|
"croner": "10.0.1",
|
|
@@ -72,8 +72,8 @@ function main() {
|
|
|
72
72
|
if (!src) {
|
|
73
73
|
// No source bundle to install. Stay silent during postinstall so we don't
|
|
74
74
|
// create noise on Linux/Windows or on builds that intentionally omit the
|
|
75
|
-
// helper.
|
|
76
|
-
// actually needs the helper.
|
|
75
|
+
// helper. The lazy staleness check in getKeychainHelperPath() surfaces a
|
|
76
|
+
// clearer error if a user actually needs the helper.
|
|
77
77
|
return;
|
|
78
78
|
}
|
|
79
79
|
|