@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
|
@@ -13,7 +13,7 @@ import * as path from 'path';
|
|
|
13
13
|
import { spawn } from 'child_process';
|
|
14
14
|
import { Option } from 'commander';
|
|
15
15
|
import chalk from 'chalk';
|
|
16
|
-
import { truncate, padRight, humanDuration } from '../lib/format.js';
|
|
16
|
+
import { truncate, padRight, humanDuration, formatBytes } from '../lib/format.js';
|
|
17
17
|
import { sanitizeForTerminal, redactSecrets } from '../lib/redact.js';
|
|
18
18
|
import { resolveProjectKey } from '../lib/project-key.js';
|
|
19
19
|
import { listProjectDefs, resolveProjectNameForCwd } from '../lib/projects.js';
|
|
@@ -21,7 +21,8 @@ import ora from 'ora';
|
|
|
21
21
|
import { SESSION_AGENTS } from '../lib/session/types.js';
|
|
22
22
|
import { discoverArtifacts, readArtifact, resolveArtifact } from '../lib/session/artifacts.js';
|
|
23
23
|
import { looksLikePath, toComparablePath, homeDir, needsWindowsShell, composeWin32CommandLine } from '../lib/platform/index.js';
|
|
24
|
-
import { getActiveSessions, sessionProcessIsLocal } from '../lib/session/active.js';
|
|
24
|
+
import { getActiveSessions, describeActiveDiscoveryHealth, sessionProcessIsLocal, backfillActiveRowsFromIndex, isRunningLiveSession, serializeActiveSessionsForJson, serializeSessionsJson } from '../lib/session/active.js';
|
|
25
|
+
export { activeSessionProjectKey, backfillActiveRowsFromIndex, backfillActiveRowsFromMeta, isRunningLiveSession, serializeActiveSessionsForJson, serializeSessionsJson } from '../lib/session/active.js';
|
|
25
26
|
import { enumerateGhosttyTabs, assignGhosttyTabs } from '../lib/session/ghostty-tabs.js';
|
|
26
27
|
import { mapPanesToTargets, listClients } from '../lib/tmux/session.js';
|
|
27
28
|
import { resolveViewingIn, viewingInLabel } from '../lib/session/viewing-in.js';
|
|
@@ -33,7 +34,8 @@ import { gatherRemoteAgentsJson } from '../lib/remote-agents-json.js';
|
|
|
33
34
|
import { stringWidth, truncateToWidth, padToWidth, terminalWidth } from '../lib/session/width.js';
|
|
34
35
|
import { inferSessionState } from '../lib/session/state.js';
|
|
35
36
|
import { discoverSessions, queryIndexedSessions, countSessionsInScope, resolveSessionById, isCompleteSessionId, looksLikeSessionId, searchContentIndex, getSessionRoots, scopeToManaged } from '../lib/session/discover.js';
|
|
36
|
-
import { findSessionsById, querySessions,
|
|
37
|
+
import { findSessionsById, querySessions, readSessionContent, readArchivedSessionPreview } from '../lib/session/db.js';
|
|
38
|
+
import { liveSessionMetas } from '../lib/session/live-metadata.js';
|
|
37
39
|
import { filterTeamSessions, shouldShowTeamSessions, safeTeamText, groupSessionsByTeam, NO_TEAM_GROUP_KEY, } from '../lib/session/team-filter.js';
|
|
38
40
|
import { parseSession } from '../lib/session/parse.js';
|
|
39
41
|
import { runRemoteSessions, buildForwardedArgs, ensureWholeIndex } from '../lib/session/remote.js';
|
|
@@ -44,13 +46,13 @@ import { sessionOwnerDevice, RESUME_PINNED_ENV } from '../lib/session/resume-own
|
|
|
44
46
|
import { renderMarkdown } from '../lib/markdown.js';
|
|
45
47
|
import { AGENTS, colorAgent, resolveAgentName } from '../lib/agents.js';
|
|
46
48
|
import { getShimsDir } from '../lib/state.js';
|
|
47
|
-
import { listJobs, listJobsWithRuns, listRuns, getRunDir } from '../lib/routines.js';
|
|
49
|
+
import { listJobs, listJobsWithRuns, listRuns, getRunDir } from '../lib/scheduling/routines.js';
|
|
48
50
|
import { formatUsd } from '../lib/pricing/cost.js';
|
|
49
51
|
import { fuzzyMatch, FUZZY_PRESETS } from '../lib/fuzzy.js';
|
|
50
52
|
import { itemPicker } from '../lib/picker.js';
|
|
51
53
|
import { resolveSessionAlias } from '../lib/session/actor-sidecar.js';
|
|
52
|
-
import { listInstalledVersions, resolveVersionAliasLoose } from '../lib/versions.js';
|
|
53
|
-
import { getAgentsInvocation } from '../lib/daemon.js';
|
|
54
|
+
import { listInstalledVersions, resolveVersionAliasLoose } from '../lib/installations/versions.js';
|
|
55
|
+
import { getAgentsInvocation } from '../lib/daemon/daemon.js';
|
|
54
56
|
import { sessionRecoveryRunArgs } from '../lib/session/recovery.js';
|
|
55
57
|
import { isInteractiveTerminal, isPromptCancelled } from './utils.js';
|
|
56
58
|
import { sessionPicker, buildPreview, loadSessionPreviewDigest, formatTodoCompact, githubRepoUrlFromCwd, } from './sessions-picker.js';
|
|
@@ -68,6 +70,7 @@ import { registerAttachCommand } from './attach.js';
|
|
|
68
70
|
import { registerSessionsInjectCommand } from './sessions-inject.js';
|
|
69
71
|
import { registerSessionsExportCommand } from './sessions-export.js';
|
|
70
72
|
import { registerSessionsRenderCommand } from './sessions-render.js';
|
|
73
|
+
import { registerSessionsShareCommand } from './sessions-share.js';
|
|
71
74
|
import { registerSessionsImportCommand } from './sessions-import.js';
|
|
72
75
|
import { registerSessionsMigrateCommand, registerSessionsMigrationsCommand } from './sessions-migrate.js';
|
|
73
76
|
import { registerSessionsBackfillCommand } from './sessions-backfill.js';
|
|
@@ -203,13 +206,6 @@ function resolvePathFilter(query) {
|
|
|
203
206
|
: query;
|
|
204
207
|
return path.resolve(expanded);
|
|
205
208
|
}
|
|
206
|
-
function formatBytes(n) {
|
|
207
|
-
if (n < 1024)
|
|
208
|
-
return `${n} B`;
|
|
209
|
-
if (n < 1024 * 1024)
|
|
210
|
-
return `${(n / 1024).toFixed(1)} KB`;
|
|
211
|
-
return `${(n / (1024 * 1024)).toFixed(1)} MB`;
|
|
212
|
-
}
|
|
213
209
|
async function renderArtifactsForSession(session, listAll, name) {
|
|
214
210
|
const artifacts = discoverArtifacts(session);
|
|
215
211
|
if (name !== undefined) {
|
|
@@ -430,66 +426,6 @@ export function indexActiveBySessionId(active) {
|
|
|
430
426
|
}
|
|
431
427
|
return byId;
|
|
432
428
|
}
|
|
433
|
-
/**
|
|
434
|
-
* Backfill display-only fields onto live rows from the indexed SessionMeta, by
|
|
435
|
-
* full session id (RUSH-2205). A running process reports no agent version, and a
|
|
436
|
-
* live orphan row usually carries no ticket/PR/label/start-time; the historical
|
|
437
|
-
* index does. Only a field the live row LACKS is filled — the live signal always
|
|
438
|
-
* wins when present. Pure (no I/O) so the join is unit-tested against fixtures;
|
|
439
|
-
* the DB read that builds `metaById` is the caller's concern.
|
|
440
|
-
*/
|
|
441
|
-
export function backfillActiveRowsFromMeta(sessions, metaById) {
|
|
442
|
-
for (const s of sessions) {
|
|
443
|
-
if (!s.sessionId)
|
|
444
|
-
continue;
|
|
445
|
-
const m = metaById.get(s.sessionId);
|
|
446
|
-
if (!m)
|
|
447
|
-
continue;
|
|
448
|
-
if (!s.version && m.version)
|
|
449
|
-
s.version = m.version;
|
|
450
|
-
if (!s.label && m.label)
|
|
451
|
-
s.label = m.label;
|
|
452
|
-
if (!s.ticket && m.ticketId)
|
|
453
|
-
s.ticket = { id: m.ticketId, url: linearIssueUrl(m.ticketId) };
|
|
454
|
-
if (!s.pr && m.prUrl)
|
|
455
|
-
s.pr = { url: m.prUrl, number: m.prNumber };
|
|
456
|
-
if (!s.startedAtMs && m.timestamp) {
|
|
457
|
-
const ts = new Date(m.timestamp).getTime();
|
|
458
|
-
if (!Number.isNaN(ts))
|
|
459
|
-
s.startedAtMs = ts;
|
|
460
|
-
}
|
|
461
|
-
if (!s.origin && m.origin)
|
|
462
|
-
s.origin = m.origin;
|
|
463
|
-
if (!s.routineName && m.routineName)
|
|
464
|
-
s.routineName = m.routineName;
|
|
465
|
-
}
|
|
466
|
-
}
|
|
467
|
-
/**
|
|
468
|
-
* Build the id→meta index the live-row backfill needs, reading the historical
|
|
469
|
-
* session DB by full id. Best-effort: a missing or locked DB yields an empty map
|
|
470
|
-
* so the live view still renders (mirrors {@link maybeLiveIndex}). Deduplicates
|
|
471
|
-
* ids so N rows in one session cost one query.
|
|
472
|
-
*/
|
|
473
|
-
function loadBackfillMetaFor(sessions) {
|
|
474
|
-
const byId = new Map();
|
|
475
|
-
try {
|
|
476
|
-
for (const s of sessions) {
|
|
477
|
-
if (!s.sessionId || byId.has(s.sessionId))
|
|
478
|
-
continue;
|
|
479
|
-
const m = getSessionById(s.sessionId);
|
|
480
|
-
if (m)
|
|
481
|
-
byId.set(s.sessionId, m);
|
|
482
|
-
}
|
|
483
|
-
}
|
|
484
|
-
catch {
|
|
485
|
-
/* enrichment is best-effort — an unavailable DB leaves rows un-backfilled */
|
|
486
|
-
}
|
|
487
|
-
return byId;
|
|
488
|
-
}
|
|
489
|
-
/** Add indexed display metadata to active rows for non-renderer consumers. */
|
|
490
|
-
export function backfillActiveRowsFromIndex(sessions) {
|
|
491
|
-
backfillActiveRowsFromMeta(sessions, loadBackfillMetaFor(sessions));
|
|
492
|
-
}
|
|
493
429
|
/**
|
|
494
430
|
* The live decoration for a listing row: a status glyph and the latest-turn
|
|
495
431
|
* preview, when the session is still running. `●` running / `◐` waiting on the
|
|
@@ -611,13 +547,6 @@ export function isAwaitingUser(s) {
|
|
|
611
547
|
* both carry a genuinely alive pid; unknown liveness (an older peer's
|
|
612
548
|
* row, or a pid that could never be resolved) does not.
|
|
613
549
|
*/
|
|
614
|
-
export function isRunningLiveSession(s) {
|
|
615
|
-
if (s.status === 'queued' || s.status === 'closed' || s.status === 'crashed')
|
|
616
|
-
return false;
|
|
617
|
-
if (s.context === 'cloud')
|
|
618
|
-
return Boolean(s.cloudProvider) && Boolean(s.cloudTaskId);
|
|
619
|
-
return Boolean(s.machine) && typeof s.pid === 'number' && s.pid > 0 && s.pidAlive === true;
|
|
620
|
-
}
|
|
621
550
|
/** Width of the live status column — `crashed` is the longest word it renders. */
|
|
622
551
|
const LIVE_STATUS_W = 8;
|
|
623
552
|
/** The colored, space-padded status cell for a listing row (empty when not live). */
|
|
@@ -650,29 +579,6 @@ export function linkCwdCell(s, label) {
|
|
|
650
579
|
function modelLabel(model) {
|
|
651
580
|
return model ? shortenModel(model) : '-';
|
|
652
581
|
}
|
|
653
|
-
/**
|
|
654
|
-
* The row shape `agents sessions --active --json` emits. RUSH-1981: a watcher
|
|
655
|
-
* joins active sessions on ticketId + project, but the raw ActiveSession nests
|
|
656
|
-
* the ticket (`ticket.id`) and carries no `project` at all — so a naive join
|
|
657
|
-
* silently drops every row. Emit both as flat, always-present top-level keys
|
|
658
|
-
* (null when unknown) alongside the raw fields, so every active row is joinable.
|
|
659
|
-
* `project` uses the same derivation SessionMeta does — basename(cwd) (see
|
|
660
|
-
* discover.ts) — so the active view and the history view join identically.
|
|
661
|
-
*
|
|
662
|
-
* `viewingIn` flattens to the same display string the row renderer prints —
|
|
663
|
-
* `'codium tab 3'` / `'detached'` / null — so a consumer can tell a watched
|
|
664
|
-
* session from an orphaned one (its terminal died, the agent is still running)
|
|
665
|
-
* without re-implementing the tmux client lookup.
|
|
666
|
-
*/
|
|
667
|
-
export function serializeActiveSessionsForJson(sessions) {
|
|
668
|
-
return sessions.map((s) => ({
|
|
669
|
-
...s,
|
|
670
|
-
ticketId: s.ticket?.id ?? null,
|
|
671
|
-
project: s.cwd ? path.basename(s.cwd) : null,
|
|
672
|
-
prLink: s.pr?.url ?? null,
|
|
673
|
-
viewingIn: viewingInLabel(s) ?? null,
|
|
674
|
-
}));
|
|
675
|
-
}
|
|
676
582
|
/** Canonical JSON row consumed by resume pickers and other session UIs. */
|
|
677
583
|
export function serializeSessionPickerRows(sessions, liveSessions, self = machineId()) {
|
|
678
584
|
const liveById = new Map(liveSessions.filter((row) => row.sessionId).map((row) => [row.sessionId, row]));
|
|
@@ -1038,7 +944,7 @@ export function dedupeByMachineSession(sessions) {
|
|
|
1038
944
|
return out;
|
|
1039
945
|
}
|
|
1040
946
|
/**
|
|
1041
|
-
* Narrow a gathered live set to the machines an explicit `--
|
|
947
|
+
* Narrow a gathered live set to the machines an explicit `--device`
|
|
1042
948
|
* scope named. The gather picks which boxes to ASK; this asserts what the answer
|
|
1043
949
|
* may contain, and the two are not the same question: a host-dispatched run is
|
|
1044
950
|
* reported by the box that dispatched it while executing somewhere else, so
|
|
@@ -1094,13 +1000,6 @@ export function mergeLocalFirst(sessions, localMachine) {
|
|
|
1094
1000
|
* newline. The single seam shared by the local `--json` path and the
|
|
1095
1001
|
* `--json --host` remote fan-out so both emit byte-identical row shapes.
|
|
1096
1002
|
*/
|
|
1097
|
-
export function serializeSessionsJson(sessions) {
|
|
1098
|
-
const serializable = sessions.map((s) => {
|
|
1099
|
-
const { _matchedTerms, _bm25Score, _remote, ...rest } = s;
|
|
1100
|
-
return rest;
|
|
1101
|
-
});
|
|
1102
|
-
return JSON.stringify(serializable, null, 2) + '\n';
|
|
1103
|
-
}
|
|
1104
1003
|
/** The intentionally small metadata contract emitted by `sessions --resolve`.
|
|
1105
1004
|
* It includes only launch identity needed to route/resume. Transcript paths,
|
|
1106
1005
|
* extracted plans, costs, and content stay on the machine that owns them. */
|
|
@@ -1329,14 +1228,14 @@ async function enrichTmuxLocators(local, surfaces = []) {
|
|
|
1329
1228
|
}
|
|
1330
1229
|
catch { /* non-fatal */ }
|
|
1331
1230
|
}
|
|
1332
|
-
/** Normalize a `--
|
|
1231
|
+
/** Normalize a `--device` token (`alias`, `user@host`, `host.domain`)
|
|
1333
1232
|
* to the machine id the fan-out and registry key off. */
|
|
1334
1233
|
function hostToken(h) {
|
|
1335
1234
|
return normalizeHost(h.split('@').pop() || h);
|
|
1336
1235
|
}
|
|
1337
1236
|
/**
|
|
1338
1237
|
* Whether the local machine's sessions belong in an `--active` view. Local is
|
|
1339
|
-
* included by default; an explicit `--
|
|
1238
|
+
* included by default; an explicit `--device` list scopes the view to
|
|
1340
1239
|
* exactly those machines, so local is dropped unless it is itself named (by
|
|
1341
1240
|
* alias or `user@host`, matched on the normalized machine id). Exported for
|
|
1342
1241
|
* unit testing without touching SSH or the live process table.
|
|
@@ -1347,7 +1246,7 @@ export function shouldIncludeLocal(hosts, self) {
|
|
|
1347
1246
|
return hosts.some(h => hostToken(h) === self);
|
|
1348
1247
|
}
|
|
1349
1248
|
/**
|
|
1350
|
-
* The peers to dial for an `--active` view. No `--
|
|
1249
|
+
* The peers to dial for an `--active` view. No `--device` → `undefined`, which
|
|
1351
1250
|
* tells `gatherRemoteActive` to sweep the registered online devices. An
|
|
1352
1251
|
* explicit list → exactly those, minus this machine (its sessions come from the
|
|
1353
1252
|
* local seed, so dialing self would be a wasted SSH and a spurious "unreachable"
|
|
@@ -1363,9 +1262,9 @@ export function remoteHostsToDial(hosts, self) {
|
|
|
1363
1262
|
/**
|
|
1364
1263
|
* The fleet-wide live-session set behind every `--active` surface. Local sessions
|
|
1365
1264
|
* come from `getActiveSessions()` and (unless `--local`) the registered online
|
|
1366
|
-
* devices from `ag devices` are folded in over SSH. An explicit `--
|
|
1265
|
+
* devices from `ag devices` are folded in over SSH. An explicit `--device`
|
|
1367
1266
|
* list SCOPES the sweep to exactly those machines — the local machine is included
|
|
1368
|
-
* only when it is itself named — so `--
|
|
1267
|
+
* only when it is itself named — so `--device` is a filter, not an addition.
|
|
1369
1268
|
*
|
|
1370
1269
|
* This is the single gather: the static renderer AND the interactive browser both
|
|
1371
1270
|
* call it, so the browser can never disagree with `--active --json` about which
|
|
@@ -1375,7 +1274,7 @@ export function remoteHostsToDial(hosts, self) {
|
|
|
1375
1274
|
* RUSH-2062: default path is cache-first against the daemon-warmed shared
|
|
1376
1275
|
* snapshot (`session-cache.ts`). Menubar / Factory / watchdog / CLI share one
|
|
1377
1276
|
* warm result instead of each re-running the full SSH fan-out. `forceRefresh`
|
|
1378
|
-
* (or `AGENTS_SESSIONS_FORCE_REFRESH=1`) re-gathers live; scoped `--
|
|
1277
|
+
* (or `AGENTS_SESSIONS_FORCE_REFRESH=1`) re-gathers live; scoped `--device` lists
|
|
1379
1278
|
* always gather live so a filter never returns a wrong unscoped snapshot.
|
|
1380
1279
|
*/
|
|
1381
1280
|
export async function gatherActiveSessions(opts = {}) {
|
|
@@ -1403,7 +1302,12 @@ export async function gatherActiveSessions(opts = {}) {
|
|
|
1403
1302
|
forceRefresh,
|
|
1404
1303
|
gather: () => gatherActiveSessionsLive({ local: false }),
|
|
1405
1304
|
});
|
|
1406
|
-
return {
|
|
1305
|
+
return {
|
|
1306
|
+
sessions: loaded.sessions,
|
|
1307
|
+
remoteDeviceCount: loaded.remoteDeviceCount,
|
|
1308
|
+
remoteSkipped: loaded.remoteSkipped,
|
|
1309
|
+
remoteDiscoveryFailed: loaded.remoteDiscoveryFailed,
|
|
1310
|
+
};
|
|
1407
1311
|
}
|
|
1408
1312
|
return gatherActiveSessionsLive(opts);
|
|
1409
1313
|
}
|
|
@@ -1427,6 +1331,8 @@ async function gatherActiveSessionsLive(opts = {}) {
|
|
|
1427
1331
|
if (!s.machine)
|
|
1428
1332
|
s.machine = self;
|
|
1429
1333
|
let remoteDeviceCount = 0;
|
|
1334
|
+
let remoteSkipped = [];
|
|
1335
|
+
let remoteDiscoveryFailed = false;
|
|
1430
1336
|
let merged = local;
|
|
1431
1337
|
if (!opts.local) {
|
|
1432
1338
|
const remoteHosts = remoteHostsToDial(opts.hosts, self);
|
|
@@ -1435,6 +1341,8 @@ async function gatherActiveSessionsLive(opts = {}) {
|
|
|
1435
1341
|
if (!opts.hosts?.length || (remoteHosts && remoteHosts.length > 0)) {
|
|
1436
1342
|
const remote = await gatherRemoteActive(remoteHosts);
|
|
1437
1343
|
remoteDeviceCount = remote.deviceCount;
|
|
1344
|
+
remoteSkipped = remote.skipped;
|
|
1345
|
+
remoteDiscoveryFailed = remote.discoveryFailed;
|
|
1438
1346
|
merged = dedupeByMachineSession([...local, ...remote.sessions]);
|
|
1439
1347
|
}
|
|
1440
1348
|
}
|
|
@@ -1446,8 +1354,36 @@ async function gatherActiveSessionsLive(opts = {}) {
|
|
|
1446
1354
|
return {
|
|
1447
1355
|
sessions: filterActiveSessionsByHostScope(merged, opts.hosts, self),
|
|
1448
1356
|
remoteDeviceCount,
|
|
1357
|
+
remoteSkipped,
|
|
1358
|
+
remoteDiscoveryFailed,
|
|
1449
1359
|
};
|
|
1450
1360
|
}
|
|
1361
|
+
/**
|
|
1362
|
+
* Explain an empty `--active` result instead of the old flat
|
|
1363
|
+
* "No active agent sessions." either way (RUSH-2507: a live fleet sweep found
|
|
1364
|
+
* ~41 running agents while this printed the same line as a genuinely idle
|
|
1365
|
+
* fleet). Re-probes local tmux health only now, on the empty path, and names
|
|
1366
|
+
* any remote peer that went unheard rather than silently folding it into
|
|
1367
|
+
* "nothing running".
|
|
1368
|
+
*/
|
|
1369
|
+
async function describeEmptyActiveDiscovery(opts, remoteSkipped, remoteDiscoveryFailed) {
|
|
1370
|
+
const parts = [];
|
|
1371
|
+
if (!opts.hosts?.length || opts.local) {
|
|
1372
|
+
const health = await describeActiveDiscoveryHealth();
|
|
1373
|
+
if (health.degradedSources.length > 0) {
|
|
1374
|
+
parts.push(`local discovery is degraded (${health.degradedSources.join(', ')} unreachable) — sessions may be hidden, run \`agents doctor\` to diagnose`);
|
|
1375
|
+
}
|
|
1376
|
+
}
|
|
1377
|
+
if (remoteDiscoveryFailed) {
|
|
1378
|
+
parts.push('the device list could not be loaded — no peer was reachable to sweep');
|
|
1379
|
+
}
|
|
1380
|
+
else if (remoteSkipped && remoteSkipped.length > 0) {
|
|
1381
|
+
parts.push(`${remoteSkipped.length} peer(s) went unheard (${remoteSkipped.join(', ')}) — sessions there may be hidden`);
|
|
1382
|
+
}
|
|
1383
|
+
if (parts.length === 0)
|
|
1384
|
+
return 'No active agent sessions.';
|
|
1385
|
+
return `No active agent sessions found, but discovery was degraded: ${parts.join('; ')}.`;
|
|
1386
|
+
}
|
|
1451
1387
|
/**
|
|
1452
1388
|
* Render the unified active-session view, grouped by machine. Scoping and the
|
|
1453
1389
|
* fleet sweep live in {@link gatherActiveSessions}; this owns the presentation
|
|
@@ -1457,7 +1393,7 @@ async function gatherActiveSessionsLive(opts = {}) {
|
|
|
1457
1393
|
async function renderActiveSessions(asJson, waitingOnly = false, opts = {}) {
|
|
1458
1394
|
const self = machineId();
|
|
1459
1395
|
const gathered = await gatherActiveSessions(opts);
|
|
1460
|
-
const { remoteDeviceCount } = gathered;
|
|
1396
|
+
const { remoteDeviceCount, remoteSkipped, remoteDiscoveryFailed } = gathered;
|
|
1461
1397
|
// Backfill agent version, refs, created time, and routine provenance from the
|
|
1462
1398
|
// historical index. Routine filtering needs that provenance before it narrows
|
|
1463
1399
|
// the live pool; doing it here also enriches both JSON and human output.
|
|
@@ -1489,7 +1425,11 @@ async function renderActiveSessions(asJson, waitingOnly = false, opts = {}) {
|
|
|
1489
1425
|
return;
|
|
1490
1426
|
}
|
|
1491
1427
|
if (sessions.length === 0) {
|
|
1492
|
-
|
|
1428
|
+
if (waitingOnly) {
|
|
1429
|
+
console.log(chalk.gray('No sessions waiting on input.'));
|
|
1430
|
+
return;
|
|
1431
|
+
}
|
|
1432
|
+
console.log(chalk.gray(await describeEmptyActiveDiscovery(opts, remoteSkipped, remoteDiscoveryFailed)));
|
|
1493
1433
|
if (!opts.local && !opts.hosts?.length && remoteDeviceCount === 0)
|
|
1494
1434
|
printCrossMachineTip();
|
|
1495
1435
|
return;
|
|
@@ -1582,8 +1522,8 @@ function useInteractiveBrowser(options) {
|
|
|
1582
1522
|
/**
|
|
1583
1523
|
* A bare interactive fleet listing — no query, no render/filter flag — that the
|
|
1584
1524
|
* `runSessionBrowser` picker can represent. The single predicate shared by the
|
|
1585
|
-
* bare-browser branch and the `--
|
|
1586
|
-
* when this holds, an explicit `--
|
|
1525
|
+
* bare-browser branch and the `--device` early-return guard so they can't drift:
|
|
1526
|
+
* when this holds, an explicit `--device` scope is folded into the
|
|
1587
1527
|
* browser (preview-rich, selectable) instead of the legacy per-host raw stream.
|
|
1588
1528
|
*/
|
|
1589
1529
|
export function isBareBrowserListing(options, query) {
|
|
@@ -2022,12 +1962,16 @@ function canonicalSessionsCommand(query, options) {
|
|
|
2022
1962
|
* Backs `--preview` — the fast path for the "peek before resume" hot loop. */
|
|
2023
1963
|
export async function renderSessionPreview(query, scope) {
|
|
2024
1964
|
let outcome = await resolveSessionMetadataValue(query, scope);
|
|
2025
|
-
//
|
|
2026
|
-
//
|
|
2027
|
-
//
|
|
1965
|
+
// resolveSessionMetadataValue already consults the live registry for a running
|
|
1966
|
+
// session with no transcript row (RUSH-2682), so a live session resolves above.
|
|
1967
|
+
// This block still repairs the residual case — a session whose transcript is on
|
|
1968
|
+
// disk but not yet indexed (e.g. one that just ended). `waitForScan` makes the
|
|
1969
|
+
// repair honest: when another process holds the scan claim it waits for that
|
|
1970
|
+
// scan instead of returning the stale read. Also preserves Claude history-alias
|
|
1971
|
+
// discovery.
|
|
2028
1972
|
if (outcome.kind !== 'resolved'
|
|
2029
1973
|
&& (!scope.hosts?.length || shouldIncludeLocal(scope.hosts, machineId()))) {
|
|
2030
|
-
const discovered = applyScopeFilters(await discoverSessions({ all: true, cwd: process.cwd(), limit: 5000 }), scope);
|
|
1974
|
+
const discovered = applyScopeFilters(await discoverSessions({ all: true, cwd: process.cwd(), limit: 5000, waitForScan: true }), scope);
|
|
2031
1975
|
const localMatches = resolveSessionQuery(discovered, query, { indexFallback: false }).matches
|
|
2032
1976
|
.map(session => ({ ...session, machine: session.machine || machineId() }));
|
|
2033
1977
|
const exact = localMatches.find(session => selectorAllowsEarlyExit(query)
|
|
@@ -2353,7 +2297,7 @@ limitSource) {
|
|
|
2353
2297
|
}
|
|
2354
2298
|
}
|
|
2355
2299
|
// Normalize convenience flags before any routing reads them: per-agent
|
|
2356
|
-
// shorthands fold into --agent
|
|
2300
|
+
// shorthands fold into --agent; --device and --devices (both
|
|
2357
2301
|
// resolve against the same device registry).
|
|
2358
2302
|
applyAgentShorthands(options);
|
|
2359
2303
|
try {
|
|
@@ -2364,7 +2308,7 @@ limitSource) {
|
|
|
2364
2308
|
process.exitCode = 1;
|
|
2365
2309
|
return;
|
|
2366
2310
|
}
|
|
2367
|
-
// --device / --devices
|
|
2311
|
+
// --device / --devices values are merged into options.host for internal routing. A bare `all` / `fleet` sentinel means
|
|
2368
2312
|
// "search every peer" — which is already the default — so it resolves to no
|
|
2369
2313
|
// explicit host set rather than erroring on a device literally named "all".
|
|
2370
2314
|
const deviceTargets = [...(options.device ?? []), ...(options.devices ?? [])]
|
|
@@ -2445,7 +2389,7 @@ limitSource) {
|
|
|
2445
2389
|
await runRemoteSessionsJson(options.host);
|
|
2446
2390
|
return;
|
|
2447
2391
|
}
|
|
2448
|
-
// A bare interactive `--
|
|
2392
|
+
// A bare interactive `--device`/`--device <box>` listing falls through to the
|
|
2449
2393
|
// fleet browser below, which folds the named host(s) into the same merged,
|
|
2450
2394
|
// preview-rich, selectable view as the local listing (via gatherRemoteList).
|
|
2451
2395
|
// A query, a render/filter flag, or a non-interactive caller keeps the legacy
|
|
@@ -3797,7 +3741,7 @@ export function formatPickerLabel(s, query, cols = {}, ssh, host = '', bookmarke
|
|
|
3797
3741
|
/** Hints rotated above the picker so the flags/features stay discoverable. */
|
|
3798
3742
|
const PICKER_TIPS = [
|
|
3799
3743
|
'Tip: narrow with -a/--agent (e.g. -a codex), or --project <name> for another folder.',
|
|
3800
|
-
"Tip: --all searches every directory; -
|
|
3744
|
+
"Tip: --all searches every directory; -D/--device <machine> folds in another box's sessions.",
|
|
3801
3745
|
'Tip: just type to fuzzy-search prompts and responses; press space to preview a session.',
|
|
3802
3746
|
'Tip: --since 2d / --until <date> bound the time window; pass a session id to open it directly.',
|
|
3803
3747
|
];
|
|
@@ -3865,7 +3809,7 @@ export async function handlePickedSession(picked) {
|
|
|
3865
3809
|
if (isIdlessLiveRow(picked.session)) {
|
|
3866
3810
|
const where = picked.session.machine ? ` on ${picked.session.machine}` : '';
|
|
3867
3811
|
console.log(chalk.yellow(`This session hasn't reported a session id yet — nothing to open${where}.`));
|
|
3868
|
-
console.log(chalk.gray(`Watch for it with: agents sessions --active${picked.session.machine ? ` --
|
|
3812
|
+
console.log(chalk.gray(`Watch for it with: agents sessions --active${picked.session.machine ? ` --device ${picked.session.machine}` : ''}`));
|
|
3869
3813
|
return;
|
|
3870
3814
|
}
|
|
3871
3815
|
// Reading and resuming are on DIFFERENT machines' terms, and conflating them
|
|
@@ -3902,9 +3846,9 @@ export async function resumeOnOwnerIfRemote(session) {
|
|
|
3902
3846
|
if (!owner)
|
|
3903
3847
|
return false;
|
|
3904
3848
|
console.log(chalk.gray(`Resuming ${session.shortId} on ${owner} over SSH...`));
|
|
3905
|
-
// `agents resume <id>` is the strict single-session path — one pick, one
|
|
3906
|
-
// resume.
|
|
3907
|
-
const rc = await runOnPeer(['resume', session.id], owner, {
|
|
3849
|
+
// `agents sessions resume <id>` is the strict single-session path — one pick, one
|
|
3850
|
+
// resume.
|
|
3851
|
+
const rc = await runOnPeer(['sessions', 'resume', session.id], owner, {
|
|
3908
3852
|
tty: true,
|
|
3909
3853
|
env: { [RESUME_PINNED_ENV]: '1' },
|
|
3910
3854
|
});
|
|
@@ -3922,7 +3866,7 @@ export async function resumeOnOwnerIfRemote(session) {
|
|
|
3922
3866
|
export async function resumeSessionInPlace(session) {
|
|
3923
3867
|
// This function is the LOCAL takeover, and every caller is responsible for
|
|
3924
3868
|
// routing a peer-owned session before it gets here (the picker above,
|
|
3925
|
-
// `agents resume`, `sessions attach`). Reaching it with one anyway means a
|
|
3869
|
+
// `agents sessions resume`, `sessions attach`). Reaching it with one anyway means a
|
|
3926
3870
|
// caller skipped that step, so refuse rather than start the harness against
|
|
3927
3871
|
// state this box does not have — the `fs.existsSync(session.cwd)` fallback
|
|
3928
3872
|
// just below is exactly how that used to pass unnoticed, quietly swapping in
|
|
@@ -3930,7 +3874,7 @@ export async function resumeSessionInPlace(session) {
|
|
|
3930
3874
|
const owner = sessionOwnerDevice(session);
|
|
3931
3875
|
if (owner) {
|
|
3932
3876
|
console.error(chalk.red(`Session ${session.shortId} belongs to ${owner} — it cannot resume on this machine.`));
|
|
3933
|
-
console.error(chalk.gray(` Resume it there: agents resume ${session.id}`));
|
|
3877
|
+
console.error(chalk.gray(` Resume it there: agents sessions resume ${session.id}`));
|
|
3934
3878
|
process.exitCode = 1;
|
|
3935
3879
|
return;
|
|
3936
3880
|
}
|
|
@@ -4792,14 +4736,60 @@ export function metadataResolveOutcome(localMatches, remote, selector) {
|
|
|
4792
4736
|
return { kind: 'ambiguous', candidates };
|
|
4793
4737
|
return { kind: 'resolved', session: candidates[0].hits[0].session };
|
|
4794
4738
|
}
|
|
4795
|
-
/**
|
|
4796
|
-
*
|
|
4797
|
-
|
|
4739
|
+
/**
|
|
4740
|
+
* Local metadata candidates for a selector: the indexed SQLite rows, plus — when
|
|
4741
|
+
* an id-shaped selector misses the index entirely — the live-session registry
|
|
4742
|
+
* (RUSH-2682).
|
|
4743
|
+
*
|
|
4744
|
+
* Indexing is lazy (it only runs inside `discoverSessions`), so a session THIS
|
|
4745
|
+
* box just started is "running" in `agents sessions --active` minutes before its
|
|
4746
|
+
* transcript reaches the local index. Every id resolver (`preview`, `resume`,
|
|
4747
|
+
* `focus`, and the fan-out peer that answers `--resolve-safe-v1`) therefore
|
|
4748
|
+
* consults the SAME live registry `--active` reads before declaring a running
|
|
4749
|
+
* session non-existent. It reshapes process state the registry already computed;
|
|
4750
|
+
* it parses no transcript and renders nothing. The live path is entered ONLY on a
|
|
4751
|
+
* cold id miss, so an indexed hit keeps its richer row and keyword resolution is
|
|
4752
|
+
* unchanged.
|
|
4753
|
+
*/
|
|
4754
|
+
export async function computeLocalMetadataMatches(selector, scope, deps = {}) {
|
|
4798
4755
|
const localMachine = machineId();
|
|
4799
4756
|
const includeLocal = !scope.hosts?.length || shouldIncludeLocal(scope.hosts, localMachine);
|
|
4800
|
-
|
|
4801
|
-
|
|
4802
|
-
|
|
4757
|
+
if (!includeLocal)
|
|
4758
|
+
return [];
|
|
4759
|
+
const indexed = resolveIndexedMetadataRows(indexedRowsForSelector(selector, scope), selector);
|
|
4760
|
+
if (indexed.length > 0 || !looksLikeSessionId(selector)) {
|
|
4761
|
+
return indexed.map(session => ({ ...session, machine: session.machine || localMachine }));
|
|
4762
|
+
}
|
|
4763
|
+
const live = await liveMetadataMatches(selector, scope, localMachine, deps);
|
|
4764
|
+
return live.map(session => ({ ...session, machine: session.machine || localMachine }));
|
|
4765
|
+
}
|
|
4766
|
+
/**
|
|
4767
|
+
* Resolve an id-shaped selector against the local live-session registry
|
|
4768
|
+
* (RUSH-2682). Reads the daemon-warmed active snapshot first (cheap); if that
|
|
4769
|
+
* snapshot predates a just-started session and misses, it forces ONE fresh
|
|
4770
|
+
* gather before conceding, so a session started seconds ago resolves
|
|
4771
|
+
* synchronously. Never throws — a degraded registry read yields no candidates,
|
|
4772
|
+
* so the caller falls through to the ordinary not-found path.
|
|
4773
|
+
*/
|
|
4774
|
+
export async function liveMetadataMatches(selector, scope, self, deps = {}) {
|
|
4775
|
+
const load = deps.loadActive ?? loadLocalActiveSessions;
|
|
4776
|
+
const match = (metas) => resolveIndexedMetadataRows(applyScopeFilters(metas, scope), selector);
|
|
4777
|
+
try {
|
|
4778
|
+
const cached = liveSessionMetas((await load()).sessions, self, Date.now());
|
|
4779
|
+
const hit = match(cached);
|
|
4780
|
+
if (hit.length > 0)
|
|
4781
|
+
return hit;
|
|
4782
|
+
const fresh = liveSessionMetas((await load({ forceRefresh: true })).sessions, self, Date.now());
|
|
4783
|
+
return match(fresh);
|
|
4784
|
+
}
|
|
4785
|
+
catch {
|
|
4786
|
+
return [];
|
|
4787
|
+
}
|
|
4788
|
+
}
|
|
4789
|
+
/** Reusable local-first resolver for `agents run --resume` and `agents sessions resume`.
|
|
4790
|
+
* Full UUIDs hit the local SQLite index without any SSH fan-out. */
|
|
4791
|
+
export async function resolveSessionMetadataValue(selector, scope = {}, deps = { gatherRemoteList }) {
|
|
4792
|
+
const localMatches = await computeLocalMetadataMatches(selector, scope, deps);
|
|
4803
4793
|
// A full-UUID local hit resolves with ZERO SSH: a UUID is globally unique, so
|
|
4804
4794
|
// finding it locally is the whole answer and no peer is dialed. (A label is
|
|
4805
4795
|
// NOT resolved local-only here — it can collide with a same-label session on a
|
|
@@ -4835,11 +4825,11 @@ export async function resolveSessionMetadataValue(selector, scope = {}, deps = {
|
|
|
4835
4825
|
* injectable) so tests can drive this real call site against a fake fan-out
|
|
4836
4826
|
* instead of only the pure resolver it wraps. */
|
|
4837
4827
|
export async function resolveSessionMetadata(selector, scope, deps = { gatherRemoteList }) {
|
|
4838
|
-
|
|
4839
|
-
|
|
4840
|
-
|
|
4841
|
-
|
|
4842
|
-
|
|
4828
|
+
// Same local candidate set as resolveSessionMetadataValue, so the peer
|
|
4829
|
+
// answering a fan-out (`--resolve-safe-v1`, NO_FANOUT) surfaces a running
|
|
4830
|
+
// session its own index has not caught yet — the cross-device half of the
|
|
4831
|
+
// RUSH-2682 fix, since the parent's fan-out reads this box's answer.
|
|
4832
|
+
const localMatches = await computeLocalMetadataMatches(selector, scope, deps);
|
|
4843
4833
|
// A peer is already inside gatherRemoteList. Return all local candidates so
|
|
4844
4834
|
// the parent can distinguish a fleet-wide unique match from an ambiguity.
|
|
4845
4835
|
if (process.env[NO_FANOUT_ENV] === '1') {
|
|
@@ -4940,7 +4930,7 @@ export function registerSessionsCommands(program) {
|
|
|
4940
4930
|
.option('--query <clause>', 'Search text; repeat with --include tools to require distinct matching calls', collectQueryClause, [])
|
|
4941
4931
|
.option('--resolve <selector>', 'Resolve one full ID, unique prefix, or keyword query to safe session metadata (requires --json; searches the fleet unless --local)')
|
|
4942
4932
|
.addOption(new Option('--resolve-safe-v1 <selector>').hideHelp())
|
|
4943
|
-
.description('Find, browse, and read agent conversation transcripts. Live roster: `agents sessions --active
|
|
4933
|
+
.description('Find, browse, and read agent conversation transcripts. Live roster: `agents sessions --active`.')
|
|
4944
4934
|
.option('-a, --agent <agent>', 'Filter by agent type and version (e.g., claude, codex@0.116.0)')
|
|
4945
4935
|
.addOption(new Option('--session-version <version>', 'Internal spelling for the public sessions --version filter')
|
|
4946
4936
|
.hideHelp())
|
|
@@ -4989,8 +4979,7 @@ export function registerSessionsCommands(program) {
|
|
|
4989
4979
|
.option('--flat', 'Plain flat table (one row per session) instead of the grouped project overview')
|
|
4990
4980
|
.option('--no-live', 'Do not enrich the listing with live status/preview for running sessions')
|
|
4991
4981
|
.option('--cloud', 'Source sessions from Rush Cloud (captured runs) instead of local disk')
|
|
4992
|
-
.option('-
|
|
4993
|
-
.option('--device <target...>', 'Alias for --host (device alias from `agents devices`; repeatable). `--device all` searches the whole fleet (the default).')
|
|
4982
|
+
.option('-D, --device <target...>', 'Run this query on remote machine(s) over SSH (device alias from `agents devices`, user@host, or `all` to search the whole fleet; repeatable)')
|
|
4994
4983
|
.addOption(new Option('--devices <target...>', 'Plural alias for --device (accepts `all`/`fleet`).').hideHelp())
|
|
4995
4984
|
.option('--fleet', 'With --include tools: query every registered online compute device and merge compact matches')
|
|
4996
4985
|
.option('--count', 'With one program:<name> tool query: count static occurrences, containing calls, and sessions')
|
|
@@ -5075,10 +5064,10 @@ export function registerSessionsCommands(program) {
|
|
|
5075
5064
|
agents sessions --resolve d3470b57 --json
|
|
5076
5065
|
|
|
5077
5066
|
# Search another machine's sessions live over SSH (no sync needed)
|
|
5078
|
-
agents sessions "auth bug" --last 3 --
|
|
5067
|
+
agents sessions "auth bug" --last 3 --device yosemite-s1
|
|
5079
5068
|
|
|
5080
5069
|
# Fan the same query out across several machines
|
|
5081
|
-
agents sessions --all "deploy script" --
|
|
5070
|
+
agents sessions --all "deploy script" --device box-a --device box-b
|
|
5082
5071
|
`,
|
|
5083
5072
|
notes: `
|
|
5084
5073
|
Session lifecycle — ONE verb gets you back in, it detects the state:
|
|
@@ -5090,7 +5079,7 @@ export function registerSessionsCommands(program) {
|
|
|
5090
5079
|
- The interactive listing and every live-status flag fold in your other online machines automatically (live over SSH, no sync) — each row is labelled by host, this machine first. Use --local to skip the fan-out; single-id lookups stay local.
|
|
5091
5080
|
- --all is not a device flag: it widens historical directory and time filters. Fleet collection is already the default. A status flag (--working/--idle/--waiting/--orphan/--crashed/--closed/--abandoned/--queued/--unknown) implies --active; combine status flags for a union.
|
|
5092
5081
|
- --version <version> requires --agent and is equivalent to --agent <agent@version>.
|
|
5093
|
-
- --
|
|
5082
|
+
- --device runs the query on the remote's own index over SSH (host alias or user@host); repeat or pass several to fan out. SSH access is the only auth.
|
|
5094
5083
|
- --in-team matches both ends of the lineage: the session that ran 'agents teams create/add', and (with --teams) that team's teammates. In the interactive list, 't' cycles the same filter over the teams in view.
|
|
5095
5084
|
- --include and --exclude are mutually exclusive.
|
|
5096
5085
|
- With --include tools, repeat --query for same-session AND across distinct calls. Fields: tool, program, input, output, status, exit, error.
|
|
@@ -5142,8 +5131,7 @@ export function registerSessionsCommands(program) {
|
|
|
5142
5131
|
.option('-a, --agent <agent>', 'Narrow the ID to one agent type/version')
|
|
5143
5132
|
.option('-p, --project <name>', 'Narrow the ID to one project')
|
|
5144
5133
|
.option('--local', 'Only this machine; do not resolve the ID across the fleet')
|
|
5145
|
-
.option('-
|
|
5146
|
-
.option('--device <target...>', 'Alias for --host')
|
|
5134
|
+
.option('-D, --device <target...>', 'Resolve only on the named device(s)')
|
|
5147
5135
|
.option('--json', 'Output the session preview as JSON');
|
|
5148
5136
|
setHelpSections(previewCmd, {
|
|
5149
5137
|
examples: `
|
|
@@ -5186,6 +5174,7 @@ export function registerSessionsCommands(program) {
|
|
|
5186
5174
|
registerSessionsInjectCommand(sessionsCmd);
|
|
5187
5175
|
registerSessionsExportCommand(sessionsCmd);
|
|
5188
5176
|
registerSessionsRenderCommand(sessionsCmd);
|
|
5177
|
+
registerSessionsShareCommand(sessionsCmd);
|
|
5189
5178
|
registerSessionsImportCommand(sessionsCmd);
|
|
5190
5179
|
registerSessionsMigrateCommand(sessionsCmd);
|
|
5191
5180
|
registerSessionsMigrationsCommand(sessionsCmd);
|
|
@@ -5194,31 +5183,6 @@ export function registerSessionsCommands(program) {
|
|
|
5194
5183
|
registerSessionsInsightsCommand(sessionsCmd);
|
|
5195
5184
|
registerSessionsOptimizeCommand(sessionsCmd);
|
|
5196
5185
|
registerSessionsWatchCommand(sessionsCmd);
|
|
5197
|
-
// Observe-umbrella alias (Phase 3): roster → sessions --active.
|
|
5198
|
-
registerSessionsObserveAliases(program);
|
|
5199
|
-
}
|
|
5200
|
-
/**
|
|
5201
|
-
* `roster` → sessions --active. Registered with the sessions module so the
|
|
5202
|
-
* lazy loader for `roster` also registers the real `sessions` command for re-parse.
|
|
5203
|
-
*/
|
|
5204
|
-
function registerSessionsObserveAliases(program) {
|
|
5205
|
-
program
|
|
5206
|
-
.command('roster')
|
|
5207
|
-
.description('Live agent roster (alias of `agents sessions --active`). Who is running right now.')
|
|
5208
|
-
.allowUnknownOption()
|
|
5209
|
-
.allowExcessArguments()
|
|
5210
|
-
.action(async () => {
|
|
5211
|
-
const { expandObserveAlias } = await import('../lib/observe-aliases.js');
|
|
5212
|
-
const rest = process.argv.slice(3);
|
|
5213
|
-
const expanded = expandObserveAlias('roster', rest);
|
|
5214
|
-
if (!expanded) {
|
|
5215
|
-
console.error(chalk.red('Unknown observe alias: roster'));
|
|
5216
|
-
process.exit(1);
|
|
5217
|
-
}
|
|
5218
|
-
if (process.stderr.isTTY)
|
|
5219
|
-
process.stderr.write(chalk.gray(`${expanded.note}\n`));
|
|
5220
|
-
await program.parseAsync(['node', 'agents', ...expanded.argv]);
|
|
5221
|
-
});
|
|
5222
5186
|
}
|
|
5223
5187
|
function formatNoSessionsMessage(showAll, project) {
|
|
5224
5188
|
const projectQuery = project?.trim();
|
|
@@ -14,7 +14,7 @@ import { DEFAULT_BROWSER_PROFILE_NAME, createProfile, findFreeProfilePort, getCo
|
|
|
14
14
|
import { DEFAULT_VIEWPORT } from '../lib/browser/devices.js';
|
|
15
15
|
import { isInteractiveTerminal, isPromptCancelled } from './utils.js';
|
|
16
16
|
import { defaultBrowserChoice } from './setup-preferences.js';
|
|
17
|
-
const INSTALL_HINT = 'Install one of: Google Chrome, Brave, Microsoft Edge, Chromium, or
|
|
17
|
+
const INSTALL_HINT = 'Install one of: Google Chrome, Brave, Microsoft Edge, Chromium, Comet, or Arc, then re-run `agents setup browser`.\n' +
|
|
18
18
|
'(Safari and Firefox are not supported — agents browser drives over the Chrome DevTools Protocol.)';
|
|
19
19
|
/**
|
|
20
20
|
* Interactive browser setup. Returns true if a usable default profile exists
|
|
@@ -33,7 +33,7 @@ function openPane(pane) {
|
|
|
33
33
|
export async function runComputerWizard() {
|
|
34
34
|
if (os.platform() !== 'darwin') {
|
|
35
35
|
console.log(chalk.yellow('`agents setup computer` configures the macOS helper (local control).'));
|
|
36
|
-
console.log(chalk.dim('On Windows, provision a remote host from a Mac/Linux box instead: `agents computer setup --
|
|
36
|
+
console.log(chalk.dim('On Windows, provision a remote host from a Mac/Linux box instead: `agents computer setup --device <device>`.'));
|
|
37
37
|
return false;
|
|
38
38
|
}
|
|
39
39
|
// 1. Download + verify + install the signed, notarized helper.
|