@phnx-labs/agents-cli 1.22.35 → 1.22.38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +708 -2
- package/README.md +83 -43
- package/dist/bin/agents +0 -0
- package/dist/bootstrap.d.ts +15 -0
- package/dist/bootstrap.js +1212 -0
- package/dist/commands/accounts.d.ts +4 -11
- package/dist/commands/accounts.js +159 -27
- package/dist/commands/artifacts-setup.d.ts +53 -0
- package/dist/commands/artifacts-setup.js +161 -0
- package/dist/commands/artifacts.d.ts +18 -0
- package/dist/commands/artifacts.js +58 -0
- package/dist/commands/attach.js +17 -4
- package/dist/commands/audit.d.ts +8 -8
- package/dist/commands/audit.js +57 -47
- package/dist/commands/browser.js +17 -11
- package/dist/commands/cloud.js +1 -1
- package/dist/commands/commands.js +0 -11
- package/dist/commands/computer-actions.js +33 -0
- package/dist/commands/computer-sessions-picker.d.ts +21 -0
- package/dist/commands/computer-sessions-picker.js +141 -0
- package/dist/commands/computer.d.ts +16 -0
- package/dist/commands/computer.js +37 -0
- package/dist/commands/config.d.ts +17 -0
- package/dist/commands/config.js +401 -0
- package/dist/commands/cp.d.ts +84 -0
- package/dist/commands/cp.js +231 -0
- package/dist/commands/daemon.js +243 -14
- package/dist/commands/detach-core.d.ts +1 -1
- package/dist/commands/detach-core.js +12 -2
- package/dist/commands/detach.js +1 -1
- package/dist/commands/doctor.js +64 -5
- package/dist/commands/events.d.ts +24 -12
- package/dist/commands/events.js +144 -28
- package/dist/commands/exec.js +86 -42
- package/dist/commands/feed.d.ts +1 -1
- package/dist/commands/feed.js +16 -8
- package/dist/commands/focus.d.ts +33 -1
- package/dist/commands/focus.js +177 -17
- package/dist/commands/funnel.d.ts +1 -1
- package/dist/commands/go.js +9 -8
- package/dist/commands/harness-wizard.d.ts +1 -0
- package/dist/commands/harness-wizard.js +18 -20
- package/dist/commands/harness.d.ts +2 -0
- package/dist/commands/harness.js +59 -26
- package/dist/commands/hooks.js +0 -11
- package/dist/commands/inspect.d.ts +94 -1
- package/dist/commands/inspect.js +866 -40
- package/dist/commands/lease.d.ts +4 -4
- package/dist/commands/lease.js +6 -6
- package/dist/commands/login.js +0 -13
- package/dist/commands/logs.d.ts +2 -2
- package/dist/commands/logs.js +2 -2
- package/dist/commands/mcp.js +7 -2
- package/dist/commands/memory.js +7 -2
- package/dist/commands/message.d.ts +1 -1
- package/dist/commands/message.js +37 -6
- package/dist/commands/models.js +71 -0
- package/dist/commands/monitors.d.ts +0 -1
- package/dist/commands/monitors.js +199 -16
- package/dist/commands/open.d.ts +18 -0
- package/dist/commands/open.js +57 -0
- package/dist/commands/packages.js +2 -107
- package/dist/commands/plugins.js +6 -3
- package/dist/commands/profiles.d.ts +1 -0
- package/dist/commands/profiles.js +16 -160
- package/dist/commands/projects.d.ts +28 -0
- package/dist/commands/projects.js +125 -5
- package/dist/commands/reconnect.js +9 -3
- package/dist/commands/repo.js +42 -1
- package/dist/commands/resource-view.d.ts +17 -0
- package/dist/commands/resource-view.js +36 -14
- package/dist/commands/resume.js +9 -2
- package/dist/commands/routines.d.ts +0 -2
- package/dist/commands/routines.js +473 -289
- package/dist/commands/secrets.js +52 -9
- package/dist/commands/sessions-export.d.ts +47 -0
- package/dist/commands/sessions-export.js +116 -6
- package/dist/commands/sessions-import.d.ts +17 -0
- package/dist/commands/sessions-import.js +114 -6
- package/dist/commands/sessions-migrate.d.ts +27 -0
- package/dist/commands/sessions-migrate.js +50 -9
- package/dist/commands/sessions-picker.js +23 -4
- package/dist/commands/sessions-resume.d.ts +5 -3
- package/dist/commands/sessions-resume.js +30 -8
- package/dist/commands/sessions-watch.d.ts +2 -0
- package/dist/commands/sessions-watch.js +53 -0
- package/dist/commands/sessions.d.ts +66 -3
- package/dist/commands/sessions.js +298 -47
- package/dist/commands/setup-browser.js +2 -2
- package/dist/commands/setup-mine.js +0 -1
- package/dist/commands/setup-preferences.js +1 -1
- package/dist/commands/setup.d.ts +5 -0
- package/dist/commands/setup.js +31 -5
- package/dist/commands/share.d.ts +87 -7
- package/dist/commands/share.js +320 -58
- package/dist/commands/skills.js +0 -11
- package/dist/commands/snapshot.js +1 -1
- package/dist/commands/ssh.d.ts +18 -0
- package/dist/commands/ssh.js +549 -210
- package/dist/commands/sync.d.ts +5 -0
- package/dist/commands/sync.js +212 -32
- package/dist/commands/teams.d.ts +13 -0
- package/dist/commands/teams.js +187 -30
- package/dist/commands/tickets.d.ts +2 -0
- package/dist/commands/tickets.js +43 -0
- package/dist/commands/update.js +2 -4
- package/dist/commands/usage.js +5 -3
- package/dist/commands/versions.js +11 -5
- package/dist/commands/view.js +15 -7
- package/dist/commands/webhook.d.ts +2 -2
- package/dist/commands/webhook.js +7 -7
- package/dist/index.d.ts +18 -2
- package/dist/index.js +53 -1264
- package/dist/lib/account-catalog.d.ts +18 -0
- package/dist/lib/account-catalog.js +38 -0
- package/dist/lib/account-provider-registry.d.ts +18 -0
- package/dist/lib/account-provider-registry.js +59 -0
- package/dist/lib/account-registry.d.ts +40 -0
- package/dist/lib/account-registry.js +239 -0
- package/dist/lib/account-schema.d.ts +44 -0
- package/dist/lib/account-schema.js +91 -0
- package/dist/lib/account-state-service.d.ts +21 -0
- package/dist/lib/account-state-service.js +60 -0
- package/dist/lib/activity.d.ts +1 -1
- package/dist/lib/activity.js +8 -1
- package/dist/lib/add-dir.d.ts +80 -0
- package/dist/lib/add-dir.js +241 -0
- package/dist/lib/agent-cli-commands.d.ts +11 -0
- package/dist/lib/agent-cli-commands.js +30 -0
- package/dist/lib/agents.js +44 -36
- package/dist/lib/answer-router.js +1 -1
- package/dist/lib/audit/log.d.ts +10 -27
- package/dist/lib/audit/log.js +20 -33
- package/dist/lib/auth-health.d.ts +9 -2
- package/dist/lib/auth-health.js +42 -9
- package/dist/lib/auto-pull-worker.js +7 -3
- package/dist/lib/auto-pull.d.ts +44 -3
- package/dist/lib/auto-pull.js +88 -5
- package/dist/lib/binary-shadow.d.ts +28 -0
- package/dist/lib/binary-shadow.js +121 -0
- package/dist/lib/brand.js +9 -3
- package/dist/lib/browser/hygiene.d.ts +90 -0
- package/dist/lib/browser/hygiene.js +146 -0
- package/dist/lib/browser/ipc.d.ts +30 -0
- package/dist/lib/browser/ipc.js +93 -4
- package/dist/lib/browser/profiles.d.ts +3 -2
- package/dist/lib/browser/profiles.js +65 -22
- package/dist/lib/browser/service.d.ts +79 -1
- package/dist/lib/browser/service.js +231 -14
- package/dist/lib/browser/sessions-list.d.ts +22 -2
- package/dist/lib/browser/sessions-list.js +54 -6
- package/dist/lib/browser/stream.d.ts +2 -0
- package/dist/lib/browser/stream.js +1 -0
- package/dist/lib/browser/types.d.ts +63 -1
- package/dist/lib/byok-usage.d.ts +9 -2
- package/dist/lib/byok-usage.js +133 -31
- package/dist/lib/cli-entry.d.ts +11 -0
- package/dist/lib/cli-entry.js +46 -0
- package/dist/lib/cloud/host.d.ts +1 -1
- package/dist/lib/cloud/host.js +2 -2
- package/dist/lib/cloud/registry.js +1 -1
- package/dist/lib/cloud/types.d.ts +1 -1
- package/dist/lib/commands.d.ts +2 -0
- package/dist/lib/commands.js +2 -0
- package/dist/lib/computer/sessions-list.d.ts +150 -0
- package/dist/lib/computer/sessions-list.js +363 -0
- package/dist/lib/config-keys.d.ts +86 -0
- package/dist/lib/config-keys.js +193 -0
- package/dist/lib/config-machine-keys.d.ts +12 -0
- package/dist/lib/config-machine-keys.js +17 -0
- package/dist/lib/config-transfer.js +3 -4
- package/dist/lib/crabbox/cli.d.ts +2 -2
- package/dist/lib/crabbox/cli.js +3 -3
- package/dist/lib/daemon-health.d.ts +22 -0
- package/dist/lib/daemon-health.js +33 -3
- package/dist/lib/daemon-services.d.ts +50 -0
- package/dist/lib/daemon-services.js +147 -0
- package/dist/lib/daemon-ticks.d.ts +35 -66
- package/dist/lib/daemon-ticks.js +77 -159
- package/dist/lib/daemon.d.ts +72 -4
- package/dist/lib/daemon.js +792 -202
- package/dist/lib/deeplink/register.d.ts +49 -0
- package/dist/lib/deeplink/register.js +253 -0
- package/dist/lib/deeplink/url.d.ts +34 -0
- package/dist/lib/deeplink/url.js +78 -0
- package/dist/lib/device-config.d.ts +124 -29
- package/dist/lib/device-config.js +346 -141
- package/dist/lib/devices/config-migration.d.ts +42 -0
- package/dist/lib/devices/config-migration.js +203 -0
- package/dist/lib/devices/connect.js +14 -7
- package/dist/lib/devices/doctor-findings.d.ts +4 -1
- package/dist/lib/devices/doctor-findings.js +20 -1
- package/dist/lib/devices/harness-inventory.d.ts +11 -2
- package/dist/lib/devices/harness-inventory.js +0 -0
- package/dist/lib/devices/health.d.ts +1 -1
- package/dist/lib/devices/health.js +1 -1
- package/dist/lib/devices/pending.d.ts +22 -1
- package/dist/lib/devices/pending.js +67 -2
- package/dist/lib/devices/registry.d.ts +0 -25
- package/dist/lib/devices/registry.js +2 -83
- package/dist/lib/devices/resolve-profile.d.ts +20 -0
- package/dist/lib/devices/resolve-profile.js +44 -0
- package/dist/lib/devices/rollout-verify.d.ts +101 -0
- package/dist/lib/devices/rollout-verify.js +193 -0
- package/dist/lib/devices/ssh-config.js +10 -6
- package/dist/lib/event-families.d.ts +28 -0
- package/dist/lib/event-families.js +159 -0
- package/dist/lib/event-stream.d.ts +9 -1
- package/dist/lib/event-stream.js +26 -9
- package/dist/lib/events.d.ts +9 -1
- package/dist/lib/events.js +21 -6
- package/dist/lib/exec.d.ts +30 -0
- package/dist/lib/exec.js +219 -121
- package/dist/lib/feed-broadcast.d.ts +25 -0
- package/dist/lib/feed-broadcast.js +33 -0
- package/dist/lib/feed.d.ts +1 -1
- package/dist/lib/feed.js +12 -2
- package/dist/lib/fleet/capture.js +15 -0
- package/dist/lib/fleet/manifest.js +9 -0
- package/dist/lib/fleet/types.d.ts +9 -0
- package/dist/lib/fleet-status.js +10 -8
- package/dist/lib/git.d.ts +21 -7
- package/dist/lib/git.js +122 -18
- package/dist/lib/hosts/dispatch.d.ts +8 -3
- package/dist/lib/hosts/dispatch.js +29 -3
- package/dist/lib/hosts/logs.d.ts +2 -2
- package/dist/lib/hosts/logs.js +2 -2
- package/dist/lib/hosts/option.js +1 -1
- package/dist/lib/hosts/passthrough.d.ts +2 -3
- package/dist/lib/hosts/passthrough.js +10 -24
- package/dist/lib/hosts/progress.js +2 -2
- package/dist/lib/hosts/providers/devices.d.ts +3 -3
- package/dist/lib/hosts/providers/devices.js +18 -12
- package/dist/lib/hosts/ready.d.ts +5 -1
- package/dist/lib/hosts/ready.js +9 -3
- package/dist/lib/hosts/reconcile.d.ts +2 -2
- package/dist/lib/hosts/reconcile.js +2 -2
- package/dist/lib/hosts/registry.js +14 -9
- package/dist/lib/hosts/remote-cmd.js +1 -1
- package/dist/lib/hosts/remote-os.d.ts +9 -6
- package/dist/lib/hosts/remote-os.js +13 -6
- package/dist/lib/hosts/routing-flag.d.ts +23 -0
- package/dist/lib/hosts/routing-flag.js +41 -0
- package/dist/lib/hosts/run-target.js +1 -1
- package/dist/lib/hosts/session-index.js +1 -1
- package/dist/lib/hosts/tasks.d.ts +6 -6
- package/dist/lib/hosts/tasks.js +4 -4
- package/dist/lib/hosts/types.js +1 -2
- package/dist/lib/installations/resolve.js +2 -8
- package/dist/lib/isolation-boundary-report.js +0 -1
- package/dist/lib/linear-cache.d.ts +7 -0
- package/dist/lib/linear-cache.js +31 -4
- package/dist/lib/linear-project-counts.d.ts +1 -1
- package/dist/lib/linear-project-counts.js +2 -3
- package/dist/lib/linear-projects.js +1 -1
- package/dist/lib/loop.d.ts +2 -2
- package/dist/lib/loop.js +1 -1
- package/dist/lib/mailbox-target.d.ts +1 -1
- package/dist/lib/mailbox-target.js +1 -1
- package/dist/lib/manifest.js +7 -4
- package/dist/lib/menubar/MenubarHelper.app/Contents/CodeResources +0 -0
- package/dist/lib/menubar/MenubarHelper.app/Contents/MacOS/MenubarHelper +0 -0
- package/dist/lib/menubar/snapshot.d.ts +3 -2
- package/dist/lib/menubar/snapshot.js +6 -2
- package/dist/lib/migrate-fold.d.ts +33 -0
- package/dist/lib/migrate-fold.js +130 -0
- package/dist/lib/migrate.d.ts +34 -34
- package/dist/lib/migrate.js +106 -128
- package/dist/lib/model-tier-overrides.d.ts +1 -1
- package/dist/lib/model-tier-overrides.js +15 -2
- package/dist/lib/monitors/config.d.ts +17 -3
- package/dist/lib/monitors/config.js +52 -18
- package/dist/lib/monitors/engine.d.ts +32 -1
- package/dist/lib/monitors/engine.js +94 -11
- package/dist/lib/monitors/fingerprint.d.ts +46 -0
- package/dist/lib/monitors/fingerprint.js +100 -0
- package/dist/lib/monitors/remote.d.ts +47 -0
- package/dist/lib/monitors/remote.js +81 -0
- package/dist/lib/monitors/state.d.ts +39 -0
- package/dist/lib/monitors/state.js +56 -0
- package/dist/lib/onepassword.d.ts +17 -0
- package/dist/lib/onepassword.js +52 -22
- package/dist/lib/open-url.js +1 -1
- package/dist/lib/picker.d.ts +14 -2
- package/dist/lib/picker.js +35 -13
- package/dist/lib/placement.d.ts +1 -1
- package/dist/lib/placement.js +1 -1
- package/dist/lib/pr-land-detach.d.ts +32 -0
- package/dist/lib/pr-land-detach.js +79 -0
- package/dist/lib/profiles-presets.js +13 -0
- package/dist/lib/profiles.d.ts +2 -0
- package/dist/lib/profiles.js +44 -1
- package/dist/lib/project-focus.d.ts +1 -1
- package/dist/lib/project-focus.js +1 -1
- package/dist/lib/project-probe.d.ts +4 -1
- package/dist/lib/project-probe.js +5 -4
- package/dist/lib/project-resources.js +2 -18
- package/dist/lib/project-root.d.ts +16 -0
- package/dist/lib/project-root.js +20 -2
- package/dist/lib/projects.d.ts +20 -1
- package/dist/lib/projects.js +78 -1
- package/dist/lib/refresh-coordinator.d.ts +24 -0
- package/dist/lib/refresh-coordinator.js +52 -0
- package/dist/lib/registry.d.ts +2 -2
- package/dist/lib/registry.js +1 -1
- package/dist/lib/resource-aliases.d.ts +13 -0
- package/dist/lib/resource-aliases.js +26 -0
- package/dist/lib/resources/types.d.ts +1 -1
- package/dist/lib/resources.d.ts +16 -0
- package/dist/lib/resources.js +66 -10
- package/dist/lib/rotate.d.ts +3 -4
- package/dist/lib/rotate.js +4 -5
- package/dist/lib/routine-activation.d.ts +22 -2
- package/dist/lib/routine-activation.js +63 -16
- package/dist/lib/routine-context.d.ts +9 -2
- package/dist/lib/routine-context.js +21 -6
- package/dist/lib/routines-project.d.ts +58 -48
- package/dist/lib/routines-project.js +190 -159
- package/dist/lib/routines.d.ts +44 -7
- package/dist/lib/routines.js +92 -34
- package/dist/lib/run-defaults.d.ts +5 -0
- package/dist/lib/run-defaults.js +11 -1
- package/dist/lib/runner.d.ts +10 -8
- package/dist/lib/runner.js +122 -39
- package/dist/lib/secrets/Agents CLI.app/Contents/CodeResources +0 -0
- package/dist/lib/secrets/Agents CLI.app/Contents/MacOS/Agents CLI +0 -0
- package/dist/lib/secrets/agent.d.ts +10 -3
- package/dist/lib/secrets/agent.js +43 -8
- package/dist/lib/secrets/bundles.d.ts +1 -0
- package/dist/lib/secrets/bundles.js +92 -80
- package/dist/lib/secrets/index.js +32 -9
- package/dist/lib/secrets/install-helper.d.ts +4 -4
- package/dist/lib/secrets/install-helper.js +4 -4
- package/dist/lib/secrets/push.d.ts +40 -6
- package/dist/lib/secrets/push.js +58 -11
- package/dist/lib/secrets/read-backoff.d.ts +1 -1
- package/dist/lib/secrets/read-backoff.js +1 -1
- package/dist/lib/secrets/remote.d.ts +24 -0
- package/dist/lib/secrets/remote.js +54 -4
- package/dist/lib/self-update.d.ts +108 -0
- package/dist/lib/self-update.js +276 -1
- package/dist/lib/session/active.d.ts +89 -5
- package/dist/lib/session/active.js +165 -10
- package/dist/lib/session/actor-sidecar.d.ts +1 -1
- package/dist/lib/session/actor-sidecar.js +2 -1
- package/dist/lib/session/db.d.ts +176 -2
- package/dist/lib/session/db.js +484 -17
- package/dist/lib/session/discover.js +27 -4
- package/dist/lib/session/hook-sessions.js +2 -2
- package/dist/lib/session/host-link.d.ts +2 -2
- package/dist/lib/session/host-link.js +2 -2
- package/dist/lib/session/pid-registry.d.ts +21 -0
- package/dist/lib/session/pid-registry.js +57 -0
- package/dist/lib/session/remote-active.js +15 -1
- package/dist/lib/session/remote.js +2 -2
- package/dist/lib/session/session-cache.d.ts +14 -7
- package/dist/lib/session/session-cache.js +51 -9
- package/dist/lib/session/state.d.ts +2 -2
- package/dist/lib/session/state.js +1 -1
- package/dist/lib/session/sync/config.d.ts +10 -10
- package/dist/lib/session/sync/config.js +10 -10
- package/dist/lib/session/sync/r2.d.ts +34 -0
- package/dist/lib/session/sync/r2.js +123 -0
- package/dist/lib/session/throughput.d.ts +1 -1
- package/dist/lib/session/throughput.js +1 -1
- package/dist/lib/session/types.d.ts +23 -1
- package/dist/lib/session/types.js +15 -0
- package/dist/lib/session/viewing-in.d.ts +1 -1
- package/dist/lib/session/viewing-in.js +1 -1
- package/dist/lib/session/watch.d.ts +101 -0
- package/dist/lib/session/watch.js +242 -0
- package/dist/lib/share/analytics.js +1 -1
- package/dist/lib/share/capture.d.ts +1 -1
- package/dist/lib/share/capture.js +3 -3
- package/dist/lib/share/config.d.ts +6 -2
- package/dist/lib/share/config.js +6 -5
- package/dist/lib/share/delete.js +3 -3
- package/dist/lib/share/provision.d.ts +38 -0
- package/dist/lib/share/provision.js +51 -1
- package/dist/lib/share/publish.d.ts +40 -1
- package/dist/lib/share/publish.js +119 -6
- package/dist/lib/share/worker-template.d.ts +12 -1
- package/dist/lib/share/worker-template.js +83 -7
- package/dist/lib/shims.d.ts +17 -3
- package/dist/lib/shims.js +98 -26
- package/dist/lib/signin-badge.js +3 -2
- package/dist/lib/skills.js +2 -0
- package/dist/lib/smart-launch.d.ts +8 -8
- package/dist/lib/smart-launch.js +80 -59
- package/dist/lib/ssh-exec.d.ts +1 -1
- package/dist/lib/ssh-exec.js +1 -1
- package/dist/lib/staleness/prune.d.ts +88 -0
- package/dist/lib/staleness/prune.js +69 -0
- package/dist/lib/staleness/registry.d.ts +1 -1
- package/dist/lib/staleness/writers/commands.js +34 -2
- package/dist/lib/staleness/writers/hooks.js +16 -0
- package/dist/lib/staleness/writers/kinds.d.ts +6 -0
- package/dist/lib/staleness/writers/skills.js +19 -0
- package/dist/lib/staleness/writers/subagents.d.ts +2 -3
- package/dist/lib/staleness/writers/subagents.js +0 -4
- package/dist/lib/staleness/writers/types.d.ts +32 -0
- package/dist/lib/startup/command-registry.d.ts +16 -14
- package/dist/lib/startup/command-registry.js +26 -37
- package/dist/lib/startup/dev-build.d.ts +10 -0
- package/dist/lib/startup/dev-build.js +13 -1
- package/dist/lib/startup/spellcheck.d.ts +18 -0
- package/dist/lib/startup/spellcheck.js +45 -0
- package/dist/lib/state.d.ts +36 -9
- package/dist/lib/state.js +96 -46
- package/dist/lib/subagents-registry.d.ts +0 -7
- package/dist/lib/subagents-registry.js +38 -65
- package/dist/lib/subagents.d.ts +0 -33
- package/dist/lib/subagents.js +0 -75
- package/dist/lib/sync-umbrella.js +1 -1
- package/dist/lib/teams/agents.d.ts +41 -1
- package/dist/lib/teams/agents.js +187 -9
- package/dist/lib/teams/api.d.ts +11 -1
- package/dist/lib/teams/api.js +11 -2
- package/dist/lib/teams/delivery.d.ts +41 -0
- package/dist/lib/teams/delivery.js +60 -0
- package/dist/lib/teams/registry.d.ts +14 -0
- package/dist/lib/teams/registry.js +51 -1
- package/dist/lib/teams/remoteWorktree.d.ts +19 -0
- package/dist/lib/teams/remoteWorktree.js +29 -0
- package/dist/lib/teams/scheduler.d.ts +1 -1
- package/dist/lib/teams/scheduler.js +1 -1
- package/dist/lib/teams/worktree.d.ts +24 -0
- package/dist/lib/teams/worktree.js +42 -0
- package/dist/lib/terminal/backends/vscodium-agent.d.ts +10 -1
- package/dist/lib/terminal/backends/vscodium-agent.js +16 -5
- package/dist/lib/terminal/engine.d.ts +4 -0
- package/dist/lib/terminal/engine.js +8 -2
- package/dist/lib/terminal/types.d.ts +21 -2
- package/dist/lib/testdata/refresh-coordinator-worker.d.ts +1 -0
- package/dist/lib/testdata/refresh-coordinator-worker.js +23 -0
- package/dist/lib/tickets/list.d.ts +53 -0
- package/dist/lib/tickets/list.js +153 -0
- package/dist/lib/tmux/orphan-reap.d.ts +316 -0
- package/dist/lib/tmux/orphan-reap.js +638 -0
- package/dist/lib/tmux/session.d.ts +68 -3
- package/dist/lib/tmux/session.js +96 -5
- package/dist/lib/triggers/handlers.d.ts +20 -0
- package/dist/lib/triggers/handlers.js +16 -1
- package/dist/lib/triggers/webhook.js +10 -0
- package/dist/lib/types.d.ts +47 -35
- package/dist/lib/usage-fleet.d.ts +32 -0
- package/dist/lib/usage-fleet.js +125 -0
- package/dist/lib/usage-refresh.d.ts +3 -3
- package/dist/lib/usage-refresh.js +19 -16
- package/dist/lib/usage.d.ts +51 -47
- package/dist/lib/usage.js +145 -153
- package/dist/lib/version-duplicates.js +2 -2
- package/dist/lib/versions.d.ts +56 -13
- package/dist/lib/versions.js +195 -45
- package/dist/lib/watchdog/log.d.ts +1 -1
- package/dist/lib/watchdog/log.js +3 -3
- package/dist/lib/watchdog/rotate.d.ts +6 -6
- package/dist/lib/watchdog/rotate.js +6 -6
- package/dist/lib/workflows.d.ts +1 -1
- package/dist/lib/yaml-io.d.ts +47 -0
- package/dist/lib/yaml-io.js +55 -0
- package/package.json +2 -1
- package/scripts/install-helper.js +2 -2
- package/scripts/postinstall.js +23 -20
- package/dist/commands/defaults.d.ts +0 -7
- package/dist/commands/defaults.js +0 -107
- package/dist/commands/export.d.ts +0 -11
- package/dist/commands/export.js +0 -215
- package/dist/commands/helper.d.ts +0 -12
- package/dist/commands/helper.js +0 -87
- package/dist/commands/hosts.d.ts +0 -11
- package/dist/commands/hosts.js +0 -330
- package/dist/commands/lock.d.ts +0 -12
- package/dist/commands/lock.js +0 -70
- package/dist/commands/pull.d.ts +0 -17
- package/dist/commands/pull.js +0 -39
- package/dist/commands/push.d.ts +0 -14
- package/dist/commands/push.js +0 -30
- package/dist/commands/set.d.ts +0 -15
- package/dist/commands/set.js +0 -79
- package/dist/commands/setup-share.d.ts +0 -17
- package/dist/commands/setup-share.js +0 -85
- package/dist/commands/wallet.d.ts +0 -20
- package/dist/commands/wallet.js +0 -216
- package/dist/commands/worktree.d.ts +0 -19
- package/dist/commands/worktree.js +0 -272
- package/dist/lib/account-labels.d.ts +0 -24
- package/dist/lib/account-labels.js +0 -72
- package/dist/lib/auto-dispatch-linear.d.ts +0 -18
- package/dist/lib/auto-dispatch-linear.js +0 -107
- package/dist/lib/auto-dispatch-provider.d.ts +0 -10
- package/dist/lib/auto-dispatch-provider.js +0 -30
- package/dist/lib/auto-dispatch.d.ts +0 -93
- package/dist/lib/auto-dispatch.js +0 -128
- package/dist/lib/export.d.ts +0 -72
- package/dist/lib/export.js +0 -269
- package/dist/lib/lock.d.ts +0 -93
- package/dist/lib/lock.js +0 -207
- package/dist/lib/wallet/index.d.ts +0 -78
- package/dist/lib/wallet/index.js +0 -253
package/dist/commands/share.js
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
|
-
// `agents share` — publish an HTML file to your own Cloudflare R2
|
|
2
|
-
// Worker, and get a shareable link (~$0). See apps/cli/docs/share.md.
|
|
1
|
+
// `agents artifacts share` — publish an HTML file to your own Cloudflare R2
|
|
2
|
+
// behind a tiny Worker, and get a shareable link (~$0). See apps/cli/docs/share.md.
|
|
3
|
+
//
|
|
4
|
+
// Registered under the `artifacts` group by commands/artifacts.ts; the
|
|
5
|
+
// provisioning door lives beside it at `agents artifacts setup`
|
|
6
|
+
// (commands/artifacts-setup.ts), which calls `runShareProvision` below.
|
|
3
7
|
import { existsSync } from 'node:fs';
|
|
4
8
|
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';
|
|
9
|
+
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';
|
|
10
|
+
import { addCustomDomain, configureBucketLifecycle, createBucket, deployWorker, enableWorkersDev, findZoneId, hashWorkerScript, updateWorker, setWorkerSecret, } from '../lib/share/provision.js';
|
|
11
|
+
import { publishFile, resolveShareUsername } from '../lib/share/publish.js';
|
|
8
12
|
import { deleteShare } from '../lib/share/delete.js';
|
|
9
13
|
import { renderWorkerScript } from '../lib/share/worker-template.js';
|
|
10
14
|
import { analyticsEnabled } from '../lib/share/analytics.js';
|
|
@@ -18,8 +22,132 @@ export function formatSharePublishResult(result, json = false) {
|
|
|
18
22
|
lines.push(chalk.dim(` cover ${result.coverUrl}`));
|
|
19
23
|
if (result.expiresAt)
|
|
20
24
|
lines.push(chalk.dim(` expires ${new Date(result.expiresAt).toLocaleString()}`));
|
|
25
|
+
else
|
|
26
|
+
lines.push(chalk.dim(' expires never'));
|
|
27
|
+
if (result.unlisted)
|
|
28
|
+
lines.push(chalk.dim(' unlisted (hidden from gallery / share list)'));
|
|
21
29
|
return lines.join('\n');
|
|
22
30
|
}
|
|
31
|
+
/** Compare the configured endpoint's last-deployed template hash against the
|
|
32
|
+
* hash of the CURRENT `worker-template.ts` render. A config with no recorded
|
|
33
|
+
* hash (every endpoint provisioned before this field existed) is "unknown" —
|
|
34
|
+
* never "current" or "outdated", since there is nothing to compare against. */
|
|
35
|
+
export function shareTemplateStatus(cfg) {
|
|
36
|
+
if (!cfg.templateHash)
|
|
37
|
+
return 'unknown';
|
|
38
|
+
return cfg.templateHash === hashWorkerScript(renderWorkerScript()) ? 'current' : 'outdated';
|
|
39
|
+
}
|
|
40
|
+
/** Shown whenever the deployed Worker has no `?format=json` listing route — an
|
|
41
|
+
* endpoint provisioned before this feature. Points at the RUSH-2449 update path
|
|
42
|
+
* (`agents artifacts share update`) instead of letting the caller hit a 404 or an
|
|
43
|
+
* HTML body and get a confusing parse error. */
|
|
44
|
+
const OUTDATED_TEMPLATE_HINT = 'Your deployed share Worker has no machine-readable listing route — it predates `agents artifacts share list`. ' +
|
|
45
|
+
'Run `agents artifacts share update` to deploy the current Worker template, then retry (`agents artifacts share status` shows whether an update is due).';
|
|
46
|
+
async function defaultListingFetch(url) {
|
|
47
|
+
const res = await fetch(url, { headers: { accept: 'application/json' } });
|
|
48
|
+
return { status: res.status, contentType: res.headers.get('content-type') ?? '', body: await res.text() };
|
|
49
|
+
}
|
|
50
|
+
/** Parse the Worker's listing JSON into a validated result, failing loud (with the
|
|
51
|
+
* outdated-template hint) on any body that isn't the expected shape — an old Worker
|
|
52
|
+
* serves the HTML gallery for a non-empty namespace, which must not be silently
|
|
53
|
+
* accepted as "you have published nothing". */
|
|
54
|
+
export function parseShareListing(user, body) {
|
|
55
|
+
let data;
|
|
56
|
+
try {
|
|
57
|
+
data = JSON.parse(body);
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
throw new Error(OUTDATED_TEMPLATE_HINT);
|
|
61
|
+
}
|
|
62
|
+
const objectsRaw = data?.objects;
|
|
63
|
+
if (!data || typeof data !== 'object' || !Array.isArray(objectsRaw)) {
|
|
64
|
+
throw new Error(OUTDATED_TEMPLATE_HINT);
|
|
65
|
+
}
|
|
66
|
+
const objects = objectsRaw.map((o) => {
|
|
67
|
+
const item = o;
|
|
68
|
+
return {
|
|
69
|
+
slug: String(item.slug ?? ''),
|
|
70
|
+
url: String(item.url ?? ''),
|
|
71
|
+
size: typeof item.size === 'number' ? item.size : 0,
|
|
72
|
+
contentType: item.contentType == null ? null : String(item.contentType),
|
|
73
|
+
publishedAt: String(item.publishedAt ?? ''),
|
|
74
|
+
expiresAt: item.expiresAt == null ? null : String(item.expiresAt),
|
|
75
|
+
};
|
|
76
|
+
});
|
|
77
|
+
return { user, count: objects.length, objects };
|
|
78
|
+
}
|
|
79
|
+
/** Fetch and parse the machine-readable listing of the caller's namespace from the
|
|
80
|
+
* Worker's `?format=json` route. Fails loud when share was never configured, when
|
|
81
|
+
* the deployed template is known-outdated (RUSH-2449 templateHash), or when the
|
|
82
|
+
* live response proves the route is absent (404 or a non-JSON 200 = the old HTML
|
|
83
|
+
* gallery) — never a silent empty/wrong result. */
|
|
84
|
+
export async function runShareList(opts = {}) {
|
|
85
|
+
const cfg = opts.config ?? readShareConfig();
|
|
86
|
+
if (!cfg) {
|
|
87
|
+
throw new Error("Not set up yet. Run 'agents artifacts setup' (provision your own endpoint) or 'agents artifacts share join' (use an existing one).");
|
|
88
|
+
}
|
|
89
|
+
// A known-stale template can't have the listing route — say so before any network
|
|
90
|
+
// call. 'unknown' (provisioned before templateHash tracking) is attempted, then
|
|
91
|
+
// caught by the response checks below if the route turns out to be absent.
|
|
92
|
+
const templateStatus = shareTemplateStatus(cfg);
|
|
93
|
+
if (templateStatus === 'outdated') {
|
|
94
|
+
throw new Error(OUTDATED_TEMPLATE_HINT);
|
|
95
|
+
}
|
|
96
|
+
const user = await resolveShareUsername({ githubUser: opts.githubUser });
|
|
97
|
+
const listUrl = `${cfg.baseUrl.replace(/\/+$/, '')}/${encodeURIComponent(user)}?format=json`;
|
|
98
|
+
const fetchListing = opts.fetchListing ?? defaultListingFetch;
|
|
99
|
+
const res = await fetchListing(listUrl);
|
|
100
|
+
if (res.status === 404) {
|
|
101
|
+
// A single-segment path 404s either because the namespace is genuinely empty
|
|
102
|
+
// (current template — the listing route gates on the namespace holding objects,
|
|
103
|
+
// so a namespace with nothing falls through to an object GET) OR because the
|
|
104
|
+
// endpoint predates the listing route entirely. The recorded templateHash
|
|
105
|
+
// disambiguates: a 'current' template HAS the route, so its 404 means an empty
|
|
106
|
+
// namespace ("nothing published"); otherwise the route may be absent, so point
|
|
107
|
+
// at `agents artifacts share update`.
|
|
108
|
+
if (templateStatus === 'current') {
|
|
109
|
+
return { user, count: 0, objects: [] };
|
|
110
|
+
}
|
|
111
|
+
throw new Error(OUTDATED_TEMPLATE_HINT);
|
|
112
|
+
}
|
|
113
|
+
if (res.status !== 200) {
|
|
114
|
+
throw new Error(`Listing failed (${res.status}) for ${listUrl}. Check the endpoint is reachable, or that 'agents artifacts setup' completed.`);
|
|
115
|
+
}
|
|
116
|
+
if (!/application\/json/i.test(res.contentType)) {
|
|
117
|
+
// A 200 that isn't JSON means the old Worker ignored ?format=json and served
|
|
118
|
+
// the HTML gallery — the deployed template is outdated.
|
|
119
|
+
throw new Error(OUTDATED_TEMPLATE_HINT);
|
|
120
|
+
}
|
|
121
|
+
return parseShareListing(user, res.body);
|
|
122
|
+
}
|
|
123
|
+
/** Human-readable bytes, e.g. `1.2 KB`, `640 B`. */
|
|
124
|
+
function formatBytes(n) {
|
|
125
|
+
if (n < 1024)
|
|
126
|
+
return `${n} B`;
|
|
127
|
+
const units = ['KB', 'MB', 'GB'];
|
|
128
|
+
let value = n / 1024;
|
|
129
|
+
let unit = 0;
|
|
130
|
+
while (value >= 1024 && unit < units.length - 1) {
|
|
131
|
+
value /= 1024;
|
|
132
|
+
unit++;
|
|
133
|
+
}
|
|
134
|
+
return `${value < 10 ? value.toFixed(1) : Math.round(value)} ${units[unit]}`;
|
|
135
|
+
}
|
|
136
|
+
export function formatShareList(result, json = false) {
|
|
137
|
+
if (json)
|
|
138
|
+
return JSON.stringify(result, null, 2);
|
|
139
|
+
if (result.count === 0) {
|
|
140
|
+
return chalk.dim(`No active pages published under @${result.user}.`);
|
|
141
|
+
}
|
|
142
|
+
const header = chalk.bold(`@${result.user}`) +
|
|
143
|
+
chalk.dim(` ${result.count} published ${result.count === 1 ? 'page' : 'pages'}`);
|
|
144
|
+
const rows = result.objects.map((o) => {
|
|
145
|
+
const when = o.publishedAt ? o.publishedAt.slice(0, 10) : 'unknown';
|
|
146
|
+
const meta = `${when} · ${formatBytes(o.size)}${o.expiresAt ? ` · expires ${o.expiresAt.slice(0, 10)}` : ''}`;
|
|
147
|
+
return `${chalk.cyan(o.slug)} ${chalk.dim(meta)}\n ${chalk.green(o.url)}`;
|
|
148
|
+
});
|
|
149
|
+
return [header, ...rows].join('\n');
|
|
150
|
+
}
|
|
23
151
|
export function formatShareDeleteResult(result, json = false) {
|
|
24
152
|
if (json)
|
|
25
153
|
return JSON.stringify(result, null, 2);
|
|
@@ -33,8 +161,8 @@ export function formatShareDeleteResult(result, json = false) {
|
|
|
33
161
|
}
|
|
34
162
|
return lines.join('\n');
|
|
35
163
|
}
|
|
36
|
-
/** Shared handler for `agents share delete <targets...>` and the
|
|
37
|
-
* `agents unshare <targets...>` alias. Deletes each target independently and
|
|
164
|
+
/** Shared handler for `agents artifacts share delete <targets...>` and the
|
|
165
|
+
* top-level `agents unshare <targets...>` alias. Deletes each target independently and
|
|
38
166
|
* continues past a failed one (rm-style), reporting all results and exiting
|
|
39
167
|
* non-zero if any target failed to verify as gone.
|
|
40
168
|
*
|
|
@@ -76,10 +204,10 @@ function registerShareDeleteOptions(cmd) {
|
|
|
76
204
|
}
|
|
77
205
|
const SHARE_DELETE_EXAMPLES = `
|
|
78
206
|
# Delete by full URL — also takes down the sibling OG cover
|
|
79
|
-
agents share delete https://share.agents-cli.sh/octocat/my-plan-a1b2
|
|
207
|
+
agents artifacts share delete https://share.agents-cli.sh/octocat/my-plan-a1b2
|
|
80
208
|
|
|
81
209
|
# Delete by <user>/<slug>, or a bare slug in your own namespace
|
|
82
|
-
agents share delete octocat/my-plan-a1b2
|
|
210
|
+
agents artifacts share delete octocat/my-plan-a1b2
|
|
83
211
|
agents unshare my-plan-a1b2
|
|
84
212
|
|
|
85
213
|
# Several at once
|
|
@@ -96,16 +224,25 @@ const SHARE_DELETE_NOTES = `
|
|
|
96
224
|
Worker's DELETE is idempotent and returns {"ok":true} even for a key that was
|
|
97
225
|
never there, so that response alone is never proof of a takedown.
|
|
98
226
|
|
|
99
|
-
agents share delete === agents unshare (same command, different name).
|
|
227
|
+
agents artifacts share delete === agents unshare (same command, different name).
|
|
100
228
|
`;
|
|
101
|
-
|
|
102
|
-
|
|
229
|
+
/**
|
|
230
|
+
* Register the `share` subtree under its parent group — `agents artifacts share`
|
|
231
|
+
* (see commands/artifacts.ts). The top-level `agents unshare` alias is a sibling
|
|
232
|
+
* registration on the ROOT program, so it is {@link registerUnshareCommand}, not
|
|
233
|
+
* part of this subtree.
|
|
234
|
+
*/
|
|
235
|
+
export function registerShareCommands(artifactsCmd) {
|
|
236
|
+
const shareCmd = artifactsCmd
|
|
103
237
|
.command('share')
|
|
104
238
|
.description('Publish an HTML file to your own Cloudflare R2 and get a shareable link (~$0).')
|
|
105
239
|
.argument('[file]', 'file to publish (HTML or any static asset)')
|
|
106
240
|
.option('--slug <slug>', 'custom URL slug under your namespace (default: <project>-<feature>-<hash>)')
|
|
107
241
|
.option('--github-user <user>', 'GitHub username for the share namespace (default: resolved from gh/git config)')
|
|
108
|
-
.option('--expire <spec>',
|
|
242
|
+
.option('--expire <spec>', "auto-expire (default 30d). e.g. 12h, 30d, 2026-08-01, or 'never'")
|
|
243
|
+
.option('--unlisted', 'hide from the public gallery and `agents artifacts share list` (direct URL still works)')
|
|
244
|
+
.option('--private', 'alias of --unlisted')
|
|
245
|
+
.option('--force', 'publish even when the file contains emails or credential-shaped strings')
|
|
109
246
|
.option('--no-cover', 'skip the OG preview image (HTML pages get one by default)')
|
|
110
247
|
.option('--no-analytics', 'skip injecting the Cloudflare Web Analytics beacon')
|
|
111
248
|
.option('--json', 'emit machine-readable publish result for plan-render hooks and scripts')
|
|
@@ -120,14 +257,16 @@ export function registerShareCommands(program) {
|
|
|
120
257
|
return;
|
|
121
258
|
}
|
|
122
259
|
try {
|
|
123
|
-
const
|
|
260
|
+
const result = await publishFile(file, {
|
|
124
261
|
slug: opts.slug,
|
|
125
262
|
githubUser: opts.githubUser,
|
|
126
263
|
expire: opts.expire,
|
|
264
|
+
unlisted: opts.unlisted === true || opts.private === true,
|
|
265
|
+
force: opts.force,
|
|
127
266
|
cover: opts.cover,
|
|
128
267
|
analytics: opts.analytics,
|
|
129
268
|
});
|
|
130
|
-
console.log(formatSharePublishResult(
|
|
269
|
+
console.log(formatSharePublishResult(result, Boolean(opts.json)));
|
|
131
270
|
}
|
|
132
271
|
catch (e) {
|
|
133
272
|
console.error(chalk.red(e.message));
|
|
@@ -136,17 +275,33 @@ export function registerShareCommands(program) {
|
|
|
136
275
|
});
|
|
137
276
|
setHelpSections(shareCmd, {
|
|
138
277
|
examples: `
|
|
139
|
-
# Publish an HTML file —
|
|
140
|
-
agents share ./out/plan.html
|
|
278
|
+
# Publish an HTML file — auto OG cover, default 30d expiry, shareable link
|
|
279
|
+
agents artifacts share ./out/plan.html
|
|
280
|
+
|
|
281
|
+
# Hide from the public gallery (direct URL still works) and expire sooner
|
|
282
|
+
agents artifacts share ./out/report.html --unlisted --expire 12h
|
|
283
|
+
|
|
284
|
+
# Permanent public page (opt out of the default 30d expiry)
|
|
285
|
+
agents artifacts share ./out/landing.html --slug landing --expire never
|
|
141
286
|
|
|
142
|
-
# Custom slug, expiring in
|
|
143
|
-
agents share ./out/report.html --slug q3-report --expire
|
|
287
|
+
# Custom slug, expiring in 7 days
|
|
288
|
+
agents artifacts share ./out/report.html --slug q3-report --expire 7d
|
|
144
289
|
${SHARE_DELETE_EXAMPLES}
|
|
145
290
|
# One-time setup (or join an existing endpoint)
|
|
146
|
-
agents
|
|
147
|
-
agents share join https://share.agents-cli.sh
|
|
291
|
+
agents artifacts setup
|
|
292
|
+
agents artifacts share join https://share.agents-cli.sh
|
|
293
|
+
|
|
294
|
+
# Push a worker-template.ts change out to an already-provisioned endpoint
|
|
295
|
+
agents artifacts share update
|
|
296
|
+
`,
|
|
297
|
+
notes: `
|
|
298
|
+
Default expiry is 30d so an accidental publish decays. Pass --expire never for
|
|
299
|
+
a permanent link. --unlisted / --private hides the page from the public gallery
|
|
300
|
+
and agents artifacts share list; the direct URL is still world-readable
|
|
301
|
+
(unlisted, not secret). A pre-publish scan refuses emails and credential-shaped
|
|
302
|
+
strings unless --force is passed.
|
|
303
|
+
${SHARE_DELETE_NOTES}
|
|
148
304
|
`,
|
|
149
|
-
notes: SHARE_DELETE_NOTES,
|
|
150
305
|
});
|
|
151
306
|
const shareDeleteCmd = registerShareDeleteOptions(shareCmd
|
|
152
307
|
.command('delete <targets...>')
|
|
@@ -155,53 +310,68 @@ ${SHARE_DELETE_EXAMPLES}
|
|
|
155
310
|
shareDeleteCmd.action(async (targets, opts) => {
|
|
156
311
|
await runShareDelete(targets, opts);
|
|
157
312
|
});
|
|
158
|
-
const unshareCmd = registerShareDeleteOptions(program
|
|
159
|
-
.command('unshare <targets...>')
|
|
160
|
-
.description('Alias of `agents share delete` — take down a published page (and by default its OG cover).'));
|
|
161
|
-
setHelpSections(unshareCmd, { examples: SHARE_DELETE_EXAMPLES, notes: SHARE_DELETE_NOTES });
|
|
162
|
-
unshareCmd.action(async (targets, opts) => {
|
|
163
|
-
await runShareDelete(targets, opts);
|
|
164
|
-
});
|
|
165
313
|
shareCmd
|
|
166
|
-
.command('
|
|
167
|
-
.description('
|
|
168
|
-
.
|
|
169
|
-
.option('--
|
|
170
|
-
.
|
|
171
|
-
.option('--account <id>', 'Cloudflare account id (else read from the bundle / prompt)')
|
|
172
|
-
.option('--token <t>', 'Cloudflare API token (else read from the --bundle)')
|
|
173
|
-
.option('--domain <host>', `custom domain to map (default: ${DEFAULT_SHARE_DOMAIN}; workers.dev if zone is not visible)`)
|
|
174
|
-
.option('--analytics-token <token>', 'Cloudflare Web Analytics token to inject into published HTML pages')
|
|
175
|
-
.action(async (opts) => {
|
|
314
|
+
.command('join')
|
|
315
|
+
.description('Use an existing synced share endpoint and write token (no provisioning).')
|
|
316
|
+
.argument('[baseUrl]', 'base URL of the endpoint, e.g. https://share.agents-cli.sh')
|
|
317
|
+
.option('--token <token>', 'write token (else SHARE_WRITE_TOKEN env, existing bundle, or prompt)')
|
|
318
|
+
.action(async (baseUrl, opts) => {
|
|
176
319
|
try {
|
|
177
|
-
await
|
|
320
|
+
await runShareJoin(baseUrl, opts);
|
|
178
321
|
}
|
|
179
322
|
catch (e) {
|
|
180
323
|
console.error(chalk.red(e.message));
|
|
181
324
|
process.exitCode = 1;
|
|
182
325
|
}
|
|
183
326
|
});
|
|
184
|
-
shareCmd
|
|
185
|
-
.command('
|
|
186
|
-
.description('
|
|
187
|
-
.
|
|
188
|
-
.option('--
|
|
189
|
-
.
|
|
327
|
+
const shareUpdateCmd = shareCmd
|
|
328
|
+
.command('update')
|
|
329
|
+
.description('Re-deploy the Worker script to the current template on an already-provisioned endpoint (idempotent).')
|
|
330
|
+
.option('--bundle <name>', 'secrets bundle holding the Cloudflare API token', DEFAULT_CF_BUNDLE)
|
|
331
|
+
.option('--account <id>', 'Cloudflare account id override (default: the configured endpoint\'s account)')
|
|
332
|
+
.option('--token <t>', 'Cloudflare API token (else read from --bundle)')
|
|
333
|
+
.option('--force', 're-deploy even if the deployed template already matches')
|
|
334
|
+
.option('--json', 'emit a machine-readable result')
|
|
335
|
+
.action(async (opts) => {
|
|
190
336
|
try {
|
|
191
|
-
await
|
|
337
|
+
const result = await runShareUpdate(opts);
|
|
338
|
+
if (opts.json) {
|
|
339
|
+
console.log(JSON.stringify(result, null, 2));
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
if (result.updated) {
|
|
343
|
+
console.log(chalk.green(`Worker '${result.workerName}' updated → template ${result.templateHash.slice(0, 12)}…`));
|
|
344
|
+
}
|
|
345
|
+
else {
|
|
346
|
+
console.log(chalk.dim(`Worker '${result.workerName}' already matches the current template — no-op.`));
|
|
347
|
+
}
|
|
192
348
|
}
|
|
193
349
|
catch (e) {
|
|
194
350
|
console.error(chalk.red(e.message));
|
|
195
351
|
process.exitCode = 1;
|
|
196
352
|
}
|
|
197
353
|
});
|
|
354
|
+
setHelpSections(shareUpdateCmd, {
|
|
355
|
+
examples: `
|
|
356
|
+
# Push a worker-template.ts change out to your already-provisioned endpoint
|
|
357
|
+
agents artifacts share update
|
|
358
|
+
|
|
359
|
+
# Force a re-deploy even though the template hash already matches
|
|
360
|
+
agents artifacts share update --force
|
|
361
|
+
`,
|
|
362
|
+
notes: `
|
|
363
|
+
Reuses the existing account/worker/bucket from 'agents artifacts share status' and the
|
|
364
|
+
existing write token — it never re-provisions a bucket, touches routes, or
|
|
365
|
+
regenerates the token. See 'agents artifacts share status' for whether an update is due.
|
|
366
|
+
`,
|
|
367
|
+
});
|
|
198
368
|
shareCmd
|
|
199
369
|
.command('status')
|
|
200
370
|
.description('Show the configured share endpoint and namespace.')
|
|
201
371
|
.action(async () => {
|
|
202
372
|
const cfg = readShareConfig();
|
|
203
373
|
if (!cfg) {
|
|
204
|
-
console.log(chalk.dim("Not configured. Run 'agents
|
|
374
|
+
console.log(chalk.dim("Not configured. Run 'agents artifacts setup' or 'agents artifacts share join'."));
|
|
205
375
|
return;
|
|
206
376
|
}
|
|
207
377
|
console.log(`${chalk.bold('endpoint')} ${chalk.green(cfg.baseUrl)}`);
|
|
@@ -209,6 +379,48 @@ ${SHARE_DELETE_EXAMPLES}
|
|
|
209
379
|
const user = await resolveGitHubUsername();
|
|
210
380
|
console.log(`${chalk.bold('namespace')} ${user ? chalk.cyan(`${cfg.baseUrl}/${user}`) : chalk.yellow('unknown — set gh auth or github.user')}`);
|
|
211
381
|
console.log(`${chalk.bold('analytics')} ${analyticsEnabled(cfg) ? chalk.green('enabled') : chalk.dim('not configured')}`);
|
|
382
|
+
const templateStatus = shareTemplateStatus(cfg);
|
|
383
|
+
const templateLabel = templateStatus === 'current'
|
|
384
|
+
? chalk.green('current')
|
|
385
|
+
: templateStatus === 'outdated'
|
|
386
|
+
? chalk.yellow('outdated — run `agents artifacts share update`')
|
|
387
|
+
: chalk.dim("unknown — provisioned before version tracking; run `agents artifacts share update` to adopt it");
|
|
388
|
+
console.log(`${chalk.bold('template')} ${templateLabel}`);
|
|
389
|
+
});
|
|
390
|
+
const shareListCmd = shareCmd
|
|
391
|
+
.command('list')
|
|
392
|
+
.description("List the pages you've published to your share namespace (human table; --json for scripts).")
|
|
393
|
+
.option('--github-user <user>', 'GitHub username whose namespace to list (default: resolved from gh/git config)')
|
|
394
|
+
.option('--json', 'emit the machine-readable listing (slug, url, size, contentType, publishedAt, expiresAt)')
|
|
395
|
+
.action(async (opts) => {
|
|
396
|
+
try {
|
|
397
|
+
const result = await runShareList({ githubUser: opts.githubUser });
|
|
398
|
+
console.log(formatShareList(result, Boolean(opts.json)));
|
|
399
|
+
}
|
|
400
|
+
catch (e) {
|
|
401
|
+
console.error(chalk.red(e.message));
|
|
402
|
+
process.exitCode = 1;
|
|
403
|
+
}
|
|
404
|
+
});
|
|
405
|
+
setHelpSections(shareListCmd, {
|
|
406
|
+
examples: `
|
|
407
|
+
# Everything you've published, newest first
|
|
408
|
+
agents artifacts share list
|
|
409
|
+
|
|
410
|
+
# Machine-readable — e.g. pull every still-public URL with jq
|
|
411
|
+
agents artifacts share list --json | jq -r '.objects[].url'
|
|
412
|
+
|
|
413
|
+
# List another namespace
|
|
414
|
+
agents artifacts share list --github-user octocat
|
|
415
|
+
`,
|
|
416
|
+
notes: `
|
|
417
|
+
Lists the ACTIVE pages in your namespace — expired links and the sibling .png OG
|
|
418
|
+
covers are omitted (it mirrors the public gallery). It reads the endpoint's JSON
|
|
419
|
+
listing route, which ships with the current Worker template. If your deployed
|
|
420
|
+
Worker predates this feature the command says so and points you at 'agents
|
|
421
|
+
artifacts share update' (RUSH-2449) rather than returning a wrong or empty result
|
|
422
|
+
— see 'agents artifacts share status' for whether an update is due.
|
|
423
|
+
`,
|
|
212
424
|
});
|
|
213
425
|
shareCmd
|
|
214
426
|
.command('analytics')
|
|
@@ -216,7 +428,7 @@ ${SHARE_DELETE_EXAMPLES}
|
|
|
216
428
|
.action(async () => {
|
|
217
429
|
const cfg = readShareConfig();
|
|
218
430
|
if (!cfg) {
|
|
219
|
-
console.log(chalk.dim("Not configured. Run 'agents
|
|
431
|
+
console.log(chalk.dim("Not configured. Run 'agents artifacts setup' or 'agents artifacts share join'."));
|
|
220
432
|
return;
|
|
221
433
|
}
|
|
222
434
|
if (!analyticsEnabled(cfg)) {
|
|
@@ -236,9 +448,24 @@ ${SHARE_DELETE_EXAMPLES}
|
|
|
236
448
|
}
|
|
237
449
|
});
|
|
238
450
|
}
|
|
451
|
+
/**
|
|
452
|
+
* Register the top-level `agents unshare <targets...>` alias of
|
|
453
|
+
* `agents artifacts share delete`. It takes the ROOT program (not the artifacts
|
|
454
|
+
* group) because it is deliberately a top-level convenience verb — taking a page
|
|
455
|
+
* down is the one artifact action typed often enough to keep at the root.
|
|
456
|
+
*/
|
|
457
|
+
export function registerUnshareCommand(program) {
|
|
458
|
+
const unshareCmd = registerShareDeleteOptions(program
|
|
459
|
+
.command('unshare <targets...>')
|
|
460
|
+
.description('Alias of `agents artifacts share delete` — take down a published page (and by default its OG cover).'));
|
|
461
|
+
setHelpSections(unshareCmd, { examples: SHARE_DELETE_EXAMPLES, notes: SHARE_DELETE_NOTES });
|
|
462
|
+
unshareCmd.action(async (targets, opts) => {
|
|
463
|
+
await runShareDelete(targets, opts);
|
|
464
|
+
});
|
|
465
|
+
}
|
|
239
466
|
/** Provision a fresh R2 bucket + Worker on the user's Cloudflare and persist the
|
|
240
|
-
* endpoint config + write token. Shared by `agents
|
|
241
|
-
*
|
|
467
|
+
* endpoint config + write token. Shared by both modes of `agents artifacts setup`
|
|
468
|
+
* (the flag-driven provision and the interactive wizard). */
|
|
242
469
|
export async function runShareProvision(opts) {
|
|
243
470
|
const { default: ora } = await import('ora');
|
|
244
471
|
const { input } = await import('@inquirer/prompts');
|
|
@@ -253,6 +480,7 @@ export async function runShareProvision(opts) {
|
|
|
253
480
|
const bucketName = opts.bucket;
|
|
254
481
|
const token = generateWriteToken();
|
|
255
482
|
const requestedDomain = cleanHostname(opts.domain) ?? DEFAULT_SHARE_DOMAIN;
|
|
483
|
+
const script = renderWorkerScript();
|
|
256
484
|
const spin = ora('Provisioning on Cloudflare…').start();
|
|
257
485
|
try {
|
|
258
486
|
const provisionOpts = opts.request ? { request: opts.request } : {};
|
|
@@ -260,7 +488,7 @@ export async function runShareProvision(opts) {
|
|
|
260
488
|
spin.text = `R2 bucket '${bucketName}' ready`;
|
|
261
489
|
await configureBucketLifecycle(apiToken, accountId, bucketName, provisionOpts);
|
|
262
490
|
spin.text = `R2 bucket '${bucketName}' lifecycle ready`;
|
|
263
|
-
await deployWorker(apiToken, accountId, workerName,
|
|
491
|
+
await deployWorker(apiToken, accountId, workerName, script, bucketName, provisionOpts);
|
|
264
492
|
spin.text = `Worker '${workerName}' deployed`;
|
|
265
493
|
await setWorkerSecret(apiToken, accountId, workerName, token, provisionOpts);
|
|
266
494
|
spin.text = `Worker '${workerName}' write token set`;
|
|
@@ -280,11 +508,19 @@ export async function runShareProvision(opts) {
|
|
|
280
508
|
}
|
|
281
509
|
}
|
|
282
510
|
spin.succeed('Provisioned');
|
|
283
|
-
const cfg = {
|
|
511
|
+
const cfg = {
|
|
512
|
+
baseUrl,
|
|
513
|
+
accountId,
|
|
514
|
+
workerName,
|
|
515
|
+
bucketName,
|
|
516
|
+
domain,
|
|
517
|
+
analyticsToken: opts.analyticsToken,
|
|
518
|
+
templateHash: hashWorkerScript(script),
|
|
519
|
+
};
|
|
284
520
|
writeShareConfig(cfg);
|
|
285
521
|
storeWriteToken(token);
|
|
286
522
|
console.log(chalk.green(`\nShare endpoint ready → ${chalk.bold(baseUrl)}`));
|
|
287
|
-
console.log(chalk.dim('Publish with: ') + chalk.cyan('agents share <file>'));
|
|
523
|
+
console.log(chalk.dim('Publish with: ') + chalk.cyan('agents artifacts share <file>'));
|
|
288
524
|
console.log(chalk.dim(`Fleet: push the token with 'agents secrets export share --host <box>' and pull config with 'agents repo pull'.`));
|
|
289
525
|
}
|
|
290
526
|
catch (e) {
|
|
@@ -292,6 +528,32 @@ export async function runShareProvision(opts) {
|
|
|
292
528
|
throw e;
|
|
293
529
|
}
|
|
294
530
|
}
|
|
531
|
+
/** Re-deploy the Worker script on an ALREADY-provisioned endpoint to match the
|
|
532
|
+
* current `worker-template.ts`. Reuses the existing account/worker/bucket and
|
|
533
|
+
* write token from `readShareConfig()`/the `share` bundle — never creates a
|
|
534
|
+
* bucket, touches routes/domains, or regenerates the token (see
|
|
535
|
+
* `updateWorker` in `lib/share/provision.ts` for how the token survives the
|
|
536
|
+
* re-upload). Idempotent: no-ops when the deployed hash already matches
|
|
537
|
+
* unless `force`. */
|
|
538
|
+
export async function runShareUpdate(opts = {}) {
|
|
539
|
+
const cfg = readShareConfig();
|
|
540
|
+
if (!cfg) {
|
|
541
|
+
throw new Error("Not configured. Run 'agents artifacts setup' (to provision) or 'agents artifacts share join' first.");
|
|
542
|
+
}
|
|
543
|
+
const { apiToken, accountId: acctFromBundle } = readCloudflareCreds(opts.bundle ?? DEFAULT_CF_BUNDLE, {
|
|
544
|
+
apiToken: opts.token,
|
|
545
|
+
accountId: opts.account,
|
|
546
|
+
});
|
|
547
|
+
const accountId = opts.account || acctFromBundle || cfg.accountId;
|
|
548
|
+
const writeToken = readWriteToken();
|
|
549
|
+
const script = renderWorkerScript();
|
|
550
|
+
const provisionOpts = { ...(opts.request ? { request: opts.request } : {}), force: opts.force };
|
|
551
|
+
const result = await updateWorker(apiToken, accountId, cfg.workerName, cfg.bucketName, script, writeToken, cfg.templateHash, provisionOpts);
|
|
552
|
+
if (!result.skipped) {
|
|
553
|
+
writeShareConfig({ ...cfg, templateHash: result.templateHash });
|
|
554
|
+
}
|
|
555
|
+
return { updated: !result.skipped, templateHash: result.templateHash, baseUrl: cfg.baseUrl, workerName: cfg.workerName };
|
|
556
|
+
}
|
|
295
557
|
function cleanHostname(domain) {
|
|
296
558
|
const raw = domain?.trim().replace(/\/+$/, '');
|
|
297
559
|
if (!raw)
|
|
@@ -305,14 +567,14 @@ function cleanHostname(domain) {
|
|
|
305
567
|
}
|
|
306
568
|
}
|
|
307
569
|
/** Join an existing share endpoint (no provisioning): prompt for the endpoint
|
|
308
|
-
* details + write token and persist them. Shared by `agents share join`
|
|
309
|
-
*
|
|
570
|
+
* details + write token and persist them. Shared by `agents artifacts share join`
|
|
571
|
+
* and the `agents artifacts setup` wizard. */
|
|
310
572
|
export async function runShareJoin(baseUrl, opts = {}) {
|
|
311
573
|
const { password, input } = await import('@inquirer/prompts');
|
|
312
574
|
const existing = readShareConfig();
|
|
313
575
|
const clean = baseUrl?.replace(/\/+$/, '');
|
|
314
576
|
if (!clean && !existing) {
|
|
315
|
-
throw new Error("No synced share endpoint found. Pull config first with 'agents repo pull', or pass the endpoint URL: agents share join <baseUrl>.");
|
|
577
|
+
throw new Error("No synced share endpoint found. Pull config first with 'agents repo pull', or pass the endpoint URL: agents artifacts share join <baseUrl>.");
|
|
316
578
|
}
|
|
317
579
|
let cfg;
|
|
318
580
|
if (existing && (!clean || clean === existing.baseUrl)) {
|
|
@@ -345,5 +607,5 @@ export async function runShareJoin(baseUrl, opts = {}) {
|
|
|
345
607
|
throw new Error('A write token is required to join.');
|
|
346
608
|
writeShareConfig(cfg);
|
|
347
609
|
storeWriteToken(token);
|
|
348
|
-
console.log(chalk.green(`Joined ${chalk.bold(cfg.baseUrl)} — publish with `) + chalk.cyan('agents share <file>'));
|
|
610
|
+
console.log(chalk.green(`Joined ${chalk.bold(cfg.baseUrl)} — publish with `) + chalk.cyan('agents artifacts share <file>'));
|
|
349
611
|
}
|
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;
|