@phnx-labs/agents-cli 1.22.35 → 1.22.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +666 -2
- package/README.md +75 -35
- package/dist/bin/agents +0 -0
- package/dist/bootstrap.d.ts +15 -0
- package/dist/bootstrap.js +1211 -0
- package/dist/commands/accounts.d.ts +4 -11
- package/dist/commands/accounts.js +159 -27
- package/dist/commands/attach.js +17 -4
- package/dist/commands/audit.d.ts +8 -8
- package/dist/commands/audit.js +57 -47
- package/dist/commands/browser.js +15 -11
- package/dist/commands/cloud.js +1 -1
- package/dist/commands/commands.js +0 -11
- package/dist/commands/computer-actions.js +33 -0
- package/dist/commands/computer-sessions-picker.d.ts +21 -0
- package/dist/commands/computer-sessions-picker.js +141 -0
- package/dist/commands/computer.d.ts +16 -0
- package/dist/commands/computer.js +37 -0
- package/dist/commands/config.d.ts +17 -0
- package/dist/commands/config.js +401 -0
- package/dist/commands/cp.d.ts +84 -0
- package/dist/commands/cp.js +231 -0
- package/dist/commands/daemon.js +243 -14
- package/dist/commands/detach-core.d.ts +1 -1
- package/dist/commands/detach-core.js +12 -2
- package/dist/commands/detach.js +1 -1
- package/dist/commands/doctor.js +64 -5
- package/dist/commands/events.d.ts +24 -12
- package/dist/commands/events.js +144 -28
- package/dist/commands/exec.js +85 -41
- package/dist/commands/feed.d.ts +1 -1
- package/dist/commands/feed.js +16 -8
- package/dist/commands/focus.d.ts +33 -1
- package/dist/commands/focus.js +177 -17
- package/dist/commands/funnel.d.ts +1 -1
- package/dist/commands/go.js +9 -8
- package/dist/commands/harness-wizard.d.ts +1 -0
- package/dist/commands/harness-wizard.js +18 -20
- package/dist/commands/harness.d.ts +2 -0
- package/dist/commands/harness.js +59 -26
- package/dist/commands/hooks.js +0 -11
- package/dist/commands/inspect.d.ts +94 -1
- package/dist/commands/inspect.js +866 -40
- package/dist/commands/lease.d.ts +4 -4
- package/dist/commands/lease.js +6 -6
- package/dist/commands/login.js +0 -13
- package/dist/commands/logs.d.ts +2 -2
- package/dist/commands/logs.js +2 -2
- package/dist/commands/mcp.js +7 -2
- package/dist/commands/memory.js +7 -2
- package/dist/commands/message.d.ts +1 -1
- package/dist/commands/message.js +37 -6
- package/dist/commands/models.js +4 -0
- package/dist/commands/monitors.d.ts +0 -1
- package/dist/commands/monitors.js +199 -16
- package/dist/commands/open.d.ts +18 -0
- package/dist/commands/open.js +57 -0
- package/dist/commands/packages.js +2 -107
- package/dist/commands/plugins.js +6 -3
- package/dist/commands/profiles.d.ts +1 -0
- package/dist/commands/profiles.js +16 -160
- package/dist/commands/projects.d.ts +28 -0
- package/dist/commands/projects.js +125 -5
- package/dist/commands/reconnect.js +9 -3
- package/dist/commands/repo.js +42 -1
- package/dist/commands/resource-view.d.ts +17 -0
- package/dist/commands/resource-view.js +36 -14
- package/dist/commands/resume.js +9 -2
- package/dist/commands/routines.d.ts +0 -2
- package/dist/commands/routines.js +473 -289
- package/dist/commands/secrets.js +52 -9
- package/dist/commands/sessions-export.d.ts +47 -0
- package/dist/commands/sessions-export.js +116 -6
- package/dist/commands/sessions-import.d.ts +17 -0
- package/dist/commands/sessions-import.js +114 -6
- package/dist/commands/sessions-migrate.d.ts +27 -0
- package/dist/commands/sessions-migrate.js +50 -9
- package/dist/commands/sessions-picker.js +23 -4
- package/dist/commands/sessions-resume.d.ts +5 -3
- package/dist/commands/sessions-resume.js +30 -8
- package/dist/commands/sessions-watch.d.ts +2 -0
- package/dist/commands/sessions-watch.js +53 -0
- package/dist/commands/sessions.d.ts +66 -3
- package/dist/commands/sessions.js +298 -47
- package/dist/commands/set.d.ts +1 -1
- package/dist/commands/set.js +2 -2
- package/dist/commands/setup-browser.js +2 -2
- package/dist/commands/setup-mine.js +0 -1
- package/dist/commands/setup-preferences.js +1 -1
- package/dist/commands/setup-share.js +34 -4
- package/dist/commands/setup.d.ts +5 -0
- package/dist/commands/setup.js +26 -0
- package/dist/commands/share.d.ts +67 -0
- package/dist/commands/share.js +275 -12
- package/dist/commands/skills.js +0 -11
- package/dist/commands/snapshot.js +1 -1
- package/dist/commands/ssh.d.ts +18 -0
- package/dist/commands/ssh.js +549 -210
- package/dist/commands/sync.d.ts +5 -0
- package/dist/commands/sync.js +212 -32
- package/dist/commands/teams.d.ts +13 -0
- package/dist/commands/teams.js +187 -30
- package/dist/commands/tickets.d.ts +2 -0
- package/dist/commands/tickets.js +43 -0
- package/dist/commands/update.js +2 -4
- package/dist/commands/usage.js +5 -3
- package/dist/commands/versions.js +11 -5
- package/dist/commands/view.js +15 -7
- package/dist/commands/webhook.d.ts +2 -2
- package/dist/commands/webhook.js +7 -7
- package/dist/index.d.ts +18 -2
- package/dist/index.js +53 -1264
- package/dist/lib/account-catalog.d.ts +18 -0
- package/dist/lib/account-catalog.js +38 -0
- package/dist/lib/account-provider-registry.d.ts +18 -0
- package/dist/lib/account-provider-registry.js +59 -0
- package/dist/lib/account-registry.d.ts +40 -0
- package/dist/lib/account-registry.js +239 -0
- package/dist/lib/account-schema.d.ts +44 -0
- package/dist/lib/account-schema.js +91 -0
- package/dist/lib/account-state-service.d.ts +21 -0
- package/dist/lib/account-state-service.js +60 -0
- package/dist/lib/activity.d.ts +1 -1
- package/dist/lib/activity.js +8 -1
- package/dist/lib/add-dir.d.ts +80 -0
- package/dist/lib/add-dir.js +241 -0
- package/dist/lib/agent-cli-commands.d.ts +11 -0
- package/dist/lib/agent-cli-commands.js +30 -0
- package/dist/lib/agents.js +44 -36
- package/dist/lib/answer-router.js +1 -1
- package/dist/lib/audit/log.d.ts +10 -27
- package/dist/lib/audit/log.js +20 -33
- package/dist/lib/auth-health.d.ts +9 -2
- package/dist/lib/auth-health.js +42 -9
- package/dist/lib/auto-pull-worker.js +7 -3
- package/dist/lib/auto-pull.d.ts +44 -3
- package/dist/lib/auto-pull.js +88 -5
- package/dist/lib/binary-shadow.d.ts +28 -0
- package/dist/lib/binary-shadow.js +121 -0
- package/dist/lib/brand.js +9 -3
- package/dist/lib/browser/ipc.d.ts +30 -0
- package/dist/lib/browser/ipc.js +81 -4
- package/dist/lib/browser/profiles.d.ts +3 -2
- package/dist/lib/browser/profiles.js +65 -22
- package/dist/lib/browser/service.d.ts +4 -0
- package/dist/lib/browser/service.js +30 -3
- package/dist/lib/browser/sessions-list.d.ts +22 -2
- package/dist/lib/browser/sessions-list.js +54 -6
- package/dist/lib/browser/stream.d.ts +2 -0
- package/dist/lib/browser/stream.js +1 -0
- package/dist/lib/browser/types.d.ts +19 -0
- package/dist/lib/byok-usage.d.ts +9 -2
- package/dist/lib/byok-usage.js +133 -31
- package/dist/lib/cli-entry.d.ts +11 -0
- package/dist/lib/cli-entry.js +46 -0
- package/dist/lib/cloud/host.d.ts +1 -1
- package/dist/lib/cloud/host.js +2 -2
- package/dist/lib/cloud/registry.js +1 -1
- package/dist/lib/cloud/types.d.ts +1 -1
- package/dist/lib/commands.d.ts +2 -0
- package/dist/lib/commands.js +2 -0
- package/dist/lib/computer/sessions-list.d.ts +150 -0
- package/dist/lib/computer/sessions-list.js +363 -0
- package/dist/lib/config-keys.d.ts +86 -0
- package/dist/lib/config-keys.js +193 -0
- package/dist/lib/config-machine-keys.d.ts +12 -0
- package/dist/lib/config-machine-keys.js +17 -0
- package/dist/lib/config-transfer.js +3 -4
- package/dist/lib/crabbox/cli.d.ts +2 -2
- package/dist/lib/crabbox/cli.js +3 -3
- package/dist/lib/daemon-health.d.ts +22 -0
- package/dist/lib/daemon-health.js +33 -3
- package/dist/lib/daemon-services.d.ts +50 -0
- package/dist/lib/daemon-services.js +147 -0
- package/dist/lib/daemon-ticks.d.ts +35 -66
- package/dist/lib/daemon-ticks.js +77 -159
- package/dist/lib/daemon.d.ts +72 -4
- package/dist/lib/daemon.js +792 -202
- package/dist/lib/deeplink/register.d.ts +49 -0
- package/dist/lib/deeplink/register.js +253 -0
- package/dist/lib/deeplink/url.d.ts +34 -0
- package/dist/lib/deeplink/url.js +78 -0
- package/dist/lib/device-config.d.ts +124 -29
- package/dist/lib/device-config.js +346 -141
- package/dist/lib/devices/config-migration.d.ts +42 -0
- package/dist/lib/devices/config-migration.js +203 -0
- package/dist/lib/devices/connect.js +14 -7
- package/dist/lib/devices/doctor-findings.d.ts +4 -1
- package/dist/lib/devices/doctor-findings.js +20 -1
- package/dist/lib/devices/harness-inventory.d.ts +11 -2
- package/dist/lib/devices/harness-inventory.js +0 -0
- package/dist/lib/devices/health.d.ts +1 -1
- package/dist/lib/devices/health.js +1 -1
- package/dist/lib/devices/pending.d.ts +22 -1
- package/dist/lib/devices/pending.js +67 -2
- package/dist/lib/devices/registry.d.ts +0 -25
- package/dist/lib/devices/registry.js +2 -83
- package/dist/lib/devices/resolve-profile.d.ts +20 -0
- package/dist/lib/devices/resolve-profile.js +44 -0
- package/dist/lib/devices/rollout-verify.d.ts +101 -0
- package/dist/lib/devices/rollout-verify.js +193 -0
- package/dist/lib/devices/ssh-config.js +10 -6
- package/dist/lib/event-families.d.ts +28 -0
- package/dist/lib/event-families.js +159 -0
- package/dist/lib/event-stream.d.ts +9 -1
- package/dist/lib/event-stream.js +26 -9
- package/dist/lib/events.d.ts +9 -1
- package/dist/lib/events.js +21 -6
- package/dist/lib/exec.d.ts +30 -0
- package/dist/lib/exec.js +219 -121
- package/dist/lib/feed-broadcast.d.ts +25 -0
- package/dist/lib/feed-broadcast.js +33 -0
- package/dist/lib/feed.d.ts +1 -1
- package/dist/lib/feed.js +12 -2
- package/dist/lib/fleet/capture.js +15 -0
- package/dist/lib/fleet/manifest.js +9 -0
- package/dist/lib/fleet/types.d.ts +9 -0
- package/dist/lib/fleet-status.js +10 -8
- package/dist/lib/git.d.ts +20 -6
- package/dist/lib/git.js +121 -17
- package/dist/lib/hosts/dispatch.d.ts +8 -3
- package/dist/lib/hosts/dispatch.js +29 -3
- package/dist/lib/hosts/logs.d.ts +2 -2
- package/dist/lib/hosts/logs.js +2 -2
- package/dist/lib/hosts/option.js +1 -1
- package/dist/lib/hosts/passthrough.d.ts +2 -3
- package/dist/lib/hosts/passthrough.js +10 -24
- package/dist/lib/hosts/progress.js +2 -2
- package/dist/lib/hosts/providers/devices.d.ts +3 -3
- package/dist/lib/hosts/providers/devices.js +18 -12
- package/dist/lib/hosts/ready.d.ts +5 -1
- package/dist/lib/hosts/ready.js +9 -3
- package/dist/lib/hosts/reconcile.d.ts +2 -2
- package/dist/lib/hosts/reconcile.js +2 -2
- package/dist/lib/hosts/registry.js +14 -9
- package/dist/lib/hosts/remote-cmd.js +1 -1
- package/dist/lib/hosts/remote-os.d.ts +9 -6
- package/dist/lib/hosts/remote-os.js +13 -6
- package/dist/lib/hosts/routing-flag.d.ts +23 -0
- package/dist/lib/hosts/routing-flag.js +41 -0
- package/dist/lib/hosts/run-target.js +1 -1
- package/dist/lib/hosts/session-index.js +1 -1
- package/dist/lib/hosts/tasks.d.ts +6 -6
- package/dist/lib/hosts/tasks.js +4 -4
- package/dist/lib/hosts/types.js +1 -2
- package/dist/lib/installations/resolve.js +2 -8
- package/dist/lib/isolation-boundary-report.js +0 -1
- package/dist/lib/linear-cache.d.ts +7 -0
- package/dist/lib/linear-cache.js +31 -4
- package/dist/lib/linear-project-counts.d.ts +1 -1
- package/dist/lib/linear-project-counts.js +2 -3
- package/dist/lib/linear-projects.js +1 -1
- package/dist/lib/loop.d.ts +2 -2
- package/dist/lib/loop.js +1 -1
- package/dist/lib/mailbox-target.d.ts +1 -1
- package/dist/lib/mailbox-target.js +1 -1
- package/dist/lib/manifest.js +7 -4
- package/dist/lib/menubar/MenubarHelper.app/Contents/CodeResources +0 -0
- package/dist/lib/menubar/MenubarHelper.app/Contents/MacOS/MenubarHelper +0 -0
- package/dist/lib/menubar/snapshot.d.ts +3 -2
- package/dist/lib/menubar/snapshot.js +6 -2
- package/dist/lib/migrate-fold.d.ts +33 -0
- package/dist/lib/migrate-fold.js +130 -0
- package/dist/lib/migrate.d.ts +34 -34
- package/dist/lib/migrate.js +106 -128
- package/dist/lib/model-tier-overrides.d.ts +1 -1
- package/dist/lib/model-tier-overrides.js +15 -2
- package/dist/lib/monitors/config.d.ts +17 -3
- package/dist/lib/monitors/config.js +52 -18
- package/dist/lib/monitors/engine.d.ts +32 -1
- package/dist/lib/monitors/engine.js +94 -11
- package/dist/lib/monitors/fingerprint.d.ts +46 -0
- package/dist/lib/monitors/fingerprint.js +100 -0
- package/dist/lib/monitors/remote.d.ts +47 -0
- package/dist/lib/monitors/remote.js +81 -0
- package/dist/lib/monitors/state.d.ts +39 -0
- package/dist/lib/monitors/state.js +56 -0
- package/dist/lib/onepassword.d.ts +17 -0
- package/dist/lib/onepassword.js +52 -22
- package/dist/lib/open-url.js +1 -1
- package/dist/lib/picker.d.ts +14 -2
- package/dist/lib/picker.js +35 -13
- package/dist/lib/placement.d.ts +1 -1
- package/dist/lib/placement.js +1 -1
- package/dist/lib/pr-land-detach.d.ts +32 -0
- package/dist/lib/pr-land-detach.js +79 -0
- package/dist/lib/profiles-presets.js +13 -0
- package/dist/lib/profiles.d.ts +2 -0
- package/dist/lib/profiles.js +44 -1
- package/dist/lib/project-focus.d.ts +1 -1
- package/dist/lib/project-focus.js +1 -1
- package/dist/lib/project-probe.d.ts +4 -1
- package/dist/lib/project-probe.js +5 -4
- package/dist/lib/project-resources.js +2 -18
- package/dist/lib/project-root.d.ts +16 -0
- package/dist/lib/project-root.js +20 -2
- package/dist/lib/projects.d.ts +20 -1
- package/dist/lib/projects.js +78 -1
- package/dist/lib/refresh-coordinator.d.ts +24 -0
- package/dist/lib/refresh-coordinator.js +52 -0
- package/dist/lib/registry.d.ts +2 -2
- package/dist/lib/registry.js +1 -1
- package/dist/lib/resource-aliases.d.ts +13 -0
- package/dist/lib/resource-aliases.js +26 -0
- package/dist/lib/resources/types.d.ts +1 -1
- package/dist/lib/resources.d.ts +16 -0
- package/dist/lib/resources.js +66 -10
- package/dist/lib/rotate.d.ts +3 -4
- package/dist/lib/rotate.js +4 -5
- package/dist/lib/routine-activation.d.ts +22 -2
- package/dist/lib/routine-activation.js +63 -16
- package/dist/lib/routine-context.d.ts +9 -2
- package/dist/lib/routine-context.js +21 -6
- package/dist/lib/routines-project.d.ts +58 -48
- package/dist/lib/routines-project.js +190 -159
- package/dist/lib/routines.d.ts +41 -6
- package/dist/lib/routines.js +92 -34
- package/dist/lib/run-defaults.d.ts +5 -0
- package/dist/lib/run-defaults.js +11 -1
- package/dist/lib/runner.d.ts +10 -8
- package/dist/lib/runner.js +122 -39
- package/dist/lib/secrets/Agents CLI.app/Contents/CodeResources +0 -0
- package/dist/lib/secrets/Agents CLI.app/Contents/MacOS/Agents CLI +0 -0
- package/dist/lib/secrets/agent.d.ts +10 -3
- package/dist/lib/secrets/agent.js +43 -8
- package/dist/lib/secrets/bundles.d.ts +1 -0
- package/dist/lib/secrets/bundles.js +92 -80
- package/dist/lib/secrets/index.js +32 -9
- package/dist/lib/secrets/install-helper.d.ts +4 -4
- package/dist/lib/secrets/install-helper.js +4 -4
- package/dist/lib/secrets/push.d.ts +40 -6
- package/dist/lib/secrets/push.js +58 -11
- package/dist/lib/secrets/read-backoff.d.ts +1 -1
- package/dist/lib/secrets/read-backoff.js +1 -1
- package/dist/lib/secrets/remote.d.ts +24 -0
- package/dist/lib/secrets/remote.js +54 -4
- package/dist/lib/self-update.d.ts +108 -0
- package/dist/lib/self-update.js +276 -1
- package/dist/lib/session/active.d.ts +89 -5
- package/dist/lib/session/active.js +165 -10
- package/dist/lib/session/actor-sidecar.d.ts +1 -1
- package/dist/lib/session/actor-sidecar.js +2 -1
- package/dist/lib/session/db.d.ts +176 -2
- package/dist/lib/session/db.js +484 -17
- package/dist/lib/session/discover.js +27 -4
- package/dist/lib/session/hook-sessions.js +2 -2
- package/dist/lib/session/host-link.d.ts +2 -2
- package/dist/lib/session/host-link.js +2 -2
- package/dist/lib/session/pid-registry.d.ts +21 -0
- package/dist/lib/session/pid-registry.js +57 -0
- package/dist/lib/session/remote-active.js +15 -1
- package/dist/lib/session/remote.js +2 -2
- package/dist/lib/session/session-cache.d.ts +14 -7
- package/dist/lib/session/session-cache.js +51 -9
- package/dist/lib/session/state.d.ts +2 -2
- package/dist/lib/session/state.js +1 -1
- package/dist/lib/session/sync/config.d.ts +10 -10
- package/dist/lib/session/sync/config.js +10 -10
- package/dist/lib/session/sync/r2.d.ts +34 -0
- package/dist/lib/session/sync/r2.js +123 -0
- package/dist/lib/session/throughput.d.ts +1 -1
- package/dist/lib/session/throughput.js +1 -1
- package/dist/lib/session/types.d.ts +23 -1
- package/dist/lib/session/types.js +15 -0
- package/dist/lib/session/viewing-in.d.ts +1 -1
- package/dist/lib/session/viewing-in.js +1 -1
- package/dist/lib/session/watch.d.ts +101 -0
- package/dist/lib/session/watch.js +242 -0
- package/dist/lib/share/config.d.ts +4 -0
- package/dist/lib/share/config.js +1 -0
- package/dist/lib/share/provision.d.ts +38 -0
- package/dist/lib/share/provision.js +50 -0
- package/dist/lib/share/publish.d.ts +40 -1
- package/dist/lib/share/publish.js +116 -3
- package/dist/lib/share/worker-template.js +71 -6
- package/dist/lib/shims.d.ts +17 -3
- package/dist/lib/shims.js +98 -26
- package/dist/lib/signin-badge.js +3 -2
- package/dist/lib/skills.js +2 -0
- package/dist/lib/smart-launch.d.ts +8 -8
- package/dist/lib/smart-launch.js +80 -59
- package/dist/lib/ssh-exec.d.ts +1 -1
- package/dist/lib/ssh-exec.js +1 -1
- package/dist/lib/staleness/prune.d.ts +88 -0
- package/dist/lib/staleness/prune.js +69 -0
- package/dist/lib/staleness/registry.d.ts +1 -1
- package/dist/lib/staleness/writers/commands.js +34 -2
- package/dist/lib/staleness/writers/hooks.js +16 -0
- package/dist/lib/staleness/writers/kinds.d.ts +6 -0
- package/dist/lib/staleness/writers/skills.js +19 -0
- package/dist/lib/staleness/writers/subagents.d.ts +2 -3
- package/dist/lib/staleness/writers/subagents.js +0 -4
- package/dist/lib/staleness/writers/types.d.ts +32 -0
- package/dist/lib/startup/command-registry.d.ts +6 -12
- package/dist/lib/startup/command-registry.js +11 -31
- package/dist/lib/startup/dev-build.d.ts +10 -0
- package/dist/lib/startup/dev-build.js +13 -1
- package/dist/lib/startup/spellcheck.d.ts +18 -0
- package/dist/lib/startup/spellcheck.js +45 -0
- package/dist/lib/state.d.ts +36 -9
- package/dist/lib/state.js +96 -46
- package/dist/lib/subagents-registry.d.ts +0 -7
- package/dist/lib/subagents-registry.js +38 -65
- package/dist/lib/subagents.d.ts +0 -33
- package/dist/lib/subagents.js +0 -75
- package/dist/lib/sync-umbrella.js +1 -1
- package/dist/lib/teams/agents.d.ts +41 -1
- package/dist/lib/teams/agents.js +187 -9
- package/dist/lib/teams/api.d.ts +11 -1
- package/dist/lib/teams/api.js +11 -2
- package/dist/lib/teams/delivery.d.ts +41 -0
- package/dist/lib/teams/delivery.js +60 -0
- package/dist/lib/teams/registry.d.ts +14 -0
- package/dist/lib/teams/registry.js +51 -1
- package/dist/lib/teams/remoteWorktree.d.ts +19 -0
- package/dist/lib/teams/remoteWorktree.js +29 -0
- package/dist/lib/teams/scheduler.d.ts +1 -1
- package/dist/lib/teams/scheduler.js +1 -1
- package/dist/lib/teams/worktree.d.ts +24 -0
- package/dist/lib/teams/worktree.js +42 -0
- package/dist/lib/terminal/backends/vscodium-agent.d.ts +10 -1
- package/dist/lib/terminal/backends/vscodium-agent.js +16 -5
- package/dist/lib/terminal/engine.d.ts +4 -0
- package/dist/lib/terminal/engine.js +8 -2
- package/dist/lib/terminal/types.d.ts +21 -2
- package/dist/lib/testdata/refresh-coordinator-worker.d.ts +1 -0
- package/dist/lib/testdata/refresh-coordinator-worker.js +23 -0
- package/dist/lib/tickets/list.d.ts +53 -0
- package/dist/lib/tickets/list.js +153 -0
- package/dist/lib/tmux/orphan-reap.d.ts +320 -0
- package/dist/lib/tmux/orphan-reap.js +644 -0
- package/dist/lib/tmux/session.d.ts +68 -3
- package/dist/lib/tmux/session.js +95 -5
- package/dist/lib/triggers/handlers.d.ts +20 -0
- package/dist/lib/triggers/handlers.js +6 -1
- package/dist/lib/types.d.ts +46 -34
- package/dist/lib/usage-fleet.d.ts +32 -0
- package/dist/lib/usage-fleet.js +125 -0
- package/dist/lib/usage-refresh.d.ts +3 -3
- package/dist/lib/usage-refresh.js +19 -16
- package/dist/lib/usage.d.ts +51 -47
- package/dist/lib/usage.js +145 -153
- package/dist/lib/version-duplicates.js +2 -2
- package/dist/lib/versions.d.ts +56 -13
- package/dist/lib/versions.js +195 -45
- package/dist/lib/watchdog/log.d.ts +1 -1
- package/dist/lib/watchdog/log.js +3 -3
- package/dist/lib/watchdog/rotate.d.ts +6 -6
- package/dist/lib/watchdog/rotate.js +6 -6
- package/dist/lib/workflows.d.ts +1 -1
- package/dist/lib/yaml-io.d.ts +47 -0
- package/dist/lib/yaml-io.js +55 -0
- package/package.json +2 -1
- package/scripts/install-helper.js +2 -2
- package/scripts/postinstall.js +23 -20
- package/dist/commands/defaults.d.ts +0 -7
- package/dist/commands/defaults.js +0 -107
- package/dist/commands/export.d.ts +0 -11
- package/dist/commands/export.js +0 -215
- package/dist/commands/helper.d.ts +0 -12
- package/dist/commands/helper.js +0 -87
- package/dist/commands/hosts.d.ts +0 -11
- package/dist/commands/hosts.js +0 -330
- package/dist/commands/lock.d.ts +0 -12
- package/dist/commands/lock.js +0 -70
- package/dist/commands/pull.d.ts +0 -17
- package/dist/commands/pull.js +0 -39
- package/dist/commands/push.d.ts +0 -14
- package/dist/commands/push.js +0 -30
- package/dist/commands/wallet.d.ts +0 -20
- package/dist/commands/wallet.js +0 -216
- package/dist/commands/worktree.d.ts +0 -19
- package/dist/commands/worktree.js +0 -272
- package/dist/lib/account-labels.d.ts +0 -24
- package/dist/lib/account-labels.js +0 -72
- package/dist/lib/auto-dispatch-linear.d.ts +0 -18
- package/dist/lib/auto-dispatch-linear.js +0 -107
- package/dist/lib/auto-dispatch-provider.d.ts +0 -10
- package/dist/lib/auto-dispatch-provider.js +0 -30
- package/dist/lib/auto-dispatch.d.ts +0 -93
- package/dist/lib/auto-dispatch.js +0 -128
- package/dist/lib/export.d.ts +0 -72
- package/dist/lib/export.js +0 -269
- package/dist/lib/lock.d.ts +0 -93
- package/dist/lib/lock.js +0 -207
- package/dist/lib/wallet/index.d.ts +0 -78
- package/dist/lib/wallet/index.js +0 -253
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import chalk from 'chalk';
|
|
10
10
|
import { DEFAULT_BUCKET_NAME, DEFAULT_CF_BUNDLE, DEFAULT_WORKER_NAME, readShareConfig, } from '../lib/share/config.js';
|
|
11
|
-
import { runShareProvision, runShareJoin } from './share.js';
|
|
11
|
+
import { runShareProvision, runShareJoin, runShareUpdate, shareTemplateStatus } from './share.js';
|
|
12
12
|
import { isInteractiveTerminal, isPromptCancelled } from './utils.js';
|
|
13
13
|
/**
|
|
14
14
|
* Interactive share setup. Returns true if the user configured (or already had)
|
|
@@ -25,12 +25,42 @@ export async function runShareWizard() {
|
|
|
25
25
|
if (existing) {
|
|
26
26
|
console.log(chalk.dim(`Share is already configured → ${chalk.green(existing.baseUrl)}`));
|
|
27
27
|
console.log(chalk.dim(` worker ${existing.workerName} · bucket ${existing.bucketName} · account ${existing.accountId}`));
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
const templateStatus = shareTemplateStatus(existing);
|
|
29
|
+
console.log(chalk.dim(` template ${templateStatus}`));
|
|
30
|
+
const { select } = await import('@inquirer/prompts');
|
|
31
|
+
const action = await select({
|
|
32
|
+
message: 'Share is already configured. What do you want to do?',
|
|
33
|
+
choices: [
|
|
34
|
+
{ name: 'Keep as is', value: 'keep' },
|
|
35
|
+
{
|
|
36
|
+
name: 'Update the deployed Worker to the latest template',
|
|
37
|
+
value: 'update',
|
|
38
|
+
description: templateStatus === 'current'
|
|
39
|
+
? 'Already current — this re-deploys anyway and refreshes the token in place.'
|
|
40
|
+
: 'Re-deploys the Worker script on your existing endpoint (same account/worker/bucket, same write token).',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'Reconfigure from scratch (provision or join again)',
|
|
44
|
+
value: 'reconfigure',
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
default: templateStatus === 'outdated' || templateStatus === 'unknown' ? 'update' : 'keep',
|
|
48
|
+
});
|
|
49
|
+
if (action === 'keep') {
|
|
31
50
|
console.log(chalk.dim('Keeping the current endpoint.'));
|
|
32
51
|
return true;
|
|
33
52
|
}
|
|
53
|
+
if (action === 'update') {
|
|
54
|
+
// When the template is already current, the description below promises a
|
|
55
|
+
// re-deploy anyway — force it, or runShareUpdate's own no-op would silently
|
|
56
|
+
// contradict what was just said.
|
|
57
|
+
const result = await runShareUpdate({ force: templateStatus === 'current' });
|
|
58
|
+
console.log(result.updated
|
|
59
|
+
? chalk.green(`Worker '${result.workerName}' updated → template ${result.templateHash.slice(0, 12)}…`)
|
|
60
|
+
: chalk.dim(`Worker '${result.workerName}' already matches the current template — no-op.`));
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
// action === 'reconfigure' — fall through to the provision/join flow below.
|
|
34
64
|
}
|
|
35
65
|
const { select } = await import('@inquirer/prompts');
|
|
36
66
|
const mode = await select({
|
package/dist/commands/setup.d.ts
CHANGED
|
@@ -10,6 +10,11 @@ interface RunSetupOptions {
|
|
|
10
10
|
suppressFooter?: boolean;
|
|
11
11
|
systemRepo?: boolean;
|
|
12
12
|
runHub?: () => Promise<void>;
|
|
13
|
+
startDaemonFn?: () => {
|
|
14
|
+
pid: number | null;
|
|
15
|
+
method: string;
|
|
16
|
+
};
|
|
17
|
+
isDaemonEnabledFn?: () => boolean;
|
|
13
18
|
}
|
|
14
19
|
/** First-run setup. Clones ~/.agents/.system/ from the system repo if needed. */
|
|
15
20
|
export declare function runSetup(program: Command, options?: RunSetupOptions): Promise<void>;
|
package/dist/commands/setup.js
CHANGED
|
@@ -131,6 +131,20 @@ export async function runSetup(program, options = {}) {
|
|
|
131
131
|
spinner.succeed(`Cloned ${systemRepoSlug(systemRepo)} (${result.commit})`);
|
|
132
132
|
}
|
|
133
133
|
}
|
|
134
|
+
try {
|
|
135
|
+
const enabled = options.isDaemonEnabledFn
|
|
136
|
+
? options.isDaemonEnabledFn()
|
|
137
|
+
: (await import('../lib/device-config.js')).isDaemonEnabled();
|
|
138
|
+
if (enabled) {
|
|
139
|
+
const start = options.startDaemonFn
|
|
140
|
+
?? (await import('../lib/daemon.js')).startDaemon;
|
|
141
|
+
const started = start();
|
|
142
|
+
if (started.method !== 'already-running' && started.pid) {
|
|
143
|
+
console.log(chalk.gray(`Started the always-on agents daemon (pid ${started.pid}).`));
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
catch { /* best effort */ }
|
|
134
148
|
// Populate the device registry from the tailnet on first setup. Soft mode is
|
|
135
149
|
// guaranteed non-throwing (no tailscale / corrupt file / lock contention all
|
|
136
150
|
// resolve to ok:false), so this can never block setup.
|
|
@@ -195,6 +209,18 @@ export async function runSetup(program, options = {}) {
|
|
|
195
209
|
}
|
|
196
210
|
}
|
|
197
211
|
}
|
|
212
|
+
// Register the agents:// URL scheme so deep links in rendered artifacts can
|
|
213
|
+
// resume a session (RUSH — session deep links). Best-effort and idempotent:
|
|
214
|
+
// never fails setup, only registers when missing.
|
|
215
|
+
try {
|
|
216
|
+
const { registerAgentsUrlScheme } = await import('../lib/deeplink/register.js');
|
|
217
|
+
const scheme = registerAgentsUrlScheme({ ifMissing: true });
|
|
218
|
+
if (scheme.registered)
|
|
219
|
+
console.log(chalk.gray('Registered the agents:// URL scheme (artifact session deep links).'));
|
|
220
|
+
}
|
|
221
|
+
catch {
|
|
222
|
+
// non-fatal — the user can run `agents open register` later.
|
|
223
|
+
}
|
|
198
224
|
if (options.suppressFooter)
|
|
199
225
|
return;
|
|
200
226
|
// Fresh-machine hub: offer to set up the optional capabilities that need their
|
package/dist/commands/share.d.ts
CHANGED
|
@@ -1,8 +1,55 @@
|
|
|
1
1
|
import type { Command } from 'commander';
|
|
2
|
+
import { type ShareConfig } from '../lib/share/config.js';
|
|
2
3
|
import { type CloudflareRequester } from '../lib/share/provision.js';
|
|
3
4
|
import { type PublishResult } from '../lib/share/publish.js';
|
|
4
5
|
import { deleteShare, type DeleteShareResult } from '../lib/share/delete.js';
|
|
5
6
|
export declare function formatSharePublishResult(result: PublishResult, json?: boolean): string;
|
|
7
|
+
/** Compare the configured endpoint's last-deployed template hash against the
|
|
8
|
+
* hash of the CURRENT `worker-template.ts` render. A config with no recorded
|
|
9
|
+
* hash (every endpoint provisioned before this field existed) is "unknown" —
|
|
10
|
+
* never "current" or "outdated", since there is nothing to compare against. */
|
|
11
|
+
export declare function shareTemplateStatus(cfg: ShareConfig): 'current' | 'outdated' | 'unknown';
|
|
12
|
+
/** One published object as reported by the Worker's `?format=json` listing route. */
|
|
13
|
+
export interface ShareListItem {
|
|
14
|
+
slug: string;
|
|
15
|
+
url: string;
|
|
16
|
+
/** Object size in bytes. */
|
|
17
|
+
size: number;
|
|
18
|
+
/** Stored content type, or null if the Worker had none recorded. */
|
|
19
|
+
contentType: string | null;
|
|
20
|
+
/** ISO timestamp the object was last written (R2 `uploaded`). */
|
|
21
|
+
publishedAt: string;
|
|
22
|
+
/** ISO auto-expire timestamp, or null for a permanent share. */
|
|
23
|
+
expiresAt: string | null;
|
|
24
|
+
}
|
|
25
|
+
export interface ShareListResult {
|
|
26
|
+
/** The namespace listed. */
|
|
27
|
+
user: string;
|
|
28
|
+
count: number;
|
|
29
|
+
objects: ShareListItem[];
|
|
30
|
+
}
|
|
31
|
+
/** DI seam for tests — override the real HTTP GET of the JSON listing route. */
|
|
32
|
+
export type ListingFetchFn = (url: string) => Promise<{
|
|
33
|
+
status: number;
|
|
34
|
+
contentType: string;
|
|
35
|
+
body: string;
|
|
36
|
+
}>;
|
|
37
|
+
/** Parse the Worker's listing JSON into a validated result, failing loud (with the
|
|
38
|
+
* outdated-template hint) on any body that isn't the expected shape — an old Worker
|
|
39
|
+
* serves the HTML gallery for a non-empty namespace, which must not be silently
|
|
40
|
+
* accepted as "you have published nothing". */
|
|
41
|
+
export declare function parseShareListing(user: string, body: string): ShareListResult;
|
|
42
|
+
/** Fetch and parse the machine-readable listing of the caller's namespace from the
|
|
43
|
+
* Worker's `?format=json` route. Fails loud when share was never configured, when
|
|
44
|
+
* the deployed template is known-outdated (RUSH-2449 templateHash), or when the
|
|
45
|
+
* live response proves the route is absent (404 or a non-JSON 200 = the old HTML
|
|
46
|
+
* gallery) — never a silent empty/wrong result. */
|
|
47
|
+
export declare function runShareList(opts?: {
|
|
48
|
+
githubUser?: string;
|
|
49
|
+
config?: ShareConfig;
|
|
50
|
+
fetchListing?: ListingFetchFn;
|
|
51
|
+
}): Promise<ShareListResult>;
|
|
52
|
+
export declare function formatShareList(result: ShareListResult, json?: boolean): string;
|
|
6
53
|
export declare function formatShareDeleteResult(result: DeleteShareResult, json?: boolean): string;
|
|
7
54
|
interface ShareDeleteCliOpts {
|
|
8
55
|
keepCover?: boolean;
|
|
@@ -33,6 +80,26 @@ export declare function runShareProvision(opts: {
|
|
|
33
80
|
analyticsToken?: string;
|
|
34
81
|
request?: CloudflareRequester;
|
|
35
82
|
}): Promise<void>;
|
|
83
|
+
export interface ShareUpdateResult {
|
|
84
|
+
updated: boolean;
|
|
85
|
+
templateHash: string;
|
|
86
|
+
baseUrl: string;
|
|
87
|
+
workerName: string;
|
|
88
|
+
}
|
|
89
|
+
/** Re-deploy the Worker script on an ALREADY-provisioned endpoint to match the
|
|
90
|
+
* current `worker-template.ts`. Reuses the existing account/worker/bucket and
|
|
91
|
+
* write token from `readShareConfig()`/the `share` bundle — never creates a
|
|
92
|
+
* bucket, touches routes/domains, or regenerates the token (see
|
|
93
|
+
* `updateWorker` in `lib/share/provision.ts` for how the token survives the
|
|
94
|
+
* re-upload). Idempotent: no-ops when the deployed hash already matches
|
|
95
|
+
* unless `force`. */
|
|
96
|
+
export declare function runShareUpdate(opts?: {
|
|
97
|
+
bundle?: string;
|
|
98
|
+
account?: string;
|
|
99
|
+
token?: string;
|
|
100
|
+
force?: boolean;
|
|
101
|
+
request?: CloudflareRequester;
|
|
102
|
+
}): Promise<ShareUpdateResult>;
|
|
36
103
|
/** Join an existing share endpoint (no provisioning): prompt for the endpoint
|
|
37
104
|
* details + write token and persist them. Shared by `agents share join` and the
|
|
38
105
|
* unified `agents setup share` wizard. */
|
package/dist/commands/share.js
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
// Worker, and get a shareable link (~$0). See apps/cli/docs/share.md.
|
|
3
3
|
import { existsSync } from 'node:fs';
|
|
4
4
|
import chalk from 'chalk';
|
|
5
|
-
import { DEFAULT_BUCKET_NAME, DEFAULT_CF_BUNDLE, DEFAULT_SHARE_DOMAIN, DEFAULT_WORKER_NAME, generateWriteToken, readCloudflareCreds, readShareConfig, readWriteTokenEnv, readWriteTokenFromBundle, storeWriteToken, writeShareConfig, } from '../lib/share/config.js';
|
|
6
|
-
import { addCustomDomain, configureBucketLifecycle, createBucket, deployWorker, enableWorkersDev, findZoneId, setWorkerSecret, } from '../lib/share/provision.js';
|
|
7
|
-
import { publishFile } from '../lib/share/publish.js';
|
|
5
|
+
import { DEFAULT_BUCKET_NAME, DEFAULT_CF_BUNDLE, DEFAULT_SHARE_DOMAIN, DEFAULT_WORKER_NAME, generateWriteToken, readCloudflareCreds, readShareConfig, readWriteToken, readWriteTokenEnv, readWriteTokenFromBundle, storeWriteToken, writeShareConfig, } from '../lib/share/config.js';
|
|
6
|
+
import { addCustomDomain, configureBucketLifecycle, createBucket, deployWorker, enableWorkersDev, findZoneId, hashWorkerScript, updateWorker, setWorkerSecret, } from '../lib/share/provision.js';
|
|
7
|
+
import { publishFile, resolveShareUsername } from '../lib/share/publish.js';
|
|
8
8
|
import { deleteShare } from '../lib/share/delete.js';
|
|
9
9
|
import { renderWorkerScript } from '../lib/share/worker-template.js';
|
|
10
10
|
import { analyticsEnabled } from '../lib/share/analytics.js';
|
|
@@ -18,8 +18,132 @@ export function formatSharePublishResult(result, json = false) {
|
|
|
18
18
|
lines.push(chalk.dim(` cover ${result.coverUrl}`));
|
|
19
19
|
if (result.expiresAt)
|
|
20
20
|
lines.push(chalk.dim(` expires ${new Date(result.expiresAt).toLocaleString()}`));
|
|
21
|
+
else
|
|
22
|
+
lines.push(chalk.dim(' expires never'));
|
|
23
|
+
if (result.unlisted)
|
|
24
|
+
lines.push(chalk.dim(' unlisted (hidden from gallery / share list)'));
|
|
21
25
|
return lines.join('\n');
|
|
22
26
|
}
|
|
27
|
+
/** Compare the configured endpoint's last-deployed template hash against the
|
|
28
|
+
* hash of the CURRENT `worker-template.ts` render. A config with no recorded
|
|
29
|
+
* hash (every endpoint provisioned before this field existed) is "unknown" —
|
|
30
|
+
* never "current" or "outdated", since there is nothing to compare against. */
|
|
31
|
+
export function shareTemplateStatus(cfg) {
|
|
32
|
+
if (!cfg.templateHash)
|
|
33
|
+
return 'unknown';
|
|
34
|
+
return cfg.templateHash === hashWorkerScript(renderWorkerScript()) ? 'current' : 'outdated';
|
|
35
|
+
}
|
|
36
|
+
/** Shown whenever the deployed Worker has no `?format=json` listing route — an
|
|
37
|
+
* endpoint provisioned before this feature. Points at the RUSH-2449 update path
|
|
38
|
+
* (`agents share update`) instead of letting the caller hit a 404 or an HTML body
|
|
39
|
+
* and get a confusing parse error. */
|
|
40
|
+
const OUTDATED_TEMPLATE_HINT = 'Your deployed share Worker has no machine-readable listing route — it predates `agents share list`. ' +
|
|
41
|
+
'Run `agents share update` to deploy the current Worker template, then retry (`agents share status` shows whether an update is due).';
|
|
42
|
+
async function defaultListingFetch(url) {
|
|
43
|
+
const res = await fetch(url, { headers: { accept: 'application/json' } });
|
|
44
|
+
return { status: res.status, contentType: res.headers.get('content-type') ?? '', body: await res.text() };
|
|
45
|
+
}
|
|
46
|
+
/** Parse the Worker's listing JSON into a validated result, failing loud (with the
|
|
47
|
+
* outdated-template hint) on any body that isn't the expected shape — an old Worker
|
|
48
|
+
* serves the HTML gallery for a non-empty namespace, which must not be silently
|
|
49
|
+
* accepted as "you have published nothing". */
|
|
50
|
+
export function parseShareListing(user, body) {
|
|
51
|
+
let data;
|
|
52
|
+
try {
|
|
53
|
+
data = JSON.parse(body);
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
throw new Error(OUTDATED_TEMPLATE_HINT);
|
|
57
|
+
}
|
|
58
|
+
const objectsRaw = data?.objects;
|
|
59
|
+
if (!data || typeof data !== 'object' || !Array.isArray(objectsRaw)) {
|
|
60
|
+
throw new Error(OUTDATED_TEMPLATE_HINT);
|
|
61
|
+
}
|
|
62
|
+
const objects = objectsRaw.map((o) => {
|
|
63
|
+
const item = o;
|
|
64
|
+
return {
|
|
65
|
+
slug: String(item.slug ?? ''),
|
|
66
|
+
url: String(item.url ?? ''),
|
|
67
|
+
size: typeof item.size === 'number' ? item.size : 0,
|
|
68
|
+
contentType: item.contentType == null ? null : String(item.contentType),
|
|
69
|
+
publishedAt: String(item.publishedAt ?? ''),
|
|
70
|
+
expiresAt: item.expiresAt == null ? null : String(item.expiresAt),
|
|
71
|
+
};
|
|
72
|
+
});
|
|
73
|
+
return { user, count: objects.length, objects };
|
|
74
|
+
}
|
|
75
|
+
/** Fetch and parse the machine-readable listing of the caller's namespace from the
|
|
76
|
+
* Worker's `?format=json` route. Fails loud when share was never configured, when
|
|
77
|
+
* the deployed template is known-outdated (RUSH-2449 templateHash), or when the
|
|
78
|
+
* live response proves the route is absent (404 or a non-JSON 200 = the old HTML
|
|
79
|
+
* gallery) — never a silent empty/wrong result. */
|
|
80
|
+
export async function runShareList(opts = {}) {
|
|
81
|
+
const cfg = opts.config ?? readShareConfig();
|
|
82
|
+
if (!cfg) {
|
|
83
|
+
throw new Error("Not set up yet. Run 'agents share setup' (provision your own endpoint) or 'agents share join' (use an existing one).");
|
|
84
|
+
}
|
|
85
|
+
// A known-stale template can't have the listing route — say so before any network
|
|
86
|
+
// call. 'unknown' (provisioned before templateHash tracking) is attempted, then
|
|
87
|
+
// caught by the response checks below if the route turns out to be absent.
|
|
88
|
+
const templateStatus = shareTemplateStatus(cfg);
|
|
89
|
+
if (templateStatus === 'outdated') {
|
|
90
|
+
throw new Error(OUTDATED_TEMPLATE_HINT);
|
|
91
|
+
}
|
|
92
|
+
const user = await resolveShareUsername({ githubUser: opts.githubUser });
|
|
93
|
+
const listUrl = `${cfg.baseUrl.replace(/\/+$/, '')}/${encodeURIComponent(user)}?format=json`;
|
|
94
|
+
const fetchListing = opts.fetchListing ?? defaultListingFetch;
|
|
95
|
+
const res = await fetchListing(listUrl);
|
|
96
|
+
if (res.status === 404) {
|
|
97
|
+
// A single-segment path 404s either because the namespace is genuinely empty
|
|
98
|
+
// (current template — the listing route gates on the namespace holding objects,
|
|
99
|
+
// so a namespace with nothing falls through to an object GET) OR because the
|
|
100
|
+
// endpoint predates the listing route entirely. The recorded templateHash
|
|
101
|
+
// disambiguates: a 'current' template HAS the route, so its 404 means an empty
|
|
102
|
+
// namespace ("nothing published"); otherwise the route may be absent, so point
|
|
103
|
+
// at `agents share update`.
|
|
104
|
+
if (templateStatus === 'current') {
|
|
105
|
+
return { user, count: 0, objects: [] };
|
|
106
|
+
}
|
|
107
|
+
throw new Error(OUTDATED_TEMPLATE_HINT);
|
|
108
|
+
}
|
|
109
|
+
if (res.status !== 200) {
|
|
110
|
+
throw new Error(`Listing failed (${res.status}) for ${listUrl}. Check the endpoint is reachable, or that 'agents share setup' completed.`);
|
|
111
|
+
}
|
|
112
|
+
if (!/application\/json/i.test(res.contentType)) {
|
|
113
|
+
// A 200 that isn't JSON means the old Worker ignored ?format=json and served
|
|
114
|
+
// the HTML gallery — the deployed template is outdated.
|
|
115
|
+
throw new Error(OUTDATED_TEMPLATE_HINT);
|
|
116
|
+
}
|
|
117
|
+
return parseShareListing(user, res.body);
|
|
118
|
+
}
|
|
119
|
+
/** Human-readable bytes, e.g. `1.2 KB`, `640 B`. */
|
|
120
|
+
function formatBytes(n) {
|
|
121
|
+
if (n < 1024)
|
|
122
|
+
return `${n} B`;
|
|
123
|
+
const units = ['KB', 'MB', 'GB'];
|
|
124
|
+
let value = n / 1024;
|
|
125
|
+
let unit = 0;
|
|
126
|
+
while (value >= 1024 && unit < units.length - 1) {
|
|
127
|
+
value /= 1024;
|
|
128
|
+
unit++;
|
|
129
|
+
}
|
|
130
|
+
return `${value < 10 ? value.toFixed(1) : Math.round(value)} ${units[unit]}`;
|
|
131
|
+
}
|
|
132
|
+
export function formatShareList(result, json = false) {
|
|
133
|
+
if (json)
|
|
134
|
+
return JSON.stringify(result, null, 2);
|
|
135
|
+
if (result.count === 0) {
|
|
136
|
+
return chalk.dim(`No active pages published under @${result.user}.`);
|
|
137
|
+
}
|
|
138
|
+
const header = chalk.bold(`@${result.user}`) +
|
|
139
|
+
chalk.dim(` ${result.count} published ${result.count === 1 ? 'page' : 'pages'}`);
|
|
140
|
+
const rows = result.objects.map((o) => {
|
|
141
|
+
const when = o.publishedAt ? o.publishedAt.slice(0, 10) : 'unknown';
|
|
142
|
+
const meta = `${when} · ${formatBytes(o.size)}${o.expiresAt ? ` · expires ${o.expiresAt.slice(0, 10)}` : ''}`;
|
|
143
|
+
return `${chalk.cyan(o.slug)} ${chalk.dim(meta)}\n ${chalk.green(o.url)}`;
|
|
144
|
+
});
|
|
145
|
+
return [header, ...rows].join('\n');
|
|
146
|
+
}
|
|
23
147
|
export function formatShareDeleteResult(result, json = false) {
|
|
24
148
|
if (json)
|
|
25
149
|
return JSON.stringify(result, null, 2);
|
|
@@ -105,7 +229,10 @@ export function registerShareCommands(program) {
|
|
|
105
229
|
.argument('[file]', 'file to publish (HTML or any static asset)')
|
|
106
230
|
.option('--slug <slug>', 'custom URL slug under your namespace (default: <project>-<feature>-<hash>)')
|
|
107
231
|
.option('--github-user <user>', 'GitHub username for the share namespace (default: resolved from gh/git config)')
|
|
108
|
-
.option('--expire <spec>',
|
|
232
|
+
.option('--expire <spec>', "auto-expire (default 30d). e.g. 12h, 30d, 2026-08-01, or 'never'")
|
|
233
|
+
.option('--unlisted', 'hide from the public gallery and `agents share list` (direct URL still works)')
|
|
234
|
+
.option('--private', 'alias of --unlisted')
|
|
235
|
+
.option('--force', 'publish even when the file contains emails or credential-shaped strings')
|
|
109
236
|
.option('--no-cover', 'skip the OG preview image (HTML pages get one by default)')
|
|
110
237
|
.option('--no-analytics', 'skip injecting the Cloudflare Web Analytics beacon')
|
|
111
238
|
.option('--json', 'emit machine-readable publish result for plan-render hooks and scripts')
|
|
@@ -120,14 +247,16 @@ export function registerShareCommands(program) {
|
|
|
120
247
|
return;
|
|
121
248
|
}
|
|
122
249
|
try {
|
|
123
|
-
const
|
|
250
|
+
const result = await publishFile(file, {
|
|
124
251
|
slug: opts.slug,
|
|
125
252
|
githubUser: opts.githubUser,
|
|
126
253
|
expire: opts.expire,
|
|
254
|
+
unlisted: opts.unlisted === true || opts.private === true,
|
|
255
|
+
force: opts.force,
|
|
127
256
|
cover: opts.cover,
|
|
128
257
|
analytics: opts.analytics,
|
|
129
258
|
});
|
|
130
|
-
console.log(formatSharePublishResult(
|
|
259
|
+
console.log(formatSharePublishResult(result, Boolean(opts.json)));
|
|
131
260
|
}
|
|
132
261
|
catch (e) {
|
|
133
262
|
console.error(chalk.red(e.message));
|
|
@@ -136,17 +265,33 @@ export function registerShareCommands(program) {
|
|
|
136
265
|
});
|
|
137
266
|
setHelpSections(shareCmd, {
|
|
138
267
|
examples: `
|
|
139
|
-
# Publish an HTML file —
|
|
268
|
+
# Publish an HTML file — auto OG cover, default 30d expiry, shareable link
|
|
140
269
|
agents share ./out/plan.html
|
|
141
270
|
|
|
142
|
-
#
|
|
143
|
-
agents share ./out/report.html --
|
|
271
|
+
# Hide from the public gallery (direct URL still works) and expire sooner
|
|
272
|
+
agents share ./out/report.html --unlisted --expire 12h
|
|
273
|
+
|
|
274
|
+
# Permanent public page (opt out of the default 30d expiry)
|
|
275
|
+
agents share ./out/landing.html --slug landing --expire never
|
|
276
|
+
|
|
277
|
+
# Custom slug, expiring in 7 days
|
|
278
|
+
agents share ./out/report.html --slug q3-report --expire 7d
|
|
144
279
|
${SHARE_DELETE_EXAMPLES}
|
|
145
280
|
# One-time setup (or join an existing endpoint)
|
|
146
281
|
agents share setup
|
|
147
282
|
agents share join https://share.agents-cli.sh
|
|
283
|
+
|
|
284
|
+
# Push a worker-template.ts change out to an already-provisioned endpoint
|
|
285
|
+
agents share update
|
|
286
|
+
`,
|
|
287
|
+
notes: `
|
|
288
|
+
Default expiry is 30d so an accidental publish decays. Pass --expire never for
|
|
289
|
+
a permanent link. --unlisted / --private hides the page from the public gallery
|
|
290
|
+
and agents share list; the direct URL is still world-readable (unlisted, not
|
|
291
|
+
secret). A pre-publish scan refuses emails and credential-shaped strings
|
|
292
|
+
unless --force is passed.
|
|
293
|
+
${SHARE_DELETE_NOTES}
|
|
148
294
|
`,
|
|
149
|
-
notes: SHARE_DELETE_NOTES,
|
|
150
295
|
});
|
|
151
296
|
const shareDeleteCmd = registerShareDeleteOptions(shareCmd
|
|
152
297
|
.command('delete <targets...>')
|
|
@@ -195,6 +340,47 @@ ${SHARE_DELETE_EXAMPLES}
|
|
|
195
340
|
process.exitCode = 1;
|
|
196
341
|
}
|
|
197
342
|
});
|
|
343
|
+
const shareUpdateCmd = shareCmd
|
|
344
|
+
.command('update')
|
|
345
|
+
.description('Re-deploy the Worker script to the current template on an already-provisioned endpoint (idempotent).')
|
|
346
|
+
.option('--bundle <name>', 'secrets bundle holding the Cloudflare API token', DEFAULT_CF_BUNDLE)
|
|
347
|
+
.option('--account <id>', 'Cloudflare account id override (default: the configured endpoint\'s account)')
|
|
348
|
+
.option('--token <t>', 'Cloudflare API token (else read from --bundle)')
|
|
349
|
+
.option('--force', 're-deploy even if the deployed template already matches')
|
|
350
|
+
.option('--json', 'emit a machine-readable result')
|
|
351
|
+
.action(async (opts) => {
|
|
352
|
+
try {
|
|
353
|
+
const result = await runShareUpdate(opts);
|
|
354
|
+
if (opts.json) {
|
|
355
|
+
console.log(JSON.stringify(result, null, 2));
|
|
356
|
+
return;
|
|
357
|
+
}
|
|
358
|
+
if (result.updated) {
|
|
359
|
+
console.log(chalk.green(`Worker '${result.workerName}' updated → template ${result.templateHash.slice(0, 12)}…`));
|
|
360
|
+
}
|
|
361
|
+
else {
|
|
362
|
+
console.log(chalk.dim(`Worker '${result.workerName}' already matches the current template — no-op.`));
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
catch (e) {
|
|
366
|
+
console.error(chalk.red(e.message));
|
|
367
|
+
process.exitCode = 1;
|
|
368
|
+
}
|
|
369
|
+
});
|
|
370
|
+
setHelpSections(shareUpdateCmd, {
|
|
371
|
+
examples: `
|
|
372
|
+
# Push a worker-template.ts change out to your already-provisioned endpoint
|
|
373
|
+
agents share update
|
|
374
|
+
|
|
375
|
+
# Force a re-deploy even though the template hash already matches
|
|
376
|
+
agents share update --force
|
|
377
|
+
`,
|
|
378
|
+
notes: `
|
|
379
|
+
Reuses the existing account/worker/bucket from 'agents share status' and the
|
|
380
|
+
existing write token — it never re-provisions a bucket, touches routes, or
|
|
381
|
+
regenerates the token. See 'agents share status' for whether an update is due.
|
|
382
|
+
`,
|
|
383
|
+
});
|
|
198
384
|
shareCmd
|
|
199
385
|
.command('status')
|
|
200
386
|
.description('Show the configured share endpoint and namespace.')
|
|
@@ -209,6 +395,48 @@ ${SHARE_DELETE_EXAMPLES}
|
|
|
209
395
|
const user = await resolveGitHubUsername();
|
|
210
396
|
console.log(`${chalk.bold('namespace')} ${user ? chalk.cyan(`${cfg.baseUrl}/${user}`) : chalk.yellow('unknown — set gh auth or github.user')}`);
|
|
211
397
|
console.log(`${chalk.bold('analytics')} ${analyticsEnabled(cfg) ? chalk.green('enabled') : chalk.dim('not configured')}`);
|
|
398
|
+
const templateStatus = shareTemplateStatus(cfg);
|
|
399
|
+
const templateLabel = templateStatus === 'current'
|
|
400
|
+
? chalk.green('current')
|
|
401
|
+
: templateStatus === 'outdated'
|
|
402
|
+
? chalk.yellow('outdated — run `agents share update`')
|
|
403
|
+
: chalk.dim("unknown — provisioned before version tracking; run `agents share update` to adopt it");
|
|
404
|
+
console.log(`${chalk.bold('template')} ${templateLabel}`);
|
|
405
|
+
});
|
|
406
|
+
const shareListCmd = shareCmd
|
|
407
|
+
.command('list')
|
|
408
|
+
.description("List the pages you've published to your share namespace (human table; --json for scripts).")
|
|
409
|
+
.option('--github-user <user>', 'GitHub username whose namespace to list (default: resolved from gh/git config)')
|
|
410
|
+
.option('--json', 'emit the machine-readable listing (slug, url, size, contentType, publishedAt, expiresAt)')
|
|
411
|
+
.action(async (opts) => {
|
|
412
|
+
try {
|
|
413
|
+
const result = await runShareList({ githubUser: opts.githubUser });
|
|
414
|
+
console.log(formatShareList(result, Boolean(opts.json)));
|
|
415
|
+
}
|
|
416
|
+
catch (e) {
|
|
417
|
+
console.error(chalk.red(e.message));
|
|
418
|
+
process.exitCode = 1;
|
|
419
|
+
}
|
|
420
|
+
});
|
|
421
|
+
setHelpSections(shareListCmd, {
|
|
422
|
+
examples: `
|
|
423
|
+
# Everything you've published, newest first
|
|
424
|
+
agents share list
|
|
425
|
+
|
|
426
|
+
# Machine-readable — e.g. pull every still-public URL with jq
|
|
427
|
+
agents share list --json | jq -r '.objects[].url'
|
|
428
|
+
|
|
429
|
+
# List another namespace
|
|
430
|
+
agents share list --github-user octocat
|
|
431
|
+
`,
|
|
432
|
+
notes: `
|
|
433
|
+
Lists the ACTIVE pages in your namespace — expired links and the sibling .png OG
|
|
434
|
+
covers are omitted (it mirrors the public gallery). It reads the endpoint's JSON
|
|
435
|
+
listing route, which ships with the current Worker template. If your deployed
|
|
436
|
+
Worker predates this feature the command says so and points you at 'agents share
|
|
437
|
+
update' (RUSH-2449) rather than returning a wrong or empty result — see 'agents
|
|
438
|
+
share status' for whether an update is due.
|
|
439
|
+
`,
|
|
212
440
|
});
|
|
213
441
|
shareCmd
|
|
214
442
|
.command('analytics')
|
|
@@ -253,6 +481,7 @@ export async function runShareProvision(opts) {
|
|
|
253
481
|
const bucketName = opts.bucket;
|
|
254
482
|
const token = generateWriteToken();
|
|
255
483
|
const requestedDomain = cleanHostname(opts.domain) ?? DEFAULT_SHARE_DOMAIN;
|
|
484
|
+
const script = renderWorkerScript();
|
|
256
485
|
const spin = ora('Provisioning on Cloudflare…').start();
|
|
257
486
|
try {
|
|
258
487
|
const provisionOpts = opts.request ? { request: opts.request } : {};
|
|
@@ -260,7 +489,7 @@ export async function runShareProvision(opts) {
|
|
|
260
489
|
spin.text = `R2 bucket '${bucketName}' ready`;
|
|
261
490
|
await configureBucketLifecycle(apiToken, accountId, bucketName, provisionOpts);
|
|
262
491
|
spin.text = `R2 bucket '${bucketName}' lifecycle ready`;
|
|
263
|
-
await deployWorker(apiToken, accountId, workerName,
|
|
492
|
+
await deployWorker(apiToken, accountId, workerName, script, bucketName, provisionOpts);
|
|
264
493
|
spin.text = `Worker '${workerName}' deployed`;
|
|
265
494
|
await setWorkerSecret(apiToken, accountId, workerName, token, provisionOpts);
|
|
266
495
|
spin.text = `Worker '${workerName}' write token set`;
|
|
@@ -280,7 +509,15 @@ export async function runShareProvision(opts) {
|
|
|
280
509
|
}
|
|
281
510
|
}
|
|
282
511
|
spin.succeed('Provisioned');
|
|
283
|
-
const cfg = {
|
|
512
|
+
const cfg = {
|
|
513
|
+
baseUrl,
|
|
514
|
+
accountId,
|
|
515
|
+
workerName,
|
|
516
|
+
bucketName,
|
|
517
|
+
domain,
|
|
518
|
+
analyticsToken: opts.analyticsToken,
|
|
519
|
+
templateHash: hashWorkerScript(script),
|
|
520
|
+
};
|
|
284
521
|
writeShareConfig(cfg);
|
|
285
522
|
storeWriteToken(token);
|
|
286
523
|
console.log(chalk.green(`\nShare endpoint ready → ${chalk.bold(baseUrl)}`));
|
|
@@ -292,6 +529,32 @@ export async function runShareProvision(opts) {
|
|
|
292
529
|
throw e;
|
|
293
530
|
}
|
|
294
531
|
}
|
|
532
|
+
/** Re-deploy the Worker script on an ALREADY-provisioned endpoint to match the
|
|
533
|
+
* current `worker-template.ts`. Reuses the existing account/worker/bucket and
|
|
534
|
+
* write token from `readShareConfig()`/the `share` bundle — never creates a
|
|
535
|
+
* bucket, touches routes/domains, or regenerates the token (see
|
|
536
|
+
* `updateWorker` in `lib/share/provision.ts` for how the token survives the
|
|
537
|
+
* re-upload). Idempotent: no-ops when the deployed hash already matches
|
|
538
|
+
* unless `force`. */
|
|
539
|
+
export async function runShareUpdate(opts = {}) {
|
|
540
|
+
const cfg = readShareConfig();
|
|
541
|
+
if (!cfg) {
|
|
542
|
+
throw new Error("Not configured. Run 'agents share setup' (to provision) or 'agents share join' first.");
|
|
543
|
+
}
|
|
544
|
+
const { apiToken, accountId: acctFromBundle } = readCloudflareCreds(opts.bundle ?? DEFAULT_CF_BUNDLE, {
|
|
545
|
+
apiToken: opts.token,
|
|
546
|
+
accountId: opts.account,
|
|
547
|
+
});
|
|
548
|
+
const accountId = opts.account || acctFromBundle || cfg.accountId;
|
|
549
|
+
const writeToken = readWriteToken();
|
|
550
|
+
const script = renderWorkerScript();
|
|
551
|
+
const provisionOpts = { ...(opts.request ? { request: opts.request } : {}), force: opts.force };
|
|
552
|
+
const result = await updateWorker(apiToken, accountId, cfg.workerName, cfg.bucketName, script, writeToken, cfg.templateHash, provisionOpts);
|
|
553
|
+
if (!result.skipped) {
|
|
554
|
+
writeShareConfig({ ...cfg, templateHash: result.templateHash });
|
|
555
|
+
}
|
|
556
|
+
return { updated: !result.skipped, templateHash: result.templateHash, baseUrl: cfg.baseUrl, workerName: cfg.workerName };
|
|
557
|
+
}
|
|
295
558
|
function cleanHostname(domain) {
|
|
296
559
|
const raw = domain?.trim().replace(/\/+$/, '');
|
|
297
560
|
if (!raw)
|
package/dist/commands/skills.js
CHANGED
|
@@ -406,17 +406,6 @@ Examples:
|
|
|
406
406
|
console.log(chalk.gray('Central source unchanged. Skills will re-sync on next agent launch.'));
|
|
407
407
|
}
|
|
408
408
|
});
|
|
409
|
-
// `skills sync` is gone — sync runs automatically when the agent launches.
|
|
410
|
-
skillsCmd
|
|
411
|
-
.command('sync', { hidden: true })
|
|
412
|
-
.allowUnknownOption()
|
|
413
|
-
.allowExcessArguments()
|
|
414
|
-
.action(() => {
|
|
415
|
-
console.error(chalk.red('"agents skills sync" is gone.'));
|
|
416
|
-
console.error(chalk.gray('Sync runs automatically when you launch the agent.'));
|
|
417
|
-
console.error(chalk.gray('To remove orphans, use: agents prune cleanup skills'));
|
|
418
|
-
process.exit(1);
|
|
419
|
-
});
|
|
420
409
|
// `skills prune` moved to the top-level `agents prune cleanup` command.
|
|
421
410
|
skillsCmd
|
|
422
411
|
.command('prune', { hidden: true })
|
|
@@ -82,7 +82,7 @@ export function registerSnapshotCommand(program) {
|
|
|
82
82
|
# Fleet-wide active sessions (matches sessions --active scope)
|
|
83
83
|
agents snapshot --json --all-hosts
|
|
84
84
|
|
|
85
|
-
# Inventory for one harness only (
|
|
85
|
+
# Inventory for one harness only (an AGI EXT-style usage poll)
|
|
86
86
|
agents snapshot --json --agent claude
|
|
87
87
|
|
|
88
88
|
# Run the whole snapshot on another device
|
package/dist/commands/ssh.d.ts
CHANGED
|
@@ -11,6 +11,8 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import type { Command } from 'commander';
|
|
13
13
|
import { type FanOutDeviceTarget } from '../lib/devices/fleet.js';
|
|
14
|
+
import type { AgentId } from '../lib/types.js';
|
|
15
|
+
import { type HostHarnessResult } from '../lib/devices/harness-inventory.js';
|
|
14
16
|
import { type CrabboxBox } from '../lib/crabbox/cli.js';
|
|
15
17
|
/**
|
|
16
18
|
* Live "Leased boxes" section for `agents devices` (F4, RUSH-1923), computed
|
|
@@ -43,5 +45,21 @@ export declare function showLeasedBoxesSection(opts: {
|
|
|
43
45
|
* instead of reimplementing the logic.
|
|
44
46
|
*/
|
|
45
47
|
export declare function raceFleetPingDeadline<T, Target extends FanOutDeviceTarget>(fanOut: Promise<import('../lib/devices/fleet.js').FanOutDeviceResult<T>[]>, remoteTargets: Target[], overallTimeoutMs: number): Promise<import('../lib/devices/fleet.js').FanOutDeviceResult<T>[]>;
|
|
48
|
+
export interface HarnessInventoryOpts {
|
|
49
|
+
agents?: AgentId[];
|
|
50
|
+
devices?: string[];
|
|
51
|
+
refresh?: boolean;
|
|
52
|
+
json?: boolean;
|
|
53
|
+
local?: boolean;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Gather harness rows across the fleet: THIS host in process, every reachable
|
|
57
|
+
* peer over SSH. Shared by both `harnesses` and `accounts` (they differ only in
|
|
58
|
+
* how the rows are rendered). Honors an optional `--device` allowlist on both
|
|
59
|
+
* the local and remote rows. Bounded by the same per-device + overall deadlines
|
|
60
|
+
* as `fleet ping`, so one unreachable box can never stall the glance.
|
|
61
|
+
*/
|
|
62
|
+
export declare function collectFleetHarnesses(opts: HarnessInventoryOpts): Promise<HostHarnessResult[]>;
|
|
63
|
+
export declare function runDevicesAccounts(opts: HarnessInventoryOpts): Promise<void>;
|
|
46
64
|
/** Register both `agents ssh` and `agents devices`. */
|
|
47
65
|
export declare function registerSshCommands(program: Command): void;
|