@phnx-labs/agents-cli 1.22.38 → 1.22.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +302 -0
- package/README.md +111 -70
- package/dist/bin/agents +0 -0
- package/dist/bootstrap.js +46 -27
- package/dist/browser.js +2 -2
- package/dist/cli/command-registry.d.ts +135 -0
- package/dist/cli/command-registry.js +260 -0
- package/dist/commands/accounts.d.ts +20 -0
- package/dist/commands/accounts.js +186 -25
- package/dist/commands/apply.d.ts +3 -3
- package/dist/commands/apply.js +20 -63
- package/dist/commands/browser.js +206 -94
- package/dist/commands/budget.d.ts +7 -6
- package/dist/commands/budget.js +8 -7
- package/dist/commands/cloud.js +17 -20
- package/dist/commands/commands.js +1 -1
- package/dist/commands/computer-actions.d.ts +1 -35
- package/dist/commands/computer-actions.js +13 -181
- package/dist/commands/computer.d.ts +28 -3
- package/dist/commands/computer.js +93 -65
- package/dist/commands/config.js +47 -4
- package/dist/commands/cost.d.ts +2 -1
- package/dist/commands/cost.js +7 -6
- package/dist/commands/daemon.js +151 -4
- package/dist/commands/detach.js +1 -1
- package/dist/commands/doctor.js +19 -11
- package/dist/commands/events.js +1 -1
- package/dist/commands/exec.d.ts +2 -50
- package/dist/commands/exec.js +161 -216
- package/dist/commands/factory.js +1 -1
- package/dist/commands/feed.d.ts +2 -2
- package/dist/commands/feed.js +9 -12
- package/dist/commands/fleet-capture.js +25 -27
- package/dist/commands/focus.d.ts +2 -3
- package/dist/commands/focus.js +34 -9
- package/dist/commands/go.js +15 -5
- package/dist/commands/harness.d.ts +3 -3
- package/dist/commands/harness.js +53 -5
- package/dist/commands/hooks.js +1 -1
- package/dist/commands/import.js +2 -2
- package/dist/commands/insights.d.ts +5 -5
- package/dist/commands/insights.js +15 -9
- package/dist/commands/inspect.d.ts +2 -3
- package/dist/commands/inspect.js +4 -16
- package/dist/commands/logs.d.ts +2 -2
- package/dist/commands/logs.js +9 -9
- package/dist/commands/mcp.js +2 -2
- package/dist/commands/memory.js +1 -1
- package/dist/commands/message.d.ts +1 -1
- package/dist/commands/message.js +7 -7
- package/dist/commands/mine.d.ts +11 -8
- package/dist/commands/mine.js +11 -10
- package/dist/commands/models.js +1 -1
- package/dist/commands/modes.js +1 -1
- package/dist/commands/monitors.js +23 -6
- package/dist/commands/output.d.ts +7 -6
- package/dist/commands/output.js +11 -10
- package/dist/commands/packages.js +4 -4
- package/dist/commands/perf.js +1 -1
- package/dist/commands/permissions.js +49 -32
- package/dist/commands/plugins.d.ts +1 -1
- package/dist/commands/plugins.js +3 -3
- package/dist/commands/profiles.d.ts +6 -9
- package/dist/commands/profiles.js +8 -321
- package/dist/commands/projects.d.ts +9 -0
- package/dist/commands/projects.js +140 -8
- package/dist/commands/prune.js +5 -13
- package/dist/commands/refresh-rules.js +1 -1
- package/dist/commands/repo.d.ts +5 -7
- package/dist/commands/repo.js +34 -18
- package/dist/commands/resource-view.js +4 -0
- package/dist/commands/resume.d.ts +11 -7
- package/dist/commands/resume.js +82 -98
- package/dist/commands/route.d.ts +12 -0
- package/dist/commands/route.js +261 -0
- package/dist/commands/routines.d.ts +2 -3
- package/dist/commands/routines.js +120 -145
- package/dist/commands/rules.js +1 -1
- package/dist/commands/run-account-picker.d.ts +1 -1
- package/dist/commands/run-account-picker.js +2 -2
- package/dist/commands/run-broadcast.d.ts +21 -0
- package/dist/commands/run-broadcast.js +89 -0
- package/dist/commands/run-cloud.js +1 -1
- package/dist/commands/secrets-vault.d.ts +10 -0
- package/dist/commands/{login.js → secrets-vault.js} +34 -14
- package/dist/commands/secrets.d.ts +4 -4
- package/dist/commands/secrets.js +72 -63
- package/dist/commands/sessions-backfill.js +1 -1
- package/dist/commands/sessions-browser.d.ts +1 -1
- package/dist/commands/sessions-browser.js +9 -5
- package/dist/commands/sessions-export.js +2 -2
- package/dist/commands/sessions-inject.js +4 -5
- package/dist/commands/sessions-migrate.js +16 -27
- package/dist/commands/sessions-picker.d.ts +13 -0
- package/dist/commands/sessions-picker.js +182 -8
- package/dist/commands/sessions-resume.d.ts +7 -3
- package/dist/commands/sessions-resume.js +81 -33
- package/dist/commands/sessions-stats.js +2 -2
- package/dist/commands/sessions.d.ts +75 -68
- package/dist/commands/sessions.js +142 -180
- package/dist/commands/setup-computer.js +1 -1
- package/dist/commands/setup-fleet.js +3 -0
- package/dist/commands/setup-mine.d.ts +7 -3
- package/dist/commands/setup-mine.js +13 -8
- package/dist/commands/setup-secrets.js +2 -2
- package/dist/commands/setup-watchdog.js +2 -2
- package/dist/commands/setup.js +7 -2
- package/dist/commands/share.d.ts +65 -0
- package/dist/commands/share.js +253 -20
- package/dist/commands/skills.js +3 -3
- package/dist/commands/snapshot.d.ts +2 -2
- package/dist/commands/snapshot.js +9 -9
- package/dist/commands/ssh.d.ts +1 -1
- package/dist/commands/ssh.js +318 -48
- package/dist/commands/subagents.js +1 -1
- package/dist/commands/sync.js +24 -9
- package/dist/commands/teams.d.ts +2 -2
- package/dist/commands/teams.js +9 -18
- package/dist/commands/tmux.js +5 -1
- package/dist/commands/trash.js +1 -1
- package/dist/commands/usage.d.ts +1 -1
- package/dist/commands/usage.js +2 -2
- package/dist/commands/utils.d.ts +4 -14
- package/dist/commands/utils.js +6 -27
- package/dist/commands/versions.js +2 -2
- package/dist/commands/view.d.ts +9 -77
- package/dist/commands/view.js +23 -8
- package/dist/commands/watchdog.js +1 -1
- package/dist/commands/webhook.js +11 -25
- package/dist/commands/workflows.js +1 -1
- package/dist/index.js +1 -1
- package/dist/lib/account-capabilities.d.ts +39 -0
- package/dist/lib/account-capabilities.js +59 -0
- package/dist/lib/account-catalog.js +1 -1
- package/dist/lib/account-registry.d.ts +66 -0
- package/dist/lib/account-registry.js +151 -5
- package/dist/lib/{rotate.d.ts → accounting/rotate.d.ts} +4 -4
- package/dist/lib/{rotate.js → accounting/rotate.js} +8 -8
- package/dist/lib/{usage.d.ts → accounting/usage.d.ts} +4 -4
- package/dist/lib/{usage.js → accounting/usage.js} +11 -11
- package/dist/lib/agent-spec/provider.js +1 -1
- package/dist/lib/agents.d.ts +72 -4
- package/dist/lib/agents.js +231 -199
- package/dist/lib/answer-router.d.ts +2 -2
- package/dist/lib/ask-classifier.d.ts +1 -1
- package/dist/lib/ask-classifier.js +1 -1
- package/dist/lib/audit/log.js +1 -1
- package/dist/lib/auth-health.d.ts +1 -1
- package/dist/lib/auth-health.js +2 -2
- package/dist/lib/brand.js +1 -1
- package/dist/lib/browser/caller-identity.d.ts +28 -0
- package/dist/lib/browser/caller-identity.js +156 -0
- package/dist/lib/browser/cdp.js +1 -1
- package/dist/lib/browser/drivers/ssh.d.ts +1 -1
- package/dist/lib/browser/drivers/ssh.js +2 -2
- package/dist/lib/browser/hygiene.d.ts +10 -2
- package/dist/lib/browser/hygiene.js +7 -4
- package/dist/lib/browser/ipc.d.ts +22 -2
- package/dist/lib/browser/ipc.js +185 -21
- package/dist/lib/browser/profiles.d.ts +67 -3
- package/dist/lib/browser/profiles.js +129 -7
- package/dist/lib/browser/remote-control.d.ts +2 -2
- package/dist/lib/browser/remote-control.js +3 -3
- package/dist/lib/browser/runtime-state.d.ts +79 -0
- package/dist/lib/browser/runtime-state.js +119 -1
- package/dist/lib/browser/service.d.ts +113 -1
- package/dist/lib/browser/service.js +454 -40
- package/dist/lib/browser/sessions-list.d.ts +2 -1
- package/dist/lib/browser/sessions-list.js +4 -13
- package/dist/lib/browser/types.d.ts +18 -0
- package/dist/lib/budget/config.js +1 -1
- package/dist/lib/budget/ledger.js +1 -1
- package/dist/lib/byok-usage.js +1 -1
- package/dist/lib/capabilities.js +3 -15
- package/dist/lib/catchup.d.ts +1 -1
- package/dist/lib/catchup.js +1 -1
- package/dist/lib/cloud/dispatch.js +1 -1
- package/dist/lib/cloud/host.d.ts +3 -3
- package/dist/lib/cloud/host.js +5 -5
- package/dist/lib/cloud/rush.d.ts +9 -21
- package/dist/lib/cloud/rush.js +33 -120
- package/dist/lib/cloud/types.d.ts +2 -2
- package/dist/lib/commands.js +3 -13
- package/dist/lib/computer/actions.d.ts +36 -0
- package/dist/lib/computer/actions.js +162 -0
- package/dist/lib/computer/dispatch.d.ts +2 -2
- package/dist/lib/computer/dispatch.js +2 -2
- package/dist/lib/computer/sessions-list.d.ts +3 -3
- package/dist/lib/computer/sessions-list.js +2 -2
- package/dist/lib/config-keys.d.ts +12 -3
- package/dist/lib/config-keys.js +29 -6
- package/dist/lib/config-machine-keys.d.ts +4 -2
- package/dist/lib/config-machine-keys.js +6 -2
- package/dist/lib/crabbox/lease.js +9 -1
- package/dist/lib/crabbox/runtimes.d.ts +32 -7
- package/dist/lib/crabbox/runtimes.js +72 -30
- package/dist/lib/{daemon.d.ts → daemon/daemon.d.ts} +59 -1
- package/dist/lib/{daemon.js → daemon/daemon.js} +237 -49
- package/dist/lib/daemon-services.d.ts +1 -1
- package/dist/lib/daemon-services.js +5 -0
- package/dist/lib/daemon-ticks.d.ts +25 -0
- package/dist/lib/daemon-ticks.js +31 -1
- package/dist/lib/daemon-webhooks.d.ts +102 -0
- package/dist/lib/daemon-webhooks.js +210 -0
- package/dist/lib/device-config.d.ts +116 -72
- package/dist/lib/device-config.js +366 -132
- package/dist/lib/devices/config-migration.d.ts +29 -34
- package/dist/lib/devices/config-migration.js +209 -130
- package/dist/lib/devices/connect.d.ts +2 -2
- package/dist/lib/devices/connect.js +2 -2
- package/dist/lib/devices/discovery-policy.d.ts +30 -0
- package/dist/lib/devices/discovery-policy.js +101 -0
- package/dist/lib/devices/fleet-inventory.js +8 -3
- package/dist/lib/devices/harness-inventory.d.ts +1 -1
- package/dist/lib/devices/harness-inventory.js +12 -3
- package/dist/lib/devices/known-hosts.js +1 -1
- package/dist/lib/devices/pool.d.ts +61 -0
- package/dist/lib/devices/pool.js +83 -0
- package/dist/lib/devices/registry.d.ts +1 -1
- package/dist/lib/devices/registry.js +1 -1
- package/dist/lib/devices/resolve-profile.d.ts +2 -2
- package/dist/lib/devices/resolve-profile.js +2 -2
- package/dist/lib/devices/resolve-target.d.ts +1 -1
- package/dist/lib/devices/resolve-target.js +4 -4
- package/dist/lib/devices/self-host.d.ts +1 -1
- package/dist/lib/devices/self-host.js +3 -3
- package/dist/lib/devices/ssh-config.d.ts +1 -1
- package/dist/lib/devices/stats-cache.js +1 -1
- package/dist/lib/devices/sync.d.ts +3 -1
- package/dist/lib/devices/sync.js +3 -3
- package/dist/lib/doctor-diff.js +4 -4
- package/dist/lib/drift-sync.js +2 -2
- package/dist/lib/drift.js +2 -2
- package/dist/lib/event-families.d.ts +1 -1
- package/dist/lib/event-stream.d.ts +1 -1
- package/dist/lib/event-stream.js +2 -2
- package/dist/lib/events-ingest.js +2 -2
- package/dist/lib/exec.d.ts +8 -5
- package/dist/lib/exec.js +19 -13
- package/dist/lib/factory/snapshot.d.ts +1 -1
- package/dist/lib/factory/snapshot.js +1 -1
- package/dist/lib/{activity.d.ts → feed/activity.d.ts} +1 -1
- package/dist/lib/{activity.js → feed/activity.js} +7 -7
- package/dist/lib/{events.d.ts → feed/events.d.ts} +2 -2
- package/dist/lib/{events.js → feed/events.js} +5 -5
- package/dist/lib/{feed.js → feed/feed.js} +4 -4
- package/dist/lib/feed-outcome.d.ts +1 -1
- package/dist/lib/feed-policy.d.ts +1 -1
- package/dist/lib/feed-policy.js +1 -1
- package/dist/lib/feed-post.d.ts +1 -1
- package/dist/lib/feed-post.js +1 -1
- package/dist/lib/feed-ranking.d.ts +1 -1
- package/dist/lib/fleet/apply.d.ts +0 -6
- package/dist/lib/fleet/apply.js +18 -45
- package/dist/lib/fleet/auth-sync.d.ts +16 -35
- package/dist/lib/fleet/auth-sync.js +16 -75
- package/dist/lib/fleet/capture.js +8 -6
- package/dist/lib/fleet/manifest.js +23 -11
- package/dist/lib/fleet/types.d.ts +19 -7
- package/dist/lib/fleet-cache.d.ts +1 -1
- package/dist/lib/fleet-cache.js +1 -1
- package/dist/lib/format.d.ts +19 -0
- package/dist/lib/format.js +44 -1
- package/dist/lib/friction-heuristics.d.ts +1 -1
- package/dist/lib/git.d.ts +24 -1
- package/dist/lib/git.js +82 -38
- package/dist/lib/heal.js +3 -3
- package/dist/lib/hooks.d.ts +18 -0
- package/dist/lib/hooks.js +113 -1
- package/dist/lib/hosts/credentials.d.ts +30 -10
- package/dist/lib/hosts/credentials.js +38 -26
- package/dist/lib/hosts/dispatch.d.ts +3 -3
- package/dist/lib/hosts/dispatch.js +3 -3
- package/dist/lib/hosts/option.d.ts +3 -3
- package/dist/lib/hosts/option.js +7 -8
- package/dist/lib/hosts/passthrough.d.ts +17 -17
- package/dist/lib/hosts/passthrough.js +67 -50
- package/dist/lib/hosts/providers/devices.d.ts +1 -1
- package/dist/lib/hosts/providers/devices.js +1 -1
- package/dist/lib/hosts/reconcile.d.ts +1 -1
- package/dist/lib/hosts/reconcile.js +1 -1
- package/dist/lib/hosts/reconnect.d.ts +1 -1
- package/dist/lib/hosts/reconnect.js +2 -2
- package/dist/lib/hosts/registry.d.ts +5 -5
- package/dist/lib/hosts/registry.js +5 -5
- package/dist/lib/hosts/remote-cmd.d.ts +10 -10
- package/dist/lib/hosts/remote-cmd.js +25 -18
- package/dist/lib/hosts/remote-os.d.ts +4 -4
- package/dist/lib/hosts/remote-os.js +4 -4
- package/dist/lib/hosts/remote-session-id.d.ts +2 -2
- package/dist/lib/hosts/remote-session-id.js +2 -2
- package/dist/lib/hosts/routing-flag.d.ts +3 -3
- package/dist/lib/hosts/routing-flag.js +4 -5
- package/dist/lib/hosts/run-target.d.ts +4 -4
- package/dist/lib/hosts/run-target.js +4 -4
- package/dist/lib/hosts/session-index.d.ts +2 -2
- package/dist/lib/hosts/session-index.js +1 -1
- package/dist/lib/hosts/session-marker.d.ts +1 -1
- package/dist/lib/hosts/session-marker.js +1 -1
- package/dist/lib/hosts/types.d.ts +2 -2
- package/dist/lib/hosts/types.js +2 -2
- package/dist/lib/import.js +1 -1
- package/dist/lib/{migrate.d.ts → installations/migrate.d.ts} +49 -1
- package/dist/lib/{migrate.js → installations/migrate.js} +265 -38
- package/dist/lib/installations/resolve.js +1 -1
- package/dist/lib/installations/strategies.js +1 -1
- package/dist/lib/installations/update.js +2 -2
- package/dist/lib/{versions.d.ts → installations/versions.d.ts} +12 -3
- package/dist/lib/{versions.js → installations/versions.js} +51 -31
- package/dist/lib/isolation-boundary-report.js +1 -1
- package/dist/lib/linear-projects.d.ts +28 -0
- package/dist/lib/linear-projects.js +30 -0
- package/dist/lib/loop.js +1 -1
- package/dist/lib/mailbox-gc.js +1 -1
- package/dist/lib/mailbox.js +1 -1
- package/dist/lib/mcp-registry.d.ts +62 -0
- package/dist/lib/mcp-registry.js +177 -0
- package/dist/lib/mcp.d.ts +5 -0
- package/dist/lib/mcp.js +124 -307
- package/dist/lib/menubar/MenubarHelper.app/Contents/CodeResources +0 -0
- package/dist/lib/menubar/MenubarHelper.app/Contents/MacOS/MenubarHelper +0 -0
- package/dist/lib/menubar/install-menubar.d.ts +7 -0
- package/dist/lib/menubar/install-menubar.js +24 -6
- package/dist/lib/menubar/snapshot.d.ts +7 -0
- package/dist/lib/menubar/snapshot.js +8 -6
- package/dist/lib/models.js +1 -1
- package/dist/lib/monitors/config.d.ts +12 -0
- package/dist/lib/monitors/config.js +3 -0
- package/dist/lib/monitors/dispatch.js +26 -5
- package/dist/lib/monitors/engine.js +10 -0
- package/dist/lib/monitors/sources/webhook.d.ts +1 -1
- package/dist/lib/monitors/state.d.ts +42 -0
- package/dist/lib/monitors/state.js +30 -0
- package/dist/lib/notify.d.ts +1 -1
- package/dist/lib/observe-aliases.d.ts +2 -2
- package/dist/lib/observe-aliases.js +2 -11
- package/dist/lib/output/git-output.js +2 -2
- package/dist/lib/overdue.d.ts +1 -1
- package/dist/lib/overdue.js +1 -1
- package/dist/lib/permissions-registry.d.ts +65 -0
- package/dist/lib/permissions-registry.js +599 -0
- package/dist/lib/permissions.d.ts +24 -13
- package/dist/lib/permissions.js +52 -271
- package/dist/lib/picker.d.ts +16 -0
- package/dist/lib/picker.js +33 -3
- package/dist/lib/placement.d.ts +1 -1
- package/dist/lib/placement.js +4 -4
- package/dist/lib/platform/paths.d.ts +8 -0
- package/dist/lib/platform/paths.js +11 -0
- package/dist/lib/platform/posixpath.js +3 -3
- package/dist/lib/{plugin-marketplace.d.ts → plugins/plugin-marketplace.d.ts} +1 -1
- package/dist/lib/{plugin-marketplace.js → plugins/plugin-marketplace.js} +2 -2
- package/dist/lib/{plugins.d.ts → plugins/plugins.d.ts} +1 -1
- package/dist/lib/{plugins.js → plugins/plugins.js} +7 -7
- package/dist/lib/{skills.d.ts → plugins/skills.d.ts} +1 -1
- package/dist/lib/{skills.js → plugins/skills.js} +7 -7
- package/dist/lib/pricing/cost.d.ts +1 -1
- package/dist/lib/pricing/cost.js +1 -1
- package/dist/lib/profiles-presets.d.ts +1 -1
- package/dist/lib/profiles-presets.js +1 -1
- package/dist/lib/profiles.js +2 -2
- package/dist/lib/project-import.js +4 -1
- package/dist/lib/project-launch.d.ts +1 -1
- package/dist/lib/project-launch.js +3 -3
- package/dist/lib/project-pull.d.ts +128 -0
- package/dist/lib/project-pull.js +384 -0
- package/dist/lib/project-root.d.ts +2 -2
- package/dist/lib/project-root.js +2 -2
- package/dist/lib/project-status.js +1 -1
- package/dist/lib/projects.d.ts +23 -0
- package/dist/lib/projects.js +29 -6
- package/dist/lib/refresh.d.ts +12 -1
- package/dist/lib/refresh.js +16 -9
- package/dist/lib/registry.d.ts +9 -2
- package/dist/lib/registry.js +11 -4
- package/dist/lib/resources.d.ts +2 -2
- package/dist/lib/resources.js +2 -2
- package/dist/lib/routers.d.ts +81 -0
- package/dist/lib/routers.js +153 -0
- package/dist/lib/routine-context.d.ts +1 -0
- package/dist/lib/routine-context.js +7 -2
- package/dist/lib/routine-notify-owner.d.ts +1 -1
- package/dist/lib/routine-notify.d.ts +1 -1
- package/dist/lib/routine-notify.js +1 -1
- package/dist/lib/routine-process-cleanup.d.ts +1 -1
- package/dist/lib/routine-readiness.d.ts +1 -1
- package/dist/lib/routine-readiness.js +11 -4
- package/dist/lib/routines-placement.d.ts +12 -2
- package/dist/lib/routines-placement.js +20 -3
- package/dist/lib/routines-project.d.ts +1 -1
- package/dist/lib/routines-project.js +1 -1
- package/dist/lib/rules/compile.d.ts +1 -0
- package/dist/lib/rules/compile.js +10 -2
- package/dist/lib/rules/rules.js +1 -1
- package/dist/lib/run-notify.js +1 -1
- package/dist/lib/runner.d.ts +80 -2
- package/dist/lib/runner.js +241 -62
- package/dist/lib/sandbox.d.ts +1 -1
- package/dist/lib/scheduler.d.ts +1 -1
- package/dist/lib/scheduler.js +1 -1
- package/dist/lib/{routines.d.ts → scheduling/routines.d.ts} +54 -9
- package/dist/lib/{routines.js → scheduling/routines.js} +173 -14
- package/dist/lib/secrets/Agents CLI.app/Contents/CodeResources +0 -0
- package/dist/lib/secrets/Agents CLI.app/Contents/MacOS/Agents CLI +0 -0
- package/dist/lib/secrets/agent.js +2 -2
- package/dist/lib/secrets/audit.js +1 -1
- package/dist/lib/secrets/bundles.d.ts +3 -3
- package/dist/lib/secrets/bundles.js +7 -7
- package/dist/lib/secrets/index.js +1 -1
- package/dist/lib/secrets/list-filter.d.ts +1 -1
- package/dist/lib/secrets/list-filter.js +2 -2
- package/dist/lib/secrets/push.d.ts +1 -1
- package/dist/lib/secrets/push.js +10 -12
- package/dist/lib/secrets/remote.d.ts +12 -10
- package/dist/lib/secrets/remote.js +21 -14
- package/dist/lib/secrets/vault.js +2 -2
- package/dist/lib/self-heal/checks/shadowing.js +1 -1
- package/dist/lib/self-heal/checks/shims.js +1 -1
- package/dist/lib/self-update.d.ts +39 -4
- package/dist/lib/self-update.js +78 -25
- package/dist/lib/serve/control.d.ts +1 -1
- package/dist/lib/serve/control.js +4 -4
- package/dist/lib/serve/data.d.ts +1 -1
- package/dist/lib/serve/data.js +1 -1
- package/dist/lib/serve/stream.js +1 -1
- package/dist/lib/service-manifest.d.ts +29 -0
- package/dist/lib/service-manifest.js +80 -0
- package/dist/lib/session/active.d.ts +59 -7
- package/dist/lib/session/active.js +158 -17
- package/dist/lib/session/bash-command.js +1 -1
- package/dist/lib/session/claude-accounts.d.ts +1 -1
- package/dist/lib/session/claude-accounts.js +1 -1
- package/dist/lib/session/db.d.ts +10 -2
- package/dist/lib/session/db.js +25 -6
- package/dist/lib/session/discover.d.ts +77 -0
- package/dist/lib/session/discover.js +130 -25
- package/dist/lib/session/fork.js +1 -1
- package/dist/lib/session/inject.d.ts +1 -1
- package/dist/lib/session/insights.d.ts +1 -1
- package/dist/lib/session/insights.js +1 -1
- package/dist/lib/session/live-metadata.d.ts +15 -0
- package/dist/lib/session/live-metadata.js +76 -0
- package/dist/lib/session/migrate-targets.d.ts +1 -1
- package/dist/lib/session/recovery.d.ts +1 -1
- package/dist/lib/session/recovery.js +2 -2
- package/dist/lib/session/remote-active.d.ts +10 -1
- package/dist/lib/session/remote-active.js +8 -3
- package/dist/lib/session/remote-bundle.d.ts +1 -1
- package/dist/lib/session/remote-bundle.js +2 -2
- package/dist/lib/session/remote-list.d.ts +15 -4
- package/dist/lib/session/remote-list.js +40 -3
- package/dist/lib/session/remote.d.ts +5 -5
- package/dist/lib/session/remote.js +13 -17
- package/dist/lib/session/resume-command.d.ts +3 -2
- package/dist/lib/session/resume-command.js +4 -3
- package/dist/lib/session/resume-owner.d.ts +3 -3
- package/dist/lib/session/resume-owner.js +3 -3
- package/dist/lib/session/session-cache.d.ts +12 -0
- package/dist/lib/session/session-cache.js +2 -0
- package/dist/lib/session/shell-programs.js +1 -1
- package/dist/lib/session/state.js +5 -5
- package/dist/lib/session/team-filter.d.ts +1 -1
- package/dist/lib/session/team-filter.js +1 -1
- package/dist/lib/session/types.d.ts +3 -3
- package/dist/lib/session/width.d.ts +2 -2
- package/dist/lib/session/width.js +2 -2
- package/dist/lib/share/delete.d.ts +21 -0
- package/dist/lib/share/delete.js +42 -0
- package/dist/lib/share/publish.d.ts +82 -0
- package/dist/lib/share/publish.js +170 -18
- package/dist/lib/share/worker-template.js +172 -9
- package/dist/lib/shims.js +35 -7
- package/dist/lib/smart-launch.d.ts +36 -6
- package/dist/lib/smart-launch.js +65 -8
- package/dist/lib/snapshot.d.ts +4 -4
- package/dist/lib/snapshot.js +2 -2
- package/dist/lib/ssh-exec.d.ts +1 -1
- package/dist/lib/ssh-exec.js +2 -2
- package/dist/lib/ssh-tunnel.d.ts +10 -10
- package/dist/lib/ssh-tunnel.js +12 -12
- package/dist/lib/staleness/checkers/hooks.d.ts +1 -1
- package/dist/lib/staleness/checkers/hooks.js +1 -1
- package/dist/lib/staleness/detectors/permissions.js +0 -23
- package/dist/lib/staleness/detectors/plugins.js +1 -1
- package/dist/lib/staleness/fingerprint.js +1 -1
- package/dist/lib/staleness/layers.d.ts +1 -1
- package/dist/lib/staleness/layers.js +1 -1
- package/dist/lib/staleness/writers/mcp.js +3 -1
- package/dist/lib/staleness/writers/plugins.js +1 -1
- package/dist/lib/staleness/writers/types.d.ts +8 -0
- package/dist/lib/startup/command-registry.d.ts +5 -147
- package/dist/lib/startup/command-registry.js +38 -303
- package/dist/lib/startup/dev-build.d.ts +0 -21
- package/dist/lib/startup/dev-build.js +29 -8
- package/dist/lib/state.d.ts +19 -1
- package/dist/lib/state.js +120 -51
- package/dist/lib/subagents.js +1 -1
- package/dist/lib/sync-status.js +1 -1
- package/dist/lib/sync-umbrella.d.ts +6 -1
- package/dist/lib/sync-umbrella.js +9 -4
- package/dist/lib/teams/agents.js +2 -2
- package/dist/lib/teams/registry.js +1 -1
- package/dist/lib/terminal/backends/vscodium-agent.js +1 -1
- package/dist/lib/terminal/engine.js +1 -1
- package/dist/lib/terminal/index.d.ts +4 -0
- package/dist/lib/terminal/index.js +3 -0
- package/dist/lib/terminal/inject.d.ts +2 -2
- package/dist/lib/terminal/inject.js +2 -2
- package/dist/lib/terminal/transport.js +1 -1
- package/dist/lib/tmux/index.d.ts +1 -1
- package/dist/lib/tmux/index.js +1 -1
- package/dist/lib/tmux/session.d.ts +21 -5
- package/dist/lib/tmux/session.js +76 -22
- package/dist/lib/triggers/handlers.d.ts +1 -1
- package/dist/lib/triggers/handlers.js +2 -2
- package/dist/lib/triggers/webhook.d.ts +36 -2
- package/dist/lib/triggers/webhook.js +97 -42
- package/dist/lib/types.d.ts +18 -6
- package/dist/lib/usage-fleet.d.ts +1 -1
- package/dist/lib/usage-fleet.js +1 -1
- package/dist/lib/usage-refresh.d.ts +1 -1
- package/dist/lib/usage-refresh.js +3 -3
- package/dist/lib/version-duplicates.js +2 -2
- package/dist/lib/view-types.d.ts +56 -0
- package/dist/lib/view-types.js +1 -0
- package/dist/lib/watchdog/rotate.d.ts +2 -2
- package/dist/lib/watchdog/rotate.js +3 -3
- package/dist/lib/watchdog/runner.d.ts +2 -3
- package/dist/lib/watchdog/runner.js +3 -4
- package/dist/lib/workflows.js +1 -1
- package/package.json +2 -1
- package/scripts/postinstall.js +2 -2
- package/dist/commands/bench.d.ts +0 -2
- package/dist/commands/bench.js +0 -101
- package/dist/commands/cp.d.ts +0 -84
- package/dist/commands/cp.js +0 -231
- package/dist/commands/login.d.ts +0 -2
- package/dist/lib/resources/commands.d.ts +0 -46
- package/dist/lib/resources/commands.js +0 -211
- package/dist/lib/resources/hooks.d.ts +0 -16
- package/dist/lib/resources/hooks.js +0 -153
- package/dist/lib/resources/mcp.d.ts +0 -34
- package/dist/lib/resources/mcp.js +0 -250
- package/dist/lib/resources/memory.d.ts +0 -15
- package/dist/lib/resources/memory.js +0 -46
- package/dist/lib/resources/permissions.d.ts +0 -13
- package/dist/lib/resources/permissions.js +0 -202
- package/dist/lib/resources/rules.d.ts +0 -46
- package/dist/lib/resources/rules.js +0 -179
- package/dist/lib/resources/skills.d.ts +0 -37
- package/dist/lib/resources/skills.js +0 -247
- package/dist/lib/resources/subagents.d.ts +0 -46
- package/dist/lib/resources/subagents.js +0 -202
- /package/dist/lib/{feed.d.ts → feed/feed.d.ts} +0 -0
|
@@ -2,7 +2,7 @@ import type { CloudTaskStatus } from '../cloud/types.js';
|
|
|
2
2
|
import { type PidSessionEntry } from './pid-registry.js';
|
|
3
3
|
import { type HookSessionIndex } from './hook-sessions.js';
|
|
4
4
|
import { type SessionState, type SessionActivity, type AwaitingReason, type StructuredQuestion, type TodoProgress, type DetectedPr, type DetectedWorktree, type DetectedTicket } from './state.js';
|
|
5
|
-
import { type SessionAgentId, type SessionAttachment } from './types.js';
|
|
5
|
+
import { type SessionAgentId, type SessionAttachment, type SessionMeta } from './types.js';
|
|
6
6
|
import { type SessionProvenance } from './provenance.js';
|
|
7
7
|
import { type DeviceRegistry } from '../devices/registry.js';
|
|
8
8
|
import { type Presence } from './detached.js';
|
|
@@ -60,6 +60,19 @@ export declare function attributedSetLostPids(prev: Set<number>, next: Set<numbe
|
|
|
60
60
|
*/
|
|
61
61
|
export declare function filterCachedUnattributed(sessions: ActiveSession[], attributed: Set<number>, alive: (pid: number, startedAtMs?: number) => boolean): ActiveSession[];
|
|
62
62
|
export type ActiveContext = 'terminal' | 'teams' | 'cloud' | 'headless';
|
|
63
|
+
/** The SessionMeta fields the live-row backfill reads — the enrichment a running process cannot report. */
|
|
64
|
+
export type BackfillMeta = Pick<SessionMeta, 'version' | 'timestamp' | 'label' | 'ticketId' | 'prUrl' | 'prNumber' | 'origin' | 'routineName'>;
|
|
65
|
+
export declare function backfillActiveRowsFromMeta(sessions: ActiveSession[], metaById: Map<string, BackfillMeta>): void;
|
|
66
|
+
export declare function backfillActiveRowsFromIndex(sessions: ActiveSession[]): void;
|
|
67
|
+
export declare function isRunningLiveSession(s: ActiveSession): boolean;
|
|
68
|
+
export declare function activeSessionProjectKey(s: Pick<ActiveSession, 'cwd' | 'context'>): string;
|
|
69
|
+
export declare function serializeActiveSessionsForJson(sessions: ActiveSession[]): Array<Omit<ActiveSession, 'viewingIn'> & {
|
|
70
|
+
ticketId: string | null;
|
|
71
|
+
project: string;
|
|
72
|
+
prLink: string | null;
|
|
73
|
+
viewingIn: string | null;
|
|
74
|
+
}>;
|
|
75
|
+
export declare function serializeSessionsJson(sessions: SessionMeta[]): string;
|
|
63
76
|
/**
|
|
64
77
|
* Every status here is COMPUTED by the framework from observable signals — PID
|
|
65
78
|
* liveness and transcript last-write (mtime) — never self-reported by the agent.
|
|
@@ -307,7 +320,7 @@ export interface ActiveSession {
|
|
|
307
320
|
* registry. This is the one identifier that survives an SSH hop AND a session
|
|
308
321
|
* rotation: a Factory tab offloaded to a device has no local process to inspect,
|
|
309
322
|
* and its spawn-time session id goes stale the moment the agent moves to another
|
|
310
|
-
* session (`/clear`, exit-and-rerun), so `--active --
|
|
323
|
+
* session (`/clear`, exit-and-rerun), so `--active --device <device>` joined on
|
|
311
324
|
* this is how that tab re-identifies its own session. Absent for any launch that
|
|
312
325
|
* did not inherit a terminal id.
|
|
313
326
|
*/
|
|
@@ -334,6 +347,18 @@ export interface ActiveQueryOptions {
|
|
|
334
347
|
*/
|
|
335
348
|
localOnly?: boolean;
|
|
336
349
|
}
|
|
350
|
+
/**
|
|
351
|
+
* Thrown by {@link listTmuxAgentSessions} when the socket exists (a server has
|
|
352
|
+
* run) but tmux could not be asked for its truth — spawn failure, timeout, or a
|
|
353
|
+
* nonzero exit. Distinct from a missing socket, which means no server ever ran
|
|
354
|
+
* and is genuinely empty, not degraded. `getActiveSessions` still swallows this
|
|
355
|
+
* to `[]` so its return type stays a plain session array, but
|
|
356
|
+
* {@link describeActiveDiscoveryHealth} re-probes and surfaces it so the empty
|
|
357
|
+
* case a real fleet sweep found (RUSH-2507) reads differently from a clean one.
|
|
358
|
+
*/
|
|
359
|
+
export declare class TmuxDiscoveryDegradedError extends Error {
|
|
360
|
+
constructor(message: string);
|
|
361
|
+
}
|
|
337
362
|
/**
|
|
338
363
|
* A live process can only borrow an indexed session file if that transcript
|
|
339
364
|
* has been touched recently enough to plausibly belong to the process. This is
|
|
@@ -465,12 +490,24 @@ export declare function resolveFallbackStatus(sessionFile: string | undefined, p
|
|
|
465
490
|
* (+ optional session uuid), so they resolve straight off disk. Every OTHER
|
|
466
491
|
* tracked harness — Codex (date-partitioned), plus grok / droid / rush / gemini /
|
|
467
492
|
* kimi / hermes / opencode / antigravity / cursor (per-session dirs, SQLite, single-JSON)
|
|
468
|
-
* — is resolved through the session index
|
|
469
|
-
*
|
|
470
|
-
*
|
|
471
|
-
*
|
|
493
|
+
* — is resolved through the session index. When the session id is KNOWN, that id
|
|
494
|
+
* selects the transcript. Only an id-less process falls back to the newest indexed
|
|
495
|
+
* transcript for that cwd, bounded by ACTIVE_SESSION_STALE_MS so a live pid never
|
|
496
|
+
* borrows a weeks-old transcript. This is what lets a live NON-claude/codex agent
|
|
497
|
+
* get a real status instead of falling through to `unknown` (the file feeds
|
|
472
498
|
* {@link computeLiveSignals}). An opaque kind we don't track still yields undefined
|
|
473
499
|
* here and degrades honestly to a live `running`.
|
|
500
|
+
*
|
|
501
|
+
* The id branch exists because the cwd fallback is only safe when there is nothing
|
|
502
|
+
* better: it answers `WHERE agent = ? AND cwd = ? ORDER BY last_activity DESC LIMIT 1`
|
|
503
|
+
* (`latestSessionFileForCwd`), so with two same-harness agents in ONE cwd — routine on
|
|
504
|
+
* this fleet — every one of them resolves to whichever transcript was touched last.
|
|
505
|
+
* That is the same "one stranger's transcript" hazard the id-less tmux pane already
|
|
506
|
+
* refuses to guess at (see `listTmuxAgentSessions`), and since RUSH-2682 it reaches
|
|
507
|
+
* further than a status badge: the live row now backs `sessions preview <id>`, so the
|
|
508
|
+
* guess renders session B's digest under session A's header and caches it against A.
|
|
509
|
+
* An id we cannot resolve yields undefined — the honest "not indexed here" render —
|
|
510
|
+
* rather than a neighbour's transcript (RUSH-2691).
|
|
474
511
|
*/
|
|
475
512
|
export declare function findSessionFileForKind(kind: string, cwd?: string, sessionId?: string): string | undefined;
|
|
476
513
|
/** Live per-session signals derived from one transcript-tail read. */
|
|
@@ -641,6 +678,21 @@ export declare function listTmuxAgentSessions(): Promise<ActiveSession[]>;
|
|
|
641
678
|
* terminal/headless row for the same session id.
|
|
642
679
|
*/
|
|
643
680
|
export declare function getActiveSessions(opts?: ActiveQueryOptions): Promise<ActiveSession[]>;
|
|
681
|
+
/** Local discovery sources probed by {@link describeActiveDiscoveryHealth}. */
|
|
682
|
+
export interface ActiveDiscoveryHealth {
|
|
683
|
+
/** Sources that failed on the probe (currently only `'tmux'`). Empty = nothing degraded locally. */
|
|
684
|
+
degradedSources: string[];
|
|
685
|
+
}
|
|
686
|
+
/**
|
|
687
|
+
* Cheap post-hoc health probe for the local discovery sources. `getActiveSessions`
|
|
688
|
+
* always swallows a source failure to `[]` so its return type stays a plain
|
|
689
|
+
* session array — this re-probes the same sources and reports which ones threw,
|
|
690
|
+
* so a caller that got an empty list back can tell "genuinely nothing running"
|
|
691
|
+
* apart from "a source errored and got silently folded into empty" (RUSH-2507).
|
|
692
|
+
* Intended for the empty-result branch only, not the hot path — it repeats a
|
|
693
|
+
* `list-panes` call `getActiveSessions` already made.
|
|
694
|
+
*/
|
|
695
|
+
export declare function describeActiveDiscoveryHealth(): Promise<ActiveDiscoveryHealth>;
|
|
644
696
|
/**
|
|
645
697
|
* True when a live agent process on this host carries `--session-id <id>` in
|
|
646
698
|
* its argv. RUSH-2384 last-resort for `agents message`: getActiveSessions can
|
|
@@ -707,7 +759,7 @@ export declare function foldTmuxClients(rows: ActiveSession[]): Promise<void>;
|
|
|
707
759
|
* `registerInteractiveHostSession` write the index row with
|
|
708
760
|
* `machine: normalizeHost(task.host)` (`lib/hosts/session-index.ts:55,134`), so
|
|
709
761
|
* this folds that recorded machine back onto the live row. Every consumer then
|
|
710
|
-
* agrees on one owner: the `--
|
|
762
|
+
* agrees on one owner: the `--device`/`--device` scope, the browser's device
|
|
711
763
|
* filter, `_remote`/preview routing (`liveSessionToMeta`), and the id resolver.
|
|
712
764
|
*
|
|
713
765
|
* Two rows are deliberately left alone:
|
|
@@ -29,7 +29,7 @@ import { readSessionActorRecord, writeSessionAliasRecord } from './actor-sidecar
|
|
|
29
29
|
import { loadHookSessionIndex, resolveHookSessionRecord, readStateSessionRecord } from './hook-sessions.js';
|
|
30
30
|
import { buildClaudeLabelMap, getAgentSessionDirs } from './discover.js';
|
|
31
31
|
import { buildRunNameMap } from './run-names.js';
|
|
32
|
-
import { latestSessionFileForCwd, findSessionsByShortIds, findSessionMachinesByIds } from './db.js';
|
|
32
|
+
import { latestSessionFileForCwd, findSessionsByShortIds, findSessionMachinesByIds, getSessionById } from './db.js';
|
|
33
33
|
import { extractSessionTopic } from './prompt.js';
|
|
34
34
|
import { readSessionTailWithRaw } from './tail.js';
|
|
35
35
|
import { parseSession } from './parse.js';
|
|
@@ -43,6 +43,8 @@ import { machineId, normalizeHost } from '../machine-id.js';
|
|
|
43
43
|
import { presenceFromStore } from './detached.js';
|
|
44
44
|
import { classifyHostLink, HOST_HEARTBEAT_STALE_MS } from './host-link.js';
|
|
45
45
|
import { mapBounded } from '../concurrency.js';
|
|
46
|
+
import { linearIssueUrl } from './linear.js';
|
|
47
|
+
import { viewingInLabel } from './viewing-in.js';
|
|
46
48
|
const execFileAsync = promisify(execFile);
|
|
47
49
|
/**
|
|
48
50
|
* The owner (actor id) to show for a session in `--active`. Prefers the actor
|
|
@@ -140,6 +142,79 @@ export function filterCachedUnattributed(sessions, attributed, alive) {
|
|
|
140
142
|
return alive(s.pid, s.startedAtMs);
|
|
141
143
|
});
|
|
142
144
|
}
|
|
145
|
+
export function backfillActiveRowsFromMeta(sessions, metaById) {
|
|
146
|
+
for (const s of sessions) {
|
|
147
|
+
if (!s.sessionId)
|
|
148
|
+
continue;
|
|
149
|
+
const m = metaById.get(s.sessionId);
|
|
150
|
+
if (!m)
|
|
151
|
+
continue;
|
|
152
|
+
if (!s.version && m.version)
|
|
153
|
+
s.version = m.version;
|
|
154
|
+
if (!s.label && m.label)
|
|
155
|
+
s.label = m.label;
|
|
156
|
+
if (!s.ticket && m.ticketId)
|
|
157
|
+
s.ticket = { id: m.ticketId, url: linearIssueUrl(m.ticketId) };
|
|
158
|
+
if (!s.pr && m.prUrl)
|
|
159
|
+
s.pr = { url: m.prUrl, number: m.prNumber };
|
|
160
|
+
if (!s.startedAtMs && m.timestamp) {
|
|
161
|
+
const ts = new Date(m.timestamp).getTime();
|
|
162
|
+
if (!Number.isNaN(ts))
|
|
163
|
+
s.startedAtMs = ts;
|
|
164
|
+
}
|
|
165
|
+
if (!s.origin && m.origin)
|
|
166
|
+
s.origin = m.origin;
|
|
167
|
+
if (!s.routineName && m.routineName)
|
|
168
|
+
s.routineName = m.routineName;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
function loadBackfillMetaFor(sessions) {
|
|
172
|
+
const byId = new Map();
|
|
173
|
+
try {
|
|
174
|
+
for (const s of sessions) {
|
|
175
|
+
if (!s.sessionId || byId.has(s.sessionId))
|
|
176
|
+
continue;
|
|
177
|
+
const m = getSessionById(s.sessionId);
|
|
178
|
+
if (m)
|
|
179
|
+
byId.set(s.sessionId, m);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
/* enrichment is best-effort — an unavailable DB leaves rows un-backfilled */
|
|
184
|
+
}
|
|
185
|
+
return byId;
|
|
186
|
+
}
|
|
187
|
+
export function backfillActiveRowsFromIndex(sessions) {
|
|
188
|
+
backfillActiveRowsFromMeta(sessions, loadBackfillMetaFor(sessions));
|
|
189
|
+
}
|
|
190
|
+
export function isRunningLiveSession(s) {
|
|
191
|
+
if (s.status === 'queued' || s.status === 'closed' || s.status === 'crashed')
|
|
192
|
+
return false;
|
|
193
|
+
if (s.context === 'cloud')
|
|
194
|
+
return Boolean(s.cloudProvider) && Boolean(s.cloudTaskId);
|
|
195
|
+
return Boolean(s.machine) && typeof s.pid === 'number' && s.pid > 0 && s.pidAlive === true;
|
|
196
|
+
}
|
|
197
|
+
export function activeSessionProjectKey(s) {
|
|
198
|
+
if (s.cwd)
|
|
199
|
+
return path.basename(s.cwd);
|
|
200
|
+
return s.context === 'cloud' ? 'cloud' : 'other';
|
|
201
|
+
}
|
|
202
|
+
export function serializeActiveSessionsForJson(sessions) {
|
|
203
|
+
return sessions.map((s) => ({
|
|
204
|
+
...s,
|
|
205
|
+
ticketId: s.ticket?.id ?? null,
|
|
206
|
+
project: activeSessionProjectKey(s),
|
|
207
|
+
prLink: s.pr?.url ?? null,
|
|
208
|
+
viewingIn: viewingInLabel(s) ?? null,
|
|
209
|
+
}));
|
|
210
|
+
}
|
|
211
|
+
export function serializeSessionsJson(sessions) {
|
|
212
|
+
const serializable = sessions.map((s) => {
|
|
213
|
+
const { _matchedTerms, _bm25Score, _remote, ...rest } = s;
|
|
214
|
+
return rest;
|
|
215
|
+
});
|
|
216
|
+
return JSON.stringify(serializable, null, 2) + '\n';
|
|
217
|
+
}
|
|
143
218
|
export function activeStatusFromCloudStatus(status) {
|
|
144
219
|
switch (status) {
|
|
145
220
|
case 'running':
|
|
@@ -162,9 +237,24 @@ const ACTIVE_MTIME_WINDOW_MS = 2 * 60_000;
|
|
|
162
237
|
/**
|
|
163
238
|
* Bound on the tmux `list-panes` call in {@link listTmuxAgentSessions}. A wedged
|
|
164
239
|
* tmux server would otherwise hang the whole `--active` scan (the other sources
|
|
165
|
-
* can't run past it); on timeout the tmux source
|
|
240
|
+
* can't run past it); on timeout the tmux source throws {@link TmuxDiscoveryDegradedError}.
|
|
166
241
|
*/
|
|
167
242
|
const TMUX_LIST_PANES_TIMEOUT_MS = 5_000;
|
|
243
|
+
/**
|
|
244
|
+
* Thrown by {@link listTmuxAgentSessions} when the socket exists (a server has
|
|
245
|
+
* run) but tmux could not be asked for its truth — spawn failure, timeout, or a
|
|
246
|
+
* nonzero exit. Distinct from a missing socket, which means no server ever ran
|
|
247
|
+
* and is genuinely empty, not degraded. `getActiveSessions` still swallows this
|
|
248
|
+
* to `[]` so its return type stays a plain session array, but
|
|
249
|
+
* {@link describeActiveDiscoveryHealth} re-probes and surfaces it so the empty
|
|
250
|
+
* case a real fleet sweep found (RUSH-2507) reads differently from a clean one.
|
|
251
|
+
*/
|
|
252
|
+
export class TmuxDiscoveryDegradedError extends Error {
|
|
253
|
+
constructor(message) {
|
|
254
|
+
super(message);
|
|
255
|
+
this.name = 'TmuxDiscoveryDegradedError';
|
|
256
|
+
}
|
|
257
|
+
}
|
|
168
258
|
/**
|
|
169
259
|
* A live process can only borrow an indexed session file if that transcript
|
|
170
260
|
* has been touched recently enough to plausibly belong to the process. This is
|
|
@@ -621,22 +711,47 @@ export function resolveFallbackStatus(sessionFile, pidAlive, nowMs = Date.now())
|
|
|
621
711
|
* (+ optional session uuid), so they resolve straight off disk. Every OTHER
|
|
622
712
|
* tracked harness — Codex (date-partitioned), plus grok / droid / rush / gemini /
|
|
623
713
|
* kimi / hermes / opencode / antigravity / cursor (per-session dirs, SQLite, single-JSON)
|
|
624
|
-
* — is resolved through the session index
|
|
625
|
-
*
|
|
626
|
-
*
|
|
627
|
-
*
|
|
714
|
+
* — is resolved through the session index. When the session id is KNOWN, that id
|
|
715
|
+
* selects the transcript. Only an id-less process falls back to the newest indexed
|
|
716
|
+
* transcript for that cwd, bounded by ACTIVE_SESSION_STALE_MS so a live pid never
|
|
717
|
+
* borrows a weeks-old transcript. This is what lets a live NON-claude/codex agent
|
|
718
|
+
* get a real status instead of falling through to `unknown` (the file feeds
|
|
628
719
|
* {@link computeLiveSignals}). An opaque kind we don't track still yields undefined
|
|
629
720
|
* here and degrades honestly to a live `running`.
|
|
721
|
+
*
|
|
722
|
+
* The id branch exists because the cwd fallback is only safe when there is nothing
|
|
723
|
+
* better: it answers `WHERE agent = ? AND cwd = ? ORDER BY last_activity DESC LIMIT 1`
|
|
724
|
+
* (`latestSessionFileForCwd`), so with two same-harness agents in ONE cwd — routine on
|
|
725
|
+
* this fleet — every one of them resolves to whichever transcript was touched last.
|
|
726
|
+
* That is the same "one stranger's transcript" hazard the id-less tmux pane already
|
|
727
|
+
* refuses to guess at (see `listTmuxAgentSessions`), and since RUSH-2682 it reaches
|
|
728
|
+
* further than a status badge: the live row now backs `sessions preview <id>`, so the
|
|
729
|
+
* guess renders session B's digest under session A's header and caches it against A.
|
|
730
|
+
* An id we cannot resolve yields undefined — the honest "not indexed here" render —
|
|
731
|
+
* rather than a neighbour's transcript (RUSH-2691).
|
|
630
732
|
*/
|
|
631
733
|
export function findSessionFileForKind(kind, cwd, sessionId) {
|
|
632
734
|
if (!cwd)
|
|
633
735
|
return undefined;
|
|
634
736
|
if (kind === 'claude')
|
|
635
737
|
return findClaudeSessionFile(cwd, sessionId);
|
|
636
|
-
if (isSessionTrackedAgent(kind))
|
|
637
|
-
return
|
|
638
|
-
|
|
639
|
-
|
|
738
|
+
if (!isSessionTrackedAgent(kind))
|
|
739
|
+
return undefined;
|
|
740
|
+
if (sessionId)
|
|
741
|
+
return indexedSessionFileForId(kind, sessionId);
|
|
742
|
+
return latestSessionFileForCwd(kind, cwd, { maxAgeMs: ACTIVE_SESSION_STALE_MS });
|
|
743
|
+
}
|
|
744
|
+
/**
|
|
745
|
+
* The indexed transcript for one exact session id, or undefined when the index has
|
|
746
|
+
* not reached it yet. The `agent` guard rejects a row that belongs to a different
|
|
747
|
+
* harness than the live process claims: those cannot be the same conversation, and
|
|
748
|
+
* returning it would reintroduce the misattribution this function exists to avoid.
|
|
749
|
+
*/
|
|
750
|
+
function indexedSessionFileForId(kind, sessionId) {
|
|
751
|
+
const row = getSessionById(sessionId);
|
|
752
|
+
if (!row || row.agent !== kind)
|
|
753
|
+
return undefined;
|
|
754
|
+
return row.filePath || undefined;
|
|
640
755
|
}
|
|
641
756
|
/** Recover the session UUID from a transcript filename (Claude `<uuid>.jsonl`, Codex `rollout-…-<uuid>.jsonl`). */
|
|
642
757
|
const UUID_RE = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/i;
|
|
@@ -1540,6 +1655,9 @@ export async function listTmuxAgentSessions() {
|
|
|
1540
1655
|
const { readSessionMeta } = await import('../tmux/session.js');
|
|
1541
1656
|
const { runTmux } = await import('../tmux/binary.js');
|
|
1542
1657
|
const socket = getDefaultSocketPath();
|
|
1658
|
+
// No server has ever run on this socket — genuinely nothing to report, not
|
|
1659
|
+
// a degraded read. Distinct from the throws below, which mean tmux truth
|
|
1660
|
+
// exists but could not be read (RUSH-2507).
|
|
1543
1661
|
if (!fs.existsSync(socket))
|
|
1544
1662
|
return [];
|
|
1545
1663
|
let res;
|
|
@@ -1549,16 +1667,19 @@ export async function listTmuxAgentSessions() {
|
|
|
1549
1667
|
args: ['list-panes', '-a', '-F', ['#{pane_id}', '#{session_name}', '#{pane_pid}', '#{pane_dead}', '#{pane_current_path}'].join(TMUX_FIELD_SEP)],
|
|
1550
1668
|
throwOnError: false,
|
|
1551
1669
|
// A wedged tmux server must not hang the whole active-session scan. The
|
|
1552
|
-
// catch below turns a timeout into
|
|
1553
|
-
// still report) rather than a frozen `agents sessions
|
|
1670
|
+
// catch below turns a timeout into a DEGRADED-tmux-source signal (the
|
|
1671
|
+
// other sources still report) rather than a frozen `agents sessions
|
|
1672
|
+
// --active` — and, crucially, no longer collapses into the same silent
|
|
1673
|
+
// `[]` a genuinely-idle socket returns (RUSH-2507).
|
|
1554
1674
|
timeoutMs: TMUX_LIST_PANES_TIMEOUT_MS,
|
|
1555
1675
|
});
|
|
1556
1676
|
}
|
|
1557
|
-
catch {
|
|
1558
|
-
|
|
1677
|
+
catch (err) {
|
|
1678
|
+
throw new TmuxDiscoveryDegradedError(`tmux list-panes on ${socket} did not answer: ${err instanceof Error ? err.message : String(err)}`);
|
|
1679
|
+
}
|
|
1680
|
+
if (res.code !== 0) {
|
|
1681
|
+
throw new TmuxDiscoveryDegradedError(`tmux list-panes on ${socket} exited ${res.code}: ${res.stderr.trim() || res.stdout.trim()}`);
|
|
1559
1682
|
}
|
|
1560
|
-
if (res.code !== 0)
|
|
1561
|
-
return [];
|
|
1562
1683
|
// Index live launches by the pane they target, so a pane we did NOT wrap (a
|
|
1563
1684
|
// split) resolves to its own agent. Newest launch wins a pane (pid reuse), and
|
|
1564
1685
|
// only live pids count — a dead agent's stale entry can't light up its old pane.
|
|
@@ -1716,6 +1837,26 @@ export async function getActiveSessions(opts = {}) {
|
|
|
1716
1837
|
annotateOrchestratorLabels(merged);
|
|
1717
1838
|
return merged;
|
|
1718
1839
|
}
|
|
1840
|
+
/**
|
|
1841
|
+
* Cheap post-hoc health probe for the local discovery sources. `getActiveSessions`
|
|
1842
|
+
* always swallows a source failure to `[]` so its return type stays a plain
|
|
1843
|
+
* session array — this re-probes the same sources and reports which ones threw,
|
|
1844
|
+
* so a caller that got an empty list back can tell "genuinely nothing running"
|
|
1845
|
+
* apart from "a source errored and got silently folded into empty" (RUSH-2507).
|
|
1846
|
+
* Intended for the empty-result branch only, not the hot path — it repeats a
|
|
1847
|
+
* `list-panes` call `getActiveSessions` already made.
|
|
1848
|
+
*/
|
|
1849
|
+
export async function describeActiveDiscoveryHealth() {
|
|
1850
|
+
const degradedSources = [];
|
|
1851
|
+
try {
|
|
1852
|
+
await listTmuxAgentSessions();
|
|
1853
|
+
}
|
|
1854
|
+
catch (err) {
|
|
1855
|
+
if (err instanceof TmuxDiscoveryDegradedError)
|
|
1856
|
+
degradedSources.push('tmux');
|
|
1857
|
+
}
|
|
1858
|
+
return { degradedSources };
|
|
1859
|
+
}
|
|
1719
1860
|
/**
|
|
1720
1861
|
* True when a live agent process on this host carries `--session-id <id>` in
|
|
1721
1862
|
* its argv. RUSH-2384 last-resort for `agents message`: getActiveSessions can
|
|
@@ -1826,7 +1967,7 @@ export async function foldTmuxClients(rows) {
|
|
|
1826
1967
|
* `registerInteractiveHostSession` write the index row with
|
|
1827
1968
|
* `machine: normalizeHost(task.host)` (`lib/hosts/session-index.ts:55,134`), so
|
|
1828
1969
|
* this folds that recorded machine back onto the live row. Every consumer then
|
|
1829
|
-
* agrees on one owner: the `--
|
|
1970
|
+
* agrees on one owner: the `--device`/`--device` scope, the browser's device
|
|
1830
1971
|
* filter, `_remote`/preview routing (`liveSessionToMeta`), and the id resolver.
|
|
1831
1972
|
*
|
|
1832
1973
|
* Two rows are deliberately left alone:
|
|
@@ -140,7 +140,7 @@ const VALUE_FLAGS = {
|
|
|
140
140
|
// (`agents sessions`, `linear list`) instead of one flat `other` pile (#1830).
|
|
141
141
|
// `ag` is deliberately NOT here — it is the silver searcher in TOOL_REGISTRY,
|
|
142
142
|
// not the agents alias, in this classifier's world.
|
|
143
|
-
agents: new Set(['-
|
|
143
|
+
agents: new Set(['-D', '--device']),
|
|
144
144
|
linear: new Set(),
|
|
145
145
|
};
|
|
146
146
|
/**
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
*
|
|
56
56
|
* Until that lands, a non-Claude session has a NULL `account_key` and rolls up under
|
|
57
57
|
* `unattributed:<agent>` — named after its harness rather than implying we tried and
|
|
58
|
-
* failed. `--by account` on `agents cost` / `agents output` therefore reports Claude
|
|
58
|
+
* failed. `--by account` on `agents insights cost` / `agents insights output` therefore reports Claude
|
|
59
59
|
* accounts plus one bucket per other harness.
|
|
60
60
|
*/
|
|
61
61
|
/** The account a transcript is attributed to. */
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
*
|
|
56
56
|
* Until that lands, a non-Claude session has a NULL `account_key` and rolls up under
|
|
57
57
|
* `unattributed:<agent>` — named after its harness rather than implying we tried and
|
|
58
|
-
* failed. `--by account` on `agents cost` / `agents output` therefore reports Claude
|
|
58
|
+
* failed. `--by account` on `agents insights cost` / `agents insights output` therefore reports Claude
|
|
59
59
|
* accounts plus one bucket per other harness.
|
|
60
60
|
*/
|
|
61
61
|
import * as os from 'os';
|
package/dist/lib/session/db.d.ts
CHANGED
|
@@ -192,6 +192,14 @@ export declare function maintainSessionSearchIndex(db?: Database.Database, optio
|
|
|
192
192
|
* mode can return SQLITE_BUSY_SNAPSHOT which bypasses the busy handler.
|
|
193
193
|
*/
|
|
194
194
|
export declare function tryClaimScan(pid: number): boolean;
|
|
195
|
+
/**
|
|
196
|
+
* Read-only probe: is a scan in progress right now, held by a LIVE process
|
|
197
|
+
* within the TTL? (RUSH-2682). Unlike {@link tryClaimScan} it never writes, so a
|
|
198
|
+
* caller that lost the claim can wait for the in-flight scan to finish rather
|
|
199
|
+
* than returning the pre-scan DB snapshot as if it were the answer. Returns
|
|
200
|
+
* false for a dead-PID or expired claim — that scan is not actually running.
|
|
201
|
+
*/
|
|
202
|
+
export declare function scanInProgressByLivePid(): boolean;
|
|
195
203
|
/**
|
|
196
204
|
* Release the scan claim written by tryClaimScan. Only deletes the entry
|
|
197
205
|
* if it still belongs to this process (guards against TTL takeovers).
|
|
@@ -354,7 +362,7 @@ export interface UsageRollupRow {
|
|
|
354
362
|
costUsd: number;
|
|
355
363
|
/**
|
|
356
364
|
* USD cost priced as if caching were off (cache read/write at the input rate),
|
|
357
|
-
* summed from `cost_usd_nocache`. Backs `agents output --pricing no-cache`.
|
|
365
|
+
* summed from `cost_usd_nocache`. Backs `agents insights output --pricing no-cache`.
|
|
358
366
|
* Equals `costUsd` for rows whose sessions record no cache split (RUSH-2287).
|
|
359
367
|
*/
|
|
360
368
|
costUsdNoCache: number;
|
|
@@ -472,7 +480,7 @@ export declare function queryAffinityRollup(options: {
|
|
|
472
480
|
/**
|
|
473
481
|
* Aggregate cost / duration / tokens across sessions, grouped by agent,
|
|
474
482
|
* project, or calendar day. Honors the same filter shape as querySessions
|
|
475
|
-
* (agent, since/until, team-origin) so `agents cost --since 7d --by day`
|
|
483
|
+
* (agent, since/until, team-origin) so `agents insights cost --since 7d --by day`
|
|
476
484
|
* lines up with what `agents sessions` would list. Ordered by cost desc.
|
|
477
485
|
*/
|
|
478
486
|
export declare function queryUsageRollup(options: QueryOptions & {
|
package/dist/lib/session/db.js
CHANGED
|
@@ -12,7 +12,7 @@ import Database from '../sqlite.js';
|
|
|
12
12
|
import { parseSession, sessionFilePathContainer } from './parse.js';
|
|
13
13
|
import { extractRecentDirectoriesTouched, extractTodoProgressFromEvents } from './state.js';
|
|
14
14
|
import { getSessionsDir, getSessionsDbPath } from '../state.js';
|
|
15
|
-
import { query as queryEvents, queryToolUsageForSessions } from '../events.js';
|
|
15
|
+
import { query as queryEvents, queryToolUsageForSessions } from '../feed/events.js';
|
|
16
16
|
import { machineForSessionFile } from './origin-machine.js';
|
|
17
17
|
import { loadSessionActorIndex, readSessionActorRecord } from './actor-sidecar.js';
|
|
18
18
|
import { toolCallsFromEvents } from './tool-calls.js';
|
|
@@ -20,7 +20,7 @@ import { persistToolCalls, toolEvidenceSourcePath } from './tool-store.js';
|
|
|
20
20
|
import { buildClaudeAccountIndex, resolveClaudeAccount } from './claude-accounts.js';
|
|
21
21
|
import { extractSkills, extractSlashCommands } from './highlights.js';
|
|
22
22
|
import { resolveResource } from '../resources.js';
|
|
23
|
-
import { discoverPlugins } from '../plugins.js';
|
|
23
|
+
import { discoverPlugins } from '../plugins/plugins.js';
|
|
24
24
|
import { machineId } from '../machine-id.js';
|
|
25
25
|
const SESSIONS_DIR = getSessionsDir();
|
|
26
26
|
const DB_PATH = getSessionsDbPath();
|
|
@@ -528,7 +528,7 @@ function migrateSchema(db, fromVersion) {
|
|
|
528
528
|
// v11 → v12: `output_tokens` — the real generated-token count, kept separate
|
|
529
529
|
// from `token_count` (which sums cache-read/-write and so is dominated by
|
|
530
530
|
// cheap re-counted context). This is the honest "output" metric powering
|
|
531
|
-
// `agents output`. Additive column; rescan to backfill from transcripts.
|
|
531
|
+
// `agents insights output`. Additive column; rescan to backfill from transcripts.
|
|
532
532
|
const cols = db.prepare(`PRAGMA table_info(sessions)`).all();
|
|
533
533
|
if (!cols.some(c => c.name === 'output_tokens'))
|
|
534
534
|
db.exec(`ALTER TABLE sessions ADD COLUMN output_tokens INTEGER`);
|
|
@@ -966,12 +966,12 @@ function migrateSchema(db, fromVersion) {
|
|
|
966
966
|
}
|
|
967
967
|
if (fromVersion < 37) {
|
|
968
968
|
// v36 -> v37: persist the burn SPLIT (uncached input / cache-read /
|
|
969
|
-
// cache-write) and a second "no-cache" cost per session, so `agents output`
|
|
969
|
+
// cache-write) and a second "no-cache" cost per session, so `agents insights output`
|
|
970
970
|
// can report the token split and a --pricing no-cache scenario (RUSH-2287).
|
|
971
971
|
// These are new nullable columns — do NOT flush scan_ledger (adding a column
|
|
972
972
|
// must keep warm session ledgers warm, the contract the v33->v34 note above
|
|
973
973
|
// states). Pre-upgrade rows stay NULL for the split until their transcript is
|
|
974
|
-
// re-scanned; `agents output` reports the split only where it is present, so
|
|
974
|
+
// re-scanned; `agents insights output` reports the split only where it is present, so
|
|
975
975
|
// an absent split reads as "not available for this session", never as zero.
|
|
976
976
|
const cols = new Set(db.prepare(`PRAGMA table_info(sessions)`).all().map((c) => c.name));
|
|
977
977
|
if (!cols.has('input_tokens'))
|
|
@@ -1309,6 +1309,25 @@ export function tryClaimScan(pid) {
|
|
|
1309
1309
|
});
|
|
1310
1310
|
return txn();
|
|
1311
1311
|
}
|
|
1312
|
+
/**
|
|
1313
|
+
* Read-only probe: is a scan in progress right now, held by a LIVE process
|
|
1314
|
+
* within the TTL? (RUSH-2682). Unlike {@link tryClaimScan} it never writes, so a
|
|
1315
|
+
* caller that lost the claim can wait for the in-flight scan to finish rather
|
|
1316
|
+
* than returning the pre-scan DB snapshot as if it were the answer. Returns
|
|
1317
|
+
* false for a dead-PID or expired claim — that scan is not actually running.
|
|
1318
|
+
*/
|
|
1319
|
+
export function scanInProgressByLivePid() {
|
|
1320
|
+
const db = getDB();
|
|
1321
|
+
const existing = db
|
|
1322
|
+
.prepare(`SELECT value FROM meta WHERE key = 'scan_in_progress'`)
|
|
1323
|
+
.get();
|
|
1324
|
+
if (!existing)
|
|
1325
|
+
return false;
|
|
1326
|
+
const parts = existing.value.split(':');
|
|
1327
|
+
const pid = parseInt(parts[0], 10);
|
|
1328
|
+
const ts = parseInt(parts[1], 10);
|
|
1329
|
+
return isProcessAlive(pid) && Date.now() - ts < SCAN_CLAIM_TTL_MS;
|
|
1330
|
+
}
|
|
1312
1331
|
/**
|
|
1313
1332
|
* Release the scan claim written by tryClaimScan. Only deletes the entry
|
|
1314
1333
|
* if it still belongs to this process (guards against TTL takeovers).
|
|
@@ -2807,7 +2826,7 @@ export function queryAffinityRollup(options) {
|
|
|
2807
2826
|
/**
|
|
2808
2827
|
* Aggregate cost / duration / tokens across sessions, grouped by agent,
|
|
2809
2828
|
* project, or calendar day. Honors the same filter shape as querySessions
|
|
2810
|
-
* (agent, since/until, team-origin) so `agents cost --since 7d --by day`
|
|
2829
|
+
* (agent, since/until, team-origin) so `agents insights cost --since 7d --by day`
|
|
2811
2830
|
* lines up with what `agents sessions` would list. Ordered by cost desc.
|
|
2812
2831
|
*/
|
|
2813
2832
|
export function queryUsageRollup(options) {
|
|
@@ -52,6 +52,19 @@ export interface DiscoverOptions {
|
|
|
52
52
|
skill?: string;
|
|
53
53
|
/** Only sessions that used a skill/command owned by this plugin (#12) — see QueryOptions.plugin. */
|
|
54
54
|
plugin?: string;
|
|
55
|
+
/** Exact session id — a targeted indexed lookup with no scan (RUSH-2477). */
|
|
56
|
+
idExact?: string;
|
|
57
|
+
/** Session id prefix — a targeted indexed lookup with no scan (RUSH-2477). */
|
|
58
|
+
idPrefix?: string;
|
|
59
|
+
/**
|
|
60
|
+
* Cold-miss repair: when another live process already holds the scan claim,
|
|
61
|
+
* wait (bounded) for that in-flight scan to finish before reading the index,
|
|
62
|
+
* instead of returning the pre-scan snapshot (RUSH-2682). A caller repairing a
|
|
63
|
+
* "not indexed yet" miss wants the fresh result the concurrent scan is about to
|
|
64
|
+
* write, not the stale read that just missed. Ignored when THIS process wins
|
|
65
|
+
* the claim (it scans itself) or no scan is in progress.
|
|
66
|
+
*/
|
|
67
|
+
waitForScan?: boolean;
|
|
55
68
|
}
|
|
56
69
|
/** Progress report emitted during incremental scanning. */
|
|
57
70
|
export interface ScanProgress {
|
|
@@ -158,11 +171,75 @@ interface CodexSessionScan {
|
|
|
158
171
|
* TTL, no external lock files needed.
|
|
159
172
|
*/
|
|
160
173
|
export declare function discoverSessions(options?: DiscoverOptions): Promise<SessionMeta[]>;
|
|
174
|
+
/** What one incremental scan actually did. */
|
|
175
|
+
export interface IncrementalScanResult {
|
|
176
|
+
/** True when this process won the single-flight claim and ran the scan. */
|
|
177
|
+
claimed: boolean;
|
|
178
|
+
/**
|
|
179
|
+
* Transcripts parsed this scan — i.e. those whose (mtime, size) changed. Zero
|
|
180
|
+
* is the steady state on an idle box and does NOT mean the scan was skipped;
|
|
181
|
+
* read `claimed` for that.
|
|
182
|
+
*
|
|
183
|
+
* Twelve of the 13 SESSION_AGENTS contribute, including OpenCode, whose
|
|
184
|
+
* scanner filters to sessions whose own per-session stamp changed and reports
|
|
185
|
+
* that batch — so a tick whose only changed sessions live there no longer
|
|
186
|
+
* reports 0 (RUSH-2691). OpenClaw is the exception and contributes nothing:
|
|
187
|
+
* its scanner has no change detection to report (a TTL gate, a fresh stamp
|
|
188
|
+
* every run, and an entry list rebuilt as the current inventory), so counting
|
|
189
|
+
* it would overstate rather than measure. See `scanOpenClawIncremental`.
|
|
190
|
+
*/
|
|
191
|
+
scanned: number;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* The write half of {@link discoverSessions}: claim the single-flight scan slot,
|
|
195
|
+
* incrementally index this host's transcript dirs, and report what was parsed.
|
|
196
|
+
*
|
|
197
|
+
* Split out so a caller that only wants the index refreshed — the daemon's warm
|
|
198
|
+
* tick — can run it WITHOUT the listing query `discoverSessions` ends with. That
|
|
199
|
+
* query is not free: it applies a cwd filter, runs the `archived_at`-writing
|
|
200
|
+
* existence check, and can issue a Linear fetch, none of which index anything
|
|
201
|
+
* (RUSH-2691). Keeping one implementation here is also what stops the tick and
|
|
202
|
+
* the foreground path from drifting apart.
|
|
203
|
+
*/
|
|
204
|
+
export declare function scanSessionsIncremental(options?: {
|
|
205
|
+
agent?: SessionAgentId;
|
|
206
|
+
onProgress?: (p: ScanProgress) => void;
|
|
207
|
+
}): Promise<IncrementalScanResult>;
|
|
208
|
+
/**
|
|
209
|
+
* Poll until no live process holds the scan claim, or the bound elapses
|
|
210
|
+
* (RUSH-2682). Bounded so a wedged/slow scan can never hang a foreground preview.
|
|
211
|
+
* Exported for the cold-miss repair test.
|
|
212
|
+
*/
|
|
213
|
+
export declare function waitForScanToSettle(timeoutMs?: number, pollMs?: number): Promise<boolean>;
|
|
161
214
|
/** Read the current SQLite snapshot without scanning or parsing transcript files. */
|
|
162
215
|
export declare function queryIndexedSessions(options?: DiscoverOptions, indexedOptions?: {
|
|
163
216
|
resolveLinear?: boolean;
|
|
164
217
|
skipExistenceCheck?: boolean;
|
|
165
218
|
}): Promise<SessionMeta[]>;
|
|
219
|
+
/**
|
|
220
|
+
* Resolve a full-or-partial session id against the LOCAL SQLite index only.
|
|
221
|
+
*
|
|
222
|
+
* A plain WAL read through `queryIndexedSessions` — same origin-machine
|
|
223
|
+
* attribution and managed scoping every indexed read gets — with NO incremental
|
|
224
|
+
* discovery scan (so none of `tryClaimScan`/`releaseScan`'s `BEGIN IMMEDIATE`
|
|
225
|
+
* writer lock) and NO fleet SSH fan-out. This is the crash-restart storm path
|
|
226
|
+
* (RUSH-2477): dozens of `sessions resume <id>` at once for a known local id must
|
|
227
|
+
* each be a cheap read, never a writer-lock contender or a dial into the
|
|
228
|
+
* not-yet-up tailnet. Exact id first, then prefix (matching `findSessionsById`),
|
|
229
|
+
* so a complete id never also drags in its prefix siblings. Returns `[]` on a
|
|
230
|
+
* genuine local miss, leaving the caller to fall back to the fleet resolver.
|
|
231
|
+
*
|
|
232
|
+
* The existence check is left ON (`skipExistenceCheck: false`), exactly as the old
|
|
233
|
+
* `discoverSessions` path and `findSessionsById` do (RUSH-2436): it KEEPS a
|
|
234
|
+
* file-gone session whose user turns still live in `session_text` (flagged
|
|
235
|
+
* archived) and SUPPRESSES a contentless phantom — so a phantom id misses here and
|
|
236
|
+
* falls through to the fleet resolver, instead of resolving to a row with no real
|
|
237
|
+
* transcript to resume. For a present transcript — the storm's actual case, since
|
|
238
|
+
* the crashed tabs' files are on disk — the check does no writes, so the lock-free
|
|
239
|
+
* guarantee holds; it only writes to (un)archive a genuinely missing or resurrected
|
|
240
|
+
* file, which is not the 20-at-once resume path.
|
|
241
|
+
*/
|
|
242
|
+
export declare function resolveIndexedSessionById(idQuery: string): Promise<SessionMeta[]>;
|
|
166
243
|
/**
|
|
167
244
|
* Drop unmanaged rows for agents that HAVE managed versions.
|
|
168
245
|
*
|