@phnx-labs/agents-cli 1.22.35 → 1.22.38
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 +708 -2
- package/README.md +83 -43
- package/dist/bin/agents +0 -0
- package/dist/bootstrap.d.ts +15 -0
- package/dist/bootstrap.js +1212 -0
- package/dist/commands/accounts.d.ts +4 -11
- package/dist/commands/accounts.js +159 -27
- package/dist/commands/artifacts-setup.d.ts +53 -0
- package/dist/commands/artifacts-setup.js +161 -0
- package/dist/commands/artifacts.d.ts +18 -0
- package/dist/commands/artifacts.js +58 -0
- 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 +17 -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 +86 -42
- 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 +71 -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/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.d.ts +5 -0
- package/dist/commands/setup.js +31 -5
- package/dist/commands/share.d.ts +87 -7
- package/dist/commands/share.js +320 -58
- 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/hygiene.d.ts +90 -0
- package/dist/lib/browser/hygiene.js +146 -0
- package/dist/lib/browser/ipc.d.ts +30 -0
- package/dist/lib/browser/ipc.js +93 -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 +79 -1
- package/dist/lib/browser/service.js +231 -14
- 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 +63 -1
- 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 +21 -7
- package/dist/lib/git.js +122 -18
- 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 +44 -7
- 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/analytics.js +1 -1
- package/dist/lib/share/capture.d.ts +1 -1
- package/dist/lib/share/capture.js +3 -3
- package/dist/lib/share/config.d.ts +6 -2
- package/dist/lib/share/config.js +6 -5
- package/dist/lib/share/delete.js +3 -3
- package/dist/lib/share/provision.d.ts +38 -0
- package/dist/lib/share/provision.js +51 -1
- package/dist/lib/share/publish.d.ts +40 -1
- package/dist/lib/share/publish.js +119 -6
- package/dist/lib/share/worker-template.d.ts +12 -1
- package/dist/lib/share/worker-template.js +83 -7
- 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 +16 -14
- package/dist/lib/startup/command-registry.js +26 -37
- 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 +316 -0
- package/dist/lib/tmux/orphan-reap.js +638 -0
- package/dist/lib/tmux/session.d.ts +68 -3
- package/dist/lib/tmux/session.js +96 -5
- package/dist/lib/triggers/handlers.d.ts +20 -0
- package/dist/lib/triggers/handlers.js +16 -1
- package/dist/lib/triggers/webhook.js +10 -0
- package/dist/lib/types.d.ts +47 -35
- 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/set.d.ts +0 -15
- package/dist/commands/set.js +0 -79
- package/dist/commands/setup-share.d.ts +0 -17
- package/dist/commands/setup-share.js +0 -85
- 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/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,11 +694,12 @@ 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)')
|
|
702
701
|
.option('-u, --url <url>', 'Open URL in first tab')
|
|
702
|
+
.option('--fresh', 'Always open a new tab, skipping the reclaim of a tab an abandoned task is holding on that URL')
|
|
703
703
|
.option('--no-skills', 'Skip auto-discovery of site-specific SKILL.md from ~/.agents/skills/browser/domain-skills/')
|
|
704
704
|
.option('--record', 'Start recording right after the tab opens (shorthand for `agents browser record start` as a follow-up)')
|
|
705
705
|
.option('--fps <n>', 'Recording frames per second (with --record; 1–30, default 5)', (v) => parseInt(v, 10))
|
|
@@ -792,12 +792,18 @@ function registerTaskCommands(browser) {
|
|
|
792
792
|
url: opts.url,
|
|
793
793
|
endpoint: opts.endpoint,
|
|
794
794
|
skipDomainSkill: opts.skills === false,
|
|
795
|
+
fresh: opts.fresh === true,
|
|
795
796
|
// Forward the caller's identity: the browser daemon is shared, so it
|
|
796
797
|
// cannot resolve who/which-run called `start`. `resolveActor()` runs
|
|
797
798
|
// here in the CLI (the caller's process); `$AGENT_LAUNCH_ID` is the
|
|
798
799
|
// per-run id exec.ts injects for every harness.
|
|
799
800
|
actor: resolveActor().id,
|
|
800
801
|
launchId: process.env.AGENT_LAUNCH_ID,
|
|
802
|
+
// The agent session that drove this task — what makes the capture
|
|
803
|
+
// traceable back to a conversation (RUSH-2549). Sent alongside, not
|
|
804
|
+
// instead of, launchId: a launch id is absent on most agent processes,
|
|
805
|
+
// a session id is not.
|
|
806
|
+
sessionId: process.env.AGENT_SESSION_ID || process.env.AGENTS_SESSION_ID,
|
|
801
807
|
});
|
|
802
808
|
if (!response.ok) {
|
|
803
809
|
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>;
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interactive, task-first `agents computer sessions` / `agents sessions
|
|
3
|
+
* --computer` view (RUSH-2432) — the computer counterpart of
|
|
4
|
+
* `browser-sessions-picker.ts` (RUSH-2407). Backs the TTY path only —
|
|
5
|
+
* non-TTY, `--json`, and `--no-interactive` all fall straight through to the
|
|
6
|
+
* flat printer in `lib/computer/sessions-list.ts` (unchanged, so `--json`
|
|
7
|
+
* stays a stable surface).
|
|
8
|
+
*
|
|
9
|
+
* Reuses the same `itemPicker` + `buildPreview` primitives as the ordinary
|
|
10
|
+
* session picker (`sessions-picker.ts`) and the browser task picker — same
|
|
11
|
+
* search/filter/quit help, and the preview pane for a linked run IS the
|
|
12
|
+
* canonical session digest, not a second renderer. Unlike a browser task, a
|
|
13
|
+
* computer run has no on-disk artifact of its own to open (see
|
|
14
|
+
* `lib/computer/sessions-list.ts`'s module docblock), so `enter` prints the
|
|
15
|
+
* run's full action list rather than opening a file, and the picker keeps
|
|
16
|
+
* browsing afterward instead of exiting.
|
|
17
|
+
*/
|
|
18
|
+
import chalk from 'chalk';
|
|
19
|
+
import { itemPicker } from '../lib/picker.js';
|
|
20
|
+
import { isInteractiveTerminal, isPromptCancelled } from './utils.js';
|
|
21
|
+
import { buildPreview } from './sessions-picker.js';
|
|
22
|
+
import { runComputerSessions, printComputerSessionRows, buildComputerSessionRows, matchesComputerSessionRow, formatRowActions, } from '../lib/computer/sessions-list.js';
|
|
23
|
+
import { formatRelativeTime } from '../lib/session/relative-time.js';
|
|
24
|
+
/** True when the interactive picker should open instead of the printed table:
|
|
25
|
+
* a real TTY, no `--json`, and `--no-interactive` not set. */
|
|
26
|
+
export function shouldOpenInteractiveComputerSessions(opts, isTTY) {
|
|
27
|
+
return opts.interactive !== false && !opts.json && isTTY;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Shared entry point for `agents computer sessions` and `agents sessions
|
|
31
|
+
* --computer`. Mirrors `runBrowserSessionsCommand`'s interactive-routing
|
|
32
|
+
* split so both call sites stay in lockstep.
|
|
33
|
+
*/
|
|
34
|
+
export async function runComputerSessionsCommand(opts) {
|
|
35
|
+
if (!shouldOpenInteractiveComputerSessions(opts, isInteractiveTerminal())) {
|
|
36
|
+
if (opts.rows)
|
|
37
|
+
printComputerSessionRows(opts.rows, { limit: opts.limit, json: opts.json });
|
|
38
|
+
else
|
|
39
|
+
runComputerSessions({ machine: opts.machine, limit: opts.limit, json: opts.json });
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const rows = opts.rows ?? buildComputerSessionRows({ machine: opts.machine });
|
|
43
|
+
if (rows.length === 0) {
|
|
44
|
+
console.log(`No computer actions recorded${opts.machine ? ` for machine "${opts.machine}"` : ''}.`);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
await browseComputerSessions(rows);
|
|
48
|
+
}
|
|
49
|
+
function rowLinkSummary(row) {
|
|
50
|
+
if (row.linkStatus === 'linked' && row.linkedSession) {
|
|
51
|
+
const s = row.linkedSession;
|
|
52
|
+
return chalk.cyan(s.agent) + ' — ' + (s.label || s.topic || s.shortId);
|
|
53
|
+
}
|
|
54
|
+
if (row.linkStatus === 'unresolved') {
|
|
55
|
+
return chalk.yellow(`owner ${row.agent ?? 'unknown'} (session not indexed here)`);
|
|
56
|
+
}
|
|
57
|
+
return chalk.gray('unlinked');
|
|
58
|
+
}
|
|
59
|
+
function formatRowLabel(row) {
|
|
60
|
+
// Pad the raw text first, THEN colorize — padEnd on an already-chalked
|
|
61
|
+
// string counts the ANSI escape bytes as width and misaligns the column.
|
|
62
|
+
const rawName = row.task ?? row.bundle ?? (row.pid ? `pid ${row.pid}` : 'recovered run');
|
|
63
|
+
const name = rawName.slice(0, 40).padEnd(40);
|
|
64
|
+
const coloredName = row.task ? name : chalk.gray(name);
|
|
65
|
+
const where = (row.remoteHost ? `${row.machine} -> ${row.remoteHost}` : row.machine).padEnd(24);
|
|
66
|
+
const age = formatRelativeTime(new Date(row.endMs).toISOString());
|
|
67
|
+
const counts = formatRowActions(row);
|
|
68
|
+
return [coloredName, where, age.padEnd(11), counts.padEnd(24), rowLinkSummary(row)].join(' ');
|
|
69
|
+
}
|
|
70
|
+
const PREVIEW_ACTION_LIMIT = 12;
|
|
71
|
+
function buildRowPreview(row) {
|
|
72
|
+
const parts = [];
|
|
73
|
+
if (row.linkStatus === 'linked' && row.linkedSession) {
|
|
74
|
+
parts.push(buildPreview(row.linkedSession));
|
|
75
|
+
}
|
|
76
|
+
else if (row.linkStatus === 'unresolved') {
|
|
77
|
+
parts.push(chalk.yellow(`owner ${row.agent ?? 'unknown'} — session ${row.sessionId ?? row.launchId} has no indexed session on this machine.`));
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
parts.push(chalk.gray('Unlinked — no owning agent session is known for this run (no session/launch identity recorded).'));
|
|
81
|
+
}
|
|
82
|
+
if (row.task) {
|
|
83
|
+
parts.push('');
|
|
84
|
+
parts.push(chalk.bold('Task:') + ` ${row.task}`);
|
|
85
|
+
}
|
|
86
|
+
parts.push('');
|
|
87
|
+
parts.push(chalk.bold(`Actions (${row.recoveredActionCount ?? row.actions.length})`) + ` ${formatRowActions(row)}`);
|
|
88
|
+
for (const a of row.actions.slice(0, PREVIEW_ACTION_LIMIT)) {
|
|
89
|
+
parts.push(` ${formatActionLabel(a)}`);
|
|
90
|
+
}
|
|
91
|
+
const more = row.actions.length - PREVIEW_ACTION_LIMIT;
|
|
92
|
+
if (more > 0)
|
|
93
|
+
parts.push(chalk.gray(` … (${more} more)`));
|
|
94
|
+
return parts.join('\n');
|
|
95
|
+
}
|
|
96
|
+
function formatActionLabel(a) {
|
|
97
|
+
const age = formatRelativeTime(new Date(a.tsMs).toISOString());
|
|
98
|
+
const target = a.bundle ?? (a.targetPid != null ? `pid ${a.targetPid}` : '-');
|
|
99
|
+
return `${age.padEnd(11)} ${a.verb.padEnd(14)} ${target}`;
|
|
100
|
+
}
|
|
101
|
+
/** Print one run's full action list (no truncation) — the `enter` action,
|
|
102
|
+
* since a computer run has no on-disk artifact to open. */
|
|
103
|
+
function printRunDetail(row) {
|
|
104
|
+
console.log('');
|
|
105
|
+
console.log(chalk.bold(row.task ?? row.bundle ?? `pid ${row.pid}`));
|
|
106
|
+
console.log(row.remoteHost ? `${row.machine} -> ${row.remoteHost}` : row.machine);
|
|
107
|
+
console.log('');
|
|
108
|
+
for (const a of row.actions)
|
|
109
|
+
console.log(formatActionLabel(a));
|
|
110
|
+
if (row.actions.length === 0)
|
|
111
|
+
console.log('(no driving actions recorded)');
|
|
112
|
+
console.log('');
|
|
113
|
+
}
|
|
114
|
+
/** Run-level picker with an action-list preview. Loops until the user quits
|
|
115
|
+
* (esc) so a session's whole run history can be browsed repeatedly in one
|
|
116
|
+
* sitting — mirroring `browseAndOpen`'s loop, minus the artifact drill-down
|
|
117
|
+
* a computer run has none of. */
|
|
118
|
+
async function browseComputerSessions(rows) {
|
|
119
|
+
for (;;) {
|
|
120
|
+
let picked;
|
|
121
|
+
try {
|
|
122
|
+
picked = await itemPicker({
|
|
123
|
+
message: 'Computer sessions:',
|
|
124
|
+
items: rows,
|
|
125
|
+
filter: (query) => (query.trim() ? rows.filter((r) => matchesComputerSessionRow(r, query)) : rows),
|
|
126
|
+
labelFor: (row) => formatRowLabel(row),
|
|
127
|
+
buildPreview: (row) => buildRowPreview(row),
|
|
128
|
+
emptyMessage: 'No computer sessions match.',
|
|
129
|
+
enterHint: 'view actions',
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
catch (err) {
|
|
133
|
+
if (isPromptCancelled(err))
|
|
134
|
+
return;
|
|
135
|
+
throw err;
|
|
136
|
+
}
|
|
137
|
+
if (!picked)
|
|
138
|
+
return;
|
|
139
|
+
printRunDetail(picked.item);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
@@ -38,6 +38,22 @@ export declare function reconcileScreenshotExt(outPath: string, buf: Buffer): {
|
|
|
38
38
|
export declare function registerComputerCommand(program: Command): void;
|
|
39
39
|
export declare function registerComputerSubcommands(program: Command): void;
|
|
40
40
|
export declare function buildRestartTaskScript(taskName: string, exeName: string): string;
|
|
41
|
+
/**
|
|
42
|
+
* Emit a `computer.action` marker for `computer run`'s whole loop process, so
|
|
43
|
+
* `agents computer sessions` groups every verb the loop drives under one
|
|
44
|
+
* task-labeled row instead of a bare pid with no task text (see
|
|
45
|
+
* lib/computer/sessions-list.ts's "Grouping key" docblock note). The task
|
|
46
|
+
* text is bounded to `TASK_PREVIEW_MAX_CHARS` — never the full unbounded
|
|
47
|
+
* `--task` string — matching that module's retention/privacy note. Exported
|
|
48
|
+
* so the truncation behavior is directly unit-testable against the real
|
|
49
|
+
* event ledger, the same seam `computer-actions.test.ts` already uses for
|
|
50
|
+
* `emitComputerAction`.
|
|
51
|
+
*/
|
|
52
|
+
export declare function emitComputerRunTaskMarker(opts: {
|
|
53
|
+
task: string;
|
|
54
|
+
bundle?: string;
|
|
55
|
+
host?: string;
|
|
56
|
+
}): void;
|
|
41
57
|
/**
|
|
42
58
|
* Install the macOS helper locally: resolve (or download + verify) the signed,
|
|
43
59
|
* notarized .app, copy it to /Applications, verify the destination signature,
|
|
@@ -11,6 +11,9 @@ import { registerActionCommands, withClient, unwrap, pickTarget, emitComputerAct
|
|
|
11
11
|
import { runComputerLoop } from '../lib/computer/loop.js';
|
|
12
12
|
import { makeVerbDispatcher } from '../lib/computer/dispatch.js';
|
|
13
13
|
import { makeClaudeResponder, resolveApiKey, DEFAULT_CLAUDE_MODEL, DEFAULT_CLAUDE_BASE_URL } from '../lib/computer/model.js';
|
|
14
|
+
import { TASK_PREVIEW_MAX_CHARS } from '../lib/computer/sessions-list.js';
|
|
15
|
+
import { runComputerSessionsCommand } from './computer-sessions-picker.js';
|
|
16
|
+
import { truncate } from '../lib/events.js';
|
|
14
17
|
// Help groups — mirror `agents browser` so the mental model carries over.
|
|
15
18
|
const COMPUTER_HELP_GROUPS = [
|
|
16
19
|
{ title: 'Installation', names: ['setup'] },
|
|
@@ -18,6 +21,7 @@ const COMPUTER_HELP_GROUPS = [
|
|
|
18
21
|
{ title: 'Autonomous', names: ['run'] },
|
|
19
22
|
{ title: 'Observe', names: ['apps', 'describe', 'screenshot', 'get-text'] },
|
|
20
23
|
{ title: 'Interact', names: ['launch', 'raise', 'click', 'right-click', 'type', 'type-text', 'key', 'drag', 'scroll', 'ax-action', 'focus', 'wait'] },
|
|
24
|
+
{ title: 'History and discovery', names: ['sessions'] },
|
|
21
25
|
];
|
|
22
26
|
// Subcommands that manage the `--host` remote path themselves (provisioning /
|
|
23
27
|
// tunnel lifecycle, or daemon-state reporting that must degrade gracefully
|
|
@@ -109,6 +113,7 @@ export function registerComputerSubcommands(program) {
|
|
|
109
113
|
registerRunCommand(program);
|
|
110
114
|
registerScreenshotCommand(program);
|
|
111
115
|
registerActionCommands(program);
|
|
116
|
+
registerSessionsCommand(program);
|
|
112
117
|
registerCommandGroups(program, COMPUTER_HELP_GROUPS);
|
|
113
118
|
}
|
|
114
119
|
function registerStatusCommand(program) {
|
|
@@ -300,6 +305,7 @@ function registerRunCommand(program) {
|
|
|
300
305
|
model: opts.model,
|
|
301
306
|
maxTokens: opts.maxTokens,
|
|
302
307
|
});
|
|
308
|
+
emitComputerRunTaskMarker({ task: opts.task, bundle: opts.bundle, host: opts.host });
|
|
303
309
|
await withClient(async (client) => {
|
|
304
310
|
const dispatch = makeVerbDispatcher(client, { host: opts.host });
|
|
305
311
|
const targetInput = opts.bundle ? { bundle: opts.bundle } : {};
|
|
@@ -324,6 +330,37 @@ function registerRunCommand(program) {
|
|
|
324
330
|
});
|
|
325
331
|
});
|
|
326
332
|
}
|
|
333
|
+
// sessions — task-first history over the computer.action event ledger (RUSH-2432),
|
|
334
|
+
// the computer counterpart of `agents browser sessions` (RUSH-2407). `agents
|
|
335
|
+
// sessions --computer` (sessions.ts) routes to the same runComputerSessionsCommand.
|
|
336
|
+
function registerSessionsCommand(program) {
|
|
337
|
+
program
|
|
338
|
+
.command('sessions')
|
|
339
|
+
.description('Browse computer-driving history, grouped by run — one row per `agents computer` invocation')
|
|
340
|
+
.option('--machine <name>', 'Only rows invoked from/driving this machine (hostname, machineId, or --host device)')
|
|
341
|
+
.option('--limit <n>', 'Cap the flat/--no-interactive table at this many rows (default 50; --json is unbounded)', (v) => parseInt(v, 10))
|
|
342
|
+
.option('--json', 'Emit machine-readable JSON')
|
|
343
|
+
.option('--no-interactive', 'Print the flat listing instead of opening the interactive run browser')
|
|
344
|
+
.action(async (opts) => {
|
|
345
|
+
await runComputerSessionsCommand({ machine: opts.machine, limit: opts.limit, json: opts.json, interactive: opts.interactive });
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Emit a `computer.action` marker for `computer run`'s whole loop process, so
|
|
350
|
+
* `agents computer sessions` groups every verb the loop drives under one
|
|
351
|
+
* task-labeled row instead of a bare pid with no task text (see
|
|
352
|
+
* lib/computer/sessions-list.ts's "Grouping key" docblock note). The task
|
|
353
|
+
* text is bounded to `TASK_PREVIEW_MAX_CHARS` — never the full unbounded
|
|
354
|
+
* `--task` string — matching that module's retention/privacy note. Exported
|
|
355
|
+
* so the truncation behavior is directly unit-testable against the real
|
|
356
|
+
* event ledger, the same seam `computer-actions.test.ts` already uses for
|
|
357
|
+
* `emitComputerAction`.
|
|
358
|
+
*/
|
|
359
|
+
export function emitComputerRunTaskMarker(opts) {
|
|
360
|
+
emitComputerAction('run', undefined, { bundle: opts.bundle, host: opts.host }, {
|
|
361
|
+
task: truncate(opts.task, TASK_PREVIEW_MAX_CHARS),
|
|
362
|
+
});
|
|
363
|
+
}
|
|
327
364
|
// Fold the target bundle into the task text so the model biases toward it.
|
|
328
365
|
function describeTaskWithTarget(task, bundle) {
|
|
329
366
|
return bundle ? `${task}\n(Target app bundle id: ${bundle})` : task;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified configuration command barrel.
|
|
3
|
+
*
|
|
4
|
+
* `agents config` consolidates the fragmented config surface into one namespace:
|
|
5
|
+
* - run defaults (model, mode, effort)
|
|
6
|
+
* - tier overrides (folded into the run namespace)
|
|
7
|
+
* - interactive host
|
|
8
|
+
* - usage primary host
|
|
9
|
+
* - browser profile
|
|
10
|
+
* - local projects root
|
|
11
|
+
* - per-device config keys
|
|
12
|
+
*
|
|
13
|
+
* The underlying YAML schema is unchanged; this command translates the new key
|
|
14
|
+
* grammar into reads/writes of the existing stores.
|
|
15
|
+
*/
|
|
16
|
+
import type { Command } from 'commander';
|
|
17
|
+
export declare function registerConfigCommand(program: Command): void;
|