@phnx-labs/agents-cli 1.22.38 → 1.22.40
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 +302 -0
- package/README.md +111 -70
- package/dist/bin/agents +0 -0
- package/dist/bootstrap.js +46 -27
- package/dist/browser.js +2 -2
- package/dist/cli/command-registry.d.ts +135 -0
- package/dist/cli/command-registry.js +260 -0
- package/dist/commands/accounts.d.ts +20 -0
- package/dist/commands/accounts.js +186 -25
- package/dist/commands/apply.d.ts +3 -3
- package/dist/commands/apply.js +20 -63
- package/dist/commands/browser.js +206 -94
- package/dist/commands/budget.d.ts +7 -6
- package/dist/commands/budget.js +8 -7
- package/dist/commands/cloud.js +17 -20
- package/dist/commands/commands.js +1 -1
- package/dist/commands/computer-actions.d.ts +1 -35
- package/dist/commands/computer-actions.js +13 -181
- package/dist/commands/computer.d.ts +28 -3
- package/dist/commands/computer.js +93 -65
- package/dist/commands/config.js +47 -4
- package/dist/commands/cost.d.ts +2 -1
- package/dist/commands/cost.js +7 -6
- package/dist/commands/daemon.js +151 -4
- package/dist/commands/detach.js +1 -1
- package/dist/commands/doctor.js +19 -11
- package/dist/commands/events.js +1 -1
- package/dist/commands/exec.d.ts +2 -50
- package/dist/commands/exec.js +161 -216
- package/dist/commands/factory.js +1 -1
- package/dist/commands/feed.d.ts +2 -2
- package/dist/commands/feed.js +9 -12
- package/dist/commands/fleet-capture.js +25 -27
- package/dist/commands/focus.d.ts +2 -3
- package/dist/commands/focus.js +34 -9
- package/dist/commands/go.js +15 -5
- package/dist/commands/harness.d.ts +3 -3
- package/dist/commands/harness.js +53 -5
- package/dist/commands/hooks.js +1 -1
- package/dist/commands/import.js +2 -2
- package/dist/commands/insights.d.ts +5 -5
- package/dist/commands/insights.js +15 -9
- package/dist/commands/inspect.d.ts +2 -3
- package/dist/commands/inspect.js +4 -16
- package/dist/commands/logs.d.ts +2 -2
- package/dist/commands/logs.js +9 -9
- package/dist/commands/mcp.js +2 -2
- package/dist/commands/memory.js +1 -1
- package/dist/commands/message.d.ts +1 -1
- package/dist/commands/message.js +7 -7
- package/dist/commands/mine.d.ts +11 -8
- package/dist/commands/mine.js +11 -10
- package/dist/commands/models.js +1 -1
- package/dist/commands/modes.js +1 -1
- package/dist/commands/monitors.js +23 -6
- package/dist/commands/output.d.ts +7 -6
- package/dist/commands/output.js +11 -10
- package/dist/commands/packages.js +4 -4
- package/dist/commands/perf.js +1 -1
- package/dist/commands/permissions.js +49 -32
- package/dist/commands/plugins.d.ts +1 -1
- package/dist/commands/plugins.js +3 -3
- package/dist/commands/profiles.d.ts +6 -9
- package/dist/commands/profiles.js +8 -321
- package/dist/commands/projects.d.ts +9 -0
- package/dist/commands/projects.js +140 -8
- package/dist/commands/prune.js +5 -13
- package/dist/commands/refresh-rules.js +1 -1
- package/dist/commands/repo.d.ts +5 -7
- package/dist/commands/repo.js +34 -18
- package/dist/commands/resource-view.js +4 -0
- package/dist/commands/resume.d.ts +11 -7
- package/dist/commands/resume.js +82 -98
- package/dist/commands/route.d.ts +12 -0
- package/dist/commands/route.js +261 -0
- package/dist/commands/routines.d.ts +2 -3
- package/dist/commands/routines.js +120 -145
- package/dist/commands/rules.js +1 -1
- package/dist/commands/run-account-picker.d.ts +1 -1
- package/dist/commands/run-account-picker.js +2 -2
- package/dist/commands/run-broadcast.d.ts +21 -0
- package/dist/commands/run-broadcast.js +89 -0
- package/dist/commands/run-cloud.js +1 -1
- package/dist/commands/secrets-vault.d.ts +10 -0
- package/dist/commands/{login.js → secrets-vault.js} +34 -14
- package/dist/commands/secrets.d.ts +4 -4
- package/dist/commands/secrets.js +72 -63
- package/dist/commands/sessions-backfill.js +1 -1
- package/dist/commands/sessions-browser.d.ts +1 -1
- package/dist/commands/sessions-browser.js +9 -5
- package/dist/commands/sessions-export.js +2 -2
- package/dist/commands/sessions-inject.js +4 -5
- package/dist/commands/sessions-migrate.js +16 -27
- package/dist/commands/sessions-picker.d.ts +13 -0
- package/dist/commands/sessions-picker.js +182 -8
- package/dist/commands/sessions-resume.d.ts +7 -3
- package/dist/commands/sessions-resume.js +81 -33
- package/dist/commands/sessions-stats.js +2 -2
- package/dist/commands/sessions.d.ts +75 -68
- package/dist/commands/sessions.js +142 -180
- package/dist/commands/setup-computer.js +1 -1
- package/dist/commands/setup-fleet.js +3 -0
- package/dist/commands/setup-mine.d.ts +7 -3
- package/dist/commands/setup-mine.js +13 -8
- package/dist/commands/setup-secrets.js +2 -2
- package/dist/commands/setup-watchdog.js +2 -2
- package/dist/commands/setup.js +7 -2
- package/dist/commands/share.d.ts +65 -0
- package/dist/commands/share.js +253 -20
- package/dist/commands/skills.js +3 -3
- package/dist/commands/snapshot.d.ts +2 -2
- package/dist/commands/snapshot.js +9 -9
- package/dist/commands/ssh.d.ts +1 -1
- package/dist/commands/ssh.js +318 -48
- package/dist/commands/subagents.js +1 -1
- package/dist/commands/sync.js +24 -9
- package/dist/commands/teams.d.ts +2 -2
- package/dist/commands/teams.js +9 -18
- package/dist/commands/tmux.js +5 -1
- package/dist/commands/trash.js +1 -1
- package/dist/commands/usage.d.ts +1 -1
- package/dist/commands/usage.js +2 -2
- package/dist/commands/utils.d.ts +4 -14
- package/dist/commands/utils.js +6 -27
- package/dist/commands/versions.js +2 -2
- package/dist/commands/view.d.ts +9 -77
- package/dist/commands/view.js +23 -8
- package/dist/commands/watchdog.js +1 -1
- package/dist/commands/webhook.js +11 -25
- package/dist/commands/workflows.js +1 -1
- package/dist/index.js +1 -1
- package/dist/lib/account-capabilities.d.ts +39 -0
- package/dist/lib/account-capabilities.js +59 -0
- package/dist/lib/account-catalog.js +1 -1
- package/dist/lib/account-registry.d.ts +66 -0
- package/dist/lib/account-registry.js +151 -5
- package/dist/lib/{rotate.d.ts → accounting/rotate.d.ts} +4 -4
- package/dist/lib/{rotate.js → accounting/rotate.js} +8 -8
- package/dist/lib/{usage.d.ts → accounting/usage.d.ts} +4 -4
- package/dist/lib/{usage.js → accounting/usage.js} +11 -11
- package/dist/lib/agent-spec/provider.js +1 -1
- package/dist/lib/agents.d.ts +72 -4
- package/dist/lib/agents.js +231 -199
- package/dist/lib/answer-router.d.ts +2 -2
- package/dist/lib/ask-classifier.d.ts +1 -1
- package/dist/lib/ask-classifier.js +1 -1
- package/dist/lib/audit/log.js +1 -1
- package/dist/lib/auth-health.d.ts +1 -1
- package/dist/lib/auth-health.js +2 -2
- package/dist/lib/brand.js +1 -1
- package/dist/lib/browser/caller-identity.d.ts +28 -0
- package/dist/lib/browser/caller-identity.js +156 -0
- package/dist/lib/browser/cdp.js +1 -1
- package/dist/lib/browser/drivers/ssh.d.ts +1 -1
- package/dist/lib/browser/drivers/ssh.js +2 -2
- package/dist/lib/browser/hygiene.d.ts +10 -2
- package/dist/lib/browser/hygiene.js +7 -4
- package/dist/lib/browser/ipc.d.ts +22 -2
- package/dist/lib/browser/ipc.js +185 -21
- package/dist/lib/browser/profiles.d.ts +67 -3
- package/dist/lib/browser/profiles.js +129 -7
- package/dist/lib/browser/remote-control.d.ts +2 -2
- package/dist/lib/browser/remote-control.js +3 -3
- package/dist/lib/browser/runtime-state.d.ts +79 -0
- package/dist/lib/browser/runtime-state.js +119 -1
- package/dist/lib/browser/service.d.ts +113 -1
- package/dist/lib/browser/service.js +454 -40
- package/dist/lib/browser/sessions-list.d.ts +2 -1
- package/dist/lib/browser/sessions-list.js +4 -13
- package/dist/lib/browser/types.d.ts +18 -0
- package/dist/lib/budget/config.js +1 -1
- package/dist/lib/budget/ledger.js +1 -1
- package/dist/lib/byok-usage.js +1 -1
- package/dist/lib/capabilities.js +3 -15
- package/dist/lib/catchup.d.ts +1 -1
- package/dist/lib/catchup.js +1 -1
- package/dist/lib/cloud/dispatch.js +1 -1
- package/dist/lib/cloud/host.d.ts +3 -3
- package/dist/lib/cloud/host.js +5 -5
- package/dist/lib/cloud/rush.d.ts +9 -21
- package/dist/lib/cloud/rush.js +33 -120
- package/dist/lib/cloud/types.d.ts +2 -2
- package/dist/lib/commands.js +3 -13
- package/dist/lib/computer/actions.d.ts +36 -0
- package/dist/lib/computer/actions.js +162 -0
- package/dist/lib/computer/dispatch.d.ts +2 -2
- package/dist/lib/computer/dispatch.js +2 -2
- package/dist/lib/computer/sessions-list.d.ts +3 -3
- package/dist/lib/computer/sessions-list.js +2 -2
- package/dist/lib/config-keys.d.ts +12 -3
- package/dist/lib/config-keys.js +29 -6
- package/dist/lib/config-machine-keys.d.ts +4 -2
- package/dist/lib/config-machine-keys.js +6 -2
- package/dist/lib/crabbox/lease.js +9 -1
- package/dist/lib/crabbox/runtimes.d.ts +32 -7
- package/dist/lib/crabbox/runtimes.js +72 -30
- package/dist/lib/{daemon.d.ts → daemon/daemon.d.ts} +59 -1
- package/dist/lib/{daemon.js → daemon/daemon.js} +237 -49
- package/dist/lib/daemon-services.d.ts +1 -1
- package/dist/lib/daemon-services.js +5 -0
- package/dist/lib/daemon-ticks.d.ts +25 -0
- package/dist/lib/daemon-ticks.js +31 -1
- package/dist/lib/daemon-webhooks.d.ts +102 -0
- package/dist/lib/daemon-webhooks.js +210 -0
- package/dist/lib/device-config.d.ts +116 -72
- package/dist/lib/device-config.js +366 -132
- package/dist/lib/devices/config-migration.d.ts +29 -34
- package/dist/lib/devices/config-migration.js +209 -130
- package/dist/lib/devices/connect.d.ts +2 -2
- package/dist/lib/devices/connect.js +2 -2
- package/dist/lib/devices/discovery-policy.d.ts +30 -0
- package/dist/lib/devices/discovery-policy.js +101 -0
- package/dist/lib/devices/fleet-inventory.js +8 -3
- package/dist/lib/devices/harness-inventory.d.ts +1 -1
- package/dist/lib/devices/harness-inventory.js +12 -3
- package/dist/lib/devices/known-hosts.js +1 -1
- package/dist/lib/devices/pool.d.ts +61 -0
- package/dist/lib/devices/pool.js +83 -0
- package/dist/lib/devices/registry.d.ts +1 -1
- package/dist/lib/devices/registry.js +1 -1
- package/dist/lib/devices/resolve-profile.d.ts +2 -2
- package/dist/lib/devices/resolve-profile.js +2 -2
- package/dist/lib/devices/resolve-target.d.ts +1 -1
- package/dist/lib/devices/resolve-target.js +4 -4
- package/dist/lib/devices/self-host.d.ts +1 -1
- package/dist/lib/devices/self-host.js +3 -3
- package/dist/lib/devices/ssh-config.d.ts +1 -1
- package/dist/lib/devices/stats-cache.js +1 -1
- package/dist/lib/devices/sync.d.ts +3 -1
- package/dist/lib/devices/sync.js +3 -3
- package/dist/lib/doctor-diff.js +4 -4
- package/dist/lib/drift-sync.js +2 -2
- package/dist/lib/drift.js +2 -2
- package/dist/lib/event-families.d.ts +1 -1
- package/dist/lib/event-stream.d.ts +1 -1
- package/dist/lib/event-stream.js +2 -2
- package/dist/lib/events-ingest.js +2 -2
- package/dist/lib/exec.d.ts +8 -5
- package/dist/lib/exec.js +19 -13
- package/dist/lib/factory/snapshot.d.ts +1 -1
- package/dist/lib/factory/snapshot.js +1 -1
- package/dist/lib/{activity.d.ts → feed/activity.d.ts} +1 -1
- package/dist/lib/{activity.js → feed/activity.js} +7 -7
- package/dist/lib/{events.d.ts → feed/events.d.ts} +2 -2
- package/dist/lib/{events.js → feed/events.js} +5 -5
- package/dist/lib/{feed.js → feed/feed.js} +4 -4
- package/dist/lib/feed-outcome.d.ts +1 -1
- package/dist/lib/feed-policy.d.ts +1 -1
- package/dist/lib/feed-policy.js +1 -1
- package/dist/lib/feed-post.d.ts +1 -1
- package/dist/lib/feed-post.js +1 -1
- package/dist/lib/feed-ranking.d.ts +1 -1
- package/dist/lib/fleet/apply.d.ts +0 -6
- package/dist/lib/fleet/apply.js +18 -45
- package/dist/lib/fleet/auth-sync.d.ts +16 -35
- package/dist/lib/fleet/auth-sync.js +16 -75
- package/dist/lib/fleet/capture.js +8 -6
- package/dist/lib/fleet/manifest.js +23 -11
- package/dist/lib/fleet/types.d.ts +19 -7
- package/dist/lib/fleet-cache.d.ts +1 -1
- package/dist/lib/fleet-cache.js +1 -1
- package/dist/lib/format.d.ts +19 -0
- package/dist/lib/format.js +44 -1
- package/dist/lib/friction-heuristics.d.ts +1 -1
- package/dist/lib/git.d.ts +24 -1
- package/dist/lib/git.js +82 -38
- package/dist/lib/heal.js +3 -3
- package/dist/lib/hooks.d.ts +18 -0
- package/dist/lib/hooks.js +113 -1
- package/dist/lib/hosts/credentials.d.ts +30 -10
- package/dist/lib/hosts/credentials.js +38 -26
- package/dist/lib/hosts/dispatch.d.ts +3 -3
- package/dist/lib/hosts/dispatch.js +3 -3
- package/dist/lib/hosts/option.d.ts +3 -3
- package/dist/lib/hosts/option.js +7 -8
- package/dist/lib/hosts/passthrough.d.ts +17 -17
- package/dist/lib/hosts/passthrough.js +67 -50
- package/dist/lib/hosts/providers/devices.d.ts +1 -1
- package/dist/lib/hosts/providers/devices.js +1 -1
- package/dist/lib/hosts/reconcile.d.ts +1 -1
- package/dist/lib/hosts/reconcile.js +1 -1
- package/dist/lib/hosts/reconnect.d.ts +1 -1
- package/dist/lib/hosts/reconnect.js +2 -2
- package/dist/lib/hosts/registry.d.ts +5 -5
- package/dist/lib/hosts/registry.js +5 -5
- package/dist/lib/hosts/remote-cmd.d.ts +10 -10
- package/dist/lib/hosts/remote-cmd.js +25 -18
- package/dist/lib/hosts/remote-os.d.ts +4 -4
- package/dist/lib/hosts/remote-os.js +4 -4
- package/dist/lib/hosts/remote-session-id.d.ts +2 -2
- package/dist/lib/hosts/remote-session-id.js +2 -2
- package/dist/lib/hosts/routing-flag.d.ts +3 -3
- package/dist/lib/hosts/routing-flag.js +4 -5
- package/dist/lib/hosts/run-target.d.ts +4 -4
- package/dist/lib/hosts/run-target.js +4 -4
- package/dist/lib/hosts/session-index.d.ts +2 -2
- package/dist/lib/hosts/session-index.js +1 -1
- package/dist/lib/hosts/session-marker.d.ts +1 -1
- package/dist/lib/hosts/session-marker.js +1 -1
- package/dist/lib/hosts/types.d.ts +2 -2
- package/dist/lib/hosts/types.js +2 -2
- package/dist/lib/import.js +1 -1
- package/dist/lib/{migrate.d.ts → installations/migrate.d.ts} +49 -1
- package/dist/lib/{migrate.js → installations/migrate.js} +265 -38
- package/dist/lib/installations/resolve.js +1 -1
- package/dist/lib/installations/strategies.js +1 -1
- package/dist/lib/installations/update.js +2 -2
- package/dist/lib/{versions.d.ts → installations/versions.d.ts} +12 -3
- package/dist/lib/{versions.js → installations/versions.js} +51 -31
- package/dist/lib/isolation-boundary-report.js +1 -1
- package/dist/lib/linear-projects.d.ts +28 -0
- package/dist/lib/linear-projects.js +30 -0
- package/dist/lib/loop.js +1 -1
- package/dist/lib/mailbox-gc.js +1 -1
- package/dist/lib/mailbox.js +1 -1
- package/dist/lib/mcp-registry.d.ts +62 -0
- package/dist/lib/mcp-registry.js +177 -0
- package/dist/lib/mcp.d.ts +5 -0
- package/dist/lib/mcp.js +124 -307
- 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/install-menubar.d.ts +7 -0
- package/dist/lib/menubar/install-menubar.js +24 -6
- package/dist/lib/menubar/snapshot.d.ts +7 -0
- package/dist/lib/menubar/snapshot.js +8 -6
- package/dist/lib/models.js +1 -1
- package/dist/lib/monitors/config.d.ts +12 -0
- package/dist/lib/monitors/config.js +3 -0
- package/dist/lib/monitors/dispatch.js +26 -5
- package/dist/lib/monitors/engine.js +10 -0
- package/dist/lib/monitors/sources/webhook.d.ts +1 -1
- package/dist/lib/monitors/state.d.ts +42 -0
- package/dist/lib/monitors/state.js +30 -0
- package/dist/lib/notify.d.ts +1 -1
- package/dist/lib/observe-aliases.d.ts +2 -2
- package/dist/lib/observe-aliases.js +2 -11
- package/dist/lib/output/git-output.js +2 -2
- package/dist/lib/overdue.d.ts +1 -1
- package/dist/lib/overdue.js +1 -1
- package/dist/lib/permissions-registry.d.ts +65 -0
- package/dist/lib/permissions-registry.js +599 -0
- package/dist/lib/permissions.d.ts +24 -13
- package/dist/lib/permissions.js +52 -271
- package/dist/lib/picker.d.ts +16 -0
- package/dist/lib/picker.js +33 -3
- package/dist/lib/placement.d.ts +1 -1
- package/dist/lib/placement.js +4 -4
- package/dist/lib/platform/paths.d.ts +8 -0
- package/dist/lib/platform/paths.js +11 -0
- package/dist/lib/platform/posixpath.js +3 -3
- package/dist/lib/{plugin-marketplace.d.ts → plugins/plugin-marketplace.d.ts} +1 -1
- package/dist/lib/{plugin-marketplace.js → plugins/plugin-marketplace.js} +2 -2
- package/dist/lib/{plugins.d.ts → plugins/plugins.d.ts} +1 -1
- package/dist/lib/{plugins.js → plugins/plugins.js} +7 -7
- package/dist/lib/{skills.d.ts → plugins/skills.d.ts} +1 -1
- package/dist/lib/{skills.js → plugins/skills.js} +7 -7
- package/dist/lib/pricing/cost.d.ts +1 -1
- package/dist/lib/pricing/cost.js +1 -1
- package/dist/lib/profiles-presets.d.ts +1 -1
- package/dist/lib/profiles-presets.js +1 -1
- package/dist/lib/profiles.js +2 -2
- package/dist/lib/project-import.js +4 -1
- package/dist/lib/project-launch.d.ts +1 -1
- package/dist/lib/project-launch.js +3 -3
- package/dist/lib/project-pull.d.ts +128 -0
- package/dist/lib/project-pull.js +384 -0
- package/dist/lib/project-root.d.ts +2 -2
- package/dist/lib/project-root.js +2 -2
- package/dist/lib/project-status.js +1 -1
- package/dist/lib/projects.d.ts +23 -0
- package/dist/lib/projects.js +29 -6
- package/dist/lib/refresh.d.ts +12 -1
- package/dist/lib/refresh.js +16 -9
- package/dist/lib/registry.d.ts +9 -2
- package/dist/lib/registry.js +11 -4
- package/dist/lib/resources.d.ts +2 -2
- package/dist/lib/resources.js +2 -2
- package/dist/lib/routers.d.ts +81 -0
- package/dist/lib/routers.js +153 -0
- package/dist/lib/routine-context.d.ts +1 -0
- package/dist/lib/routine-context.js +7 -2
- package/dist/lib/routine-notify-owner.d.ts +1 -1
- package/dist/lib/routine-notify.d.ts +1 -1
- package/dist/lib/routine-notify.js +1 -1
- package/dist/lib/routine-process-cleanup.d.ts +1 -1
- package/dist/lib/routine-readiness.d.ts +1 -1
- package/dist/lib/routine-readiness.js +11 -4
- package/dist/lib/routines-placement.d.ts +12 -2
- package/dist/lib/routines-placement.js +20 -3
- package/dist/lib/routines-project.d.ts +1 -1
- package/dist/lib/routines-project.js +1 -1
- package/dist/lib/rules/compile.d.ts +1 -0
- package/dist/lib/rules/compile.js +10 -2
- package/dist/lib/rules/rules.js +1 -1
- package/dist/lib/run-notify.js +1 -1
- package/dist/lib/runner.d.ts +80 -2
- package/dist/lib/runner.js +241 -62
- package/dist/lib/sandbox.d.ts +1 -1
- package/dist/lib/scheduler.d.ts +1 -1
- package/dist/lib/scheduler.js +1 -1
- package/dist/lib/{routines.d.ts → scheduling/routines.d.ts} +54 -9
- package/dist/lib/{routines.js → scheduling/routines.js} +173 -14
- 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.js +2 -2
- package/dist/lib/secrets/audit.js +1 -1
- package/dist/lib/secrets/bundles.d.ts +3 -3
- package/dist/lib/secrets/bundles.js +7 -7
- package/dist/lib/secrets/index.js +1 -1
- package/dist/lib/secrets/list-filter.d.ts +1 -1
- package/dist/lib/secrets/list-filter.js +2 -2
- package/dist/lib/secrets/push.d.ts +1 -1
- package/dist/lib/secrets/push.js +10 -12
- package/dist/lib/secrets/remote.d.ts +12 -10
- package/dist/lib/secrets/remote.js +21 -14
- package/dist/lib/secrets/vault.js +2 -2
- package/dist/lib/self-heal/checks/shadowing.js +1 -1
- package/dist/lib/self-heal/checks/shims.js +1 -1
- package/dist/lib/self-update.d.ts +39 -4
- package/dist/lib/self-update.js +78 -25
- package/dist/lib/serve/control.d.ts +1 -1
- package/dist/lib/serve/control.js +4 -4
- package/dist/lib/serve/data.d.ts +1 -1
- package/dist/lib/serve/data.js +1 -1
- package/dist/lib/serve/stream.js +1 -1
- package/dist/lib/service-manifest.d.ts +29 -0
- package/dist/lib/service-manifest.js +80 -0
- package/dist/lib/session/active.d.ts +59 -7
- package/dist/lib/session/active.js +158 -17
- package/dist/lib/session/bash-command.js +1 -1
- package/dist/lib/session/claude-accounts.d.ts +1 -1
- package/dist/lib/session/claude-accounts.js +1 -1
- package/dist/lib/session/db.d.ts +10 -2
- package/dist/lib/session/db.js +25 -6
- package/dist/lib/session/discover.d.ts +77 -0
- package/dist/lib/session/discover.js +130 -25
- package/dist/lib/session/fork.js +1 -1
- package/dist/lib/session/inject.d.ts +1 -1
- package/dist/lib/session/insights.d.ts +1 -1
- package/dist/lib/session/insights.js +1 -1
- package/dist/lib/session/live-metadata.d.ts +15 -0
- package/dist/lib/session/live-metadata.js +76 -0
- package/dist/lib/session/migrate-targets.d.ts +1 -1
- package/dist/lib/session/recovery.d.ts +1 -1
- package/dist/lib/session/recovery.js +2 -2
- package/dist/lib/session/remote-active.d.ts +10 -1
- package/dist/lib/session/remote-active.js +8 -3
- package/dist/lib/session/remote-bundle.d.ts +1 -1
- package/dist/lib/session/remote-bundle.js +2 -2
- package/dist/lib/session/remote-list.d.ts +15 -4
- package/dist/lib/session/remote-list.js +40 -3
- package/dist/lib/session/remote.d.ts +5 -5
- package/dist/lib/session/remote.js +13 -17
- package/dist/lib/session/resume-command.d.ts +3 -2
- package/dist/lib/session/resume-command.js +4 -3
- package/dist/lib/session/resume-owner.d.ts +3 -3
- package/dist/lib/session/resume-owner.js +3 -3
- package/dist/lib/session/session-cache.d.ts +12 -0
- package/dist/lib/session/session-cache.js +2 -0
- package/dist/lib/session/shell-programs.js +1 -1
- package/dist/lib/session/state.js +5 -5
- package/dist/lib/session/team-filter.d.ts +1 -1
- package/dist/lib/session/team-filter.js +1 -1
- package/dist/lib/session/types.d.ts +3 -3
- package/dist/lib/session/width.d.ts +2 -2
- package/dist/lib/session/width.js +2 -2
- package/dist/lib/share/delete.d.ts +21 -0
- package/dist/lib/share/delete.js +42 -0
- package/dist/lib/share/publish.d.ts +82 -0
- package/dist/lib/share/publish.js +170 -18
- package/dist/lib/share/worker-template.js +172 -9
- package/dist/lib/shims.js +35 -7
- package/dist/lib/smart-launch.d.ts +36 -6
- package/dist/lib/smart-launch.js +65 -8
- package/dist/lib/snapshot.d.ts +4 -4
- package/dist/lib/snapshot.js +2 -2
- package/dist/lib/ssh-exec.d.ts +1 -1
- package/dist/lib/ssh-exec.js +2 -2
- package/dist/lib/ssh-tunnel.d.ts +10 -10
- package/dist/lib/ssh-tunnel.js +12 -12
- package/dist/lib/staleness/checkers/hooks.d.ts +1 -1
- package/dist/lib/staleness/checkers/hooks.js +1 -1
- package/dist/lib/staleness/detectors/permissions.js +0 -23
- package/dist/lib/staleness/detectors/plugins.js +1 -1
- package/dist/lib/staleness/fingerprint.js +1 -1
- package/dist/lib/staleness/layers.d.ts +1 -1
- package/dist/lib/staleness/layers.js +1 -1
- package/dist/lib/staleness/writers/mcp.js +3 -1
- package/dist/lib/staleness/writers/plugins.js +1 -1
- package/dist/lib/staleness/writers/types.d.ts +8 -0
- package/dist/lib/startup/command-registry.d.ts +5 -147
- package/dist/lib/startup/command-registry.js +38 -303
- package/dist/lib/startup/dev-build.d.ts +0 -21
- package/dist/lib/startup/dev-build.js +29 -8
- package/dist/lib/state.d.ts +19 -1
- package/dist/lib/state.js +120 -51
- package/dist/lib/subagents.js +1 -1
- package/dist/lib/sync-status.js +1 -1
- package/dist/lib/sync-umbrella.d.ts +6 -1
- package/dist/lib/sync-umbrella.js +9 -4
- package/dist/lib/teams/agents.js +2 -2
- package/dist/lib/teams/registry.js +1 -1
- package/dist/lib/terminal/backends/vscodium-agent.js +1 -1
- package/dist/lib/terminal/engine.js +1 -1
- package/dist/lib/terminal/index.d.ts +4 -0
- package/dist/lib/terminal/index.js +3 -0
- package/dist/lib/terminal/inject.d.ts +2 -2
- package/dist/lib/terminal/inject.js +2 -2
- package/dist/lib/terminal/transport.js +1 -1
- package/dist/lib/tmux/index.d.ts +1 -1
- package/dist/lib/tmux/index.js +1 -1
- package/dist/lib/tmux/session.d.ts +21 -5
- package/dist/lib/tmux/session.js +76 -22
- package/dist/lib/triggers/handlers.d.ts +1 -1
- package/dist/lib/triggers/handlers.js +2 -2
- package/dist/lib/triggers/webhook.d.ts +36 -2
- package/dist/lib/triggers/webhook.js +97 -42
- package/dist/lib/types.d.ts +18 -6
- package/dist/lib/usage-fleet.d.ts +1 -1
- package/dist/lib/usage-fleet.js +1 -1
- package/dist/lib/usage-refresh.d.ts +1 -1
- package/dist/lib/usage-refresh.js +3 -3
- package/dist/lib/version-duplicates.js +2 -2
- package/dist/lib/view-types.d.ts +56 -0
- package/dist/lib/view-types.js +1 -0
- package/dist/lib/watchdog/rotate.d.ts +2 -2
- package/dist/lib/watchdog/rotate.js +3 -3
- package/dist/lib/watchdog/runner.d.ts +2 -3
- package/dist/lib/watchdog/runner.js +3 -4
- package/dist/lib/workflows.js +1 -1
- package/package.json +2 -1
- package/scripts/postinstall.js +2 -2
- package/dist/commands/bench.d.ts +0 -2
- package/dist/commands/bench.js +0 -101
- package/dist/commands/cp.d.ts +0 -84
- package/dist/commands/cp.js +0 -231
- package/dist/commands/login.d.ts +0 -2
- package/dist/lib/resources/commands.d.ts +0 -46
- package/dist/lib/resources/commands.js +0 -211
- package/dist/lib/resources/hooks.d.ts +0 -16
- package/dist/lib/resources/hooks.js +0 -153
- package/dist/lib/resources/mcp.d.ts +0 -34
- package/dist/lib/resources/mcp.js +0 -250
- package/dist/lib/resources/memory.d.ts +0 -15
- package/dist/lib/resources/memory.js +0 -46
- package/dist/lib/resources/permissions.d.ts +0 -13
- package/dist/lib/resources/permissions.js +0 -202
- package/dist/lib/resources/rules.d.ts +0 -46
- package/dist/lib/resources/rules.js +0 -179
- package/dist/lib/resources/skills.d.ts +0 -37
- package/dist/lib/resources/skills.js +0 -247
- package/dist/lib/resources/subagents.d.ts +0 -46
- package/dist/lib/resources/subagents.js +0 -202
- /package/dist/lib/{feed.d.ts → feed/feed.d.ts} +0 -0
|
@@ -2,10 +2,11 @@
|
|
|
2
2
|
* `agents setup mine` — interactive wizard to white-label the CLI under your own
|
|
3
3
|
* name. Pick a name, choose which features to turn off, and get a personally-
|
|
4
4
|
* named binary (e.g. `jack`) that runs every agents verb as yours. Delegates the
|
|
5
|
-
* actual minting to `initBrand` (see mine.ts)
|
|
6
|
-
*
|
|
5
|
+
* actual minting to `initBrand` (see mine.ts). Manage verbs (init/list/toggle/
|
|
6
|
+
* remove) live under the same `setup mine` command.
|
|
7
7
|
*
|
|
8
8
|
* Idempotent: re-running for an existing brand offers to re-mint it.
|
|
9
|
+
* Bare `agents setup mine` (no subcommand) runs the wizard.
|
|
9
10
|
*/
|
|
10
11
|
import type { Command } from 'commander';
|
|
11
12
|
/**
|
|
@@ -14,5 +15,8 @@ import type { Command } from 'commander';
|
|
|
14
15
|
* relies on that.
|
|
15
16
|
*/
|
|
16
17
|
export declare function runMineWizard(): Promise<boolean>;
|
|
17
|
-
/**
|
|
18
|
+
/**
|
|
19
|
+
* Register `agents setup mine` under the parent `setup` command.
|
|
20
|
+
* Bare invocation runs the wizard; init/list/toggle/remove manage brands.
|
|
21
|
+
*/
|
|
18
22
|
export declare function registerSetupMineCommand(setupCmd: Command): void;
|
|
@@ -2,20 +2,21 @@
|
|
|
2
2
|
* `agents setup mine` — interactive wizard to white-label the CLI under your own
|
|
3
3
|
* name. Pick a name, choose which features to turn off, and get a personally-
|
|
4
4
|
* named binary (e.g. `jack`) that runs every agents verb as yours. Delegates the
|
|
5
|
-
* actual minting to `initBrand` (see mine.ts)
|
|
6
|
-
*
|
|
5
|
+
* actual minting to `initBrand` (see mine.ts). Manage verbs (init/list/toggle/
|
|
6
|
+
* remove) live under the same `setup mine` command.
|
|
7
7
|
*
|
|
8
8
|
* Idempotent: re-running for an existing brand offers to re-mint it.
|
|
9
|
+
* Bare `agents setup mine` (no subcommand) runs the wizard.
|
|
9
10
|
*/
|
|
10
11
|
import chalk from 'chalk';
|
|
11
|
-
import { initBrand } from './mine.js';
|
|
12
|
+
import { initBrand, registerMineManageCommands } from './mine.js';
|
|
12
13
|
import { validateBrandName, getBrandConfig } from '../lib/brand.js';
|
|
13
14
|
import { isShimsInPath } from '../lib/shims.js';
|
|
14
15
|
import { isInteractiveTerminal, isPromptCancelled } from './utils.js';
|
|
15
16
|
/**
|
|
16
17
|
* Optional/heavier top-level commands a brand commonly turns off. Kept short so
|
|
17
18
|
* the checkbox is scannable — anything can still be toggled later with
|
|
18
|
-
* `agents mine toggle <name> --disable <cmd>`.
|
|
19
|
+
* `agents setup mine toggle <name> --disable <cmd>`.
|
|
19
20
|
*/
|
|
20
21
|
const DISABLEABLE_FEATURES = [
|
|
21
22
|
{ name: 'teams', hint: 'coordinate multiple agents on shared work' },
|
|
@@ -34,7 +35,7 @@ const DISABLEABLE_FEATURES = [
|
|
|
34
35
|
export async function runMineWizard() {
|
|
35
36
|
if (!isInteractiveTerminal()) {
|
|
36
37
|
console.log(chalk.dim('Non-interactive shell. Create a brand directly, e.g.:\n') +
|
|
37
|
-
chalk.cyan(' agents mine init jack --disable teams cloud'));
|
|
38
|
+
chalk.cyan(' agents setup mine init jack --disable teams cloud'));
|
|
38
39
|
return false;
|
|
39
40
|
}
|
|
40
41
|
const { input, checkbox, confirm } = await import('@inquirer/prompts');
|
|
@@ -79,14 +80,17 @@ function printNextSteps(name, pathWarning) {
|
|
|
79
80
|
console.log(chalk.bold('\nTry it:'));
|
|
80
81
|
console.log(' ' + chalk.cyan(`${name} --help`) + chalk.dim(` # your CLI, your name`));
|
|
81
82
|
console.log(' ' + chalk.cyan(`${name} run claude "hello"`));
|
|
82
|
-
console.log(chalk.dim(` Manage it later: agents mine toggle ${name} --disable <cmd> · agents mine list`));
|
|
83
|
+
console.log(chalk.dim(` Manage it later: agents setup mine toggle ${name} --disable <cmd> · agents setup mine list`));
|
|
83
84
|
if (pathWarning) {
|
|
84
85
|
console.log(chalk.yellow(`\n note: the shims dir isn't on your PATH yet — run 'agents setup' or open a new shell.`));
|
|
85
86
|
}
|
|
86
87
|
}
|
|
87
|
-
/**
|
|
88
|
+
/**
|
|
89
|
+
* Register `agents setup mine` under the parent `setup` command.
|
|
90
|
+
* Bare invocation runs the wizard; init/list/toggle/remove manage brands.
|
|
91
|
+
*/
|
|
88
92
|
export function registerSetupMineCommand(setupCmd) {
|
|
89
|
-
setupCmd
|
|
93
|
+
const mineCmd = setupCmd
|
|
90
94
|
.command('mine')
|
|
91
95
|
.description('White-label the CLI — mint your own personally-named binary (e.g. `jack`).')
|
|
92
96
|
.action(async () => {
|
|
@@ -102,4 +106,5 @@ export function registerSetupMineCommand(setupCmd) {
|
|
|
102
106
|
process.exitCode = 1;
|
|
103
107
|
}
|
|
104
108
|
});
|
|
109
|
+
registerMineManageCommands(mineCmd);
|
|
105
110
|
}
|
|
@@ -69,7 +69,7 @@ function printBackendNotes(backend) {
|
|
|
69
69
|
console.log(chalk.gray('backend: file — encrypted at rest; headless reads need no passphrase by default, via a machine-local key at ~/.agents/.secrets-key/passphrase.'));
|
|
70
70
|
}
|
|
71
71
|
else {
|
|
72
|
-
console.log(chalk.gray('backend: vault — synced ~/.agents/vault.age storage; unlock it with agents
|
|
72
|
+
console.log(chalk.gray('backend: vault — synced ~/.agents/vault.age storage; unlock it with `agents secrets vault unlock`.'));
|
|
73
73
|
}
|
|
74
74
|
}
|
|
75
75
|
function runAgentsSubcommand(args) {
|
|
@@ -138,7 +138,7 @@ async function resolveInteractiveChoices(opts) {
|
|
|
138
138
|
choices: [
|
|
139
139
|
{ name: 'keychain — local OS keychain; reads may ask for Touch ID/device password', value: 'keychain' },
|
|
140
140
|
{ name: 'file — passphrase-encrypted file store for headless machines', value: 'file' },
|
|
141
|
-
{ name: 'vault — synced ~/.agents/vault.age file; requires agents
|
|
141
|
+
{ name: 'vault — synced ~/.agents/vault.age file; requires `agents secrets vault unlock`', value: 'vault' },
|
|
142
142
|
],
|
|
143
143
|
});
|
|
144
144
|
const policy = opts.policy ? parsePolicy(opts.policy) : await select({
|
|
@@ -10,7 +10,7 @@ export async function runWatchdogSetupWizard() {
|
|
|
10
10
|
const devices = [...new Set([...Object.keys(registry), machineId()].map(normalizeHost))].sort();
|
|
11
11
|
const enabled = new Set(devices.filter((device) => getConfigValue('watchdog.enabled', { device }).value === true));
|
|
12
12
|
if (!process.stdin.isTTY || !process.stdout.isTTY) {
|
|
13
|
-
requireInteractiveSelection('watchdog devices', ['agents watchdog on', 'agents watchdog on --
|
|
13
|
+
requireInteractiveSelection('watchdog devices', ['agents watchdog on', 'agents watchdog on --device <device>']);
|
|
14
14
|
}
|
|
15
15
|
try {
|
|
16
16
|
const { checkbox } = await import('@inquirer/prompts');
|
|
@@ -25,7 +25,7 @@ export async function runWatchdogSetupWizard() {
|
|
|
25
25
|
setConfigValue('watchdog.enabled', on);
|
|
26
26
|
continue;
|
|
27
27
|
}
|
|
28
|
-
const launch = getCliLaunch(['watchdog', on ? 'on' : 'off', '--
|
|
28
|
+
const launch = getCliLaunch(['watchdog', on ? 'on' : 'off', '--device', device]);
|
|
29
29
|
const result = spawnSync(launch.command, launch.args, { stdio: 'inherit', env: process.env });
|
|
30
30
|
if ((result.status ?? 1) !== 0)
|
|
31
31
|
throw new Error(`Could not configure watchdog on ${device}`);
|
package/dist/commands/setup.js
CHANGED
|
@@ -15,7 +15,7 @@ import { getAgentsDir, getVersionsDir, ensureAgentsDir } from '../lib/state.js';
|
|
|
15
15
|
import { isGitRepo, cloneIntoExisting, pullRepo } from '../lib/git.js';
|
|
16
16
|
import { isPromptCancelled, isInteractiveTerminal } from './utils.js';
|
|
17
17
|
import { AGENTS, agentConfigDirName, getUnmanagedAgentInstalls, countSessionFiles, agentLabel } from '../lib/agents.js';
|
|
18
|
-
import { setGlobalDefault } from '../lib/versions.js';
|
|
18
|
+
import { setGlobalDefault } from '../lib/installations/versions.js';
|
|
19
19
|
import { ensureShimCurrent, switchHomeFileSymlinks, isShimsInPath, addShimsToPath, getPathSetupInstructions, assertIsolationBoundary } from '../lib/shims.js';
|
|
20
20
|
import { setHelpSections } from '../lib/help.js';
|
|
21
21
|
import { registerSetupBrowserCommand, runBrowserWizard } from './setup-browser.js';
|
|
@@ -137,7 +137,7 @@ export async function runSetup(program, options = {}) {
|
|
|
137
137
|
: (await import('../lib/device-config.js')).isDaemonEnabled();
|
|
138
138
|
if (enabled) {
|
|
139
139
|
const start = options.startDaemonFn
|
|
140
|
-
?? (await import('../lib/daemon.js')).startDaemon;
|
|
140
|
+
?? (await import('../lib/daemon/daemon.js')).startDaemon;
|
|
141
141
|
const started = start();
|
|
142
142
|
if (started.method !== 'already-running' && started.pid) {
|
|
143
143
|
console.log(chalk.gray(`Started the always-on agents daemon (pid ${started.pid}).`));
|
|
@@ -150,6 +150,11 @@ export async function runSetup(program, options = {}) {
|
|
|
150
150
|
// resolve to ok:false), so this can never block setup.
|
|
151
151
|
const { runDeviceSync } = await import('../lib/devices/sync.js');
|
|
152
152
|
const dev = await runDeviceSync({ soft: true });
|
|
153
|
+
if (dev.ok) {
|
|
154
|
+
const { setDeviceDiscoveryStatus } = await import('../lib/devices/discovery-policy.js');
|
|
155
|
+
for (const name of dev.syncedNames)
|
|
156
|
+
setDeviceDiscoveryStatus(name, 'approved');
|
|
157
|
+
}
|
|
153
158
|
if (dev.ok && dev.synced > 0) {
|
|
154
159
|
console.log(chalk.gray(`Discovered ${dev.synced} device${dev.synced === 1 ? '' : 's'} on your tailnet (agents devices list).`));
|
|
155
160
|
}
|
package/dist/commands/share.d.ts
CHANGED
|
@@ -21,6 +21,24 @@ export interface ShareListItem {
|
|
|
21
21
|
publishedAt: string;
|
|
22
22
|
/** ISO auto-expire timestamp, or null for a permanent share. */
|
|
23
23
|
expiresAt: string | null;
|
|
24
|
+
/** Human display title (explicit `--label` or auto-derived), or null for a
|
|
25
|
+
* share published before this field existed. */
|
|
26
|
+
label: string | null;
|
|
27
|
+
/** Harness/agent name that published this (`AGENTS_AGENT_NAME`), or null. */
|
|
28
|
+
agent: string | null;
|
|
29
|
+
/** Session id that published this, or null. */
|
|
30
|
+
session: string | null;
|
|
31
|
+
/** Hostname the publish ran from, or null. */
|
|
32
|
+
host: string | null;
|
|
33
|
+
/** git repo name at publish time, or null (published outside a git repo, or
|
|
34
|
+
* before this field existed). */
|
|
35
|
+
repo: string | null;
|
|
36
|
+
/** Count of retained prior versions under this slug (see `share revisions`). */
|
|
37
|
+
revisionCount: number;
|
|
38
|
+
/** Arbitrary `--meta key=value` entries attached at publish time (RUSH-2683)
|
|
39
|
+
* — everything that isn't a reserved provenance/label key. `{}` when none
|
|
40
|
+
* were set, or when the deployed Worker predates this field. */
|
|
41
|
+
meta: Record<string, string>;
|
|
24
42
|
}
|
|
25
43
|
export interface ShareListResult {
|
|
26
44
|
/** The namespace listed. */
|
|
@@ -48,11 +66,58 @@ export declare function runShareList(opts?: {
|
|
|
48
66
|
githubUser?: string;
|
|
49
67
|
config?: ShareConfig;
|
|
50
68
|
fetchListing?: ListingFetchFn;
|
|
69
|
+
/** Only shares published by this agent/harness (case-insensitive, exact). */
|
|
70
|
+
agent?: string;
|
|
71
|
+
/** Only shares published from this session id (exact). */
|
|
72
|
+
session?: string;
|
|
73
|
+
/** Only shares whose label contains this text (case-insensitive substring). */
|
|
74
|
+
label?: string;
|
|
51
75
|
}): Promise<ShareListResult>;
|
|
52
76
|
export declare function formatShareList(result: ShareListResult, json?: boolean): string;
|
|
77
|
+
/** One retained prior version of a slug, as reported by the Worker's
|
|
78
|
+
* `?revisions=json` route. */
|
|
79
|
+
export interface ShareRevisionItem {
|
|
80
|
+
/** R2 object key, `<user>/<slug>/rev-<ts>-<rand>`. */
|
|
81
|
+
key: string;
|
|
82
|
+
url: string;
|
|
83
|
+
size: number;
|
|
84
|
+
contentType: string | null;
|
|
85
|
+
/** ISO timestamp this version was replaced (when the copy was made). */
|
|
86
|
+
uploadedAt: string;
|
|
87
|
+
expiresAt: string | null;
|
|
88
|
+
label: string | null;
|
|
89
|
+
agent: string | null;
|
|
90
|
+
session: string | null;
|
|
91
|
+
host: string | null;
|
|
92
|
+
repo: string | null;
|
|
93
|
+
/** Arbitrary `--meta key=value` entries attached at publish time (RUSH-2683)
|
|
94
|
+
* — everything that isn't a reserved provenance/label key. `{}` when none
|
|
95
|
+
* were set, or when the deployed Worker predates this field. */
|
|
96
|
+
meta: Record<string, string>;
|
|
97
|
+
}
|
|
98
|
+
export interface ShareRevisionsResult {
|
|
99
|
+
/** The canonical `<user>/<slug>` key these are revisions of. */
|
|
100
|
+
key: string;
|
|
101
|
+
count: number;
|
|
102
|
+
revisions: ShareRevisionItem[];
|
|
103
|
+
}
|
|
104
|
+
/** Parse the Worker's `?revisions=json` payload, failing loud (with the same
|
|
105
|
+
* outdated-template hint as {@link parseShareListing}) on an unexpected shape. */
|
|
106
|
+
export declare function parseShareRevisions(key: string, body: string): ShareRevisionsResult;
|
|
107
|
+
/** Fetch and parse the retained prior versions of one published slug. `target`
|
|
108
|
+
* accepts the same three forms as `agents unshare` (a full URL, `<user>/<slug>`,
|
|
109
|
+
* or a bare slug resolved against the caller's own namespace) — reuses
|
|
110
|
+
* {@link resolveDeleteTarget} rather than re-deriving the key. */
|
|
111
|
+
export declare function runShareRevisions(target: string, opts?: {
|
|
112
|
+
githubUser?: string;
|
|
113
|
+
config?: ShareConfig;
|
|
114
|
+
fetchListing?: ListingFetchFn;
|
|
115
|
+
}): Promise<ShareRevisionsResult>;
|
|
116
|
+
export declare function formatShareRevisions(result: ShareRevisionsResult, json?: boolean): string;
|
|
53
117
|
export declare function formatShareDeleteResult(result: DeleteShareResult, json?: boolean): string;
|
|
54
118
|
interface ShareDeleteCliOpts {
|
|
55
119
|
keepCover?: boolean;
|
|
120
|
+
keepRevisions?: boolean;
|
|
56
121
|
ifExists?: boolean;
|
|
57
122
|
githubUser?: string;
|
|
58
123
|
json?: boolean;
|
package/dist/commands/share.js
CHANGED
|
@@ -5,11 +5,12 @@
|
|
|
5
5
|
// provisioning door lives beside it at `agents artifacts setup`
|
|
6
6
|
// (commands/artifacts-setup.ts), which calls `runShareProvision` below.
|
|
7
7
|
import { existsSync } from 'node:fs';
|
|
8
|
+
import { formatBytes } from '../lib/format.js';
|
|
8
9
|
import chalk from 'chalk';
|
|
9
10
|
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
11
|
import { addCustomDomain, configureBucketLifecycle, createBucket, deployWorker, enableWorkersDev, findZoneId, hashWorkerScript, updateWorker, setWorkerSecret, } from '../lib/share/provision.js';
|
|
11
|
-
import { publishFile, resolveShareUsername } from '../lib/share/publish.js';
|
|
12
|
-
import { deleteShare } from '../lib/share/delete.js';
|
|
12
|
+
import { publishFile, resolveShareUsername, parseMetaEntries } from '../lib/share/publish.js';
|
|
13
|
+
import { deleteShare, resolveDeleteTarget } from '../lib/share/delete.js';
|
|
13
14
|
import { renderWorkerScript } from '../lib/share/worker-template.js';
|
|
14
15
|
import { analyticsEnabled } from '../lib/share/analytics.js';
|
|
15
16
|
import { resolveGitHubUsername } from '../lib/git.js';
|
|
@@ -18,6 +19,10 @@ export function formatSharePublishResult(result, json = false) {
|
|
|
18
19
|
if (json)
|
|
19
20
|
return JSON.stringify(result, null, 2);
|
|
20
21
|
const lines = [chalk.green(result.url)];
|
|
22
|
+
if (result.label) {
|
|
23
|
+
const hint = result.labelSource === 'derived' ? chalk.dim(' (derived — pass --label to set one)') : '';
|
|
24
|
+
lines.push(chalk.dim(` "${result.label}"`) + hint);
|
|
25
|
+
}
|
|
21
26
|
if (result.coverUrl)
|
|
22
27
|
lines.push(chalk.dim(` cover ${result.coverUrl}`));
|
|
23
28
|
if (result.expiresAt)
|
|
@@ -47,6 +52,18 @@ async function defaultListingFetch(url) {
|
|
|
47
52
|
const res = await fetch(url, { headers: { accept: 'application/json' } });
|
|
48
53
|
return { status: res.status, contentType: res.headers.get('content-type') ?? '', body: await res.text() };
|
|
49
54
|
}
|
|
55
|
+
/** Normalize the Worker's `meta` field (arbitrary `--meta key=value` entries,
|
|
56
|
+
* RUSH-2683) into a plain string record — `{}` for a missing/malformed field
|
|
57
|
+
* (a deployed Worker that predates it, or a non-object value), never throws. */
|
|
58
|
+
function parseMetaField(raw) {
|
|
59
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw))
|
|
60
|
+
return {};
|
|
61
|
+
const out = {};
|
|
62
|
+
for (const [k, v] of Object.entries(raw)) {
|
|
63
|
+
out[k] = String(v);
|
|
64
|
+
}
|
|
65
|
+
return out;
|
|
66
|
+
}
|
|
50
67
|
/** Parse the Worker's listing JSON into a validated result, failing loud (with the
|
|
51
68
|
* outdated-template hint) on any body that isn't the expected shape — an old Worker
|
|
52
69
|
* serves the HTML gallery for a non-empty namespace, which must not be silently
|
|
@@ -72,6 +89,13 @@ export function parseShareListing(user, body) {
|
|
|
72
89
|
contentType: item.contentType == null ? null : String(item.contentType),
|
|
73
90
|
publishedAt: String(item.publishedAt ?? ''),
|
|
74
91
|
expiresAt: item.expiresAt == null ? null : String(item.expiresAt),
|
|
92
|
+
label: item.label == null ? null : String(item.label),
|
|
93
|
+
agent: item.agent == null ? null : String(item.agent),
|
|
94
|
+
session: item.session == null ? null : String(item.session),
|
|
95
|
+
host: item.host == null ? null : String(item.host),
|
|
96
|
+
repo: item.repo == null ? null : String(item.repo),
|
|
97
|
+
revisionCount: typeof item.revisionCount === 'number' ? item.revisionCount : 0,
|
|
98
|
+
meta: parseMetaField(item.meta),
|
|
75
99
|
};
|
|
76
100
|
});
|
|
77
101
|
return { user, count: objects.length, objects };
|
|
@@ -118,20 +142,38 @@ export async function runShareList(opts = {}) {
|
|
|
118
142
|
// the HTML gallery — the deployed template is outdated.
|
|
119
143
|
throw new Error(OUTDATED_TEMPLATE_HINT);
|
|
120
144
|
}
|
|
121
|
-
|
|
145
|
+
const parsed = parseShareListing(user, res.body);
|
|
146
|
+
return applyShareListFilters(parsed, opts);
|
|
147
|
+
}
|
|
148
|
+
/** Client-side filtering over an already-fetched listing (RUSH-2683) — the
|
|
149
|
+
* Worker has no query surface for this, so it narrows the fetched set instead
|
|
150
|
+
* of a second round trip. `count` reflects the FILTERED set, matching what the
|
|
151
|
+
* caller actually sees. */
|
|
152
|
+
function applyShareListFilters(result, filters) {
|
|
153
|
+
let objects = result.objects;
|
|
154
|
+
if (filters.agent) {
|
|
155
|
+
const needle = filters.agent.toLowerCase();
|
|
156
|
+
objects = objects.filter((o) => (o.agent ?? '').toLowerCase() === needle);
|
|
157
|
+
}
|
|
158
|
+
if (filters.session) {
|
|
159
|
+
objects = objects.filter((o) => o.session === filters.session);
|
|
160
|
+
}
|
|
161
|
+
if (filters.label) {
|
|
162
|
+
const needle = filters.label.toLowerCase();
|
|
163
|
+
objects = objects.filter((o) => (o.label ?? '').toLowerCase().includes(needle));
|
|
164
|
+
}
|
|
165
|
+
return { user: result.user, count: objects.length, objects };
|
|
122
166
|
}
|
|
123
167
|
/** Human-readable bytes, e.g. `1.2 KB`, `640 B`. */
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
}
|
|
134
|
-
return `${value < 10 ? value.toFixed(1) : Math.round(value)} ${units[unit]}`;
|
|
168
|
+
/** Render an arbitrary `--meta` map as `k=v k2=v2` for a human table row, or
|
|
169
|
+
* undefined when there's nothing to show (RUSH-2683). */
|
|
170
|
+
function formatMetaPairs(meta) {
|
|
171
|
+
if (!meta)
|
|
172
|
+
return undefined;
|
|
173
|
+
const entries = Object.entries(meta);
|
|
174
|
+
if (entries.length === 0)
|
|
175
|
+
return undefined;
|
|
176
|
+
return entries.map(([k, v]) => `${k}=${v}`).join(' ');
|
|
135
177
|
}
|
|
136
178
|
export function formatShareList(result, json = false) {
|
|
137
179
|
if (json)
|
|
@@ -143,8 +185,97 @@ export function formatShareList(result, json = false) {
|
|
|
143
185
|
chalk.dim(` ${result.count} published ${result.count === 1 ? 'page' : 'pages'}`);
|
|
144
186
|
const rows = result.objects.map((o) => {
|
|
145
187
|
const when = o.publishedAt ? o.publishedAt.slice(0, 10) : 'unknown';
|
|
146
|
-
const
|
|
147
|
-
|
|
188
|
+
const bits = [when, formatBytes(o.size)];
|
|
189
|
+
if (o.agent)
|
|
190
|
+
bits.push(o.agent);
|
|
191
|
+
if (o.revisionCount > 0)
|
|
192
|
+
bits.push(`${o.revisionCount} ${o.revisionCount === 1 ? 'revision' : 'revisions'}`);
|
|
193
|
+
if (o.expiresAt)
|
|
194
|
+
bits.push(`expires ${o.expiresAt.slice(0, 10)}`);
|
|
195
|
+
const metaPairs = formatMetaPairs(o.meta);
|
|
196
|
+
if (metaPairs)
|
|
197
|
+
bits.push(metaPairs);
|
|
198
|
+
const line = bits.join(' · ');
|
|
199
|
+
const title = o.label ? `${chalk.bold(o.label)}\n ` : '';
|
|
200
|
+
return `${title}${chalk.cyan(o.slug)} ${chalk.dim(line)}\n ${chalk.green(o.url)}`;
|
|
201
|
+
});
|
|
202
|
+
return [header, ...rows].join('\n');
|
|
203
|
+
}
|
|
204
|
+
/** Parse the Worker's `?revisions=json` payload, failing loud (with the same
|
|
205
|
+
* outdated-template hint as {@link parseShareListing}) on an unexpected shape. */
|
|
206
|
+
export function parseShareRevisions(key, body) {
|
|
207
|
+
let data;
|
|
208
|
+
try {
|
|
209
|
+
data = JSON.parse(body);
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
throw new Error(OUTDATED_TEMPLATE_HINT);
|
|
213
|
+
}
|
|
214
|
+
const revisionsRaw = data?.revisions;
|
|
215
|
+
if (!data || typeof data !== 'object' || !Array.isArray(revisionsRaw)) {
|
|
216
|
+
throw new Error(OUTDATED_TEMPLATE_HINT);
|
|
217
|
+
}
|
|
218
|
+
const revisions = revisionsRaw.map((o) => {
|
|
219
|
+
const item = o;
|
|
220
|
+
return {
|
|
221
|
+
key: String(item.key ?? ''),
|
|
222
|
+
url: String(item.url ?? ''),
|
|
223
|
+
size: typeof item.size === 'number' ? item.size : 0,
|
|
224
|
+
contentType: item.contentType == null ? null : String(item.contentType),
|
|
225
|
+
uploadedAt: String(item.uploadedAt ?? ''),
|
|
226
|
+
expiresAt: item.expiresAt == null ? null : String(item.expiresAt),
|
|
227
|
+
label: item.label == null ? null : String(item.label),
|
|
228
|
+
agent: item.agent == null ? null : String(item.agent),
|
|
229
|
+
session: item.session == null ? null : String(item.session),
|
|
230
|
+
host: item.host == null ? null : String(item.host),
|
|
231
|
+
repo: item.repo == null ? null : String(item.repo),
|
|
232
|
+
meta: parseMetaField(item.meta),
|
|
233
|
+
};
|
|
234
|
+
});
|
|
235
|
+
return { key, count: revisions.length, revisions };
|
|
236
|
+
}
|
|
237
|
+
/** Fetch and parse the retained prior versions of one published slug. `target`
|
|
238
|
+
* accepts the same three forms as `agents unshare` (a full URL, `<user>/<slug>`,
|
|
239
|
+
* or a bare slug resolved against the caller's own namespace) — reuses
|
|
240
|
+
* {@link resolveDeleteTarget} rather than re-deriving the key. */
|
|
241
|
+
export async function runShareRevisions(target, opts = {}) {
|
|
242
|
+
const cfg = opts.config ?? readShareConfig();
|
|
243
|
+
if (!cfg) {
|
|
244
|
+
throw new Error("Not set up yet. Run 'agents artifacts setup' (provision your own endpoint) or 'agents artifacts share join' (use an existing one).");
|
|
245
|
+
}
|
|
246
|
+
const templateStatus = shareTemplateStatus(cfg);
|
|
247
|
+
if (templateStatus === 'outdated') {
|
|
248
|
+
throw new Error(OUTDATED_TEMPLATE_HINT);
|
|
249
|
+
}
|
|
250
|
+
const { key } = await resolveDeleteTarget(target, { githubUser: opts.githubUser });
|
|
251
|
+
const revUrl = `${cfg.baseUrl.replace(/\/+$/, '')}/${key}?revisions=json`;
|
|
252
|
+
const fetchListing = opts.fetchListing ?? defaultListingFetch;
|
|
253
|
+
const res = await fetchListing(revUrl);
|
|
254
|
+
if (res.status !== 200) {
|
|
255
|
+
throw new Error(`Revisions lookup failed (${res.status}) for ${revUrl}. Check the endpoint is reachable, or that 'agents artifacts setup' completed.`);
|
|
256
|
+
}
|
|
257
|
+
if (!/application\/json/i.test(res.contentType)) {
|
|
258
|
+
throw new Error(OUTDATED_TEMPLATE_HINT);
|
|
259
|
+
}
|
|
260
|
+
return parseShareRevisions(key, res.body);
|
|
261
|
+
}
|
|
262
|
+
export function formatShareRevisions(result, json = false) {
|
|
263
|
+
if (json)
|
|
264
|
+
return JSON.stringify(result, null, 2);
|
|
265
|
+
if (result.count === 0) {
|
|
266
|
+
return chalk.dim(`No retained revisions for ${result.key} (only the current version exists).`);
|
|
267
|
+
}
|
|
268
|
+
const header = chalk.bold(result.key) + chalk.dim(` ${result.count} retained ${result.count === 1 ? 'revision' : 'revisions'}`);
|
|
269
|
+
const rows = result.revisions.map((r) => {
|
|
270
|
+
const bits = [r.uploadedAt ? r.uploadedAt.slice(0, 10) : 'unknown', formatBytes(r.size)];
|
|
271
|
+
if (r.agent)
|
|
272
|
+
bits.push(r.agent);
|
|
273
|
+
if (r.label)
|
|
274
|
+
bits.push(r.label);
|
|
275
|
+
const metaPairs = formatMetaPairs(r.meta);
|
|
276
|
+
if (metaPairs)
|
|
277
|
+
bits.push(metaPairs);
|
|
278
|
+
return `${chalk.cyan(r.uploadedAt || r.key)} ${chalk.dim(bits.join(' · '))}\n ${chalk.green(r.url)}`;
|
|
148
279
|
});
|
|
149
280
|
return [header, ...rows].join('\n');
|
|
150
281
|
}
|
|
@@ -159,6 +290,9 @@ export function formatShareDeleteResult(result, json = false) {
|
|
|
159
290
|
? chalk.dim(` cover deleted ${result.cover.url}`)
|
|
160
291
|
: chalk.dim(` cover (none) ${result.cover.url}`));
|
|
161
292
|
}
|
|
293
|
+
if (result.revisions?.length) {
|
|
294
|
+
lines.push(chalk.dim(` ${result.revisions.length} retained ${result.revisions.length === 1 ? 'revision' : 'revisions'} deleted`));
|
|
295
|
+
}
|
|
162
296
|
return lines.join('\n');
|
|
163
297
|
}
|
|
164
298
|
/** Shared handler for `agents artifacts share delete <targets...>` and the
|
|
@@ -175,6 +309,7 @@ export async function runShareDelete(targets, opts, deleteFn = deleteShare) {
|
|
|
175
309
|
try {
|
|
176
310
|
const result = await deleteFn(target, {
|
|
177
311
|
keepCover: opts.keepCover === true,
|
|
312
|
+
keepRevisions: opts.keepRevisions === true,
|
|
178
313
|
ifExists: opts.ifExists === true,
|
|
179
314
|
githubUser: opts.githubUser,
|
|
180
315
|
});
|
|
@@ -198,12 +333,13 @@ export async function runShareDelete(targets, opts, deleteFn = deleteShare) {
|
|
|
198
333
|
function registerShareDeleteOptions(cmd) {
|
|
199
334
|
return cmd
|
|
200
335
|
.option('--keep-cover', 'leave the sibling <slug>.png OG cover in place (default: delete it too)')
|
|
336
|
+
.option('--keep-revisions', 'leave retained revisions (<slug>/rev-*) in place (default: delete them too)')
|
|
201
337
|
.option('--if-exists', 'treat an already-missing target as a no-op success instead of an error')
|
|
202
338
|
.option('--github-user <user>', 'GitHub username for resolving a bare-slug target (default: resolved from gh/git config)')
|
|
203
339
|
.option('--json', 'emit machine-readable results');
|
|
204
340
|
}
|
|
205
341
|
const SHARE_DELETE_EXAMPLES = `
|
|
206
|
-
# Delete by full URL — also takes down the sibling OG cover
|
|
342
|
+
# Delete by full URL — also takes down the sibling OG cover and any retained revisions
|
|
207
343
|
agents artifacts share delete https://share.agents-cli.sh/octocat/my-plan-a1b2
|
|
208
344
|
|
|
209
345
|
# Delete by <user>/<slug>, or a bare slug in your own namespace
|
|
@@ -216,6 +352,9 @@ const SHARE_DELETE_EXAMPLES = `
|
|
|
216
352
|
# Keep the cover image up (rare — you usually want both gone)
|
|
217
353
|
agents unshare my-plan-a1b2 --keep-cover
|
|
218
354
|
|
|
355
|
+
# Keep retained revisions up too (rare — they're world-readable by URL like the page itself)
|
|
356
|
+
agents unshare my-plan-a1b2 --keep-revisions
|
|
357
|
+
|
|
219
358
|
# Don't error if it's already gone
|
|
220
359
|
agents unshare my-plan-a1b2 --if-exists
|
|
221
360
|
`;
|
|
@@ -224,6 +363,12 @@ const SHARE_DELETE_NOTES = `
|
|
|
224
363
|
Worker's DELETE is idempotent and returns {"ok":true} even for a key that was
|
|
225
364
|
never there, so that response alone is never proof of a takedown.
|
|
226
365
|
|
|
366
|
+
Also deletes any retained revisions of the target (RUSH-2683) — a share that was
|
|
367
|
+
republished at least once leaves its prior version(s) live at their own URL until
|
|
368
|
+
they're purged too, so leaving them up would defeat the point of taking the page
|
|
369
|
+
down. Pass --keep-revisions to leave them (they still expire via the bucket's
|
|
370
|
+
lifecycle rule on their own schedule either way).
|
|
371
|
+
|
|
227
372
|
agents artifacts share delete === agents unshare (same command, different name).
|
|
228
373
|
`;
|
|
229
374
|
/**
|
|
@@ -245,6 +390,10 @@ export function registerShareCommands(artifactsCmd) {
|
|
|
245
390
|
.option('--force', 'publish even when the file contains emails or credential-shaped strings')
|
|
246
391
|
.option('--no-cover', 'skip the OG preview image (HTML pages get one by default)')
|
|
247
392
|
.option('--no-analytics', 'skip injecting the Cloudflare Web Analytics beacon')
|
|
393
|
+
.option('--label <text>', 'human display title, shown in the gallery and `share list` (default: derived from the HTML <title>, frontmatter title, or filename)')
|
|
394
|
+
.option('--title <text>', 'alias of --label')
|
|
395
|
+
.option('--meta <key=value>', 'structured metadata (repeatable), e.g. --meta kind=plan --meta ticket=RUSH-2683. Recommended keys: kind (plan|report|visual|screenshot|recording|deck|doc), project, ticket, status (draft|final). Reserved (set automatically, not settable): agent, session, host, repo, date, label', (val, prev) => [...prev, val], [])
|
|
396
|
+
.option('--no-revision', "overwrite an existing slug in place — skip keeping the prior version as a <slug>/rev-<ts> backup (default: keep it, see 'agents artifacts share revisions')")
|
|
248
397
|
.option('--json', 'emit machine-readable publish result for plan-render hooks and scripts')
|
|
249
398
|
.action(async (file, opts) => {
|
|
250
399
|
if (!file) {
|
|
@@ -257,6 +406,7 @@ export function registerShareCommands(artifactsCmd) {
|
|
|
257
406
|
return;
|
|
258
407
|
}
|
|
259
408
|
try {
|
|
409
|
+
const meta = parseMetaEntries(opts.meta);
|
|
260
410
|
const result = await publishFile(file, {
|
|
261
411
|
slug: opts.slug,
|
|
262
412
|
githubUser: opts.githubUser,
|
|
@@ -265,6 +415,9 @@ export function registerShareCommands(artifactsCmd) {
|
|
|
265
415
|
force: opts.force,
|
|
266
416
|
cover: opts.cover,
|
|
267
417
|
analytics: opts.analytics,
|
|
418
|
+
label: opts.label ?? opts.title,
|
|
419
|
+
meta,
|
|
420
|
+
noRevision: opts.revision === false,
|
|
268
421
|
});
|
|
269
422
|
console.log(formatSharePublishResult(result, Boolean(opts.json)));
|
|
270
423
|
}
|
|
@@ -286,6 +439,12 @@ export function registerShareCommands(artifactsCmd) {
|
|
|
286
439
|
|
|
287
440
|
# Custom slug, expiring in 7 days
|
|
288
441
|
agents artifacts share ./out/report.html --slug q3-report --expire 7d
|
|
442
|
+
|
|
443
|
+
# Human title + structured metadata, shown in the gallery and share list
|
|
444
|
+
agents artifacts share ./out/plan.html --label "Q3 fleet plan" --meta kind=plan --meta ticket=RUSH-2683
|
|
445
|
+
|
|
446
|
+
# Republish without keeping the previous version as a revision
|
|
447
|
+
agents artifacts share ./out/plan.html --slug q3-report --no-revision
|
|
289
448
|
${SHARE_DELETE_EXAMPLES}
|
|
290
449
|
# One-time setup (or join an existing endpoint)
|
|
291
450
|
agents artifacts setup
|
|
@@ -300,6 +459,13 @@ ${SHARE_DELETE_EXAMPLES}
|
|
|
300
459
|
and agents artifacts share list; the direct URL is still world-readable
|
|
301
460
|
(unlisted, not secret). A pre-publish scan refuses emails and credential-shaped
|
|
302
461
|
strings unless --force is passed.
|
|
462
|
+
|
|
463
|
+
Every publish carries provenance auto-captured from the exec env/git/clock
|
|
464
|
+
(agent, session, host, repo, date) — never invented, only sent when present —
|
|
465
|
+
plus a label (explicit --label/--title, else derived from the HTML <title>,
|
|
466
|
+
frontmatter title, or filename; never blocks on a prompt) and any --meta
|
|
467
|
+
key=value pairs. Republishing an existing slug keeps the prior version as a
|
|
468
|
+
retained revision by default; see 'agents artifacts share revisions'.
|
|
303
469
|
${SHARE_DELETE_NOTES}
|
|
304
470
|
`,
|
|
305
471
|
});
|
|
@@ -391,10 +557,25 @@ ${SHARE_DELETE_NOTES}
|
|
|
391
557
|
.command('list')
|
|
392
558
|
.description("List the pages you've published to your share namespace (human table; --json for scripts).")
|
|
393
559
|
.option('--github-user <user>', 'GitHub username whose namespace to list (default: resolved from gh/git config)')
|
|
394
|
-
.option('--
|
|
560
|
+
.option('--agent <name>', 'filter to shares published by this agent/harness (case-insensitive)')
|
|
561
|
+
.option('--session <id>', 'filter to shares published from this session id')
|
|
562
|
+
// Named --label-contains, not --label: `share <file>` (the parent) already owns
|
|
563
|
+
// `--label`/`--title`, and commander's argv scanner resolves an option name
|
|
564
|
+
// against the WHOLE ancestor chain, not per-command — a same-named child option
|
|
565
|
+
// is silently dropped (verified; see RUSH-2683 PR notes). Fixing that properly
|
|
566
|
+
// needs `enablePositionalOptions()` on the root program, a CLI-wide change out
|
|
567
|
+
// of scope here (a pre-existing instance of it already affects --json/
|
|
568
|
+
// --github-user on list/update/delete — tracked as a follow-up).
|
|
569
|
+
.option('--label-contains <substr>', 'filter to shares whose label contains this text (case-insensitive)')
|
|
570
|
+
.option('--json', 'emit the machine-readable listing (slug, url, size, contentType, publishedAt, expiresAt, label, agent, session, host, repo, revisionCount, meta)')
|
|
395
571
|
.action(async (opts) => {
|
|
396
572
|
try {
|
|
397
|
-
const result = await runShareList({
|
|
573
|
+
const result = await runShareList({
|
|
574
|
+
githubUser: opts.githubUser,
|
|
575
|
+
agent: opts.agent,
|
|
576
|
+
session: opts.session,
|
|
577
|
+
label: opts.labelContains,
|
|
578
|
+
});
|
|
398
579
|
console.log(formatShareList(result, Boolean(opts.json)));
|
|
399
580
|
}
|
|
400
581
|
catch (e) {
|
|
@@ -412,6 +593,10 @@ ${SHARE_DELETE_NOTES}
|
|
|
412
593
|
|
|
413
594
|
# List another namespace
|
|
414
595
|
agents artifacts share list --github-user octocat
|
|
596
|
+
|
|
597
|
+
# Narrow by who/what published it
|
|
598
|
+
agents artifacts share list --agent claude
|
|
599
|
+
agents artifacts share list --label-contains "fleet plan"
|
|
415
600
|
`,
|
|
416
601
|
notes: `
|
|
417
602
|
Lists the ACTIVE pages in your namespace — expired links and the sibling .png OG
|
|
@@ -420,6 +605,54 @@ ${SHARE_DELETE_NOTES}
|
|
|
420
605
|
Worker predates this feature the command says so and points you at 'agents
|
|
421
606
|
artifacts share update' (RUSH-2449) rather than returning a wrong or empty result
|
|
422
607
|
— see 'agents artifacts share status' for whether an update is due.
|
|
608
|
+
|
|
609
|
+
--agent/--session/--label-contains filter the fetched listing client-side; --json's
|
|
610
|
+
count reflects the filtered set.
|
|
611
|
+
`,
|
|
612
|
+
});
|
|
613
|
+
const shareRevisionsCmd = shareCmd
|
|
614
|
+
.command('revisions <target>')
|
|
615
|
+
.description('Show the retained prior versions of a published slug, newest first (human table; --revisions-json for scripts).')
|
|
616
|
+
// Named --for-user / --revisions-json, not --github-user / --json: `share
|
|
617
|
+
// <file>` (the parent) already owns both those long names, and commander's
|
|
618
|
+
// argv scanner resolves an option name against the WHOLE ancestor chain —
|
|
619
|
+
// a same-named child option is silently dropped even when it parses alone
|
|
620
|
+
// (verified with a real program.parseAsync(), see share.test.ts). Unlike
|
|
621
|
+
// `list`'s pre-existing --json/--github-user collision (RUSH-2687, left
|
|
622
|
+
// as a tracked follow-up because it predates this diff), `revisions` is
|
|
623
|
+
// brand-new here, so it gets non-colliding names from the start instead
|
|
624
|
+
// of shipping a silently-broken flag.
|
|
625
|
+
.option('--for-user <user>', 'GitHub username for resolving a bare-slug target (default: resolved from gh/git config)')
|
|
626
|
+
.option('--revisions-json', 'emit the machine-readable revision list')
|
|
627
|
+
.action(async (target, opts) => {
|
|
628
|
+
try {
|
|
629
|
+
const result = await runShareRevisions(target, { githubUser: opts.forUser });
|
|
630
|
+
console.log(formatShareRevisions(result, Boolean(opts.revisionsJson)));
|
|
631
|
+
}
|
|
632
|
+
catch (e) {
|
|
633
|
+
console.error(chalk.red(e.message));
|
|
634
|
+
process.exitCode = 1;
|
|
635
|
+
}
|
|
636
|
+
});
|
|
637
|
+
setHelpSections(shareRevisionsCmd, {
|
|
638
|
+
examples: `
|
|
639
|
+
# Prior versions kept under this slug (bare slug — your own namespace)
|
|
640
|
+
agents artifacts share revisions q3-report
|
|
641
|
+
|
|
642
|
+
# By <user>/<slug> or full URL, same target forms as 'agents unshare'
|
|
643
|
+
agents artifacts share revisions octocat/q3-report
|
|
644
|
+
agents artifacts share revisions https://share.agents-cli.sh/octocat/q3-report
|
|
645
|
+
|
|
646
|
+
# Machine-readable, and a bare slug resolved against another namespace
|
|
647
|
+
agents artifacts share revisions q3-report --revisions-json
|
|
648
|
+
agents artifacts share revisions q3-report --for-user octocat
|
|
649
|
+
`,
|
|
650
|
+
notes: `
|
|
651
|
+
A revision is created automatically on every republish of an existing slug
|
|
652
|
+
(pass --no-revision at publish time to skip it) — this is history, never
|
|
653
|
+
shown on the public gallery or in 'agents artifacts share list' beyond its
|
|
654
|
+
count. Each revision's own URL is still directly reachable and honors its own
|
|
655
|
+
recorded expiry.
|
|
423
656
|
`,
|
|
424
657
|
});
|
|
425
658
|
shareCmd
|
|
@@ -521,7 +754,7 @@ export async function runShareProvision(opts) {
|
|
|
521
754
|
storeWriteToken(token);
|
|
522
755
|
console.log(chalk.green(`\nShare endpoint ready → ${chalk.bold(baseUrl)}`));
|
|
523
756
|
console.log(chalk.dim('Publish with: ') + chalk.cyan('agents artifacts share <file>'));
|
|
524
|
-
console.log(chalk.dim(`Fleet: push the token with 'agents secrets export share --
|
|
757
|
+
console.log(chalk.dim(`Fleet: push the token with 'agents secrets export share --device <box>' and pull config with 'agents repo pull'.`));
|
|
525
758
|
}
|
|
526
759
|
catch (e) {
|
|
527
760
|
spin.fail('Provisioning failed');
|