@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
package/dist/commands/share.js
CHANGED
|
@@ -2,12 +2,14 @@
|
|
|
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
|
+
import { deleteShare } from '../lib/share/delete.js';
|
|
8
9
|
import { renderWorkerScript } from '../lib/share/worker-template.js';
|
|
9
10
|
import { analyticsEnabled } from '../lib/share/analytics.js';
|
|
10
11
|
import { resolveGitHubUsername } from '../lib/git.js';
|
|
12
|
+
import { setHelpSections } from '../lib/help.js';
|
|
11
13
|
export function formatSharePublishResult(result, json = false) {
|
|
12
14
|
if (json)
|
|
13
15
|
return JSON.stringify(result, null, 2);
|
|
@@ -16,8 +18,210 @@ export function formatSharePublishResult(result, json = false) {
|
|
|
16
18
|
lines.push(chalk.dim(` cover ${result.coverUrl}`));
|
|
17
19
|
if (result.expiresAt)
|
|
18
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)'));
|
|
19
25
|
return lines.join('\n');
|
|
20
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
|
+
}
|
|
147
|
+
export function formatShareDeleteResult(result, json = false) {
|
|
148
|
+
if (json)
|
|
149
|
+
return JSON.stringify(result, null, 2);
|
|
150
|
+
if (result.skipped)
|
|
151
|
+
return chalk.dim(`skipped — ${result.url} was already gone`);
|
|
152
|
+
const lines = [chalk.green(`deleted ${result.url}`)];
|
|
153
|
+
if (result.cover) {
|
|
154
|
+
lines.push(result.cover.existedBefore
|
|
155
|
+
? chalk.dim(` cover deleted ${result.cover.url}`)
|
|
156
|
+
: chalk.dim(` cover (none) ${result.cover.url}`));
|
|
157
|
+
}
|
|
158
|
+
return lines.join('\n');
|
|
159
|
+
}
|
|
160
|
+
/** Shared handler for `agents share delete <targets...>` and the top-level
|
|
161
|
+
* `agents unshare <targets...>` alias. Deletes each target independently and
|
|
162
|
+
* continues past a failed one (rm-style), reporting all results and exiting
|
|
163
|
+
* non-zero if any target failed to verify as gone.
|
|
164
|
+
*
|
|
165
|
+
* `deleteFn` is a DI seam for tests (defaults to the real `deleteShare`) — it is
|
|
166
|
+
* never exposed as a CLI flag, only used to inject a fake config/checker/deleter
|
|
167
|
+
* without touching the keychain or a live endpoint. */
|
|
168
|
+
export async function runShareDelete(targets, opts, deleteFn = deleteShare) {
|
|
169
|
+
const results = [];
|
|
170
|
+
for (const target of targets) {
|
|
171
|
+
try {
|
|
172
|
+
const result = await deleteFn(target, {
|
|
173
|
+
keepCover: opts.keepCover === true,
|
|
174
|
+
ifExists: opts.ifExists === true,
|
|
175
|
+
githubUser: opts.githubUser,
|
|
176
|
+
});
|
|
177
|
+
results.push({ target, result });
|
|
178
|
+
if (!opts.json)
|
|
179
|
+
console.log(formatShareDeleteResult(result));
|
|
180
|
+
}
|
|
181
|
+
catch (e) {
|
|
182
|
+
results.push({ target, error: e.message });
|
|
183
|
+
if (!opts.json)
|
|
184
|
+
console.error(chalk.red(`${target}: ${e.message}`));
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
if (opts.json) {
|
|
188
|
+
console.log(JSON.stringify(results, null, 2));
|
|
189
|
+
}
|
|
190
|
+
if (results.some((r) => r.error)) {
|
|
191
|
+
process.exitCode = 1;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
function registerShareDeleteOptions(cmd) {
|
|
195
|
+
return cmd
|
|
196
|
+
.option('--keep-cover', 'leave the sibling <slug>.png OG cover in place (default: delete it too)')
|
|
197
|
+
.option('--if-exists', 'treat an already-missing target as a no-op success instead of an error')
|
|
198
|
+
.option('--github-user <user>', 'GitHub username for resolving a bare-slug target (default: resolved from gh/git config)')
|
|
199
|
+
.option('--json', 'emit machine-readable results');
|
|
200
|
+
}
|
|
201
|
+
const SHARE_DELETE_EXAMPLES = `
|
|
202
|
+
# Delete by full URL — also takes down the sibling OG cover
|
|
203
|
+
agents share delete https://share.agents-cli.sh/octocat/my-plan-a1b2
|
|
204
|
+
|
|
205
|
+
# Delete by <user>/<slug>, or a bare slug in your own namespace
|
|
206
|
+
agents share delete octocat/my-plan-a1b2
|
|
207
|
+
agents unshare my-plan-a1b2
|
|
208
|
+
|
|
209
|
+
# Several at once
|
|
210
|
+
agents unshare my-plan-a1b2 old-report-9f3c
|
|
211
|
+
|
|
212
|
+
# Keep the cover image up (rare — you usually want both gone)
|
|
213
|
+
agents unshare my-plan-a1b2 --keep-cover
|
|
214
|
+
|
|
215
|
+
# Don't error if it's already gone
|
|
216
|
+
agents unshare my-plan-a1b2 --if-exists
|
|
217
|
+
`;
|
|
218
|
+
const SHARE_DELETE_NOTES = `
|
|
219
|
+
A follow-up GET is required to resolve 404 before this reports success — the
|
|
220
|
+
Worker's DELETE is idempotent and returns {"ok":true} even for a key that was
|
|
221
|
+
never there, so that response alone is never proof of a takedown.
|
|
222
|
+
|
|
223
|
+
agents share delete === agents unshare (same command, different name).
|
|
224
|
+
`;
|
|
21
225
|
export function registerShareCommands(program) {
|
|
22
226
|
const shareCmd = program
|
|
23
227
|
.command('share')
|
|
@@ -25,7 +229,10 @@ export function registerShareCommands(program) {
|
|
|
25
229
|
.argument('[file]', 'file to publish (HTML or any static asset)')
|
|
26
230
|
.option('--slug <slug>', 'custom URL slug under your namespace (default: <project>-<feature>-<hash>)')
|
|
27
231
|
.option('--github-user <user>', 'GitHub username for the share namespace (default: resolved from gh/git config)')
|
|
28
|
-
.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')
|
|
29
236
|
.option('--no-cover', 'skip the OG preview image (HTML pages get one by default)')
|
|
30
237
|
.option('--no-analytics', 'skip injecting the Cloudflare Web Analytics beacon')
|
|
31
238
|
.option('--json', 'emit machine-readable publish result for plan-render hooks and scripts')
|
|
@@ -40,20 +247,66 @@ export function registerShareCommands(program) {
|
|
|
40
247
|
return;
|
|
41
248
|
}
|
|
42
249
|
try {
|
|
43
|
-
const
|
|
250
|
+
const result = await publishFile(file, {
|
|
44
251
|
slug: opts.slug,
|
|
45
252
|
githubUser: opts.githubUser,
|
|
46
253
|
expire: opts.expire,
|
|
254
|
+
unlisted: opts.unlisted === true || opts.private === true,
|
|
255
|
+
force: opts.force,
|
|
47
256
|
cover: opts.cover,
|
|
48
257
|
analytics: opts.analytics,
|
|
49
258
|
});
|
|
50
|
-
console.log(formatSharePublishResult(
|
|
259
|
+
console.log(formatSharePublishResult(result, Boolean(opts.json)));
|
|
51
260
|
}
|
|
52
261
|
catch (e) {
|
|
53
262
|
console.error(chalk.red(e.message));
|
|
54
263
|
process.exitCode = 1;
|
|
55
264
|
}
|
|
56
265
|
});
|
|
266
|
+
setHelpSections(shareCmd, {
|
|
267
|
+
examples: `
|
|
268
|
+
# Publish an HTML file — auto OG cover, default 30d expiry, shareable link
|
|
269
|
+
agents share ./out/plan.html
|
|
270
|
+
|
|
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
|
|
279
|
+
${SHARE_DELETE_EXAMPLES}
|
|
280
|
+
# One-time setup (or join an existing endpoint)
|
|
281
|
+
agents share setup
|
|
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}
|
|
294
|
+
`,
|
|
295
|
+
});
|
|
296
|
+
const shareDeleteCmd = registerShareDeleteOptions(shareCmd
|
|
297
|
+
.command('delete <targets...>')
|
|
298
|
+
.description('Take down a published page (and by default its OG cover). Verifies the page 404s before reporting success. Top-level alias: agents unshare.'));
|
|
299
|
+
setHelpSections(shareDeleteCmd, { examples: SHARE_DELETE_EXAMPLES, notes: SHARE_DELETE_NOTES });
|
|
300
|
+
shareDeleteCmd.action(async (targets, opts) => {
|
|
301
|
+
await runShareDelete(targets, opts);
|
|
302
|
+
});
|
|
303
|
+
const unshareCmd = registerShareDeleteOptions(program
|
|
304
|
+
.command('unshare <targets...>')
|
|
305
|
+
.description('Alias of `agents share delete` — take down a published page (and by default its OG cover).'));
|
|
306
|
+
setHelpSections(unshareCmd, { examples: SHARE_DELETE_EXAMPLES, notes: SHARE_DELETE_NOTES });
|
|
307
|
+
unshareCmd.action(async (targets, opts) => {
|
|
308
|
+
await runShareDelete(targets, opts);
|
|
309
|
+
});
|
|
57
310
|
shareCmd
|
|
58
311
|
.command('setup')
|
|
59
312
|
.description('One-time: provision an R2 bucket + Worker on your Cloudflare and save the config.')
|
|
@@ -87,6 +340,47 @@ export function registerShareCommands(program) {
|
|
|
87
340
|
process.exitCode = 1;
|
|
88
341
|
}
|
|
89
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
|
+
});
|
|
90
384
|
shareCmd
|
|
91
385
|
.command('status')
|
|
92
386
|
.description('Show the configured share endpoint and namespace.')
|
|
@@ -101,6 +395,48 @@ export function registerShareCommands(program) {
|
|
|
101
395
|
const user = await resolveGitHubUsername();
|
|
102
396
|
console.log(`${chalk.bold('namespace')} ${user ? chalk.cyan(`${cfg.baseUrl}/${user}`) : chalk.yellow('unknown — set gh auth or github.user')}`);
|
|
103
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
|
+
`,
|
|
104
440
|
});
|
|
105
441
|
shareCmd
|
|
106
442
|
.command('analytics')
|
|
@@ -145,6 +481,7 @@ export async function runShareProvision(opts) {
|
|
|
145
481
|
const bucketName = opts.bucket;
|
|
146
482
|
const token = generateWriteToken();
|
|
147
483
|
const requestedDomain = cleanHostname(opts.domain) ?? DEFAULT_SHARE_DOMAIN;
|
|
484
|
+
const script = renderWorkerScript();
|
|
148
485
|
const spin = ora('Provisioning on Cloudflare…').start();
|
|
149
486
|
try {
|
|
150
487
|
const provisionOpts = opts.request ? { request: opts.request } : {};
|
|
@@ -152,7 +489,7 @@ export async function runShareProvision(opts) {
|
|
|
152
489
|
spin.text = `R2 bucket '${bucketName}' ready`;
|
|
153
490
|
await configureBucketLifecycle(apiToken, accountId, bucketName, provisionOpts);
|
|
154
491
|
spin.text = `R2 bucket '${bucketName}' lifecycle ready`;
|
|
155
|
-
await deployWorker(apiToken, accountId, workerName,
|
|
492
|
+
await deployWorker(apiToken, accountId, workerName, script, bucketName, provisionOpts);
|
|
156
493
|
spin.text = `Worker '${workerName}' deployed`;
|
|
157
494
|
await setWorkerSecret(apiToken, accountId, workerName, token, provisionOpts);
|
|
158
495
|
spin.text = `Worker '${workerName}' write token set`;
|
|
@@ -172,7 +509,15 @@ export async function runShareProvision(opts) {
|
|
|
172
509
|
}
|
|
173
510
|
}
|
|
174
511
|
spin.succeed('Provisioned');
|
|
175
|
-
const cfg = {
|
|
512
|
+
const cfg = {
|
|
513
|
+
baseUrl,
|
|
514
|
+
accountId,
|
|
515
|
+
workerName,
|
|
516
|
+
bucketName,
|
|
517
|
+
domain,
|
|
518
|
+
analyticsToken: opts.analyticsToken,
|
|
519
|
+
templateHash: hashWorkerScript(script),
|
|
520
|
+
};
|
|
176
521
|
writeShareConfig(cfg);
|
|
177
522
|
storeWriteToken(token);
|
|
178
523
|
console.log(chalk.green(`\nShare endpoint ready → ${chalk.bold(baseUrl)}`));
|
|
@@ -184,6 +529,32 @@ export async function runShareProvision(opts) {
|
|
|
184
529
|
throw e;
|
|
185
530
|
}
|
|
186
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
|
+
}
|
|
187
558
|
function cleanHostname(domain) {
|
|
188
559
|
const raw = domain?.trim().replace(/\/+$/, '');
|
|
189
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;
|