@phnx-labs/agents-cli 1.22.34 → 1.22.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +672 -2
- package/README.md +82 -35
- package/dist/bin/agents +0 -0
- package/dist/bootstrap.d.ts +15 -0
- package/dist/bootstrap.js +1211 -0
- package/dist/commands/accounts.d.ts +4 -11
- package/dist/commands/accounts.js +159 -27
- package/dist/commands/attach.js +17 -4
- package/dist/commands/audit.d.ts +8 -8
- package/dist/commands/audit.js +57 -47
- package/dist/commands/browser.js +15 -11
- package/dist/commands/cloud.js +1 -1
- package/dist/commands/commands.js +0 -11
- package/dist/commands/computer-actions.js +33 -0
- package/dist/commands/computer-sessions-picker.d.ts +21 -0
- package/dist/commands/computer-sessions-picker.js +141 -0
- package/dist/commands/computer.d.ts +16 -0
- package/dist/commands/computer.js +37 -0
- package/dist/commands/config.d.ts +17 -0
- package/dist/commands/config.js +401 -0
- package/dist/commands/cp.d.ts +84 -0
- package/dist/commands/cp.js +231 -0
- package/dist/commands/daemon.js +243 -14
- package/dist/commands/detach-core.d.ts +1 -1
- package/dist/commands/detach-core.js +12 -2
- package/dist/commands/detach.js +1 -1
- package/dist/commands/doctor.js +64 -5
- package/dist/commands/events.d.ts +24 -12
- package/dist/commands/events.js +144 -28
- package/dist/commands/exec.js +85 -41
- package/dist/commands/feed.d.ts +1 -1
- package/dist/commands/feed.js +16 -8
- package/dist/commands/focus.d.ts +33 -1
- package/dist/commands/focus.js +177 -17
- package/dist/commands/funnel.d.ts +1 -1
- package/dist/commands/go.js +9 -8
- package/dist/commands/harness-wizard.d.ts +1 -0
- package/dist/commands/harness-wizard.js +18 -20
- package/dist/commands/harness.d.ts +2 -0
- package/dist/commands/harness.js +59 -26
- package/dist/commands/hooks.js +0 -11
- package/dist/commands/inspect.d.ts +94 -1
- package/dist/commands/inspect.js +866 -40
- package/dist/commands/lease.d.ts +4 -4
- package/dist/commands/lease.js +6 -6
- package/dist/commands/login.js +0 -13
- package/dist/commands/logs.d.ts +2 -2
- package/dist/commands/logs.js +2 -2
- package/dist/commands/mcp.js +7 -2
- package/dist/commands/memory.js +7 -2
- package/dist/commands/message.d.ts +1 -1
- package/dist/commands/message.js +37 -6
- package/dist/commands/models.js +4 -0
- package/dist/commands/monitors.d.ts +0 -1
- package/dist/commands/monitors.js +199 -16
- package/dist/commands/open.d.ts +18 -0
- package/dist/commands/open.js +57 -0
- package/dist/commands/packages.js +2 -107
- package/dist/commands/plugins.js +6 -3
- package/dist/commands/profiles.d.ts +1 -0
- package/dist/commands/profiles.js +16 -160
- package/dist/commands/projects.d.ts +28 -0
- package/dist/commands/projects.js +125 -5
- package/dist/commands/reconnect.js +9 -3
- package/dist/commands/repo.js +42 -1
- package/dist/commands/resource-view.d.ts +17 -0
- package/dist/commands/resource-view.js +36 -14
- package/dist/commands/resume.js +9 -2
- package/dist/commands/routines.d.ts +0 -2
- package/dist/commands/routines.js +473 -289
- package/dist/commands/secrets.js +52 -9
- package/dist/commands/sessions-export.d.ts +47 -0
- package/dist/commands/sessions-export.js +116 -6
- package/dist/commands/sessions-import.d.ts +17 -0
- package/dist/commands/sessions-import.js +114 -6
- package/dist/commands/sessions-migrate.d.ts +27 -0
- package/dist/commands/sessions-migrate.js +50 -9
- package/dist/commands/sessions-picker.js +23 -4
- package/dist/commands/sessions-resume.d.ts +5 -3
- package/dist/commands/sessions-resume.js +30 -8
- package/dist/commands/sessions-watch.d.ts +2 -0
- package/dist/commands/sessions-watch.js +53 -0
- package/dist/commands/sessions.d.ts +66 -3
- package/dist/commands/sessions.js +298 -47
- package/dist/commands/set.d.ts +1 -1
- package/dist/commands/set.js +2 -2
- package/dist/commands/setup-browser.js +2 -2
- package/dist/commands/setup-mine.js +0 -1
- package/dist/commands/setup-preferences.js +1 -1
- package/dist/commands/setup-share.js +34 -4
- package/dist/commands/setup.d.ts +5 -0
- package/dist/commands/setup.js +26 -0
- package/dist/commands/share.d.ts +85 -0
- package/dist/commands/share.js +379 -8
- package/dist/commands/skills.js +0 -11
- package/dist/commands/snapshot.js +1 -1
- package/dist/commands/ssh.d.ts +18 -0
- package/dist/commands/ssh.js +549 -210
- package/dist/commands/sync.d.ts +5 -0
- package/dist/commands/sync.js +212 -32
- package/dist/commands/teams.d.ts +13 -0
- package/dist/commands/teams.js +187 -30
- package/dist/commands/tickets.d.ts +2 -0
- package/dist/commands/tickets.js +43 -0
- package/dist/commands/update.js +2 -4
- package/dist/commands/usage.js +5 -3
- package/dist/commands/versions.js +11 -5
- package/dist/commands/view.js +15 -7
- package/dist/commands/webhook.d.ts +2 -2
- package/dist/commands/webhook.js +7 -7
- package/dist/index.d.ts +18 -2
- package/dist/index.js +53 -1264
- package/dist/lib/account-catalog.d.ts +18 -0
- package/dist/lib/account-catalog.js +38 -0
- package/dist/lib/account-provider-registry.d.ts +18 -0
- package/dist/lib/account-provider-registry.js +59 -0
- package/dist/lib/account-registry.d.ts +40 -0
- package/dist/lib/account-registry.js +239 -0
- package/dist/lib/account-schema.d.ts +44 -0
- package/dist/lib/account-schema.js +91 -0
- package/dist/lib/account-state-service.d.ts +21 -0
- package/dist/lib/account-state-service.js +60 -0
- package/dist/lib/activity.d.ts +1 -1
- package/dist/lib/activity.js +8 -1
- package/dist/lib/add-dir.d.ts +80 -0
- package/dist/lib/add-dir.js +241 -0
- package/dist/lib/agent-cli-commands.d.ts +11 -0
- package/dist/lib/agent-cli-commands.js +30 -0
- package/dist/lib/agents.js +44 -36
- package/dist/lib/answer-router.js +1 -1
- package/dist/lib/audit/log.d.ts +10 -27
- package/dist/lib/audit/log.js +20 -33
- package/dist/lib/auth-health.d.ts +9 -2
- package/dist/lib/auth-health.js +42 -9
- package/dist/lib/auto-pull-worker.js +7 -3
- package/dist/lib/auto-pull.d.ts +44 -3
- package/dist/lib/auto-pull.js +88 -5
- package/dist/lib/binary-shadow.d.ts +28 -0
- package/dist/lib/binary-shadow.js +121 -0
- package/dist/lib/brand.js +9 -3
- package/dist/lib/browser/ipc.d.ts +30 -0
- package/dist/lib/browser/ipc.js +81 -4
- package/dist/lib/browser/profiles.d.ts +3 -2
- package/dist/lib/browser/profiles.js +65 -22
- package/dist/lib/browser/service.d.ts +4 -0
- package/dist/lib/browser/service.js +30 -3
- package/dist/lib/browser/sessions-list.d.ts +22 -2
- package/dist/lib/browser/sessions-list.js +54 -6
- package/dist/lib/browser/stream.d.ts +2 -0
- package/dist/lib/browser/stream.js +1 -0
- package/dist/lib/browser/types.d.ts +19 -0
- package/dist/lib/byok-usage.d.ts +9 -2
- package/dist/lib/byok-usage.js +133 -31
- package/dist/lib/cli-entry.d.ts +11 -0
- package/dist/lib/cli-entry.js +46 -0
- package/dist/lib/cloud/host.d.ts +1 -1
- package/dist/lib/cloud/host.js +2 -2
- package/dist/lib/cloud/registry.js +1 -1
- package/dist/lib/cloud/types.d.ts +1 -1
- package/dist/lib/codex-policy.d.ts +9 -1
- package/dist/lib/codex-policy.js +17 -2
- package/dist/lib/commands.d.ts +2 -0
- package/dist/lib/commands.js +2 -0
- package/dist/lib/computer/sessions-list.d.ts +150 -0
- package/dist/lib/computer/sessions-list.js +363 -0
- package/dist/lib/config-keys.d.ts +86 -0
- package/dist/lib/config-keys.js +193 -0
- package/dist/lib/config-machine-keys.d.ts +12 -0
- package/dist/lib/config-machine-keys.js +17 -0
- package/dist/lib/config-transfer.js +3 -4
- package/dist/lib/crabbox/cli.d.ts +2 -2
- package/dist/lib/crabbox/cli.js +3 -3
- package/dist/lib/daemon-health.d.ts +22 -0
- package/dist/lib/daemon-health.js +33 -3
- package/dist/lib/daemon-services.d.ts +50 -0
- package/dist/lib/daemon-services.js +147 -0
- package/dist/lib/daemon-ticks.d.ts +35 -66
- package/dist/lib/daemon-ticks.js +77 -159
- package/dist/lib/daemon.d.ts +72 -4
- package/dist/lib/daemon.js +792 -202
- package/dist/lib/deeplink/register.d.ts +49 -0
- package/dist/lib/deeplink/register.js +253 -0
- package/dist/lib/deeplink/url.d.ts +34 -0
- package/dist/lib/deeplink/url.js +78 -0
- package/dist/lib/device-config.d.ts +124 -29
- package/dist/lib/device-config.js +346 -141
- package/dist/lib/devices/config-migration.d.ts +42 -0
- package/dist/lib/devices/config-migration.js +203 -0
- package/dist/lib/devices/connect.js +14 -7
- package/dist/lib/devices/doctor-findings.d.ts +4 -1
- package/dist/lib/devices/doctor-findings.js +20 -1
- package/dist/lib/devices/harness-inventory.d.ts +11 -2
- package/dist/lib/devices/harness-inventory.js +0 -0
- package/dist/lib/devices/health.d.ts +1 -1
- package/dist/lib/devices/health.js +1 -1
- package/dist/lib/devices/pending.d.ts +22 -1
- package/dist/lib/devices/pending.js +67 -2
- package/dist/lib/devices/registry.d.ts +0 -25
- package/dist/lib/devices/registry.js +2 -83
- package/dist/lib/devices/resolve-profile.d.ts +20 -0
- package/dist/lib/devices/resolve-profile.js +44 -0
- package/dist/lib/devices/rollout-verify.d.ts +101 -0
- package/dist/lib/devices/rollout-verify.js +193 -0
- package/dist/lib/devices/ssh-config.js +10 -6
- package/dist/lib/event-families.d.ts +28 -0
- package/dist/lib/event-families.js +159 -0
- package/dist/lib/event-stream.d.ts +9 -1
- package/dist/lib/event-stream.js +26 -9
- package/dist/lib/events.d.ts +9 -1
- package/dist/lib/events.js +21 -6
- package/dist/lib/exec.d.ts +30 -0
- package/dist/lib/exec.js +220 -122
- package/dist/lib/feed-broadcast.d.ts +25 -0
- package/dist/lib/feed-broadcast.js +33 -0
- package/dist/lib/feed.d.ts +1 -1
- package/dist/lib/feed.js +12 -2
- package/dist/lib/fleet/capture.js +15 -0
- package/dist/lib/fleet/manifest.js +9 -0
- package/dist/lib/fleet/types.d.ts +9 -0
- package/dist/lib/fleet-status.js +10 -8
- package/dist/lib/git.d.ts +20 -6
- package/dist/lib/git.js +121 -17
- package/dist/lib/hosts/dispatch.d.ts +8 -3
- package/dist/lib/hosts/dispatch.js +29 -3
- package/dist/lib/hosts/logs.d.ts +2 -2
- package/dist/lib/hosts/logs.js +2 -2
- package/dist/lib/hosts/option.js +1 -1
- package/dist/lib/hosts/passthrough.d.ts +2 -3
- package/dist/lib/hosts/passthrough.js +10 -24
- package/dist/lib/hosts/progress.js +2 -2
- package/dist/lib/hosts/providers/devices.d.ts +3 -3
- package/dist/lib/hosts/providers/devices.js +18 -12
- package/dist/lib/hosts/ready.d.ts +5 -1
- package/dist/lib/hosts/ready.js +9 -3
- package/dist/lib/hosts/reconcile.d.ts +2 -2
- package/dist/lib/hosts/reconcile.js +2 -2
- package/dist/lib/hosts/registry.js +14 -9
- package/dist/lib/hosts/remote-cmd.js +1 -1
- package/dist/lib/hosts/remote-os.d.ts +9 -6
- package/dist/lib/hosts/remote-os.js +13 -6
- package/dist/lib/hosts/routing-flag.d.ts +23 -0
- package/dist/lib/hosts/routing-flag.js +41 -0
- package/dist/lib/hosts/run-target.js +1 -1
- package/dist/lib/hosts/session-index.js +1 -1
- package/dist/lib/hosts/tasks.d.ts +6 -6
- package/dist/lib/hosts/tasks.js +4 -4
- package/dist/lib/hosts/types.js +1 -2
- package/dist/lib/installations/resolve.js +2 -8
- package/dist/lib/isolation-boundary-report.js +0 -1
- package/dist/lib/linear-cache.d.ts +7 -0
- package/dist/lib/linear-cache.js +31 -4
- package/dist/lib/linear-project-counts.d.ts +1 -1
- package/dist/lib/linear-project-counts.js +2 -3
- package/dist/lib/linear-projects.js +1 -1
- package/dist/lib/loop.d.ts +2 -2
- package/dist/lib/loop.js +1 -1
- package/dist/lib/mailbox-target.d.ts +1 -1
- package/dist/lib/mailbox-target.js +1 -1
- package/dist/lib/manifest.js +7 -4
- package/dist/lib/menubar/MenubarHelper.app/Contents/CodeResources +0 -0
- package/dist/lib/menubar/MenubarHelper.app/Contents/MacOS/MenubarHelper +0 -0
- package/dist/lib/menubar/snapshot.d.ts +3 -2
- package/dist/lib/menubar/snapshot.js +6 -2
- package/dist/lib/migrate-fold.d.ts +33 -0
- package/dist/lib/migrate-fold.js +130 -0
- package/dist/lib/migrate.d.ts +34 -34
- package/dist/lib/migrate.js +106 -128
- package/dist/lib/model-tier-overrides.d.ts +1 -1
- package/dist/lib/model-tier-overrides.js +15 -2
- package/dist/lib/monitors/config.d.ts +17 -3
- package/dist/lib/monitors/config.js +52 -18
- package/dist/lib/monitors/engine.d.ts +32 -1
- package/dist/lib/monitors/engine.js +94 -11
- package/dist/lib/monitors/fingerprint.d.ts +46 -0
- package/dist/lib/monitors/fingerprint.js +100 -0
- package/dist/lib/monitors/remote.d.ts +47 -0
- package/dist/lib/monitors/remote.js +81 -0
- package/dist/lib/monitors/state.d.ts +39 -0
- package/dist/lib/monitors/state.js +56 -0
- package/dist/lib/onepassword.d.ts +17 -0
- package/dist/lib/onepassword.js +52 -22
- package/dist/lib/open-url.js +1 -1
- package/dist/lib/picker.d.ts +14 -2
- package/dist/lib/picker.js +35 -13
- package/dist/lib/placement.d.ts +1 -1
- package/dist/lib/placement.js +1 -1
- package/dist/lib/pr-land-detach.d.ts +32 -0
- package/dist/lib/pr-land-detach.js +79 -0
- package/dist/lib/profiles-presets.js +13 -0
- package/dist/lib/profiles.d.ts +2 -0
- package/dist/lib/profiles.js +44 -1
- package/dist/lib/project-focus.d.ts +1 -1
- package/dist/lib/project-focus.js +1 -1
- package/dist/lib/project-key.d.ts +17 -0
- package/dist/lib/project-key.js +26 -0
- package/dist/lib/project-probe.d.ts +4 -1
- package/dist/lib/project-probe.js +5 -4
- package/dist/lib/project-resources.js +2 -18
- package/dist/lib/project-root.d.ts +16 -0
- package/dist/lib/project-root.js +20 -2
- package/dist/lib/projects.d.ts +20 -1
- package/dist/lib/projects.js +78 -1
- package/dist/lib/refresh-coordinator.d.ts +24 -0
- package/dist/lib/refresh-coordinator.js +52 -0
- package/dist/lib/registry.d.ts +2 -2
- package/dist/lib/registry.js +1 -1
- package/dist/lib/resource-aliases.d.ts +13 -0
- package/dist/lib/resource-aliases.js +26 -0
- package/dist/lib/resources/types.d.ts +1 -1
- package/dist/lib/resources.d.ts +16 -0
- package/dist/lib/resources.js +66 -10
- package/dist/lib/rotate.d.ts +3 -4
- package/dist/lib/rotate.js +4 -5
- package/dist/lib/routine-activation.d.ts +22 -2
- package/dist/lib/routine-activation.js +63 -16
- package/dist/lib/routine-context.d.ts +9 -2
- package/dist/lib/routine-context.js +21 -6
- package/dist/lib/routines-project.d.ts +58 -48
- package/dist/lib/routines-project.js +190 -159
- package/dist/lib/routines.d.ts +41 -6
- package/dist/lib/routines.js +92 -34
- package/dist/lib/run-defaults.d.ts +5 -0
- package/dist/lib/run-defaults.js +11 -1
- package/dist/lib/runner.d.ts +10 -8
- package/dist/lib/runner.js +122 -39
- package/dist/lib/secrets/Agents CLI.app/Contents/CodeResources +0 -0
- package/dist/lib/secrets/Agents CLI.app/Contents/MacOS/Agents CLI +0 -0
- package/dist/lib/secrets/agent.d.ts +10 -3
- package/dist/lib/secrets/agent.js +43 -8
- package/dist/lib/secrets/bundles.d.ts +1 -0
- package/dist/lib/secrets/bundles.js +92 -80
- package/dist/lib/secrets/index.js +32 -9
- package/dist/lib/secrets/install-helper.d.ts +4 -4
- package/dist/lib/secrets/install-helper.js +4 -4
- package/dist/lib/secrets/push.d.ts +40 -6
- package/dist/lib/secrets/push.js +58 -11
- package/dist/lib/secrets/read-backoff.d.ts +1 -1
- package/dist/lib/secrets/read-backoff.js +1 -1
- package/dist/lib/secrets/remote.d.ts +24 -0
- package/dist/lib/secrets/remote.js +54 -4
- package/dist/lib/self-update.d.ts +108 -0
- package/dist/lib/self-update.js +276 -1
- package/dist/lib/session/active.d.ts +89 -5
- package/dist/lib/session/active.js +165 -10
- package/dist/lib/session/actor-sidecar.d.ts +1 -1
- package/dist/lib/session/actor-sidecar.js +2 -1
- package/dist/lib/session/db.d.ts +176 -2
- package/dist/lib/session/db.js +484 -17
- package/dist/lib/session/discover.js +27 -4
- package/dist/lib/session/hook-sessions.js +2 -2
- package/dist/lib/session/host-link.d.ts +2 -2
- package/dist/lib/session/host-link.js +2 -2
- package/dist/lib/session/pid-registry.d.ts +21 -0
- package/dist/lib/session/pid-registry.js +57 -0
- package/dist/lib/session/remote-active.js +15 -1
- package/dist/lib/session/remote.js +2 -2
- package/dist/lib/session/session-cache.d.ts +14 -7
- package/dist/lib/session/session-cache.js +51 -9
- package/dist/lib/session/state.d.ts +2 -2
- package/dist/lib/session/state.js +1 -1
- package/dist/lib/session/sync/config.d.ts +10 -10
- package/dist/lib/session/sync/config.js +10 -10
- package/dist/lib/session/sync/r2.d.ts +34 -0
- package/dist/lib/session/sync/r2.js +123 -0
- package/dist/lib/session/throughput.d.ts +1 -1
- package/dist/lib/session/throughput.js +1 -1
- package/dist/lib/session/types.d.ts +23 -1
- package/dist/lib/session/types.js +15 -0
- package/dist/lib/session/viewing-in.d.ts +1 -1
- package/dist/lib/session/viewing-in.js +1 -1
- package/dist/lib/session/watch.d.ts +101 -0
- package/dist/lib/session/watch.js +242 -0
- package/dist/lib/share/config.d.ts +4 -0
- package/dist/lib/share/config.js +1 -0
- package/dist/lib/share/delete.d.ts +93 -0
- package/dist/lib/share/delete.js +127 -0
- package/dist/lib/share/provision.d.ts +38 -0
- package/dist/lib/share/provision.js +50 -0
- package/dist/lib/share/publish.d.ts +40 -1
- package/dist/lib/share/publish.js +116 -3
- package/dist/lib/share/worker-template.js +71 -6
- package/dist/lib/shims.d.ts +17 -3
- package/dist/lib/shims.js +136 -27
- package/dist/lib/signin-badge.js +3 -2
- package/dist/lib/skills.js +2 -0
- package/dist/lib/smart-launch.d.ts +8 -8
- package/dist/lib/smart-launch.js +80 -59
- package/dist/lib/ssh-exec.d.ts +1 -1
- package/dist/lib/ssh-exec.js +1 -1
- package/dist/lib/staleness/prune.d.ts +88 -0
- package/dist/lib/staleness/prune.js +69 -0
- package/dist/lib/staleness/registry.d.ts +1 -1
- package/dist/lib/staleness/writers/commands.js +34 -2
- package/dist/lib/staleness/writers/hooks.js +16 -0
- package/dist/lib/staleness/writers/kinds.d.ts +6 -0
- package/dist/lib/staleness/writers/skills.js +19 -0
- package/dist/lib/staleness/writers/subagents.d.ts +2 -3
- package/dist/lib/staleness/writers/subagents.js +0 -4
- package/dist/lib/staleness/writers/types.d.ts +32 -0
- package/dist/lib/startup/command-registry.d.ts +6 -12
- package/dist/lib/startup/command-registry.js +14 -31
- package/dist/lib/startup/dev-build.d.ts +10 -0
- package/dist/lib/startup/dev-build.js +13 -1
- package/dist/lib/startup/spellcheck.d.ts +18 -0
- package/dist/lib/startup/spellcheck.js +45 -0
- package/dist/lib/state.d.ts +36 -9
- package/dist/lib/state.js +96 -46
- package/dist/lib/subagents-registry.d.ts +0 -7
- package/dist/lib/subagents-registry.js +38 -65
- package/dist/lib/subagents.d.ts +0 -33
- package/dist/lib/subagents.js +0 -75
- package/dist/lib/sync-umbrella.js +1 -1
- package/dist/lib/teams/agents.d.ts +41 -1
- package/dist/lib/teams/agents.js +187 -9
- package/dist/lib/teams/api.d.ts +11 -1
- package/dist/lib/teams/api.js +11 -2
- package/dist/lib/teams/delivery.d.ts +41 -0
- package/dist/lib/teams/delivery.js +60 -0
- package/dist/lib/teams/registry.d.ts +14 -0
- package/dist/lib/teams/registry.js +51 -1
- package/dist/lib/teams/remoteWorktree.d.ts +19 -0
- package/dist/lib/teams/remoteWorktree.js +29 -0
- package/dist/lib/teams/scheduler.d.ts +1 -1
- package/dist/lib/teams/scheduler.js +1 -1
- package/dist/lib/teams/worktree.d.ts +24 -0
- package/dist/lib/teams/worktree.js +42 -0
- package/dist/lib/terminal/backends/vscodium-agent.d.ts +10 -1
- package/dist/lib/terminal/backends/vscodium-agent.js +16 -5
- package/dist/lib/terminal/engine.d.ts +4 -0
- package/dist/lib/terminal/engine.js +8 -2
- package/dist/lib/terminal/types.d.ts +21 -2
- package/dist/lib/testdata/refresh-coordinator-worker.d.ts +1 -0
- package/dist/lib/testdata/refresh-coordinator-worker.js +23 -0
- package/dist/lib/tickets/list.d.ts +53 -0
- package/dist/lib/tickets/list.js +153 -0
- package/dist/lib/tmux/orphan-reap.d.ts +320 -0
- package/dist/lib/tmux/orphan-reap.js +644 -0
- package/dist/lib/tmux/session.d.ts +68 -3
- package/dist/lib/tmux/session.js +95 -5
- package/dist/lib/triggers/handlers.d.ts +20 -0
- package/dist/lib/triggers/handlers.js +6 -1
- package/dist/lib/types.d.ts +46 -34
- package/dist/lib/usage-fleet.d.ts +32 -0
- package/dist/lib/usage-fleet.js +125 -0
- package/dist/lib/usage-refresh.d.ts +3 -3
- package/dist/lib/usage-refresh.js +19 -16
- package/dist/lib/usage.d.ts +51 -47
- package/dist/lib/usage.js +145 -153
- package/dist/lib/version-duplicates.js +2 -2
- package/dist/lib/versions.d.ts +56 -13
- package/dist/lib/versions.js +195 -45
- package/dist/lib/watchdog/log.d.ts +1 -1
- package/dist/lib/watchdog/log.js +3 -3
- package/dist/lib/watchdog/rotate.d.ts +6 -6
- package/dist/lib/watchdog/rotate.js +6 -6
- package/dist/lib/workflows.d.ts +1 -1
- package/dist/lib/yaml-io.d.ts +47 -0
- package/dist/lib/yaml-io.js +55 -0
- package/package.json +2 -1
- package/scripts/install-helper.js +2 -2
- package/scripts/postinstall.js +23 -20
- package/dist/commands/defaults.d.ts +0 -7
- package/dist/commands/defaults.js +0 -107
- package/dist/commands/export.d.ts +0 -11
- package/dist/commands/export.js +0 -215
- package/dist/commands/helper.d.ts +0 -12
- package/dist/commands/helper.js +0 -87
- package/dist/commands/hosts.d.ts +0 -11
- package/dist/commands/hosts.js +0 -330
- package/dist/commands/lock.d.ts +0 -12
- package/dist/commands/lock.js +0 -70
- package/dist/commands/pull.d.ts +0 -17
- package/dist/commands/pull.js +0 -39
- package/dist/commands/push.d.ts +0 -14
- package/dist/commands/push.js +0 -30
- package/dist/commands/wallet.d.ts +0 -20
- package/dist/commands/wallet.js +0 -216
- package/dist/commands/worktree.d.ts +0 -19
- package/dist/commands/worktree.js +0 -272
- package/dist/lib/account-labels.d.ts +0 -24
- package/dist/lib/account-labels.js +0 -72
- package/dist/lib/auto-dispatch-linear.d.ts +0 -18
- package/dist/lib/auto-dispatch-linear.js +0 -107
- package/dist/lib/auto-dispatch-provider.d.ts +0 -10
- package/dist/lib/auto-dispatch-provider.js +0 -30
- package/dist/lib/auto-dispatch.d.ts +0 -93
- package/dist/lib/auto-dispatch.js +0 -128
- package/dist/lib/export.d.ts +0 -72
- package/dist/lib/export.js +0 -269
- package/dist/lib/lock.d.ts +0 -93
- package/dist/lib/lock.js +0 -207
- package/dist/lib/wallet/index.d.ts +0 -78
- package/dist/lib/wallet/index.js +0 -253
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `agents cp <src> <dst>` — first-class fleet file transfer.
|
|
3
|
+
*
|
|
4
|
+
* Accepts `host:path` on either side (local = bare absolute path). Resolves
|
|
5
|
+
* `~` and `$HOME` remote paths ON the remote before transfer so a `$HOME` in
|
|
6
|
+
* the remote spec can never silently expand to the local user's home directory
|
|
7
|
+
* — the documented silent-failure class in `remote-dispatch-mutation-safety`.
|
|
8
|
+
*
|
|
9
|
+
* Reuses the same SSH fabric (SSH_OPTS, deviceIdentityArgs, resolveDeviceTarget)
|
|
10
|
+
* that `agents ssh` and `--host` dispatch use.
|
|
11
|
+
*/
|
|
12
|
+
import type { Command } from 'commander';
|
|
13
|
+
/**
|
|
14
|
+
* A remote endpoint — host (device name or user@device) and a path on that
|
|
15
|
+
* host. The path may begin with `~` or `$HOME`; {@link resolveRemotePath}
|
|
16
|
+
* expands those on the remote before transfer.
|
|
17
|
+
*/
|
|
18
|
+
export interface RemoteEndpoint {
|
|
19
|
+
isRemote: true;
|
|
20
|
+
/** Device name, user@device, or ad-hoc host literal. */
|
|
21
|
+
host: string;
|
|
22
|
+
/** Path as given by the caller — may contain `~` or `$HOME`. */
|
|
23
|
+
path: string;
|
|
24
|
+
}
|
|
25
|
+
/** A local endpoint — an absolute local path. */
|
|
26
|
+
export interface LocalEndpoint {
|
|
27
|
+
isRemote: false;
|
|
28
|
+
/** Absolute local path. */
|
|
29
|
+
path: string;
|
|
30
|
+
}
|
|
31
|
+
export type Endpoint = RemoteEndpoint | LocalEndpoint;
|
|
32
|
+
/**
|
|
33
|
+
* Parse one CLI token into an {@link Endpoint}.
|
|
34
|
+
*
|
|
35
|
+
* Grammar: `host:path` is remote; anything else is local. The host part must
|
|
36
|
+
* not contain a `/` (that would be a local absolute path with a colon in it —
|
|
37
|
+
* unusual but valid; the colon test covers the common fleet pattern and rejects
|
|
38
|
+
* the almost-never-seen edge case in favour of local-path semantics).
|
|
39
|
+
*
|
|
40
|
+
* Windows drive letters (`C:path`) are excluded by requiring the host part to
|
|
41
|
+
* be at least two characters and not a single capital letter.
|
|
42
|
+
*/
|
|
43
|
+
export declare function parseEndpoint(token: string): Endpoint;
|
|
44
|
+
/**
|
|
45
|
+
* Resolve the remote HOME directory in one SSH round-trip. Returns the
|
|
46
|
+
* absolute path (always starts with `/`), or throws on failure.
|
|
47
|
+
*/
|
|
48
|
+
export declare function resolveRemoteHome(target: string, extraSshArgs: string[]): Promise<string>;
|
|
49
|
+
/**
|
|
50
|
+
* Pure home-prefix expansion. Given a remote HOME (already resolved on the
|
|
51
|
+
* remote) and a raw path token, substitute a leading `~` or `$HOME`. Paths
|
|
52
|
+
* without those prefixes are returned unchanged. Never consults
|
|
53
|
+
* `process.env.HOME` — the local home must not leak into a remote path.
|
|
54
|
+
*/
|
|
55
|
+
export declare function expandRemoteHomePrefix(rawPath: string, remoteHome: string): string;
|
|
56
|
+
/**
|
|
57
|
+
* Expand a remote path's leading `~` or literal `$HOME` to an absolute path
|
|
58
|
+
* resolved **on the remote**, not locally. A path that already starts with `/`
|
|
59
|
+
* is returned unchanged (no round-trip).
|
|
60
|
+
*
|
|
61
|
+
* This is the safeguard against the silent-failure class: a `$HOME` or `~`
|
|
62
|
+
* that would expand to the **local** user's home if left in a shell command.
|
|
63
|
+
*/
|
|
64
|
+
export declare function resolveRemotePath(rawPath: string, target: string, extraSshArgs: string[]): Promise<string>;
|
|
65
|
+
/**
|
|
66
|
+
* Build the argv for the `scp` invocation. Pure — no spawning — so it is
|
|
67
|
+
* unit-testable.
|
|
68
|
+
*
|
|
69
|
+
* `scp` accepts ssh `-o` options, so `SSH_OPTS` flows through unchanged.
|
|
70
|
+
* Identity args (`-i key -o IdentitiesOnly=yes`) are included only when a
|
|
71
|
+
* single remote device is involved; for two-remote transfers the identity
|
|
72
|
+
* applies to both connections, which works when the fleet uses a shared key.
|
|
73
|
+
*
|
|
74
|
+
* Remote endpoints are formatted as `user@host:path` (or bare `host:path`),
|
|
75
|
+
* local endpoints as their absolute path. Paths have already been resolved
|
|
76
|
+
* (no `~` or `$HOME`) by the time this is called.
|
|
77
|
+
*/
|
|
78
|
+
export declare function buildScpArgv({ srcSpec, dstSpec, identityArgs, recursive, }: {
|
|
79
|
+
srcSpec: string;
|
|
80
|
+
dstSpec: string;
|
|
81
|
+
identityArgs: string[];
|
|
82
|
+
recursive: boolean;
|
|
83
|
+
}): string[];
|
|
84
|
+
export declare function registerCpCommand(program: Command): void;
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `agents cp <src> <dst>` — first-class fleet file transfer.
|
|
3
|
+
*
|
|
4
|
+
* Accepts `host:path` on either side (local = bare absolute path). Resolves
|
|
5
|
+
* `~` and `$HOME` remote paths ON the remote before transfer so a `$HOME` in
|
|
6
|
+
* the remote spec can never silently expand to the local user's home directory
|
|
7
|
+
* — the documented silent-failure class in `remote-dispatch-mutation-safety`.
|
|
8
|
+
*
|
|
9
|
+
* Reuses the same SSH fabric (SSH_OPTS, deviceIdentityArgs, resolveDeviceTarget)
|
|
10
|
+
* that `agents ssh` and `--host` dispatch use.
|
|
11
|
+
*/
|
|
12
|
+
import { spawnSync } from 'child_process';
|
|
13
|
+
import chalk from 'chalk';
|
|
14
|
+
import { setHelpSections } from '../lib/help.js';
|
|
15
|
+
import { resolveDeviceTarget } from '../lib/devices/resolve-target.js';
|
|
16
|
+
import { sshTargetFor, deviceIdentityArgs } from '../lib/devices/connect.js';
|
|
17
|
+
import { sshExec, SSH_OPTS } from '../lib/ssh-exec.js';
|
|
18
|
+
/**
|
|
19
|
+
* Parse one CLI token into an {@link Endpoint}.
|
|
20
|
+
*
|
|
21
|
+
* Grammar: `host:path` is remote; anything else is local. The host part must
|
|
22
|
+
* not contain a `/` (that would be a local absolute path with a colon in it —
|
|
23
|
+
* unusual but valid; the colon test covers the common fleet pattern and rejects
|
|
24
|
+
* the almost-never-seen edge case in favour of local-path semantics).
|
|
25
|
+
*
|
|
26
|
+
* Windows drive letters (`C:path`) are excluded by requiring the host part to
|
|
27
|
+
* be at least two characters and not a single capital letter.
|
|
28
|
+
*/
|
|
29
|
+
export function parseEndpoint(token) {
|
|
30
|
+
const colonIdx = token.indexOf(':');
|
|
31
|
+
if (colonIdx > 1 && !token.startsWith('/')) {
|
|
32
|
+
const host = token.slice(0, colonIdx);
|
|
33
|
+
const path = token.slice(colonIdx + 1);
|
|
34
|
+
// A bare single uppercase letter before `:` looks like a Windows drive
|
|
35
|
+
// letter — treat as local to avoid a confusing error.
|
|
36
|
+
if (!/^[A-Z]$/.test(host) && !host.includes('/')) {
|
|
37
|
+
return { isRemote: true, host, path };
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return { isRemote: false, path: token };
|
|
41
|
+
}
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
// Remote path resolution — the core safeguard
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
/**
|
|
46
|
+
* Resolve the remote HOME directory in one SSH round-trip. Returns the
|
|
47
|
+
* absolute path (always starts with `/`), or throws on failure.
|
|
48
|
+
*/
|
|
49
|
+
export async function resolveRemoteHome(target, extraSshArgs) {
|
|
50
|
+
const res = sshExec(target, 'printf "%s" "$HOME"', {
|
|
51
|
+
extraSshArgs,
|
|
52
|
+
timeoutMs: 10_000,
|
|
53
|
+
});
|
|
54
|
+
if (res.code !== 0) {
|
|
55
|
+
throw new Error(`Cannot resolve remote $HOME on ${target}: ${res.stderr.trim() || 'ssh exited ' + String(res.code)}`);
|
|
56
|
+
}
|
|
57
|
+
const home = res.stdout.trim();
|
|
58
|
+
if (!home || !home.startsWith('/')) {
|
|
59
|
+
throw new Error(`Remote $HOME on ${target} is not an absolute path: ${JSON.stringify(home)}`);
|
|
60
|
+
}
|
|
61
|
+
return home;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Pure home-prefix expansion. Given a remote HOME (already resolved on the
|
|
65
|
+
* remote) and a raw path token, substitute a leading `~` or `$HOME`. Paths
|
|
66
|
+
* without those prefixes are returned unchanged. Never consults
|
|
67
|
+
* `process.env.HOME` — the local home must not leak into a remote path.
|
|
68
|
+
*/
|
|
69
|
+
export function expandRemoteHomePrefix(rawPath, remoteHome) {
|
|
70
|
+
if (rawPath === '~' || rawPath.startsWith('~/')) {
|
|
71
|
+
return rawPath === '~' ? remoteHome : remoteHome + rawPath.slice(1);
|
|
72
|
+
}
|
|
73
|
+
if (rawPath === '$HOME' || rawPath.startsWith('$HOME/')) {
|
|
74
|
+
return rawPath === '$HOME' ? remoteHome : remoteHome + rawPath.slice(5);
|
|
75
|
+
}
|
|
76
|
+
return rawPath;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Expand a remote path's leading `~` or literal `$HOME` to an absolute path
|
|
80
|
+
* resolved **on the remote**, not locally. A path that already starts with `/`
|
|
81
|
+
* is returned unchanged (no round-trip).
|
|
82
|
+
*
|
|
83
|
+
* This is the safeguard against the silent-failure class: a `$HOME` or `~`
|
|
84
|
+
* that would expand to the **local** user's home if left in a shell command.
|
|
85
|
+
*/
|
|
86
|
+
export async function resolveRemotePath(rawPath, target, extraSshArgs) {
|
|
87
|
+
if (rawPath === '~' ||
|
|
88
|
+
rawPath.startsWith('~/') ||
|
|
89
|
+
rawPath === '$HOME' ||
|
|
90
|
+
rawPath.startsWith('$HOME/')) {
|
|
91
|
+
const home = await resolveRemoteHome(target, extraSshArgs);
|
|
92
|
+
return expandRemoteHomePrefix(rawPath, home);
|
|
93
|
+
}
|
|
94
|
+
return rawPath;
|
|
95
|
+
}
|
|
96
|
+
// ---------------------------------------------------------------------------
|
|
97
|
+
// scp invocation
|
|
98
|
+
// ---------------------------------------------------------------------------
|
|
99
|
+
/**
|
|
100
|
+
* Build the argv for the `scp` invocation. Pure — no spawning — so it is
|
|
101
|
+
* unit-testable.
|
|
102
|
+
*
|
|
103
|
+
* `scp` accepts ssh `-o` options, so `SSH_OPTS` flows through unchanged.
|
|
104
|
+
* Identity args (`-i key -o IdentitiesOnly=yes`) are included only when a
|
|
105
|
+
* single remote device is involved; for two-remote transfers the identity
|
|
106
|
+
* applies to both connections, which works when the fleet uses a shared key.
|
|
107
|
+
*
|
|
108
|
+
* Remote endpoints are formatted as `user@host:path` (or bare `host:path`),
|
|
109
|
+
* local endpoints as their absolute path. Paths have already been resolved
|
|
110
|
+
* (no `~` or `$HOME`) by the time this is called.
|
|
111
|
+
*/
|
|
112
|
+
export function buildScpArgv({ srcSpec, dstSpec, identityArgs, recursive, }) {
|
|
113
|
+
const opts = [...SSH_OPTS, ...identityArgs];
|
|
114
|
+
if (recursive)
|
|
115
|
+
opts.push('-r');
|
|
116
|
+
// Two-remote transfers route through the local machine (-3) to avoid
|
|
117
|
+
// requiring direct SSH access between the two fleet boxes.
|
|
118
|
+
if (srcSpec.includes(':') && dstSpec.includes(':'))
|
|
119
|
+
opts.push('-3');
|
|
120
|
+
return [...opts, srcSpec, dstSpec];
|
|
121
|
+
}
|
|
122
|
+
async function resolveEndpoint(ep) {
|
|
123
|
+
if (!ep.isRemote) {
|
|
124
|
+
return { spec: ep.path, identityArgs: [] };
|
|
125
|
+
}
|
|
126
|
+
const device = await resolveDeviceTarget(ep.host);
|
|
127
|
+
if (!device) {
|
|
128
|
+
throw new Error(`Unknown device ${JSON.stringify(ep.host)}. Register it with \`agents devices add\` or check \`agents devices\`.`);
|
|
129
|
+
}
|
|
130
|
+
const target = sshTargetFor(device);
|
|
131
|
+
const idArgs = deviceIdentityArgs(device);
|
|
132
|
+
const resolvedPath = await resolveRemotePath(ep.path, target, idArgs);
|
|
133
|
+
if (!resolvedPath.startsWith('/')) {
|
|
134
|
+
throw new Error(`Remote path on ${ep.host} must be absolute after expansion, got: ${JSON.stringify(resolvedPath)}. Use an absolute path or start with ~/`);
|
|
135
|
+
}
|
|
136
|
+
return { spec: `${target}:${resolvedPath}`, identityArgs: idArgs };
|
|
137
|
+
}
|
|
138
|
+
// ---------------------------------------------------------------------------
|
|
139
|
+
// Validation
|
|
140
|
+
// ---------------------------------------------------------------------------
|
|
141
|
+
/** Validate a local path: must be absolute. */
|
|
142
|
+
function validateLocalPath(raw) {
|
|
143
|
+
if (!raw.startsWith('/')) {
|
|
144
|
+
throw new Error(`Local path must be absolute, got: ${JSON.stringify(raw)}`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/** Validate a remote path: non-empty. */
|
|
148
|
+
function validateRemotePath(raw, host) {
|
|
149
|
+
if (!raw) {
|
|
150
|
+
throw new Error(`Remote path for ${JSON.stringify(host)} is empty. Expected: ${host}:/abs/path`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// ---------------------------------------------------------------------------
|
|
154
|
+
// Command registration
|
|
155
|
+
// ---------------------------------------------------------------------------
|
|
156
|
+
export function registerCpCommand(program) {
|
|
157
|
+
const cmd = program
|
|
158
|
+
.command('cp <src> <dst>')
|
|
159
|
+
.description('Copy a file or directory between fleet hosts. Either endpoint may be host:path (remote) or an absolute local path.')
|
|
160
|
+
.option('-r, --recursive', 'Copy directories recursively')
|
|
161
|
+
.action(async (srcToken, dstToken, opts) => {
|
|
162
|
+
const recursive = opts.recursive ?? false;
|
|
163
|
+
const srcEp = parseEndpoint(srcToken);
|
|
164
|
+
const dstEp = parseEndpoint(dstToken);
|
|
165
|
+
if (!srcEp.isRemote && !dstEp.isRemote) {
|
|
166
|
+
process.stderr.write(chalk.red('error:') +
|
|
167
|
+
' At least one endpoint must be remote (host:path). For local-only copies use `cp`.\n');
|
|
168
|
+
process.exit(1);
|
|
169
|
+
}
|
|
170
|
+
let srcResolved;
|
|
171
|
+
let dstResolved;
|
|
172
|
+
try {
|
|
173
|
+
// Validate shapes before any network calls.
|
|
174
|
+
if (!srcEp.isRemote)
|
|
175
|
+
validateLocalPath(srcEp.path);
|
|
176
|
+
if (srcEp.isRemote)
|
|
177
|
+
validateRemotePath(srcEp.path, srcEp.host);
|
|
178
|
+
if (!dstEp.isRemote)
|
|
179
|
+
validateLocalPath(dstEp.path);
|
|
180
|
+
if (dstEp.isRemote)
|
|
181
|
+
validateRemotePath(dstEp.path, dstEp.host);
|
|
182
|
+
[srcResolved, dstResolved] = await Promise.all([
|
|
183
|
+
resolveEndpoint(srcEp),
|
|
184
|
+
resolveEndpoint(dstEp),
|
|
185
|
+
]);
|
|
186
|
+
}
|
|
187
|
+
catch (err) {
|
|
188
|
+
process.stderr.write(chalk.red('error:') + ' ' + err.message + '\n');
|
|
189
|
+
process.exit(1);
|
|
190
|
+
}
|
|
191
|
+
// Merge identity args: for two-remote transfers, omit per-device identity
|
|
192
|
+
// args (they apply to both connections via -3; a conflict would need
|
|
193
|
+
// separate -i per connection which scp doesn't support). A shared fleet
|
|
194
|
+
// key works without explicit -i.
|
|
195
|
+
const identityArgs = srcResolved.identityArgs.length > 0 && dstResolved.identityArgs.length === 0
|
|
196
|
+
? srcResolved.identityArgs
|
|
197
|
+
: dstResolved.identityArgs.length > 0 && srcResolved.identityArgs.length === 0
|
|
198
|
+
? dstResolved.identityArgs
|
|
199
|
+
: srcResolved.identityArgs.join(',') === dstResolved.identityArgs.join(',')
|
|
200
|
+
? srcResolved.identityArgs
|
|
201
|
+
: []; // two remotes with different keys — skip per-device flag, use agent's default key
|
|
202
|
+
const argv = buildScpArgv({
|
|
203
|
+
srcSpec: srcResolved.spec,
|
|
204
|
+
dstSpec: dstResolved.spec,
|
|
205
|
+
identityArgs,
|
|
206
|
+
recursive,
|
|
207
|
+
});
|
|
208
|
+
const res = spawnSync('scp', argv, { stdio: 'inherit' });
|
|
209
|
+
const code = typeof res.status === 'number' ? res.status : 1;
|
|
210
|
+
if (code !== 0) {
|
|
211
|
+
// scp already printed a diagnostic; just exit non-zero.
|
|
212
|
+
process.exit(code);
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
setHelpSections(cmd, {
|
|
216
|
+
examples: `
|
|
217
|
+
agents cp yosemite-s0:/abs/data.json /tmp/data.json # download a file from a fleet host
|
|
218
|
+
agents cp /tmp/build.tar.gz mac-mini:/abs/deploy/ # upload a local file to a fleet host
|
|
219
|
+
agents cp -r yosemite-s0:/abs/src/ mac-mini:/abs/dst/ # copy a directory between two fleet hosts
|
|
220
|
+
agents cp yosemite-s0:~/logs/run.log /tmp/run.log # ~ is resolved on the remote host
|
|
221
|
+
`,
|
|
222
|
+
notes: `
|
|
223
|
+
Local paths must be absolute (use /abs/path, not ./relative).
|
|
224
|
+
Remote paths must be absolute after ~ / $HOME expansion.
|
|
225
|
+
Remote $HOME is resolved on the remote host — never in the local shell.
|
|
226
|
+
Both local-to-remote and remote-to-local transfers are supported.
|
|
227
|
+
Remote-to-remote transfers route through the local machine (-3).
|
|
228
|
+
Devices must be registered: 'agents devices' to list, 'agents devices add' to enroll.
|
|
229
|
+
`,
|
|
230
|
+
});
|
|
231
|
+
}
|