@phnx-labs/agents-cli 1.22.39 → 1.22.41
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 +316 -0
- package/README.md +116 -70
- package/dist/bin/agents +0 -0
- package/dist/bootstrap.js +45 -27
- package/dist/browser.js +2 -2
- package/dist/cli/command-registry.d.ts +135 -0
- package/dist/cli/command-registry.js +259 -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.d.ts +15 -0
- package/dist/commands/browser.js +318 -131
- 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 +16 -3
- 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 +160 -215
- package/dist/commands/factory.js +1 -1
- package/dist/commands/feed.d.ts +2 -2
- package/dist/commands/feed.js +12 -23
- 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 +158 -159
- 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 +14 -0
- package/dist/commands/sessions-picker.js +209 -13
- package/dist/commands/sessions-resume.d.ts +7 -3
- package/dist/commands/sessions-resume.js +81 -33
- package/dist/commands/sessions-share.d.ts +25 -0
- package/dist/commands/sessions-share.js +166 -0
- package/dist/commands/sessions-stats.js +2 -2
- package/dist/commands/sessions.d.ts +75 -68
- package/dist/commands/sessions.js +144 -180
- package/dist/commands/setup-browser.js +1 -1
- 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-preferences.js +2 -2
- 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 +186 -64
- 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 +25 -34
- 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 +5 -1
- package/dist/lib/browser/chrome.js +12 -1
- package/dist/lib/browser/drivers/ssh.d.ts +1 -1
- package/dist/lib/browser/drivers/ssh.js +3 -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 +69 -5
- package/dist/lib/browser/profiles.js +135 -13
- 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 +137 -2
- package/dist/lib/browser/service.js +492 -54
- 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 +19 -1
- 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 +2 -1
- package/dist/lib/config-keys.js +8 -4
- package/dist/lib/config-machine-keys.d.ts +4 -2
- package/dist/lib/config-machine-keys.js +5 -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 +104 -0
- package/dist/lib/daemon-webhooks.js +215 -0
- package/dist/lib/device-config.d.ts +85 -75
- package/dist/lib/device-config.js +280 -142
- 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 +10 -5
- package/dist/lib/devices/pool.js +5 -7
- 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 +4 -4
- package/dist/lib/exec.js +11 -11
- 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} +13 -1
- package/dist/lib/{migrate.js → installations/migrate.js} +160 -40
- 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 +3 -3
- package/dist/lib/observe-aliases.js +3 -21
- 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-key.js +7 -0
- 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 +261 -67
- 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 +4 -4
- package/dist/lib/secrets/bundles.js +8 -8
- package/dist/lib/secrets/headless.d.ts +16 -0
- package/dist/lib/secrets/headless.js +21 -0
- 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 +21 -17
- package/dist/lib/secrets/remote.js +39 -23
- 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/share-html.d.ts +55 -0
- package/dist/lib/session/share-html.js +319 -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/settings-manifest.d.ts +2 -0
- package/dist/lib/settings-manifest.js +81 -3
- package/dist/lib/share/delete.d.ts +21 -0
- package/dist/lib/share/delete.js +42 -0
- package/dist/lib/share/publish.d.ts +120 -0
- package/dist/lib/share/publish.js +243 -18
- package/dist/lib/share/worker-template.js +172 -9
- package/dist/lib/shims.js +35 -7
- package/dist/lib/smart-launch.d.ts +4 -4
- package/dist/lib/smart-launch.js +6 -4
- 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 +6 -147
- package/dist/lib/startup/command-registry.js +40 -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 +38 -3
- package/dist/lib/triggers/handlers.js +58 -7
- package/dist/lib/triggers/webhook.d.ts +113 -5
- package/dist/lib/triggers/webhook.js +223 -44
- package/dist/lib/types.d.ts +19 -7
- 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/dist/lib/wrap.d.ts +33 -0
- package/dist/lib/wrap.js +70 -0
- 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
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `agents sessions resume` —
|
|
3
|
-
* terminal surface via the terminal launch engine (src/lib/terminal).
|
|
2
|
+
* `agents sessions resume` — the one resume surface.
|
|
4
3
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
4
|
+
* - Strict single-session: `sessions resume <id> [prompt]` with optional
|
|
5
|
+
* --mode/--headless/--interactive/--cwd/--quiet/--here (formerly top-level
|
|
6
|
+
* `agents resume`). Identity resolution + owner-device hop live in resume.ts.
|
|
7
|
+
* - Multi-select: bare `sessions resume` opens a checkbox picker and fans each
|
|
8
|
+
* pick into a terminal tab/split via the terminal launch engine.
|
|
9
|
+
* - Direct id/alias always takes the strict path; live-pane attach is
|
|
10
|
+
* `sessions focus`.
|
|
11
|
+
* - `--device` opens the terminal surface on the session origin only.
|
|
10
12
|
*/
|
|
11
13
|
import * as fs from 'fs';
|
|
12
14
|
import chalk from 'chalk';
|
|
@@ -25,29 +27,42 @@ import { spawn } from 'node:child_process';
|
|
|
25
27
|
import { looksLikeSessionId } from '../lib/session/discover.js';
|
|
26
28
|
import { machineId } from '../lib/session/sync/config.js';
|
|
27
29
|
import { sessionOriginDevice, sessionRecoveryDestinationMatches } from '../lib/session/recovery.js';
|
|
30
|
+
import { runStrictResume, wantsStrictResume } from './resume.js';
|
|
28
31
|
/** Opening more than this many live sessions at once asks for confirmation first. */
|
|
29
32
|
export const CONFIRM_THRESHOLD = 5;
|
|
30
33
|
export function registerSessionsResumeCommand(sessionsCmd) {
|
|
31
34
|
const cmd = sessionsCmd
|
|
32
35
|
.command('resume')
|
|
33
|
-
.argument('[query]', 'Session id/tmux alias
|
|
34
|
-
.
|
|
36
|
+
.argument('[query]', 'Session id/tmux alias/label for strict resume, or text that filters the picker')
|
|
37
|
+
.argument('[prompt]', 'Optional follow-up prompt (strict resume with original harness/version/device)')
|
|
38
|
+
.description('Resume a session by id (strict), or multi-select history into terminal tabs/splits.')
|
|
35
39
|
.option('-a, --agent <agent>', 'Filter by agent type and version (e.g., claude, codex@0.116.0)')
|
|
36
40
|
.option('--all', 'Include sessions from every directory (not just current project)')
|
|
37
41
|
.option('--teams', 'Include team-spawned sessions (hidden by default)')
|
|
38
42
|
.option('--since <time>', 'Only sessions newer than this (e.g., 2h, 7d, 4w, or ISO date)')
|
|
39
43
|
.option('-n, --limit <n>', 'Maximum number of sessions to load into the picker', '200')
|
|
40
|
-
.option('--
|
|
44
|
+
.option('--device <alias>', 'Open on the session origin device over SSH; the device must match every selected session')
|
|
41
45
|
.option('--iterm', 'Force the iTerm backend')
|
|
42
46
|
.option('--ghostty', 'Force the Ghostty backend')
|
|
43
47
|
.option('--tmux', 'Force the tmux backend')
|
|
44
48
|
.option('--vscodium', 'Force the VSCodium agent-terminal backend (swarm-ext)')
|
|
45
49
|
.option('--terminal-app', 'Force macOS Terminal.app (no split support — panes become tabs)')
|
|
50
|
+
.option('--splits', 'Pack two sessions side by side per tab (default: one tab per session)')
|
|
51
|
+
.option('-m, --mode <mode>', 'Strict resume: override the recorded launch mode')
|
|
52
|
+
.option('-i, --interactive', 'Strict resume: interactive even when a prompt is provided')
|
|
53
|
+
.option('--headless', 'Strict resume: headless (a prompt is required)')
|
|
54
|
+
.option('--cwd <path>', 'Strict resume: override the recorded working directory')
|
|
55
|
+
.option('-q, --quiet', 'Strict resume: suppress routing banners')
|
|
56
|
+
.option('--here', 'Strict resume: run on this machine even if the session belongs to another device')
|
|
46
57
|
.option('--local', 'Only this machine (skip the cross-host sweep)')
|
|
47
|
-
.option('--attach-only', 'With an id/alias: attach a living pane only — never resume a copy')
|
|
48
|
-
.option('--splits', 'Pack two sessions side by side per tab (default: one tab per session)');
|
|
58
|
+
.option('--attach-only', 'With an id/alias: attach a living pane only — never resume a copy');
|
|
49
59
|
setHelpSections(cmd, {
|
|
50
60
|
examples: `
|
|
61
|
+
# Strict resume by full id (former top-level agents resume)
|
|
62
|
+
agents sessions resume 019fd0c8-b3e9-77a2-a1a4-444698c4d897
|
|
63
|
+
agents sessions resume 019fd0c8-b3e9-77a2-a1a4-444698c4d897 "finish the tests"
|
|
64
|
+
agents sessions resume ag-codex-c1f3d813 --mode edit
|
|
65
|
+
|
|
51
66
|
# Pick several sessions; each opens in its own tab
|
|
52
67
|
agents sessions resume
|
|
53
68
|
|
|
@@ -65,9 +80,11 @@ export function registerSessionsResumeCommand(sessionsCmd) {
|
|
|
65
80
|
agents sessions resume --ghostty
|
|
66
81
|
agents sessions resume --vscodium
|
|
67
82
|
agents sessions resume --splits
|
|
68
|
-
agents sessions resume --
|
|
83
|
+
agents sessions resume --device zion --tmux
|
|
69
84
|
`,
|
|
70
85
|
notes: `
|
|
86
|
+
- Strict path (id/tmux alias/label + optional prompt/--mode/--headless/--here): restores original harness, version, device, account, cwd, and mode. Searches the fleet; a local full-id hit resumes with zero SSH. Replaces the former top-level agents sessions resume.
|
|
87
|
+
- Attach a live pane without forking: agents sessions focus <id>.
|
|
71
88
|
- This is the ONE verb for getting back in. It detects the state: a live tmux pane is attached, a headless session comes to the foreground, an ended one recovers on its owning device.
|
|
72
89
|
- A UUID/prefix or ag-<agent>-<suffix> alias bypasses the picker. A live alias attaches by name even when the session index cannot attribute it.
|
|
73
90
|
- Retired spellings still work for one release and print the replacement: sessions attach, sessions go, reconnect.
|
|
@@ -75,23 +92,40 @@ export function registerSessionsResumeCommand(sessionsCmd) {
|
|
|
75
92
|
- With no identity selector, space toggles a session, enter confirms, and tab toggles the preview pane.
|
|
76
93
|
- Layout: one tab per session by default. --splits packs session pairs side by side in each tab.
|
|
77
94
|
- Backend: auto-detected from the terminal you're in (iTerm / Ghostty / tmux); override with --iterm/--ghostty/--tmux/--vscodium.
|
|
78
|
-
- --vscodium opens each session as an agent terminal tab in VSCodium via the swarm-ext extension (works with --
|
|
79
|
-
- --
|
|
95
|
+
- --vscodium opens each session as an agent terminal tab in VSCodium via the swarm-ext extension (works with --device too).
|
|
96
|
+
- --device <alias> opens the terminal surface on that device only when it is the selected sessions' origin; recovery never migrates a session to another device.
|
|
80
97
|
- Recovery runs on the session's origin device: exact healthy origin uses native resume; otherwise a healthy version of the same harness receives /continue <id>.
|
|
81
98
|
`,
|
|
82
99
|
});
|
|
83
|
-
cmd.action(async (query, options) => {
|
|
84
|
-
await sessionsResumeAction(query, options);
|
|
100
|
+
cmd.action(async (query, prompt, options) => {
|
|
101
|
+
await sessionsResumeAction(query, prompt, options);
|
|
85
102
|
});
|
|
86
103
|
}
|
|
87
|
-
async function sessionsResumeAction(query, options) {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
104
|
+
async function sessionsResumeAction(query, prompt, options) {
|
|
105
|
+
const strictOpts = {
|
|
106
|
+
mode: options.mode,
|
|
107
|
+
interactive: options.interactive,
|
|
108
|
+
headless: options.headless,
|
|
109
|
+
cwd: options.cwd,
|
|
110
|
+
quiet: options.quiet,
|
|
111
|
+
here: options.here,
|
|
112
|
+
};
|
|
113
|
+
// Direct id/alias (or label with prompt/strict flags) → strict resume
|
|
114
|
+
// (former top-level `agents sessions resume`). `--attach-only` / `--local`
|
|
115
|
+
// must go through sessions focus so they cannot silently fork a copy
|
|
116
|
+
// (AGI EXT still shells `sessions resume <id> --local`).
|
|
117
|
+
if (query && (isDirectResumeSelector(query) || wantsStrictResume(prompt, strictOpts))) {
|
|
118
|
+
if (resumeUsesLifecycleDispatch(query, prompt, options)) {
|
|
119
|
+
const hosts = options.device ? [options.device] : [];
|
|
120
|
+
await dispatchSessionLifecycleInPlace(query.trim(), hosts, !!options.attachOnly, !!options.local);
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
await runStrictResume(query.trim(), prompt, strictOpts);
|
|
91
124
|
return;
|
|
92
125
|
}
|
|
93
|
-
if (
|
|
94
|
-
|
|
126
|
+
if (!isInteractiveTerminal()) {
|
|
127
|
+
console.error(chalk.red('sessions resume needs an interactive terminal (or pass a session id for strict resume).'));
|
|
128
|
+
process.exitCode = 1;
|
|
95
129
|
return;
|
|
96
130
|
}
|
|
97
131
|
const { agent, version } = parseAgentFilter(options.agent);
|
|
@@ -138,8 +172,8 @@ async function sessionsResumeAction(query, options) {
|
|
|
138
172
|
}
|
|
139
173
|
if (!chosen || chosen.length === 0)
|
|
140
174
|
return;
|
|
141
|
-
if (options.
|
|
142
|
-
const requestedHost = options.
|
|
175
|
+
if (options.device) {
|
|
176
|
+
const requestedHost = options.device;
|
|
143
177
|
const mismatches = chosen
|
|
144
178
|
.map((session) => resumeHostMismatch(session, requestedHost))
|
|
145
179
|
.filter((message) => message !== null);
|
|
@@ -153,7 +187,7 @@ async function sessionsResumeAction(query, options) {
|
|
|
153
187
|
// 2. Route every selection through the owning device's recovery resolver.
|
|
154
188
|
const items = [];
|
|
155
189
|
for (const s of chosen) {
|
|
156
|
-
const command = buildSessionRecoveryCommand(s, !!options.
|
|
190
|
+
const command = buildSessionRecoveryCommand(s, !!options.device);
|
|
157
191
|
const cwd = s.cwd && fs.existsSync(s.cwd) ? s.cwd : process.cwd();
|
|
158
192
|
items.push({ session: s, cwd, command });
|
|
159
193
|
}
|
|
@@ -183,7 +217,7 @@ async function sessionsResumeAction(query, options) {
|
|
|
183
217
|
// 5b. Fan out through the engine. Full-width tabs are the default for batch
|
|
184
218
|
// recovery; callers can explicitly opt into pairs of side-by-side panes.
|
|
185
219
|
const packing = resolveResumePacking(options);
|
|
186
|
-
const where = options.
|
|
220
|
+
const where = options.device ? `${backend} on ${options.device}` : backend;
|
|
187
221
|
// Terminal.app has no scriptable split, so its buildSplit opens a tab. Say so
|
|
188
222
|
// when the user actually asked for panes — the layout silently not happening
|
|
189
223
|
// is worse than one line of warning.
|
|
@@ -199,7 +233,7 @@ async function sessionsResumeAction(query, options) {
|
|
|
199
233
|
agent: it.session.agent || undefined,
|
|
200
234
|
sessionId: it.session.id || undefined,
|
|
201
235
|
title: it.session.label || it.session.topic || undefined,
|
|
202
|
-
})), { backend, host: options.
|
|
236
|
+
})), { backend, host: options.device, packing });
|
|
203
237
|
let opened = 0;
|
|
204
238
|
results.forEach((r, i) => {
|
|
205
239
|
const s = items[i].session;
|
|
@@ -220,21 +254,35 @@ export function isDirectResumeSelector(query) {
|
|
|
220
254
|
const selector = query.trim();
|
|
221
255
|
return looksLikeSessionId(selector) || isAgentTmuxAlias(selector);
|
|
222
256
|
}
|
|
223
|
-
/** Re-enter through
|
|
257
|
+
/** Re-enter through sessions resume so fleet routing and harness policy
|
|
224
258
|
* stay centralized. The child inherits this terminal for a real interactive resume. */
|
|
225
259
|
export async function resumeSelectorInPlace(selector) {
|
|
226
|
-
await spawnCliInPlace(['resume', selector]);
|
|
260
|
+
await spawnCliInPlace(['sessions', 'resume', selector]);
|
|
227
261
|
}
|
|
228
262
|
/** Direct identities use focus as the lifecycle dispatcher: it rechecks the
|
|
229
263
|
* live fleet, attaches a healthy pane, and falls through to `agents resume`
|
|
230
264
|
* only when the process is no longer attachable. */
|
|
265
|
+
/** True when `sessions resume <id> --attach-only|--local` must go through
|
|
266
|
+
* `sessions focus` instead of `runStrictResume` (which can fork a copy). */
|
|
267
|
+
export function resumeUsesLifecycleDispatch(query, prompt, options) {
|
|
268
|
+
if (!query || !isDirectResumeSelector(query))
|
|
269
|
+
return false;
|
|
270
|
+
if (!options.attachOnly && !options.local)
|
|
271
|
+
return false;
|
|
272
|
+
return !wantsStrictResume(prompt, {
|
|
273
|
+
mode: options.mode,
|
|
274
|
+
interactive: options.interactive,
|
|
275
|
+
headless: options.headless,
|
|
276
|
+
here: options.here,
|
|
277
|
+
});
|
|
278
|
+
}
|
|
231
279
|
export async function dispatchSessionLifecycleInPlace(selector, hosts = [], attachOnly = false, local = false) {
|
|
232
280
|
await spawnCliInPlace(buildSessionLifecycleArgs(selector, hosts, attachOnly, local));
|
|
233
281
|
}
|
|
234
282
|
export function buildSessionLifecycleArgs(selector, hosts = [], attachOnly = false, local = false) {
|
|
235
283
|
return [
|
|
236
284
|
'sessions', 'focus', selector,
|
|
237
|
-
...hosts.flatMap(host => ['--
|
|
285
|
+
...hosts.flatMap(host => ['--device', host]),
|
|
238
286
|
...(attachOnly ? ['--attach-only'] : []),
|
|
239
287
|
...(local ? ['--local'] : []),
|
|
240
288
|
];
|
|
@@ -257,7 +305,7 @@ export function resumeHostMismatch(session, requestedHost, self = machineId()) {
|
|
|
257
305
|
const origin = sessionOriginDevice(session, self);
|
|
258
306
|
return sessionRecoveryDestinationMatches(session, requestedHost, self)
|
|
259
307
|
? null
|
|
260
|
-
: `Session ${session.shortId} originated on ${origin}; --
|
|
308
|
+
: `Session ${session.shortId} originated on ${origin}; --device ${requestedHost} cannot move recovery to another device.`;
|
|
261
309
|
}
|
|
262
310
|
/**
|
|
263
311
|
* Decide which backend to launch into. Returns a concrete backend, `'inplace'`
|
|
@@ -274,7 +322,7 @@ export async function resolveBackend(options, ctx, count) {
|
|
|
274
322
|
if (forced)
|
|
275
323
|
return forced;
|
|
276
324
|
// Remote defaults to tmux (headless, no GUI session assumptions); override with a backend flag.
|
|
277
|
-
if (options.
|
|
325
|
+
if (options.device)
|
|
278
326
|
return 'tmux';
|
|
279
327
|
const available = availableBackends(ctx);
|
|
280
328
|
if (available.length === 0)
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Command } from 'commander';
|
|
2
|
+
import type { SessionMeta } from '../lib/session/types.js';
|
|
3
|
+
import { type PublishOptions } from '../lib/share/publish.js';
|
|
4
|
+
interface ShareOptions {
|
|
5
|
+
public?: boolean;
|
|
6
|
+
slug?: string;
|
|
7
|
+
label?: string;
|
|
8
|
+
expire?: string;
|
|
9
|
+
reasoning: string;
|
|
10
|
+
force?: boolean;
|
|
11
|
+
cover?: boolean;
|
|
12
|
+
}
|
|
13
|
+
/** `session-<shortId>` — stable per session, so re-sharing updates the same URL. */
|
|
14
|
+
export declare function defaultSessionSlug(session: SessionMeta): string;
|
|
15
|
+
/**
|
|
16
|
+
* Map the command's flags onto {@link PublishOptions}.
|
|
17
|
+
*
|
|
18
|
+
* Extracted so the defaults are testable directly. `unlisted` in particular is the
|
|
19
|
+
* security-relevant one — it inverts the parent command's public-by-default
|
|
20
|
+
* behavior, and a test that re-implements this mapping would still pass with it
|
|
21
|
+
* flipped.
|
|
22
|
+
*/
|
|
23
|
+
export declare function buildSharePublishOptions(session: SessionMeta, options: Pick<ShareOptions, 'public' | 'slug' | 'label' | 'expire' | 'force' | 'cover'>): PublishOptions;
|
|
24
|
+
export declare function registerSessionsShareCommand(sessionsCmd: Command): void;
|
|
25
|
+
export {};
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `agents sessions share <id>` — publish one session transcript as a link.
|
|
3
|
+
*
|
|
4
|
+
* Composes three pieces that already existed but were never wired together:
|
|
5
|
+
* `renderSessionMarkdownDocument()` (redacted transcript),
|
|
6
|
+
* `renderSessionHtmlDocument()` (self-contained branded page), and
|
|
7
|
+
* `publishFile()` (the R2-backed share Worker). Before this, sharing a session
|
|
8
|
+
* meant three commands and a detour through the external artifacts-cli.
|
|
9
|
+
*
|
|
10
|
+
* Unlisted by default, unlike `agents artifacts share`. A transcript carries file
|
|
11
|
+
* paths, command output, error text, and whatever a tool printed — strictly more
|
|
12
|
+
* than a plan does — so it does not belong in the public `/<user>` gallery unless
|
|
13
|
+
* the operator asks for it with `--public`. The URL itself stays world-readable:
|
|
14
|
+
* unlisted is a capability URL, not a secret.
|
|
15
|
+
*/
|
|
16
|
+
import * as fs from 'fs';
|
|
17
|
+
import * as os from 'os';
|
|
18
|
+
import * as path from 'path';
|
|
19
|
+
import chalk from 'chalk';
|
|
20
|
+
import { setHelpSections } from '../lib/help.js';
|
|
21
|
+
import { knownSecretValuesFromEnv } from '../lib/redact.js';
|
|
22
|
+
import { discoverSessions } from '../lib/session/discover.js';
|
|
23
|
+
import { renderSessionHtmlDocument } from '../lib/session/share-html.js';
|
|
24
|
+
import { publishFile, redactEmails } from '../lib/share/publish.js';
|
|
25
|
+
import { renderSessionMarkdownDocument } from './sessions-render.js';
|
|
26
|
+
import { selectSessions } from './sessions-export.js';
|
|
27
|
+
import { parseAgentFilter } from './sessions.js';
|
|
28
|
+
function parseReasoning(value) {
|
|
29
|
+
if (value === 'omit' || value === 'fold' || value === 'include')
|
|
30
|
+
return value;
|
|
31
|
+
throw new Error(`Unknown reasoning mode "${value}". Expected omit, fold, or include.`);
|
|
32
|
+
}
|
|
33
|
+
/** `session-<shortId>` — stable per session, so re-sharing updates the same URL. */
|
|
34
|
+
export function defaultSessionSlug(session) {
|
|
35
|
+
return `session-${session.shortId || session.id}`;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Map the command's flags onto {@link PublishOptions}.
|
|
39
|
+
*
|
|
40
|
+
* Extracted so the defaults are testable directly. `unlisted` in particular is the
|
|
41
|
+
* security-relevant one — it inverts the parent command's public-by-default
|
|
42
|
+
* behavior, and a test that re-implements this mapping would still pass with it
|
|
43
|
+
* flipped.
|
|
44
|
+
*/
|
|
45
|
+
export function buildSharePublishOptions(session, options) {
|
|
46
|
+
return {
|
|
47
|
+
slug: options.slug ?? defaultSessionSlug(session),
|
|
48
|
+
unlisted: options.public !== true,
|
|
49
|
+
expire: options.expire,
|
|
50
|
+
force: options.force === true,
|
|
51
|
+
cover: options.cover !== false,
|
|
52
|
+
label: options.label,
|
|
53
|
+
meta: { kind: 'session' },
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
export function registerSessionsShareCommand(sessionsCmd) {
|
|
57
|
+
const cmd = sessionsCmd
|
|
58
|
+
.command('share <session>')
|
|
59
|
+
.description('Publish one session as a redacted, self-contained web page and print the link.')
|
|
60
|
+
.option('--public', 'List the page in your public share gallery (default: unlisted capability URL)')
|
|
61
|
+
.option('--slug <slug>', 'URL slug under your namespace (default: session-<shortId>)')
|
|
62
|
+
.option('--label <text>', 'Display title in the gallery and `agents artifacts share list`')
|
|
63
|
+
.option('--expire <spec>', 'Auto-expire window: 30d, 12h, a date, or never (default: 30d)')
|
|
64
|
+
.option('--reasoning <mode>', 'Reasoning visibility: omit, fold, or include', 'omit')
|
|
65
|
+
.option('--force', 'Publish despite the sensitive-content scan flagging the transcript')
|
|
66
|
+
.option('--no-cover', 'Skip generating the Open Graph preview image');
|
|
67
|
+
setHelpSections(cmd, {
|
|
68
|
+
examples: `# Share a session — prints an unlisted, redacted link
|
|
69
|
+
agents sessions share a1b2c3d4
|
|
70
|
+
|
|
71
|
+
# Put it in your public gallery at share.agents-cli.sh/<you>
|
|
72
|
+
agents sessions share a1b2c3d4 --public --label "How the retry bug got fixed"
|
|
73
|
+
|
|
74
|
+
# Keep the model's reasoning in collapsible sections
|
|
75
|
+
agents sessions share a1b2c3d4 --reasoning fold
|
|
76
|
+
|
|
77
|
+
# A link that does not decay
|
|
78
|
+
agents sessions share a1b2c3d4 --expire never`,
|
|
79
|
+
notes: `Requires a share endpoint: 'agents artifacts share status' shows it, 'agents artifacts setup'
|
|
80
|
+
provisions one, 'agents artifacts share join <baseUrl>' uses an existing one.
|
|
81
|
+
|
|
82
|
+
Unlisted by default — the URL is world-readable but the page stays out of your public
|
|
83
|
+
gallery and out of 'agents artifacts share list'. Pass --public to list it.
|
|
84
|
+
|
|
85
|
+
Secrets are redacted and the same pre-publish scan as 'agents artifacts share' runs on the
|
|
86
|
+
page, so a transcript carrying emails or credential-shaped strings is refused
|
|
87
|
+
unless you pass --force. --no-redact (the sessions-level flag) disables redaction
|
|
88
|
+
and is a bad idea for anything you publish.
|
|
89
|
+
|
|
90
|
+
Re-running with the same session updates the same URL and keeps the prior version
|
|
91
|
+
as a revision ('agents artifacts share revisions <slug>').
|
|
92
|
+
|
|
93
|
+
Manage published sessions with 'agents artifacts share list' and
|
|
94
|
+
'agents artifacts share delete <slug>'.`,
|
|
95
|
+
});
|
|
96
|
+
cmd.action(async (selector, options, command) => {
|
|
97
|
+
const globals = command.optsWithGlobals();
|
|
98
|
+
const reasoning = parseReasoning(options.reasoning);
|
|
99
|
+
const limit = Math.max(1, Number.parseInt(globals.limit || '100', 10) || 100);
|
|
100
|
+
const agent = parseAgentFilter(globals.agent).agent;
|
|
101
|
+
const sessions = selectSessions(await discoverSessions({
|
|
102
|
+
all: globals.all !== false,
|
|
103
|
+
since: globals.since,
|
|
104
|
+
limit,
|
|
105
|
+
agent: agent ?? undefined,
|
|
106
|
+
}), [selector]);
|
|
107
|
+
if (sessions.length === 0) {
|
|
108
|
+
process.stderr.write(chalk.yellow(`No session matched "${selector}".\n`));
|
|
109
|
+
process.exitCode = 1;
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
// One link per share: several sessions in one page would give the reader no
|
|
113
|
+
// way to reference just the one that matters, and the slug could only name one.
|
|
114
|
+
if (sessions.length > 1) {
|
|
115
|
+
process.stderr.write(chalk.yellow(`"${selector}" matched ${sessions.length} sessions. Share one at a time — pass a full or unique session id.\n`));
|
|
116
|
+
process.exitCode = 1;
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
const session = sessions[0];
|
|
120
|
+
const redact = globals.redact !== false;
|
|
121
|
+
const markdown = renderSessionMarkdownDocument(session, {
|
|
122
|
+
redact,
|
|
123
|
+
reasoning,
|
|
124
|
+
knownSecrets: redact ? knownSecretValuesFromEnv() : undefined,
|
|
125
|
+
});
|
|
126
|
+
// Emails on top of what the renderer masks. Almost every real transcript
|
|
127
|
+
// carries a few — git author addresses, `gh api user`, a pasted log — and
|
|
128
|
+
// publishToEndpoint refuses a body containing any (RUSH-2428). Masking them
|
|
129
|
+
// means the published page genuinely does not carry them; the alternative,
|
|
130
|
+
// telling people to pass --force, would train everyone to bypass the gate
|
|
131
|
+
// that also catches real credentials.
|
|
132
|
+
//
|
|
133
|
+
// Applied to the RENDERED PAGE, not the Markdown, so the text that is masked
|
|
134
|
+
// is exactly the text `scanShareContent` will scan. Markdown escaping stands
|
|
135
|
+
// between the two: `foo\@example.com` hides from the pattern in the Markdown
|
|
136
|
+
// and reappears as a live address once marked drops the backslash.
|
|
137
|
+
const page = renderSessionHtmlDocument(session, markdown, { redacted: redact });
|
|
138
|
+
const html = redact ? redactEmails(page) : page;
|
|
139
|
+
// A real file on disk is what publishFile() takes, and the OG capturer opens
|
|
140
|
+
// it in a browser. 0600 + a per-run directory keeps the intermediate off a
|
|
141
|
+
// world-readable /tmp path while it exists.
|
|
142
|
+
const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'agents-session-share-'));
|
|
143
|
+
const file = path.join(dir, `${defaultSessionSlug(session)}.html`);
|
|
144
|
+
try {
|
|
145
|
+
fs.writeFileSync(file, html, { mode: 0o600 });
|
|
146
|
+
const result = await publishFile(file, buildSharePublishOptions(session, options));
|
|
147
|
+
if (globals.json) {
|
|
148
|
+
process.stdout.write(JSON.stringify({
|
|
149
|
+
session: session.id,
|
|
150
|
+
agent: session.agent,
|
|
151
|
+
redacted: redact,
|
|
152
|
+
...result,
|
|
153
|
+
}, null, 2) + '\n');
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
process.stdout.write(`${result.url}\n`);
|
|
157
|
+
const bits = [result.unlisted ? 'unlisted' : 'public', redact ? 'redacted' : chalk.red('NOT redacted')];
|
|
158
|
+
if (result.expiresAt)
|
|
159
|
+
bits.push(`expires ${result.expiresAt.slice(0, 10)}`);
|
|
160
|
+
process.stderr.write(chalk.dim(`${bits.join(' · ')}\n`));
|
|
161
|
+
}
|
|
162
|
+
finally {
|
|
163
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
}
|
|
@@ -2,7 +2,7 @@ import chalk from 'chalk';
|
|
|
2
2
|
import { discoverSessions, parseTimeFilter } from '../lib/session/discover.js';
|
|
3
3
|
import { queryResourceUsageStats, resourceUsageCoverage, } from '../lib/session/db.js';
|
|
4
4
|
import { listResources } from '../lib/resources.js';
|
|
5
|
-
import { discoverPlugins } from '../lib/plugins.js';
|
|
5
|
+
import { discoverPlugins } from '../lib/plugins/plugins.js';
|
|
6
6
|
import { setHelpSections } from '../lib/help.js';
|
|
7
7
|
import { terminalWidth, truncateToWidth, padToWidth, stringWidth } from '../lib/session/width.js';
|
|
8
8
|
const DEFAULT_TOP = 20;
|
|
@@ -100,7 +100,7 @@ async function statsAction(cmd) {
|
|
|
100
100
|
const kind = normalizeKind(opts.kind);
|
|
101
101
|
const sinceMs = opts.since ? parseTimeFilter(opts.since) : undefined;
|
|
102
102
|
const top = resolveTop(opts.top);
|
|
103
|
-
// Warm the incremental index (like `agents cost`) so recent sessions' usage is
|
|
103
|
+
// Warm the incremental index (like `agents insights cost`) so recent sessions' usage is
|
|
104
104
|
// current before we read. Historical gaps still need the explicit backfill.
|
|
105
105
|
await discoverSessions({ all: true, since: opts.since, limit: 1 });
|
|
106
106
|
const filter = {};
|