@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/migrate.js
CHANGED
|
@@ -8,84 +8,25 @@ import * as fs from 'fs';
|
|
|
8
8
|
import * as path from 'path';
|
|
9
9
|
import * as os from 'os';
|
|
10
10
|
import * as yaml from 'yaml';
|
|
11
|
+
import { stringifyDoc } from './yaml-io.js';
|
|
11
12
|
import { execSync } from 'child_process';
|
|
12
13
|
import { atomicWriteFileSync } from './fs-atomic.js';
|
|
13
14
|
import { machineId } from './machine-id.js';
|
|
14
15
|
import { AGENTS, agentConfigDirName, findInPath } from './agents.js';
|
|
15
16
|
import { createLink } from './platform/index.js';
|
|
16
|
-
import {
|
|
17
|
-
|
|
17
|
+
import { foldLegacySystemRepo, copyDirSkipExisting } from './migrate-fold.js';
|
|
18
|
+
export { foldLegacySystemRepo } from './migrate-fold.js';
|
|
19
|
+
import { migrateLegacyRoutineActivation, listJobs, validateJob } from './routines.js';
|
|
20
|
+
import { setConfigValue } from './device-config.js';
|
|
21
|
+
import { enabledRoutineNames, replaceEnabledRoutines } from './routine-activation.js';
|
|
18
22
|
import { evaluateActivationReadiness } from './routine-readiness.js';
|
|
19
|
-
import {
|
|
23
|
+
import { migrateDeviceConfigToCentral } from './devices/config-migration.js';
|
|
20
24
|
const HOME = process.env.HOME ?? os.homedir();
|
|
21
25
|
const USER_DIR = path.join(HOME, '.agents');
|
|
22
26
|
/** Canonical system-repo location (post-fold). */
|
|
23
27
|
const SYSTEM_DIR = path.join(USER_DIR, '.system');
|
|
24
|
-
/** Legacy system-repo location — folded into SYSTEM_DIR by foldLegacySystemRepo(). */
|
|
25
|
-
const LEGACY_SYSTEM_DIR = path.join(HOME, '.agents-system');
|
|
26
28
|
const HISTORY_DIR = path.join(USER_DIR, '.history');
|
|
27
29
|
const CACHE_DIR = path.join(USER_DIR, '.cache');
|
|
28
|
-
/**
|
|
29
|
-
* Fold ~/.agents-system/ into ~/.agents/.system/.
|
|
30
|
-
*
|
|
31
|
-
* MUST run first in runMigration() — every other migrator reads SYSTEM_DIR
|
|
32
|
-
* (the new path), so the contents have to be there before they execute.
|
|
33
|
-
*
|
|
34
|
-
* Strategy:
|
|
35
|
-
* 1. If legacy dir doesn't exist or is already a symlink, no-op.
|
|
36
|
-
* 2. If new path doesn't exist yet, rename in one shot (fast path).
|
|
37
|
-
* 3. If both exist (mid-migration / re-run on partially-migrated state),
|
|
38
|
-
* merge legacy → new with new winning on collision, then drop legacy.
|
|
39
|
-
*
|
|
40
|
-
* After the contents move, the legacy path becomes a symlink → SYSTEM_DIR
|
|
41
|
-
* so external tooling that still references ~/.agents-system/ keeps
|
|
42
|
-
* resolving correctly. The symlink is harmless on its own and can be
|
|
43
|
-
* removed with `rm ~/.agents-system` once everything has updated.
|
|
44
|
-
*
|
|
45
|
-
* Idempotent: re-running converges to "contents at SYSTEM_DIR, symlink at
|
|
46
|
-
* LEGACY_SYSTEM_DIR" without duplicating data.
|
|
47
|
-
*/
|
|
48
|
-
export function foldLegacySystemRepo() {
|
|
49
|
-
let legacyStat = null;
|
|
50
|
-
try {
|
|
51
|
-
legacyStat = fs.lstatSync(LEGACY_SYSTEM_DIR);
|
|
52
|
-
}
|
|
53
|
-
catch { /* missing */ }
|
|
54
|
-
if (!legacyStat)
|
|
55
|
-
return;
|
|
56
|
-
if (legacyStat.isSymbolicLink())
|
|
57
|
-
return;
|
|
58
|
-
if (!legacyStat.isDirectory())
|
|
59
|
-
return;
|
|
60
|
-
try {
|
|
61
|
-
fs.mkdirSync(USER_DIR, { recursive: true, mode: 0o700 });
|
|
62
|
-
}
|
|
63
|
-
catch { /* best-effort */ }
|
|
64
|
-
if (!fs.existsSync(SYSTEM_DIR)) {
|
|
65
|
-
try {
|
|
66
|
-
fs.renameSync(LEGACY_SYSTEM_DIR, SYSTEM_DIR);
|
|
67
|
-
try {
|
|
68
|
-
createLink(SYSTEM_DIR, LEGACY_SYSTEM_DIR);
|
|
69
|
-
}
|
|
70
|
-
catch { /* best-effort */ }
|
|
71
|
-
console.error('Folded ~/.agents-system/ into ~/.agents/.system/ (left back-compat symlink)');
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
catch {
|
|
75
|
-
// Cross-device rename or perm issue — fall through to copy + remove.
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
try {
|
|
79
|
-
copyDirSkipExisting(LEGACY_SYSTEM_DIR, SYSTEM_DIR);
|
|
80
|
-
fs.rmSync(LEGACY_SYSTEM_DIR, { recursive: true, force: true });
|
|
81
|
-
try {
|
|
82
|
-
createLink(SYSTEM_DIR, LEGACY_SYSTEM_DIR);
|
|
83
|
-
}
|
|
84
|
-
catch { /* best-effort */ }
|
|
85
|
-
console.error('Merged ~/.agents-system/ into ~/.agents/.system/ (left back-compat symlink)');
|
|
86
|
-
}
|
|
87
|
-
catch { /* best-effort */ }
|
|
88
|
-
}
|
|
89
30
|
/** True when `relPath` is a file tracked by a git repo rooted at `repoDir`. */
|
|
90
31
|
function isTrackedInGitRepo(repoDir, relPath) {
|
|
91
32
|
try {
|
|
@@ -669,45 +610,6 @@ function mergeOverlappingVersionHomes() {
|
|
|
669
610
|
console.error(`Merged ${mergedCount} overlapping version home${mergedCount === 1 ? '' : 's'} from legacy ~/.agents-system/versions/ into ~/.agents/versions/ (legacy moved to ~/.agents/.trash/versions/)`);
|
|
670
611
|
}
|
|
671
612
|
}
|
|
672
|
-
function copyDirSkipExisting(src, dest) {
|
|
673
|
-
let entries;
|
|
674
|
-
try {
|
|
675
|
-
entries = fs.readdirSync(src, { withFileTypes: true });
|
|
676
|
-
}
|
|
677
|
-
catch {
|
|
678
|
-
return;
|
|
679
|
-
}
|
|
680
|
-
fs.mkdirSync(dest, { recursive: true, mode: 0o700 });
|
|
681
|
-
for (const entry of entries) {
|
|
682
|
-
const s = path.join(src, entry.name);
|
|
683
|
-
const d = path.join(dest, entry.name);
|
|
684
|
-
if (fs.existsSync(d)) {
|
|
685
|
-
if (entry.isDirectory()) {
|
|
686
|
-
const dStat = fs.lstatSync(d);
|
|
687
|
-
if (dStat.isDirectory())
|
|
688
|
-
copyDirSkipExisting(s, d);
|
|
689
|
-
}
|
|
690
|
-
continue;
|
|
691
|
-
}
|
|
692
|
-
try {
|
|
693
|
-
fs.renameSync(s, d);
|
|
694
|
-
}
|
|
695
|
-
catch {
|
|
696
|
-
try {
|
|
697
|
-
if (entry.isDirectory()) {
|
|
698
|
-
copyDirSkipExisting(s, d);
|
|
699
|
-
}
|
|
700
|
-
else if (entry.isSymbolicLink()) {
|
|
701
|
-
fs.symlinkSync(fs.readlinkSync(s), d);
|
|
702
|
-
}
|
|
703
|
-
else {
|
|
704
|
-
fs.copyFileSync(s, d);
|
|
705
|
-
}
|
|
706
|
-
}
|
|
707
|
-
catch { /* best-effort */ }
|
|
708
|
-
}
|
|
709
|
-
}
|
|
710
|
-
}
|
|
711
613
|
/**
|
|
712
614
|
* Rename ~/.agents/permissions/sets/ -> ~/.agents/permissions/presets/.
|
|
713
615
|
* Also handles ~/.agents-system/permissions/sets/ for system repo.
|
|
@@ -810,7 +712,7 @@ function repairAgentConfigSymlinks() {
|
|
|
810
712
|
/**
|
|
811
713
|
* Repair self-referential agent binary symlinks.
|
|
812
714
|
*
|
|
813
|
-
* Some installScript-based agents — notably Factory's `droid`, whose installer
|
|
715
|
+
* Some installScript-based agents — notably Factory.ai's `droid`, whose installer
|
|
814
716
|
* drops a standalone native binary at ~/.local/bin/droid — were registered at
|
|
815
717
|
* install time by resolving the post-install binary with `which <cli>`. Because
|
|
816
718
|
* ~/.agents/.cache/shims sits ahead of ~/.local/bin on PATH, `which` could
|
|
@@ -2091,35 +1993,37 @@ export function pauseUnreadyEnabledRoutines() {
|
|
|
2091
1993
|
`(run 'agents routines doctor --all' to see why): ${paused.join(', ')}`);
|
|
2092
1994
|
}
|
|
2093
1995
|
/**
|
|
2094
|
-
* Fold the legacy watchdog enable sentinel into the watchdog
|
|
1996
|
+
* Fold the legacy watchdog enable sentinel into the `watchdog.enabled` config.
|
|
2095
1997
|
*
|
|
2096
1998
|
* The always-on watchdog used to be gated by a presence sentinel at
|
|
2097
|
-
* `<runtime-state>/watchdog/enabled`; it is now a daemon
|
|
2098
|
-
*
|
|
2099
|
-
*
|
|
2100
|
-
*
|
|
2101
|
-
*
|
|
2102
|
-
*
|
|
2103
|
-
*
|
|
1999
|
+
* `<runtime-state>/watchdog/enabled`; it is now a daemon-owned timer (RUSH-2495)
|
|
2000
|
+
* gated by the `watchdog.enabled` device-config flag — the same flag
|
|
2001
|
+
* `agents watchdog enable` writes. A user who had run `agents watchdog enable`
|
|
2002
|
+
* under the old build has that file on disk; without this, upgrading would
|
|
2003
|
+
* silently drop them back to OFF (the nudge just stops), the worst failure mode
|
|
2004
|
+
* for a "survives reboots" feature. If the sentinel exists, set
|
|
2005
|
+
* `watchdog.enabled: true`, then delete the sentinel so this runs exactly once.
|
|
2006
|
+
* If setting it fails, the sentinel is left in place so a later run retries
|
|
2007
|
+
* rather than silently losing the opt-in.
|
|
2104
2008
|
*
|
|
2105
|
-
*
|
|
2106
|
-
*
|
|
2009
|
+
* The setter seam is injectable so the migration is unit-testable without
|
|
2010
|
+
* touching the real device config.
|
|
2107
2011
|
*/
|
|
2108
|
-
export function
|
|
2012
|
+
export function migrateWatchdogSentinelToConfig(sentinelPath = path.join(CACHE_DIR, 'state', 'watchdog', 'enabled'), enable = (value) => setConfigValue('watchdog.enabled', value)) {
|
|
2109
2013
|
if (!fs.existsSync(sentinelPath))
|
|
2110
2014
|
return;
|
|
2111
2015
|
try {
|
|
2112
|
-
enable(
|
|
2016
|
+
enable(true);
|
|
2113
2017
|
}
|
|
2114
2018
|
catch (err) {
|
|
2115
|
-
console.error(`watchdog sentinel migration: could not
|
|
2019
|
+
console.error(`watchdog sentinel migration: could not set watchdog.enabled (${err.message}); leaving the sentinel for a later retry`);
|
|
2116
2020
|
return;
|
|
2117
2021
|
}
|
|
2118
2022
|
try {
|
|
2119
2023
|
fs.rmSync(sentinelPath);
|
|
2120
2024
|
}
|
|
2121
2025
|
catch { /* already gone */ }
|
|
2122
|
-
console.error('Migrated watchdog: legacy enable sentinel → watchdog
|
|
2026
|
+
console.error('Migrated watchdog: legacy enable sentinel → watchdog.enabled config (kept enabled)');
|
|
2123
2027
|
}
|
|
2124
2028
|
/**
|
|
2125
2029
|
* Rename cli/ → clis/ in each of the given `.agents/` directories.
|
|
@@ -2245,7 +2149,10 @@ function migrateHumans() {
|
|
|
2245
2149
|
if (notifyNode.items.length === 0)
|
|
2246
2150
|
doc.delete('notify');
|
|
2247
2151
|
}
|
|
2248
|
-
|
|
2152
|
+
// `flowCollectionPadding: false` keeps committed flow sequences unpadded
|
|
2153
|
+
// (`[a, b]`, not `[ a, b ]`) so re-emitting agents.yaml here does not dirty
|
|
2154
|
+
// the synced ~/.agents tree and block pulls (RUSH-2505).
|
|
2155
|
+
fs.writeFileSync(agentsYamlPath, stringifyDoc(doc), 'utf-8');
|
|
2249
2156
|
}
|
|
2250
2157
|
catch { /* best-effort — leave the old key if we can't rewrite */ }
|
|
2251
2158
|
}
|
|
@@ -2287,6 +2194,72 @@ export function seedActiveCursorLoginPerVersion() {
|
|
|
2287
2194
|
}
|
|
2288
2195
|
catch { /* best-effort — a failed seed just means one re-login */ }
|
|
2289
2196
|
}
|
|
2197
|
+
/**
|
|
2198
|
+
* Fold the pre-markdown Kimi subagent layout out of every kimi version home.
|
|
2199
|
+
*
|
|
2200
|
+
* agents-cli used to write each Kimi subagent as a `<name>.yaml` +
|
|
2201
|
+
* `<name>.system.md` pair plus a managed `_agents-cli.yaml` index, against the
|
|
2202
|
+
* agentspec of `kimi-cli` — a different product from the `kimi-code` harness we
|
|
2203
|
+
* install, which never read any of it. Those files are inert, but not harmless:
|
|
2204
|
+
* `<name>.system.md` ends in `.md`, so the subagent enumerator would surface it
|
|
2205
|
+
* as a phantom subagent named `<name>.system`, and kimi-code logs
|
|
2206
|
+
* `Missing frontmatter` for it once per session.
|
|
2207
|
+
*
|
|
2208
|
+
* This is the ONE place that knows about the old layout — the registry target
|
|
2209
|
+
* describes only the current `<name>.md` shape. A pair is identified by its
|
|
2210
|
+
* signature (a `<name>.yaml` with a sibling `<name>.system.md`), so a subagent a
|
|
2211
|
+
* user legitimately named e.g. `foo.system` is never touched: it has no
|
|
2212
|
+
* `foo.yaml` beside it. Idempotent; a no-op once the dirs are clean.
|
|
2213
|
+
*/
|
|
2214
|
+
export function migrateKimiSubagentsToMarkdown(versionsDir) {
|
|
2215
|
+
const kimiVersions = path.join(versionsDir ?? path.join(HISTORY_DIR, 'versions'), 'kimi');
|
|
2216
|
+
let versions;
|
|
2217
|
+
try {
|
|
2218
|
+
versions = fs.readdirSync(kimiVersions);
|
|
2219
|
+
}
|
|
2220
|
+
catch {
|
|
2221
|
+
return; // no kimi installed
|
|
2222
|
+
}
|
|
2223
|
+
let removed = 0;
|
|
2224
|
+
for (const version of versions) {
|
|
2225
|
+
const dir = path.join(kimiVersions, version, 'home', '.kimi-code', 'agents');
|
|
2226
|
+
let entries;
|
|
2227
|
+
try {
|
|
2228
|
+
entries = fs.readdirSync(dir);
|
|
2229
|
+
}
|
|
2230
|
+
catch {
|
|
2231
|
+
continue;
|
|
2232
|
+
}
|
|
2233
|
+
const present = new Set(entries);
|
|
2234
|
+
const doomed = [];
|
|
2235
|
+
for (const entry of entries) {
|
|
2236
|
+
if (entry === '_agents-cli.yaml') {
|
|
2237
|
+
doomed.push(entry); // reserved managed index, only ever written by us
|
|
2238
|
+
continue;
|
|
2239
|
+
}
|
|
2240
|
+
if (!entry.endsWith('.yaml'))
|
|
2241
|
+
continue;
|
|
2242
|
+
const base = entry.slice(0, -'.yaml'.length);
|
|
2243
|
+
// Only a genuine legacy pair — a bare .yaml with no sibling prompt is not
|
|
2244
|
+
// ours to delete.
|
|
2245
|
+
if (!present.has(`${base}.system.md`))
|
|
2246
|
+
continue;
|
|
2247
|
+
doomed.push(entry, `${base}.system.md`);
|
|
2248
|
+
}
|
|
2249
|
+
for (const entry of doomed) {
|
|
2250
|
+
try {
|
|
2251
|
+
fs.rmSync(path.join(dir, entry), { force: true });
|
|
2252
|
+
removed++;
|
|
2253
|
+
}
|
|
2254
|
+
catch {
|
|
2255
|
+
// leave it; the next run retries
|
|
2256
|
+
}
|
|
2257
|
+
}
|
|
2258
|
+
}
|
|
2259
|
+
if (removed > 0) {
|
|
2260
|
+
console.error(`Removed ${removed} pre-markdown Kimi subagent file(s); run 'agents sync kimi' to write the new format`);
|
|
2261
|
+
}
|
|
2262
|
+
}
|
|
2290
2263
|
/** Run all idempotent migrations. Safe to call multiple times. */
|
|
2291
2264
|
export async function runMigration() {
|
|
2292
2265
|
// MUST run first: every other migrator reads SYSTEM_DIR (the new path).
|
|
@@ -2306,6 +2279,8 @@ export async function runMigration() {
|
|
|
2306
2279
|
// Cursor runs now isolate the login per version home; preserve the current
|
|
2307
2280
|
// login by seeding the active home's token from the legacy global copy.
|
|
2308
2281
|
seedActiveCursorLoginPerVersion();
|
|
2282
|
+
// Drop the pre-markdown Kimi subagent files; the registry now writes <name>.md.
|
|
2283
|
+
migrateKimiSubagentsToMarkdown();
|
|
2309
2284
|
migrateRunsIntoRoutines();
|
|
2310
2285
|
migrateTrashToHidden();
|
|
2311
2286
|
migrateBackupsToHidden();
|
|
@@ -2324,6 +2299,13 @@ export async function runMigration() {
|
|
|
2324
2299
|
// agents.yaml. After migrateVersionResourcesToPatterns so versions: is already
|
|
2325
2300
|
// in pattern form when it moves to the history file.
|
|
2326
2301
|
migrateSplitDeviceLocalMeta();
|
|
2302
|
+
// Fold per-device operator config (device-doc config:/defaultBrowserProfile
|
|
2303
|
+
// and .history/devices/auto-launch.json) into the central
|
|
2304
|
+
// fleet.devices.<name>.config block. After migrateSplitDeviceLocalMeta so the
|
|
2305
|
+
// device docs are in their canonical location. Also invoked on daemon boot
|
|
2306
|
+
// and on the first device-config read/write in a process, so sentinel'd
|
|
2307
|
+
// installs (which skip this whole run) still converge.
|
|
2308
|
+
migrateDeviceConfigToCentral();
|
|
2327
2309
|
// Bucket moves: collapse runtime state into ~/.agents/.history and ~/.agents/.cache.
|
|
2328
2310
|
migrateRuntimeToHistory();
|
|
2329
2311
|
migrateLegacySessionMarkersToBookmarks();
|
|
@@ -2358,13 +2340,9 @@ export async function runMigration() {
|
|
|
2358
2340
|
// Fold legacy host-placement `remoteCwd` into the canonical portable `cwd`.
|
|
2359
2341
|
migrateRoutineRemoteCwdToCwd();
|
|
2360
2342
|
migrateLegacyRoutineActivation();
|
|
2361
|
-
//
|
|
2362
|
-
//
|
|
2363
|
-
|
|
2364
|
-
// Fold the legacy watchdog enable sentinel into the watchdog routine so a user
|
|
2365
|
-
// who opted in under the old build stays opted in after upgrading. After the
|
|
2366
|
-
// routine rewrites above so the routines dir is in its canonical shape.
|
|
2367
|
-
migrateWatchdogSentinelToRoutine();
|
|
2343
|
+
// Fold the legacy watchdog enable sentinel into `watchdog.enabled` config so a
|
|
2344
|
+
// user who opted in under the old build stays opted in after upgrading.
|
|
2345
|
+
migrateWatchdogSentinelToConfig();
|
|
2368
2346
|
// Deactivate any routine whose execution context no longer resolves ready, so
|
|
2369
2347
|
// an anchor-less agent/workflow routine cannot keep firing-and-failing after the
|
|
2370
2348
|
// fold (RUSH-2290). Runs AFTER the tick/watchdog routines are added so those
|
|
@@ -38,6 +38,6 @@ export declare function resolveTierOverride(agent: AgentId, version?: string | n
|
|
|
38
38
|
/** Every configured override entry, sorted by selector (for `agents models tier list`). */
|
|
39
39
|
export declare function listTierOverrides(): TierOverrideEntry[];
|
|
40
40
|
/** Pin `tier -> model` for a selector. Writes agents.yaml. */
|
|
41
|
-
export declare function setTierOverride(selectorInput: string, tierInput: string, model: string): TierOverrideEntry;
|
|
41
|
+
export declare function setTierOverride(selectorInput: string, tierInput: string | ModelTier, model: string): TierOverrideEntry;
|
|
42
42
|
/** Clear one tier (or all tiers when `tierInput` is omitted) for a selector. Returns true if anything changed. */
|
|
43
43
|
export declare function clearTierOverride(selectorInput: string, tierInput?: string): boolean;
|
|
@@ -90,8 +90,21 @@ export function clearTierOverride(selectorInput, tierInput) {
|
|
|
90
90
|
delete tiers[parsed.selector];
|
|
91
91
|
changed = true;
|
|
92
92
|
}
|
|
93
|
-
model
|
|
94
|
-
|
|
93
|
+
// Drop the emptied container rather than leaving `model: {tiers: {}}` in the
|
|
94
|
+
// shared agents.yaml — the same discipline lib/hosts/providers/local.ts uses
|
|
95
|
+
// for an emptied `hosts:`. A vestigial empty map is a real diff on a tracked
|
|
96
|
+
// file that every machine syncs, so clearing the last override would show up
|
|
97
|
+
// as a spurious local change on whichever box happened to run the command.
|
|
98
|
+
if (Object.keys(tiers).length > 0) {
|
|
99
|
+
model.tiers = tiers;
|
|
100
|
+
return { ...meta, model };
|
|
101
|
+
}
|
|
102
|
+
delete model.tiers;
|
|
103
|
+
if (Object.keys(model).length > 0)
|
|
104
|
+
return { ...meta, model };
|
|
105
|
+
const { model: _dropped, ...rest } = meta;
|
|
106
|
+
void _dropped;
|
|
107
|
+
return rest;
|
|
95
108
|
});
|
|
96
109
|
return changed;
|
|
97
110
|
}
|
|
@@ -145,11 +145,25 @@ export declare function monitorRunsOnThisDevice(config: Pick<MonitorConfig, 'dev
|
|
|
145
145
|
* per-type field/shape checks.
|
|
146
146
|
*/
|
|
147
147
|
export declare function validateMonitor(config: Partial<MonitorConfig>): string[];
|
|
148
|
-
/**
|
|
148
|
+
/**
|
|
149
|
+
* List all monitor configs, unioning the user dir (~/.agents/monitors/) over the
|
|
150
|
+
* built-in system dir (~/.agents/.system/monitors/). Higher layer wins by name
|
|
151
|
+
* (first-seen), so a user monitor shadows a system built-in of the same name.
|
|
152
|
+
*/
|
|
149
153
|
export declare function listMonitors(): MonitorConfig[];
|
|
150
|
-
/**
|
|
154
|
+
/**
|
|
155
|
+
* Read a single monitor config by name, checking the user dir then the system
|
|
156
|
+
* dir (a user monitor shadows a system built-in). Returns null if not found or
|
|
157
|
+
* corrupt.
|
|
158
|
+
*/
|
|
151
159
|
export declare function readMonitor(name: string): MonitorConfig | null;
|
|
152
|
-
/**
|
|
160
|
+
/**
|
|
161
|
+
* Get the filesystem path of a monitor's YAML config in the USER dir, or null.
|
|
162
|
+
* User-layer only by design — like routines' getJobPath (lib/routines.ts), its
|
|
163
|
+
* caller (`agents monitors edit`) writes to the returned path, and the system
|
|
164
|
+
* mirror is pull-only. To edit a system built-in, `edit` materializes a user
|
|
165
|
+
* copy (prefilled via readMonitor()) rather than opening the mirror.
|
|
166
|
+
*/
|
|
153
167
|
export declare function getMonitorPath(name: string): string | null;
|
|
154
168
|
/** Write a monitor config to disk atomically, omitting fields that match defaults. */
|
|
155
169
|
export declare function writeMonitor(config: MonitorConfig): void;
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
import * as fs from 'fs';
|
|
13
13
|
import * as path from 'path';
|
|
14
14
|
import * as yaml from 'yaml';
|
|
15
|
-
import { getMonitorsDir, ensureAgentsDir } from '../state.js';
|
|
15
|
+
import { getMonitorsDir, getSystemMonitorsDir, ensureAgentsDir } from '../state.js';
|
|
16
16
|
import { safeJoin, isSafeSegmentName } from '../paths.js';
|
|
17
17
|
import { atomicWriteFileSync } from '../fs-atomic.js';
|
|
18
18
|
import { machineId, normalizeHost } from '../machine-id.js';
|
|
@@ -273,51 +273,85 @@ export function validateMonitor(config) {
|
|
|
273
273
|
}
|
|
274
274
|
return errors;
|
|
275
275
|
}
|
|
276
|
-
|
|
276
|
+
/**
|
|
277
|
+
* Read and normalize a monitor file. `scope` decides the enabled default when
|
|
278
|
+
* the YAML has no explicit `enabled:` field: a `user` monitor defaults to
|
|
279
|
+
* enabled (MONITOR_DEFAULTS), while a `system` built-in stays opt-in (disabled)
|
|
280
|
+
* until the user enables it — mirroring how routines treat a fresh built-in
|
|
281
|
+
* (lib/routines.ts readJobFile).
|
|
282
|
+
*/
|
|
283
|
+
function readMonitorFile(filePath, scope = 'user') {
|
|
277
284
|
try {
|
|
278
285
|
const content = fs.readFileSync(filePath, 'utf-8');
|
|
279
286
|
const parsed = yaml.parse(content);
|
|
280
287
|
if (!parsed || typeof parsed !== 'object')
|
|
281
288
|
return null;
|
|
289
|
+
const hasEnabled = Object.prototype.hasOwnProperty.call(parsed, 'enabled');
|
|
282
290
|
return {
|
|
283
291
|
...MONITOR_DEFAULTS,
|
|
284
292
|
...parsed,
|
|
285
293
|
name: parsed.name || path.basename(filePath).replace(/\.ya?ml$/, ''),
|
|
294
|
+
// A system built-in with no explicit `enabled:` is opt-in until enabled;
|
|
295
|
+
// a user monitor keeps the enabled-by-default behavior.
|
|
296
|
+
enabled: hasEnabled ? parsed.enabled !== false : scope === 'system' ? false : (MONITOR_DEFAULTS.enabled ?? true),
|
|
286
297
|
};
|
|
287
298
|
}
|
|
288
299
|
catch {
|
|
289
300
|
return null;
|
|
290
301
|
}
|
|
291
302
|
}
|
|
292
|
-
/**
|
|
303
|
+
/** The layered monitor dirs, user before system so user shadows system by name. */
|
|
304
|
+
function monitorLayers() {
|
|
305
|
+
return [
|
|
306
|
+
{ scope: 'user', path: getMonitorsDir() },
|
|
307
|
+
{ scope: 'system', path: getSystemMonitorsDir() },
|
|
308
|
+
];
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* List all monitor configs, unioning the user dir (~/.agents/monitors/) over the
|
|
312
|
+
* built-in system dir (~/.agents/.system/monitors/). Higher layer wins by name
|
|
313
|
+
* (first-seen), so a user monitor shadows a system built-in of the same name.
|
|
314
|
+
*/
|
|
293
315
|
export function listMonitors() {
|
|
294
316
|
ensureAgentsDir();
|
|
295
|
-
const dir = getMonitorsDir();
|
|
296
|
-
if (!fs.existsSync(dir))
|
|
297
|
-
return [];
|
|
298
317
|
const monitors = [];
|
|
299
318
|
const seen = new Set();
|
|
300
|
-
for (const
|
|
301
|
-
|
|
302
|
-
if (!monitor || seen.has(monitor.name))
|
|
319
|
+
for (const { scope, path: dir } of monitorLayers()) {
|
|
320
|
+
if (!fs.existsSync(dir))
|
|
303
321
|
continue;
|
|
304
|
-
|
|
305
|
-
|
|
322
|
+
for (const file of fs.readdirSync(dir).filter((f) => f.endsWith('.yml') || f.endsWith('.yaml'))) {
|
|
323
|
+
const monitor = readMonitorFile(path.join(dir, file), scope);
|
|
324
|
+
if (!monitor || seen.has(monitor.name))
|
|
325
|
+
continue;
|
|
326
|
+
seen.add(monitor.name);
|
|
327
|
+
monitors.push(monitor);
|
|
328
|
+
}
|
|
306
329
|
}
|
|
307
330
|
return monitors;
|
|
308
331
|
}
|
|
309
|
-
/**
|
|
332
|
+
/**
|
|
333
|
+
* Read a single monitor config by name, checking the user dir then the system
|
|
334
|
+
* dir (a user monitor shadows a system built-in). Returns null if not found or
|
|
335
|
+
* corrupt.
|
|
336
|
+
*/
|
|
310
337
|
export function readMonitor(name) {
|
|
311
338
|
ensureAgentsDir();
|
|
312
|
-
const dir
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
339
|
+
for (const { scope, path: dir } of monitorLayers()) {
|
|
340
|
+
for (const ext of ['.yml', '.yaml']) {
|
|
341
|
+
const filePath = safeJoin(dir, name + ext);
|
|
342
|
+
if (fs.existsSync(filePath))
|
|
343
|
+
return readMonitorFile(filePath, scope);
|
|
344
|
+
}
|
|
317
345
|
}
|
|
318
346
|
return null;
|
|
319
347
|
}
|
|
320
|
-
/**
|
|
348
|
+
/**
|
|
349
|
+
* Get the filesystem path of a monitor's YAML config in the USER dir, or null.
|
|
350
|
+
* User-layer only by design — like routines' getJobPath (lib/routines.ts), its
|
|
351
|
+
* caller (`agents monitors edit`) writes to the returned path, and the system
|
|
352
|
+
* mirror is pull-only. To edit a system built-in, `edit` materializes a user
|
|
353
|
+
* copy (prefilled via readMonitor()) rather than opening the mirror.
|
|
354
|
+
*/
|
|
321
355
|
export function getMonitorPath(name) {
|
|
322
356
|
const dir = getMonitorsDir();
|
|
323
357
|
for (const ext of ['.yml', '.yaml']) {
|
|
@@ -13,6 +13,19 @@
|
|
|
13
13
|
*/
|
|
14
14
|
import { type MonitorConfig, type MonitorEvent } from './config.js';
|
|
15
15
|
import { type Observation } from './sources/index.js';
|
|
16
|
+
/** Poll-model source types the engine actually evaluates on a cadence; ws/webhook are push-only and inert here. */
|
|
17
|
+
export declare const POLL_SOURCE_TYPES: Set<string>;
|
|
18
|
+
/**
|
|
19
|
+
* Whether a monitor's liveness has crossed into a drought worth notifying the
|
|
20
|
+
* owner about: enough consecutive failed checks, and not already notified for
|
|
21
|
+
* this drought. Pure so the branch is unit-testable without a real notify.
|
|
22
|
+
*/
|
|
23
|
+
export declare function shouldEscalateDrought(liveness: MonitorLivenessLike): boolean;
|
|
24
|
+
/** The liveness fields the drought predicate reads. */
|
|
25
|
+
interface MonitorLivenessLike {
|
|
26
|
+
consecutiveErrors: number;
|
|
27
|
+
droughtNotifiedAt?: string;
|
|
28
|
+
}
|
|
16
29
|
/** The fire/no-fire decision for one observation, plus what to persist. */
|
|
17
30
|
export interface FireDecision {
|
|
18
31
|
fire: boolean;
|
|
@@ -55,7 +68,25 @@ export declare class MonitorEngine {
|
|
|
55
68
|
private isDue;
|
|
56
69
|
/** Evaluate every due monitor once. Overlap-guarded so a slow cycle never stacks. */
|
|
57
70
|
tick(): Promise<void>;
|
|
58
|
-
|
|
71
|
+
/**
|
|
72
|
+
* Evaluate one monitor once and record the outcome. Public so the daemon tick
|
|
73
|
+
* and tests drive the exact same path. A "failed check" is an evaluation that
|
|
74
|
+
* produced no observation, threw, OR fired an action that failed — all three
|
|
75
|
+
* are "the monitor ran and accomplished nothing", the drought signal. A poll
|
|
76
|
+
* that observes and either fires cleanly or matches nothing is a success and
|
|
77
|
+
* resets the streak.
|
|
78
|
+
*/
|
|
79
|
+
runMonitor(monitor: MonitorConfig): Promise<void>;
|
|
80
|
+
/**
|
|
81
|
+
* Record the poll heartbeat and, on a sustained failure streak, escalate a
|
|
82
|
+
* drought to the owner exactly once. The heartbeat is what makes a
|
|
83
|
+
* polling-but-not-matching monitor visibly distinct from one the engine never
|
|
84
|
+
* touched (RUSH-2485); the streak is what turns "every poll fails and the owner
|
|
85
|
+
* never hears about it" into one notification.
|
|
86
|
+
*/
|
|
87
|
+
private afterCheck;
|
|
88
|
+
/** Notify the owner that an enabled monitor has failed N checks in a row and done nothing. */
|
|
89
|
+
private escalateDrought;
|
|
59
90
|
private fire;
|
|
60
91
|
}
|
|
61
92
|
export {};
|