@phnx-labs/agents-cli 1.22.120 → 1.22.121
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 +227 -0
- package/README.md +19 -2
- package/dist/bootstrap.d.ts +0 -15
- package/dist/bootstrap.js +10 -409
- package/dist/cli/command-registry.d.ts +0 -58
- package/dist/cli/command-registry.js +2 -74
- package/dist/commands/accounts.d.ts +0 -17
- package/dist/commands/accounts.js +1 -52
- package/dist/commands/alias.d.ts +0 -12
- package/dist/commands/alias.js +0 -6
- package/dist/commands/apply.d.ts +0 -15
- package/dist/commands/apply.js +0 -63
- package/dist/commands/audit.d.ts +0 -12
- package/dist/commands/audit.js +0 -13
- package/dist/commands/auth.js +4 -12
- package/dist/commands/beta.d.ts +0 -6
- package/dist/commands/beta.js +2 -6
- package/dist/commands/browser-sessions-picker.d.ts +0 -8
- package/dist/commands/browser-sessions-picker.js +0 -26
- package/dist/commands/browser.d.ts +0 -57
- package/dist/commands/browser.js +0 -80
- package/dist/commands/budget.d.ts +0 -13
- package/dist/commands/budget.js +0 -2
- package/dist/commands/cli.d.ts +0 -12
- package/dist/commands/cli.js +0 -4
- package/dist/commands/cloud.d.ts +0 -9
- package/dist/commands/cloud.js +0 -43
- package/dist/commands/commands.d.ts +0 -9
- package/dist/commands/commands.js +0 -18
- package/dist/commands/computer-sessions-picker.d.ts +0 -11
- package/dist/commands/computer-sessions-picker.js +0 -29
- package/dist/commands/computer.d.ts +0 -62
- package/dist/commands/computer.js +3 -114
- package/dist/commands/config.d.ts +0 -14
- package/dist/commands/config.js +21 -60
- package/dist/commands/cost.d.ts +0 -11
- package/dist/commands/cost.js +1 -17
- package/dist/commands/daemon-test-harness.d.ts +0 -32
- package/dist/commands/daemon-test-harness.js +1 -36
- package/dist/commands/daemon.d.ts +0 -46
- package/dist/commands/daemon.js +8 -255
- package/dist/commands/detach-core.d.ts +0 -28
- package/dist/commands/detach-core.js +0 -30
- package/dist/commands/detach.d.ts +1 -12
- package/dist/commands/detach.js +16 -52
- package/dist/commands/device-config-test-harness.js +0 -12
- package/dist/commands/doctor.d.ts +0 -103
- package/dist/commands/doctor.js +3 -279
- package/dist/commands/events.d.ts +0 -29
- package/dist/commands/events.js +1 -55
- package/dist/commands/exec.d.ts +0 -163
- package/dist/commands/exec.js +15 -964
- package/dist/commands/factory.d.ts +0 -6
- package/dist/commands/factory.js +0 -2
- package/dist/commands/feed-watch.js +0 -20
- package/dist/commands/feed.d.ts +0 -38
- package/dist/commands/feed.js +1 -151
- package/dist/commands/feedback.d.ts +0 -5
- package/dist/commands/feedback.js +0 -5
- package/dist/commands/fleet-capture.d.ts +0 -12
- package/dist/commands/fleet-capture.js +1 -39
- package/dist/commands/focus.d.ts +6 -94
- package/dist/commands/focus.js +13 -183
- package/dist/commands/fork.d.ts +0 -21
- package/dist/commands/fork.js +0 -45
- package/dist/commands/funnel.d.ts +0 -3
- package/dist/commands/go.d.ts +2 -71
- package/dist/commands/go.js +5 -99
- package/dist/commands/harness-hooks.d.ts +0 -41
- package/dist/commands/harness-hooks.js +0 -48
- package/dist/commands/harness-wizard.d.ts +0 -137
- package/dist/commands/harness-wizard.js +0 -109
- package/dist/commands/harness.d.ts +0 -63
- package/dist/commands/harness.js +0 -103
- package/dist/commands/hooks.d.ts +0 -9
- package/dist/commands/hooks.js +0 -26
- package/dist/commands/humans.d.ts +0 -8
- package/dist/commands/humans.js +0 -8
- package/dist/commands/import.d.ts +0 -22
- package/dist/commands/import.js +0 -79
- package/dist/commands/insights.d.ts +0 -37
- package/dist/commands/insights.js +3 -115
- package/dist/commands/inspect.d.ts +0 -117
- package/dist/commands/inspect.js +2 -448
- package/dist/commands/lease.d.ts +0 -28
- package/dist/commands/lease.js +0 -43
- package/dist/commands/logs.d.ts +0 -23
- package/dist/commands/logs.js +0 -30
- package/dist/commands/mailboxes.d.ts +0 -18
- package/dist/commands/mailboxes.js +0 -29
- package/dist/commands/mcp.d.ts +0 -9
- package/dist/commands/mcp.js +0 -53
- package/dist/commands/memory.d.ts +0 -7
- package/dist/commands/memory.js +0 -7
- package/dist/commands/menubar.d.ts +0 -8
- package/dist/commands/menubar.js +0 -24
- package/dist/commands/message.d.ts +0 -23
- package/dist/commands/message.js +0 -50
- package/dist/commands/mine.d.ts +0 -22
- package/dist/commands/mine.js +0 -21
- package/dist/commands/models.d.ts +0 -8
- package/dist/commands/models.js +0 -33
- package/dist/commands/modes.d.ts +0 -10
- package/dist/commands/modes.js +0 -13
- package/dist/commands/monitors.d.ts +0 -9
- package/dist/commands/monitors.js +3 -160
- package/dist/commands/open.d.ts +0 -26
- package/dist/commands/open.js +0 -10
- package/dist/commands/output.d.ts +0 -18
- package/dist/commands/output.js +1 -34
- package/dist/commands/packages-materialize.d.ts +0 -11
- package/dist/commands/packages-materialize.js +0 -3
- package/dist/commands/packages.d.ts +0 -10
- package/dist/commands/packages.js +0 -50
- package/dist/commands/perf.d.ts +0 -41
- package/dist/commands/perf.js +0 -55
- package/dist/commands/permissions.d.ts +0 -9
- package/dist/commands/permissions.js +0 -43
- package/dist/commands/plugins.d.ts +0 -14
- package/dist/commands/plugins.js +2 -55
- package/dist/commands/profiles.d.ts +0 -25
- package/dist/commands/profiles.js +0 -27
- package/dist/commands/projects-todo.d.ts +2 -0
- package/dist/commands/projects-todo.js +132 -0
- package/dist/commands/projects.d.ts +0 -85
- package/dist/commands/projects.js +344 -291
- package/dist/commands/prune.js +0 -30
- package/dist/commands/ps-roster.d.ts +92 -0
- package/dist/commands/ps-roster.js +744 -0
- package/dist/commands/ps.d.ts +6 -0
- package/dist/commands/ps.js +98 -0
- package/dist/commands/refresh-rules.d.ts +0 -13
- package/dist/commands/refresh-rules.js +0 -14
- package/dist/commands/reminders.d.ts +0 -7
- package/dist/commands/repo.d.ts +0 -89
- package/dist/commands/repo.js +7 -205
- package/dist/commands/resource-view.d.ts +0 -33
- package/dist/commands/resource-view.js +0 -49
- package/dist/commands/resume.d.ts +1 -19
- package/dist/commands/resume.js +0 -50
- package/dist/commands/route.d.ts +0 -10
- package/dist/commands/route.js +0 -19
- package/dist/commands/routines.d.ts +0 -42
- package/dist/commands/routines.js +5 -290
- package/dist/commands/routines.test-fixture.d.ts +0 -34
- package/dist/commands/routines.test-fixture.js +4 -100
- package/dist/commands/rules.d.ts +0 -9
- package/dist/commands/rules.js +1 -6
- package/dist/commands/run-account-picker.d.ts +0 -59
- package/dist/commands/run-account-picker.js +0 -71
- package/dist/commands/run-broadcast.d.ts +0 -9
- package/dist/commands/run-broadcast.js +0 -7
- package/dist/commands/run-cloud.d.ts +0 -15
- package/dist/commands/run-cloud.js +0 -37
- package/dist/commands/run-device-picker.d.ts +0 -25
- package/dist/commands/run-device-picker.js +1 -53
- package/dist/commands/secrets-passthrough.d.ts +0 -31
- package/dist/commands/secrets-passthrough.js +0 -10
- package/dist/commands/send.d.ts +0 -20
- package/dist/commands/send.js +14 -18
- package/dist/commands/sessions-backfill.d.ts +0 -7
- package/dist/commands/sessions-backfill.js +1 -16
- package/dist/commands/sessions-backup-setup.js +0 -11
- package/dist/commands/sessions-bookmark.d.ts +0 -8
- package/dist/commands/sessions-bookmark.js +0 -28
- package/dist/commands/sessions-browser.d.ts +2 -117
- package/dist/commands/sessions-browser.js +5 -243
- package/dist/commands/sessions-export.d.ts +1 -26
- package/dist/commands/sessions-export.js +3 -81
- package/dist/commands/sessions-import.d.ts +0 -14
- package/dist/commands/sessions-import.js +0 -59
- package/dist/commands/sessions-inject.d.ts +0 -60
- package/dist/commands/sessions-inject.js +3 -96
- package/dist/commands/sessions-migrate.d.ts +2 -37
- package/dist/commands/sessions-migrate.js +7 -159
- package/dist/commands/sessions-optimize.d.ts +0 -12
- package/dist/commands/sessions-picker-factory.d.ts +0 -7
- package/dist/commands/sessions-picker-factory.js +0 -8
- package/dist/commands/sessions-picker.d.ts +4 -103
- package/dist/commands/sessions-picker.js +13 -352
- package/dist/commands/sessions-render.d.ts +1 -2
- package/dist/commands/sessions-render.js +3 -7
- package/dist/commands/sessions-resume.d.ts +1 -24
- package/dist/commands/sessions-resume.js +2 -65
- package/dist/commands/sessions-share.d.ts +1 -9
- package/dist/commands/sessions-share.js +1 -45
- package/dist/commands/sessions-stats.d.ts +0 -24
- package/dist/commands/sessions-stats.js +0 -49
- package/dist/commands/sessions-stop.d.ts +1 -20
- package/dist/commands/sessions-stop.js +4 -9
- package/dist/commands/sessions-tail.d.ts +1 -19
- package/dist/commands/sessions-tail.js +3 -36
- package/dist/commands/sessions-trace.d.ts +5 -36
- package/dist/commands/sessions-trace.js +7 -82
- package/dist/commands/sessions.d.ts +1 -666
- package/dist/commands/sessions.js +30 -2279
- package/dist/commands/sessions.test-fixture.d.ts +0 -9
- package/dist/commands/sessions.test-fixture.js +8 -23
- package/dist/commands/setup-accounts.d.ts +0 -6
- package/dist/commands/setup-browser.d.ts +0 -23
- package/dist/commands/setup-browser.js +0 -28
- package/dist/commands/setup-computer.d.ts +0 -16
- package/dist/commands/setup-computer.js +0 -28
- package/dist/commands/setup-fleet.d.ts +0 -8
- package/dist/commands/setup-fleet.js +0 -11
- package/dist/commands/setup-mine.d.ts +0 -14
- package/dist/commands/setup-mine.js +0 -25
- package/dist/commands/setup-preferences.d.ts +0 -47
- package/dist/commands/setup-preferences.js +0 -53
- package/dist/commands/setup-secrets.d.ts +2 -24
- package/dist/commands/setup-secrets.js +0 -24
- package/dist/commands/setup-term.d.ts +0 -21
- package/dist/commands/setup-term.js +0 -21
- package/dist/commands/setup-terminal.d.ts +0 -1
- package/dist/commands/setup-terminal.js +0 -1
- package/dist/commands/setup-tools.d.ts +2 -0
- package/dist/commands/setup-tools.js +73 -0
- package/dist/commands/setup.d.ts +0 -20
- package/dist/commands/setup.js +4 -57
- package/dist/commands/skills.d.ts +0 -9
- package/dist/commands/skills.js +1 -22
- package/dist/commands/snapshot.d.ts +0 -9
- package/dist/commands/snapshot.js +0 -10
- package/dist/commands/ssh.d.ts +0 -64
- package/dist/commands/ssh.js +9 -420
- package/dist/commands/status.d.ts +0 -12
- package/dist/commands/status.js +0 -26
- package/dist/commands/subagents.d.ts +0 -8
- package/dist/commands/subagents.js +0 -31
- package/dist/commands/sync.d.ts +0 -37
- package/dist/commands/sync.js +0 -256
- package/dist/commands/teams-picker.d.ts +0 -3
- package/dist/commands/teams-picker.js +0 -34
- package/dist/commands/teams.d.ts +1 -76
- package/dist/commands/teams.js +9 -477
- package/dist/commands/tmux.d.ts +0 -25
- package/dist/commands/tmux.js +0 -46
- package/dist/commands/traces.js +0 -19
- package/dist/commands/trash.d.ts +0 -17
- package/dist/commands/trash.js +1 -11
- package/dist/commands/uninstall.d.ts +0 -9
- package/dist/commands/uninstall.js +0 -6
- package/dist/commands/update.d.ts +0 -22
- package/dist/commands/update.js +0 -44
- package/dist/commands/upgrade.d.ts +0 -1
- package/dist/commands/upgrade.js +0 -1
- package/dist/commands/utils.d.ts +0 -85
- package/dist/commands/utils.js +1 -95
- package/dist/commands/versions.d.ts +0 -16
- package/dist/commands/versions.js +0 -134
- package/dist/commands/view.d.ts +0 -90
- package/dist/commands/view.js +4 -343
- package/dist/commands/watchdog.d.ts +0 -19
- package/dist/commands/watchdog.js +3 -43
- package/dist/commands/webhook.d.ts +0 -8
- package/dist/commands/webhook.js +0 -14
- package/dist/commands/workflows.d.ts +0 -8
- package/dist/commands/workflows.js +0 -6
- package/dist/index.d.ts +0 -25
- package/dist/index.js +5 -119
- package/dist/lib/account-capabilities.d.ts +0 -34
- package/dist/lib/account-capabilities.js +0 -32
- package/dist/lib/account-catalog.d.ts +0 -128
- package/dist/lib/account-catalog.js +8 -154
- package/dist/lib/account-provider-registry.d.ts +0 -14
- package/dist/lib/account-provider-registry.js +0 -8
- package/dist/lib/account-registry.d.ts +0 -74
- package/dist/lib/account-registry.js +14 -189
- package/dist/lib/account-schema.d.ts +0 -19
- package/dist/lib/account-schema.js +0 -43
- package/dist/lib/accounting/account-launch.d.ts +0 -15
- package/dist/lib/accounting/account-launch.js +1 -3
- package/dist/lib/accounting/account-pool-collect.d.ts +0 -26
- package/dist/lib/accounting/account-pool-collect.js +0 -42
- package/dist/lib/accounting/account-pool.d.ts +0 -41
- package/dist/lib/accounting/account-pool.js +0 -17
- package/dist/lib/accounting/capacity.d.ts +0 -32
- package/dist/lib/accounting/capacity.js +0 -32
- package/dist/lib/accounting/rotate.d.ts +0 -518
- package/dist/lib/accounting/rotate.js +4 -598
- package/dist/lib/accounting/usage-ingest.d.ts +0 -1
- package/dist/lib/accounting/usage-ingest.js +0 -44
- package/dist/lib/accounting/usage-sync.d.ts +0 -60
- package/dist/lib/accounting/usage-sync.js +4 -51
- package/dist/lib/accounting/usage.d.ts +0 -632
- package/dist/lib/accounting/usage.js +14 -1055
- package/dist/lib/accounts/add.d.ts +0 -60
- package/dist/lib/accounts/add.js +0 -127
- package/dist/lib/accounts/auth-operation-lock.d.ts +0 -1
- package/dist/lib/accounts/auth-operation-lock.js +0 -4
- package/dist/lib/accounts/migrate.d.ts +0 -9
- package/dist/lib/accounts/migrate.js +3 -42
- package/dist/lib/accounts/slots.d.ts +0 -25
- package/dist/lib/accounts/slots.js +1 -49
- package/dist/lib/acp/client.d.ts +0 -16
- package/dist/lib/acp/client.js +0 -29
- package/dist/lib/acp/harnesses.d.ts +0 -15
- package/dist/lib/acp/harnesses.js +0 -16
- package/dist/lib/acp/run.d.ts +0 -8
- package/dist/lib/acp/run.js +0 -8
- package/dist/lib/actor.d.ts +1 -71
- package/dist/lib/actor.js +1 -99
- package/dist/lib/add-dir.d.ts +0 -46
- package/dist/lib/add-dir.js +1 -70
- package/dist/lib/address.d.ts +0 -17
- package/dist/lib/address.js +0 -15
- package/dist/lib/agent-cli-commands.d.ts +0 -10
- package/dist/lib/agent-cli-commands.js +0 -10
- package/dist/lib/agent-modes.d.ts +0 -29
- package/dist/lib/agent-modes.js +0 -31
- package/dist/lib/agent-spec/agents.d.ts +0 -426
- package/dist/lib/agent-spec/agents.js +37 -924
- package/dist/lib/agent-spec/index.d.ts +0 -5
- package/dist/lib/agent-spec/index.js +0 -14
- package/dist/lib/agent-spec/materialize.d.ts +0 -10
- package/dist/lib/agent-spec/materialize.js +2 -139
- package/dist/lib/agent-spec/package-resolve.d.ts +0 -8
- package/dist/lib/agent-spec/package-resolve.js +1 -44
- package/dist/lib/agent-spec/package-schema.d.ts +0 -2
- package/dist/lib/agent-spec/package-schema.js +0 -11
- package/dist/lib/agent-spec/package-types.d.ts +0 -27
- package/dist/lib/agent-spec/package-types.js +0 -1
- package/dist/lib/agent-spec/primitives.d.ts +0 -18
- package/dist/lib/agent-spec/primitives.js +0 -27
- package/dist/lib/agent-spec/provider.js +0 -2
- package/dist/lib/agent-spec/resolve.d.ts +0 -23
- package/dist/lib/agent-spec/resolve.js +0 -41
- package/dist/lib/agent-spec/types.d.ts +0 -34
- package/dist/lib/agent-spec/types.js +0 -6
- package/dist/lib/agents.d.ts +0 -1
- package/dist/lib/agents.js +0 -1
- package/dist/lib/analytics/mix-commands.d.ts +0 -23
- package/dist/lib/analytics/mix-commands.js +0 -26
- package/dist/lib/analytics/recipes.d.ts +0 -1
- package/dist/lib/analytics/recipes.js +5 -10
- package/dist/lib/analytics/usage-db.js +4 -6
- package/dist/lib/answer-router.d.ts +0 -61
- package/dist/lib/answer-router.js +0 -57
- package/dist/lib/app-bundle-install.d.ts +0 -13
- package/dist/lib/app-bundle-install.js +0 -50
- package/dist/lib/artifact-actions.d.ts +0 -15
- package/dist/lib/artifact-actions.js +0 -18
- package/dist/lib/artifacts-client.d.ts +0 -10
- package/dist/lib/artifacts-client.js +0 -17
- package/dist/lib/ask-classifier.d.ts +0 -38
- package/dist/lib/ask-classifier.js +0 -27
- package/dist/lib/audit/log.d.ts +0 -47
- package/dist/lib/audit/log.js +1 -59
- package/dist/lib/auth-health.d.ts +0 -213
- package/dist/lib/auth-health.js +16 -266
- package/dist/lib/auth-mint.d.ts +0 -83
- package/dist/lib/auth-mint.js +8 -85
- package/dist/lib/auto-pull-worker.d.ts +0 -10
- package/dist/lib/auto-pull-worker.js +3 -48
- package/dist/lib/auto-pull.d.ts +0 -64
- package/dist/lib/auto-pull.js +0 -79
- package/dist/lib/beta.d.ts +0 -9
- package/dist/lib/beta.js +0 -9
- package/dist/lib/binary-shadow.d.ts +0 -22
- package/dist/lib/binary-shadow.js +4 -34
- package/dist/lib/boot-profile.d.ts +0 -10
- package/dist/lib/boot-profile.js +1 -31
- package/dist/lib/brand.d.ts +0 -20
- package/dist/lib/brand.js +0 -50
- package/dist/lib/browser/context.d.ts +0 -54
- package/dist/lib/browser/context.js +0 -49
- package/dist/lib/browser/paths.d.ts +0 -21
- package/dist/lib/browser/paths.js +0 -26
- package/dist/lib/browser/record.d.ts +0 -34
- package/dist/lib/browser/record.js +0 -38
- package/dist/lib/browser/sessions-list.d.ts +1 -79
- package/dist/lib/browser/sessions-list.js +2 -98
- package/dist/lib/browser-client.d.ts +0 -112
- package/dist/lib/browser-client.js +1 -90
- package/dist/lib/budget/config.d.ts +0 -6
- package/dist/lib/budget/config.js +0 -29
- package/dist/lib/budget/enforce.d.ts +0 -50
- package/dist/lib/budget/enforce.js +0 -27
- package/dist/lib/budget/ledger.d.ts +0 -23
- package/dist/lib/budget/ledger.js +0 -28
- package/dist/lib/budget/live-cloud.d.ts +0 -26
- package/dist/lib/budget/live-cloud.js +0 -12
- package/dist/lib/budget/live-team.d.ts +0 -17
- package/dist/lib/budget/live-team.js +1 -35
- package/dist/lib/budget/preflight.d.ts +0 -51
- package/dist/lib/budget/preflight.js +0 -36
- package/dist/lib/byok-usage.d.ts +0 -20
- package/dist/lib/byok-usage.js +1 -24
- package/dist/lib/capabilities.d.ts +0 -24
- package/dist/lib/capabilities.js +0 -29
- package/dist/lib/catchup.d.ts +0 -87
- package/dist/lib/catchup.js +1 -81
- package/dist/lib/channels/owner-forward.d.ts +0 -70
- package/dist/lib/channels/owner-forward.js +1 -43
- package/dist/lib/channels/owner-sink.js +0 -21
- package/dist/lib/channels/providers/desktop.d.ts +0 -37
- package/dist/lib/channels/providers/desktop.js +0 -72
- package/dist/lib/channels/providers/index.d.ts +0 -1
- package/dist/lib/channels/providers/index.js +2 -6
- package/dist/lib/channels/providers/mailbox.js +0 -7
- package/dist/lib/channels/providers/openclaw-telegram.js +0 -8
- package/dist/lib/channels/providers/rush.d.ts +0 -2
- package/dist/lib/channels/providers/rush.js +0 -26
- package/dist/lib/channels/providers/session.d.ts +2 -0
- package/dist/lib/channels/providers/session.js +26 -0
- package/dist/lib/channels/registry.d.ts +0 -27
- package/dist/lib/channels/registry.js +0 -10
- package/dist/lib/channels/resolve.d.ts +0 -19
- package/dist/lib/channels/resolve.js +0 -2
- package/dist/lib/channels/send.d.ts +0 -50
- package/dist/lib/channels/send.js +0 -25
- package/dist/lib/checkpoint.d.ts +0 -36
- package/dist/lib/checkpoint.js +0 -28
- package/dist/lib/claude-account-token.d.ts +0 -98
- package/dist/lib/claude-account-token.js +7 -169
- package/dist/lib/claude-statusline.d.ts +0 -41
- package/dist/lib/claude-statusline.js +0 -68
- package/dist/lib/cli-entry.d.ts +0 -26
- package/dist/lib/cli-entry.js +1 -61
- package/dist/lib/cli-resources.d.ts +31 -89
- package/dist/lib/cli-resources.js +116 -152
- package/dist/lib/cloud/antigravity.d.ts +0 -29
- package/dist/lib/cloud/antigravity.js +0 -36
- package/dist/lib/cloud/codex.d.ts +0 -8
- package/dist/lib/cloud/codex.js +0 -41
- package/dist/lib/cloud/cursor.d.ts +0 -5
- package/dist/lib/cloud/cursor.js +2 -7
- package/dist/lib/cloud/dispatch.d.ts +0 -13
- package/dist/lib/cloud/dispatch.js +1 -48
- package/dist/lib/cloud/factory.d.ts +0 -52
- package/dist/lib/cloud/factory.js +3 -67
- package/dist/lib/cloud/host.d.ts +0 -39
- package/dist/lib/cloud/host.js +5 -48
- package/dist/lib/cloud/registry.d.ts +0 -25
- package/dist/lib/cloud/registry.js +0 -29
- package/dist/lib/cloud/rush.d.ts +0 -47
- package/dist/lib/cloud/rush.js +1 -82
- package/dist/lib/cloud/session-index.d.ts +0 -27
- package/dist/lib/cloud/session-index.js +1 -32
- package/dist/lib/cloud/store.d.ts +0 -18
- package/dist/lib/cloud/store.js +0 -28
- package/dist/lib/cloud/stream.d.ts +0 -14
- package/dist/lib/cloud/stream.js +0 -25
- package/dist/lib/cloud/types.d.ts +0 -168
- package/dist/lib/cloud/types.js +0 -46
- package/dist/lib/cloudflare/creds.d.ts +0 -2
- package/dist/lib/cloudflare/creds.js +0 -14
- package/dist/lib/cloudflare/provision.d.ts +0 -8
- package/dist/lib/cloudflare/provision.js +1 -19
- package/dist/lib/codex-home.d.ts +0 -60
- package/dist/lib/codex-home.js +2 -72
- package/dist/lib/codex-policy.d.ts +0 -10
- package/dist/lib/codex-policy.js +0 -13
- package/dist/lib/command-skills.d.ts +0 -10
- package/dist/lib/command-skills.js +0 -10
- package/dist/lib/commands.d.ts +0 -74
- package/dist/lib/commands.js +0 -112
- package/dist/lib/comms-render.d.ts +0 -5
- package/dist/lib/comms-render.js +0 -5
- package/dist/lib/computer/context.d.ts +0 -23
- package/dist/lib/computer/context.js +0 -14
- package/dist/lib/computer/policy.d.ts +0 -20
- package/dist/lib/computer/policy.js +0 -53
- package/dist/lib/computer/record.d.ts +0 -33
- package/dist/lib/computer/record.js +1 -48
- package/dist/lib/computer/sessions-list.d.ts +1 -128
- package/dist/lib/computer/sessions-list.js +6 -165
- package/dist/lib/computer-client.d.ts +0 -106
- package/dist/lib/computer-client.js +5 -86
- package/dist/lib/concurrency.d.ts +0 -14
- package/dist/lib/concurrency.js +0 -3
- package/dist/lib/config-drift.d.ts +0 -31
- package/dist/lib/config-drift.js +0 -32
- package/dist/lib/config-keys.d.ts +1 -65
- package/dist/lib/config-keys.js +6 -52
- package/dist/lib/config-transfer.d.ts +0 -14
- package/dist/lib/config-transfer.js +0 -26
- package/dist/lib/convert.d.ts +0 -17
- package/dist/lib/convert.js +0 -18
- package/dist/lib/crabbox/cli.d.ts +0 -156
- package/dist/lib/crabbox/cli.js +1 -188
- package/dist/lib/crabbox/config.d.ts +0 -18
- package/dist/lib/crabbox/config.js +1 -19
- package/dist/lib/crabbox/lease.d.ts +0 -93
- package/dist/lib/crabbox/lease.js +4 -148
- package/dist/lib/crabbox/progress.d.ts +0 -56
- package/dist/lib/crabbox/progress.js +2 -49
- package/dist/lib/crabbox/runtimes.d.ts +0 -94
- package/dist/lib/crabbox/runtimes.js +1 -111
- package/dist/lib/crabbox/setup-copy.d.ts +0 -64
- package/dist/lib/crabbox/setup-copy.js +1 -53
- package/dist/lib/daemon/account-state-daemon-service.d.ts +0 -48
- package/dist/lib/daemon/account-state-daemon-service.js +2 -63
- package/dist/lib/daemon/attention-notify-service.d.ts +0 -12
- package/dist/lib/daemon/attention-notify-service.js +1 -24
- package/dist/lib/daemon/auth-sync-service.d.ts +0 -28
- package/dist/lib/daemon/auth-sync-service.js +0 -56
- package/dist/lib/daemon/catchup-service.d.ts +0 -34
- package/dist/lib/daemon/catchup-service.js +0 -30
- package/dist/lib/daemon/daemon.d.ts +0 -374
- package/dist/lib/daemon/daemon.js +44 -1049
- package/dist/lib/daemon/daemon.test-fixture.d.ts +0 -19
- package/dist/lib/daemon/daemon.test-fixture.js +1 -24
- package/dist/lib/daemon/device-probe-service.d.ts +0 -16
- package/dist/lib/daemon/device-probe-service.js +0 -20
- package/dist/lib/daemon/feed-stream-service.d.ts +0 -15
- package/dist/lib/daemon/feed-stream-service.js +0 -20
- package/dist/lib/daemon/harness-update-service.d.ts +2 -61
- package/dist/lib/daemon/harness-update-service.js +6 -86
- package/dist/lib/daemon/heartbeat-service.d.ts +0 -1
- package/dist/lib/daemon/heartbeat-service.js +0 -1
- package/dist/lib/daemon/leaked-daemons.d.ts +0 -46
- package/dist/lib/daemon/leaked-daemons.js +2 -78
- package/dist/lib/daemon/monitor-engine-service.d.ts +0 -13
- package/dist/lib/daemon/monitor-engine-service.js +3 -15
- package/dist/lib/daemon/runner.d.ts +0 -194
- package/dist/lib/daemon/runner.js +39 -760
- package/dist/lib/daemon/self-heal-service.d.ts +18 -17
- package/dist/lib/daemon/self-heal-service.js +83 -37
- package/dist/lib/daemon/self-update-service.d.ts +1 -131
- package/dist/lib/daemon/self-update-service.js +26 -189
- package/dist/lib/daemon/service.d.ts +0 -73
- package/dist/lib/daemon/service.js +0 -34
- package/dist/lib/daemon/session-index-service.d.ts +0 -12
- package/dist/lib/daemon/session-index-service.js +0 -23
- package/dist/lib/daemon/session-state-service.d.ts +0 -8
- package/dist/lib/daemon/session-state-service.js +0 -8
- package/dist/lib/daemon/session-summarizer-service.d.ts +0 -14
- package/dist/lib/daemon/session-summarizer-service.js +1 -19
- package/dist/lib/daemon/session-title-service.d.ts +0 -25
- package/dist/lib/daemon/session-title-service.js +0 -32
- package/dist/lib/daemon/state-dir-check-service.d.ts +0 -24
- package/dist/lib/daemon/state-dir-check-service.js +0 -29
- package/dist/lib/daemon/supervisor.d.ts +0 -112
- package/dist/lib/daemon/supervisor.js +4 -147
- package/dist/lib/daemon/testdata/process-view-daemon.js +0 -2
- package/dist/lib/daemon/testdata/process-view-start.js +0 -5
- package/dist/lib/daemon/tmux-reap-service.d.ts +0 -1
- package/dist/lib/daemon/tmux-reap-service.js +0 -1
- package/dist/lib/daemon/usage-sync-service.d.ts +0 -23
- package/dist/lib/daemon/usage-sync-service.js +0 -26
- package/dist/lib/daemon/watchdog-service.d.ts +0 -9
- package/dist/lib/daemon/watchdog-service.js +0 -13
- package/dist/lib/daemon/webhook-receiver-service.d.ts +0 -1
- package/dist/lib/daemon/webhook-receiver-service.js +0 -1
- package/dist/lib/daemon-health.d.ts +0 -55
- package/dist/lib/daemon-health.js +4 -77
- package/dist/lib/daemon-services.d.ts +0 -36
- package/dist/lib/daemon-services.js +0 -45
- package/dist/lib/daemon-ticks.d.ts +0 -126
- package/dist/lib/daemon-ticks.js +1 -156
- package/dist/lib/daemon-webhooks.d.ts +0 -57
- package/dist/lib/daemon-webhooks.js +2 -54
- package/dist/lib/deeplink/register.d.ts +0 -15
- package/dist/lib/deeplink/register.js +0 -60
- package/dist/lib/deeplink/url.d.ts +0 -24
- package/dist/lib/deeplink/url.js +1 -33
- package/dist/lib/device-config.d.ts +1 -192
- package/dist/lib/device-config.js +86 -240
- package/dist/lib/devices/config-migration.d.ts +0 -43
- package/dist/lib/devices/config-migration.js +7 -127
- package/dist/lib/devices/connect.d.ts +0 -168
- package/dist/lib/devices/connect.js +6 -254
- package/dist/lib/devices/device-docs.d.ts +0 -24
- package/dist/lib/devices/device-docs.js +0 -46
- package/dist/lib/devices/discovery-policy.d.ts +0 -30
- package/dist/lib/devices/discovery-policy.js +3 -34
- package/dist/lib/devices/doctor-findings.d.ts +0 -109
- package/dist/lib/devices/doctor-findings.js +30 -326
- package/dist/lib/devices/doctor-overview-cache.d.ts +0 -33
- package/dist/lib/devices/doctor-overview-cache.js +0 -81
- package/dist/lib/devices/fleet-divergence.d.ts +0 -89
- package/dist/lib/devices/fleet-divergence.js +1 -60
- package/dist/lib/devices/fleet-inventory.d.ts +0 -27
- package/dist/lib/devices/fleet-inventory.js +0 -38
- package/dist/lib/devices/fleet.d.ts +0 -95
- package/dist/lib/devices/fleet.js +0 -79
- package/dist/lib/devices/harness-inventory.d.ts +0 -75
- package/dist/lib/devices/harness-inventory.js +0 -101
- package/dist/lib/devices/health-report.d.ts +0 -37
- package/dist/lib/devices/health-report.js +0 -73
- package/dist/lib/devices/health.d.ts +0 -71
- package/dist/lib/devices/health.js +2 -82
- package/dist/lib/devices/interactive-host.d.ts +0 -10
- package/dist/lib/devices/interactive-host.js +0 -34
- package/dist/lib/devices/known-hosts.d.ts +0 -45
- package/dist/lib/devices/known-hosts.js +0 -77
- package/dist/lib/devices/pending.d.ts +0 -31
- package/dist/lib/devices/pending.js +7 -67
- package/dist/lib/devices/pool.d.ts +0 -36
- package/dist/lib/devices/pool.js +0 -30
- package/dist/lib/devices/reachability.d.ts +0 -25
- package/dist/lib/devices/reachability.js +0 -14
- package/dist/lib/devices/registry.d.ts +0 -141
- package/dist/lib/devices/registry.js +4 -151
- package/dist/lib/devices/resolve-profile.d.ts +0 -18
- package/dist/lib/devices/resolve-profile.js +0 -18
- package/dist/lib/devices/resolve-target.d.ts +0 -20
- package/dist/lib/devices/resolve-target.js +1 -51
- package/dist/lib/devices/rollout-verify.d.ts +1 -81
- package/dist/lib/devices/rollout-verify.js +0 -77
- package/dist/lib/devices/self-host.d.ts +0 -7
- package/dist/lib/devices/self-host.js +1 -29
- package/dist/lib/devices/ssh-config.d.ts +0 -18
- package/dist/lib/devices/ssh-config.js +0 -9
- package/dist/lib/devices/stats-cache.d.ts +0 -48
- package/dist/lib/devices/stats-cache.js +0 -80
- package/dist/lib/devices/sync.d.ts +0 -97
- package/dist/lib/devices/sync.js +0 -88
- package/dist/lib/devices/tailscale.d.ts +0 -18
- package/dist/lib/devices/tailscale.js +1 -38
- package/dist/lib/devices/terminfo.d.ts +0 -27
- package/dist/lib/devices/terminfo.js +2 -64
- package/dist/lib/devices/worker-pick.d.ts +0 -15
- package/dist/lib/devices/worker-pick.js +0 -48
- package/dist/lib/diff-text.d.ts +0 -18
- package/dist/lib/diff-text.js +0 -15
- package/dist/lib/doctor-diff.d.ts +0 -79
- package/dist/lib/doctor-diff.js +2 -181
- package/dist/lib/drift-sync.d.ts +0 -29
- package/dist/lib/drift-sync.js +0 -40
- package/dist/lib/drift.d.ts +0 -43
- package/dist/lib/drift.js +0 -31
- package/dist/lib/event-families.d.ts +0 -17
- package/dist/lib/event-families.js +0 -33
- package/dist/lib/event-provenance.d.ts +0 -4
- package/dist/lib/event-provenance.js +0 -5
- package/dist/lib/event-stream.d.ts +0 -29
- package/dist/lib/event-stream.js +0 -36
- package/dist/lib/events-ingest.d.ts +0 -27
- package/dist/lib/events-ingest.js +0 -54
- package/dist/lib/exec-account-home.d.ts +0 -24
- package/dist/lib/exec-account-home.js +0 -41
- package/dist/lib/exec-bounded.d.ts +1 -37
- package/dist/lib/exec-bounded.js +10 -46
- package/dist/lib/exec.d.ts +3 -583
- package/dist/lib/exec.js +18 -1025
- package/dist/lib/factory/snapshot.js +1 -15
- package/dist/lib/feed/activity-stream.d.ts +0 -27
- package/dist/lib/feed/activity-stream.js +4 -80
- package/dist/lib/feed/activity.d.ts +1 -243
- package/dist/lib/feed/activity.js +8 -273
- package/dist/lib/feed/answer.d.ts +0 -103
- package/dist/lib/feed/answer.js +0 -267
- package/dist/lib/feed/attention.d.ts +0 -56
- package/dist/lib/feed/attention.js +0 -161
- package/dist/lib/feed/envelope.d.ts +2 -17
- package/dist/lib/feed/envelope.js +0 -14
- package/dist/lib/feed/events.d.ts +0 -118
- package/dist/lib/feed/events.js +13 -213
- package/dist/lib/feed/feed.d.ts +1 -250
- package/dist/lib/feed/feed.js +24 -334
- package/dist/lib/feed/hub-server.d.ts +0 -100
- package/dist/lib/feed/hub-server.js +1 -191
- package/dist/lib/feed/hub.d.ts +0 -53
- package/dist/lib/feed/hub.js +0 -89
- package/dist/lib/feed/pr-status.d.ts +1 -19
- package/dist/lib/feed/pr-status.js +0 -18
- package/dist/lib/feed/tool-activity.d.ts +0 -59
- package/dist/lib/feed/tool-activity.js +1 -119
- package/dist/lib/feed/tools.d.ts +0 -100
- package/dist/lib/feed/tools.js +0 -89
- package/dist/lib/feed/watch.d.ts +0 -33
- package/dist/lib/feed/watch.js +2 -94
- package/dist/lib/feed-broadcast.d.ts +0 -148
- package/dist/lib/feed-broadcast.js +1 -283
- package/dist/lib/feed-outcome.d.ts +0 -50
- package/dist/lib/feed-outcome.js +1 -67
- package/dist/lib/feed-policy.d.ts +0 -6
- package/dist/lib/feed-policy.js +1 -27
- package/dist/lib/feed-post.d.ts +0 -61
- package/dist/lib/feed-post.js +4 -61
- package/dist/lib/feed-ranking.d.ts +1 -1
- package/dist/lib/fleet/apply.d.ts +0 -64
- package/dist/lib/fleet/apply.js +0 -125
- package/dist/lib/fleet/auth-sync.d.ts +0 -48
- package/dist/lib/fleet/auth-sync.js +4 -49
- package/dist/lib/fleet/capture.d.ts +0 -26
- package/dist/lib/fleet/capture.js +1 -36
- package/dist/lib/fleet/manifest.d.ts +0 -38
- package/dist/lib/fleet/manifest.js +0 -40
- package/dist/lib/fleet/types.d.ts +1 -138
- package/dist/lib/fleet/types.js +0 -12
- package/dist/lib/fleet-cache.d.ts +0 -12
- package/dist/lib/fleet-cache.js +0 -24
- package/dist/lib/fleet-shared-state.d.ts +6 -59
- package/dist/lib/fleet-shared-state.js +5 -51
- package/dist/lib/fleet-status.d.ts +0 -27
- package/dist/lib/fleet-status.js +0 -48
- package/dist/lib/format.d.ts +0 -74
- package/dist/lib/format.js +3 -77
- package/dist/lib/friction-heuristics.d.ts +0 -20
- package/dist/lib/friction-heuristics.js +0 -8
- package/dist/lib/fs-atomic.d.ts +0 -51
- package/dist/lib/fs-atomic.js +8 -66
- package/dist/lib/fs-walk.d.ts +0 -13
- package/dist/lib/fs-walk.js +0 -22
- package/dist/lib/fuzzy.d.ts +0 -29
- package/dist/lib/fuzzy.js +0 -31
- package/dist/lib/gemini-settings.js +0 -12
- package/dist/lib/git.d.ts +0 -366
- package/dist/lib/git.js +7 -574
- package/dist/lib/github/ci-failure.d.ts +30 -0
- package/dist/lib/github/ci-failure.js +95 -0
- package/dist/lib/github/gh-overload.d.ts +0 -38
- package/dist/lib/github/gh-overload.js +3 -55
- package/dist/lib/github/pr-mergeable.d.ts +3 -34
- package/dist/lib/github/pr-mergeable.js +2 -42
- package/dist/lib/github/pr-verdict.d.ts +0 -44
- package/dist/lib/github/pr-verdict.js +0 -36
- package/dist/lib/github/project-prs.d.ts +135 -105
- package/dist/lib/github/project-prs.js +530 -170
- package/dist/lib/github/release-drift.d.ts +45 -0
- package/dist/lib/github/release-drift.js +91 -0
- package/dist/lib/github/rest.d.ts +0 -50
- package/dist/lib/github/rest.js +0 -49
- package/dist/lib/github/viewer.d.ts +27 -0
- package/dist/lib/github/viewer.js +101 -0
- package/dist/lib/goose-commands.d.ts +0 -29
- package/dist/lib/goose-commands.js +3 -48
- package/dist/lib/harness/adapter.d.ts +0 -151
- package/dist/lib/harness/adapter.js +0 -41
- package/dist/lib/harness/adapters/claude.d.ts +0 -8
- package/dist/lib/harness/adapters/claude.js +0 -89
- package/dist/lib/harness/adapters/codex.js +0 -18
- package/dist/lib/harness/adapters/copilot.js +0 -3
- package/dist/lib/harness/adapters/cursor.js +0 -16
- package/dist/lib/harness/adapters/droid.js +0 -3
- package/dist/lib/harness/adapters/kimi.js +0 -19
- package/dist/lib/harness/adapters/muse.js +0 -9
- package/dist/lib/harness/adapters/opencode.js +0 -2
- package/dist/lib/harness/exec-config-version.d.ts +0 -2
- package/dist/lib/harness/exec-config-version.js +0 -13
- package/dist/lib/harness/index.js +0 -10
- package/dist/lib/harness-auth-capabilities.d.ts +0 -26
- package/dist/lib/harness-auth-capabilities.js +0 -18
- package/dist/lib/harness-connection-test.d.ts +0 -27
- package/dist/lib/harness-connection-test.js +2 -20
- package/dist/lib/heal.d.ts +0 -45
- package/dist/lib/heal.js +2 -82
- package/dist/lib/help.d.ts +0 -32
- package/dist/lib/help.js +0 -41
- package/dist/lib/helper-download.d.ts +0 -85
- package/dist/lib/helper-download.js +0 -95
- package/dist/lib/helper-versions.d.ts +0 -51
- package/dist/lib/helper-versions.js +1 -45
- package/dist/lib/hooks/cache.d.ts +0 -40
- package/dist/lib/hooks/cache.js +8 -122
- package/dist/lib/hooks/install.d.ts +0 -253
- package/dist/lib/hooks/install.js +49 -822
- package/dist/lib/hooks/match.d.ts +0 -24
- package/dist/lib/hooks/match.js +0 -31
- package/dist/lib/hooks/profile.d.ts +0 -21
- package/dist/lib/hooks/profile.js +0 -28
- package/dist/lib/hosts/credential-transport.d.ts +0 -6
- package/dist/lib/hosts/credential-transport.js +0 -17
- package/dist/lib/hosts/credentials.d.ts +0 -35
- package/dist/lib/hosts/credentials.js +0 -38
- package/dist/lib/hosts/dispatch.d.ts +0 -140
- package/dist/lib/hosts/dispatch.js +0 -176
- package/dist/lib/hosts/logs.d.ts +0 -25
- package/dist/lib/hosts/logs.js +1 -51
- package/dist/lib/hosts/option.d.ts +0 -12
- package/dist/lib/hosts/option.js +0 -12
- package/dist/lib/hosts/passthrough.d.ts +0 -129
- package/dist/lib/hosts/passthrough.js +12 -249
- package/dist/lib/hosts/progress.d.ts +0 -90
- package/dist/lib/hosts/progress.js +5 -115
- package/dist/lib/hosts/providers/devices.d.ts +0 -19
- package/dist/lib/hosts/providers/devices.js +1 -34
- package/dist/lib/hosts/providers/local.d.ts +0 -14
- package/dist/lib/hosts/providers/local.js +0 -22
- package/dist/lib/hosts/ready.d.ts +0 -99
- package/dist/lib/hosts/ready.js +0 -101
- package/dist/lib/hosts/reconcile.d.ts +0 -38
- package/dist/lib/hosts/reconcile.js +1 -50
- package/dist/lib/hosts/reconnect.d.ts +0 -75
- package/dist/lib/hosts/reconnect.js +0 -98
- package/dist/lib/hosts/registry.d.ts +0 -74
- package/dist/lib/hosts/registry.js +0 -110
- package/dist/lib/hosts/remote-cmd.d.ts +1 -228
- package/dist/lib/hosts/remote-cmd.js +19 -294
- package/dist/lib/hosts/remote-cmd.test-fixture.d.ts +0 -1
- package/dist/lib/hosts/remote-cmd.test-fixture.js +0 -12
- package/dist/lib/hosts/remote-os.d.ts +0 -19
- package/dist/lib/hosts/remote-os.js +0 -22
- package/dist/lib/hosts/remote-session-id.d.ts +0 -22
- package/dist/lib/hosts/remote-session-id.js +0 -24
- package/dist/lib/hosts/routing-flag.d.ts +0 -21
- package/dist/lib/hosts/routing-flag.js +0 -21
- package/dist/lib/hosts/run-target.d.ts +0 -53
- package/dist/lib/hosts/run-target.js +0 -56
- package/dist/lib/hosts/session-index.d.ts +1 -53
- package/dist/lib/hosts/session-index.js +2 -59
- package/dist/lib/hosts/session-marker.d.ts +0 -31
- package/dist/lib/hosts/session-marker.js +0 -32
- package/dist/lib/hosts/ssh-config.d.ts +0 -25
- package/dist/lib/hosts/ssh-config.js +1 -32
- package/dist/lib/hosts/tasks.d.ts +0 -54
- package/dist/lib/hosts/tasks.js +0 -35
- package/dist/lib/hosts/types.d.ts +0 -39
- package/dist/lib/hosts/types.js +0 -22
- package/dist/lib/humans.d.ts +0 -21
- package/dist/lib/humans.js +0 -30
- package/dist/lib/identity/client.d.ts +1 -35
- package/dist/lib/identity/client.js +3 -29
- package/dist/lib/identity/index.d.ts +3 -27
- package/dist/lib/identity/index.js +8 -24
- package/dist/lib/import.d.ts +0 -104
- package/dist/lib/import.js +1 -137
- package/dist/lib/installations/active-check.d.ts +0 -53
- package/dist/lib/installations/active-check.js +0 -49
- package/dist/lib/installations/index.d.ts +0 -9
- package/dist/lib/installations/index.js +0 -9
- package/dist/lib/installations/installation-lock.js +0 -8
- package/dist/lib/installations/launch-gate.d.ts +0 -56
- package/dist/lib/installations/launch-gate.js +0 -83
- package/dist/lib/installations/migrate.d.ts +0 -100
- package/dist/lib/installations/migrate.js +105 -572
- package/dist/lib/installations/native-command.d.ts +0 -1
- package/dist/lib/installations/native-command.js +0 -6
- package/dist/lib/installations/resolve.d.ts +0 -24
- package/dist/lib/installations/resolve.js +0 -24
- package/dist/lib/installations/shims.d.ts +0 -395
- package/dist/lib/installations/shims.js +30 -957
- package/dist/lib/installations/store.d.ts +0 -199
- package/dist/lib/installations/store.js +1 -297
- package/dist/lib/installations/strategies.d.ts +0 -44
- package/dist/lib/installations/strategies.js +0 -87
- package/dist/lib/installations/types.d.ts +1 -67
- package/dist/lib/installations/types.js +0 -6
- package/dist/lib/installations/update-cancellation.d.ts +0 -74
- package/dist/lib/installations/update-cancellation.js +0 -74
- package/dist/lib/installations/update-policy.d.ts +0 -57
- package/dist/lib/installations/update-policy.js +0 -62
- package/dist/lib/installations/update-runtime.d.ts +0 -88
- package/dist/lib/installations/update-runtime.js +1 -127
- package/dist/lib/installations/update.d.ts +0 -53
- package/dist/lib/installations/update.js +0 -95
- package/dist/lib/installations/versions.d.ts +0 -310
- package/dist/lib/installations/versions.js +14 -837
- package/dist/lib/isolation-boundary-report.d.ts +0 -7
- package/dist/lib/isolation-boundary-report.js +0 -7
- package/dist/lib/launch-identity.d.ts +0 -8
- package/dist/lib/launch-identity.js +0 -8
- package/dist/lib/linear-autoclose.d.ts +0 -25
- package/dist/lib/linear-autoclose.js +0 -19
- package/dist/lib/linear-cache.d.ts +0 -57
- package/dist/lib/linear-cache.js +1 -81
- package/dist/lib/linear-project-counts.d.ts +0 -83
- package/dist/lib/linear-project-counts.js +2 -64
- package/dist/lib/linear-projects.d.ts +0 -62
- package/dist/lib/linear-projects.js +0 -85
- package/dist/lib/linear-rate-limit.d.ts +0 -21
- package/dist/lib/linear-rate-limit.js +1 -93
- package/dist/lib/linux-userns.d.ts +1 -42
- package/dist/lib/linux-userns.js +0 -47
- package/dist/lib/lock-compromise.d.ts +0 -7
- package/dist/lib/lock-compromise.js +0 -7
- package/dist/lib/log-follow.d.ts +0 -2
- package/dist/lib/log-follow.js +5 -15
- package/dist/lib/loop.d.ts +0 -106
- package/dist/lib/loop.js +0 -135
- package/dist/lib/machine-id.d.ts +0 -19
- package/dist/lib/machine-id.js +0 -19
- package/dist/lib/mailbox-gc.d.ts +0 -7
- package/dist/lib/mailbox-gc.js +0 -25
- package/dist/lib/mailbox-target.d.ts +0 -31
- package/dist/lib/mailbox-target.js +0 -27
- package/dist/lib/mailbox.d.ts +0 -77
- package/dist/lib/mailbox.js +5 -105
- package/dist/lib/manifest.d.ts +0 -4
- package/dist/lib/manifest.js +0 -36
- package/dist/lib/markdown.d.ts +0 -3
- package/dist/lib/markdown.js +0 -9
- package/dist/lib/mcp-registry.d.ts +1 -50
- package/dist/lib/mcp-registry.js +0 -64
- package/dist/lib/mcp.d.ts +0 -115
- package/dist/lib/mcp.js +3 -199
- package/dist/lib/memory-cache.d.ts +0 -11
- package/dist/lib/memory-cache.js +0 -9
- package/dist/lib/memory.d.ts +0 -52
- package/dist/lib/memory.js +12 -74
- package/dist/lib/menubar/download-menubar.d.ts +0 -35
- package/dist/lib/menubar/download-menubar.js +0 -38
- package/dist/lib/menubar/install-menubar.d.ts +0 -405
- package/dist/lib/menubar/install-menubar.js +25 -667
- package/dist/lib/menubar/migrate-prefs.d.ts +0 -47
- package/dist/lib/menubar/migrate-prefs.js +1 -70
- package/dist/lib/menubar/notify-desktop.d.ts +0 -82
- package/dist/lib/menubar/notify-desktop.js +0 -68
- package/dist/lib/menubar/resolve-version.d.ts +0 -41
- package/dist/lib/menubar/resolve-version.js +2 -44
- package/dist/lib/menubar/snapshot.d.ts +13 -66
- package/dist/lib/menubar/snapshot.js +45 -39
- package/dist/lib/merged-resources.d.ts +0 -10
- package/dist/lib/merged-resources.js +0 -10
- package/dist/lib/migrate-fold.d.ts +0 -31
- package/dist/lib/migrate-fold.js +6 -38
- package/dist/lib/model-tier-overrides.d.ts +0 -30
- package/dist/lib/model-tier-overrides.js +0 -14
- package/dist/lib/model-tiers.d.ts +0 -43
- package/dist/lib/model-tiers.js +5 -78
- package/dist/lib/models.d.ts +0 -145
- package/dist/lib/models.js +3 -333
- package/dist/lib/monitors/config.d.ts +0 -187
- package/dist/lib/monitors/config.js +4 -101
- package/dist/lib/monitors/dispatch.d.ts +0 -22
- package/dist/lib/monitors/dispatch.js +0 -35
- package/dist/lib/monitors/engine.d.ts +1 -53
- package/dist/lib/monitors/engine.js +17 -106
- package/dist/lib/monitors/fingerprint.d.ts +0 -43
- package/dist/lib/monitors/fingerprint.js +0 -57
- package/dist/lib/monitors/pid-watch.d.ts +0 -31
- package/dist/lib/monitors/pid-watch.js +0 -31
- package/dist/lib/monitors/remote.d.ts +0 -52
- package/dist/lib/monitors/remote.js +0 -42
- package/dist/lib/monitors/sources/command.d.ts +2 -9
- package/dist/lib/monitors/sources/command.js +13 -34
- package/dist/lib/monitors/sources/device.d.ts +0 -10
- package/dist/lib/monitors/sources/device.js +0 -14
- package/dist/lib/monitors/sources/failure.d.ts +0 -27
- package/dist/lib/monitors/sources/failure.js +0 -27
- package/dist/lib/monitors/sources/file.d.ts +0 -10
- package/dist/lib/monitors/sources/file.js +0 -11
- package/dist/lib/monitors/sources/http.d.ts +0 -7
- package/dist/lib/monitors/sources/http.js +0 -9
- package/dist/lib/monitors/sources/index.d.ts +0 -9
- package/dist/lib/monitors/sources/index.js +0 -9
- package/dist/lib/monitors/sources/poll.d.ts +0 -8
- package/dist/lib/monitors/sources/poll.js +0 -8
- package/dist/lib/monitors/sources/types.d.ts +0 -18
- package/dist/lib/monitors/sources/types.js +0 -8
- package/dist/lib/monitors/sources/webhook.d.ts +0 -7
- package/dist/lib/monitors/sources/webhook.js +0 -7
- package/dist/lib/monitors/sources/ws.d.ts +0 -10
- package/dist/lib/monitors/sources/ws.js +3 -13
- package/dist/lib/monitors/state.d.ts +0 -132
- package/dist/lib/monitors/state.js +2 -86
- package/dist/lib/native-accounts.d.ts +0 -32
- package/dist/lib/native-accounts.js +0 -17
- package/dist/lib/net-close.d.ts +0 -9
- package/dist/lib/net-close.js +0 -5
- package/dist/lib/notify.d.ts +0 -47
- package/dist/lib/notify.js +0 -30
- package/dist/lib/onepassword.d.ts +0 -14
- package/dist/lib/onepassword.js +0 -12
- package/dist/lib/open-url.d.ts +0 -38
- package/dist/lib/open-url.js +1 -69
- package/dist/lib/openclaw-keychain.js +2 -7
- package/dist/lib/operator.d.ts +0 -9
- package/dist/lib/operator.js +0 -34
- package/dist/lib/origin-machine.d.ts +0 -16
- package/dist/lib/origin-machine.js +0 -16
- package/dist/lib/output/git-output.d.ts +0 -31
- package/dist/lib/output/git-output.js +4 -43
- package/dist/lib/overdue.d.ts +0 -35
- package/dist/lib/overdue.js +0 -60
- package/dist/lib/owner-message.d.ts +0 -20
- package/dist/lib/owner-message.js +1 -40
- package/dist/lib/packages/output-home.d.ts +0 -28
- package/dist/lib/packages/output-home.js +0 -114
- package/dist/lib/paths.d.ts +0 -26
- package/dist/lib/paths.js +1 -27
- package/dist/lib/percentile.d.ts +0 -11
- package/dist/lib/percentile.js +0 -11
- package/dist/lib/perf/db.d.ts +0 -16
- package/dist/lib/perf/db.js +3 -32
- package/dist/lib/perf/spool.d.ts +0 -12
- package/dist/lib/perf/spool.js +0 -13
- package/dist/lib/perf/types.d.ts +0 -26
- package/dist/lib/perf/types.js +0 -1
- package/dist/lib/permissions-registry.d.ts +0 -48
- package/dist/lib/permissions-registry.js +0 -108
- package/dist/lib/permissions.d.ts +0 -215
- package/dist/lib/permissions.js +4 -407
- package/dist/lib/picker.d.ts +0 -124
- package/dist/lib/picker.js +0 -140
- package/dist/lib/placement.d.ts +0 -57
- package/dist/lib/placement.js +0 -47
- package/dist/lib/platform/exec.d.ts +0 -73
- package/dist/lib/platform/exec.js +0 -80
- package/dist/lib/platform/index.d.ts +0 -14
- package/dist/lib/platform/index.js +0 -14
- package/dist/lib/platform/ipc.d.ts +0 -10
- package/dist/lib/platform/ipc.js +0 -13
- package/dist/lib/platform/links.d.ts +0 -14
- package/dist/lib/platform/links.js +0 -25
- package/dist/lib/platform/paths.d.ts +0 -48
- package/dist/lib/platform/paths.js +0 -52
- package/dist/lib/platform/posixpath.d.ts +0 -18
- package/dist/lib/platform/posixpath.js +0 -62
- package/dist/lib/platform/process.d.ts +0 -67
- package/dist/lib/platform/process.js +5 -99
- package/dist/lib/platform/winpath.d.ts +0 -50
- package/dist/lib/platform/winpath.js +0 -81
- package/dist/lib/plugins/plugin-marketplace.d.ts +0 -165
- package/dist/lib/plugins/plugin-marketplace.js +10 -238
- package/dist/lib/plugins/plugins.d.ts +0 -238
- package/dist/lib/plugins/plugins.js +20 -454
- package/dist/lib/plugins/skills.d.ts +0 -86
- package/dist/lib/plugins/skills.js +1 -139
- package/dist/lib/pr-land-detach.d.ts +0 -17
- package/dist/lib/pr-land-detach.js +0 -30
- package/dist/lib/pricing/cost.d.ts +0 -29
- package/dist/lib/pricing/cost.js +0 -38
- package/dist/lib/pricing/index.d.ts +0 -6
- package/dist/lib/pricing/index.js +0 -6
- package/dist/lib/pricing/table.d.ts +0 -8
- package/dist/lib/pricing/table.js +3 -56
- package/dist/lib/probe.d.ts +0 -5
- package/dist/lib/probe.js +0 -40
- package/dist/lib/profiles-presets.d.ts +0 -20
- package/dist/lib/profiles-presets.js +1 -36
- package/dist/lib/profiles.d.ts +0 -185
- package/dist/lib/profiles.js +1 -158
- package/dist/lib/project-doctor.d.ts +0 -29
- package/dist/lib/project-doctor.js +0 -26
- package/dist/lib/project-focus.d.ts +0 -41
- package/dist/lib/project-focus.js +0 -49
- package/dist/lib/project-import.d.ts +0 -41
- package/dist/lib/project-import.js +0 -36
- package/dist/lib/project-key.d.ts +0 -65
- package/dist/lib/project-key.js +0 -70
- package/dist/lib/project-launch.d.ts +0 -49
- package/dist/lib/project-launch.js +2 -91
- package/dist/lib/project-probe.d.ts +0 -86
- package/dist/lib/project-probe.js +1 -88
- package/dist/lib/project-pull.d.ts +0 -96
- package/dist/lib/project-pull.js +0 -122
- package/dist/lib/project-resources.d.ts +0 -44
- package/dist/lib/project-resources.js +7 -171
- package/dist/lib/project-root.d.ts +0 -95
- package/dist/lib/project-root.js +0 -101
- package/dist/lib/project-schedule.d.ts +0 -43
- package/dist/lib/project-schedule.js +0 -52
- package/dist/lib/project-status.d.ts +0 -108
- package/dist/lib/project-status.js +0 -117
- package/dist/lib/projects.d.ts +0 -197
- package/dist/lib/projects.js +1 -213
- package/dist/lib/pwsh.d.ts +0 -41
- package/dist/lib/pwsh.js +0 -51
- package/dist/lib/quick-todo.d.ts +84 -0
- package/dist/lib/quick-todo.js +243 -0
- package/dist/lib/reconcile-and-repair.d.ts +0 -78
- package/dist/lib/reconcile-and-repair.js +3 -66
- package/dist/lib/redact.d.ts +0 -29
- package/dist/lib/redact.js +0 -54
- package/dist/lib/refresh-coordinator.d.ts +0 -15
- package/dist/lib/refresh-coordinator.js +0 -10
- package/dist/lib/refresh.d.ts +0 -39
- package/dist/lib/refresh.js +0 -45
- package/dist/lib/registry.d.ts +0 -65
- package/dist/lib/registry.js +0 -127
- package/dist/lib/reminders.d.ts +0 -21
- package/dist/lib/reminders.js +0 -30
- package/dist/lib/remote-agents-json.d.ts +0 -44
- package/dist/lib/remote-agents-json.js +1 -44
- package/dist/lib/reserved-stores.d.ts +0 -28
- package/dist/lib/reserved-stores.js +2 -28
- package/dist/lib/resource-aliases.d.ts +0 -12
- package/dist/lib/resource-aliases.js +0 -12
- package/dist/lib/resource-content-diff.d.ts +0 -28
- package/dist/lib/resource-content-diff.js +7 -34
- package/dist/lib/resource-inventory.d.ts +0 -51
- package/dist/lib/resource-inventory.js +0 -45
- package/dist/lib/resource-patterns.d.ts +0 -32
- package/dist/lib/resource-patterns.js +0 -34
- package/dist/lib/resource-profiles.d.ts +0 -7
- package/dist/lib/resource-profiles.js +0 -11
- package/dist/lib/resources/types.d.ts +0 -50
- package/dist/lib/resources/types.js +0 -7
- package/dist/lib/resources/workflows.d.ts +0 -7
- package/dist/lib/resources/workflows.js +0 -13
- package/dist/lib/resources.d.ts +0 -65
- package/dist/lib/resources.js +0 -78
- package/dist/lib/routers.d.ts +0 -67
- package/dist/lib/routers.js +0 -60
- package/dist/lib/routine-activation.d.ts +0 -23
- package/dist/lib/routine-activation.js +0 -24
- package/dist/lib/routine-context.d.ts +1 -91
- package/dist/lib/routine-context.js +0 -107
- package/dist/lib/routine-notify-owner.d.ts +0 -79
- package/dist/lib/routine-notify-owner.js +1 -103
- package/dist/lib/routine-notify.d.ts +0 -70
- package/dist/lib/routine-notify.js +1 -75
- package/dist/lib/routine-process-cleanup.d.ts +0 -1
- package/dist/lib/routine-process-cleanup.js +1 -4
- package/dist/lib/routine-readiness.d.ts +0 -63
- package/dist/lib/routine-readiness.js +4 -86
- package/dist/lib/routines-format.d.ts +0 -40
- package/dist/lib/routines-format.js +0 -67
- package/dist/lib/routines-placement.d.ts +0 -33
- package/dist/lib/routines-placement.js +0 -40
- package/dist/lib/routines-project.d.ts +0 -57
- package/dist/lib/routines-project.js +6 -80
- package/dist/lib/rules/compile.d.ts +0 -66
- package/dist/lib/rules/compile.js +6 -118
- package/dist/lib/rules/compose.d.ts +0 -56
- package/dist/lib/rules/compose.js +2 -83
- package/dist/lib/rules/rules.d.ts +0 -23
- package/dist/lib/rules/rules.js +0 -35
- package/dist/lib/rules/run-sync.d.ts +0 -16
- package/dist/lib/rules/run-sync.js +1 -44
- package/dist/lib/run-config.d.ts +0 -7
- package/dist/lib/run-config.js +0 -8
- package/dist/lib/run-defaults.d.ts +0 -14
- package/dist/lib/run-defaults.js +0 -14
- package/dist/lib/run-notify.d.ts +0 -18
- package/dist/lib/run-notify.js +0 -36
- package/dist/lib/run-trace-sync.d.ts +0 -21
- package/dist/lib/run-trace-sync.js +2 -66
- package/dist/lib/rush-session.d.ts +0 -26
- package/dist/lib/rush-session.js +0 -28
- package/dist/lib/sandbox.d.ts +0 -45
- package/dist/lib/sandbox.js +5 -93
- package/dist/lib/scheduler.d.ts +0 -28
- package/dist/lib/scheduler.js +0 -45
- package/dist/lib/scheduling/routines.d.ts +0 -652
- package/dist/lib/scheduling/routines.js +8 -475
- package/dist/lib/secrets-cli.d.ts +3 -8
- package/dist/lib/secrets-cli.js +1 -19
- package/dist/lib/secrets-client.d.ts +0 -117
- package/dist/lib/secrets-client.js +4 -275
- package/dist/lib/secrets-policy.d.ts +0 -142
- package/dist/lib/secrets-policy.js +4 -237
- package/dist/lib/secrets-types.d.ts +0 -87
- package/dist/lib/secrets-types.js +0 -13
- package/dist/lib/self-heal/checks/hook-manifest.js +0 -25
- package/dist/lib/self-heal/checks/hook-runtime.js +0 -5
- package/dist/lib/self-heal/checks/install-staging.d.ts +0 -1
- package/dist/lib/self-heal/checks/install-staging.js +1 -28
- package/dist/lib/self-heal/checks/menubar-helper.js +0 -5
- package/dist/lib/self-heal/checks/path.js +0 -9
- package/dist/lib/self-heal/checks/resources.js +0 -5
- package/dist/lib/self-heal/checks/shadowing.js +2 -16
- package/dist/lib/self-heal/checks/shims.js +0 -14
- package/dist/lib/self-heal/child.d.ts +12 -0
- package/dist/lib/self-heal/child.js +23 -0
- package/dist/lib/self-heal/registry.d.ts +0 -9
- package/dist/lib/self-heal/registry.js +0 -16
- package/dist/lib/self-heal/types.d.ts +0 -12
- package/dist/lib/self-heal/types.js +0 -15
- package/dist/lib/self-update.d.ts +0 -312
- package/dist/lib/self-update.js +9 -360
- package/dist/lib/service-manifest.d.ts +0 -39
- package/dist/lib/service-manifest.js +0 -72
- package/dist/lib/session/active.d.ts +13 -869
- package/dist/lib/session/active.js +17 -976
- package/dist/lib/session/actor-sidecar.d.ts +1 -32
- package/dist/lib/session/actor-sidecar.js +1 -41
- package/dist/lib/session/bookmarks.d.ts +0 -33
- package/dist/lib/session/bookmarks.js +0 -37
- package/dist/lib/session/bundle.d.ts +0 -86
- package/dist/lib/session/bundle.js +0 -54
- package/dist/lib/session/claude-accounts.d.ts +0 -40
- package/dist/lib/session/claude-accounts.js +0 -49
- package/dist/lib/session/cloud.d.ts +1 -23
- package/dist/lib/session/cloud.js +0 -26
- package/dist/lib/session/db.d.ts +5 -658
- package/dist/lib/session/db.js +22 -1443
- package/dist/lib/session/detached.d.ts +0 -21
- package/dist/lib/session/detached.js +0 -29
- package/dist/lib/session/discover.d.ts +3 -420
- package/dist/lib/session/discover.js +30 -1123
- package/dist/lib/session/fork.d.ts +1 -41
- package/dist/lib/session/fork.js +0 -19
- package/dist/lib/session/ghostty-tabs.d.ts +0 -24
- package/dist/lib/session/ghostty-tabs.js +0 -37
- package/dist/lib/session/glance-files.d.ts +19 -0
- package/dist/lib/session/glance-files.js +258 -0
- package/dist/lib/session/hook-sessions.d.ts +0 -33
- package/dist/lib/session/hook-sessions.js +4 -99
- package/dist/lib/session/host-link.d.ts +1 -94
- package/dist/lib/session/host-link.js +1 -81
- package/dist/lib/session/inject-target.d.ts +8 -0
- package/dist/lib/session/inject-target.js +32 -0
- package/dist/lib/session/inject.d.ts +0 -15
- package/dist/lib/session/inject.js +0 -15
- package/dist/lib/session/live-metadata.d.ts +1 -34
- package/dist/lib/session/live-metadata.js +1 -73
- package/dist/lib/session/local-tmux-attach.d.ts +0 -37
- package/dist/lib/session/local-tmux-attach.js +1 -76
- package/dist/lib/session/migrate-targets.d.ts +0 -46
- package/dist/lib/session/migrate-targets.js +0 -24
- package/dist/lib/session/migrations.d.ts +0 -12
- package/dist/lib/session/migrations.js +1 -20
- package/dist/lib/session/mirror.d.ts +0 -32
- package/dist/lib/session/mirror.js +0 -77
- package/dist/lib/session/origin-machine.js +0 -3
- package/dist/lib/session/pid-registry.d.ts +0 -80
- package/dist/lib/session/pid-registry.js +2 -81
- package/dist/lib/session/presence.d.ts +0 -39
- package/dist/lib/session/presence.js +2 -52
- package/dist/lib/session/process-view.d.ts +0 -11
- package/dist/lib/session/process-view.js +0 -25
- package/dist/lib/session/projection.d.ts +0 -3
- package/dist/lib/session/projection.js +0 -10
- package/dist/lib/session/provenance.d.ts +1 -37
- package/dist/lib/session/provenance.js +0 -69
- package/dist/lib/session/recovery.d.ts +1 -40
- package/dist/lib/session/recovery.js +2 -80
- package/dist/lib/session/relative-time.js +0 -3
- package/dist/lib/session/remote/peer-stream.d.ts +0 -42
- package/dist/lib/session/remote/peer-stream.js +0 -64
- package/dist/lib/session/remote/remote-bundle.d.ts +0 -6
- package/dist/lib/session/remote/remote-bundle.js +0 -21
- package/dist/lib/session/remote/remote-list.d.ts +1 -110
- package/dist/lib/session/remote/remote-list.js +5 -139
- package/dist/lib/session/remote/remote.d.ts +0 -98
- package/dist/lib/session/remote/remote.js +3 -119
- package/dist/lib/session/remote/watch.d.ts +1 -34
- package/dist/lib/session/remote/watch.js +12 -72
- package/dist/lib/session/remote-active.d.ts +0 -35
- package/dist/lib/session/remote-active.js +0 -48
- package/dist/lib/session/remote-bundle.js +0 -2
- package/dist/lib/session/remote-list.js +0 -2
- package/dist/lib/session/remote-preview-cache.d.ts +0 -7
- package/dist/lib/session/remote-preview-cache.js +1 -76
- package/dist/lib/session/remote.js +0 -2
- package/dist/lib/session/resume-command.d.ts +0 -6
- package/dist/lib/session/resume-command.js +0 -6
- package/dist/lib/session/resume-owner.d.ts +1 -52
- package/dist/lib/session/resume-owner.js +0 -56
- package/dist/lib/session/run-names.d.ts +0 -24
- package/dist/lib/session/run-names.js +0 -26
- package/dist/lib/session/session-cache.d.ts +2 -146
- package/dist/lib/session/session-cache.js +26 -203
- package/dist/lib/session/short-id.js +0 -3
- package/dist/lib/session/sync/agents.d.ts +0 -68
- package/dist/lib/session/sync/agents.js +0 -0
- package/dist/lib/session/sync/backend.d.ts +0 -39
- package/dist/lib/session/sync/backend.js +0 -45
- package/dist/lib/session/sync/config.d.ts +0 -27
- package/dist/lib/session/sync/config.js +0 -56
- package/dist/lib/session/sync/managed-config.d.ts +0 -17
- package/dist/lib/session/sync/managed-config.js +0 -17
- package/dist/lib/session/sync/managed-key.d.ts +0 -38
- package/dist/lib/session/sync/managed-key.js +1 -42
- package/dist/lib/session/sync/net-client.d.ts +0 -36
- package/dist/lib/session/sync/net-client.js +0 -30
- package/dist/lib/session/sync/provision.d.ts +0 -2
- package/dist/lib/session/sync/provision.js +0 -13
- package/dist/lib/session/sync/r2.d.ts +0 -20
- package/dist/lib/session/sync/r2.js +0 -20
- package/dist/lib/session/sync/transcript-crypto.d.ts +0 -37
- package/dist/lib/session/sync/transcript-crypto.js +5 -37
- package/dist/lib/session/sync/worker-template.d.ts +0 -5
- package/dist/lib/session/sync/worker-template.js +0 -40
- package/dist/lib/session/testdata/pid-registry-namespace.js +0 -2
- package/dist/lib/session/testdata/process-view-private.js +0 -1
- package/dist/lib/session/throughput.d.ts +0 -24
- package/dist/lib/session/throughput.js +1 -25
- package/dist/lib/session/timeline-pass.d.ts +1 -63
- package/dist/lib/session/timeline-pass.js +161 -148
- package/dist/lib/session/title.d.ts +0 -182
- package/dist/lib/session/title.js +0 -139
- package/dist/lib/session/tool-index.d.ts +2 -21
- package/dist/lib/session/tool-index.js +3 -75
- package/dist/lib/session/tool-store.d.ts +2 -48
- package/dist/lib/session/tool-store.js +1 -33
- package/dist/lib/session/viewing-in.d.ts +0 -67
- package/dist/lib/session/viewing-in.js +1 -71
- package/dist/lib/session/watch.js +0 -2
- package/dist/lib/session/width.js +0 -3
- package/dist/lib/sessions-client.d.ts +0 -46
- package/dist/lib/sessions-client.js +36 -113
- package/dist/lib/settings-manifest.d.ts +1 -17
- package/dist/lib/settings-manifest.js +4 -57
- package/dist/lib/setup-tool-install.d.ts +0 -1
- package/dist/lib/setup-tool-install.js +2 -7
- package/dist/lib/setup-tool-status.d.ts +0 -3
- package/dist/lib/setup-tool-status.js +4 -14
- package/dist/lib/sha256-asset.d.ts +0 -20
- package/dist/lib/sha256-asset.js +0 -20
- package/dist/lib/share-runtime.d.ts +0 -10
- package/dist/lib/share-runtime.js +1 -27
- package/dist/lib/shim-heal.d.ts +0 -15
- package/dist/lib/shim-heal.js +3 -29
- package/dist/lib/signin-badge.d.ts +0 -72
- package/dist/lib/signin-badge.js +0 -86
- package/dist/lib/sink-format.d.ts +0 -32
- package/dist/lib/sink-format.js +0 -14
- package/dist/lib/smart-launch.d.ts +0 -75
- package/dist/lib/smart-launch.js +1 -83
- package/dist/lib/snapshot.d.ts +0 -46
- package/dist/lib/snapshot.js +5 -31
- package/dist/lib/spinner.d.ts +0 -37
- package/dist/lib/spinner.js +0 -37
- package/dist/lib/sqlite.d.ts +0 -13
- package/dist/lib/sqlite.js +3 -71
- package/dist/lib/ssh-exec.d.ts +0 -209
- package/dist/lib/ssh-exec.js +11 -248
- package/dist/lib/ssh-tunnel.d.ts +0 -43
- package/dist/lib/ssh-tunnel.js +2 -48
- package/dist/lib/staleness/checkers/commands.d.ts +0 -4
- package/dist/lib/staleness/checkers/commands.js +0 -4
- package/dist/lib/staleness/checkers/hooks.d.ts +0 -10
- package/dist/lib/staleness/checkers/hooks.js +0 -15
- package/dist/lib/staleness/checkers/mcp.d.ts +0 -9
- package/dist/lib/staleness/checkers/mcp.js +0 -9
- package/dist/lib/staleness/checkers/permissions.d.ts +0 -12
- package/dist/lib/staleness/checkers/permissions.js +0 -13
- package/dist/lib/staleness/checkers/plugins.d.ts +0 -8
- package/dist/lib/staleness/checkers/plugins.js +0 -8
- package/dist/lib/staleness/checkers/rules.d.ts +0 -15
- package/dist/lib/staleness/checkers/rules.js +0 -26
- package/dist/lib/staleness/checkers/skills.d.ts +0 -4
- package/dist/lib/staleness/checkers/skills.js +0 -4
- package/dist/lib/staleness/checkers/subagents.d.ts +0 -9
- package/dist/lib/staleness/checkers/subagents.js +0 -9
- package/dist/lib/staleness/checkers/types.d.ts +0 -34
- package/dist/lib/staleness/checkers/types.js +0 -19
- package/dist/lib/staleness/checkers/workflows.d.ts +0 -7
- package/dist/lib/staleness/checkers/workflows.js +0 -7
- package/dist/lib/staleness/detectors/commands.js +0 -17
- package/dist/lib/staleness/detectors/hooks.js +1 -6
- package/dist/lib/staleness/detectors/mcp.js +0 -4
- package/dist/lib/staleness/detectors/permissions.js +10 -23
- package/dist/lib/staleness/detectors/rules.js +0 -6
- package/dist/lib/staleness/detectors/skills.d.ts +0 -1
- package/dist/lib/staleness/detectors/skills.js +1 -12
- package/dist/lib/staleness/detectors/types.d.ts +0 -10
- package/dist/lib/staleness/fingerprint.d.ts +0 -19
- package/dist/lib/staleness/fingerprint.js +0 -35
- package/dist/lib/staleness/index.d.ts +0 -28
- package/dist/lib/staleness/index.js +1 -45
- package/dist/lib/staleness/layers.d.ts +0 -23
- package/dist/lib/staleness/layers.js +0 -34
- package/dist/lib/staleness/prune.d.ts +0 -71
- package/dist/lib/staleness/prune.js +2 -27
- package/dist/lib/staleness/registry.d.ts +0 -10
- package/dist/lib/staleness/registry.js +3 -33
- package/dist/lib/staleness/types.d.ts +0 -36
- package/dist/lib/staleness/types.js +0 -5
- package/dist/lib/staleness/writers/commands.js +1 -48
- package/dist/lib/staleness/writers/hooks.js +1 -18
- package/dist/lib/staleness/writers/kinds.d.ts +0 -12
- package/dist/lib/staleness/writers/kinds.js +0 -1
- package/dist/lib/staleness/writers/lazy-map.d.ts +0 -11
- package/dist/lib/staleness/writers/mcp.js +0 -13
- package/dist/lib/staleness/writers/plugins.js +0 -4
- package/dist/lib/staleness/writers/rules.d.ts +0 -1
- package/dist/lib/staleness/writers/rules.js +1 -19
- package/dist/lib/staleness/writers/skills.js +3 -14
- package/dist/lib/staleness/writers/sources.d.ts +0 -11
- package/dist/lib/staleness/writers/sources.js +0 -32
- package/dist/lib/staleness/writers/subagents.js +0 -16
- package/dist/lib/staleness/writers/types.d.ts +0 -58
- package/dist/lib/staleness/writers/workflows.js +1 -1
- package/dist/lib/standalone-tools.d.ts +24 -0
- package/dist/lib/standalone-tools.js +58 -0
- package/dist/lib/star-nudge.d.ts +0 -32
- package/dist/lib/star-nudge.js +2 -36
- package/dist/lib/startup/command-registry.d.ts +0 -45
- package/dist/lib/startup/command-registry.js +1 -46
- package/dist/lib/startup/dev-build.d.ts +0 -9
- package/dist/lib/startup/dev-build.js +1 -42
- package/dist/lib/startup/root-command.d.ts +0 -19
- package/dist/lib/startup/root-command.js +0 -19
- package/dist/lib/startup/spellcheck.d.ts +0 -13
- package/dist/lib/startup/spellcheck.js +0 -13
- package/dist/lib/state.d.ts +0 -376
- package/dist/lib/state.js +19 -737
- package/dist/lib/storage/selection.d.ts +0 -40
- package/dist/lib/storage/selection.js +0 -29
- package/dist/lib/subagents-registry.d.ts +0 -56
- package/dist/lib/subagents-registry.js +0 -99
- package/dist/lib/subagents.d.ts +0 -128
- package/dist/lib/subagents.js +1 -158
- package/dist/lib/summarizer/config.d.ts +0 -37
- package/dist/lib/summarizer/config.js +0 -37
- package/dist/lib/summarizer/pass.d.ts +0 -20
- package/dist/lib/summarizer/pass.js +1 -34
- package/dist/lib/summarizer/summarize.d.ts +1 -49
- package/dist/lib/summarizer/summarize.js +0 -35
- package/dist/lib/sync-passphrase.d.ts +0 -16
- package/dist/lib/sync-passphrase.js +1 -18
- package/dist/lib/sync-status.d.ts +0 -72
- package/dist/lib/sync-status.js +0 -55
- package/dist/lib/sync-umbrella.d.ts +0 -54
- package/dist/lib/sync-umbrella.js +0 -48
- package/dist/lib/system-run-sync.d.ts +0 -5
- package/dist/lib/system-run-sync.js +1 -31
- package/dist/lib/teams/agents.d.ts +1 -444
- package/dist/lib/teams/agents.js +11 -871
- package/dist/lib/teams/api.d.ts +2 -52
- package/dist/lib/teams/api.js +4 -63
- package/dist/lib/teams/debug.d.ts +0 -6
- package/dist/lib/teams/debug.js +0 -6
- package/dist/lib/teams/delivery.d.ts +0 -41
- package/dist/lib/teams/delivery.js +0 -32
- package/dist/lib/teams/file_ops.d.ts +0 -11
- package/dist/lib/teams/file_ops.js +0 -11
- package/dist/lib/teams/forEach.d.ts +0 -76
- package/dist/lib/teams/forEach.js +1 -77
- package/dist/lib/teams/index.d.ts +1 -7
- package/dist/lib/teams/index.js +1 -7
- package/dist/lib/teams/parsers.d.ts +0 -4
- package/dist/lib/teams/parsers.js +0 -81
- package/dist/lib/teams/persistence.d.ts +0 -2
- package/dist/lib/teams/persistence.js +0 -12
- package/dist/lib/teams/placement-probe.d.ts +0 -12
- package/dist/lib/teams/placement-probe.js +1 -51
- package/dist/lib/teams/pr-watch.d.ts +0 -107
- package/dist/lib/teams/pr-watch.js +1 -107
- package/dist/lib/teams/registry.d.ts +0 -36
- package/dist/lib/teams/registry.js +0 -47
- package/dist/lib/teams/remoteWorktree.d.ts +0 -50
- package/dist/lib/teams/remoteWorktree.js +1 -96
- package/dist/lib/teams/scheduler.d.ts +0 -111
- package/dist/lib/teams/scheduler.js +2 -125
- package/dist/lib/teams/summarizer.d.ts +0 -22
- package/dist/lib/teams/summarizer.js +6 -50
- package/dist/lib/teams/supervisor.d.ts +0 -38
- package/dist/lib/teams/supervisor.js +0 -21
- package/dist/lib/teams/worktree.d.ts +0 -95
- package/dist/lib/teams/worktree.js +3 -110
- package/dist/lib/template.d.ts +0 -21
- package/dist/lib/template.js +0 -23
- package/dist/lib/term-client.d.ts +0 -26
- package/dist/lib/term-client.js +0 -48
- package/dist/lib/term-driver.d.ts +0 -5
- package/dist/lib/term-driver.js +0 -8
- package/dist/lib/terminal/backends/ghostty.d.ts +0 -2
- package/dist/lib/terminal/backends/ghostty.js +0 -12
- package/dist/lib/terminal/backends/index.d.ts +0 -17
- package/dist/lib/terminal/backends/index.js +0 -15
- package/dist/lib/terminal/backends/iterm.d.ts +0 -2
- package/dist/lib/terminal/backends/iterm.js +0 -10
- package/dist/lib/terminal/backends/terminal-app.d.ts +0 -10
- package/dist/lib/terminal/backends/terminal-app.js +0 -30
- package/dist/lib/terminal/backends/tmux.d.ts +0 -10
- package/dist/lib/terminal/backends/tmux.js +0 -2
- package/dist/lib/terminal/backends/vscodium-agent.d.ts +0 -25
- package/dist/lib/terminal/backends/vscodium-agent.js +0 -36
- package/dist/lib/terminal/engine.d.ts +0 -17
- package/dist/lib/terminal/engine.js +0 -10
- package/dist/lib/terminal/index.d.ts +0 -8
- package/dist/lib/terminal/inject.d.ts +1 -173
- package/dist/lib/terminal/inject.js +0 -146
- package/dist/lib/terminal/policy.d.ts +0 -8
- package/dist/lib/terminal/policy.js +0 -1
- package/dist/lib/terminal/preferred.d.ts +0 -66
- package/dist/lib/terminal/preferred.js +0 -30
- package/dist/lib/terminal/quote.d.ts +0 -8
- package/dist/lib/terminal/quote.js +0 -8
- package/dist/lib/terminal/resolve.d.ts +0 -46
- package/dist/lib/terminal/resolve.js +0 -30
- package/dist/lib/terminal/run-surface.d.ts +0 -56
- package/dist/lib/terminal/run-surface.js +0 -46
- package/dist/lib/terminal/shell.d.ts +0 -3
- package/dist/lib/terminal/shell.js +0 -13
- package/dist/lib/terminal/transport.d.ts +0 -14
- package/dist/lib/terminal/transport.js +1 -30
- package/dist/lib/terminal/types.d.ts +0 -40
- package/dist/lib/terminal/types.js +0 -10
- package/dist/lib/text/relative-time.d.ts +0 -36
- package/dist/lib/text/relative-time.js +0 -43
- package/dist/lib/text/short-id.d.ts +0 -16
- package/dist/lib/text/short-id.js +0 -16
- package/dist/lib/text/width.d.ts +0 -24
- package/dist/lib/text/width.js +10 -52
- package/dist/lib/tmux/binary.d.ts +0 -36
- package/dist/lib/tmux/binary.js +0 -28
- package/dist/lib/tmux/index.d.ts +0 -5
- package/dist/lib/tmux/index.js +0 -5
- package/dist/lib/tmux/orphan-reap.d.ts +0 -253
- package/dist/lib/tmux/orphan-reap.js +3 -299
- package/dist/lib/tmux/paths.d.ts +0 -14
- package/dist/lib/tmux/paths.js +0 -14
- package/dist/lib/tmux/session.d.ts +0 -263
- package/dist/lib/tmux/session.js +6 -344
- package/dist/lib/traces/backend.d.ts +0 -20
- package/dist/lib/traces/backend.js +0 -23
- package/dist/lib/traces/classify.d.ts +0 -20
- package/dist/lib/traces/classify.js +0 -7
- package/dist/lib/traces/insights.d.ts +1 -84
- package/dist/lib/traces/insights.js +0 -126
- package/dist/lib/traces/phenotype.d.ts +0 -69
- package/dist/lib/traces/phenotype.js +0 -150
- package/dist/lib/traces/provision.d.ts +0 -1
- package/dist/lib/traces/provision.js +0 -5
- package/dist/lib/traces/schema2-build.d.ts +3 -60
- package/dist/lib/traces/schema2-build.js +8 -149
- package/dist/lib/traces/schema2-danger.d.ts +0 -30
- package/dist/lib/traces/schema2-danger.js +1 -63
- package/dist/lib/traces/schema2.d.ts +0 -11
- package/dist/lib/traces/segments.d.ts +0 -44
- package/dist/lib/traces/segments.js +0 -65
- package/dist/lib/traces/sync.d.ts +2 -239
- package/dist/lib/traces/sync.js +15 -237
- package/dist/lib/traces/worker-template.d.ts +0 -3
- package/dist/lib/traces/worker-template.js +0 -29
- package/dist/lib/triggers/handlers.d.ts +0 -82
- package/dist/lib/triggers/handlers.js +0 -75
- package/dist/lib/triggers/webhook.d.ts +0 -158
- package/dist/lib/triggers/webhook.js +0 -143
- package/dist/lib/types.d.ts +0 -736
- package/dist/lib/types.js +0 -50
- package/dist/lib/uninstall.d.ts +0 -17
- package/dist/lib/uninstall.js +0 -75
- package/dist/lib/usage-backoff.d.ts +0 -20
- package/dist/lib/usage-backoff.js +3 -60
- package/dist/lib/usage-refresh.d.ts +0 -154
- package/dist/lib/usage-refresh.js +8 -212
- package/dist/lib/verbs.d.ts +0 -12
- package/dist/lib/verbs.js +0 -12
- package/dist/lib/version-duplicates.d.ts +0 -6
- package/dist/lib/version-duplicates.js +0 -6
- package/dist/lib/version.d.ts +0 -55
- package/dist/lib/version.js +1 -58
- package/dist/lib/view-types.d.ts +0 -48
- package/dist/lib/warn-unpushed.d.ts +0 -27
- package/dist/lib/warn-unpushed.js +1 -45
- package/dist/lib/watchdog/history.d.ts +0 -1
- package/dist/lib/watchdog/history.js +0 -3
- package/dist/lib/watchdog/index.js +0 -2
- package/dist/lib/watchdog/log.d.ts +0 -19
- package/dist/lib/watchdog/log.js +0 -34
- package/dist/lib/watchdog/read.d.ts +0 -27
- package/dist/lib/watchdog/read.js +3 -58
- package/dist/lib/watchdog/rotate.d.ts +0 -139
- package/dist/lib/watchdog/rotate.js +2 -151
- package/dist/lib/watchdog/runner.d.ts +0 -125
- package/dist/lib/watchdog/runner.js +3 -223
- package/dist/lib/watchdog/service.d.ts +0 -1
- package/dist/lib/watchdog/service.js +0 -2
- package/dist/lib/watchdog/watchdog-agent.d.ts +0 -31
- package/dist/lib/watchdog/watchdog-agent.js +0 -27
- package/dist/lib/watchdog/watchdog.d.ts +0 -7
- package/dist/lib/watchdog/watchdog.js +0 -10
- package/dist/lib/watchdog/watchdogTail.js +0 -7
- package/dist/lib/whats-new.d.ts +0 -10
- package/dist/lib/whats-new.js +0 -21
- package/dist/lib/workflows-registry.d.ts +0 -45
- package/dist/lib/workflows-registry.js +0 -60
- package/dist/lib/workflows.d.ts +0 -282
- package/dist/lib/workflows.js +3 -213
- package/dist/lib/worktree/held.d.ts +0 -89
- package/dist/lib/worktree/held.js +1 -103
- package/dist/lib/wrap.d.ts +0 -32
- package/dist/lib/wrap.js +0 -32
- package/dist/lib/yaml-io.d.ts +0 -45
- package/dist/lib/yaml-io.js +0 -47
- package/dist/session-tracker/dist/adapters/claude.js +0 -2
- package/dist/session-tracker/dist/hook.sh +4 -37
- package/dist/session-tracker/dist/index.d.ts +0 -7
- package/dist/session-tracker/dist/index.js +0 -5
- package/dist/session-tracker/dist/install-hook.d.ts +0 -5
- package/dist/session-tracker/dist/install-hook.js +1 -15
- package/dist/session-tracker/dist/prune-state.js +0 -4
- package/dist/session-tracker/dist/reader.js +0 -4
- package/dist/session-tracker/dist/state-file.d.ts +0 -3
- package/dist/session-tracker/dist/state-file.js +3 -8
- package/package.json +3 -4
- package/scripts/postinstall.js +8 -116
- package/dist/lib/session/artifacts.d.ts +0 -14
- package/dist/lib/session/artifacts.js +0 -101
- package/dist/lib/session/bash-command.d.ts +0 -63
- package/dist/lib/session/bash-command.js +0 -490
- package/dist/lib/session/digest.d.ts +0 -66
- package/dist/lib/session/digest.js +0 -328
- package/dist/lib/session/highlights.d.ts +0 -151
- package/dist/lib/session/highlights.js +0 -391
- package/dist/lib/session/insights.d.ts +0 -165
- package/dist/lib/session/insights.js +0 -563
- package/dist/lib/session/linear.d.ts +0 -19
- package/dist/lib/session/linear.js +0 -99
- package/dist/lib/session/parse.d.ts +0 -224
- package/dist/lib/session/parse.js +0 -2408
- package/dist/lib/session/prompt.d.ts +0 -213
- package/dist/lib/session/prompt.js +0 -601
- package/dist/lib/session/render.d.ts +0 -133
- package/dist/lib/session/render.js +0 -1047
- package/dist/lib/session/share-html.d.ts +0 -35
- package/dist/lib/session/share-html.js +0 -319
- package/dist/lib/session/shell-programs.d.ts +0 -33
- package/dist/lib/session/shell-programs.js +0 -380
- package/dist/lib/session/state.d.ts +0 -269
- package/dist/lib/session/state.js +0 -777
- package/dist/lib/session/stream-render.d.ts +0 -4
- package/dist/lib/session/stream-render.js +0 -131
- package/dist/lib/session/tail.d.ts +0 -88
- package/dist/lib/session/tail.js +0 -294
- package/dist/lib/session/team-filter.d.ts +0 -129
- package/dist/lib/session/team-filter.js +0 -269
- package/dist/lib/session/timeline.d.ts +0 -172
- package/dist/lib/session/timeline.js +0 -636
- package/dist/lib/session/tool-calls.d.ts +0 -132
- package/dist/lib/session/tool-calls.js +0 -674
- package/dist/lib/session/trajectory-compare.d.ts +0 -48
- package/dist/lib/session/trajectory-compare.js +0 -116
- package/dist/lib/session/trajectory-html.d.ts +0 -19
- package/dist/lib/session/trajectory-html.js +0 -771
- package/dist/lib/session/trajectory-lineage.d.ts +0 -93
- package/dist/lib/session/trajectory-lineage.js +0 -195
- package/dist/lib/session/trajectory-text.d.ts +0 -38
- package/dist/lib/session/trajectory-text.js +0 -284
- package/dist/lib/session/trajectory.d.ts +0 -145
- package/dist/lib/session/trajectory.js +0 -394
- package/dist/lib/session/types.d.ts +0 -627
- package/dist/lib/session/types.js +0 -43
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Account rotation across agent versions.
|
|
3
|
-
*
|
|
4
|
-
* Detects which installed versions have expired credentials and rotates
|
|
5
|
-
* authentication tokens so users maintain active sessions across version switches.
|
|
6
|
-
*/
|
|
7
1
|
import * as fs from 'fs';
|
|
8
2
|
import * as path from 'path';
|
|
9
3
|
import { isAgentId } from '../types.js';
|
|
@@ -28,13 +22,6 @@ function getRotateDir() {
|
|
|
28
22
|
return dir;
|
|
29
23
|
}
|
|
30
24
|
export const RUN_STRATEGIES = ['pinned', 'available', 'balanced'];
|
|
31
|
-
/**
|
|
32
|
-
* Return a run strategy when the input is valid, otherwise null.
|
|
33
|
-
*
|
|
34
|
-
* `'rotate'` is accepted as a deprecated alias for `'balanced'` so old yaml
|
|
35
|
-
* configs and `--strategy rotate` invocations keep working. The legacy alias
|
|
36
|
-
* normalizes to `'balanced'` and uses the weighted-random algorithm.
|
|
37
|
-
*/
|
|
38
25
|
export function normalizeRunStrategy(value) {
|
|
39
26
|
if (typeof value !== 'string')
|
|
40
27
|
return null;
|
|
@@ -42,7 +29,6 @@ export function normalizeRunStrategy(value) {
|
|
|
42
29
|
return 'balanced';
|
|
43
30
|
return RUN_STRATEGIES.includes(value) ? value : null;
|
|
44
31
|
}
|
|
45
|
-
/** Read project-local run strategy from the nearest agents.yaml, if present. */
|
|
46
32
|
function getProjectRunStrategy(agent, startPath) {
|
|
47
33
|
for (const runConfig of getProjectRunConfigs(startPath)) {
|
|
48
34
|
const strategy = normalizeRunStrategy(runConfig[agent]?.strategy);
|
|
@@ -51,28 +37,11 @@ function getProjectRunStrategy(agent, startPath) {
|
|
|
51
37
|
}
|
|
52
38
|
return null;
|
|
53
39
|
}
|
|
54
|
-
/**
|
|
55
|
-
* Resolve the configured strategy. Lookup order:
|
|
56
|
-
* 1. project-local agents.yaml (nearest to `startPath`)
|
|
57
|
-
* 2. ~/.agents/.system/agents.yaml
|
|
58
|
-
* 3. default: `balanced` (weighted-random across all healthy accounts by
|
|
59
|
-
* remaining headroom, skipping any that are currently rate-limited). A
|
|
60
|
-
* bare `agents run <agent>` — e.g. every new terminal the extension spawns
|
|
61
|
-
* — should spread load and never launch into a throttled account, rather
|
|
62
|
-
* than stick to the pinned default even when it's maxed.
|
|
63
|
-
*/
|
|
64
40
|
export function getConfiguredRunStrategy(agent, startPath = process.cwd()) {
|
|
65
41
|
return getProjectRunStrategy(agent, startPath)
|
|
66
42
|
?? normalizeRunStrategy(readMeta().run?.[agent]?.strategy)
|
|
67
43
|
?? 'balanced';
|
|
68
44
|
}
|
|
69
|
-
/**
|
|
70
|
-
* Whether an account may be rotated INTO right now. Defined in terms of
|
|
71
|
-
* {@link readinessFromCandidate} so the router's pick gate and the pre-flight
|
|
72
|
-
* warning can never disagree: an account is eligible iff its readiness is
|
|
73
|
-
* `ready` — signed in, not server-revoked, and not out of usage.
|
|
74
|
-
*/
|
|
75
|
-
/** Slot verdicts balanced/available will launch (PHNX-3940 T5). */
|
|
76
45
|
const LAUNCHABLE_SLOT_VERDICTS = new Set(['live', 'unverified']);
|
|
77
46
|
function isLaunchableSlotVerdict(verdict) {
|
|
78
47
|
return verdict !== null && LAUNCHABLE_SLOT_VERDICTS.has(verdict);
|
|
@@ -82,20 +51,6 @@ function isRotationEligible(candidate, nowMs = Date.now(), model) {
|
|
|
82
51
|
return false;
|
|
83
52
|
return readinessFromCandidate(candidate, nowMs, model).ready;
|
|
84
53
|
}
|
|
85
|
-
/**
|
|
86
|
-
* Whether a version home can actually authenticate a launch.
|
|
87
|
-
*
|
|
88
|
-
* `getAccountInfo` falls back to the active/global HOME when a version home has
|
|
89
|
-
* no credential of its own, so `agents view` still shows who is logged in. Launch
|
|
90
|
-
* paths isolate config (GROK_HOME, CODEX_HOME, KIMI_CODE_HOME, CLAUDE_CONFIG_DIR,
|
|
91
|
-
* …) to the per-version home, so a home that only "inherits" the active login
|
|
92
|
-
* cannot spawn a signed-in agent — balanced kept picking those empty homes and
|
|
93
|
-
* the run died on "Not signed in".
|
|
94
|
-
*
|
|
95
|
-
* When we know where the credential lives (`knownLocation`), require it under
|
|
96
|
-
* THIS version home. When we don't (keychain-only / unmapped agents), trust the
|
|
97
|
-
* existing `signedIn` signal.
|
|
98
|
-
*/
|
|
99
54
|
export function isLaunchableSignedIn(signedIn, presence) {
|
|
100
55
|
if (!signedIn)
|
|
101
56
|
return false;
|
|
@@ -103,82 +58,16 @@ export function isLaunchableSignedIn(signedIn, presence) {
|
|
|
103
58
|
return true;
|
|
104
59
|
return presence.perVersion;
|
|
105
60
|
}
|
|
106
|
-
/**
|
|
107
|
-
* Whether a SPECIFIC installed version is launchable-signed-in on THIS device,
|
|
108
|
-
* plus the account email when it is. Mirrors EXACTLY the per-version gate
|
|
109
|
-
* {@link collectRunCandidates} applies (getVersionHomePath -> getAccountInfo ->
|
|
110
|
-
* {@link isLaunchableSignedIn} over {@link credentialPresence}), so the
|
|
111
|
-
* pre-launch `run.launch` event can report the same signed-in verdict the
|
|
112
|
-
* balanced router computes for that version.
|
|
113
|
-
*
|
|
114
|
-
* The point is to make a launch into a logged-out version VISIBLE at spawn time:
|
|
115
|
-
* `--device auto` only guarantees SOME account is ready on the device, not that
|
|
116
|
-
* the specific version launched is signed in there (the yosemite-m3 2.1.219
|
|
117
|
-
* incident — 2.1.219 was logged out, the router correctly excluded it, yet it
|
|
118
|
-
* launched). Non-fatal by construction: callers wrap it best-effort.
|
|
119
|
-
*/
|
|
120
61
|
export async function isVersionLaunchableHere(agent, version) {
|
|
121
62
|
const home = getVersionHomePath(agent, version);
|
|
122
63
|
const info = await getAccountInfo(agent, home);
|
|
123
64
|
const launchable = isLaunchableSignedIn(info.signedIn, credentialPresence(agent, home));
|
|
124
65
|
return { launchable, email: launchable ? info.email : null };
|
|
125
66
|
}
|
|
126
|
-
/**
|
|
127
|
-
* How old a usage snapshot may be and still settle a routing DECISION.
|
|
128
|
-
*
|
|
129
|
-
* A display may show an older cached bar, but the router choosing an account
|
|
130
|
-
* from one costs the whole run. Measured case: `yosemite-s1` held snapshots 26
|
|
131
|
-
* hours to 2.7 days old
|
|
132
|
-
* with a failing refresh, so balanced read `muqsit@getrush.ai` as 48% used and
|
|
133
|
-
* launched into it while the account was actually at its weekly cap.
|
|
134
|
-
*/
|
|
135
67
|
export const USAGE_DECISION_MAX_AGE_MS = 5 * 60 * 1000;
|
|
136
|
-
/**
|
|
137
|
-
* How old a *synced* snapshot (arrived from the account's poller through the
|
|
138
|
-
* fleet store) may be and still settle a routing decision. Matches the
|
|
139
|
-
* usage-sync tick so a worker that only ever sees 15-minute-old rows does not
|
|
140
|
-
* drop to the account picker. Local captures (`poll` / `statusline`) keep
|
|
141
|
-
* {@link USAGE_DECISION_MAX_AGE_MS}.
|
|
142
|
-
*/
|
|
143
68
|
export const USAGE_SYNC_TRUST_MS = 15 * 60 * 1000;
|
|
144
|
-
/**
|
|
145
|
-
* How old a usage snapshot may be before routing REFUSES to run at all
|
|
146
|
-
* (NO_VERIFIED_USAGE), as opposed to merely declining to *weight* by its number.
|
|
147
|
-
*
|
|
148
|
-
* These are two different risks and now two different bars. Weighting on a
|
|
149
|
-
* slightly-old number is cheap to get wrong (a floored weight, {@link
|
|
150
|
-
* USAGE_DECISION_MAX_AGE_MS} = 5 min); refusing to launch at all is expensive to
|
|
151
|
-
* get wrong — it fails the user's `agents run` outright. The daemon's usage
|
|
152
|
-
* refresher paces proactive fetches under a fixed per-provider budget
|
|
153
|
-
* (`usage-refresh.ts`, PROVIDER_HOURLY_BUDGET), so on a multi-account fleet an
|
|
154
|
-
* IDLE account is deliberately refreshed on a stretched round-robin cadence
|
|
155
|
-
* (bounded at N × spacing — ~16 min at 8 accounts, ~32 min at 16) rather than
|
|
156
|
-
* every 5 min, which would 429 the endpoint and park it for up to an hour. A
|
|
157
|
-
* budget-paced idle reading of 10–30 min is NOT the failure this refusal exists
|
|
158
|
-
* to catch. That failure is the `yosemite-s1` case: a box whose refresh is
|
|
159
|
-
* genuinely BROKEN, holding readings 26 h – 2.7 d old. 40 min sits comfortably
|
|
160
|
-
* above the worst-case budget cadence and still an order of magnitude below the
|
|
161
|
-
* multi-hour staleness of a broken box — and actively-used accounts refresh for
|
|
162
|
-
* free via the statusline ingest, so a *busy* account is never even this old.
|
|
163
|
-
*/
|
|
164
69
|
export const USAGE_STALE_REFUSAL_MAX_AGE_MS = 40 * 60 * 1000;
|
|
165
|
-
/**
|
|
166
|
-
* Whether this candidate's usage number is recent enough to route on. A missing
|
|
167
|
-
* snapshot is unverified by definition — there is no number to trust.
|
|
168
|
-
*
|
|
169
|
-
* A snapshot with NO windows is unverified for the same reason, however fresh
|
|
170
|
-
* it is: it carries a subscription plan and no utilization, so there is still
|
|
171
|
-
* no number. Freshness alone would make a meterless harness (Grok reports a
|
|
172
|
-
* tier and no meters) verify against nothing — and since `preferVerified`
|
|
173
|
-
* narrows the pool to verified candidates, the one account whose billing log
|
|
174
|
-
* was touched most recently would win every draw, then win again because
|
|
175
|
-
* running it refreshes that log. That self-reinforcing pin is exactly what the
|
|
176
|
-
* narrowing rule below exists to prevent.
|
|
177
|
-
*/
|
|
178
70
|
export function usageVerifiedMaxAgeMs(snapshot) {
|
|
179
|
-
// D8: a row that arrived via sync from the account's own poller is trusted
|
|
180
|
-
// for the sync cadence. A locally captured row (poll / statusline / unset)
|
|
181
|
-
// keeps the 5-minute bar — the poller is on this box and can refresh it.
|
|
182
71
|
return snapshot?.freshness?.source === 'sync' ? USAGE_SYNC_TRUST_MS : USAGE_DECISION_MAX_AGE_MS;
|
|
183
72
|
}
|
|
184
73
|
export function isUsageVerified(candidate, nowMs = Date.now()) {
|
|
@@ -188,37 +77,11 @@ export function isUsageVerified(candidate, nowMs = Date.now()) {
|
|
|
188
77
|
return false;
|
|
189
78
|
return nowMs - capturedAt.getTime() <= usageVerifiedMaxAgeMs(snapshot);
|
|
190
79
|
}
|
|
191
|
-
/**
|
|
192
|
-
* Whether this candidate carries a GENUINELY-STALE usage number: a snapshot with
|
|
193
|
-
* windows whose capture time is older than {@link USAGE_STALE_REFUSAL_MAX_AGE_MS}.
|
|
194
|
-
*
|
|
195
|
-
* This is the misleading case the initial route must refuse — the number reads
|
|
196
|
-
* "48% used" with the same confidence whether captured a minute or three days
|
|
197
|
-
* ago, and a box whose refresh is failing stays wrong indefinitely. Two things
|
|
198
|
-
* make it NARROWER than "not verified":
|
|
199
|
-
* 1. It uses the wider REFUSAL bar, not the 5-min weighting bar. A merely
|
|
200
|
-
* budget-paced idle account (10–30 min old) is not-verified — so it weights
|
|
201
|
-
* at the floor, conservatively — but it is NOT "stale" and must not, on its
|
|
202
|
-
* own, drive the whole provider to a NO_VERIFIED_USAGE refusal. Only a
|
|
203
|
-
* genuinely broken refresh (hours old) trips this.
|
|
204
|
-
* 2. A BLIND candidate with no snapshot (or a plan-only meterless one with no
|
|
205
|
-
* windows) carries no number to be misled by — a worker box whose usage
|
|
206
|
-
* endpoint 403s (RUSH-2392), or a meterless Grok login — so it is not
|
|
207
|
-
* "stale", and an entirely-blind pool still draws a pick (PHNX-3392) rather
|
|
208
|
-
* than fail loud with NO_VERIFIED_USAGE.
|
|
209
|
-
*/
|
|
210
80
|
export function hasStaleUsage(candidate, nowMs = Date.now()) {
|
|
211
81
|
const snapshot = candidate.usageSnapshot;
|
|
212
82
|
const capturedAt = snapshot?.capturedAt;
|
|
213
83
|
if (!capturedAt || !snapshot?.windows.length)
|
|
214
84
|
return false;
|
|
215
|
-
// A row that arrived via sync (D1, PHNX-4116) cannot be refreshed on THIS box —
|
|
216
|
-
// the account's poller lives on the headed device that published it, not here.
|
|
217
|
-
// Its age is shown, never used to refuse: a blind synced pool takes a
|
|
218
|
-
// floor-weight pick (capacityWeight → UNVERIFIED_WEIGHT) and
|
|
219
|
-
// rotationFailoverChain handles a real 429. Only a locally-captured reading a
|
|
220
|
-
// broken poller left hours old is genuinely "stale" for a refusal. See the
|
|
221
|
-
// GWT-E5d amendment.
|
|
222
85
|
if (snapshot.freshness?.source === 'sync')
|
|
223
86
|
return false;
|
|
224
87
|
return nowMs - capturedAt.getTime() > USAGE_STALE_REFUSAL_MAX_AGE_MS;
|
|
@@ -226,53 +89,19 @@ export function hasStaleUsage(candidate, nowMs = Date.now()) {
|
|
|
226
89
|
function hasUsageAvailable(candidate, now = Date.now()) {
|
|
227
90
|
const snapshot = candidate.usageSnapshot;
|
|
228
91
|
if (snapshot) {
|
|
229
|
-
// Eligibility mirrors the `agents view` throttle badge exactly
|
|
230
|
-
// (deriveUsageStatusFromSnapshot): an account maxed on ANY blocking window —
|
|
231
|
-
// including the 5-hour session window — cannot serve the next request, so it
|
|
232
|
-
// must not be picked. Previously this checked only non-session windows
|
|
233
|
-
// (getRoutingUsedPercent), so a session-maxed account with weekly headroom
|
|
234
|
-
// stayed "eligible" and the router kept launching into it while `ag view`
|
|
235
|
-
// showed it rate-limited. Capacity *weighting* still ranks eligible accounts
|
|
236
|
-
// by weekly headroom; this gate only decides can-it-run-right-now.
|
|
237
92
|
const status = deriveUsageStatusFromSnapshot(snapshot, now);
|
|
238
93
|
if (status !== null)
|
|
239
94
|
return status !== 'rate_limited';
|
|
240
95
|
}
|
|
241
|
-
// No live snapshot: fall back to the coarse cached status.
|
|
242
96
|
if (candidate.usageStatus === 'out_of_credits' || candidate.usageStatus === 'rate_limited') {
|
|
243
97
|
return false;
|
|
244
98
|
}
|
|
245
99
|
return true;
|
|
246
100
|
}
|
|
247
|
-
/**
|
|
248
|
-
* Pure decision reusing the router's own eligibility gate (`hasUsageAvailable`
|
|
249
|
-
* + canonical signed-in state, i.e. `isRotationEligible`), so a pre-flight warning can NEVER
|
|
250
|
-
* disagree with what rotation would actually do. The `reason` combines the two
|
|
251
|
-
* signals `hasUsageAvailable` reads: the live snapshot (session-inclusive
|
|
252
|
-
* rate-limit) and the coarse cached `usageStatus` (out-of-credits, which a
|
|
253
|
-
* snapshot never carries). When a live snapshot exists it wins over the cached
|
|
254
|
-
* status — matching the gate — so a stale `out_of_credits` cache is not
|
|
255
|
-
* reported while the account is actually serving requests.
|
|
256
|
-
*
|
|
257
|
-
* `model`, when supplied, additionally consults a per-(account, model)
|
|
258
|
-
* refusal Claude can surface on ONE model family ("You've reached your Fable
|
|
259
|
-
* limit…") while the account's other models and its global usage windows stay
|
|
260
|
-
* healthy — a global rate_limited/out_of_credits marker would wrongly exclude
|
|
261
|
-
* the whole account for an unrelated model. Keyed on the candidate's stable
|
|
262
|
-
* native account id (never the org-shared usageKey) via
|
|
263
|
-
* {@link candidateAccountKey}, so a model-only limit on one login can never
|
|
264
|
-
* poison a sibling account that merely shares the same org usage bucket.
|
|
265
|
-
* Omitting `model` (every existing caller) leaves generic account status
|
|
266
|
-
* completely unaffected — the model check runs only when a caller opts in.
|
|
267
|
-
*/
|
|
268
101
|
export function readinessFromCandidate(candidate, now = Date.now(), model) {
|
|
269
102
|
if (!candidate.signedIn) {
|
|
270
103
|
return { ready: false, reason: 'signed_out', email: candidate.email };
|
|
271
104
|
}
|
|
272
|
-
// A token the daemon's live probe saw rejected (401/403 -> `revoked`) will fail
|
|
273
|
-
// auth at spawn no matter how much usage headroom it has. Exclude it BEFORE the
|
|
274
|
-
// usage gate so rotation never routes into a doomed login. Fail-open: any other
|
|
275
|
-
// (or null) verdict does not gate — see `RotateCandidate.authVerdict`.
|
|
276
105
|
const authFresh = candidate.authCheckedAt == null
|
|
277
106
|
|| now - candidate.authCheckedAt <= AUTH_PROBE_MAX_AGE_MS;
|
|
278
107
|
if (authFresh && candidate.authVerdict !== null && isDeadVerdict(candidate.authVerdict)) {
|
|
@@ -296,40 +125,12 @@ export function readinessFromCandidate(candidate, now = Date.now(), model) {
|
|
|
296
125
|
const reason = !snapRateLimited && candidate.usageStatus === 'out_of_credits' ? 'out_of_credits' : 'rate_limited';
|
|
297
126
|
return { ready: false, reason, email: candidate.email };
|
|
298
127
|
}
|
|
299
|
-
/**
|
|
300
|
-
* Whether a human sitting at a terminal can clear this exclusion by launching
|
|
301
|
-
* the agent and signing in. The two unhealthy classes are opposites, and the
|
|
302
|
-
* zero-healthy callers MUST NOT treat them alike:
|
|
303
|
-
*
|
|
304
|
-
* - `signed_out` / `revoked` — recoverable. There is no credential (or the
|
|
305
|
-
* server rejected it), and the harness's own TUI is the login surface, so
|
|
306
|
-
* launching it is exactly the fix. Refusing to launch strands the user with
|
|
307
|
-
* no way to authenticate through agents-cli at all (RUSH-2334).
|
|
308
|
-
* - `rate_limited` / `out_of_credits` — NOT recoverable. The account is signed
|
|
309
|
-
* in and throttled; launching it just hammers an exhausted account, which is
|
|
310
|
-
* precisely the loop RUSH-2132's fail-loud guard exists to stop. Only a
|
|
311
|
-
* window reset clears these.
|
|
312
|
-
*/
|
|
313
128
|
export function isSignInRecoverable(readiness) {
|
|
314
129
|
return !readiness.ready && (readiness.reason === 'signed_out' || readiness.reason === 'revoked');
|
|
315
130
|
}
|
|
316
|
-
/**
|
|
317
|
-
* The subset of an `exhausted` set whose exclusion a sign-in would clear, so an
|
|
318
|
-
* interactive caller can offer the login instead of dead-ending. Empty means
|
|
319
|
-
* every account is throttled — nothing a human can fix right now, so the caller
|
|
320
|
-
* keeps failing loud.
|
|
321
|
-
*/
|
|
322
131
|
export function signInRecoverableCandidates(candidates) {
|
|
323
132
|
return candidates.filter((c) => isSignInRecoverable(readinessFromCandidate(c)));
|
|
324
133
|
}
|
|
325
|
-
/**
|
|
326
|
-
* Readiness for a specific installed (agent, version). Returns `{ ready: true }`
|
|
327
|
-
* when the version isn't among the collected candidates — absence is the
|
|
328
|
-
* caller's `isVersionInstalled` concern, not ours; don't cry wolf. Only
|
|
329
|
-
* meaningful for a version-pinned target: a bare target rotates to a healthy
|
|
330
|
-
* account on its own, and a profile injects its own auth (a different account
|
|
331
|
-
* than the version home carries), so neither is checkable here.
|
|
332
|
-
*/
|
|
333
134
|
export async function checkRunAccountReadiness(agent, version) {
|
|
334
135
|
const candidates = await collectRunCandidates(agent);
|
|
335
136
|
const candidate = candidates.find((c) => c.version === version);
|
|
@@ -361,13 +162,6 @@ function compareCandidates(a, b) {
|
|
|
361
162
|
return ta - tb;
|
|
362
163
|
return Math.random() - 0.5;
|
|
363
164
|
}
|
|
364
|
-
/**
|
|
365
|
-
* Identity a candidate dedups on. Quota is tracked per-org, so two versions
|
|
366
|
-
* that share an org are the same rate-limit bucket and must collapse — but two
|
|
367
|
-
* orgs under the same email (e.g. Enterprise + Personal on one Google identity)
|
|
368
|
-
* are genuinely separate buckets and must stay distinct. Prefer the org usage
|
|
369
|
-
* key; fall back to email only when no usage identity is available.
|
|
370
|
-
*/
|
|
371
165
|
export function candidateAccountKey(c) {
|
|
372
166
|
if (c.nativeAccountId)
|
|
373
167
|
return `native:${c.nativeAccountId}`;
|
|
@@ -389,35 +183,6 @@ function dedupeAndSortCandidates(candidates) {
|
|
|
389
183
|
}
|
|
390
184
|
return [...byIdentity.values()].sort(compareCandidates);
|
|
391
185
|
}
|
|
392
|
-
/**
|
|
393
|
-
* Pick a healthy candidate using weighted random by remaining capacity.
|
|
394
|
-
*
|
|
395
|
-
* Each healthy candidate gets weight = max(1, 100 - usedPercent) where
|
|
396
|
-
* usedPercent is the highest-utilized non-session window (week / sonnet_week
|
|
397
|
-
* for Claude). An account at 10% used gets weight 90; one at 90% used gets
|
|
398
|
-
* weight 10 — so the fresher account is 9× more likely to be picked. Over N
|
|
399
|
-
* calls, traffic distributes across healthy accounts proportional to their
|
|
400
|
-
* headroom, with no stampede on the lowest-usage one. Stateless — parallel
|
|
401
|
-
* callers naturally fan out via the random roll.
|
|
402
|
-
*
|
|
403
|
-
* Eligibility: signed in according to AccountInfo and not currently
|
|
404
|
-
* rate-limited — no blocking window (session OR weekly) at 100%, matching the
|
|
405
|
-
* `agents view` badge; or the local cached status is usable when no live
|
|
406
|
-
* snapshot exists. Note the split: eligibility considers the session window
|
|
407
|
-
* (a session-maxed account can't run now), but the capacity *weight* above is
|
|
408
|
-
* driven by weekly headroom so a brief session spike doesn't distort routing.
|
|
409
|
-
*
|
|
410
|
-
* Dedupe: when multiple versions share a usage/account identity, collapse to
|
|
411
|
-
* one candidate (the least-recently-active version). The org-scoped usage key
|
|
412
|
-
* wins over email so same-email personal and Team accounts remain distinct.
|
|
413
|
-
*
|
|
414
|
-
* Returns null if no candidate is eligible — callers fall back to the pinned
|
|
415
|
-
* version so behavior stays predictable.
|
|
416
|
-
*
|
|
417
|
-
* `model`, when supplied, additionally excludes an account carrying a live
|
|
418
|
-
* per-model refusal for that exact model (see {@link readinessFromCandidate}).
|
|
419
|
-
* Omitted (every pre-existing caller), eligibility is unchanged.
|
|
420
|
-
*/
|
|
421
186
|
export function pickBalancedCandidate(candidates, nowMs = Date.now(), model) {
|
|
422
187
|
const healthy = [];
|
|
423
188
|
const excluded = [];
|
|
@@ -439,57 +204,11 @@ export function pickBalancedCandidate(candidates, nowMs = Date.now(), model) {
|
|
|
439
204
|
const { picked, usageUnverified, noVerifiedUsage } = preferVerified(sorted, nowMs, (from) => weightedRandomByCapacity(from, nowMs), 'representative');
|
|
440
205
|
return { picked, healthy: sorted, excluded, usageUnverified, noVerifiedUsage };
|
|
441
206
|
}
|
|
442
|
-
/**
|
|
443
|
-
* Choose from the VERIFIED candidates when they are a representative share of
|
|
444
|
-
* the pool (at least half), else from the whole pool.
|
|
445
|
-
*
|
|
446
|
-
* An eligible account whose usage we could not confirm is a guess, not a green
|
|
447
|
-
* light: the snapshot reads "48% used" with equal confidence whether it was
|
|
448
|
-
* captured a minute or three days ago, and a box whose refresh is failing stays
|
|
449
|
-
* wrong indefinitely. Confirmed headroom therefore beats apparent headroom, even
|
|
450
|
-
* when the unconfirmed number looks better.
|
|
451
|
-
*
|
|
452
|
-
* But narrowing to a verified MINORITY inverts the safety. When the usage
|
|
453
|
-
* endpoint 429-throttles a machine, each refresh cycle confirms roughly one
|
|
454
|
-
* account before backing off — so "verified" is a singleton, `choose` runs over
|
|
455
|
-
* a one-element list, and every launch lands on the same account. Launching
|
|
456
|
-
* into it refreshes that account's snapshot again, so it stays the only
|
|
457
|
-
* verified candidate while the rest are never picked and never probed: the
|
|
458
|
-
* rotation degrades to a fixed pin that burns one account to its weekly cap
|
|
459
|
-
* while its siblings idle (observed 2026-08-20 across yosemite-s0/s1 — the
|
|
460
|
-
* "same version every time under --strategy balanced" incident).
|
|
461
|
-
*
|
|
462
|
-
* The two failure modes belong to different CHOOSERS, so `narrowing` is picked
|
|
463
|
-
* per caller: `'representative'` (the weighted-random balanced path) narrows to
|
|
464
|
-
* verified only when they cover at least half the pool — below that the whole
|
|
465
|
-
* pool competes, fresh candidates keep their confirmed weights, stale/unknown
|
|
466
|
-
* ones get the full default weight `capacityWeight` assigns to "no signal", and
|
|
467
|
-
* the random roll spreads the load. `'any-verified'` (deterministic `from[0]`
|
|
468
|
-
* choosers: `--strategy available`, run-auto harness classification) keeps the
|
|
469
|
-
* original rule — narrow whenever ANY verified candidate exists — because a
|
|
470
|
-
* deterministic pick over the whole pool would hand the front slot back to an
|
|
471
|
-
* unconfirmed "48% used" over an accurate "90% used", the exact yosemite-s1
|
|
472
|
-
* inversion above, and a deterministic chooser cannot spread load anyway, so
|
|
473
|
-
* the singleton-collapse concern does not apply to it.
|
|
474
|
-
*
|
|
475
|
-
* `healthy` deliberately keeps every eligible candidate rather than just the
|
|
476
|
-
* verified ones. Declining to *pick* an account on stale data and declining to
|
|
477
|
-
* *fail over to* it after the primary has already hit a 429 are different risks:
|
|
478
|
-
* by then the alternative is not launching at all, so the failover chain
|
|
479
|
-
* (rotationFailoverChain, which reads `healthy`) keeps its full safety net —
|
|
480
|
-
* exactly on the machines this guard is protecting.
|
|
481
|
-
*/
|
|
482
207
|
function preferVerified(pool, nowMs, choose, narrowing = 'any-verified') {
|
|
483
208
|
const verified = pool.filter((c) => isUsageVerified(c, nowMs));
|
|
484
209
|
const narrow = verified.length > 0 &&
|
|
485
210
|
(narrowing === 'any-verified' || verified.length >= Math.ceil(pool.length / 2));
|
|
486
211
|
const picked = choose(narrow ? verified : pool);
|
|
487
|
-
// Entirely-stale = zero verified AND at least one stale-but-present number. A
|
|
488
|
-
// BLIND pool (no snapshots at all) does NOT trip this — it carries no
|
|
489
|
-
// misleading figure, so it still draws a pick (see {@link hasStaleUsage}). The
|
|
490
|
-
// chosen `picked` is still returned so `healthy` (which includes it) stays
|
|
491
|
-
// whole for bounded post-rejection failover; the INITIAL selection acts on
|
|
492
|
-
// this flag instead of launching that stale pick.
|
|
493
212
|
const noVerifiedUsage = verified.length === 0 && pool.some((c) => hasStaleUsage(c, nowMs));
|
|
494
213
|
return {
|
|
495
214
|
picked,
|
|
@@ -497,26 +216,9 @@ function preferVerified(pool, nowMs, choose, narrowing = 'any-verified') {
|
|
|
497
216
|
noVerifiedUsage,
|
|
498
217
|
};
|
|
499
218
|
}
|
|
500
|
-
// capacityWeight + PROJECTION_HORIZON_MIN moved to ./capacity.js (a pure,
|
|
501
|
-
// dependency-free module the account pool can import without this file's heavy
|
|
502
|
-
// graph). Imported at the top for internal use; re-exported here so existing
|
|
503
|
-
// importers keep resolving them from rotate.
|
|
504
219
|
export { PROJECTION_HORIZON_MIN, capacityWeight };
|
|
505
|
-
/**
|
|
506
|
-
* Pick one candidate from `sorted` using weights proportional to remaining
|
|
507
|
-
* routing capacity (see {@link capacityWeight}). Floor each weight at 1 so a
|
|
508
|
-
* near-exhausted-but-still-eligible candidate can still be picked occasionally.
|
|
509
|
-
*/
|
|
510
220
|
function weightedRandomByCapacity(sorted, nowMs = Date.now()) {
|
|
511
|
-
const weights = sorted.map((c) => capacityWeight(
|
|
512
|
-
// An unverified (stale or absent) snapshot carries no trustworthy number,
|
|
513
|
-
// so it weights as UNVERIFIED_WEIGHT (the floor) instead of by its frozen
|
|
514
|
-
// usedPercent. Otherwise a day-old "45% used" competes as if it were live
|
|
515
|
-
// headroom and can win the draw over a verified-healthy account — which is
|
|
516
|
-
// exactly how balanced launched into an account already at its weekly cap
|
|
517
|
-
// on a worker whose usage refresh had stalled (PHNX-3479). A verified
|
|
518
|
-
// snapshot keeps its real remaining-headroom weight.
|
|
519
|
-
isUsageVerified(c, nowMs) ? getRoutingUsedPercent(c.usageSnapshot) : null, c.usageMinutesToLimit));
|
|
221
|
+
const weights = sorted.map((c) => capacityWeight(isUsageVerified(c, nowMs) ? getRoutingUsedPercent(c.usageSnapshot) : null, c.usageMinutesToLimit));
|
|
520
222
|
const total = weights.reduce((sum, w) => sum + w, 0);
|
|
521
223
|
if (total <= 0)
|
|
522
224
|
return sorted[0];
|
|
@@ -528,11 +230,6 @@ function weightedRandomByCapacity(sorted, nowMs = Date.now()) {
|
|
|
528
230
|
}
|
|
529
231
|
return sorted[sorted.length - 1];
|
|
530
232
|
}
|
|
531
|
-
/**
|
|
532
|
-
* Pick an available candidate. Prefers the configured pinned version when that
|
|
533
|
-
* version has usage available; otherwise routes to the candidate with the most
|
|
534
|
-
* usage headroom.
|
|
535
|
-
*/
|
|
536
233
|
export function pickAvailableCandidate(candidates, preferredVersion, nowMs = Date.now(), model) {
|
|
537
234
|
const healthy = [];
|
|
538
235
|
const excluded = [];
|
|
@@ -551,34 +248,12 @@ export function pickAvailableCandidate(candidates, preferredVersion, nowMs = Dat
|
|
|
551
248
|
if (!deduped.has(c))
|
|
552
249
|
excluded.push(c);
|
|
553
250
|
}
|
|
554
|
-
// `available` sorts by apparent headroom and takes the front of the list, so an
|
|
555
|
-
// unconfirmed "48% used" outranks an accurate "90% used" — the same inversion
|
|
556
|
-
// that put a launch on an exhausted account under `balanced`. It routes on the
|
|
557
|
-
// same cache, so it gets the same rule: confirmed headroom first.
|
|
558
251
|
const { picked: bestVerified, usageUnverified, noVerifiedUsage } = preferVerified(sorted, nowMs, (from) => from[0]);
|
|
559
|
-
// An explicit version preference is an instruction, not a ranking signal, so it
|
|
560
|
-
// still wins — but only while that version is actually eligible.
|
|
561
252
|
const preferred = preferredVersion
|
|
562
253
|
? sorted.find((candidate) => candidate.version === preferredVersion)
|
|
563
254
|
: undefined;
|
|
564
|
-
// `noVerifiedUsage` rides along even when a `preferred` default resolves: an
|
|
565
|
-
// all-stale pool can only make `preferred` a stale pick too (a verified
|
|
566
|
-
// preferred would make verified.length > 0), and auto-selecting the default
|
|
567
|
-
// pin on a stale number is the very thing PHNX-2526 refuses. The initial
|
|
568
|
-
// route (resolveRunVersion) acts on the flag; the failover chain keeps
|
|
569
|
-
// `healthy` regardless.
|
|
570
255
|
return { picked: preferred ?? bestVerified, healthy: sorted, excluded, usageUnverified, noVerifiedUsage };
|
|
571
256
|
}
|
|
572
|
-
/**
|
|
573
|
-
* Classify every harness's candidates into healthy (with a representative
|
|
574
|
-
* best account) vs excluded (with per-reason counts). Pure — the pick and the
|
|
575
|
-
* zero-healthy error message both read this, so they can never disagree.
|
|
576
|
-
*
|
|
577
|
-
* Health uses the exact account-layer gate (`isRotationEligible`: signed in
|
|
578
|
-
* AND not maxed on ANY blocking window, weekly included). The representative
|
|
579
|
-
* best account honors `preferVerified`: confirmed headroom beats apparent
|
|
580
|
-
* headroom, the same freshness rule the account layer routes on.
|
|
581
|
-
*/
|
|
582
257
|
export function classifyHarnessCandidates(byHarness, nowMs = Date.now()) {
|
|
583
258
|
const summaries = [];
|
|
584
259
|
for (const [agent, candidates] of byHarness) {
|
|
@@ -613,17 +288,6 @@ export function classifyHarnessCandidates(byHarness, nowMs = Date.now()) {
|
|
|
613
288
|
}
|
|
614
289
|
return summaries;
|
|
615
290
|
}
|
|
616
|
-
/**
|
|
617
|
-
* Pick a harness for `agents run auto` using weighted random by best-account
|
|
618
|
-
* headroom (RUSH-2132).
|
|
619
|
-
*
|
|
620
|
-
* A harness's capacity is `100 − min(routingUsed% across its healthy accounts)`
|
|
621
|
-
* — its best account's headroom. The pick reuses `weightedRandomByCapacity` on
|
|
622
|
-
* the representative best accounts, so host/harness/account layers all share
|
|
623
|
-
* one sampling behavior. Harnesses with zero healthy accounts are EXCLUDED,
|
|
624
|
-
* not down-weighted. Returns null when no harness has any healthy account;
|
|
625
|
-
* call `classifyHarnessCandidates` for the exclusion detail to message with.
|
|
626
|
-
*/
|
|
627
291
|
export function pickHarnessWeighted(byHarness, nowMs = Date.now()) {
|
|
628
292
|
const summaries = classifyHarnessCandidates(byHarness, nowMs);
|
|
629
293
|
const healthy = summaries.filter((s) => s.best !== null);
|
|
@@ -634,7 +298,6 @@ export function pickHarnessWeighted(byHarness, nowMs = Date.now()) {
|
|
|
634
298
|
const picked = healthy.find((s) => s.best === pickedBest);
|
|
635
299
|
return { picked, healthy, excluded };
|
|
636
300
|
}
|
|
637
|
-
/** One-line banner naming the auto-picked harness and why (headroom). */
|
|
638
301
|
export function formatHarnessPickBanner(result) {
|
|
639
302
|
const { picked, healthy, excluded } = result;
|
|
640
303
|
const headroom = picked.bestUsedPercent === null
|
|
@@ -643,11 +306,6 @@ export function formatHarnessPickBanner(result) {
|
|
|
643
306
|
const ratio = `${healthy.length} of ${healthy.length + excluded.length} harnesses healthy`;
|
|
644
307
|
return `[agents] auto picked ${picked.agent} (${headroom}, ${ratio})`;
|
|
645
308
|
}
|
|
646
|
-
/**
|
|
647
|
-
* The earliest FUTURE window reset across these candidates' usage snapshots —
|
|
648
|
-
* when the first exhausted account becomes usable again. Null when no snapshot
|
|
649
|
-
* carries a reset timestamp.
|
|
650
|
-
*/
|
|
651
309
|
export function earliestResetAcross(candidates, nowMs = Date.now()) {
|
|
652
310
|
let earliest = null;
|
|
653
311
|
for (const c of candidates) {
|
|
@@ -660,19 +318,9 @@ export function earliestResetAcross(candidates, nowMs = Date.now()) {
|
|
|
660
318
|
}
|
|
661
319
|
return earliest === null ? null : new Date(earliest);
|
|
662
320
|
}
|
|
663
|
-
/**
|
|
664
|
-
* The `resets <summary>` fragment both zero-healthy errors share. ISO 8601 so
|
|
665
|
-
* a watchdog can parse the cooldown straight off the line; `unknown` when no
|
|
666
|
-
* snapshot carries a reset (a parser falls back to its default cooldown).
|
|
667
|
-
*/
|
|
668
321
|
function formatResetSummary(reset) {
|
|
669
322
|
return reset ? reset.toISOString() : 'unknown (no reset timestamps in any snapshot)';
|
|
670
323
|
}
|
|
671
|
-
/**
|
|
672
|
-
* The zero-healthy-account error (RUSH-2132). EXACT contract — the Factory
|
|
673
|
-
* watchdog tail-detects this text: it must contain the literal `no healthy`
|
|
674
|
-
* and `resets <time>` (parsed for the rotate cooldown). Do not deviate.
|
|
675
|
-
*/
|
|
676
324
|
export function formatNoHealthyAccountError(agent, strategy, excluded, nowMs = Date.now()) {
|
|
677
325
|
const excludedStr = excluded.length === 0
|
|
678
326
|
? 'no installed versions'
|
|
@@ -684,33 +332,17 @@ export function formatNoHealthyAccountError(agent, strategy, excluded, nowMs = D
|
|
|
684
332
|
const resetSummary = formatResetSummary(earliestResetAcross(excluded, nowMs));
|
|
685
333
|
return `agents: no healthy ${agent} account under strategy '${strategy}' — excluded: ${excludedStr}; earliest window resets ${resetSummary}. Use --strategy pinned to force the default.`;
|
|
686
334
|
}
|
|
687
|
-
/**
|
|
688
|
-
* How old this candidate's usage snapshot is, in whole minutes, or null when it
|
|
689
|
-
* carries no dated snapshot (a blind account). Used only to explain WHY a route
|
|
690
|
-
* was refused as unverified — never to route on.
|
|
691
|
-
*/
|
|
692
335
|
function snapshotAgeMinutes(candidate, nowMs) {
|
|
693
336
|
const capturedAt = candidate.usageSnapshot?.capturedAt;
|
|
694
337
|
if (!capturedAt || !candidate.usageSnapshot?.windows.length)
|
|
695
338
|
return null;
|
|
696
339
|
return Math.max(0, Math.round((nowMs - capturedAt.getTime()) / 60_000));
|
|
697
340
|
}
|
|
698
|
-
/**
|
|
699
|
-
* The all-stale-usage error (PHNX-2526) an UNATTENDED `balanced`/`available`
|
|
700
|
-
* run fails loud with when no account's usage is fresh enough to route on. EXACT
|
|
701
|
-
* contract — it MUST contain the literal `NO_VERIFIED_USAGE` so a machine caller
|
|
702
|
-
* (and the Factory watchdog) can tail-detect it distinctly from the
|
|
703
|
-
* `no healthy` throttle error, which is a different condition (throttled vs
|
|
704
|
-
* merely stale). Names each candidate with how stale its snapshot is, so the
|
|
705
|
-
* operator can see the failing-refresh box rather than guess.
|
|
706
|
-
*/
|
|
707
341
|
export function formatNoVerifiedUsageError(agent, strategy, candidates, nowMs = Date.now()) {
|
|
708
342
|
const detail = candidates.length === 0
|
|
709
343
|
? 'no signed-in accounts'
|
|
710
344
|
: candidates.map((c) => {
|
|
711
345
|
const age = snapshotAgeMinutes(c, nowMs);
|
|
712
|
-
// A synced row's age never drives a refusal (see hasStaleUsage), so name
|
|
713
|
-
// it as synced rather than letting the operator read it as the culprit.
|
|
714
346
|
const synced = c.usageSnapshot?.freshness?.source === 'sync';
|
|
715
347
|
const staleness = age === null
|
|
716
348
|
? 'no usage snapshot'
|
|
@@ -720,10 +352,6 @@ export function formatNoVerifiedUsageError(agent, strategy, candidates, nowMs =
|
|
|
720
352
|
const maxAgeMin = Math.round(USAGE_STALE_REFUSAL_MAX_AGE_MS / 60_000);
|
|
721
353
|
return `agents: NO_VERIFIED_USAGE — no signed-in ${agent} account has usage newer than ${maxAgeMin}m under strategy '${strategy}', so routing refuses to guess on a stale number: ${detail}. Refresh usage (agents view ${agent}) or pin the default with --strategy pinned.`;
|
|
722
354
|
}
|
|
723
|
-
/**
|
|
724
|
-
* The zero-healthy-harness error for `agents run auto` — names each harness's
|
|
725
|
-
* exclusion reason plus the earliest reset across all snapshots.
|
|
726
|
-
*/
|
|
727
355
|
export function formatNoHealthyHarnessError(summaries, nowMs = Date.now()) {
|
|
728
356
|
const excludedStr = summaries.length === 0
|
|
729
357
|
? 'no installed harnesses'
|
|
@@ -737,10 +365,6 @@ export function formatNoHealthyHarnessError(summaries, nowMs = Date.now()) {
|
|
|
737
365
|
}
|
|
738
366
|
export async function collectRunCandidates(agent) {
|
|
739
367
|
const versions = listInstalledVersions(agent);
|
|
740
|
-
// Read the local auth-health probe cache once (cache-only, no network — the
|
|
741
|
-
// daemon is the sole writer). A `revoked` verdict for a (host, agent, version)
|
|
742
|
-
// excludes that account from the pick; a missing row is fail-open. Keyed by the
|
|
743
|
-
// LOCAL host — routing decides which local version to launch.
|
|
744
368
|
const authCache = readAuthHealthCache();
|
|
745
369
|
const localHost = machineId();
|
|
746
370
|
const meta = readMeta();
|
|
@@ -794,23 +418,11 @@ export async function collectRunCandidates(agent) {
|
|
|
794
418
|
slotDirs.add(fs.realpathSync(row.home));
|
|
795
419
|
}
|
|
796
420
|
}
|
|
797
|
-
// Legacy per-account installations (`acct-*` homes) until T7 migrates them.
|
|
798
421
|
const versionRows = await Promise.all(versions.map(async (version) => {
|
|
799
422
|
const home = getVersionHomePath(agent, version);
|
|
800
423
|
if (fs.existsSync(home) && slotDirs.has(fs.realpathSync(home)))
|
|
801
424
|
return null;
|
|
802
425
|
const info = await getAccountInfo(agent, home);
|
|
803
|
-
// We used to additionally call isClaudeAuthValid(home), which reads
|
|
804
|
-
// "Claude Code-credentials-<hash>" from the system keychain. That item is
|
|
805
|
-
// written by Claude Code itself with its own process in the ACL, so our
|
|
806
|
-
// helper triggers a macOS keychain-authorization sheet on every probe —
|
|
807
|
-
// one per installed version, every time `agents run` cold-starts. If
|
|
808
|
-
// claude's stored token has actually expired, the spawned agent detects
|
|
809
|
-
// it at its own startup and re-auths; that's the correct UX.
|
|
810
|
-
//
|
|
811
|
-
// Gate signedIn on a real per-version credential when we know where it
|
|
812
|
-
// lives — see isLaunchableSignedIn. Do not reuse the active-home fallback
|
|
813
|
-
// identity for routing, or empty version homes look healthy and die at spawn.
|
|
814
426
|
const launchable = isLaunchableSignedIn(info.signedIn, credentialPresence(agent, home));
|
|
815
427
|
const authHealth = authCache[authCacheKey(localHost, agent, version)];
|
|
816
428
|
const authVerdict = authHealth?.verdict ?? null;
|
|
@@ -831,16 +443,6 @@ export async function collectRunCandidates(agent) {
|
|
|
831
443
|
};
|
|
832
444
|
}));
|
|
833
445
|
const rows = [...slotRows, ...versionRows.filter((row) => row !== null)];
|
|
834
|
-
// These candidates feed a routing decision on the `agents run` hot path, so
|
|
835
|
-
// this read is CACHE-ONLY (`readOnly`): it never blocks on a live provider
|
|
836
|
-
// fetch. A snapshot older than USAGE_DECISION_MAX_AGE_MS is not trusted for
|
|
837
|
-
// the pick — but the guard that enforces that is `isUsageVerified` below, not
|
|
838
|
-
// a blocking refresh here. Keeping the cache fresh is the daemon's job
|
|
839
|
-
// (`runUsageRefresh`, adaptive + rate-capped, sole-writer per local account),
|
|
840
|
-
// so a cold `agents run` reads the last daemon-written snapshot instead of
|
|
841
|
-
// stalling on N parallel HTTP round trips (the measured cold-start stall this
|
|
842
|
-
// removes). A stale-or-absent snapshot routes as unverified, exactly as a
|
|
843
|
-
// failed live read did before.
|
|
844
446
|
const { usageByKey } = await getUsageInfoByIdentity(rows.map(({ home, info, version }) => ({
|
|
845
447
|
agentId: agent,
|
|
846
448
|
home,
|
|
@@ -850,9 +452,6 @@ export async function collectRunCandidates(agent) {
|
|
|
850
452
|
return rows.map(({ home: _home, info, ...candidate }) => {
|
|
851
453
|
const usageKey = getUsageLookupKey(info);
|
|
852
454
|
const usage = usageKey ? usageByKey.get(usageKey) : undefined;
|
|
853
|
-
// Projected headroom is a separate cache-only read (also off the network) —
|
|
854
|
-
// the daemon publishes minutesToLimit; a cold cache yields null and routing
|
|
855
|
-
// falls back to snapshot-only weighting.
|
|
856
455
|
const headroom = usageKey ? readAccountHeadroom(usageKey) : null;
|
|
857
456
|
return {
|
|
858
457
|
...candidate,
|
|
@@ -863,12 +462,6 @@ export async function collectRunCandidates(agent) {
|
|
|
863
462
|
};
|
|
864
463
|
});
|
|
865
464
|
}
|
|
866
|
-
/**
|
|
867
|
-
* Collect run candidates for every harness with ≥1 installed version — the
|
|
868
|
-
* probe `agents run auto` routes on (the same per-harness account probe
|
|
869
|
-
* `agents view` aggregates). Harnesses with nothing installed are absent from
|
|
870
|
-
* the map: not a candidate at all, rather than an excluded one.
|
|
871
|
-
*/
|
|
872
465
|
export async function collectHarnessCandidates(agentIds = ALL_AGENT_IDS) {
|
|
873
466
|
const entries = await Promise.all(agentIds.map(async (agent) => {
|
|
874
467
|
if (listInstalledVersions(agent).length === 0)
|
|
@@ -882,13 +475,6 @@ export async function collectHarnessCandidates(agentIds = ALL_AGENT_IDS) {
|
|
|
882
475
|
}
|
|
883
476
|
return byHarness;
|
|
884
477
|
}
|
|
885
|
-
/**
|
|
886
|
-
* Resolve an account identity to the installed version slot that holds it, over
|
|
887
|
-
* an already-collected candidate list. Pure — no I/O — so it is unit-tested
|
|
888
|
-
* directly. Matches, case-insensitively, against a candidate's login `email`
|
|
889
|
-
* (the usual form) or its `accountKey`, and only ever returns a signed-in slot.
|
|
890
|
-
* Returns null when nothing matches, so the caller can fall back and warn.
|
|
891
|
-
*/
|
|
892
478
|
export function matchAccountCandidate(candidates, account, preferredLabel) {
|
|
893
479
|
const needle = account.trim().toLowerCase();
|
|
894
480
|
if (!needle)
|
|
@@ -904,16 +490,6 @@ export function matchAccountCandidate(candidates, account, preferredLabel) {
|
|
|
904
490
|
export function matchAccountVersion(candidates, account, preferredLabel) {
|
|
905
491
|
return matchAccountCandidate(candidates, account, preferredLabel)?.version ?? null;
|
|
906
492
|
}
|
|
907
|
-
/**
|
|
908
|
-
* Resolve a routine's `account:` pin (login email, account key, or native
|
|
909
|
-
* account name) to the candidate currently holding that account. Thin I/O
|
|
910
|
-
* wrapper over {@link collectRunCandidates} + {@link matchAccountCandidate};
|
|
911
|
-
* returns null when no signed-in candidate matches. Pinning a routine to a
|
|
912
|
-
* distinct account is the durable cure for the shared-single-use-refresh-token
|
|
913
|
-
* revocation storm (RUSH-1957): the pinned run never rotates and never lands
|
|
914
|
-
* on another routine's credential. Post-T5 the candidate's `nativeAccount`
|
|
915
|
-
* (not just `version`) is what disambiguates two slots on one managed install.
|
|
916
|
-
*/
|
|
917
493
|
export async function resolveAccountCandidate(agent, account, preferredLabel) {
|
|
918
494
|
const candidates = await collectRunCandidates(agent);
|
|
919
495
|
return matchAccountCandidate(candidates, account, preferredLabel);
|
|
@@ -921,36 +497,16 @@ export async function resolveAccountCandidate(agent, account, preferredLabel) {
|
|
|
921
497
|
export async function resolveAccountVersion(agent, account, preferredLabel) {
|
|
922
498
|
return (await resolveAccountCandidate(agent, account, preferredLabel))?.version ?? null;
|
|
923
499
|
}
|
|
924
|
-
/**
|
|
925
|
-
* Pick a healthy version for `agent` using weighted random by remaining
|
|
926
|
-
* capacity. See `pickBalancedCandidate` for algorithm details.
|
|
927
|
-
*
|
|
928
|
-
* No external state — health and capacity are both read off per-version
|
|
929
|
-
* AccountInfo (same data `agents view` surfaces). The weighted random roll
|
|
930
|
-
* keeps parallel callers fanned out without rotation files or locks.
|
|
931
|
-
*
|
|
932
|
-
* Returns null if no installed version is eligible. Callers fall back to the
|
|
933
|
-
* global default so behavior stays predictable — we never refuse to run.
|
|
934
|
-
*/
|
|
935
500
|
export async function selectBalancedVersion(agent) {
|
|
936
501
|
return pickBalancedCandidate(await collectRunCandidates(agent));
|
|
937
502
|
}
|
|
938
|
-
/**
|
|
939
|
-
* Record a rotation pick so parallel callers see it as recently-used.
|
|
940
|
-
* Writes a stamp file per agent — lightweight, no locking needed since
|
|
941
|
-
* a torn write just means the next reader sees a stale timestamp (harmless).
|
|
942
|
-
*/
|
|
943
503
|
function recordRotationPick(agent, version) {
|
|
944
504
|
const stampPath = path.join(getRotateDir(), `stamp-${agent}.json`);
|
|
945
505
|
try {
|
|
946
506
|
fs.writeFileSync(stampPath, JSON.stringify({ version, ts: Date.now() }), 'utf-8');
|
|
947
507
|
}
|
|
948
|
-
catch {
|
|
508
|
+
catch { }
|
|
949
509
|
}
|
|
950
|
-
/**
|
|
951
|
-
* Read the most recent rotation pick for an agent. Returns null if no stamp
|
|
952
|
-
* or stamp is older than 60 seconds (stale).
|
|
953
|
-
*/
|
|
954
510
|
function readRotationStamp(agent) {
|
|
955
511
|
const stampPath = path.join(getRotateDir(), `stamp-${agent}.json`);
|
|
956
512
|
try {
|
|
@@ -958,35 +514,10 @@ function readRotationStamp(agent) {
|
|
|
958
514
|
if (Date.now() - raw.ts < 60_000)
|
|
959
515
|
return raw.version;
|
|
960
516
|
}
|
|
961
|
-
catch {
|
|
517
|
+
catch { }
|
|
962
518
|
return null;
|
|
963
519
|
}
|
|
964
|
-
/** Cap on candidates serialized into a rotation decision event — a pathological
|
|
965
|
-
* backstop on the log line; a real fleet is ~19 accounts, well under it. The
|
|
966
|
-
* candidates are emitted as a keyed OBJECT (not an array) so the event sink's
|
|
967
|
-
* generic `sanitizeNested` does not truncate them to its 10-element array cap
|
|
968
|
-
* (feed/events.ts) — an object is recursed uncapped, so the whole pool up to
|
|
969
|
-
* this bound survives. */
|
|
970
520
|
const ROTATION_EVENT_CANDIDATE_CAP = 32;
|
|
971
|
-
/**
|
|
972
|
-
* Compact, queryable descriptor of ONE candidate exactly as the router saw it,
|
|
973
|
-
* for the `rotation.resolved`/`rotation.unresolved` event. These are the fields
|
|
974
|
-
* that disambiguate WHY a route landed on a bad account, so a post-mortem reads
|
|
975
|
-
* them from `agents events` instead of guessing:
|
|
976
|
-
*
|
|
977
|
-
* - `usageKey` is the per-org quota key — the ONLY identity that joins the same
|
|
978
|
-
* account across devices (version numbers are device-local and meaningless
|
|
979
|
-
* across the fleet).
|
|
980
|
-
* - `tier` is the freshness class the weighting actually used: `verified`
|
|
981
|
-
* (fresh windowed → routed at real headroom), `stale` (windowed but past the
|
|
982
|
-
* {@link USAGE_DECISION_MAX_AGE_MS} decision window → floored weight), `blind`
|
|
983
|
-
* (no snapshot at all — a worker whose usage endpoint 403s, or a never-synced
|
|
984
|
-
* network:false harness → still drawn at floor weight).
|
|
985
|
-
* - `source`/`ageMs`/`capturedAt` expose staleness and provenance: a `last_seen`
|
|
986
|
-
* snapshot showing `tier: verified` with a large `ageMs` is the cross-host
|
|
987
|
-
* clock-skew failure (capturedAt is stamped by the reading host's clock, this
|
|
988
|
-
* `ageMs` by the routing host's — they disagree under skew).
|
|
989
|
-
*/
|
|
990
521
|
function describeRotationCandidate(c, nowMs) {
|
|
991
522
|
const snap = c.usageSnapshot;
|
|
992
523
|
const capturedAtMs = snap?.capturedAt ? snap.capturedAt.getTime() : null;
|
|
@@ -994,20 +525,11 @@ function describeRotationCandidate(c, nowMs) {
|
|
|
994
525
|
const readiness = readinessFromCandidate(c);
|
|
995
526
|
return {
|
|
996
527
|
usageKey: c.usageKey,
|
|
997
|
-
// A RUSH-3182 provider/setup-token account carries a null usageKey and
|
|
998
|
-
// shares its `version` with the native login and every sibling provider
|
|
999
|
-
// account, so neither is a unique identity here. `accountKey` is the pool's
|
|
1000
|
-
// own dedup boundary (foldRegistryCandidates), and `providerAccount` names
|
|
1001
|
-
// the injected account — together they keep same-version rows distinct.
|
|
1002
528
|
accountKey: c.accountKey,
|
|
1003
529
|
providerAccount: c.providerAccount ?? null,
|
|
1004
530
|
email: c.email,
|
|
1005
531
|
version: c.version,
|
|
1006
532
|
signedIn: c.signedIn,
|
|
1007
|
-
// NOT `authVerdict`: the event sink's generic sanitizer redacts any payload
|
|
1008
|
-
// key matching /auth/i to "[REDACTED]" (feed/events.ts SENSITIVE_PAYLOAD_KEY),
|
|
1009
|
-
// which would silently blank this field on every row. `credentialVerdict`
|
|
1010
|
-
// carries the same value ('revoked'/null/…) past the redaction.
|
|
1011
533
|
credentialVerdict: c.authVerdict,
|
|
1012
534
|
usageStatus: c.usageStatus,
|
|
1013
535
|
tier,
|
|
@@ -1023,15 +545,6 @@ function describeRotationCandidate(c, nowMs) {
|
|
|
1023
545
|
excludedReason: readiness.ready ? null : readiness.reason,
|
|
1024
546
|
};
|
|
1025
547
|
}
|
|
1026
|
-
/**
|
|
1027
|
-
* Build the enriched `rotation.resolved`/`rotation.unresolved` event payload:
|
|
1028
|
-
* the full candidate pool as the router saw it, the pick and WHY, and a
|
|
1029
|
-
* freshness tally. Replaces the old `{ version, healthy: <n>, excluded: <n> }`
|
|
1030
|
-
* shape, which recorded only counts and a device-local version and so could not
|
|
1031
|
-
* tell a blind-pool draw from a skewed-verified pick from a refused-stale route
|
|
1032
|
-
* — the exact ambiguity that keeps a bad pick undebuggable from the log. All
|
|
1033
|
-
* candidates share ONE `nowMs` so their `tier`/`ageMs` are mutually consistent.
|
|
1034
|
-
*/
|
|
1035
548
|
export function buildRotationDecisionEvent(rotation, agent, strategy) {
|
|
1036
549
|
const nowMs = Date.now();
|
|
1037
550
|
const tally = { verified: 0, stale: 0, blind: 0 };
|
|
@@ -1044,12 +557,6 @@ export function buildRotationDecisionEvent(rotation, agent, strategy) {
|
|
|
1044
557
|
: hasStaleUsage(rotation.picked, nowMs)
|
|
1045
558
|
? 'stale'
|
|
1046
559
|
: 'blind';
|
|
1047
|
-
// WHY the pick: a verified-weighted draw is the healthy path; an
|
|
1048
|
-
// `unverified-*-draw` names the fallback the router was forced into (a blind
|
|
1049
|
-
// worker pool, or a stale-but-plausible number); `refused-no-verified` is the
|
|
1050
|
-
// fail-closed exit where no version launches. Read straight from the result's
|
|
1051
|
-
// own `usageUnverified`/`noVerifiedUsage`, so the event can never disagree
|
|
1052
|
-
// with what rotation actually did.
|
|
1053
560
|
const pickReason = rotation.noVerifiedUsage
|
|
1054
561
|
? 'refused-no-verified'
|
|
1055
562
|
: rotation.usageUnverified
|
|
@@ -1071,58 +578,20 @@ export function buildRotationDecisionEvent(rotation, agent, strategy) {
|
|
|
1071
578
|
healthy: rotation.healthy.length,
|
|
1072
579
|
excluded: rotation.excluded.length,
|
|
1073
580
|
freshness: tally,
|
|
1074
|
-
// An OBJECT (not an array), so the sink cannot truncate it to 10 entries
|
|
1075
|
-
// (see ROTATION_EVENT_CANDIDATE_CAP). Keyed by POOL INDEX, not by version or
|
|
1076
|
-
// usageKey: a RUSH-3182 provider-account pool has multiple candidates
|
|
1077
|
-
// sharing one `version` AND a null `usageKey` (foldRegistryCandidates), so
|
|
1078
|
-
// either would collide and silently drop rows via Object.fromEntries. The
|
|
1079
|
-
// index is structural only; each row's identity is its `accountKey` /
|
|
1080
|
-
// `usageKey` / `providerAccount`. `candidatesTotal` reveals cap overflow.
|
|
1081
581
|
candidates: Object.fromEntries(pool.slice(0, ROTATION_EVENT_CANDIDATE_CAP).map((c, i) => [String(i), describeRotationCandidate(c, nowMs)])),
|
|
1082
582
|
candidatesTotal: pool.length,
|
|
1083
583
|
};
|
|
1084
584
|
}
|
|
1085
|
-
/**
|
|
1086
|
-
* Build AND emit a rotation decision event without ever letting an observability
|
|
1087
|
-
* bug crash a live route. `emit` swallows its own IO errors, but the payload
|
|
1088
|
-
* ARGUMENT is evaluated before `emit` is called, so a future null-deref inside
|
|
1089
|
-
* `describeRotationCandidate` would otherwise propagate into `resolveRunVersion`
|
|
1090
|
-
* and abort the launch. This wraps both build and emit, so the worst case is a
|
|
1091
|
-
* lost log line, never a failed run.
|
|
1092
|
-
*/
|
|
1093
585
|
function emitRotationDecision(event, rotation, agent, strategy, extra = {}) {
|
|
1094
586
|
try {
|
|
1095
587
|
emit(event, { ...buildRotationDecisionEvent(rotation, agent, strategy), ...extra });
|
|
1096
588
|
}
|
|
1097
589
|
catch {
|
|
1098
|
-
/* observability must never break a route */
|
|
1099
590
|
}
|
|
1100
591
|
}
|
|
1101
|
-
/**
|
|
1102
|
-
* Resolve the version `agents run` should use when the caller did not pin
|
|
1103
|
-
* one with `@version`. The caller supplies the effective strategy.
|
|
1104
|
-
*
|
|
1105
|
-
* `pinned` still prefers the workspace/global default, but it MUST NOT launch
|
|
1106
|
-
* a logged-out (or revoked) default when the same device holds a signed-in
|
|
1107
|
-
* version that can run — that was a silent 1-second death on fleet workers
|
|
1108
|
-
* whose default home had no credential (PHNX-2685). A rate-limited pin is
|
|
1109
|
-
* still honoured: `--strategy pinned` remains the escape hatch to force the
|
|
1110
|
-
* default through a throttle. When the default is auth-blocked and nothing
|
|
1111
|
-
* else is healthy, `exhausted` is set so the caller fails loud instead of
|
|
1112
|
-
* spawning into a credential-less home.
|
|
1113
|
-
*/
|
|
1114
592
|
export async function resolveRunVersion(agent, strategy, cwd = process.cwd(), collect = collectRunCandidates, model) {
|
|
1115
593
|
const fallback = resolveVersion(agent, cwd);
|
|
1116
594
|
const candidates = await collect(agent);
|
|
1117
|
-
// Entirely stale usage (PHNX-2526): every eligible account carries a
|
|
1118
|
-
// stale-but-present number and none is verified. Refuse to auto-pick on a
|
|
1119
|
-
// number that looks plausible but is wrong. `rotation` is returned so its
|
|
1120
|
-
// `healthy` set survives for BOUNDED post-rejection failover, but `version`
|
|
1121
|
-
// is null so the caller diverts — interactive to the account picker,
|
|
1122
|
-
// unattended to a loud NO_VERIFIED_USAGE exit. Shared across BOTH rotating
|
|
1123
|
-
// paths (the pinned auth-blocked-pin fallback AND balanced/available), since
|
|
1124
|
-
// both reuse `pickAvailableCandidate`/`pickBalancedCandidate` and neither may
|
|
1125
|
-
// launch a stale pick.
|
|
1126
595
|
const refuseStaleUsage = (rotation) => {
|
|
1127
596
|
emitRotationDecision('rotation.unresolved', rotation, agent, strategy, {
|
|
1128
597
|
reason: 'no_verified_usage',
|
|
@@ -1133,14 +602,8 @@ export async function resolveRunVersion(agent, strategy, cwd = process.cwd(), co
|
|
|
1133
602
|
const pinnedCandidate = fallback
|
|
1134
603
|
? candidates.find((c) => c.version === fallback)
|
|
1135
604
|
: undefined;
|
|
1136
|
-
// Auth-blocked pin: the home cannot authenticate, so launching it is a
|
|
1137
|
-
// guaranteed miss. Prefer a signed-in sibling on this device.
|
|
1138
605
|
if (pinnedCandidate && isSignInRecoverable(readinessFromCandidate(pinnedCandidate))) {
|
|
1139
606
|
const rotation = pickAvailableCandidate(candidates, fallback, undefined, model);
|
|
1140
|
-
// The auth-blocked pin rotates to a sibling — an initial selection, so it
|
|
1141
|
-
// gets the same verified-only gate as balanced/available. Without this, a
|
|
1142
|
-
// revoked pin with only stale siblings launched one blind (the yosemite-s1
|
|
1143
|
-
// trap through the pinned path — PR #3295 review).
|
|
1144
607
|
if (rotation && rotation.noVerifiedUsage)
|
|
1145
608
|
return refuseStaleUsage(rotation);
|
|
1146
609
|
if (rotation) {
|
|
@@ -1161,10 +624,6 @@ export async function resolveRunVersion(agent, strategy, cwd = process.cwd(), co
|
|
|
1161
624
|
if (rotation && rotation.noVerifiedUsage)
|
|
1162
625
|
return refuseStaleUsage(rotation);
|
|
1163
626
|
if (rotation) {
|
|
1164
|
-
// `available` is sticky to the pinned default when healthy. Use the 60s
|
|
1165
|
-
// anti-collision stamp to nudge parallel callers off the same version.
|
|
1166
|
-
// `balanced` doesn't need this — its weighted random roll already
|
|
1167
|
-
// distributes naturally across healthy accounts.
|
|
1168
627
|
if (strategy === 'available') {
|
|
1169
628
|
const recentPick = readRotationStamp(agent);
|
|
1170
629
|
if (recentPick === rotation.picked.version && rotation.healthy.length > 1) {
|
|
@@ -1179,42 +638,14 @@ export async function resolveRunVersion(agent, strategy, cwd = process.cwd(), co
|
|
|
1179
638
|
}
|
|
1180
639
|
return { version: fallback, rotation: null, exhausted: candidates.length > 0 ? candidates : undefined };
|
|
1181
640
|
}
|
|
1182
|
-
/**
|
|
1183
|
-
* Cap on the number of healthy accounts a single run will re-dispatch through
|
|
1184
|
-
* after a mid-run rate limit. Bounds the synthesized chain so a machine signed
|
|
1185
|
-
* into many accounts can't turn one 429 into an unbounded cascade of retries.
|
|
1186
|
-
*/
|
|
1187
641
|
export const DEFAULT_ROTATION_FAILOVER_LIMIT = 3;
|
|
1188
|
-
/**
|
|
1189
|
-
* Synthesize a same-agent, cross-account fallback chain from a pre-flight
|
|
1190
|
-
* rotation result (issue #348: mid-run rate-limit failover).
|
|
1191
|
-
*
|
|
1192
|
-
* The account rotation picks ONE version pre-spawn; today a 429 mid-run kills
|
|
1193
|
-
* the run with no recovery. `runWithFallback` + `detectRateLimit` already
|
|
1194
|
-
* re-dispatch to the NEXT chain entry on a rate limit and hand off the session
|
|
1195
|
-
* via `/continue <id>` — but only for explicit `--fallback` chains. This turns
|
|
1196
|
-
* the OTHER healthy rotation candidates (every account except the one already
|
|
1197
|
-
* picked as the primary) into `FallbackEntry`s so that SAME machinery re-runs
|
|
1198
|
-
* the task on the next healthy account of the same agent when the primary 429s.
|
|
1199
|
-
*
|
|
1200
|
-
* Each account is a distinct installed version (its own home/auth), so the
|
|
1201
|
-
* entries are same-agent, different-version — exactly what runWithFallback
|
|
1202
|
-
* spawns and what buildFallbackPrompt continues (claude→claude via `/continue`).
|
|
1203
|
-
* Candidates are consumed in `rotation.healthy` order, which is sorted by
|
|
1204
|
-
* remaining capacity (most headroom first, see compareCandidates), so failover
|
|
1205
|
-
* prefers the freshest account.
|
|
1206
|
-
*
|
|
1207
|
-
* Returns `[]` when there is no rotation (pinned strategy) or the picked account
|
|
1208
|
-
* is the only healthy one — so single-account users and non-rotation runs are
|
|
1209
|
-
* completely unchanged.
|
|
1210
|
-
*/
|
|
1211
642
|
export function rotationFailoverChain(rotation, pickedVersion, limit = DEFAULT_ROTATION_FAILOVER_LIMIT) {
|
|
1212
643
|
if (!rotation || limit <= 0)
|
|
1213
644
|
return [];
|
|
1214
645
|
const chain = [];
|
|
1215
646
|
for (const candidate of rotation.healthy) {
|
|
1216
647
|
if (candidate.version === pickedVersion)
|
|
1217
|
-
continue;
|
|
648
|
+
continue;
|
|
1218
649
|
chain.push({ agent: candidate.agent, version: candidate.version });
|
|
1219
650
|
if (chain.length >= limit)
|
|
1220
651
|
break;
|
|
@@ -1230,30 +661,6 @@ export function preflightHandoffEligible(ctx) {
|
|
|
1230
661
|
!ctx.resume &&
|
|
1231
662
|
!ctx.workflowScoped);
|
|
1232
663
|
}
|
|
1233
|
-
/**
|
|
1234
|
-
* The permitted alternate harness to launch when EVERY account of the primary
|
|
1235
|
-
* agent is already exhausted at PREFLIGHT (PHNX-3999 F19).
|
|
1236
|
-
*
|
|
1237
|
-
* `runWithFallback` only reaches a `--fallback` entry after the primary has
|
|
1238
|
-
* actually RUN and hit a rate limit. When the primary's accounts are throttled
|
|
1239
|
-
* before the run starts, version resolution reports `exhausted` and the run used
|
|
1240
|
-
* to exit — so the alternate a user configured for exactly this case never fired.
|
|
1241
|
-
* This resolves the first usable alternate from the same `--fallback` spec, and
|
|
1242
|
-
* returns the remainder of the spec so the alternate becomes the primary and is
|
|
1243
|
-
* not also listed as its own fallback.
|
|
1244
|
-
*
|
|
1245
|
-
* Deliberately NOT a second parser: an entry this cannot resolve exactly — a
|
|
1246
|
-
* typo, an alias the canonical parse would fuzzy-match, the primary itself —
|
|
1247
|
-
* makes the WHOLE spec yield `null`, so the run reaches the one canonical
|
|
1248
|
-
* `--fallback` parse and fails (or corrects) there with the message it already
|
|
1249
|
-
* has. `--fallback typoo,codex` must never silently launch codex while dropping
|
|
1250
|
-
* `typoo`.
|
|
1251
|
-
*
|
|
1252
|
-
* Returns `null` when there is no spec, when any entry is not an exact agent id
|
|
1253
|
-
* or names the primary, or when the primary is only sign-in-recoverable rather
|
|
1254
|
-
* than throttled — a logged-out account is fixed by logging in, not by silently
|
|
1255
|
-
* running a different harness.
|
|
1256
|
-
*/
|
|
1257
664
|
export function preflightFallbackHandoff(spec, primary, exhausted) {
|
|
1258
665
|
if (!spec)
|
|
1259
666
|
return null;
|
|
@@ -1265,7 +672,6 @@ export function preflightFallbackHandoff(spec, primary, exhausted) {
|
|
|
1265
672
|
if (entries.length === 0)
|
|
1266
673
|
return null;
|
|
1267
674
|
const parsed = entries.map((entry) => entry.split('@'));
|
|
1268
|
-
// Every entry has to be exactly resolvable, or this defers entirely.
|
|
1269
675
|
if (parsed.some(([name]) => !isAgentId(name) || name === primary))
|
|
1270
676
|
return null;
|
|
1271
677
|
const [name, version] = parsed[0];
|