@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
|
@@ -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
|
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `agents artifacts setup` — configure the artifact share endpoint (Cloudflare
|
|
3
|
+
* R2 + Worker) that backs `agents artifacts share`.
|
|
4
|
+
*
|
|
5
|
+
* One door, two modes, because it replaces two commands that used to be
|
|
6
|
+
* separate (RUSH-2580): the interactive wizard formerly at `agents setup share`
|
|
7
|
+
* and the flag-driven provisioner formerly at `agents share setup`. On a TTY
|
|
8
|
+
* with no provisioning flags TYPED it runs the wizard (provision or join, and
|
|
9
|
+
* offers a Worker update when an endpoint already exists); with any provisioning
|
|
10
|
+
* flag typed, or on a non-TTY, it provisions directly. Both modes call the same
|
|
11
|
+
* `runShareProvision` / `runShareJoin` in commands/share.ts, so there is a
|
|
12
|
+
* single source of truth for provisioning.
|
|
13
|
+
*
|
|
14
|
+
* "Typed", not "present", is load-bearing — see {@link isDirectProvisionRequest}.
|
|
15
|
+
*
|
|
16
|
+
* Idempotent: re-running shows the current endpoint and offers to reconfigure.
|
|
17
|
+
*/
|
|
18
|
+
import type { Command } from 'commander';
|
|
19
|
+
/**
|
|
20
|
+
* Interactive share setup. Returns true if the user configured (or already had)
|
|
21
|
+
* an endpoint, false if they skipped. Never throws on user cancel — callers
|
|
22
|
+
* (the `agents setup` hub) rely on that to keep the fresh-machine flow going.
|
|
23
|
+
*/
|
|
24
|
+
export declare function runShareWizard(): Promise<boolean>;
|
|
25
|
+
/** Parsed `agents artifacts setup` options — the retired `agents share setup` flag set. */
|
|
26
|
+
interface ArtifactsSetupOpts {
|
|
27
|
+
bundle: string;
|
|
28
|
+
worker: string;
|
|
29
|
+
bucket: string;
|
|
30
|
+
account?: string;
|
|
31
|
+
token?: string;
|
|
32
|
+
domain?: string;
|
|
33
|
+
analyticsToken?: string;
|
|
34
|
+
}
|
|
35
|
+
/** The provisioning flags, by their commander option-value keys. */
|
|
36
|
+
declare const PROVISION_FLAGS: readonly ["bundle", "worker", "bucket", "account", "token", "domain", "analyticsToken"];
|
|
37
|
+
/**
|
|
38
|
+
* True when the invocation named a Cloudflare endpoint detail, i.e. the caller
|
|
39
|
+
* is driving the old `agents share setup` provisioning path rather than asking
|
|
40
|
+
* for the wizard.
|
|
41
|
+
*
|
|
42
|
+
* `--bundle`/`--worker`/`--bucket` carry commander defaults, so their mere
|
|
43
|
+
* PRESENCE proves nothing — the question is whether the user typed them, which
|
|
44
|
+
* only `wasTyped` (backed by commander's `getOptionValueSource`) can answer.
|
|
45
|
+
* Reading presence alone would classify `agents artifacts setup --bundle
|
|
46
|
+
* cloudflare-work` as a wizard run and then silently provision against the
|
|
47
|
+
* DEFAULT bundle, i.e. someone else's Cloudflare account. The other four flags
|
|
48
|
+
* have no default, so presence is proof for them.
|
|
49
|
+
*/
|
|
50
|
+
export declare function isDirectProvisionRequest(opts: ArtifactsSetupOpts, wasTyped?: (flag: (typeof PROVISION_FLAGS)[number]) => boolean): boolean;
|
|
51
|
+
/** Register `agents artifacts setup` under the parent `artifacts` command. */
|
|
52
|
+
export declare function registerArtifactsSetupCommand(artifactsCmd: Command): void;
|
|
53
|
+
export {};
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `agents artifacts setup` — configure the artifact share endpoint (Cloudflare
|
|
3
|
+
* R2 + Worker) that backs `agents artifacts share`.
|
|
4
|
+
*
|
|
5
|
+
* One door, two modes, because it replaces two commands that used to be
|
|
6
|
+
* separate (RUSH-2580): the interactive wizard formerly at `agents setup share`
|
|
7
|
+
* and the flag-driven provisioner formerly at `agents share setup`. On a TTY
|
|
8
|
+
* with no provisioning flags TYPED it runs the wizard (provision or join, and
|
|
9
|
+
* offers a Worker update when an endpoint already exists); with any provisioning
|
|
10
|
+
* flag typed, or on a non-TTY, it provisions directly. Both modes call the same
|
|
11
|
+
* `runShareProvision` / `runShareJoin` in commands/share.ts, so there is a
|
|
12
|
+
* single source of truth for provisioning.
|
|
13
|
+
*
|
|
14
|
+
* "Typed", not "present", is load-bearing — see {@link isDirectProvisionRequest}.
|
|
15
|
+
*
|
|
16
|
+
* Idempotent: re-running shows the current endpoint and offers to reconfigure.
|
|
17
|
+
*/
|
|
18
|
+
import chalk from 'chalk';
|
|
19
|
+
import { DEFAULT_BUCKET_NAME, DEFAULT_CF_BUNDLE, DEFAULT_SHARE_DOMAIN, DEFAULT_WORKER_NAME, readShareConfig, } from '../lib/share/config.js';
|
|
20
|
+
import { runShareProvision, runShareJoin, runShareUpdate, shareTemplateStatus } from './share.js';
|
|
21
|
+
import { isInteractiveTerminal, isPromptCancelled } from './utils.js';
|
|
22
|
+
/**
|
|
23
|
+
* Interactive share setup. Returns true if the user configured (or already had)
|
|
24
|
+
* an endpoint, false if they skipped. Never throws on user cancel — callers
|
|
25
|
+
* (the `agents setup` hub) rely on that to keep the fresh-machine flow going.
|
|
26
|
+
*/
|
|
27
|
+
export async function runShareWizard() {
|
|
28
|
+
if (!isInteractiveTerminal()) {
|
|
29
|
+
console.error(chalk.red('The artifact share wizard needs an interactive terminal. ' +
|
|
30
|
+
'Non-interactively, use `agents artifacts setup --account <id> --token <t>` (provision) ' +
|
|
31
|
+
'or `agents artifacts share join <baseUrl> --token <t>`.'));
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
const existing = readShareConfig();
|
|
35
|
+
if (existing) {
|
|
36
|
+
console.log(chalk.dim(`Share is already configured → ${chalk.green(existing.baseUrl)}`));
|
|
37
|
+
console.log(chalk.dim(` worker ${existing.workerName} · bucket ${existing.bucketName} · account ${existing.accountId}`));
|
|
38
|
+
const templateStatus = shareTemplateStatus(existing);
|
|
39
|
+
console.log(chalk.dim(` template ${templateStatus}`));
|
|
40
|
+
const { select } = await import('@inquirer/prompts');
|
|
41
|
+
const action = await select({
|
|
42
|
+
message: 'Share is already configured. What do you want to do?',
|
|
43
|
+
choices: [
|
|
44
|
+
{ name: 'Keep as is', value: 'keep' },
|
|
45
|
+
{
|
|
46
|
+
name: 'Update the deployed Worker to the latest template',
|
|
47
|
+
value: 'update',
|
|
48
|
+
description: templateStatus === 'current'
|
|
49
|
+
? 'Already current — this re-deploys anyway and refreshes the token in place.'
|
|
50
|
+
: 'Re-deploys the Worker script on your existing endpoint (same account/worker/bucket, same write token).',
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
name: 'Reconfigure from scratch (provision or join again)',
|
|
54
|
+
value: 'reconfigure',
|
|
55
|
+
},
|
|
56
|
+
],
|
|
57
|
+
default: templateStatus === 'outdated' || templateStatus === 'unknown' ? 'update' : 'keep',
|
|
58
|
+
});
|
|
59
|
+
if (action === 'keep') {
|
|
60
|
+
console.log(chalk.dim('Keeping the current endpoint.'));
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
if (action === 'update') {
|
|
64
|
+
// When the template is already current, the description below promises a
|
|
65
|
+
// re-deploy anyway — force it, or runShareUpdate's own no-op would silently
|
|
66
|
+
// contradict what was just said.
|
|
67
|
+
const result = await runShareUpdate({ force: templateStatus === 'current' });
|
|
68
|
+
console.log(result.updated
|
|
69
|
+
? chalk.green(`Worker '${result.workerName}' updated → template ${result.templateHash.slice(0, 12)}…`)
|
|
70
|
+
: chalk.dim(`Worker '${result.workerName}' already matches the current template — no-op.`));
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
// action === 'reconfigure' — fall through to the provision/join flow below.
|
|
74
|
+
}
|
|
75
|
+
const { select } = await import('@inquirer/prompts');
|
|
76
|
+
const mode = await select({
|
|
77
|
+
message: 'How do you want to publish shared links?',
|
|
78
|
+
choices: [
|
|
79
|
+
{
|
|
80
|
+
name: 'Provision my own (Cloudflare R2 + Worker)',
|
|
81
|
+
value: 'provision',
|
|
82
|
+
description: 'One-time: creates a bucket + Worker on your Cloudflare account (~$0). Needs a Cloudflare API token.',
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
name: 'Join an existing endpoint (a teammate already provisioned one)',
|
|
86
|
+
value: 'join',
|
|
87
|
+
description: 'Use synced config when present, or paste the base URL + write token from the endpoint owner.',
|
|
88
|
+
},
|
|
89
|
+
],
|
|
90
|
+
});
|
|
91
|
+
if (mode === 'provision') {
|
|
92
|
+
await runShareProvision({
|
|
93
|
+
bundle: DEFAULT_CF_BUNDLE,
|
|
94
|
+
worker: DEFAULT_WORKER_NAME,
|
|
95
|
+
bucket: DEFAULT_BUCKET_NAME,
|
|
96
|
+
});
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
const { input } = await import('@inquirer/prompts');
|
|
100
|
+
const baseUrl = await input({
|
|
101
|
+
message: 'Endpoint base URL (e.g. https://share.agents-cli.sh)',
|
|
102
|
+
validate: (v) => (v.trim().startsWith('http') ? true : 'Enter the full https:// URL of the endpoint.'),
|
|
103
|
+
});
|
|
104
|
+
await runShareJoin(baseUrl.trim());
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
/** The provisioning flags, by their commander option-value keys. */
|
|
108
|
+
const PROVISION_FLAGS = ['bundle', 'worker', 'bucket', 'account', 'token', 'domain', 'analyticsToken'];
|
|
109
|
+
/**
|
|
110
|
+
* True when the invocation named a Cloudflare endpoint detail, i.e. the caller
|
|
111
|
+
* is driving the old `agents share setup` provisioning path rather than asking
|
|
112
|
+
* for the wizard.
|
|
113
|
+
*
|
|
114
|
+
* `--bundle`/`--worker`/`--bucket` carry commander defaults, so their mere
|
|
115
|
+
* PRESENCE proves nothing — the question is whether the user typed them, which
|
|
116
|
+
* only `wasTyped` (backed by commander's `getOptionValueSource`) can answer.
|
|
117
|
+
* Reading presence alone would classify `agents artifacts setup --bundle
|
|
118
|
+
* cloudflare-work` as a wizard run and then silently provision against the
|
|
119
|
+
* DEFAULT bundle, i.e. someone else's Cloudflare account. The other four flags
|
|
120
|
+
* have no default, so presence is proof for them.
|
|
121
|
+
*/
|
|
122
|
+
export function isDirectProvisionRequest(opts, wasTyped = () => false) {
|
|
123
|
+
if (opts.account || opts.token || opts.domain || opts.analyticsToken)
|
|
124
|
+
return true;
|
|
125
|
+
return PROVISION_FLAGS.some((flag) => wasTyped(flag));
|
|
126
|
+
}
|
|
127
|
+
/** Register `agents artifacts setup` under the parent `artifacts` command. */
|
|
128
|
+
export function registerArtifactsSetupCommand(artifactsCmd) {
|
|
129
|
+
artifactsCmd
|
|
130
|
+
.command('setup')
|
|
131
|
+
.description('Provision (or join) the Cloudflare R2 + Worker endpoint that backs `agents artifacts share`.')
|
|
132
|
+
.option('--bundle <name>', 'secrets bundle holding the Cloudflare API token', DEFAULT_CF_BUNDLE)
|
|
133
|
+
.option('--worker <name>', 'Worker name', DEFAULT_WORKER_NAME)
|
|
134
|
+
.option('--bucket <name>', 'R2 bucket name', DEFAULT_BUCKET_NAME)
|
|
135
|
+
.option('--account <id>', 'Cloudflare account id (else read from the bundle / prompt)')
|
|
136
|
+
.option('--token <t>', 'Cloudflare API token (else read from the --bundle)')
|
|
137
|
+
.option('--domain <host>', `custom domain to map (default: ${DEFAULT_SHARE_DOMAIN}; workers.dev if zone is not visible)`)
|
|
138
|
+
.option('--analytics-token <token>', 'Cloudflare Web Analytics token to inject into published HTML pages')
|
|
139
|
+
.action(async (opts, cmd) => {
|
|
140
|
+
try {
|
|
141
|
+
// Named endpoint details, or no terminal to prompt on, means provision
|
|
142
|
+
// directly — the wizard has nothing to ask that was not already given,
|
|
143
|
+
// and it would provision against its own hardcoded defaults, dropping
|
|
144
|
+
// whatever the caller named.
|
|
145
|
+
const wasTyped = (flag) => cmd.getOptionValueSource(flag) === 'cli';
|
|
146
|
+
if (isDirectProvisionRequest(opts, wasTyped) || !isInteractiveTerminal()) {
|
|
147
|
+
await runShareProvision(opts);
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
await runShareWizard();
|
|
151
|
+
}
|
|
152
|
+
catch (err) {
|
|
153
|
+
if (isPromptCancelled(err)) {
|
|
154
|
+
console.log(chalk.yellow('\nCancelled'));
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
console.error(chalk.red(err.message));
|
|
158
|
+
process.exitCode = 1;
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `agents artifacts` — the group that owns everything an agent publishes for a
|
|
3
|
+
* human to open: HTML plans, reports, rendered visuals, screenshots.
|
|
4
|
+
*
|
|
5
|
+
* RUSH-2580 nested the former top-level `agents share` here. `artifacts` is the
|
|
6
|
+
* noun, `share` is the action on it, so the surface reads noun-then-action like
|
|
7
|
+
* the rest of the CLI:
|
|
8
|
+
*
|
|
9
|
+
* agents artifacts share <file> publish
|
|
10
|
+
* agents artifacts share list|delete|analytics|join|status|update
|
|
11
|
+
* agents artifacts setup provision (or join) the endpoint
|
|
12
|
+
*
|
|
13
|
+
* The subtree itself lives in commands/share.ts (publish + its subcommands) and
|
|
14
|
+
* commands/artifacts-setup.ts (the provisioning door); this module only assembles
|
|
15
|
+
* the group, so there is one place that says what `agents artifacts` contains.
|
|
16
|
+
*/
|
|
17
|
+
import type { Command } from 'commander';
|
|
18
|
+
export declare function registerArtifactsCommands(program: Command): void;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `agents artifacts` — the group that owns everything an agent publishes for a
|
|
3
|
+
* human to open: HTML plans, reports, rendered visuals, screenshots.
|
|
4
|
+
*
|
|
5
|
+
* RUSH-2580 nested the former top-level `agents share` here. `artifacts` is the
|
|
6
|
+
* noun, `share` is the action on it, so the surface reads noun-then-action like
|
|
7
|
+
* the rest of the CLI:
|
|
8
|
+
*
|
|
9
|
+
* agents artifacts share <file> publish
|
|
10
|
+
* agents artifacts share list|delete|analytics|join|status|update
|
|
11
|
+
* agents artifacts setup provision (or join) the endpoint
|
|
12
|
+
*
|
|
13
|
+
* The subtree itself lives in commands/share.ts (publish + its subcommands) and
|
|
14
|
+
* commands/artifacts-setup.ts (the provisioning door); this module only assembles
|
|
15
|
+
* the group, so there is one place that says what `agents artifacts` contains.
|
|
16
|
+
*/
|
|
17
|
+
import { setHelpSections } from '../lib/help.js';
|
|
18
|
+
import { registerShareCommands, registerUnshareCommand } from './share.js';
|
|
19
|
+
import { registerArtifactsSetupCommand } from './artifacts-setup.js';
|
|
20
|
+
export function registerArtifactsCommands(program) {
|
|
21
|
+
const artifactsCmd = program
|
|
22
|
+
.command('artifacts')
|
|
23
|
+
.description('Publish agent-made artifacts (plans, reports, visuals) to your own Cloudflare R2 and get a shareable link (~$0).');
|
|
24
|
+
registerArtifactsSetupCommand(artifactsCmd);
|
|
25
|
+
registerShareCommands(artifactsCmd);
|
|
26
|
+
setHelpSections(artifactsCmd, {
|
|
27
|
+
examples: `
|
|
28
|
+
# One-time: provision your own endpoint (or join a teammate's)
|
|
29
|
+
agents artifacts setup
|
|
30
|
+
agents artifacts share join https://share.agents-cli.sh
|
|
31
|
+
|
|
32
|
+
# Publish — auto OG cover, default 30d expiry, shareable link
|
|
33
|
+
agents artifacts share ./out/plan.html
|
|
34
|
+
|
|
35
|
+
# What's live in your namespace, and taking one down
|
|
36
|
+
agents artifacts share list
|
|
37
|
+
agents unshare my-plan-a1b2
|
|
38
|
+
|
|
39
|
+
# Endpoint health, and pushing a new Worker template to it
|
|
40
|
+
agents artifacts share status
|
|
41
|
+
agents artifacts share update
|
|
42
|
+
`,
|
|
43
|
+
notes: `
|
|
44
|
+
agents artifacts share is the publish action; agents artifacts setup is the
|
|
45
|
+
one-time endpoint provisioning. It runs the interactive wizard only when you
|
|
46
|
+
type NO endpoint flag on a TTY; type any of --bundle/--worker/--bucket/
|
|
47
|
+
--account/--token/--domain/--analytics-token, or run non-interactively, and it
|
|
48
|
+
provisions directly with what you named.
|
|
49
|
+
|
|
50
|
+
agents unshare <targets...> stays a top-level alias of
|
|
51
|
+
agents artifacts share delete.
|
|
52
|
+
|
|
53
|
+
Full reference: apps/cli/docs/share.md.
|
|
54
|
+
`,
|
|
55
|
+
});
|
|
56
|
+
// Top-level, deliberately: see registerUnshareCommand in commands/share.ts.
|
|
57
|
+
registerUnshareCommand(program);
|
|
58
|
+
}
|
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;
|