@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
package/dist/lib/byok-usage.js
CHANGED
|
@@ -8,31 +8,81 @@
|
|
|
8
8
|
* API rather than the CLI's own usage tracking.
|
|
9
9
|
*/
|
|
10
10
|
import { hasKeychainToken, getKeychainToken } from './secrets/profiles.js';
|
|
11
|
-
import { renderBar, getUsageColor
|
|
11
|
+
import { renderBar, getUsageColor } from './usage.js';
|
|
12
|
+
import * as fs from 'node:fs';
|
|
13
|
+
import * as path from 'node:path';
|
|
14
|
+
import { createHash } from 'node:crypto';
|
|
15
|
+
import { getCacheDir } from './state.js';
|
|
16
|
+
import { atomicWriteFileSync, ensureLockTarget, withFileLock } from './fs-atomic.js';
|
|
17
|
+
import { withRefreshLease } from './refresh-coordinator.js';
|
|
18
|
+
import { findAccount, resolveCredentialAccount } from './account-registry.js';
|
|
19
|
+
import { getAccountProvider } from './account-provider-registry.js';
|
|
12
20
|
// ─── Injectable fetch seam (tests only) ──────────────────────────────────────
|
|
13
21
|
let _fetch = globalThis.fetch;
|
|
14
22
|
export function setByokFetchForTest(fn) {
|
|
15
23
|
_fetch = fn;
|
|
16
24
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
25
|
+
let cachePathOverride = null;
|
|
26
|
+
function cachePath() {
|
|
27
|
+
return cachePathOverride ?? path.join(getCacheDir(), 'byok-usage.json');
|
|
20
28
|
}
|
|
21
|
-
|
|
29
|
+
function readCache() {
|
|
22
30
|
try {
|
|
23
|
-
|
|
24
|
-
|
|
31
|
+
const parsed = JSON.parse(fs.readFileSync(cachePath(), 'utf-8'));
|
|
32
|
+
return parsed?.version === 1 && parsed.entries ? parsed.entries : {};
|
|
25
33
|
}
|
|
26
34
|
catch {
|
|
27
|
-
return {
|
|
35
|
+
return {};
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function writeCacheEntry(key, entry) {
|
|
39
|
+
const target = cachePath();
|
|
40
|
+
ensureLockTarget(target, JSON.stringify({ version: 1, entries: {} }));
|
|
41
|
+
withFileLock(target, () => {
|
|
42
|
+
atomicWriteFileSync(target, JSON.stringify({ version: 1, entries: { ...readCache(), [key]: entry } }));
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
function byokCacheKey(profile) {
|
|
46
|
+
return createHash('sha256').update(`${profile.provider}\0${profile.account ?? profile.auth?.keychainItem ?? ''}`).digest('hex');
|
|
47
|
+
}
|
|
48
|
+
export const BYOK_REFRESH_INTERVAL_MS = 5 * 60_000;
|
|
49
|
+
export function setByokCachePathForTest(value) {
|
|
50
|
+
const previous = cachePathOverride;
|
|
51
|
+
cachePathOverride = value;
|
|
52
|
+
return previous;
|
|
53
|
+
}
|
|
54
|
+
export function resetByokCacheForTest() {
|
|
55
|
+
try {
|
|
56
|
+
fs.unlinkSync(cachePath());
|
|
57
|
+
}
|
|
58
|
+
catch { /* absent */ }
|
|
59
|
+
}
|
|
60
|
+
function resolveByokToken(profile) {
|
|
61
|
+
if (profile.account) {
|
|
62
|
+
try {
|
|
63
|
+
const account = findAccount(profile.account);
|
|
64
|
+
if (!account)
|
|
65
|
+
return null;
|
|
66
|
+
const resolved = resolveCredentialAccount(profile.account, profile.host.agent, profile.provider);
|
|
67
|
+
return resolved.env[getAccountProvider(account.provider).envFor(profile.host.agent, account.auth)] ?? null;
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
28
72
|
}
|
|
29
|
-
|
|
73
|
+
const keychainItem = profile.auth?.keychainItem;
|
|
74
|
+
if (!keychainItem)
|
|
75
|
+
return null;
|
|
30
76
|
try {
|
|
31
|
-
|
|
77
|
+
if (!hasKeychainToken(keychainItem))
|
|
78
|
+
return null;
|
|
79
|
+
return getKeychainToken(keychainItem);
|
|
32
80
|
}
|
|
33
81
|
catch {
|
|
34
|
-
return
|
|
82
|
+
return null;
|
|
35
83
|
}
|
|
84
|
+
}
|
|
85
|
+
async function fetchOpenRouter(token) {
|
|
36
86
|
try {
|
|
37
87
|
const res = await _fetch('https://openrouter.ai/api/v1/key', {
|
|
38
88
|
headers: { Authorization: `Bearer ${token}` },
|
|
@@ -59,8 +109,37 @@ async function fetchOpenRouter(keychainItem) {
|
|
|
59
109
|
return { budget: null, error: String(err) };
|
|
60
110
|
}
|
|
61
111
|
}
|
|
112
|
+
async function fetchDeepInfra(token) {
|
|
113
|
+
try {
|
|
114
|
+
const res = await _fetch('https://api.deepinfra.com/payment/checklist', {
|
|
115
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
116
|
+
});
|
|
117
|
+
if (!res.ok)
|
|
118
|
+
return { budget: null, error: `HTTP ${res.status}` };
|
|
119
|
+
const json = (await res.json());
|
|
120
|
+
const limitUsd = json.limit !== null && json.limit >= 0 ? json.limit : null;
|
|
121
|
+
const usedUsd = json.recent;
|
|
122
|
+
const remainingUsd = limitUsd !== null
|
|
123
|
+
? Math.max(0, limitUsd - usedUsd)
|
|
124
|
+
: json.stripe_balance < 0 ? -json.stripe_balance : null;
|
|
125
|
+
return {
|
|
126
|
+
budget: {
|
|
127
|
+
limitUsd,
|
|
128
|
+
remainingUsd,
|
|
129
|
+
usedUsd,
|
|
130
|
+
usedPercent: limitUsd !== null && limitUsd > 0 ? (usedUsd / limitUsd) * 100 : null,
|
|
131
|
+
fetchedAt: new Date(),
|
|
132
|
+
},
|
|
133
|
+
error: null,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
return { budget: null, error: String(err) };
|
|
138
|
+
}
|
|
139
|
+
}
|
|
62
140
|
const BYOK_REGISTRY = {
|
|
63
141
|
openrouter: { fetch: fetchOpenRouter },
|
|
142
|
+
deepinfra: { fetch: fetchDeepInfra },
|
|
64
143
|
};
|
|
65
144
|
export function hasByokProvider(provider) {
|
|
66
145
|
return Object.prototype.hasOwnProperty.call(BYOK_REGISTRY, provider);
|
|
@@ -72,7 +151,8 @@ export function renderByokBar(result) {
|
|
|
72
151
|
const { budget } = result;
|
|
73
152
|
if (budget.limitUsd === null) {
|
|
74
153
|
const bar = renderBar(0, 10, 0);
|
|
75
|
-
|
|
154
|
+
const credit = budget.remainingUsd !== null ? `$${budget.remainingUsd.toFixed(2)} credit, ` : '';
|
|
155
|
+
return `$: ${bar} ${credit}$${budget.usedUsd.toFixed(2)} used (no spending limit)`;
|
|
76
156
|
}
|
|
77
157
|
const pct = budget.usedPercent ?? 0;
|
|
78
158
|
const bar = renderBar(pct, 10, pct > 0 ? 1 : 0);
|
|
@@ -89,29 +169,51 @@ export function renderByokBar(result) {
|
|
|
89
169
|
* Returns a `ByokUsageResult` with `budget: null` when the token is absent
|
|
90
170
|
* from the keychain (so the caller can skip rendering a bar without error).
|
|
91
171
|
*
|
|
92
|
-
*
|
|
93
|
-
*
|
|
172
|
+
* Ordinary reads are cache-only. Explicit refreshes are serialized per provider
|
|
173
|
+
* credential across every agents-cli process on the device.
|
|
94
174
|
*/
|
|
95
175
|
export async function getByokUsageForHarness(profile, opts) {
|
|
96
|
-
if (!profile.provider || !hasByokProvider(profile.provider) || !profile.auth)
|
|
176
|
+
if (!profile.provider || !hasByokProvider(profile.provider) || (!profile.auth && !profile.account))
|
|
97
177
|
return null;
|
|
98
|
-
const keychainItem = profile.auth.keychainItem;
|
|
99
178
|
const provider = BYOK_REGISTRY[profile.provider];
|
|
100
|
-
const
|
|
101
|
-
const cached =
|
|
102
|
-
if (!opts?.forceRefresh
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
179
|
+
const cacheKey = byokCacheKey(profile);
|
|
180
|
+
const cached = readCache()[cacheKey];
|
|
181
|
+
if (!opts?.forceRefresh)
|
|
182
|
+
return cached?.result ?? { budget: null, error: 'stale' };
|
|
183
|
+
const previousFetchedAt = cached?.fetchedAt ?? 0;
|
|
184
|
+
return withRefreshLease({
|
|
185
|
+
scope: 'byok-usage',
|
|
186
|
+
key: cacheKey,
|
|
187
|
+
readCompleted: () => readCache()[cacheKey] ?? null,
|
|
188
|
+
isCompleted: (entry) => entry.fetchedAt > previousFetchedAt,
|
|
189
|
+
refresh: async () => {
|
|
190
|
+
const token = resolveByokToken(profile);
|
|
191
|
+
const result = token ? await provider.fetch(token) : { budget: null, error: null };
|
|
192
|
+
const entry = { result, fetchedAt: Math.max(Date.now(), previousFetchedAt + 1) };
|
|
193
|
+
writeCacheEntry(cacheKey, entry);
|
|
194
|
+
return entry;
|
|
195
|
+
},
|
|
196
|
+
}).then((entry) => entry.result);
|
|
197
|
+
}
|
|
198
|
+
/** Refresh each configured BYOK credential when its daemon-owned snapshot is due. */
|
|
199
|
+
export async function refreshDueByokUsage(profiles, now = Date.now()) {
|
|
200
|
+
const due = new Map();
|
|
201
|
+
for (const profile of profiles) {
|
|
202
|
+
if (!profile.provider || (!profile.auth && !profile.account) || !hasByokProvider(profile.provider))
|
|
203
|
+
continue;
|
|
204
|
+
due.set(byokCacheKey(profile), profile);
|
|
205
|
+
}
|
|
206
|
+
let refreshed = 0;
|
|
207
|
+
let skipped = 0;
|
|
208
|
+
const cache = readCache();
|
|
209
|
+
for (const [key, profile] of due) {
|
|
210
|
+
const entry = cache[key];
|
|
211
|
+
if (entry && now - entry.fetchedAt < BYOK_REFRESH_INTERVAL_MS) {
|
|
212
|
+
skipped += 1;
|
|
213
|
+
continue;
|
|
112
214
|
}
|
|
215
|
+
await getByokUsageForHarness(profile, { forceRefresh: true });
|
|
216
|
+
refreshed += 1;
|
|
113
217
|
}
|
|
114
|
-
|
|
115
|
-
_cache.set(keychainItem, { result, fetchedAt: now });
|
|
116
|
-
return result;
|
|
218
|
+
return { refreshed, skipped };
|
|
117
219
|
}
|
package/dist/lib/cli-entry.d.ts
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
export declare const BUN_VIRTUAL_ROOT: RegExp;
|
|
2
2
|
export declare function getAgentsBinPath(argv1?: string | undefined, execPath?: string): string;
|
|
3
|
+
/**
|
|
4
|
+
* Directory that contains the `agents` launcher usable for PATH resolution.
|
|
5
|
+
*
|
|
6
|
+
* When the running entry IS the launcher (a compiled binary or an extension-less
|
|
7
|
+
* shim named `agents`), this is just `dirname(getAgentsBinPath())`. When the
|
|
8
|
+
* running entry is a script inside `dist/` reached via a symlink/shim elsewhere
|
|
9
|
+
* (the npm global-install shape), we look for a launcher whose realpath points at
|
|
10
|
+
* the same entry and return that launcher's directory. Falls back to the entry's
|
|
11
|
+
* own directory when no launcher is found.
|
|
12
|
+
*/
|
|
13
|
+
export declare function getAgentsBinDir(): string;
|
|
3
14
|
/**
|
|
4
15
|
* A CLI entry must be launched through the Node runtime when it is a Node
|
|
5
16
|
* script — a `.js`/`.cjs`/`.mjs` file, OR a symlink/extension-less shim whose
|
package/dist/lib/cli-entry.js
CHANGED
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
*/
|
|
20
20
|
import { execFileSync } from 'child_process';
|
|
21
21
|
import * as fs from 'fs';
|
|
22
|
+
import * as os from 'os';
|
|
22
23
|
import * as path from 'path';
|
|
23
24
|
export const BUN_VIRTUAL_ROOT = /[/\\]\$bunfs[/\\]root[/\\]/;
|
|
24
25
|
function resolveBunStandaloneEntry(entry, execPath) {
|
|
@@ -61,6 +62,51 @@ export function getAgentsBinPath(argv1 = process.argv[1], execPath = process.exe
|
|
|
61
62
|
return 'agents';
|
|
62
63
|
}
|
|
63
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* Directory that contains the `agents` launcher usable for PATH resolution.
|
|
67
|
+
*
|
|
68
|
+
* When the running entry IS the launcher (a compiled binary or an extension-less
|
|
69
|
+
* shim named `agents`), this is just `dirname(getAgentsBinPath())`. When the
|
|
70
|
+
* running entry is a script inside `dist/` reached via a symlink/shim elsewhere
|
|
71
|
+
* (the npm global-install shape), we look for a launcher whose realpath points at
|
|
72
|
+
* the same entry and return that launcher's directory. Falls back to the entry's
|
|
73
|
+
* own directory when no launcher is found.
|
|
74
|
+
*/
|
|
75
|
+
export function getAgentsBinDir() {
|
|
76
|
+
const bin = getAgentsBinPath();
|
|
77
|
+
const base = path.basename(bin);
|
|
78
|
+
if (base === 'agents' || base === 'agents.exe' || base === 'agents.cmd') {
|
|
79
|
+
return path.dirname(bin);
|
|
80
|
+
}
|
|
81
|
+
const realBin = (() => {
|
|
82
|
+
try {
|
|
83
|
+
return fs.realpathSync(bin);
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return bin;
|
|
87
|
+
}
|
|
88
|
+
})();
|
|
89
|
+
const home = os.homedir();
|
|
90
|
+
const candidates = [
|
|
91
|
+
path.join(home, '.local', 'bin'),
|
|
92
|
+
'/usr/local/bin',
|
|
93
|
+
'/opt/homebrew/bin',
|
|
94
|
+
path.join(home, '.npm-global', 'bin'),
|
|
95
|
+
path.join(home, '.bun', 'bin'),
|
|
96
|
+
path.dirname(process.execPath),
|
|
97
|
+
];
|
|
98
|
+
for (const dir of candidates) {
|
|
99
|
+
for (const name of ['agents', 'agents.exe', 'agents.cmd']) {
|
|
100
|
+
const launcher = path.join(dir, name);
|
|
101
|
+
try {
|
|
102
|
+
if (fs.realpathSync(launcher) === realBin)
|
|
103
|
+
return dir;
|
|
104
|
+
}
|
|
105
|
+
catch { /* ignore */ }
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return path.dirname(bin);
|
|
109
|
+
}
|
|
64
110
|
/**
|
|
65
111
|
* A CLI entry must be launched through the Node runtime when it is a Node
|
|
66
112
|
* script — a `.js`/`.cjs`/`.mjs` file, OR a symlink/extension-less shim whose
|
package/dist/lib/cloud/host.d.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* A thin adapter over the hosts subsystem (lib/hosts/*): `agents cloud run
|
|
5
5
|
* --provider host --host <name>` dispatches through the SAME detached-SSH
|
|
6
6
|
* launch as `agents run --host`, and the resulting task shows up in BOTH
|
|
7
|
-
* `agents cloud ps` and `agents
|
|
7
|
+
* `agents cloud ps` and `agents devices ps` — one store (the host-task sidecars
|
|
8
8
|
* under ~/.agents/.cache/hosts/), two views. No new transport, no relay: SSH
|
|
9
9
|
* is the only wire, exactly like the rest of the hosts design (docs/hosts.md).
|
|
10
10
|
*
|
package/dist/lib/cloud/host.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* A thin adapter over the hosts subsystem (lib/hosts/*): `agents cloud run
|
|
5
5
|
* --provider host --host <name>` dispatches through the SAME detached-SSH
|
|
6
6
|
* launch as `agents run --host`, and the resulting task shows up in BOTH
|
|
7
|
-
* `agents cloud ps` and `agents
|
|
7
|
+
* `agents cloud ps` and `agents devices ps` — one store (the host-task sidecars
|
|
8
8
|
* under ~/.agents/.cache/hosts/), two views. No new transport, no relay: SSH
|
|
9
9
|
* is the only wire, exactly like the rest of the hosts design (docs/hosts.md).
|
|
10
10
|
*
|
|
@@ -77,7 +77,7 @@ export class HostCloudProvider {
|
|
|
77
77
|
async dispatch(options) {
|
|
78
78
|
const hostName = options.providerOptions?.host;
|
|
79
79
|
if (!hostName) {
|
|
80
|
-
throw new MissingTargetError('host', 'No host given. Pass --host <name> (a registered host, a device, a capability tag, or user@host).', 'List your machines: agents
|
|
80
|
+
throw new MissingTargetError('host', 'No host given. Pass --host <name> (a registered host, a device, a capability tag, or user@host).', 'List your machines: agents devices list · register more: agents devices sync');
|
|
81
81
|
}
|
|
82
82
|
if (resolveDispatchRepos(options).length > 0) {
|
|
83
83
|
throw new Error('--repo has no meaning for --provider host — the run executes in a directory on the machine, not a cloned repo. ' +
|
|
@@ -46,7 +46,7 @@ function initProviders() {
|
|
|
46
46
|
providers.set('factory', new FactoryCloudProvider(config.providers?.factory));
|
|
47
47
|
providers.set('antigravity', new AntigravityCloudProvider(config.providers?.antigravity));
|
|
48
48
|
providers.set('cursor', new CursorCloudProvider(config.providers?.cursor));
|
|
49
|
-
// Your own machines (agents
|
|
49
|
+
// Your own machines (agents devices) over SSH. No agent
|
|
50
50
|
// auto-routes here — it's always an explicit --provider host / --host choice.
|
|
51
51
|
providers.set('host', new HostCloudProvider());
|
|
52
52
|
}
|
|
@@ -15,7 +15,7 @@ import type { JobTrigger } from '../routines.js';
|
|
|
15
15
|
* - `factory` — Factory Droid Computers (`droid computer ssh` + remote `droid exec`)
|
|
16
16
|
* - `antigravity` — Google Gemini Managed Agents (Interactions API)
|
|
17
17
|
* - `cursor` — Cursor Cloud Agents REST API
|
|
18
|
-
* - `host` — a machine you own (`agents
|
|
18
|
+
* - `host` — a machine you own (`agents devices`), over SSH
|
|
19
19
|
*
|
|
20
20
|
* Agents route to their native cloud automatically (see `cloudProvider` in the
|
|
21
21
|
* agent registry); `--provider` overrides. Nothing auto-routes to `host` — it
|
package/dist/lib/commands.d.ts
CHANGED
|
@@ -19,6 +19,8 @@ export interface CommandMetadata {
|
|
|
19
19
|
since?: string;
|
|
20
20
|
/** Exclusive upper bound on agent CLI version for this command. */
|
|
21
21
|
until?: string;
|
|
22
|
+
/** Alternate names this command also resolves under (frontmatter `aliases:`). */
|
|
23
|
+
aliases?: string[];
|
|
22
24
|
}
|
|
23
25
|
export type CommandApplyFailReason = 'unsupported' | 'agent_excluded' | 'too_old' | 'too_new';
|
|
24
26
|
export type CommandApplyResult = {
|
package/dist/lib/commands.js
CHANGED
|
@@ -12,6 +12,7 @@ import * as yaml from 'yaml';
|
|
|
12
12
|
import { AGENTS, ensureCommandsDir, agentConfigDirName, resolveAgentName } from './agents.js';
|
|
13
13
|
import { capableAgents, isCapable, supports } from './capabilities.js';
|
|
14
14
|
import { isDirectoryDoc } from './resources.js';
|
|
15
|
+
import { normalizeAliases } from './resource-aliases.js';
|
|
15
16
|
import { markdownToToml } from './convert.js';
|
|
16
17
|
import { getCommandsDir, getUserCommandsDir, getEnabledExtraRepos, getProjectAgentsDir, getSkillsDir, getTrashCommandsDir } from './state.js';
|
|
17
18
|
import { getEffectiveHome, getVersionHomePath, listInstalledVersions, resolveVersion } from './versions.js';
|
|
@@ -102,6 +103,7 @@ export function parseCommandMetadata(filePath) {
|
|
|
102
103
|
agents: parseAgentsField(parsed.agents),
|
|
103
104
|
since: typeof parsed.since === 'string' ? parsed.since : undefined,
|
|
104
105
|
until: typeof parsed.until === 'string' ? parsed.until : undefined,
|
|
106
|
+
aliases: normalizeAliases(parsed.aliases),
|
|
105
107
|
};
|
|
106
108
|
}
|
|
107
109
|
}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import type { SessionMeta } from '../session/types.js';
|
|
2
|
+
/** Max chars of a `run --task` description persisted to the ledger — see the
|
|
3
|
+
* module docblock's retention/privacy note. */
|
|
4
|
+
export declare const TASK_PREVIEW_MAX_CHARS = 200;
|
|
5
|
+
/** One `computer.action` ledger entry, narrowed to the fields this module
|
|
6
|
+
* renders or groups by. */
|
|
7
|
+
export interface ComputerAction {
|
|
8
|
+
/** CLI verb: `click`, `type`, `screenshot`, … or `run` for the task marker
|
|
9
|
+
* `registerRunCommand` emits before entering the model loop. */
|
|
10
|
+
verb: string;
|
|
11
|
+
ts: string;
|
|
12
|
+
tsMs: number;
|
|
13
|
+
/** The emitting CLI process's own pid — the run/task grouping key. */
|
|
14
|
+
pid: number;
|
|
15
|
+
/** Unique for the emitting CLI process; absent only on legacy ledger rows. */
|
|
16
|
+
invocationId?: string;
|
|
17
|
+
/** The driven app's pid, when resolved. */
|
|
18
|
+
targetPid?: number;
|
|
19
|
+
bundle?: string;
|
|
20
|
+
/** `--host <device>` target when this action drove a remote daemon. */
|
|
21
|
+
host?: string;
|
|
22
|
+
/** Truncated `--task` text; only ever present on a `verb: 'run'` marker. */
|
|
23
|
+
task?: string;
|
|
24
|
+
sessionId?: string;
|
|
25
|
+
launchId?: string;
|
|
26
|
+
agent?: string;
|
|
27
|
+
machineId?: string;
|
|
28
|
+
hostname?: string;
|
|
29
|
+
}
|
|
30
|
+
/** Read `computer.action` events straight from the durable event ledger,
|
|
31
|
+
* newest first, bounded by `limit`. Malformed/legacy records (missing
|
|
32
|
+
* `command` or `pid`, or an unparseable `ts`) are skipped, never thrown —
|
|
33
|
+
* the ledger is a plain rotated JSONL file another process can be mid-write
|
|
34
|
+
* or mid-rotate against. */
|
|
35
|
+
export declare function listComputerActions(opts?: {
|
|
36
|
+
limit?: number;
|
|
37
|
+
}): ComputerAction[];
|
|
38
|
+
/** Why a row carries no session digest: `linked` resolved one, `unresolved`
|
|
39
|
+
* has a sessionId/launchId but no matching indexed session, `unlinked` has
|
|
40
|
+
* neither (a bare terminal invocation with no agent session env at all). */
|
|
41
|
+
export type ComputerRunLinkStatus = 'linked' | 'unresolved' | 'unlinked';
|
|
42
|
+
/** One task-first row: every `computer.action` emitted by one CLI process
|
|
43
|
+
* (see the module docblock's "Grouping key" note), plus the agent session
|
|
44
|
+
* it links to when resolvable. */
|
|
45
|
+
export interface ComputerRunRow {
|
|
46
|
+
/** Invoking CLI process's pid. Absent on a run recovered from the DB after
|
|
47
|
+
* the ledger pruned — that process is long gone and its pid unknowable. */
|
|
48
|
+
pid?: number;
|
|
49
|
+
invocationId?: string;
|
|
50
|
+
/**
|
|
51
|
+
* Total actions for a run recovered from the DB after the event ledger
|
|
52
|
+
* pruned its individual actions. Set ONLY on such rows: when it is present,
|
|
53
|
+
* `actions`/`counts` are empty because the per-verb detail is genuinely gone,
|
|
54
|
+
* and this total is all that survived. Live ledger rows leave it undefined
|
|
55
|
+
* and report real per-verb `counts` instead.
|
|
56
|
+
*/
|
|
57
|
+
recoveredActionCount?: number;
|
|
58
|
+
/** Truncated task description — present only for a `computer run --task`
|
|
59
|
+
* invocation; a bare verb call has none. */
|
|
60
|
+
task?: string;
|
|
61
|
+
/** Invoking machine's hostname — the CLI's own machine, not necessarily
|
|
62
|
+
* the driven one (see `remoteHost`). */
|
|
63
|
+
machine: string;
|
|
64
|
+
machineId?: string;
|
|
65
|
+
/** `--host <device>` target when the run drove a remote (Windows) daemon. */
|
|
66
|
+
remoteHost?: string;
|
|
67
|
+
/** Best-known target app bundle across the run's actions. */
|
|
68
|
+
bundle?: string;
|
|
69
|
+
agent?: string;
|
|
70
|
+
sessionId?: string;
|
|
71
|
+
launchId?: string;
|
|
72
|
+
linkStatus: ComputerRunLinkStatus;
|
|
73
|
+
linkedSession?: SessionMeta;
|
|
74
|
+
/** Newest first; excludes the `run` task marker itself. */
|
|
75
|
+
actions: ComputerAction[];
|
|
76
|
+
/** Per-verb counts over `actions` (never includes the `run` marker). */
|
|
77
|
+
counts: Record<string, number>;
|
|
78
|
+
/** Oldest action's mtime — the row's start. */
|
|
79
|
+
startMs: number;
|
|
80
|
+
/** Newest action's mtime — the row's sort/age key. */
|
|
81
|
+
endMs: number;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Group flat ledger actions into task-first rows, newest first. Pure:
|
|
85
|
+
* session resolvers are passed in, so this has no filesystem/session-index
|
|
86
|
+
* dependency and is unit-testable with synthetic data (see
|
|
87
|
+
* {@link buildComputerSessionRows} for the impure disk/index-reading caller).
|
|
88
|
+
*/
|
|
89
|
+
export declare function groupIntoComputerRuns(actions: ComputerAction[], resolveSession?: (sessionId: string) => SessionMeta | null, resolveLaunch?: (launchId: string) => SessionMeta | null): ComputerRunRow[];
|
|
90
|
+
/** Build task-first rows from the real ledger, resolving each row's owning
|
|
91
|
+
* session against the live indexes. The interactive picker's (and the
|
|
92
|
+
* flat/`--json` printer's) data source. `machine` narrows to rows whose
|
|
93
|
+
* invoking hostname, machineId, or `--host` target contains the substring. */
|
|
94
|
+
export declare function buildComputerSessionRows(opts?: {
|
|
95
|
+
limit?: number;
|
|
96
|
+
machine?: string;
|
|
97
|
+
}): ComputerRunRow[];
|
|
98
|
+
/**
|
|
99
|
+
* Search predicate for the interactive picker: task text, machine/remote
|
|
100
|
+
* host, target bundle, the linked session's agent/topic/label, or any
|
|
101
|
+
* driven verb in the row.
|
|
102
|
+
*/
|
|
103
|
+
export declare function matchesComputerSessionRow(row: ComputerRunRow, queryText: string): boolean;
|
|
104
|
+
/** Human one-line summary of a row's per-verb action counts, most frequent
|
|
105
|
+
* first — shared by the flat table and the interactive picker's label. */
|
|
106
|
+
/**
|
|
107
|
+
* One row's action summary — the single renderer every surface should use.
|
|
108
|
+
*
|
|
109
|
+
* A run recovered from the DB after the ledger pruned has no per-verb detail,
|
|
110
|
+
* only a total. Rendering it through the per-verb formatter printed
|
|
111
|
+
* "(no actions)", which is indistinguishable from a run that did nothing — so a
|
|
112
|
+
* 40-action run read as empty. Report the surviving total, and say plainly that
|
|
113
|
+
* the breakdown is gone rather than implying we still have it.
|
|
114
|
+
*/
|
|
115
|
+
export declare function formatRowActions(row: ComputerRunRow): string;
|
|
116
|
+
export declare function formatActionCounts(counts: Record<string, number>): string;
|
|
117
|
+
/** Human table for the CLI. Returns lines (no trailing newline). */
|
|
118
|
+
export declare function renderComputerSessionRows(rows: ComputerRunRow[]): string;
|
|
119
|
+
/** Default row cap for the flat/non-interactive table. A computer row is
|
|
120
|
+
* much finer-grained than a browser task — real usage is mostly one
|
|
121
|
+
* standalone verb per CLI invocation, not a `run --task` loop, so an
|
|
122
|
+
* unbounded flat dump against real history reads as hundreds of one-action
|
|
123
|
+
* rows (confirmed against a real machine's history while building this).
|
|
124
|
+
* The interactive picker has no such cap (it's searchable); only the
|
|
125
|
+
* static table needs one. `--limit` overrides. */
|
|
126
|
+
export declare const DEFAULT_ROW_DISPLAY_LIMIT = 50;
|
|
127
|
+
/** Slice `rows` to at most `limit` (newest first, rows are already sorted),
|
|
128
|
+
* and report how many were dropped — pure, so the cap arithmetic and the
|
|
129
|
+
* trailer condition are unit-testable without a console spy. */
|
|
130
|
+
export declare function applyRowDisplayLimit(rows: ComputerRunRow[], limit?: number): {
|
|
131
|
+
shown: ComputerRunRow[];
|
|
132
|
+
more: number;
|
|
133
|
+
};
|
|
134
|
+
/**
|
|
135
|
+
* Shared CLI action for `agents computer sessions` and `agents sessions
|
|
136
|
+
* --computer`. Non-interactive by design (the interactive routing decision
|
|
137
|
+
* lives in `commands/computer-sessions-picker.ts`, mirroring
|
|
138
|
+
* `runBrowserSessions`/`runBrowserSessionsCommand`'s split).
|
|
139
|
+
*/
|
|
140
|
+
export declare function runComputerSessions(opts: {
|
|
141
|
+
machine?: string;
|
|
142
|
+
json?: boolean;
|
|
143
|
+
limit?: number;
|
|
144
|
+
}): void;
|
|
145
|
+
/** Print already-collected rows. Fleet callers use this after merging local and
|
|
146
|
+
* remote JSON so text, limits, and JSON keep exactly one renderer. */
|
|
147
|
+
export declare function printComputerSessionRows(rows: ComputerRunRow[], opts: {
|
|
148
|
+
json?: boolean;
|
|
149
|
+
limit?: number;
|
|
150
|
+
}): void;
|