@phnx-labs/agents-cli 1.22.35 → 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 +666 -2
- package/README.md +75 -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 +67 -0
- package/dist/commands/share.js +275 -12
- 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/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 +219 -121
- 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-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/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 +98 -26
- 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 +11 -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
|
@@ -39,20 +39,19 @@ export const loadCli = async () => (await import('../../commands/cli.js')).regis
|
|
|
39
39
|
export const loadSubagents = async () => (await import('../../commands/subagents.js')).registerSubagentsCommands;
|
|
40
40
|
export const loadPlugins = async () => (await import('../../commands/plugins.js')).registerPluginsCommands;
|
|
41
41
|
export const loadWorkflows = async () => (await import('../../commands/workflows.js')).registerWorkflowsCommands;
|
|
42
|
-
export const loadWorktree = async () => (await import('../../commands/worktree.js')).registerWorktreeCommands;
|
|
43
42
|
export const loadVersions = async () => (await import('../../commands/versions.js')).registerVersionsCommands;
|
|
44
43
|
export const loadUpdate = async () => (await import('../../commands/update.js')).registerUpdateCommand;
|
|
45
44
|
export const loadImport = async () => (await import('../../commands/import.js')).registerImportCommand;
|
|
46
|
-
export const loadExport = async () => (await import('../../commands/export.js')).registerExportCommand;
|
|
47
45
|
export const loadPackages = async () => (await import('../../commands/packages.js')).registerPackagesCommands;
|
|
48
46
|
export const loadRoutines = async () => (await import('../../commands/routines.js')).registerRoutinesCommands;
|
|
49
47
|
export const loadMonitors = async () => (await import('../../commands/monitors.js')).registerMonitorsCommands;
|
|
50
48
|
export const loadProjects = async () => (await import('../../commands/projects.js')).registerProjectsCommands;
|
|
51
49
|
export const loadRun = async () => (await import('../../commands/exec.js')).registerRunCommand;
|
|
52
50
|
export const loadResume = async () => (await import('../../commands/resume.js')).registerResumeCommand;
|
|
51
|
+
export const loadOpen = async () => (await import('../../commands/open.js')).registerOpenCommand;
|
|
53
52
|
export const loadReconnect = async () => (await import('../../commands/reconnect.js')).registerReconnectCommand;
|
|
54
53
|
export const loadFork = async () => (await import('../../commands/fork.js')).registerForkCommand;
|
|
55
|
-
export const
|
|
54
|
+
export const loadConfig = async () => (await import('../../commands/config.js')).registerConfigCommand;
|
|
56
55
|
export const loadSet = async () => (await import('../../commands/set.js')).registerSetCommand;
|
|
57
56
|
export const loadModels = async () => (await import('../../commands/models.js')).registerModelsCommand;
|
|
58
57
|
export const loadModes = async () => (await import('../../commands/modes.js')).registerModesCommand;
|
|
@@ -67,12 +66,9 @@ export const loadProfiles = async () => (await import('../../commands/profiles.j
|
|
|
67
66
|
export const loadHarness = async () => (await import('../../commands/harness.js')).registerHarnessCommands;
|
|
68
67
|
export const loadSecrets = async () => (await import('../../commands/secrets.js')).registerSecretsCommands;
|
|
69
68
|
export const loadLogin = async () => (await import('../../commands/login.js')).registerLoginCommands;
|
|
70
|
-
export const loadWallet = async () => (await import('../../commands/wallet.js')).registerWalletCommands;
|
|
71
|
-
export const loadHelper = async () => (await import('../../commands/helper.js')).registerHelperCommand;
|
|
72
69
|
export const loadMenubar = async () => (await import('../../commands/menubar.js')).registerMenubarCommands;
|
|
73
70
|
export const loadBeta = async () => (await import('../../commands/beta.js')).registerBetaCommands;
|
|
74
71
|
export const loadSync = async () => (await import('../../commands/sync.js')).registerSyncCommand;
|
|
75
|
-
export const loadLock = async () => (await import('../../commands/lock.js')).registerLockCommand;
|
|
76
72
|
export const loadRefreshRules = async () => (await import('../../commands/refresh-rules.js')).registerRefreshRulesCommand;
|
|
77
73
|
export const loadFactory = async () => (await import('../../commands/factory.js')).registerFactoryCommands;
|
|
78
74
|
export const loadUsage = async () => (await import('../../commands/usage.js')).registerUsageCommand;
|
|
@@ -91,19 +87,16 @@ export const loadTmux = async () => (await import('../../commands/tmux.js')).reg
|
|
|
91
87
|
export const loadWatchdog = async () => (await import('../../commands/watchdog.js')).registerWatchdogCommand;
|
|
92
88
|
export const loadBrowser = async () => (await import('../../commands/browser.js')).registerBrowserCommand;
|
|
93
89
|
export const loadComputer = async () => (await import('../../commands/computer.js')).registerComputerCommand;
|
|
94
|
-
export const loadHosts = async () => (await import('../../commands/hosts.js')).registerHostsCommand;
|
|
95
|
-
export const loadLease = async () => (await import('../../commands/lease.js')).registerLeaseCommand;
|
|
96
90
|
export const loadLogs = async () => (await import('../../commands/logs.js')).registerLogsCommand;
|
|
97
91
|
export const loadEvents = async () => (await import('../../commands/events.js')).registerEventsCommand;
|
|
98
92
|
export const loadSsh = async () => (await import('../../commands/ssh.js')).registerSshCommands;
|
|
99
|
-
export const loadPull = async () => (await import('../../commands/pull.js')).registerPullCommand;
|
|
100
|
-
export const loadPush = async () => (await import('../../commands/push.js')).registerPushCommand;
|
|
101
93
|
export const loadRepo = async () => (await import('../../commands/repo.js')).registerRepoCommands;
|
|
102
94
|
export const loadSetup = async () => (await import('../../commands/setup.js')).registerSetupCommand;
|
|
103
95
|
export const loadUninstall = async () => (await import('../../commands/uninstall.js')).registerUninstallCommands;
|
|
104
96
|
export const loadUpgrade = async () => (await import('../../commands/upgrade.js')).registerUpgradeCommand;
|
|
105
97
|
export const loadSessions = async () => (await import('../../commands/sessions.js')).registerSessionsCommands;
|
|
106
98
|
export const loadTeams = async () => (await import('../../commands/teams.js')).registerTeamsCommands;
|
|
99
|
+
export const loadTickets = async () => (await import('../../commands/tickets.js')).registerTicketsCommand;
|
|
107
100
|
export const loadCloud = async () => (await import('../../commands/cloud.js')).registerCloudCommands;
|
|
108
101
|
export const loadMessage = async () => (await import('../../commands/message.js')).registerMessageCommand;
|
|
109
102
|
export const loadSend = async () => (await import('../../commands/send.js')).registerSendCommand;
|
|
@@ -112,11 +105,11 @@ export const loadMailboxes = async () => (await import('../../commands/mailboxes
|
|
|
112
105
|
export const loadServe = async () => (await import('../../commands/serve.js')).registerServeCommand;
|
|
113
106
|
export const loadShare = async () => (await import('../../commands/share.js')).registerShareCommands;
|
|
114
107
|
export const loadAudit = async () => (await import('../../commands/audit.js')).registerAuditCommands;
|
|
115
|
-
export const
|
|
116
|
-
export const loadFunnel = async () => (await import('../../commands/funnel.js')).registerFunnelCommand;
|
|
108
|
+
export const loadWebhooks = async () => (await import('../../commands/webhook.js')).registerWebhooksCommand;
|
|
117
109
|
export const loadHumans = async () => (await import('../../commands/humans.js')).registerHumansCommands;
|
|
118
110
|
export const loadAccounts = async () => (await import('../../commands/accounts.js')).registerAccountsCommand;
|
|
119
111
|
export const loadDaemon = async () => (await import('../../commands/daemon.js')).registerDaemonCommand;
|
|
112
|
+
export const loadCp = async () => (await import('../../commands/cp.js')).registerCpCommand;
|
|
120
113
|
/**
|
|
121
114
|
* Commands whose modules pull in the SQLite-backed session/cloud stack. They are
|
|
122
115
|
* registered AFTER `applyGlobalHelpConventions` (mirroring main's order: help
|
|
@@ -166,7 +159,6 @@ export const COMMAND_LOADERS = {
|
|
|
166
159
|
subagents: [loadSubagents],
|
|
167
160
|
plugins: [loadPlugins],
|
|
168
161
|
workflows: [loadWorkflows],
|
|
169
|
-
worktree: [loadWorktree],
|
|
170
162
|
add: [loadVersions],
|
|
171
163
|
use: [loadVersions],
|
|
172
164
|
list: [loadVersions],
|
|
@@ -176,23 +168,18 @@ export const COMMAND_LOADERS = {
|
|
|
176
168
|
update: [loadUpdate],
|
|
177
169
|
prune: [loadVersions, loadPrune],
|
|
178
170
|
import: [loadImport],
|
|
179
|
-
export: [loadExport],
|
|
180
171
|
registry: [loadPackages],
|
|
181
172
|
search: [loadPackages],
|
|
182
173
|
install: [loadPackages],
|
|
183
|
-
// packages.ts also registers `publish` at top level (commands/packages.ts:435).
|
|
184
|
-
// It was missing here, so `agents publish` only worked via the unknown-command
|
|
185
|
-
// fallback that registers the whole tree — and the --host router could not see
|
|
186
|
-
// it as a real command at all (RUSH-2022).
|
|
187
|
-
publish: [loadPackages],
|
|
188
174
|
routines: [loadRoutines],
|
|
189
175
|
monitors: [loadMonitors],
|
|
190
176
|
projects: [loadProjects],
|
|
191
177
|
run: [loadRun],
|
|
192
178
|
resume: [loadResume],
|
|
179
|
+
open: [loadOpen],
|
|
193
180
|
reconnect: [loadReconnect],
|
|
194
181
|
fork: [loadFork],
|
|
195
|
-
|
|
182
|
+
config: [loadConfig],
|
|
196
183
|
set: [loadSet],
|
|
197
184
|
models: [loadModels],
|
|
198
185
|
modes: [loadModes],
|
|
@@ -202,20 +189,15 @@ export const COMMAND_LOADERS = {
|
|
|
202
189
|
apply: [loadApply],
|
|
203
190
|
status: [loadStatus],
|
|
204
191
|
snapshot: [loadSnapshot],
|
|
205
|
-
profile: [loadProfiles],
|
|
206
192
|
profiles: [loadProfiles],
|
|
207
193
|
harness: [loadHarness],
|
|
208
194
|
harnesses: [loadHarness],
|
|
209
195
|
secrets: [loadSecrets],
|
|
210
196
|
login: [loadLogin],
|
|
211
197
|
logout: [loadLogin],
|
|
212
|
-
whoami: [loadLogin],
|
|
213
|
-
wallet: [loadWallet],
|
|
214
|
-
helper: [loadHelper],
|
|
215
198
|
menubar: [loadMenubar],
|
|
216
199
|
beta: [loadBeta],
|
|
217
200
|
sync: [loadSync],
|
|
218
|
-
lock: [loadLock],
|
|
219
201
|
'refresh-rules': [loadRefreshRules],
|
|
220
202
|
factory: [loadFactory],
|
|
221
203
|
usage: [loadUsage],
|
|
@@ -233,8 +215,6 @@ export const COMMAND_LOADERS = {
|
|
|
233
215
|
watchdog: [loadWatchdog],
|
|
234
216
|
browser: [loadBrowser],
|
|
235
217
|
computer: [loadComputer],
|
|
236
|
-
hosts: [loadHosts],
|
|
237
|
-
lease: [loadLease],
|
|
238
218
|
logs: [loadLogs],
|
|
239
219
|
events: [loadEvents],
|
|
240
220
|
ssh: [loadSsh],
|
|
@@ -242,8 +222,6 @@ export const COMMAND_LOADERS = {
|
|
|
242
222
|
// `fleet` is a commander alias of `devices` (see commands/ssh.ts); list it so
|
|
243
223
|
// lazy registration loads the devices tree when the user types `agents fleet`.
|
|
244
224
|
fleet: [loadSsh],
|
|
245
|
-
pull: [loadPull],
|
|
246
|
-
push: [loadPush],
|
|
247
225
|
// `repos` is the canonical command name; `repo` remains a convenience alias
|
|
248
226
|
// (see commands/repo.ts). List both so lazy registration loads the tree
|
|
249
227
|
// whichever the user types.
|
|
@@ -256,6 +234,7 @@ export const COMMAND_LOADERS = {
|
|
|
256
234
|
// Observe-umbrella alias of sessions --active (same lazy module).
|
|
257
235
|
roster: [loadSessions],
|
|
258
236
|
teams: [loadTeams],
|
|
237
|
+
tickets: [loadTickets],
|
|
259
238
|
cloud: [loadCloud],
|
|
260
239
|
message: [loadMessage],
|
|
261
240
|
send: [loadSend],
|
|
@@ -272,10 +251,10 @@ export const COMMAND_LOADERS = {
|
|
|
272
251
|
// commands/share.ts) — same module, registered as its own program.command().
|
|
273
252
|
unshare: [loadShare],
|
|
274
253
|
audit: [loadAudit],
|
|
275
|
-
|
|
276
|
-
funnel: [loadFunnel],
|
|
254
|
+
webhooks: [loadWebhooks],
|
|
277
255
|
humans: [loadHumans],
|
|
278
256
|
daemon: [loadDaemon],
|
|
257
|
+
cp: [loadCp],
|
|
279
258
|
};
|
|
280
259
|
/**
|
|
281
260
|
* Top-level names that {@link COMMAND_LOADERS} does not carry because they are
|
|
@@ -309,6 +288,7 @@ export const KNOWN_TOP_LEVEL_COMMANDS = new Set([
|
|
|
309
288
|
...Object.keys(COMMAND_LOADERS),
|
|
310
289
|
...INLINE_COMMAND_NAMES,
|
|
311
290
|
]);
|
|
291
|
+
export const RETIRED_TOP_LEVEL_COMMANDS = new Set(['webhook']);
|
|
312
292
|
/** Whether `name` is a top-level command this CLI registers. See {@link KNOWN_TOP_LEVEL_COMMANDS}. */
|
|
313
293
|
export function isKnownTopLevelCommand(name) {
|
|
314
294
|
return KNOWN_TOP_LEVEL_COMMANDS.has(name);
|
|
@@ -19,4 +19,14 @@
|
|
|
19
19
|
* actually be the agents-cli package (its package.json `name`), not some
|
|
20
20
|
* unrelated ancestor that happens to be version-controlled.
|
|
21
21
|
*/
|
|
22
|
+
/**
|
|
23
|
+
* Whether a version string is the `0.0.0-dev.<sha>[-dirty]` stamp
|
|
24
|
+
* `scripts/install.sh` writes for a side-by-side dev install (`install.sh:61`).
|
|
25
|
+
*
|
|
26
|
+
* Split out from {@link detectDevBuild} because a caller holding only a version
|
|
27
|
+
* string — a fleet rollout reading `agents --version` off a remote box — cannot
|
|
28
|
+
* run signal 2 (it needs that machine's filesystem), and must not re-spell the
|
|
29
|
+
* stamp prefix.
|
|
30
|
+
*/
|
|
31
|
+
export declare function isDevVersionStamp(version: string): boolean;
|
|
22
32
|
export declare function detectDevBuild(argv1: string, version: string): boolean;
|
|
@@ -21,8 +21,20 @@ import * as path from 'path';
|
|
|
21
21
|
* actually be the agents-cli package (its package.json `name`), not some
|
|
22
22
|
* unrelated ancestor that happens to be version-controlled.
|
|
23
23
|
*/
|
|
24
|
+
/**
|
|
25
|
+
* Whether a version string is the `0.0.0-dev.<sha>[-dirty]` stamp
|
|
26
|
+
* `scripts/install.sh` writes for a side-by-side dev install (`install.sh:61`).
|
|
27
|
+
*
|
|
28
|
+
* Split out from {@link detectDevBuild} because a caller holding only a version
|
|
29
|
+
* string — a fleet rollout reading `agents --version` off a remote box — cannot
|
|
30
|
+
* run signal 2 (it needs that machine's filesystem), and must not re-spell the
|
|
31
|
+
* stamp prefix.
|
|
32
|
+
*/
|
|
33
|
+
export function isDevVersionStamp(version) {
|
|
34
|
+
return version.startsWith('0.0.0-dev');
|
|
35
|
+
}
|
|
24
36
|
export function detectDevBuild(argv1, version) {
|
|
25
|
-
if (version
|
|
37
|
+
if (isDevVersionStamp(version))
|
|
26
38
|
return true;
|
|
27
39
|
try {
|
|
28
40
|
const cliPath = fs.realpathSync(argv1 || '');
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Top-level command spellcheck (RUSH-2329).
|
|
3
|
+
*
|
|
4
|
+
* Candidates are plain strings from KNOWN_TOP_LEVEL_COMMANDS — never the live
|
|
5
|
+
* commander registry — so an unknown / typo'd invocation does not pay for
|
|
6
|
+
* registerAllEagerCommands (~250-330ms of dynamic import + module eval).
|
|
7
|
+
*/
|
|
8
|
+
/** Calculate the Levenshtein edit distance between two strings. */
|
|
9
|
+
export declare function levenshtein(a: string, b: string): number;
|
|
10
|
+
/**
|
|
11
|
+
* Closest top-level command name by Levenshtein distance.
|
|
12
|
+
* Iterates candidates in first-seen order so ties break the same way as the
|
|
13
|
+
* historical registerAllEagerCommands registration order (RUSH-2329).
|
|
14
|
+
*/
|
|
15
|
+
export declare function closestTopLevelCommand(unknown: string, candidates: Iterable<string>): {
|
|
16
|
+
closest: string | null;
|
|
17
|
+
minDist: number;
|
|
18
|
+
};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Top-level command spellcheck (RUSH-2329).
|
|
3
|
+
*
|
|
4
|
+
* Candidates are plain strings from KNOWN_TOP_LEVEL_COMMANDS — never the live
|
|
5
|
+
* commander registry — so an unknown / typo'd invocation does not pay for
|
|
6
|
+
* registerAllEagerCommands (~250-330ms of dynamic import + module eval).
|
|
7
|
+
*/
|
|
8
|
+
/** Calculate the Levenshtein edit distance between two strings. */
|
|
9
|
+
export function levenshtein(a, b) {
|
|
10
|
+
const m = a.length;
|
|
11
|
+
const n = b.length;
|
|
12
|
+
const dp = Array(m + 1)
|
|
13
|
+
.fill(null)
|
|
14
|
+
.map(() => Array(n + 1).fill(0));
|
|
15
|
+
for (let i = 0; i <= m; i++)
|
|
16
|
+
dp[i][0] = i;
|
|
17
|
+
for (let j = 0; j <= n; j++)
|
|
18
|
+
dp[0][j] = j;
|
|
19
|
+
for (let i = 1; i <= m; i++) {
|
|
20
|
+
for (let j = 1; j <= n; j++) {
|
|
21
|
+
dp[i][j] =
|
|
22
|
+
a[i - 1] === b[j - 1]
|
|
23
|
+
? dp[i - 1][j - 1]
|
|
24
|
+
: 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return dp[m][n];
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Closest top-level command name by Levenshtein distance.
|
|
31
|
+
* Iterates candidates in first-seen order so ties break the same way as the
|
|
32
|
+
* historical registerAllEagerCommands registration order (RUSH-2329).
|
|
33
|
+
*/
|
|
34
|
+
export function closestTopLevelCommand(unknown, candidates) {
|
|
35
|
+
let closest = null;
|
|
36
|
+
let minDist = Infinity;
|
|
37
|
+
for (const cmd of candidates) {
|
|
38
|
+
const dist = levenshtein(unknown, cmd);
|
|
39
|
+
if (dist < minDist) {
|
|
40
|
+
minDist = dist;
|
|
41
|
+
closest = cmd;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return { closest, minDist };
|
|
45
|
+
}
|
package/dist/lib/state.d.ts
CHANGED
|
@@ -29,7 +29,7 @@ export declare function getHumansFilePath(): string;
|
|
|
29
29
|
* Header prepended to every agents.yaml the CLI writes (central and per-device
|
|
30
30
|
* docs). Carries the yaml-language-server schema hint so editors validate the
|
|
31
31
|
* file against `schema/agents-yaml.schema.json`. Exported so
|
|
32
|
-
* `lib/
|
|
32
|
+
* `lib/devices/config-migration.ts` rewrites a device doc with the same header.
|
|
33
33
|
*/
|
|
34
34
|
export declare const META_HEADER = "# agents-cli metadata\n# Auto-generated - do not edit manually\n# https://github.com/phnx-labs/agents-cli\n# yaml-language-server: $schema=https://raw.githubusercontent.com/phnx-labs/agents-cli/main/apps/cli/schema/agents-yaml.schema.json\n\n";
|
|
35
35
|
/** Root of the system data directory (~/.agents/.system/). */
|
|
@@ -140,6 +140,8 @@ export declare function getPackagesDir(): string;
|
|
|
140
140
|
export declare function getRoutinesDir(): string;
|
|
141
141
|
/** Path to named project definitions (~/.agents/projects/). */
|
|
142
142
|
export declare function getProjectsDir(): string;
|
|
143
|
+
/** Path to daemon config directory (~/.agents/daemon/). Holds service toggles. */
|
|
144
|
+
export declare function getDaemonConfigDir(): string;
|
|
143
145
|
/**
|
|
144
146
|
* Path to webhook handler YAML definitions (~/.agents/webhooks/). Handlers are
|
|
145
147
|
* one-off triggers for agents/workflows/commands/routines, layered the same way
|
|
@@ -164,12 +166,12 @@ export declare function getSystemWebhooksDir(): string;
|
|
|
164
166
|
* or null when no project `.agents/` is found by walking up from cwd.
|
|
165
167
|
*
|
|
166
168
|
* Project routines participate in `list`/`view` for inspection always. Daemon
|
|
167
|
-
* firing requires
|
|
168
|
-
*
|
|
169
|
-
*
|
|
170
|
-
*
|
|
171
|
-
*
|
|
172
|
-
*
|
|
169
|
+
* firing requires `agents routines enable <name>`, which materialises the
|
|
170
|
+
* routine into the user layer with `source:` provenance (so the daemon, which
|
|
171
|
+
* loads user + system only, can see it) and turns on the device flag in one
|
|
172
|
+
* step. Enablement lives solely in `meta.deviceRoutines`; a project YAML's own
|
|
173
|
+
* `enabled:` field never turns firing on, so a cloned repo cannot auto-run.
|
|
174
|
+
* See `lib/routines-project.ts`.
|
|
173
175
|
*/
|
|
174
176
|
export declare function getProjectRoutinesDir(cwd?: string): string | null;
|
|
175
177
|
/**
|
|
@@ -182,6 +184,16 @@ export declare function getProjectWebhooksDir(cwd?: string): string | null;
|
|
|
182
184
|
export declare function getRunsDir(): string;
|
|
183
185
|
/** Path to monitor YAML definitions (~/.agents/monitors/). */
|
|
184
186
|
export declare function getMonitorsDir(): string;
|
|
187
|
+
/**
|
|
188
|
+
* Path to built-in monitor definitions shipped in the system repo
|
|
189
|
+
* (`~/.agents/.system/monitors/`). Unioned under the user monitors dir by
|
|
190
|
+
* listMonitors()/readMonitor(): a monitor shipped here is available on every
|
|
191
|
+
* install, and a user monitor of the same name overrides it. A built-in with no
|
|
192
|
+
* `enabled:` field is opt-in — it stays disabled until the user enables it,
|
|
193
|
+
* which materializes a user copy (writes never touch this pull-only mirror). The
|
|
194
|
+
* directory need not exist.
|
|
195
|
+
*/
|
|
196
|
+
export declare function getSystemMonitorsDir(): string;
|
|
185
197
|
/** Path to the durable per-monitor state-diff store + fire history
|
|
186
198
|
* (~/.agents/.history/monitors/). */
|
|
187
199
|
export declare function getMonitorsHistoryDir(): string;
|
|
@@ -238,7 +250,7 @@ export declare function getTeamsRegistryPath(): string;
|
|
|
238
250
|
export declare function getDevicesRegistryPath(): string;
|
|
239
251
|
/** Path to the device ignore-list — tailscale node names the user dismissed, so auto-discovery never re-suggests them. Per-machine, same dir as the registry. */
|
|
240
252
|
export declare function getDevicesIgnoredPath(): string;
|
|
241
|
-
/** Path to the device auto-launch preference file — which registered devices are eligible/preferred for
|
|
253
|
+
/** Path to the LEGACY device auto-launch preference file — which registered devices are eligible/preferred for the ext's auto-host selection. Superseded by the central `fleet.devices.<name>.config` block; only lib/devices/config-migration.ts still reads it (to fold + remove it). */
|
|
242
254
|
export declare function getDevicesAutoLaunchPath(): string;
|
|
243
255
|
/** Dir of "pending device" sentinels (~/.agents/.cache/state/devices-pending/) — one empty-ish file per newly-discovered, not-yet-approved tailnet node. Written by the daemon probe, read by the menu-bar helper (mirrors the attention sentinel dir). */
|
|
244
256
|
export declare function getDevicesPendingDir(): string;
|
|
@@ -266,7 +278,22 @@ export declare function getPerfDir(): string;
|
|
|
266
278
|
export declare function getPerfDbPath(): string;
|
|
267
279
|
/** Path to the hook-shim NDJSON spool drained into perf.db on open. */
|
|
268
280
|
export declare function getPerfSpoolPath(): string;
|
|
269
|
-
/**
|
|
281
|
+
/**
|
|
282
|
+
* Path to per-process runtime state (~/.agents/.cache/state/).
|
|
283
|
+
*
|
|
284
|
+
* `AGENTS_STATE_DIR` redirects it in tests — the same test-isolation escape
|
|
285
|
+
* hatch as `AGENTS_DEVICES_DIR` / `AGENTS_LOGS_DIR`, and resolved at call time
|
|
286
|
+
* for the same reason (a suite pins it after this module is imported).
|
|
287
|
+
*
|
|
288
|
+
* Without it the suite writes into the operator's LIVE state. Concretely: the
|
|
289
|
+
* device registry and ignore-list already redirect via `AGENTS_DEVICES_DIR`, so
|
|
290
|
+
* under test both read empty — and any code path reaching
|
|
291
|
+
* `reconcilePendingSentinels` then computed "every tailnet node is new" and
|
|
292
|
+
* wrote those sentinels into the real `devices-pending/`, which is exactly what
|
|
293
|
+
* the menu bar renders. Running the suite on a dev machine surfaced all 20
|
|
294
|
+
* tailnet nodes as NEW DEVICES, including registered and explicitly ignored
|
|
295
|
+
* ones, and looked like the operator's ignore list had been lost.
|
|
296
|
+
*/
|
|
270
297
|
export declare function getRuntimeStateDir(): string;
|
|
271
298
|
/** Path to companion-extension scratch (~/.agents/.cache/companion/). */
|
|
272
299
|
export declare function getCompanionDir(): string;
|
package/dist/lib/state.js
CHANGED
|
@@ -26,6 +26,7 @@ import * as fs from 'fs';
|
|
|
26
26
|
import * as path from 'path';
|
|
27
27
|
import * as os from 'os';
|
|
28
28
|
import * as yaml from 'yaml';
|
|
29
|
+
import { stringifyDoc } from './yaml-io.js';
|
|
29
30
|
import { execFileSync } from 'child_process';
|
|
30
31
|
import { ensureLockTarget, atomicWriteFileSync, withFileLock } from './fs-atomic.js';
|
|
31
32
|
import { DEFAULT_SYSTEM_REPO, systemRepoSlug } from './types.js';
|
|
@@ -78,6 +79,11 @@ const SYSTEM_PLUGINS_DIR = path.join(SYSTEM_AGENTS_DIR, 'plugins');
|
|
|
78
79
|
// Unioned under user routines by listJobs()/readJob() so a routine shipped here
|
|
79
80
|
// fires for every install, while a user routine of the same name overrides it.
|
|
80
81
|
const SYSTEM_ROUTINES_DIR = path.join(SYSTEM_AGENTS_DIR, 'routines');
|
|
82
|
+
// Built-in monitors shipped in the system repo (gh:phnx-labs/.agents-system).
|
|
83
|
+
// Unioned under user monitors by listMonitors()/readMonitor() so a monitor
|
|
84
|
+
// shipped here is available on every install, while a user monitor of the same
|
|
85
|
+
// name overrides it (a built-in with no `enabled:` field stays opt-in).
|
|
86
|
+
const SYSTEM_MONITORS_DIR = path.join(SYSTEM_AGENTS_DIR, 'monitors');
|
|
81
87
|
const SYSTEM_WEBHOOKS_DIR = path.join(SYSTEM_AGENTS_DIR, 'webhooks');
|
|
82
88
|
const SYSTEM_PROMPTCUTS_FILE = path.join(SYSTEM_AGENTS_DIR, 'hooks', 'promptcuts.yaml');
|
|
83
89
|
const SYSTEM_MCP_CONFIG_FILE = path.join(SYSTEM_AGENTS_DIR, 'mcp.json');
|
|
@@ -97,6 +103,9 @@ const TEAMS_DIR = path.join(USER_AGENTS_DIR, 'teams');
|
|
|
97
103
|
// Named project definitions (the layer above the --project convention). Sibling
|
|
98
104
|
// of ROUTINES_DIR/TEAMS_DIR: hand-editable YAML, synced across machines by push/pull.
|
|
99
105
|
const PROJECTS_DIR = path.join(USER_AGENTS_DIR, 'projects');
|
|
106
|
+
// Daemon service toggles and persistent daemon config. Top-level config/definitions
|
|
107
|
+
// dir like routines/webhooks; runtime state (pid/heartbeat/logs) stays in .cache.
|
|
108
|
+
const DAEMON_CONFIG_DIR = path.join(USER_AGENTS_DIR, 'daemon');
|
|
100
109
|
// History bucket (durable).
|
|
101
110
|
const SESSIONS_DIR = path.join(HISTORY_DIR, 'sessions');
|
|
102
111
|
const SESSIONS_DB_PATH = path.join(SESSIONS_DIR, 'sessions.db');
|
|
@@ -154,7 +163,7 @@ const USER_PROMPTCUTS_FILE = path.join(USER_AGENTS_DIR, 'hooks', 'promptcuts.yam
|
|
|
154
163
|
* Header prepended to every agents.yaml the CLI writes (central and per-device
|
|
155
164
|
* docs). Carries the yaml-language-server schema hint so editors validate the
|
|
156
165
|
* file against `schema/agents-yaml.schema.json`. Exported so
|
|
157
|
-
* `lib/
|
|
166
|
+
* `lib/devices/config-migration.ts` rewrites a device doc with the same header.
|
|
158
167
|
*/
|
|
159
168
|
export const META_HEADER = `# agents-cli metadata
|
|
160
169
|
# Auto-generated - do not edit manually
|
|
@@ -411,6 +420,8 @@ export function getPackagesDir() { return PACKAGES_DIR; }
|
|
|
411
420
|
export function getRoutinesDir() { return process.env.AGENTS_ROUTINES_DIR ?? ROUTINES_DIR; }
|
|
412
421
|
/** Path to named project definitions (~/.agents/projects/). */
|
|
413
422
|
export function getProjectsDir() { return process.env.AGENTS_PROJECTS_DIR ?? PROJECTS_DIR; }
|
|
423
|
+
/** Path to daemon config directory (~/.agents/daemon/). Holds service toggles. */
|
|
424
|
+
export function getDaemonConfigDir() { return process.env.AGENTS_DAEMON_CONFIG_DIR ?? DAEMON_CONFIG_DIR; }
|
|
414
425
|
/**
|
|
415
426
|
* Path to webhook handler YAML definitions (~/.agents/webhooks/). Handlers are
|
|
416
427
|
* one-off triggers for agents/workflows/commands/routines, layered the same way
|
|
@@ -435,12 +446,12 @@ export function getSystemWebhooksDir() { return process.env.AGENTS_SYSTEM_WEBHOO
|
|
|
435
446
|
* or null when no project `.agents/` is found by walking up from cwd.
|
|
436
447
|
*
|
|
437
448
|
* Project routines participate in `list`/`view` for inspection always. Daemon
|
|
438
|
-
* firing requires
|
|
439
|
-
*
|
|
440
|
-
*
|
|
441
|
-
*
|
|
442
|
-
*
|
|
443
|
-
*
|
|
449
|
+
* firing requires `agents routines enable <name>`, which materialises the
|
|
450
|
+
* routine into the user layer with `source:` provenance (so the daemon, which
|
|
451
|
+
* loads user + system only, can see it) and turns on the device flag in one
|
|
452
|
+
* step. Enablement lives solely in `meta.deviceRoutines`; a project YAML's own
|
|
453
|
+
* `enabled:` field never turns firing on, so a cloned repo cannot auto-run.
|
|
454
|
+
* See `lib/routines-project.ts`.
|
|
444
455
|
*/
|
|
445
456
|
export function getProjectRoutinesDir(cwd = process.cwd()) {
|
|
446
457
|
const projectAgentsDir = getProjectAgentsDir(cwd);
|
|
@@ -462,7 +473,17 @@ export function getProjectWebhooksDir(cwd = process.cwd()) {
|
|
|
462
473
|
/** Path to routine execution logs (~/.agents/.history/runs/). */
|
|
463
474
|
export function getRunsDir() { return RUNS_DIR; }
|
|
464
475
|
/** Path to monitor YAML definitions (~/.agents/monitors/). */
|
|
465
|
-
export function getMonitorsDir() { return MONITORS_DIR; }
|
|
476
|
+
export function getMonitorsDir() { return process.env.AGENTS_MONITORS_DIR ?? MONITORS_DIR; }
|
|
477
|
+
/**
|
|
478
|
+
* Path to built-in monitor definitions shipped in the system repo
|
|
479
|
+
* (`~/.agents/.system/monitors/`). Unioned under the user monitors dir by
|
|
480
|
+
* listMonitors()/readMonitor(): a monitor shipped here is available on every
|
|
481
|
+
* install, and a user monitor of the same name overrides it. A built-in with no
|
|
482
|
+
* `enabled:` field is opt-in — it stays disabled until the user enables it,
|
|
483
|
+
* which materializes a user copy (writes never touch this pull-only mirror). The
|
|
484
|
+
* directory need not exist.
|
|
485
|
+
*/
|
|
486
|
+
export function getSystemMonitorsDir() { return process.env.AGENTS_SYSTEM_MONITORS_DIR ?? SYSTEM_MONITORS_DIR; }
|
|
466
487
|
/** Path to the durable per-monitor state-diff store + fire history
|
|
467
488
|
* (~/.agents/.history/monitors/). */
|
|
468
489
|
export function getMonitorsHistoryDir() { return MONITORS_HISTORY_DIR; }
|
|
@@ -543,10 +564,10 @@ function getDevicesDir() {
|
|
|
543
564
|
export function getDevicesRegistryPath() { return path.join(getDevicesDir(), 'registry.json'); }
|
|
544
565
|
/** Path to the device ignore-list — tailscale node names the user dismissed, so auto-discovery never re-suggests them. Per-machine, same dir as the registry. */
|
|
545
566
|
export function getDevicesIgnoredPath() { return path.join(getDevicesDir(), 'ignored.json'); }
|
|
546
|
-
/** Path to the device auto-launch preference file — which registered devices are eligible/preferred for
|
|
567
|
+
/** Path to the LEGACY device auto-launch preference file — which registered devices are eligible/preferred for the ext's auto-host selection. Superseded by the central `fleet.devices.<name>.config` block; only lib/devices/config-migration.ts still reads it (to fold + remove it). */
|
|
547
568
|
export function getDevicesAutoLaunchPath() { return path.join(getDevicesDir(), 'auto-launch.json'); }
|
|
548
569
|
/** Dir of "pending device" sentinels (~/.agents/.cache/state/devices-pending/) — one empty-ish file per newly-discovered, not-yet-approved tailnet node. Written by the daemon probe, read by the menu-bar helper (mirrors the attention sentinel dir). */
|
|
549
|
-
export function getDevicesPendingDir() { return path.join(
|
|
570
|
+
export function getDevicesPendingDir() { return path.join(getRuntimeStateDir(), 'devices-pending'); }
|
|
550
571
|
/** Path to cloud dispatch cache (~/.agents/.cache/cloud/). */
|
|
551
572
|
export function getCloudDir() { return CLOUD_DIR; }
|
|
552
573
|
/** Path to terminal session metadata (~/.agents/.cache/terminals/). */
|
|
@@ -575,8 +596,23 @@ export function getPerfDir() {
|
|
|
575
596
|
export function getPerfDbPath() { return path.join(getPerfDir(), 'perf.db'); }
|
|
576
597
|
/** Path to the hook-shim NDJSON spool drained into perf.db on open. */
|
|
577
598
|
export function getPerfSpoolPath() { return path.join(getPerfDir(), 'spool.jsonl'); }
|
|
578
|
-
/**
|
|
579
|
-
|
|
599
|
+
/**
|
|
600
|
+
* Path to per-process runtime state (~/.agents/.cache/state/).
|
|
601
|
+
*
|
|
602
|
+
* `AGENTS_STATE_DIR` redirects it in tests — the same test-isolation escape
|
|
603
|
+
* hatch as `AGENTS_DEVICES_DIR` / `AGENTS_LOGS_DIR`, and resolved at call time
|
|
604
|
+
* for the same reason (a suite pins it after this module is imported).
|
|
605
|
+
*
|
|
606
|
+
* Without it the suite writes into the operator's LIVE state. Concretely: the
|
|
607
|
+
* device registry and ignore-list already redirect via `AGENTS_DEVICES_DIR`, so
|
|
608
|
+
* under test both read empty — and any code path reaching
|
|
609
|
+
* `reconcilePendingSentinels` then computed "every tailnet node is new" and
|
|
610
|
+
* wrote those sentinels into the real `devices-pending/`, which is exactly what
|
|
611
|
+
* the menu bar renders. Running the suite on a dev machine surfaced all 20
|
|
612
|
+
* tailnet nodes as NEW DEVICES, including registered and explicitly ignored
|
|
613
|
+
* ones, and looked like the operator's ignore list had been lost.
|
|
614
|
+
*/
|
|
615
|
+
export function getRuntimeStateDir() { return process.env.AGENTS_STATE_DIR ?? RUNTIME_STATE_DIR; }
|
|
580
616
|
/** Path to companion-extension scratch (~/.agents/.cache/companion/). */
|
|
581
617
|
export function getCompanionDir() { return COMPANION_CACHE_DIR; }
|
|
582
618
|
/** Path to browser runtime data — chrome-data, pids (~/.agents/.cache/browser/). */
|
|
@@ -787,9 +823,10 @@ function writeIfChanged(filePath, content) {
|
|
|
787
823
|
/**
|
|
788
824
|
* Partition the in-memory Meta across three files by sync-domain:
|
|
789
825
|
* - central `~/.agents/agents.yaml` — portable, everything else
|
|
790
|
-
* (including the user-scope `config:` block
|
|
826
|
+
* (including the user-scope `config:` block and the per-device
|
|
827
|
+
* operator config under `fleet.devices.<name>.config`)
|
|
791
828
|
* - device `~/.agents/devices/<machine>/agents.yaml` — `agents:` pins +
|
|
792
|
-
* `
|
|
829
|
+
* `routines:` (all per-machine)
|
|
793
830
|
* - history `~/.agents/.history/version-resources.json` — `versions:` (machine-local)
|
|
794
831
|
* All callers funnel through writeMeta → here, so nothing else changes. Empty
|
|
795
832
|
* `agents:` / `versions:` are not written (no empty committed files).
|
|
@@ -810,10 +847,11 @@ const META_KEY_SCOPE = {
|
|
|
810
847
|
agents: 'device',
|
|
811
848
|
isolatedAgents: 'device',
|
|
812
849
|
versions: 'device',
|
|
813
|
-
defaultBrowserProfile: 'device',
|
|
814
|
-
deviceConfig: 'device',
|
|
815
850
|
deviceRoutines: 'device',
|
|
851
|
+
deviceConfig: 'device',
|
|
852
|
+
deviceBrowser: 'device',
|
|
816
853
|
// Central — synced via agents.yaml.
|
|
854
|
+
accounts: 'central',
|
|
817
855
|
run: 'central',
|
|
818
856
|
model: 'central',
|
|
819
857
|
watchdog: 'central',
|
|
@@ -825,7 +863,7 @@ const META_KEY_SCOPE = {
|
|
|
825
863
|
registries: 'central',
|
|
826
864
|
profiles: 'central',
|
|
827
865
|
source: 'central',
|
|
828
|
-
projectRoot: '
|
|
866
|
+
projectRoot: 'device',
|
|
829
867
|
extraRepos: 'central',
|
|
830
868
|
brands: 'central',
|
|
831
869
|
actors: 'central',
|
|
@@ -837,7 +875,6 @@ const META_KEY_SCOPE = {
|
|
|
837
875
|
fleet: 'central',
|
|
838
876
|
share: 'central',
|
|
839
877
|
notify: 'central',
|
|
840
|
-
routines: 'central',
|
|
841
878
|
};
|
|
842
879
|
/**
|
|
843
880
|
* Every key this version models (central + device). serializeCentral deletes an
|
|
@@ -903,14 +940,16 @@ function serializeCentral(central) {
|
|
|
903
940
|
if (!changed)
|
|
904
941
|
return existing;
|
|
905
942
|
// Everything cleared → header only (never leave a flow `{}` behind).
|
|
906
|
-
// Otherwise
|
|
907
|
-
//
|
|
908
|
-
// instead of a `- teams` block list)
|
|
909
|
-
//
|
|
910
|
-
|
|
943
|
+
// Otherwise stringifyDoc: it still normalizes a legacy flow root (`{}`) to
|
|
944
|
+
// block, so edited nodes do not render flow (`disabledCommands: [ teams ]`
|
|
945
|
+
// instead of a `- teams` block list), but it no longer forces block on a
|
|
946
|
+
// normal document — that flattened committed flow sequences and made this
|
|
947
|
+
// writer disagree with feed.ts/activity.ts/migrate.ts on the same file
|
|
948
|
+
// (RUSH-2505). parseDocument still preserves comments + key ordering.
|
|
949
|
+
return isEmpty ? META_HEADER : stringifyDoc(doc);
|
|
911
950
|
}
|
|
912
951
|
function writeMetaUnlocked(meta) {
|
|
913
|
-
const { agents, isolatedAgents, versions,
|
|
952
|
+
const { agents, isolatedAgents, versions, deviceRoutines, deviceConfig, deviceBrowser, projectRoot, ...central } = meta;
|
|
914
953
|
// Write the machine-local files FIRST, then strip central — so a crash mid-write
|
|
915
954
|
// never removes pins/versions from central before they're persisted elsewhere.
|
|
916
955
|
const devicePath = getDeviceMetaPath();
|
|
@@ -920,26 +959,32 @@ function writeMetaUnlocked(meta) {
|
|
|
920
959
|
// central doc that syncs — otherwise another machine inherits a pointer to a copy
|
|
921
960
|
// it does not have.
|
|
922
961
|
const hasIsolatedAgents = !!isolatedAgents && Object.keys(isolatedAgents).length > 0;
|
|
923
|
-
const hasDefaultBrowser = !!defaultBrowserProfile;
|
|
924
|
-
// Device-scope config (`maxAgents`, `schedulerEnabled`, …) is per-machine, so it
|
|
925
|
-
// rides the device doc under `config:` — never the central doc that syncs.
|
|
926
|
-
const hasDeviceConfig = !!deviceConfig && Object.keys(deviceConfig).length > 0;
|
|
927
962
|
const hasDeviceRoutines = Array.isArray(deviceRoutines);
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
963
|
+
// Machine-visibility operator config. Lives here rather than in the synced
|
|
964
|
+
// central file because nothing off-box reads it — and because
|
|
965
|
+
// browser.remote-control is a consent flag that must not propagate on pull.
|
|
966
|
+
const hasDeviceConfig = !!deviceConfig && Object.keys(deviceConfig).length > 0;
|
|
967
|
+
const hasDeviceBrowser = !!deviceBrowser && Object.keys(deviceBrowser).length > 0;
|
|
968
|
+
// An inferred local filesystem path — machine state, never fleet policy.
|
|
969
|
+
const hasProjectRoot = typeof projectRoot === 'string' && projectRoot.length > 0;
|
|
970
|
+
if (hasAgents || hasIsolatedAgents || hasDeviceRoutines || hasDeviceConfig || hasDeviceBrowser || hasProjectRoot) {
|
|
971
|
+
// Device-local doc carries `agents:` pins and `routines:` — per-machine and
|
|
972
|
+
// must never land in central agents.yaml (which syncs). Operator config
|
|
973
|
+
// used to ride this doc under `config:`; it now lives centrally under
|
|
974
|
+
// `fleet.devices.<name>.config` (see lib/device-config.ts).
|
|
932
975
|
const deviceDoc = {};
|
|
933
976
|
if (hasAgents)
|
|
934
977
|
deviceDoc.agents = agents;
|
|
935
978
|
if (hasIsolatedAgents)
|
|
936
979
|
deviceDoc.isolatedAgents = isolatedAgents;
|
|
937
|
-
if (hasDefaultBrowser)
|
|
938
|
-
deviceDoc.defaultBrowserProfile = defaultBrowserProfile;
|
|
939
|
-
if (hasDeviceConfig)
|
|
940
|
-
deviceDoc.config = deviceConfig;
|
|
941
980
|
if (hasDeviceRoutines)
|
|
942
981
|
deviceDoc.routines = deviceRoutines;
|
|
982
|
+
if (hasDeviceConfig)
|
|
983
|
+
deviceDoc.config = deviceConfig;
|
|
984
|
+
if (hasDeviceBrowser)
|
|
985
|
+
deviceDoc.browser = deviceBrowser;
|
|
986
|
+
if (hasProjectRoot)
|
|
987
|
+
deviceDoc.projectRoot = projectRoot;
|
|
943
988
|
fs.mkdirSync(path.dirname(devicePath), { recursive: true });
|
|
944
989
|
writeIfChanged(devicePath, META_HEADER + yaml.stringify(deviceDoc));
|
|
945
990
|
}
|
|
@@ -963,14 +1008,15 @@ function writeMetaUnlocked(meta) {
|
|
|
963
1008
|
* - `agents:` and `isolatedAgents:` from the device file (device wins; the union
|
|
964
1009
|
* both preserves the one-level merge and self-heals a pre-migration central that
|
|
965
1010
|
* still has pins)
|
|
966
|
-
* - `
|
|
967
|
-
*
|
|
968
|
-
* - `config:` from the device file into `deviceConfig` (device is the sole
|
|
969
|
-
* source for device-scope config, same routing as `defaultBrowserProfile`;
|
|
970
|
-
* the in-memory field is named `deviceConfig` so it can never collide with
|
|
971
|
-
* the user-scope `config:` central carries)
|
|
1011
|
+
* - `routines:` from the device file into `deviceRoutines` (device-local
|
|
1012
|
+
* routine activation)
|
|
972
1013
|
* - `versions:` from the history JSON (wholesale replace; falls back to
|
|
973
1014
|
* whatever central carried when the history file doesn't exist yet)
|
|
1015
|
+
*
|
|
1016
|
+
* (Device operator config is NOT overlaid here: it lives centrally under
|
|
1017
|
+
* `fleet.devices.<name>.config` — see lib/device-config.ts. The legacy
|
|
1018
|
+
* `config:`/`defaultBrowserProfile:` keys in a device doc are folded into the
|
|
1019
|
+
* central block by lib/devices/config-migration.ts.)
|
|
974
1020
|
*/
|
|
975
1021
|
function overlayMachineLocal(meta) {
|
|
976
1022
|
const devicePath = getDeviceMetaPath();
|
|
@@ -985,10 +1031,14 @@ function overlayMachineLocal(meta) {
|
|
|
985
1031
|
meta.agents = { ...meta.agents, ...dm.agents };
|
|
986
1032
|
if (dm?.isolatedAgents)
|
|
987
1033
|
meta.isolatedAgents = { ...meta.isolatedAgents, ...dm.isolatedAgents };
|
|
988
|
-
if (dm?.
|
|
989
|
-
meta.
|
|
990
|
-
if (dm?.
|
|
991
|
-
meta.
|
|
1034
|
+
if (typeof dm?.projectRoot === 'string')
|
|
1035
|
+
meta.projectRoot = dm.projectRoot;
|
|
1036
|
+
if (dm?.browser && typeof dm.browser === 'object' && !Array.isArray(dm.browser)) {
|
|
1037
|
+
meta.deviceBrowser = { ...meta.deviceBrowser, ...dm.browser };
|
|
1038
|
+
}
|
|
1039
|
+
if (dm?.config && typeof dm.config === 'object' && !Array.isArray(dm.config)) {
|
|
1040
|
+
meta.deviceConfig = { ...meta.deviceConfig, ...dm.config };
|
|
1041
|
+
}
|
|
992
1042
|
if (dm && Object.prototype.hasOwnProperty.call(dm, 'routines')) {
|
|
993
1043
|
if (!Array.isArray(dm.routines) || dm.routines.some((name) => typeof name !== 'string')) {
|
|
994
1044
|
throw new Error(`Device config corrupted at ${devicePath}: routines must be a string list.`);
|