@phnx-labs/agents-cli 1.22.34 → 1.22.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +672 -2
- package/README.md +82 -35
- package/dist/bin/agents +0 -0
- package/dist/bootstrap.d.ts +15 -0
- package/dist/bootstrap.js +1211 -0
- package/dist/commands/accounts.d.ts +4 -11
- package/dist/commands/accounts.js +159 -27
- package/dist/commands/attach.js +17 -4
- package/dist/commands/audit.d.ts +8 -8
- package/dist/commands/audit.js +57 -47
- package/dist/commands/browser.js +15 -11
- package/dist/commands/cloud.js +1 -1
- package/dist/commands/commands.js +0 -11
- package/dist/commands/computer-actions.js +33 -0
- package/dist/commands/computer-sessions-picker.d.ts +21 -0
- package/dist/commands/computer-sessions-picker.js +141 -0
- package/dist/commands/computer.d.ts +16 -0
- package/dist/commands/computer.js +37 -0
- package/dist/commands/config.d.ts +17 -0
- package/dist/commands/config.js +401 -0
- package/dist/commands/cp.d.ts +84 -0
- package/dist/commands/cp.js +231 -0
- package/dist/commands/daemon.js +243 -14
- package/dist/commands/detach-core.d.ts +1 -1
- package/dist/commands/detach-core.js +12 -2
- package/dist/commands/detach.js +1 -1
- package/dist/commands/doctor.js +64 -5
- package/dist/commands/events.d.ts +24 -12
- package/dist/commands/events.js +144 -28
- package/dist/commands/exec.js +85 -41
- package/dist/commands/feed.d.ts +1 -1
- package/dist/commands/feed.js +16 -8
- package/dist/commands/focus.d.ts +33 -1
- package/dist/commands/focus.js +177 -17
- package/dist/commands/funnel.d.ts +1 -1
- package/dist/commands/go.js +9 -8
- package/dist/commands/harness-wizard.d.ts +1 -0
- package/dist/commands/harness-wizard.js +18 -20
- package/dist/commands/harness.d.ts +2 -0
- package/dist/commands/harness.js +59 -26
- package/dist/commands/hooks.js +0 -11
- package/dist/commands/inspect.d.ts +94 -1
- package/dist/commands/inspect.js +866 -40
- package/dist/commands/lease.d.ts +4 -4
- package/dist/commands/lease.js +6 -6
- package/dist/commands/login.js +0 -13
- package/dist/commands/logs.d.ts +2 -2
- package/dist/commands/logs.js +2 -2
- package/dist/commands/mcp.js +7 -2
- package/dist/commands/memory.js +7 -2
- package/dist/commands/message.d.ts +1 -1
- package/dist/commands/message.js +37 -6
- package/dist/commands/models.js +4 -0
- package/dist/commands/monitors.d.ts +0 -1
- package/dist/commands/monitors.js +199 -16
- package/dist/commands/open.d.ts +18 -0
- package/dist/commands/open.js +57 -0
- package/dist/commands/packages.js +2 -107
- package/dist/commands/plugins.js +6 -3
- package/dist/commands/profiles.d.ts +1 -0
- package/dist/commands/profiles.js +16 -160
- package/dist/commands/projects.d.ts +28 -0
- package/dist/commands/projects.js +125 -5
- package/dist/commands/reconnect.js +9 -3
- package/dist/commands/repo.js +42 -1
- package/dist/commands/resource-view.d.ts +17 -0
- package/dist/commands/resource-view.js +36 -14
- package/dist/commands/resume.js +9 -2
- package/dist/commands/routines.d.ts +0 -2
- package/dist/commands/routines.js +473 -289
- package/dist/commands/secrets.js +52 -9
- package/dist/commands/sessions-export.d.ts +47 -0
- package/dist/commands/sessions-export.js +116 -6
- package/dist/commands/sessions-import.d.ts +17 -0
- package/dist/commands/sessions-import.js +114 -6
- package/dist/commands/sessions-migrate.d.ts +27 -0
- package/dist/commands/sessions-migrate.js +50 -9
- package/dist/commands/sessions-picker.js +23 -4
- package/dist/commands/sessions-resume.d.ts +5 -3
- package/dist/commands/sessions-resume.js +30 -8
- package/dist/commands/sessions-watch.d.ts +2 -0
- package/dist/commands/sessions-watch.js +53 -0
- package/dist/commands/sessions.d.ts +66 -3
- package/dist/commands/sessions.js +298 -47
- package/dist/commands/set.d.ts +1 -1
- package/dist/commands/set.js +2 -2
- package/dist/commands/setup-browser.js +2 -2
- package/dist/commands/setup-mine.js +0 -1
- package/dist/commands/setup-preferences.js +1 -1
- package/dist/commands/setup-share.js +34 -4
- package/dist/commands/setup.d.ts +5 -0
- package/dist/commands/setup.js +26 -0
- package/dist/commands/share.d.ts +85 -0
- package/dist/commands/share.js +379 -8
- package/dist/commands/skills.js +0 -11
- package/dist/commands/snapshot.js +1 -1
- package/dist/commands/ssh.d.ts +18 -0
- package/dist/commands/ssh.js +549 -210
- package/dist/commands/sync.d.ts +5 -0
- package/dist/commands/sync.js +212 -32
- package/dist/commands/teams.d.ts +13 -0
- package/dist/commands/teams.js +187 -30
- package/dist/commands/tickets.d.ts +2 -0
- package/dist/commands/tickets.js +43 -0
- package/dist/commands/update.js +2 -4
- package/dist/commands/usage.js +5 -3
- package/dist/commands/versions.js +11 -5
- package/dist/commands/view.js +15 -7
- package/dist/commands/webhook.d.ts +2 -2
- package/dist/commands/webhook.js +7 -7
- package/dist/index.d.ts +18 -2
- package/dist/index.js +53 -1264
- package/dist/lib/account-catalog.d.ts +18 -0
- package/dist/lib/account-catalog.js +38 -0
- package/dist/lib/account-provider-registry.d.ts +18 -0
- package/dist/lib/account-provider-registry.js +59 -0
- package/dist/lib/account-registry.d.ts +40 -0
- package/dist/lib/account-registry.js +239 -0
- package/dist/lib/account-schema.d.ts +44 -0
- package/dist/lib/account-schema.js +91 -0
- package/dist/lib/account-state-service.d.ts +21 -0
- package/dist/lib/account-state-service.js +60 -0
- package/dist/lib/activity.d.ts +1 -1
- package/dist/lib/activity.js +8 -1
- package/dist/lib/add-dir.d.ts +80 -0
- package/dist/lib/add-dir.js +241 -0
- package/dist/lib/agent-cli-commands.d.ts +11 -0
- package/dist/lib/agent-cli-commands.js +30 -0
- package/dist/lib/agents.js +44 -36
- package/dist/lib/answer-router.js +1 -1
- package/dist/lib/audit/log.d.ts +10 -27
- package/dist/lib/audit/log.js +20 -33
- package/dist/lib/auth-health.d.ts +9 -2
- package/dist/lib/auth-health.js +42 -9
- package/dist/lib/auto-pull-worker.js +7 -3
- package/dist/lib/auto-pull.d.ts +44 -3
- package/dist/lib/auto-pull.js +88 -5
- package/dist/lib/binary-shadow.d.ts +28 -0
- package/dist/lib/binary-shadow.js +121 -0
- package/dist/lib/brand.js +9 -3
- package/dist/lib/browser/ipc.d.ts +30 -0
- package/dist/lib/browser/ipc.js +81 -4
- package/dist/lib/browser/profiles.d.ts +3 -2
- package/dist/lib/browser/profiles.js +65 -22
- package/dist/lib/browser/service.d.ts +4 -0
- package/dist/lib/browser/service.js +30 -3
- package/dist/lib/browser/sessions-list.d.ts +22 -2
- package/dist/lib/browser/sessions-list.js +54 -6
- package/dist/lib/browser/stream.d.ts +2 -0
- package/dist/lib/browser/stream.js +1 -0
- package/dist/lib/browser/types.d.ts +19 -0
- package/dist/lib/byok-usage.d.ts +9 -2
- package/dist/lib/byok-usage.js +133 -31
- package/dist/lib/cli-entry.d.ts +11 -0
- package/dist/lib/cli-entry.js +46 -0
- package/dist/lib/cloud/host.d.ts +1 -1
- package/dist/lib/cloud/host.js +2 -2
- package/dist/lib/cloud/registry.js +1 -1
- package/dist/lib/cloud/types.d.ts +1 -1
- package/dist/lib/codex-policy.d.ts +9 -1
- package/dist/lib/codex-policy.js +17 -2
- package/dist/lib/commands.d.ts +2 -0
- package/dist/lib/commands.js +2 -0
- package/dist/lib/computer/sessions-list.d.ts +150 -0
- package/dist/lib/computer/sessions-list.js +363 -0
- package/dist/lib/config-keys.d.ts +86 -0
- package/dist/lib/config-keys.js +193 -0
- package/dist/lib/config-machine-keys.d.ts +12 -0
- package/dist/lib/config-machine-keys.js +17 -0
- package/dist/lib/config-transfer.js +3 -4
- package/dist/lib/crabbox/cli.d.ts +2 -2
- package/dist/lib/crabbox/cli.js +3 -3
- package/dist/lib/daemon-health.d.ts +22 -0
- package/dist/lib/daemon-health.js +33 -3
- package/dist/lib/daemon-services.d.ts +50 -0
- package/dist/lib/daemon-services.js +147 -0
- package/dist/lib/daemon-ticks.d.ts +35 -66
- package/dist/lib/daemon-ticks.js +77 -159
- package/dist/lib/daemon.d.ts +72 -4
- package/dist/lib/daemon.js +792 -202
- package/dist/lib/deeplink/register.d.ts +49 -0
- package/dist/lib/deeplink/register.js +253 -0
- package/dist/lib/deeplink/url.d.ts +34 -0
- package/dist/lib/deeplink/url.js +78 -0
- package/dist/lib/device-config.d.ts +124 -29
- package/dist/lib/device-config.js +346 -141
- package/dist/lib/devices/config-migration.d.ts +42 -0
- package/dist/lib/devices/config-migration.js +203 -0
- package/dist/lib/devices/connect.js +14 -7
- package/dist/lib/devices/doctor-findings.d.ts +4 -1
- package/dist/lib/devices/doctor-findings.js +20 -1
- package/dist/lib/devices/harness-inventory.d.ts +11 -2
- package/dist/lib/devices/harness-inventory.js +0 -0
- package/dist/lib/devices/health.d.ts +1 -1
- package/dist/lib/devices/health.js +1 -1
- package/dist/lib/devices/pending.d.ts +22 -1
- package/dist/lib/devices/pending.js +67 -2
- package/dist/lib/devices/registry.d.ts +0 -25
- package/dist/lib/devices/registry.js +2 -83
- package/dist/lib/devices/resolve-profile.d.ts +20 -0
- package/dist/lib/devices/resolve-profile.js +44 -0
- package/dist/lib/devices/rollout-verify.d.ts +101 -0
- package/dist/lib/devices/rollout-verify.js +193 -0
- package/dist/lib/devices/ssh-config.js +10 -6
- package/dist/lib/event-families.d.ts +28 -0
- package/dist/lib/event-families.js +159 -0
- package/dist/lib/event-stream.d.ts +9 -1
- package/dist/lib/event-stream.js +26 -9
- package/dist/lib/events.d.ts +9 -1
- package/dist/lib/events.js +21 -6
- package/dist/lib/exec.d.ts +30 -0
- package/dist/lib/exec.js +220 -122
- package/dist/lib/feed-broadcast.d.ts +25 -0
- package/dist/lib/feed-broadcast.js +33 -0
- package/dist/lib/feed.d.ts +1 -1
- package/dist/lib/feed.js +12 -2
- package/dist/lib/fleet/capture.js +15 -0
- package/dist/lib/fleet/manifest.js +9 -0
- package/dist/lib/fleet/types.d.ts +9 -0
- package/dist/lib/fleet-status.js +10 -8
- package/dist/lib/git.d.ts +20 -6
- package/dist/lib/git.js +121 -17
- package/dist/lib/hosts/dispatch.d.ts +8 -3
- package/dist/lib/hosts/dispatch.js +29 -3
- package/dist/lib/hosts/logs.d.ts +2 -2
- package/dist/lib/hosts/logs.js +2 -2
- package/dist/lib/hosts/option.js +1 -1
- package/dist/lib/hosts/passthrough.d.ts +2 -3
- package/dist/lib/hosts/passthrough.js +10 -24
- package/dist/lib/hosts/progress.js +2 -2
- package/dist/lib/hosts/providers/devices.d.ts +3 -3
- package/dist/lib/hosts/providers/devices.js +18 -12
- package/dist/lib/hosts/ready.d.ts +5 -1
- package/dist/lib/hosts/ready.js +9 -3
- package/dist/lib/hosts/reconcile.d.ts +2 -2
- package/dist/lib/hosts/reconcile.js +2 -2
- package/dist/lib/hosts/registry.js +14 -9
- package/dist/lib/hosts/remote-cmd.js +1 -1
- package/dist/lib/hosts/remote-os.d.ts +9 -6
- package/dist/lib/hosts/remote-os.js +13 -6
- package/dist/lib/hosts/routing-flag.d.ts +23 -0
- package/dist/lib/hosts/routing-flag.js +41 -0
- package/dist/lib/hosts/run-target.js +1 -1
- package/dist/lib/hosts/session-index.js +1 -1
- package/dist/lib/hosts/tasks.d.ts +6 -6
- package/dist/lib/hosts/tasks.js +4 -4
- package/dist/lib/hosts/types.js +1 -2
- package/dist/lib/installations/resolve.js +2 -8
- package/dist/lib/isolation-boundary-report.js +0 -1
- package/dist/lib/linear-cache.d.ts +7 -0
- package/dist/lib/linear-cache.js +31 -4
- package/dist/lib/linear-project-counts.d.ts +1 -1
- package/dist/lib/linear-project-counts.js +2 -3
- package/dist/lib/linear-projects.js +1 -1
- package/dist/lib/loop.d.ts +2 -2
- package/dist/lib/loop.js +1 -1
- package/dist/lib/mailbox-target.d.ts +1 -1
- package/dist/lib/mailbox-target.js +1 -1
- package/dist/lib/manifest.js +7 -4
- package/dist/lib/menubar/MenubarHelper.app/Contents/CodeResources +0 -0
- package/dist/lib/menubar/MenubarHelper.app/Contents/MacOS/MenubarHelper +0 -0
- package/dist/lib/menubar/snapshot.d.ts +3 -2
- package/dist/lib/menubar/snapshot.js +6 -2
- package/dist/lib/migrate-fold.d.ts +33 -0
- package/dist/lib/migrate-fold.js +130 -0
- package/dist/lib/migrate.d.ts +34 -34
- package/dist/lib/migrate.js +106 -128
- package/dist/lib/model-tier-overrides.d.ts +1 -1
- package/dist/lib/model-tier-overrides.js +15 -2
- package/dist/lib/monitors/config.d.ts +17 -3
- package/dist/lib/monitors/config.js +52 -18
- package/dist/lib/monitors/engine.d.ts +32 -1
- package/dist/lib/monitors/engine.js +94 -11
- package/dist/lib/monitors/fingerprint.d.ts +46 -0
- package/dist/lib/monitors/fingerprint.js +100 -0
- package/dist/lib/monitors/remote.d.ts +47 -0
- package/dist/lib/monitors/remote.js +81 -0
- package/dist/lib/monitors/state.d.ts +39 -0
- package/dist/lib/monitors/state.js +56 -0
- package/dist/lib/onepassword.d.ts +17 -0
- package/dist/lib/onepassword.js +52 -22
- package/dist/lib/open-url.js +1 -1
- package/dist/lib/picker.d.ts +14 -2
- package/dist/lib/picker.js +35 -13
- package/dist/lib/placement.d.ts +1 -1
- package/dist/lib/placement.js +1 -1
- package/dist/lib/pr-land-detach.d.ts +32 -0
- package/dist/lib/pr-land-detach.js +79 -0
- package/dist/lib/profiles-presets.js +13 -0
- package/dist/lib/profiles.d.ts +2 -0
- package/dist/lib/profiles.js +44 -1
- package/dist/lib/project-focus.d.ts +1 -1
- package/dist/lib/project-focus.js +1 -1
- package/dist/lib/project-key.d.ts +17 -0
- package/dist/lib/project-key.js +26 -0
- package/dist/lib/project-probe.d.ts +4 -1
- package/dist/lib/project-probe.js +5 -4
- package/dist/lib/project-resources.js +2 -18
- package/dist/lib/project-root.d.ts +16 -0
- package/dist/lib/project-root.js +20 -2
- package/dist/lib/projects.d.ts +20 -1
- package/dist/lib/projects.js +78 -1
- package/dist/lib/refresh-coordinator.d.ts +24 -0
- package/dist/lib/refresh-coordinator.js +52 -0
- package/dist/lib/registry.d.ts +2 -2
- package/dist/lib/registry.js +1 -1
- package/dist/lib/resource-aliases.d.ts +13 -0
- package/dist/lib/resource-aliases.js +26 -0
- package/dist/lib/resources/types.d.ts +1 -1
- package/dist/lib/resources.d.ts +16 -0
- package/dist/lib/resources.js +66 -10
- package/dist/lib/rotate.d.ts +3 -4
- package/dist/lib/rotate.js +4 -5
- package/dist/lib/routine-activation.d.ts +22 -2
- package/dist/lib/routine-activation.js +63 -16
- package/dist/lib/routine-context.d.ts +9 -2
- package/dist/lib/routine-context.js +21 -6
- package/dist/lib/routines-project.d.ts +58 -48
- package/dist/lib/routines-project.js +190 -159
- package/dist/lib/routines.d.ts +41 -6
- package/dist/lib/routines.js +92 -34
- package/dist/lib/run-defaults.d.ts +5 -0
- package/dist/lib/run-defaults.js +11 -1
- package/dist/lib/runner.d.ts +10 -8
- package/dist/lib/runner.js +122 -39
- package/dist/lib/secrets/Agents CLI.app/Contents/CodeResources +0 -0
- package/dist/lib/secrets/Agents CLI.app/Contents/MacOS/Agents CLI +0 -0
- package/dist/lib/secrets/agent.d.ts +10 -3
- package/dist/lib/secrets/agent.js +43 -8
- package/dist/lib/secrets/bundles.d.ts +1 -0
- package/dist/lib/secrets/bundles.js +92 -80
- package/dist/lib/secrets/index.js +32 -9
- package/dist/lib/secrets/install-helper.d.ts +4 -4
- package/dist/lib/secrets/install-helper.js +4 -4
- package/dist/lib/secrets/push.d.ts +40 -6
- package/dist/lib/secrets/push.js +58 -11
- package/dist/lib/secrets/read-backoff.d.ts +1 -1
- package/dist/lib/secrets/read-backoff.js +1 -1
- package/dist/lib/secrets/remote.d.ts +24 -0
- package/dist/lib/secrets/remote.js +54 -4
- package/dist/lib/self-update.d.ts +108 -0
- package/dist/lib/self-update.js +276 -1
- package/dist/lib/session/active.d.ts +89 -5
- package/dist/lib/session/active.js +165 -10
- package/dist/lib/session/actor-sidecar.d.ts +1 -1
- package/dist/lib/session/actor-sidecar.js +2 -1
- package/dist/lib/session/db.d.ts +176 -2
- package/dist/lib/session/db.js +484 -17
- package/dist/lib/session/discover.js +27 -4
- package/dist/lib/session/hook-sessions.js +2 -2
- package/dist/lib/session/host-link.d.ts +2 -2
- package/dist/lib/session/host-link.js +2 -2
- package/dist/lib/session/pid-registry.d.ts +21 -0
- package/dist/lib/session/pid-registry.js +57 -0
- package/dist/lib/session/remote-active.js +15 -1
- package/dist/lib/session/remote.js +2 -2
- package/dist/lib/session/session-cache.d.ts +14 -7
- package/dist/lib/session/session-cache.js +51 -9
- package/dist/lib/session/state.d.ts +2 -2
- package/dist/lib/session/state.js +1 -1
- package/dist/lib/session/sync/config.d.ts +10 -10
- package/dist/lib/session/sync/config.js +10 -10
- package/dist/lib/session/sync/r2.d.ts +34 -0
- package/dist/lib/session/sync/r2.js +123 -0
- package/dist/lib/session/throughput.d.ts +1 -1
- package/dist/lib/session/throughput.js +1 -1
- package/dist/lib/session/types.d.ts +23 -1
- package/dist/lib/session/types.js +15 -0
- package/dist/lib/session/viewing-in.d.ts +1 -1
- package/dist/lib/session/viewing-in.js +1 -1
- package/dist/lib/session/watch.d.ts +101 -0
- package/dist/lib/session/watch.js +242 -0
- package/dist/lib/share/config.d.ts +4 -0
- package/dist/lib/share/config.js +1 -0
- package/dist/lib/share/delete.d.ts +93 -0
- package/dist/lib/share/delete.js +127 -0
- package/dist/lib/share/provision.d.ts +38 -0
- package/dist/lib/share/provision.js +50 -0
- package/dist/lib/share/publish.d.ts +40 -1
- package/dist/lib/share/publish.js +116 -3
- package/dist/lib/share/worker-template.js +71 -6
- package/dist/lib/shims.d.ts +17 -3
- package/dist/lib/shims.js +136 -27
- package/dist/lib/signin-badge.js +3 -2
- package/dist/lib/skills.js +2 -0
- package/dist/lib/smart-launch.d.ts +8 -8
- package/dist/lib/smart-launch.js +80 -59
- package/dist/lib/ssh-exec.d.ts +1 -1
- package/dist/lib/ssh-exec.js +1 -1
- package/dist/lib/staleness/prune.d.ts +88 -0
- package/dist/lib/staleness/prune.js +69 -0
- package/dist/lib/staleness/registry.d.ts +1 -1
- package/dist/lib/staleness/writers/commands.js +34 -2
- package/dist/lib/staleness/writers/hooks.js +16 -0
- package/dist/lib/staleness/writers/kinds.d.ts +6 -0
- package/dist/lib/staleness/writers/skills.js +19 -0
- package/dist/lib/staleness/writers/subagents.d.ts +2 -3
- package/dist/lib/staleness/writers/subagents.js +0 -4
- package/dist/lib/staleness/writers/types.d.ts +32 -0
- package/dist/lib/startup/command-registry.d.ts +6 -12
- package/dist/lib/startup/command-registry.js +14 -31
- package/dist/lib/startup/dev-build.d.ts +10 -0
- package/dist/lib/startup/dev-build.js +13 -1
- package/dist/lib/startup/spellcheck.d.ts +18 -0
- package/dist/lib/startup/spellcheck.js +45 -0
- package/dist/lib/state.d.ts +36 -9
- package/dist/lib/state.js +96 -46
- package/dist/lib/subagents-registry.d.ts +0 -7
- package/dist/lib/subagents-registry.js +38 -65
- package/dist/lib/subagents.d.ts +0 -33
- package/dist/lib/subagents.js +0 -75
- package/dist/lib/sync-umbrella.js +1 -1
- package/dist/lib/teams/agents.d.ts +41 -1
- package/dist/lib/teams/agents.js +187 -9
- package/dist/lib/teams/api.d.ts +11 -1
- package/dist/lib/teams/api.js +11 -2
- package/dist/lib/teams/delivery.d.ts +41 -0
- package/dist/lib/teams/delivery.js +60 -0
- package/dist/lib/teams/registry.d.ts +14 -0
- package/dist/lib/teams/registry.js +51 -1
- package/dist/lib/teams/remoteWorktree.d.ts +19 -0
- package/dist/lib/teams/remoteWorktree.js +29 -0
- package/dist/lib/teams/scheduler.d.ts +1 -1
- package/dist/lib/teams/scheduler.js +1 -1
- package/dist/lib/teams/worktree.d.ts +24 -0
- package/dist/lib/teams/worktree.js +42 -0
- package/dist/lib/terminal/backends/vscodium-agent.d.ts +10 -1
- package/dist/lib/terminal/backends/vscodium-agent.js +16 -5
- package/dist/lib/terminal/engine.d.ts +4 -0
- package/dist/lib/terminal/engine.js +8 -2
- package/dist/lib/terminal/types.d.ts +21 -2
- package/dist/lib/testdata/refresh-coordinator-worker.d.ts +1 -0
- package/dist/lib/testdata/refresh-coordinator-worker.js +23 -0
- package/dist/lib/tickets/list.d.ts +53 -0
- package/dist/lib/tickets/list.js +153 -0
- package/dist/lib/tmux/orphan-reap.d.ts +320 -0
- package/dist/lib/tmux/orphan-reap.js +644 -0
- package/dist/lib/tmux/session.d.ts +68 -3
- package/dist/lib/tmux/session.js +95 -5
- package/dist/lib/triggers/handlers.d.ts +20 -0
- package/dist/lib/triggers/handlers.js +6 -1
- package/dist/lib/types.d.ts +46 -34
- package/dist/lib/usage-fleet.d.ts +32 -0
- package/dist/lib/usage-fleet.js +125 -0
- package/dist/lib/usage-refresh.d.ts +3 -3
- package/dist/lib/usage-refresh.js +19 -16
- package/dist/lib/usage.d.ts +51 -47
- package/dist/lib/usage.js +145 -153
- package/dist/lib/version-duplicates.js +2 -2
- package/dist/lib/versions.d.ts +56 -13
- package/dist/lib/versions.js +195 -45
- package/dist/lib/watchdog/log.d.ts +1 -1
- package/dist/lib/watchdog/log.js +3 -3
- package/dist/lib/watchdog/rotate.d.ts +6 -6
- package/dist/lib/watchdog/rotate.js +6 -6
- package/dist/lib/workflows.d.ts +1 -1
- package/dist/lib/yaml-io.d.ts +47 -0
- package/dist/lib/yaml-io.js +55 -0
- package/package.json +2 -1
- package/scripts/install-helper.js +2 -2
- package/scripts/postinstall.js +23 -20
- package/dist/commands/defaults.d.ts +0 -7
- package/dist/commands/defaults.js +0 -107
- package/dist/commands/export.d.ts +0 -11
- package/dist/commands/export.js +0 -215
- package/dist/commands/helper.d.ts +0 -12
- package/dist/commands/helper.js +0 -87
- package/dist/commands/hosts.d.ts +0 -11
- package/dist/commands/hosts.js +0 -330
- package/dist/commands/lock.d.ts +0 -12
- package/dist/commands/lock.js +0 -70
- package/dist/commands/pull.d.ts +0 -17
- package/dist/commands/pull.js +0 -39
- package/dist/commands/push.d.ts +0 -14
- package/dist/commands/push.js +0 -30
- package/dist/commands/wallet.d.ts +0 -20
- package/dist/commands/wallet.js +0 -216
- package/dist/commands/worktree.d.ts +0 -19
- package/dist/commands/worktree.js +0 -272
- package/dist/lib/account-labels.d.ts +0 -24
- package/dist/lib/account-labels.js +0 -72
- package/dist/lib/auto-dispatch-linear.d.ts +0 -18
- package/dist/lib/auto-dispatch-linear.js +0 -107
- package/dist/lib/auto-dispatch-provider.d.ts +0 -10
- package/dist/lib/auto-dispatch-provider.js +0 -30
- package/dist/lib/auto-dispatch.d.ts +0 -93
- package/dist/lib/auto-dispatch.js +0 -128
- package/dist/lib/export.d.ts +0 -72
- package/dist/lib/export.js +0 -269
- package/dist/lib/lock.d.ts +0 -93
- package/dist/lib/lock.js +0 -207
- package/dist/lib/wallet/index.d.ts +0 -78
- package/dist/lib/wallet/index.js +0 -253
|
@@ -1,13 +1,6 @@
|
|
|
1
1
|
import type { Command } from 'commander';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
installedVersions?: typeof listInstalledVersions;
|
|
7
|
-
discover?: typeof discoverAccounts;
|
|
8
|
-
}): Promise<{
|
|
9
|
-
agent: AgentId;
|
|
10
|
-
fingerprint: string;
|
|
11
|
-
versions: string[];
|
|
12
|
-
}>;
|
|
2
|
+
export declare function parseBundleKey(raw: string): {
|
|
3
|
+
bundle: string;
|
|
4
|
+
key: string;
|
|
5
|
+
};
|
|
13
6
|
export declare function registerAccountsCommand(program: Command): void;
|
|
@@ -1,32 +1,164 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
|
-
import {
|
|
3
|
-
import { resolveAgentName, formatAgentError } from '../lib/agents.js';
|
|
4
|
-
import { listInstalledVersions } from '../lib/versions.js';
|
|
5
|
-
import { discoverAccounts, nameAccount, removeAccountLabel, renameAccountLabel } from '../lib/account-labels.js';
|
|
2
|
+
import { password } from '@inquirer/prompts';
|
|
6
3
|
import { setHelpSections } from '../lib/help.js';
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
4
|
+
import { updateMeta } from '../lib/state.js';
|
|
5
|
+
import { ALL_AGENT_IDS } from '../lib/agents.js';
|
|
6
|
+
import { pushBundleToHost } from '../lib/secrets/push.js';
|
|
7
|
+
import { resolveRemoteOsSync } from '../lib/hosts/remote-os.js';
|
|
8
|
+
import { runDevicesAccounts } from './ssh.js';
|
|
9
|
+
import { discoverNativeAccounts } from '../lib/account-catalog.js';
|
|
10
|
+
import { readAndResolveBundleEnv } from '../lib/secrets/bundles.js';
|
|
11
|
+
import { getAccountProvider, listAccountProviders } from '../lib/account-provider-registry.js';
|
|
12
|
+
import { addAccount, findAccount, inspectAccount, readAccountRegistry, removeAccount, renameAccount, setAccountSecret } from '../lib/account-registry.js';
|
|
13
|
+
export function parseBundleKey(raw) {
|
|
14
|
+
const colon = raw.indexOf(':');
|
|
15
|
+
if (colon < 1 || colon === raw.length - 1)
|
|
16
|
+
throw new Error(`Expected bundle:key, got '${raw}'.`);
|
|
17
|
+
return { bundle: raw.slice(0, colon), key: raw.slice(colon + 1) };
|
|
18
|
+
}
|
|
19
|
+
function secretFromBundle(raw) {
|
|
20
|
+
const { bundle, key } = parseBundleKey(raw);
|
|
21
|
+
return readAndResolveBundleEnv(bundle, { keys: [key], keyMode: 'storage', agentOnly: true, caller: 'accounts import' }).env[key];
|
|
22
|
+
}
|
|
23
|
+
function publicAccount(account) {
|
|
24
|
+
return { kind: 'provider', id: account.id, name: account.name, provider: account.provider, auth: account.auth, baseUrl: account.baseUrl, policy: account.policy, secretPresent: account.secretPresent };
|
|
25
|
+
}
|
|
26
|
+
async function printAccounts(json, fleet = false) {
|
|
27
|
+
if (fleet)
|
|
28
|
+
return runDevicesAccounts({ json });
|
|
29
|
+
const records = Object.values(readAccountRegistry().accounts).sort((a, b) => a.name.localeCompare(b.name));
|
|
30
|
+
const native = await discoverNativeAccounts();
|
|
31
|
+
if (json) {
|
|
32
|
+
console.log(JSON.stringify([...records.map(account => publicAccount(inspectAccount(account.name))), ...native], null, 2));
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
console.log(chalk.bold('Provider account bundles\n'));
|
|
36
|
+
if (!records.length)
|
|
37
|
+
console.log(chalk.gray(" None. Add one with 'agents accounts add <name> --provider <provider> --auth <type>'."));
|
|
38
|
+
for (const account of records) {
|
|
39
|
+
const present = inspectAccount(account.name).secretPresent ? chalk.green('ready') : chalk.red('missing on this device');
|
|
40
|
+
console.log(` ${chalk.cyan(account.name)} ${account.provider} ${account.auth} ${present}`);
|
|
41
|
+
}
|
|
42
|
+
console.log(chalk.bold('\nNative harness logins\n'));
|
|
43
|
+
if (!native.length)
|
|
44
|
+
console.log(chalk.gray(' No signed-in native accounts found.'));
|
|
45
|
+
for (const account of native)
|
|
46
|
+
console.log(` ${chalk.cyan(account.display)} ${account.agent} ${account.versions.join(', ')}`);
|
|
47
|
+
}
|
|
48
|
+
function parseAuth(raw) {
|
|
49
|
+
if (raw === 'api-key' || raw === 'setup-token' || raw === 'bearer-token')
|
|
50
|
+
return raw;
|
|
51
|
+
throw new Error(`Unsupported auth type '${raw}'. Use api-key, setup-token, or bearer-token.`);
|
|
18
52
|
}
|
|
19
|
-
async function printAccounts(json) { const accounts = await discoverAccounts(); if (json)
|
|
20
|
-
return console.log(JSON.stringify(accounts, null, 2)); if (!accounts.length)
|
|
21
|
-
return console.log(chalk.gray('No signed-in accounts found. Run an installed agent and complete its normal login first.')); console.log(chalk.bold('Signed-in accounts\n')); for (const account of accounts)
|
|
22
|
-
console.log(` ${account.label ? chalk.cyan(account.label) : chalk.gray('(unnamed)')} ${account.agent} ${account.display}\n ${account.versions.length} installed version${account.versions.length === 1 ? '' : 's'}: ${account.versions.join(', ')}`); }
|
|
23
|
-
async function chooseAccount() { const accounts = await discoverAccounts(); if (!accounts.length)
|
|
24
|
-
throw new Error('No signed-in accounts found. Run an installed agent and complete its normal login first.'); return select({ message: 'Which signed-in account do you want to name?', choices: accounts.map(account => ({ name: `${account.agent} ${account.display} (${account.versions.length} version${account.versions.length === 1 ? '' : 's'})${account.label ? ` currently “${account.label}”` : ''}`, value: account })) }); }
|
|
25
53
|
export function registerAccountsCommand(program) {
|
|
26
|
-
const accounts = program.command('accounts').description('Browse
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
accounts.command('
|
|
31
|
-
|
|
54
|
+
const accounts = program.command('accounts').description('Browse native logins and manage provider account bundles')
|
|
55
|
+
.option('--json', 'Machine-readable account metadata')
|
|
56
|
+
.option('--fleet', 'Show harness-native signed-in identities across reachable devices')
|
|
57
|
+
.action((o) => printAccounts(!!o.json, !!o.fleet));
|
|
58
|
+
accounts.command('list').description('List credential accounts').option('--json', 'Machine-readable account metadata').action((o, command) => printAccounts(!!(o.json || command.optsWithGlobals().json)));
|
|
59
|
+
accounts.command('add <name>')
|
|
60
|
+
.description('Add a durable API key, setup token, or bearer token')
|
|
61
|
+
.requiredOption('--provider <provider>', `Credential provider (${listAccountProviders().join(', ')})`)
|
|
62
|
+
.requiredOption('--auth <type>', 'Credential type: api-key | setup-token | bearer-token')
|
|
63
|
+
.option('--base-url <url>', 'Optional endpoint override stored with the account')
|
|
64
|
+
.option('--from-secrets <bundle:key>', 'Import from an existing agents secrets entry')
|
|
65
|
+
.action(async (name, o) => {
|
|
66
|
+
const auth = parseAuth(o.auth);
|
|
67
|
+
const provider = getAccountProvider(o.provider);
|
|
68
|
+
if (!provider.authKinds.includes(auth))
|
|
69
|
+
throw new Error(`Provider '${provider.provider}' does not support ${auth}. Supported: ${provider.authKinds.join(', ')}.`);
|
|
70
|
+
const secret = o.fromSecrets ? secretFromBundle(o.fromSecrets) : await password({ message: `Enter ${provider.provider} ${auth} for '${name}':` });
|
|
71
|
+
const account = addAccount(name, provider.provider, auth, secret, undefined, { baseUrl: o.baseUrl });
|
|
72
|
+
console.log(chalk.green(`Added ${account.provider} ${account.auth} account '${account.name}'.`));
|
|
73
|
+
console.log(chalk.gray(`Secret bundle '${account.name}' is the account and uses policy never, so agent launches never request Touch ID.`));
|
|
74
|
+
});
|
|
75
|
+
accounts.command('set-key <name>')
|
|
76
|
+
.description('Rotate an account credential without changing its identity')
|
|
77
|
+
.option('--from-secrets <bundle:key>', 'Import from an existing agents secrets entry')
|
|
78
|
+
.action(async (name, o) => {
|
|
79
|
+
const account = findAccount(name);
|
|
80
|
+
if (!account)
|
|
81
|
+
throw new Error(`Unknown account '${name}'.`);
|
|
82
|
+
const secret = o.fromSecrets ? secretFromBundle(o.fromSecrets) : await password({ message: `Enter new ${account.provider} ${account.auth} for '${name}':` });
|
|
83
|
+
setAccountSecret(name, secret);
|
|
84
|
+
console.log(chalk.green(`Updated credential for account '${name}'.`));
|
|
85
|
+
});
|
|
86
|
+
accounts.command('inspect <name>').description('Show safe account metadata').option('--json', 'Machine-readable output').action((name, o, command) => {
|
|
87
|
+
const account = publicAccount(inspectAccount(name));
|
|
88
|
+
if (o.json || command.optsWithGlobals().json)
|
|
89
|
+
return console.log(JSON.stringify(account, null, 2));
|
|
90
|
+
console.log(`${chalk.bold(account.name)} ${account.provider}`);
|
|
91
|
+
console.log(` auth: ${account.auth}`);
|
|
92
|
+
console.log(` id: ${account.id}`);
|
|
93
|
+
console.log(` policy: ${account.policy}`);
|
|
94
|
+
if (account.baseUrl)
|
|
95
|
+
console.log(` base url: ${account.baseUrl}`);
|
|
96
|
+
console.log(` credential: ${account.secretPresent ? 'present on this device' : 'missing on this device'}`);
|
|
97
|
+
});
|
|
98
|
+
accounts.command('rename <old> <new>').description('Rename an account without changing its stable id').action((oldName, newName) => renameAccount(oldName, newName));
|
|
99
|
+
accounts.command('remove <name>').description('Remove an account and its device-local credential').action((name) => removeAccount(name));
|
|
100
|
+
accounts.command('set-default <agent> <name>')
|
|
101
|
+
.description('Use a provider account for a harness when --account is omitted')
|
|
102
|
+
.action((agentRaw, name) => {
|
|
103
|
+
if (!ALL_AGENT_IDS.includes(agentRaw))
|
|
104
|
+
throw new Error(`Unknown agent '${agentRaw}'.`);
|
|
105
|
+
const agent = agentRaw;
|
|
106
|
+
const account = findAccount(name);
|
|
107
|
+
if (!account)
|
|
108
|
+
throw new Error(`Unknown provider account '${name}'.`);
|
|
109
|
+
getAccountProvider(account.provider).envFor(agent, account.auth);
|
|
110
|
+
// Defaults follow the stable account id, so renaming the bundle cannot
|
|
111
|
+
// strand bare runs on a deleted label. findAccount accepts ids and names.
|
|
112
|
+
updateMeta(meta => ({ ...meta, accounts: { ...meta.accounts, defaults: { ...meta.accounts?.defaults, [agent]: account.id } } }));
|
|
113
|
+
console.log(chalk.green(`${agent} now uses account '${account.name}' unless --account overrides it.`));
|
|
114
|
+
});
|
|
115
|
+
accounts.command('clear-default <agent>')
|
|
116
|
+
.description('Return a harness to native login or balanced account selection')
|
|
117
|
+
.action((agentRaw) => {
|
|
118
|
+
if (!ALL_AGENT_IDS.includes(agentRaw))
|
|
119
|
+
throw new Error(`Unknown agent '${agentRaw}'.`);
|
|
120
|
+
updateMeta(meta => {
|
|
121
|
+
const defaults = { ...meta.accounts?.defaults };
|
|
122
|
+
delete defaults[agentRaw];
|
|
123
|
+
return { ...meta, accounts: { ...meta.accounts, defaults } };
|
|
124
|
+
});
|
|
125
|
+
console.log(chalk.green(`Cleared the default account for ${agentRaw}.`));
|
|
126
|
+
});
|
|
127
|
+
accounts.command('sync <name>')
|
|
128
|
+
.description('Copy one provider account bundle to a worker device')
|
|
129
|
+
.requiredOption('--device <device>', 'Destination device or SSH host')
|
|
130
|
+
.option('--force', 'Replace matching keys on the destination')
|
|
131
|
+
.action((name, o) => {
|
|
132
|
+
const account = findAccount(name);
|
|
133
|
+
if (!account)
|
|
134
|
+
throw new Error(`Unknown provider account '${name}'.`);
|
|
135
|
+
const remoteBackend = resolveRemoteOsSync(o.device) === 'win32' ? 'keychain' : 'file';
|
|
136
|
+
const literalValues = {
|
|
137
|
+
ACCOUNT_ID: account.id,
|
|
138
|
+
PROVIDER: account.provider,
|
|
139
|
+
AUTH_TYPE: account.auth,
|
|
140
|
+
...(account.baseUrl ? { BASE_URL: account.baseUrl } : {}),
|
|
141
|
+
};
|
|
142
|
+
const result = pushBundleToHost(account.name, o.device, {
|
|
143
|
+
remoteBackend,
|
|
144
|
+
force: o.force,
|
|
145
|
+
operation: 'accounts sync',
|
|
146
|
+
policyNever: true,
|
|
147
|
+
agentOnly: false,
|
|
148
|
+
literalValues,
|
|
149
|
+
});
|
|
150
|
+
if (!result.ok)
|
|
151
|
+
throw new Error(`${result.message}\nRetry: agents accounts sync ${account.name} --device ${o.device}${o.force ? ' --force' : ''}`);
|
|
152
|
+
console.log(chalk.green(`${account.name} synced to ${o.device} (${result.keyCount} keys, ${remoteBackend} backend, policy never).`));
|
|
153
|
+
});
|
|
154
|
+
setHelpSections(accounts, {
|
|
155
|
+
examples: `agents accounts add work --provider anthropic --auth setup-token
|
|
156
|
+
agents accounts add openrouter-work --provider openrouter --auth api-key --from-secrets openrouter.ai:OPENROUTER_API_KEY
|
|
157
|
+
agents accounts set-key work
|
|
158
|
+
agents accounts inspect work --json
|
|
159
|
+
agents accounts set-default claude work
|
|
160
|
+
agents accounts sync work --device yosemite-s0
|
|
161
|
+
agents run claude --account work`,
|
|
162
|
+
notes: 'Provider accounts are durable credentials independent of agent versions. Harness-native auth remains managed by each harness and is not copied or renamed by agents-cli.',
|
|
163
|
+
});
|
|
32
164
|
}
|
package/dist/commands/attach.js
CHANGED
|
@@ -4,19 +4,32 @@ import { sessionRecoveryPeer } from '../lib/session/recovery.js';
|
|
|
4
4
|
import { resolveSessionMetadataValue, resumeSessionInPlace } from './sessions.js';
|
|
5
5
|
import { readDetachRecord, clearDetachRecord, isHeadlessAlive } from '../lib/session/detached.js';
|
|
6
6
|
export function registerAttachCommand(program) {
|
|
7
|
+
// Deprecated: superseded by `agents sessions resume`, which detects the state
|
|
8
|
+
// (live pane / headless / ended) instead of making the caller pick a verb.
|
|
9
|
+
// Hidden from help; kept as a warned, functional alias for one release so old
|
|
10
|
+
// muscle-memory and scripts don't break.
|
|
7
11
|
program
|
|
8
|
-
.command('attach')
|
|
12
|
+
.command('attach', { hidden: true })
|
|
9
13
|
.argument('<id>', 'Short or full id of the backgrounded/parked session to resume interactively')
|
|
10
|
-
.description('
|
|
14
|
+
.description('Deprecated — use `agents sessions resume <id>` instead.')
|
|
11
15
|
.action(async (id) => {
|
|
16
|
+
console.warn(chalk.yellow('`agents sessions attach` is deprecated — use `agents sessions resume` instead:'));
|
|
17
|
+
console.warn(chalk.gray(` agents sessions resume ${id}`));
|
|
12
18
|
await attachAction(id);
|
|
13
19
|
});
|
|
14
20
|
}
|
|
15
21
|
export async function attachAction(id) {
|
|
16
22
|
const outcome = await resolveSessionMetadataValue(id);
|
|
17
23
|
if (outcome.kind === 'partial') {
|
|
18
|
-
|
|
19
|
-
|
|
24
|
+
// RUSH-2492: an unreachable peer is a warning, not a hard failure. The
|
|
25
|
+
// resolver already resolves an id found on the reachable fleet (SES-9a), so
|
|
26
|
+
// reaching here means the session was not found on any device we COULD reach
|
|
27
|
+
// — it may live on one of the unreachable peers, which we could not check.
|
|
28
|
+
const offline = outcome.failedPeers;
|
|
29
|
+
console.error(chalk.yellow(`Warning: ${offline.length} device(s) unreachable, not checked: ${offline.join(', ')}`));
|
|
30
|
+
console.error(chalk.red(`No session matching "${id}" on any reachable device (${offline.length} unreachable, not checked).`));
|
|
31
|
+
console.error(chalk.gray(' If it lives on an offline box, wake it (agents devices) or run there: agents ssh <device>'));
|
|
32
|
+
process.exitCode = 1;
|
|
20
33
|
return;
|
|
21
34
|
}
|
|
22
35
|
if (outcome.kind === 'not-found') {
|
package/dist/commands/audit.d.ts
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `agents audit` —
|
|
2
|
+
* `agents audit` — thin alias of `agents events --include runs`.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* New run-dispatch outcomes land in the unified event stream as `run.dispatched`
|
|
5
|
+
* (see lib/audit/log.ts::recordDispatchedRun). This command does not own a
|
|
6
|
+
* separate store or query path — it only sets the default family filter.
|
|
6
7
|
*
|
|
7
|
-
* agents audit
|
|
8
|
-
* agents audit list
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* checks.
|
|
8
|
+
* agents audit ≡ agents events --include runs
|
|
9
|
+
* agents audit list ≡ same
|
|
10
|
+
* agents audit verify walks the legacy hash-chain file if present
|
|
11
|
+
* (pre-unification history only)
|
|
12
12
|
*/
|
|
13
13
|
import type { Command } from 'commander';
|
|
14
14
|
export declare function registerAuditCommands(program: Command): void;
|
package/dist/commands/audit.js
CHANGED
|
@@ -1,68 +1,78 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `agents audit` —
|
|
2
|
+
* `agents audit` — thin alias of `agents events --include runs`.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* New run-dispatch outcomes land in the unified event stream as `run.dispatched`
|
|
5
|
+
* (see lib/audit/log.ts::recordDispatchedRun). This command does not own a
|
|
6
|
+
* separate store or query path — it only sets the default family filter.
|
|
6
7
|
*
|
|
7
|
-
* agents audit
|
|
8
|
-
* agents audit list
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* checks.
|
|
8
|
+
* agents audit ≡ agents events --include runs
|
|
9
|
+
* agents audit list ≡ same
|
|
10
|
+
* agents audit verify walks the legacy hash-chain file if present
|
|
11
|
+
* (pre-unification history only)
|
|
12
12
|
*/
|
|
13
13
|
import chalk from 'chalk';
|
|
14
14
|
import { verifyAuditChain, readAuditLog, getAuditLogPath, } from '../lib/audit/log.js';
|
|
15
|
-
|
|
16
|
-
const idx = chalk.gray(String(i).padStart(4));
|
|
17
|
-
const time = chalk.gray(r.ts.slice(0, 19).replace('T', ' '));
|
|
18
|
-
const who = `${r.agent}@${r.version}`.padEnd(20);
|
|
19
|
-
const outcome = r.outcome === 'ok' ? chalk.green('ok ') : chalk.red('fail');
|
|
20
|
-
const mode = chalk.cyan(r.mode.padEnd(6));
|
|
21
|
-
return `${idx} ${time} ${who} ${mode} ${outcome} exit=${r.exit} ${r.repo}`;
|
|
22
|
-
}
|
|
15
|
+
import { addEventsReadOptions, runEventsCommand } from './events.js';
|
|
23
16
|
export function registerAuditCommands(program) {
|
|
24
|
-
const audit = program
|
|
17
|
+
const audit = addEventsReadOptions(program
|
|
25
18
|
.command('audit')
|
|
26
|
-
.description('
|
|
19
|
+
.description('Alias of `agents events --include runs` — dispatched-run outcomes'), false)
|
|
20
|
+
.addHelpText('after', `
|
|
21
|
+
Examples:
|
|
22
|
+
agents audit Same as: agents events --include runs
|
|
23
|
+
agents audit --since 7d --json
|
|
24
|
+
agents audit list Muscle-memory alias of bare audit
|
|
25
|
+
agents audit verify Legacy hash-chain file only (if present)
|
|
26
|
+
`)
|
|
27
|
+
.action((_options, command) => {
|
|
28
|
+
const opts = command.optsWithGlobals();
|
|
29
|
+
// Bare audit defaults to --include runs unless the user already set families.
|
|
30
|
+
if (!opts.include && !opts.exclude)
|
|
31
|
+
opts.include = 'runs';
|
|
32
|
+
return runEventsCommand(opts);
|
|
33
|
+
});
|
|
34
|
+
audit
|
|
35
|
+
.command('list')
|
|
36
|
+
.description('Alias of `agents audit` / `agents events --include runs`')
|
|
37
|
+
.action((_options, command) => {
|
|
38
|
+
const parent = command.parent;
|
|
39
|
+
const opts = {
|
|
40
|
+
...(parent?.optsWithGlobals?.() ?? {}),
|
|
41
|
+
...(command.optsWithGlobals?.() ?? {}),
|
|
42
|
+
include: 'runs',
|
|
43
|
+
};
|
|
44
|
+
return runEventsCommand(opts);
|
|
45
|
+
});
|
|
27
46
|
audit
|
|
28
47
|
.command('verify')
|
|
29
|
-
.description('Walk the hash
|
|
48
|
+
.description('Walk the legacy hash-chain file (pre-unification history only)')
|
|
30
49
|
.option('--json', 'Output the result as JSON')
|
|
31
50
|
.action((options) => {
|
|
32
|
-
const
|
|
51
|
+
const logPath = getAuditLogPath();
|
|
52
|
+
const records = readAuditLog(logPath);
|
|
53
|
+
if (records.length === 0) {
|
|
54
|
+
if (options.json) {
|
|
55
|
+
console.log(JSON.stringify({ ok: true, legacy: true, records: 0, note: 'no legacy audit chain; new runs use events --include runs' }));
|
|
56
|
+
process.exit(0);
|
|
57
|
+
}
|
|
58
|
+
console.log(chalk.green('✓ no legacy audit chain present'));
|
|
59
|
+
console.log(chalk.gray(' New run outcomes: agents events --include runs'));
|
|
60
|
+
console.log(chalk.gray(` (looked for ${logPath})`));
|
|
61
|
+
process.exit(0);
|
|
62
|
+
}
|
|
63
|
+
const result = verifyAuditChain(logPath);
|
|
33
64
|
if (options.json) {
|
|
34
|
-
console.log(JSON.stringify(result));
|
|
65
|
+
console.log(JSON.stringify({ ...result, legacy: true, records: records.length }));
|
|
35
66
|
process.exit(result.ok ? 0 : 1);
|
|
36
67
|
}
|
|
37
68
|
if (result.ok) {
|
|
38
|
-
|
|
39
|
-
console.log(chalk.
|
|
40
|
-
console.log(chalk.gray(
|
|
69
|
+
console.log(chalk.green(`✓ legacy audit chain intact — ${records.length} record(s) verified`));
|
|
70
|
+
console.log(chalk.gray(` ${logPath}`));
|
|
71
|
+
console.log(chalk.gray(' New runs use the events stream: agents events --include runs'));
|
|
41
72
|
process.exit(0);
|
|
42
73
|
}
|
|
43
|
-
console.error(chalk.red(`✗ audit chain BROKEN at record #${result.brokenAt}`));
|
|
44
|
-
console.error(chalk.gray(` ${
|
|
74
|
+
console.error(chalk.red(`✗ legacy audit chain BROKEN at record #${result.brokenAt}`));
|
|
75
|
+
console.error(chalk.gray(` ${logPath}`));
|
|
45
76
|
process.exit(1);
|
|
46
77
|
});
|
|
47
|
-
audit
|
|
48
|
-
.command('list')
|
|
49
|
-
.description('Print recent audit records (oldest-first)')
|
|
50
|
-
.option('--limit <n>', 'Max records to show (default 50)', '50')
|
|
51
|
-
.option('--json', 'Output raw records as JSON')
|
|
52
|
-
.action((options) => {
|
|
53
|
-
const all = readAuditLog();
|
|
54
|
-
if (options.json) {
|
|
55
|
-
console.log(JSON.stringify(all, null, 2));
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
if (all.length === 0) {
|
|
59
|
-
console.log(chalk.gray('No audit records yet.'));
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
|
-
const limit = Math.max(1, parseInt(options.limit ?? '50', 10) || 50);
|
|
63
|
-
const start = Math.max(0, all.length - limit);
|
|
64
|
-
for (let i = start; i < all.length; i++)
|
|
65
|
-
console.log(renderRow(all[i], i));
|
|
66
|
-
console.log(chalk.gray(`\n${all.length} record(s). Log: ${getAuditLogPath()}`));
|
|
67
|
-
});
|
|
68
78
|
}
|
package/dist/commands/browser.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
1
2
|
import * as fs from 'fs';
|
|
2
3
|
import * as path from 'path';
|
|
3
4
|
import { listProfiles, getProfile, createProfile, deleteProfile, ensureDefaultBrowserProfile, getConfiguredDefaultProfileName, DEFAULT_BROWSER_PROFILE_NAME, getProfileRuntimeDir, extractConfiguredPort, findFreeProfilePort, getEndpointPresets, } from '../lib/browser/profiles.js';
|
|
4
|
-
import { updateMeta } from '../lib/state.js';
|
|
5
5
|
import { resolveActor } from '../lib/actor.js';
|
|
6
6
|
import { loginsForProfile, profilesLoggedInto, serviceForUrl, loginsWithAccountsForProfile, accountsForProfile, credKeysForService, AUTH_SIGNATURES, } from '../lib/browser/login-detection.js';
|
|
7
7
|
import { parseSecretRef } from '../lib/browser/secret-ref.js';
|
|
@@ -15,7 +15,7 @@ import { parseTargetFilter } from '../lib/browser/service.js';
|
|
|
15
15
|
import { BrowserDaemonNotRunningError, formatBrowserDaemonNotRunningError, sendIPCRequest, } from '../lib/browser/ipc.js';
|
|
16
16
|
import { browserTaskPicker } from './browser-picker.js';
|
|
17
17
|
import { assertRemoteControlAllowed } from '../lib/browser/remote-control.js';
|
|
18
|
-
import { getConfigValue, setConfigValue } from '../lib/device-config.js';
|
|
18
|
+
import { getConfigValue, setConfigValue, unsetConfigValue } from '../lib/device-config.js';
|
|
19
19
|
import { isInteractiveTerminal } from './utils.js';
|
|
20
20
|
import { registerCommandGroups, setHelpSections } from '../lib/help.js';
|
|
21
21
|
import { buildHar } from '../lib/browser/har.js';
|
|
@@ -188,17 +188,15 @@ function registerProfilesCommands(browser) {
|
|
|
188
188
|
console.log(`Default profile (this machine): ${configuredDefault}`);
|
|
189
189
|
}
|
|
190
190
|
});
|
|
191
|
+
const browserProfileDeprecation = chalk.yellow('Deprecation: `agents browser profiles set-default` is replaced by `agents config set browser.profile <name>`.');
|
|
191
192
|
profiles
|
|
192
193
|
.command('set-default [name]')
|
|
193
194
|
.description('Set the profile `agents browser start` uses when no --profile is passed (also re-points an explicit `--profile default`). Device-local — each machine has its own. No name prints the current value.')
|
|
194
195
|
.option('--unset', 'Clear the configured default (revert to auto-detecting an installed browser)')
|
|
195
196
|
.action(async (name, opts) => {
|
|
197
|
+
console.warn(browserProfileDeprecation);
|
|
196
198
|
if (opts.unset) {
|
|
197
|
-
|
|
198
|
-
const { defaultBrowserProfile, ...rest } = m;
|
|
199
|
-
void defaultBrowserProfile;
|
|
200
|
-
return rest;
|
|
201
|
-
});
|
|
199
|
+
unsetConfigValue('browser.profile');
|
|
202
200
|
console.log('Default browser profile cleared. `agents browser start` will auto-detect an installed Chromium-family browser.');
|
|
203
201
|
return;
|
|
204
202
|
}
|
|
@@ -209,7 +207,7 @@ function registerProfilesCommands(browser) {
|
|
|
209
207
|
}
|
|
210
208
|
else {
|
|
211
209
|
console.log('No default browser profile set. `agents browser start` auto-detects an installed Chromium-family browser.');
|
|
212
|
-
console.log('Set one with: agents
|
|
210
|
+
console.log('Set one with: agents config set browser.profile <name>');
|
|
213
211
|
}
|
|
214
212
|
return;
|
|
215
213
|
}
|
|
@@ -221,7 +219,7 @@ function registerProfilesCommands(browser) {
|
|
|
221
219
|
console.error(`Available profiles: ${all.map((p) => p.name).join(', ')}`);
|
|
222
220
|
process.exit(1);
|
|
223
221
|
}
|
|
224
|
-
|
|
222
|
+
setConfigValue('browser.profile', name);
|
|
225
223
|
const eps = getEndpointPresets(target);
|
|
226
224
|
const epStr = Object.values(eps)[0]?.target ?? '';
|
|
227
225
|
console.log(`Default browser profile (this machine) is now "${name}" (${target.browser}${epStr ? `, ${epStr}` : ''}).`);
|
|
@@ -454,7 +452,7 @@ function registerProfilesCommands(browser) {
|
|
|
454
452
|
(removed > 0 ? ` (and ${removed} cache dir${removed === 1 ? '' : 's'})` : ''));
|
|
455
453
|
if (getConfiguredDefaultProfileName() === name) {
|
|
456
454
|
console.error(`warning: "${name}" was this machine's default browser profile; ` +
|
|
457
|
-
`\`agents browser start\` will auto-detect until you run: agents
|
|
455
|
+
`\`agents browser start\` will auto-detect until you run: agents config set browser.profile <name>`);
|
|
458
456
|
}
|
|
459
457
|
});
|
|
460
458
|
profiles
|
|
@@ -674,6 +672,7 @@ function registerTaskCommands(browser) {
|
|
|
674
672
|
task: opts.task ?? process.env.AGENTS_BROWSER_TASK,
|
|
675
673
|
actor: resolveActor().id,
|
|
676
674
|
launchId: process.env.AGENT_LAUNCH_ID,
|
|
675
|
+
sessionId: process.env.AGENT_SESSION_ID || process.env.AGENTS_SESSION_ID,
|
|
677
676
|
});
|
|
678
677
|
});
|
|
679
678
|
setHelpSections(stream, {
|
|
@@ -695,7 +694,7 @@ function registerTaskCommands(browser) {
|
|
|
695
694
|
});
|
|
696
695
|
browser
|
|
697
696
|
.command('start')
|
|
698
|
-
.description('Start a browser task. Pass --profile <name>; omit to use your configured default (`agents browser
|
|
697
|
+
.description('Start a browser task. Pass --profile <name>; omit to use your configured default (`agents config set browser.profile <name>`), else auto-pick an installed Chromium-family browser.')
|
|
699
698
|
.option('-p, --profile <name>', 'Browser profile to use (omit to use the configured default, else auto-pick an installed Chromium-family browser)')
|
|
700
699
|
.option(TASK_OPTION_FLAG, 'Task name (auto-generated if omitted)')
|
|
701
700
|
.option('-e, --endpoint <name>', 'Endpoint preset (defaults to the profile\'s default)')
|
|
@@ -798,6 +797,11 @@ function registerTaskCommands(browser) {
|
|
|
798
797
|
// per-run id exec.ts injects for every harness.
|
|
799
798
|
actor: resolveActor().id,
|
|
800
799
|
launchId: process.env.AGENT_LAUNCH_ID,
|
|
800
|
+
// The agent session that drove this task — what makes the capture
|
|
801
|
+
// traceable back to a conversation (RUSH-2549). Sent alongside, not
|
|
802
|
+
// instead of, launchId: a launch id is absent on most agent processes,
|
|
803
|
+
// a session id is not.
|
|
804
|
+
sessionId: process.env.AGENT_SESSION_ID || process.env.AGENTS_SESSION_ID,
|
|
801
805
|
});
|
|
802
806
|
if (!response.ok) {
|
|
803
807
|
console.error(response.error);
|
package/dist/commands/cloud.js
CHANGED
|
@@ -127,7 +127,7 @@ Examples:
|
|
|
127
127
|
# Codex Cloud
|
|
128
128
|
agents cloud run "add auth tests" --provider codex --env env_abc123
|
|
129
129
|
|
|
130
|
-
# One of your own machines (agents
|
|
130
|
+
# One of your own machines (agents devices), over SSH
|
|
131
131
|
agents cloud run "run the nightly benchmark" --host gpu-box --agent claude
|
|
132
132
|
agents cloud run "rebuild the index" --host gpu --any --remote-cwd ~/proj
|
|
133
133
|
|
|
@@ -395,17 +395,6 @@ Examples:
|
|
|
395
395
|
console.log(chalk.gray('Central source unchanged. Commands will re-sync on next agent launch.'));
|
|
396
396
|
}
|
|
397
397
|
});
|
|
398
|
-
// `commands sync` is gone — sync runs automatically when the agent launches.
|
|
399
|
-
commandsCmd
|
|
400
|
-
.command('sync', { hidden: true })
|
|
401
|
-
.allowUnknownOption()
|
|
402
|
-
.allowExcessArguments()
|
|
403
|
-
.action(() => {
|
|
404
|
-
console.error(chalk.red('"agents commands sync" is gone.'));
|
|
405
|
-
console.error(chalk.gray('Sync runs automatically when you launch the agent.'));
|
|
406
|
-
console.error(chalk.gray('To remove orphans, use: agents prune cleanup commands'));
|
|
407
|
-
process.exit(1);
|
|
408
|
-
});
|
|
409
398
|
// `commands prune` moved to the top-level `agents prune cleanup` command.
|
|
410
399
|
commandsCmd
|
|
411
400
|
.command('prune', { hidden: true })
|
|
@@ -9,9 +9,12 @@
|
|
|
9
9
|
import { execFileSync } from 'child_process';
|
|
10
10
|
import * as fs from 'fs';
|
|
11
11
|
import * as path from 'path';
|
|
12
|
+
import { randomUUID } from 'node:crypto';
|
|
12
13
|
import { openComputerClient, describeTransport, resolvePolicyPath, } from '../lib/computer-rpc.js';
|
|
13
14
|
import { COMPUTER_INPUT_GATED_VERBS, formatComputerPermissionGrantHint, } from '../lib/permissions.js';
|
|
14
15
|
import { emit as emitEvent } from '../lib/events.js';
|
|
16
|
+
import { recordComputerSession } from '../lib/session/db.js';
|
|
17
|
+
import { resolveActor } from '../lib/actor.js';
|
|
15
18
|
function isComputerInputVerb(verb) {
|
|
16
19
|
return typeof verb === 'string' && COMPUTER_INPUT_GATED_VERBS.includes(verb);
|
|
17
20
|
}
|
|
@@ -358,14 +361,44 @@ function emit(result, json, human) {
|
|
|
358
361
|
// NOTE: the field is `targetPid`, never `pid` — `pid` is a reserved envelope
|
|
359
362
|
// key (the emitting process's OWN pid, events.ts RESERVED_META_KEYS) that
|
|
360
363
|
// sanitizePayload() silently strips from the payload before it can collide.
|
|
364
|
+
const COMPUTER_INVOCATION_ID = randomUUID();
|
|
361
365
|
export function emitComputerAction(verb, targetPid, opts, extra = {}) {
|
|
362
366
|
emitEvent('computer.action', {
|
|
363
367
|
command: verb,
|
|
368
|
+
invocationId: COMPUTER_INVOCATION_ID,
|
|
364
369
|
targetPid,
|
|
365
370
|
bundle: opts.bundle,
|
|
366
371
|
host: opts.host,
|
|
367
372
|
...extra,
|
|
368
373
|
});
|
|
374
|
+
// Mirror the invocation's IDENTITY into the durable store (RUSH-2549). The
|
|
375
|
+
// event above stays the audit record, but the event ledger is bounded and
|
|
376
|
+
// prunes at 7 days / 50 MiB (events.ts), so a run's history used to vanish on
|
|
377
|
+
// day 8. This row is metadata only -- no screenshots, no typed text -- and
|
|
378
|
+
// `action_count` accumulates across the many calls one invocation makes.
|
|
379
|
+
//
|
|
380
|
+
// Identity is read from this process's own env, exactly as stampProvenance()
|
|
381
|
+
// does for the event: `agents computer` runs IN the caller's process, so there
|
|
382
|
+
// is no shared daemon to mis-attribute it to (the browser problem).
|
|
383
|
+
//
|
|
384
|
+
// Guarded for the same reason `emit` above guards itself ("logging should
|
|
385
|
+
// never break the CLI", events.ts): this is a RECORD of the action, not the
|
|
386
|
+
// action. An unwritable or locked session DB must not stop `agents computer
|
|
387
|
+
// click` from clicking. The action still happened and its event still landed;
|
|
388
|
+
// only this row is missed, and the next call re-records the identity.
|
|
389
|
+
try {
|
|
390
|
+
recordComputerSession({
|
|
391
|
+
invocationId: COMPUTER_INVOCATION_ID,
|
|
392
|
+
sessionId: process.env.AGENT_SESSION_ID || process.env.AGENTS_SESSION_ID,
|
|
393
|
+
launchId: process.env.AGENT_LAUNCH_ID,
|
|
394
|
+
actor: resolveActor().id,
|
|
395
|
+
actionCount: 1,
|
|
396
|
+
taskPreview: typeof extra.task === 'string' ? extra.task : undefined,
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
catch {
|
|
400
|
+
// Recording is best-effort; the action and its event are already done.
|
|
401
|
+
}
|
|
369
402
|
}
|
|
370
403
|
// Add the shared --pid/--bundle/--host target options to a verb. `--host` routes
|
|
371
404
|
// the verb at a remote Windows device: the `computer` preAction hook hydrates
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type ComputerRunRow } from '../lib/computer/sessions-list.js';
|
|
2
|
+
export interface ComputerSessionsCommandOpts {
|
|
3
|
+
machine?: string;
|
|
4
|
+
/** Row cap for the flat table only — the interactive picker is searchable
|
|
5
|
+
* and shows every row regardless (see `runComputerSessions`). */
|
|
6
|
+
limit?: number;
|
|
7
|
+
json?: boolean;
|
|
8
|
+
/** Commander's `--no-interactive` convention: `false` opts out. */
|
|
9
|
+
interactive?: boolean;
|
|
10
|
+
/** Pre-collected fleet rows. Omitted for the local ledger path. */
|
|
11
|
+
rows?: ComputerRunRow[];
|
|
12
|
+
}
|
|
13
|
+
/** True when the interactive picker should open instead of the printed table:
|
|
14
|
+
* a real TTY, no `--json`, and `--no-interactive` not set. */
|
|
15
|
+
export declare function shouldOpenInteractiveComputerSessions(opts: ComputerSessionsCommandOpts, isTTY: boolean): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Shared entry point for `agents computer sessions` and `agents sessions
|
|
18
|
+
* --computer`. Mirrors `runBrowserSessionsCommand`'s interactive-routing
|
|
19
|
+
* split so both call sites stay in lockstep.
|
|
20
|
+
*/
|
|
21
|
+
export declare function runComputerSessionsCommand(opts: ComputerSessionsCommandOpts): Promise<void>;
|