@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
package/dist/commands/ssh.js
CHANGED
|
@@ -1,14 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `agents devices` (registry) + `agents ssh` (smart wrapper).
|
|
3
|
-
*
|
|
4
|
-
* `agents devices` keeps a registry of SSH device profiles — platform, login
|
|
5
|
-
* user, address, and auth — self-populated from `tailscale status --json`.
|
|
6
|
-
* `agents ssh <name>` then connects through one hardened path: preflight
|
|
7
|
-
* (offline → fail fast instead of a 2-minute hang), platform-aware exec
|
|
8
|
-
* (PowerShell on Windows), and password-from-bundle auth via an askpass shim.
|
|
9
|
-
* Rendering the registry to an ssh_config include also lets plain ssh / scp /
|
|
10
|
-
* rsync / `agents sessions --device` resolve the same logical names.
|
|
11
|
-
*/
|
|
12
1
|
import { spawnSync } from 'child_process';
|
|
13
2
|
import * as fs from 'fs';
|
|
14
3
|
import * as os from 'os';
|
|
@@ -63,14 +52,9 @@ import { filterAutoPool, listWorkerDevices } from '../lib/devices/pool.js';
|
|
|
63
52
|
import { registerCommandGroups, setHelpSections } from '../lib/help.js';
|
|
64
53
|
import { isSelfHost } from '../lib/devices/self-host.js';
|
|
65
54
|
import { collectHeldWorktrees, collectHeldWorktreesUnder, summarizeHeld, aggregateHeld, pushStrandedBranch, } from '../lib/worktree/held.js';
|
|
66
|
-
/** One-line summary of a device for `list`. `isSelf` marks the machine this
|
|
67
|
-
* command is running on so it stands out from the rest of the tailnet.
|
|
68
|
-
* `isInteractive` marks the configured interactive host (`devices config <name> interactive.host`). */
|
|
69
55
|
function deviceSummary(d, isSelf = false, stats, isInteractive = false, roles) {
|
|
70
56
|
d = resolveDeviceProfile(d);
|
|
71
57
|
const addr = hostNameFor(d) ?? chalk.gray('no address');
|
|
72
|
-
// Prefer a fresh live verdict (this run's probe, else the written-back
|
|
73
|
-
// reachability) over the stale tailscale.online snapshot (RUSH-1965).
|
|
74
58
|
const state = deviceOnlineState(d, stats);
|
|
75
59
|
const online = state === 'online'
|
|
76
60
|
? chalk.green('online')
|
|
@@ -81,18 +65,11 @@ function deviceSummary(d, isSelf = false, stats, isInteractive = false, roles) {
|
|
|
81
65
|
const marker = isSelf ? chalk.cyan('▸ ') : ' ';
|
|
82
66
|
const name = isSelf ? chalk.bold.cyan(d.name.padEnd(16)) : chalk.bold(d.name.padEnd(16));
|
|
83
67
|
const here = isSelf ? chalk.cyan(' ← this machine') : '';
|
|
84
|
-
// `roles` defaults to a single-device roster so a fleet-wide `role` default
|
|
85
|
-
// still reaches this device even when it has no per-device doc of its own.
|
|
86
68
|
const roleMap = roles ?? listConfiguredDeviceRoles([d.name]);
|
|
87
|
-
// `personal` already means "the interactive box you sit at", so the star would
|
|
88
|
-
// just repeat it — show it only when the interactive host is NOT a personal box
|
|
89
|
-
// (e.g. an unmarked or worker box deliberately pinned as the artifact target).
|
|
90
69
|
const interactive = isInteractive && roleMap[d.name] !== 'personal' ? chalk.yellow(' ★ interactive') : '';
|
|
91
70
|
const role = roleTag(d.name, roleMap);
|
|
92
71
|
return `${marker}${name} ${String(d.platform).padEnd(8)} ${(d.user ? d.user + '@' : '') + addr} ${online}${reach}${here}${interactive}${role}`;
|
|
93
72
|
}
|
|
94
|
-
/** The fleet-wide role mark, rendered for a device row. Empty when unmarked —
|
|
95
|
-
* an unmarked device is the common case and must not add a column of noise. */
|
|
96
73
|
function roleTag(name, roles) {
|
|
97
74
|
const role = roles[name];
|
|
98
75
|
if (!role)
|
|
@@ -112,7 +89,6 @@ const HEADROOM_BADGE = {
|
|
|
112
89
|
loaded: chalk.red('● loaded'),
|
|
113
90
|
unknown: chalk.gray('· —'),
|
|
114
91
|
};
|
|
115
|
-
/** A right-aligned percentage cell, colored by severity (green/yellow/red). */
|
|
116
92
|
function pctCell(v, width) {
|
|
117
93
|
if (v === undefined)
|
|
118
94
|
return chalk.gray('—'.padStart(width));
|
|
@@ -123,45 +99,19 @@ function pctCell(v, width) {
|
|
|
123
99
|
return chalk.yellow(s);
|
|
124
100
|
return chalk.red(s);
|
|
125
101
|
}
|
|
126
|
-
/** Floor for the `spec` column; the real width is measured from the rows.
|
|
127
|
-
*
|
|
128
|
-
* A fixed width cannot work here: `fmtBytes` emits an optional decimal, so a
|
|
129
|
-
* spec string runs from `8c 16G 256G` (11) to `10c 23.5G 460G` (14) depending
|
|
130
|
-
* purely on the hardware behind it. Anything narrower than the widest row
|
|
131
|
-
* pushes load/mem/disk/headroom out of alignment row-to-row AND against the
|
|
132
|
-
* header — which defeats the scannability this column exists for. */
|
|
133
102
|
const SPEC_WIDTH_MIN = 12;
|
|
134
|
-
/** The static hardware as one compact cell — `12c 64G 1T`: cores, total RAM,
|
|
135
|
-
* total root disk via fmtBytes. `—` covers two cases: no probe has ever seen
|
|
136
|
-
* the box, or the probe answered but yielded no usable core count (`parseNcpu`
|
|
137
|
-
* finding none, or the Windows `ncpu` group failing the finite-and-positive
|
|
138
|
-
* check) — the cell is keyed on `ncpu` because a spec string without it would
|
|
139
|
-
* read as a machine with zero cores.
|
|
140
|
-
*
|
|
141
|
-
* Deliberately NOT gated on `reachable`: hardware does not change while a
|
|
142
|
-
* machine is down, so an offline device keeps rendering the spec from its last
|
|
143
|
-
* successful probe (`retainHardwareFacts`, RUSH-3096) rather than blanking a
|
|
144
|
-
* fact that is still true. The volatile columns beside it — load, mem, disk
|
|
145
|
-
* used — stay `—`, and `fleetCapacity` still counts only reachable boxes, so
|
|
146
|
-
* a down machine never contributes to usable capacity.
|
|
147
|
-
*
|
|
148
|
-
* Unpadded; {@link renderDeviceTable} pads to the measured column width. */
|
|
149
103
|
function specText(stats) {
|
|
150
104
|
if (!stats?.ncpu)
|
|
151
105
|
return '—';
|
|
152
106
|
return `${stats.ncpu}c ${fmtBytes(stats.memTotalBytes)} ${fmtBytes(stats.diskTotalBytes)}`;
|
|
153
107
|
}
|
|
154
|
-
/** The widest spec string across the rows actually being rendered, floored at
|
|
155
|
-
* SPEC_WIDTH_MIN so a short fleet still lines up with the header. */
|
|
156
108
|
function specColumnWidth(names, statsMap) {
|
|
157
109
|
return Math.max(SPEC_WIDTH_MIN, ...names.map((n) => stringWidth(specText(statsMap.get(n)))));
|
|
158
110
|
}
|
|
159
|
-
/** Colour + pad one spec cell to the measured column width. */
|
|
160
111
|
function specCell(stats, width) {
|
|
161
112
|
const text = specText(stats);
|
|
162
113
|
return (text === '—' ? chalk.gray : chalk.greenBright)(text.padEnd(width));
|
|
163
114
|
}
|
|
164
|
-
/** The one-line `description` config value per device (absent when unset). */
|
|
165
115
|
function listDeviceDescriptions(names) {
|
|
166
116
|
const out = {};
|
|
167
117
|
for (const n of names) {
|
|
@@ -171,37 +121,19 @@ function listDeviceDescriptions(names) {
|
|
|
171
121
|
}
|
|
172
122
|
return out;
|
|
173
123
|
}
|
|
174
|
-
/**
|
|
175
|
-
* Fit a device row to the terminal width. The description is the FIRST thing
|
|
176
|
-
* to truncate, then the role tag; the fixed columns (device, platform, spec,
|
|
177
|
-
* load/mem/disk numbers, headroom, and the ▸/★/←/relay markers) never
|
|
178
|
-
* truncate. `role` and `desc` arrive fully rendered (ansi + leading gap).
|
|
179
|
-
*/
|
|
180
124
|
function fitDeviceRow(fixed, role, desc, width) {
|
|
181
125
|
const w = (s) => stringWidth(stripAnsi(s));
|
|
182
126
|
let over = w(fixed) + w(role) + w(desc) - width;
|
|
183
127
|
if (over > 0 && desc) {
|
|
184
|
-
// `desc` is ' ' + gray(text) — truncate the text, keep the gap.
|
|
185
128
|
const text = stripAnsi(desc).slice(2);
|
|
186
129
|
const budget = w(text) - over;
|
|
187
130
|
desc = budget > 0 ? ' ' + chalk.gray(truncateToWidth(text, budget)) : '';
|
|
188
131
|
over = w(fixed) + w(role) + w(desc) - width;
|
|
189
132
|
}
|
|
190
|
-
// A partial role word ("work…") reads as a bug — when it can't fit whole,
|
|
191
|
-
// it drops entirely. The numbers are never touched.
|
|
192
133
|
if (over > 0 && role)
|
|
193
134
|
role = '';
|
|
194
135
|
return fixed + role + desc;
|
|
195
136
|
}
|
|
196
|
-
/**
|
|
197
|
-
* Render the device list. When `statsMap` is provided, resource columns are
|
|
198
|
-
* appended — a `spec` cell (cores / total RAM / total disk), normalized load,
|
|
199
|
-
* memory and disk-used percentages, a headroom badge, and (in `full` mode)
|
|
200
|
-
* free/total memory — with the per-device role and `description` riding the
|
|
201
|
-
* tail, so it's obvious which boxes have room and what each box is for.
|
|
202
|
-
* Without it (probe skipped) the classic reachability line is used. A fleet
|
|
203
|
-
* capacity summary is appended whenever stats were gathered.
|
|
204
|
-
*/
|
|
205
137
|
export function renderDeviceTable(reg, names, self, statsMap, full = false, interactiveHost, opts = {}) {
|
|
206
138
|
if (!statsMap) {
|
|
207
139
|
const roles = listConfiguredDeviceRoles(names);
|
|
@@ -229,8 +161,6 @@ export function renderDeviceTable(reg, names, self, statsMap, full = false, inte
|
|
|
229
161
|
chalk.gray('description');
|
|
230
162
|
lines.push(head);
|
|
231
163
|
for (const name of names) {
|
|
232
|
-
// Effective profile: the operator's central config (ssh.*/platform/user)
|
|
233
|
-
// overlays the discovery record, so the table shows what would be dialed.
|
|
234
164
|
const d = resolveDeviceProfile(reg[name]);
|
|
235
165
|
const isSelf = name === self;
|
|
236
166
|
const marker = isSelf ? chalk.cyan('▸ ') : ' ';
|
|
@@ -239,21 +169,8 @@ export function renderDeviceTable(reg, names, self, statsMap, full = false, inte
|
|
|
239
169
|
const stats = statsMap.get(name);
|
|
240
170
|
const role = roleTag(name, deviceRoles);
|
|
241
171
|
const desc = descriptions[name] ? ' ' + chalk.gray(descriptions[name]) : '';
|
|
242
|
-
// Prefer this run's live probe, then the written-back verdict, over the
|
|
243
|
-
// stale tailscale.online snapshot — so a reachable box never renders
|
|
244
|
-
// "offline" while its live load/mem sit one column over (RUSH-1965).
|
|
245
172
|
const offline = deviceOnlineState(d, stats) === 'offline';
|
|
246
173
|
if (offline) {
|
|
247
|
-
// The spec cell rides the offline row: hardware is what the box IS, not
|
|
248
|
-
// what it is doing, so it stays legible while the machine is down
|
|
249
|
-
// (RUSH-3096). The live columns are omitted rather than dashed — there is
|
|
250
|
-
// no current load/mem/disk to report for a box that did not answer.
|
|
251
|
-
//
|
|
252
|
-
// The explicit gap is load-bearing: `specCell` pads to the MEASURED
|
|
253
|
-
// column width, so the widest spec on the fleet pads to nothing and the
|
|
254
|
-
// marker would collide with it ("455Goffline"). An online row gets its
|
|
255
|
-
// separation for free from `pctCell`'s right-alignment; this one has no
|
|
256
|
-
// numeric cell to lean on.
|
|
257
174
|
lines.push(fitDeviceRow(`${marker}${label}${plat} ${specCell(stats, specWidth)} ${chalk.gray('offline')}`, role, desc, width));
|
|
258
175
|
continue;
|
|
259
176
|
}
|
|
@@ -269,13 +186,9 @@ export function renderDeviceTable(reg, names, self, statsMap, full = false, inte
|
|
|
269
186
|
: '';
|
|
270
187
|
const badge = HEADROOM_BADGE[headroom(stats)];
|
|
271
188
|
const here = isSelf ? chalk.cyan(' ← this machine') : '';
|
|
272
|
-
// A `personal` role already conveys "your interactive seat"; don't double-
|
|
273
|
-
// render the star on it. Keep it for a non-personal pinned interactive host.
|
|
274
189
|
const interactive = name === interactiveHost && deviceRoles[name] !== 'personal' ? chalk.yellow(' ★ interactive') : '';
|
|
275
190
|
lines.push(fitDeviceRow(`${marker}${label}${plat} ${specCell(stats, specWidth)}${load}${mem}${disk}${freeTotal} ${badge}${relay}${here}${interactive}`, role, desc, width));
|
|
276
191
|
}
|
|
277
|
-
// Fleet capacity summary — total cores, how much RAM is free right now, and
|
|
278
|
-
// total free root disk across the reachable fleet.
|
|
279
192
|
const cap = fleetCapacity(statsMap.values());
|
|
280
193
|
if (cap.reachable > 0) {
|
|
281
194
|
const freePct = cap.memTotalBytes > 0 ? Math.round((cap.memFreeBytes / cap.memTotalBytes) * 100) : 0;
|
|
@@ -290,13 +203,6 @@ export function renderDeviceTable(reg, names, self, statsMap, full = false, inte
|
|
|
290
203
|
}
|
|
291
204
|
return lines;
|
|
292
205
|
}
|
|
293
|
-
/**
|
|
294
|
-
* Live "Leased boxes" section for `agents devices` (F4, RUSH-1923), computed
|
|
295
|
-
* from `crabboxList()` — these are ephemeral crabbox leases, NEVER written into
|
|
296
|
-
* the device registry. Returns [] when crabbox is unavailable / has no creds /
|
|
297
|
-
* reports no boxes, so the section is simply omitted. `nowSecs` is injected so
|
|
298
|
-
* the row formatting is deterministic in tests.
|
|
299
|
-
*/
|
|
300
206
|
export function renderLeasedBoxesSection(boxes, nowSecs) {
|
|
301
207
|
if (boxes.length === 0)
|
|
302
208
|
return [];
|
|
@@ -323,40 +229,25 @@ export function renderLeasedBoxesSection(boxes, nowSecs) {
|
|
|
323
229
|
lines.push(chalk.gray(' Reuse a box with `agents run --box <slug>` · stop with `agents devices lease stop <slug>`'));
|
|
324
230
|
return lines;
|
|
325
231
|
}
|
|
326
|
-
/** The leased-box rows for the devices list, or [] when crabbox can't be read. */
|
|
327
232
|
function loadLeasedBoxesSection() {
|
|
328
233
|
try {
|
|
329
234
|
const boxes = crabboxList({ secretsBundle: process.env.AGENTS_LEASE_SECRETS_BUNDLE, timeoutMs: 5000 });
|
|
330
235
|
return renderLeasedBoxesSection(boxes, Math.floor(Date.now() / 1000));
|
|
331
236
|
}
|
|
332
237
|
catch {
|
|
333
|
-
return [];
|
|
238
|
+
return [];
|
|
334
239
|
}
|
|
335
240
|
}
|
|
336
|
-
/**
|
|
337
|
-
* Whether `agents devices list` shows the "Leased boxes" section (RUSH-2190).
|
|
338
|
-
* Opt-in via --all only: loading it scans the keychain for bundle credentials
|
|
339
|
-
* and can raise a Touch ID sheet after the table has printed, so the default
|
|
340
|
-
* list must never reach for it. --no-stats stays the hard "instant, no provider
|
|
341
|
-
* calls" opt-out even when --all is passed.
|
|
342
|
-
*/
|
|
343
241
|
export function showLeasedBoxesSection(opts) {
|
|
344
242
|
return opts.all === true && opts.stats !== false;
|
|
345
243
|
}
|
|
346
|
-
/**
|
|
347
|
-
* `agents ssh <slug>` targeting a leased crabbox box. crabbox provisions a
|
|
348
|
-
* per-lease identity key, so we ssh via crabbox's OWN emitted invocation
|
|
349
|
-
* (`crabboxSshArgv`) — a raw `ssh crabbox@ip` fails publickey. Returns false when
|
|
350
|
-
* `name` is not a known crabbox slug so the caller can fall through to the normal
|
|
351
|
-
* "Unknown device" error.
|
|
352
|
-
*/
|
|
353
244
|
function trySshLeasedBox(name, cmd) {
|
|
354
245
|
let box;
|
|
355
246
|
try {
|
|
356
247
|
box = crabboxFind(name, { secretsBundle: process.env.AGENTS_LEASE_SECRETS_BUNDLE, timeoutMs: 5000 });
|
|
357
248
|
}
|
|
358
249
|
catch {
|
|
359
|
-
return false;
|
|
250
|
+
return false;
|
|
360
251
|
}
|
|
361
252
|
if (!box)
|
|
362
253
|
return false;
|
|
@@ -365,22 +256,13 @@ function trySshLeasedBox(name, cmd) {
|
|
|
365
256
|
console.error(chalk.red(`Leased box '${name}' is not reachable yet (status: ${boxStatus(box)}).`));
|
|
366
257
|
process.exit(1);
|
|
367
258
|
}
|
|
368
|
-
// Crabbox ssh does not go through buildSshInvocation; stamp the same
|
|
369
|
-
// consent marker so a browser drive on a leased box is gated too.
|
|
370
259
|
const remoteCmd = leasedBoxRemoteCmd(cmd);
|
|
371
260
|
const res = spawnSync(sshArgv[0], [...sshArgv.slice(1), ...remoteCmd], { stdio: 'inherit' });
|
|
372
261
|
process.exit(res.status ?? 1);
|
|
373
262
|
}
|
|
374
|
-
/**
|
|
375
|
-
* Remote argv for `agents ssh <slug>` into a leased crabbox. Crabbox ssh does
|
|
376
|
-
* not go through {@link buildSshInvocation}, so this stamps the same
|
|
377
|
-
* AGENTS_FLEET_REMOTE consent marker a registered-device ssh would (PHNX-3065).
|
|
378
|
-
* Exported so the branch is unit-testable without a live crabbox.
|
|
379
|
-
*/
|
|
380
263
|
export function leasedBoxRemoteCmd(cmd) {
|
|
381
264
|
return isAgentsBrowserDrive(cmd) ? markFleetRemote(cmd, { shell: 'posix' }) : cmd;
|
|
382
265
|
}
|
|
383
|
-
/** Resolve a device or exit with a clear error. */
|
|
384
266
|
async function mustGetDevice(name) {
|
|
385
267
|
const d = await getDevice(name);
|
|
386
268
|
if (!d) {
|
|
@@ -389,14 +271,6 @@ async function mustGetDevice(name) {
|
|
|
389
271
|
}
|
|
390
272
|
return d;
|
|
391
273
|
}
|
|
392
|
-
/**
|
|
393
|
-
* Interactive `agents devices sync`: discover tailscale nodes, present a
|
|
394
|
-
* checkbox pre-checked with what's already registered, and reconcile the
|
|
395
|
-
* choice. Checked = registered (and un-ignored). Unchecked = removed from the
|
|
396
|
-
* registry AND added to the ignore-list, so auto-discovery never re-suggests
|
|
397
|
-
* it — this is the "click to register/unregister" surface, with dismissals that
|
|
398
|
-
* stick.
|
|
399
|
-
*/
|
|
400
274
|
async function runInteractiveDeviceSync() {
|
|
401
275
|
const spinner = ora('Reading tailscale status...').start();
|
|
402
276
|
let nodes;
|
|
@@ -418,12 +292,6 @@ async function runInteractiveDeviceSync() {
|
|
|
418
292
|
let selected;
|
|
419
293
|
try {
|
|
420
294
|
selected = await checkbox({
|
|
421
|
-
// Everything not already dismissed starts checked, so pressing Enter keeps
|
|
422
|
-
// the fleet as-is (matching what auto-sync would register). Unchecking a
|
|
423
|
-
// device removes it AND dismisses it so auto-sync never re-adds it.
|
|
424
|
-
// Sharee nodes (shared in by another user) start unchecked unless already
|
|
425
|
-
// registered — registering one must be a deliberate check, never the
|
|
426
|
-
// default Enter.
|
|
427
295
|
message: 'Your fleet — uncheck a device to remove and stop suggesting it:',
|
|
428
296
|
pageSize: Math.min(nodes.length, 20),
|
|
429
297
|
choices: nodes.map((n) => {
|
|
@@ -464,16 +332,6 @@ async function runInteractiveDeviceSync() {
|
|
|
464
332
|
].filter(Boolean);
|
|
465
333
|
console.log(parts.join(chalk.gray(' · ')));
|
|
466
334
|
}
|
|
467
|
-
/**
|
|
468
|
-
* Print a per-device result table for fleet update/run.
|
|
469
|
-
*
|
|
470
|
-
* `verifications` is supplied only by the rollout (`agents fleet update`), which
|
|
471
|
-
* re-probes what `agents` resolves to on each upgraded box. A box that upgraded
|
|
472
|
-
* with `exit 0` but still resolves to another copy — the dev-install shadow of
|
|
473
|
-
* RUSH-2446 — is rendered `stale` / `unverified`, counted as **not upgraded**,
|
|
474
|
-
* and makes the command exit non-zero. An `exit 0` alone never reads as `ok` on
|
|
475
|
-
* a rollout again.
|
|
476
|
-
*/
|
|
477
335
|
function printFleetResults(results, verifications) {
|
|
478
336
|
const nameW = Math.max(8, ...results.map((r) => r.name.length));
|
|
479
337
|
console.log(chalk.bold('DEVICE'.padEnd(nameW)) + ' ' +
|
|
@@ -520,15 +378,9 @@ async function localHealthRow(self, stats) {
|
|
|
520
378
|
clis: checkAllClis(),
|
|
521
379
|
sync: checkSyncStatus(process.cwd()),
|
|
522
380
|
orphans: countOrphans(),
|
|
523
|
-
// Local baseline inventory for cross-device divergence (RUSH-2027) — the
|
|
524
|
-
// yardstick every remote box is compared against.
|
|
525
381
|
inventory: await collectLocalFleetInventory(process.cwd()),
|
|
526
382
|
};
|
|
527
383
|
}
|
|
528
|
-
/** SSH into a host and read its already-computed fleet-status row (a cheap
|
|
529
|
-
* `fleet status --local --json` on the peer — NOT a fresh remote resource probe;
|
|
530
|
-
* the peer's daemon keeps that row warm). Bounded + reaped via sshExecAsync's
|
|
531
|
-
* timeout (RUSH-2114). */
|
|
532
384
|
async function probeRemoteFleetStatus(target) {
|
|
533
385
|
const isWin = /^win/i.test((target.platform ?? '').trim());
|
|
534
386
|
const env = isWin ? undefined : { PATH: '$HOME/.agents/.cache/shims:$HOME/.local/bin:$PATH' };
|
|
@@ -556,23 +408,13 @@ async function probeRemoteHealth(target) {
|
|
|
556
408
|
clis: parsed.clis ?? {},
|
|
557
409
|
sync: parsed.sync ?? [],
|
|
558
410
|
orphans: parsed.orphans ?? [],
|
|
559
|
-
// The remote self-reports its own cached auth rollup (fresh via its daemon),
|
|
560
|
-
// so the Auth column is current without a prior fleet-wide `fleet ping`.
|
|
561
|
-
// Older remotes that don't emit it fall back to this host's cache below.
|
|
562
411
|
auth: parsed.auth,
|
|
563
|
-
// Harness inventory (resources / agent versions / repo state) for
|
|
564
|
-
// cross-device divergence detection (RUSH-2027). Undefined on an older CLI
|
|
565
|
-
// that doesn't emit the `fleet` field — the comparator skips it.
|
|
566
412
|
inventory: parsed.fleet,
|
|
567
413
|
};
|
|
568
414
|
}
|
|
569
|
-
/** Device-layer config only (not fleet defaults), keyed by the canonical YAML key. */
|
|
570
415
|
function deviceConfigJson(name) {
|
|
571
416
|
const config = {};
|
|
572
417
|
for (const entry of listConfig({ device: name })) {
|
|
573
|
-
// The device's OWN layer only — a fleet-default value is not this
|
|
574
|
-
// device's setting (the effective profile fields already carry the
|
|
575
|
-
// merged view via resolveDeviceProfile).
|
|
576
418
|
if (entry.source !== 'device')
|
|
577
419
|
continue;
|
|
578
420
|
config[entry.spec.yamlKey] = entry.value;
|
|
@@ -583,10 +425,6 @@ async function runFleetStatus(opts) {
|
|
|
583
425
|
const reg = await loadDevices();
|
|
584
426
|
const self = machineId();
|
|
585
427
|
const forceRefresh = Boolean(opts.refresh || opts.live);
|
|
586
|
-
// `--local`: the publish endpoint the read-union reads over ssh. Probe THIS
|
|
587
|
-
// host only (resource stats + live-agent workload, no ssh) and print its row.
|
|
588
|
-
// Publishes into the local mirror as a side effect so a same-host reader is
|
|
589
|
-
// instantly warm too.
|
|
590
428
|
if (opts.local) {
|
|
591
429
|
const { publishLocalFleetStatus } = await import('../lib/fleet-status.js');
|
|
592
430
|
const row = await publishLocalFleetStatus(self);
|
|
@@ -598,26 +436,15 @@ async function runFleetStatus(opts) {
|
|
|
598
436
|
}
|
|
599
437
|
const planned = planFleetTargets(reg);
|
|
600
438
|
const probeable = planned.filter((t) => !t.skip).map((t) => t.device);
|
|
601
|
-
// Cache-first: serve remote stats from the daemon-warmed cache (instant),
|
|
602
|
-
// probe this machine locally, and only ssh out for missing/forced rows.
|
|
603
439
|
const statsMap = opts.stats === false
|
|
604
440
|
? new Map()
|
|
605
441
|
: (await loadFleetStats(probeable, { forceRefresh, selfName: self })).stats;
|
|
606
|
-
// Persist the live probe's reachability verdict so the online/offline word is
|
|
607
|
-
// read from a fresh probe, not a stale tailscale snapshot (RUSH-1965).
|
|
608
|
-
// Best-effort: a registry write must never break the status render.
|
|
609
442
|
await writeReachability(collectReachabilityWriteBacks(reg, statsMap)).catch(() => { });
|
|
610
443
|
const rows = [await localHealthRow(self, statsMap.get(self))];
|
|
611
444
|
const remoteTargets = remoteFleetTargets(planned, self)
|
|
612
445
|
.map((t) => ({
|
|
613
446
|
name: t.device.name,
|
|
614
447
|
platform: resolveDeviceProfile(t.device).platform,
|
|
615
|
-
// Fail fast: gate the expensive version+doctor dials on the reachability
|
|
616
|
-
// verdict the cheap stats probe already computed one step earlier. A box
|
|
617
|
-
// it found unreachable skips straight to an `unreachable` row instead of
|
|
618
|
-
// burning 15s+30s per box — so one genuinely-offline device can't stall
|
|
619
|
-
// the matrix for ~60s (RUSH-1964). See {@link fleetHealthSkip} for why
|
|
620
|
-
// this is trusted on the default path, not just under `--refresh`.
|
|
621
448
|
skip: fleetHealthSkip(t.skip, statsMap.get(t.device.name)),
|
|
622
449
|
dialTarget: fleetDialTarget(t.device),
|
|
623
450
|
extraSshArgs: deviceIdentityArgs(t.device),
|
|
@@ -646,30 +473,16 @@ async function runFleetStatus(opts) {
|
|
|
646
473
|
});
|
|
647
474
|
}
|
|
648
475
|
}
|
|
649
|
-
// Auth column: remote rows already carry the host's self-reported rollup from
|
|
650
|
-
// its `doctor --json`. Fill the rest (this machine; older remotes that don't
|
|
651
|
-
// emit it) from this host's local cache — written by `agents fleet ping` and
|
|
652
|
-
// the daemon's local refresh. A never-probed host rolls up to "—". No network.
|
|
653
476
|
const authCache = readAuthHealthCache();
|
|
654
477
|
for (const row of rows) {
|
|
655
478
|
if (!row.auth)
|
|
656
479
|
row.auth = summarizeHostAuth(authCache, row.name);
|
|
657
|
-
// Resolve the online/offline verdict and last-seen once (RUSH-1966) so the
|
|
658
|
-
// summary view reads one truth — the same `deviceOnlineState` ordering the
|
|
659
|
-
// registry write-back uses — instead of re-deriving it from error/skipped.
|
|
660
480
|
const profile = reg[row.name];
|
|
661
481
|
if (profile) {
|
|
662
482
|
row.online = deviceOnlineState(profile, statsMap.get(row.name));
|
|
663
483
|
row.lastSeen = profile.tailscale?.lastSeen ?? profile.reachability?.checkedAt;
|
|
664
484
|
}
|
|
665
485
|
}
|
|
666
|
-
// Live-agent workload (RUSH-2061): publish THIS host's row, then union peers'
|
|
667
|
-
// rows cache-first. The daemon no longer probes the fleet (publish-own /
|
|
668
|
-
// read-union), so cross-host counts are gathered HERE, on demand — a mirror row
|
|
669
|
-
// younger than the freshness window is served without ssh; a missing/stale one
|
|
670
|
-
// is read over ssh via `fleet status --local --json` (bounded + kill-on-timeout
|
|
671
|
-
// through sshExecAsync/fanOutDevices, RUSH-2114). Best-effort: agent counts are
|
|
672
|
-
// additive, so a failed gather never breaks the status render.
|
|
673
486
|
try {
|
|
674
487
|
const { publishLocalFleetStatus, readFleetStatus, writeFleetStatusRows } = await import('../lib/fleet-status.js');
|
|
675
488
|
const selfRow = await publishLocalFleetStatus(self);
|
|
@@ -702,7 +515,6 @@ async function runFleetStatus(opts) {
|
|
|
702
515
|
}
|
|
703
516
|
}
|
|
704
517
|
catch {
|
|
705
|
-
// best-effort — agent counts are additive to the health view
|
|
706
518
|
}
|
|
707
519
|
const report = buildFleetHealthReport(rows, new Date(), { self });
|
|
708
520
|
if (opts.json) {
|
|
@@ -722,7 +534,6 @@ async function runFleetStatus(opts) {
|
|
|
722
534
|
}, null, 2));
|
|
723
535
|
}
|
|
724
536
|
else if (opts.verbose) {
|
|
725
|
-
// Full grid: the auth/CLI/sync/version columns and the warnings rollup.
|
|
726
537
|
for (const line of renderFleetWarnings(report))
|
|
727
538
|
console.log(line);
|
|
728
539
|
console.log();
|
|
@@ -730,14 +541,12 @@ async function runFleetStatus(opts) {
|
|
|
730
541
|
console.log(line);
|
|
731
542
|
}
|
|
732
543
|
else {
|
|
733
|
-
// Default: rollup + NEEDS ATTENTION + OS-grouped quiet rows + footer.
|
|
734
544
|
for (const line of renderFleetSummary(report, { self }))
|
|
735
545
|
console.log(line);
|
|
736
546
|
}
|
|
737
547
|
if (opts.strict && report.hasWarnings)
|
|
738
548
|
process.exitCode = 1;
|
|
739
549
|
}
|
|
740
|
-
/** SSH into a host and run its local auth probe, returning its rows. */
|
|
741
550
|
async function probeRemoteAuth(target) {
|
|
742
551
|
const isWin = /^win/i.test((target.platform ?? '').trim());
|
|
743
552
|
const env = isWin ? undefined : { PATH: '$HOME/.agents/.cache/shims:$HOME/.local/bin:$PATH' };
|
|
@@ -749,27 +558,12 @@ async function probeRemoteAuth(target) {
|
|
|
749
558
|
const parsed = JSON.parse(res.stdout);
|
|
750
559
|
return parsed.rows ?? [];
|
|
751
560
|
}
|
|
752
|
-
/**
|
|
753
|
-
* Race `fanOut` against an overall wall-clock deadline (RUSH-2041).
|
|
754
|
-
*
|
|
755
|
-
* If `fanOut` settles first the result passes through unchanged. If the
|
|
756
|
-
* deadline fires first every pending remote target is mapped to `failed` (or
|
|
757
|
-
* `skipped` for pre-skipped targets), so callers always get a complete result
|
|
758
|
-
* array and the command exits promptly rather than hanging.
|
|
759
|
-
*
|
|
760
|
-
* Exported so the unit test can exercise the real path with a hanging probe
|
|
761
|
-
* instead of reimplementing the logic.
|
|
762
|
-
*/
|
|
763
561
|
export async function raceFleetPingDeadline(fanOut, remoteTargets, overallTimeoutMs) {
|
|
764
562
|
const overallDeadline = new Promise((_, reject) => setTimeout(() => reject(new Error('fleet ping overall deadline exceeded')), overallTimeoutMs));
|
|
765
563
|
try {
|
|
766
564
|
return await Promise.race([fanOut, overallDeadline]);
|
|
767
565
|
}
|
|
768
566
|
catch (err) {
|
|
769
|
-
// Overall deadline hit before all devices settled — mark every pending
|
|
770
|
-
// device as failed so the command exits promptly. Individual probes that
|
|
771
|
-
// already settled are not retrievable (Promise.all internals), so we
|
|
772
|
-
// record all remote targets as timed out / skipped.
|
|
773
567
|
const errMsg = err instanceof Error ? err.message : String(err);
|
|
774
568
|
return remoteTargets.map((t) => ({
|
|
775
569
|
name: t.name,
|
|
@@ -782,20 +576,9 @@ export async function raceFleetPingDeadline(fanOut, remoteTargets, overallTimeou
|
|
|
782
576
|
async function runFleetPing(opts) {
|
|
783
577
|
const self = machineId();
|
|
784
578
|
const { refreshLocalFleetAuthState } = await import('../lib/daemon-ticks.js');
|
|
785
|
-
// --local: probe just this host. Used both directly and as the fan-out worker.
|
|
786
|
-
// force: this command promises "a real request for every account" (--strict
|
|
787
|
-
// gates on it), so it must never reuse the periodic tick's rate-limit-throttled
|
|
788
|
-
// cached verdict (RUSH-2998).
|
|
789
579
|
if (opts.local) {
|
|
790
580
|
const { authRows: rows } = await refreshLocalFleetAuthState({ force: true });
|
|
791
581
|
if (opts.json) {
|
|
792
|
-
// Per-agent launchability from the SAME run-router path the local readiness
|
|
793
|
-
// check uses (`collectRunCandidates`/`isLaunchableSignedIn`), so a consumer
|
|
794
|
-
// can tell a box that simply could not probe — a worker's setup-token box,
|
|
795
|
-
// or a headed box that spent its usage-endpoint budget, both DROP their
|
|
796
|
-
// `no_evidence` row — from a box with no credential at all. From `rows`
|
|
797
|
-
// alone the two are indistinguishable, which broke `--host` routine
|
|
798
|
-
// readiness on every worker (PHNX-4116).
|
|
799
582
|
const { collectRunCandidates } = await import('../lib/accounting/rotate.js');
|
|
800
583
|
const launchable = (await Promise.all(ALL_AGENT_IDS.map(async (agent) => (await collectRunCandidates(agent)).some((candidate) => candidate.signedIn) ? agent : null))).filter((agent) => agent !== null);
|
|
801
584
|
console.log(JSON.stringify({ host: self, rows, launchable }));
|
|
@@ -809,15 +592,9 @@ async function runFleetPing(opts) {
|
|
|
809
592
|
}
|
|
810
593
|
return;
|
|
811
594
|
}
|
|
812
|
-
// Origin: probe locally, then fan out to the rest of the fleet in parallel.
|
|
813
595
|
const reg = await loadDevices();
|
|
814
596
|
const planned = planFleetTargets(reg);
|
|
815
597
|
const results = [];
|
|
816
|
-
// force: same as the --local worker below — this command promises a real
|
|
817
|
-
// request for every account and --strict gates on it, so the self row must
|
|
818
|
-
// never reuse the periodic tick's rate-limit-throttled cached verdict. Each
|
|
819
|
-
// remote peer is force-probed via its own `devices ping --local` worker (see
|
|
820
|
-
// probeRemoteAuth); the self row must match (RUSH-2998).
|
|
821
598
|
const { authRows: localRows } = await refreshLocalFleetAuthState({ force: true });
|
|
822
599
|
results.push({ host: self, rows: localRows });
|
|
823
600
|
const remoteTargets = remoteFleetTargets(planned, self).map((t) => ({
|
|
@@ -831,10 +608,6 @@ async function runFleetPing(opts) {
|
|
|
831
608
|
const spinner = isInteractiveTerminal() && !opts.json
|
|
832
609
|
? ora(`Pinging ${probeable} device${probeable === 1 ? '' : 's'}…`).start()
|
|
833
610
|
: undefined;
|
|
834
|
-
// Per-device: 15 s (matches the version probe budget; enough for the ~8 s
|
|
835
|
-
// provider-fetch inside the remote local auth probe, with headroom).
|
|
836
|
-
// Overall: 30 s hard cap so the command can never outlast a reasonable
|
|
837
|
-
// budget when several devices are simultaneously unreachable (RUSH-2041).
|
|
838
611
|
const FLEET_PING_DEVICE_TIMEOUT_MS = 15_000;
|
|
839
612
|
const FLEET_PING_OVERALL_TIMEOUT_MS = 30_000;
|
|
840
613
|
let remote;
|
|
@@ -870,7 +643,6 @@ async function runFleetPing(opts) {
|
|
|
870
643
|
if (opts.strict && anyBad)
|
|
871
644
|
process.exitCode = 1;
|
|
872
645
|
}
|
|
873
|
-
/** SSH into a host and read its raw harness rows (the `--local --json` worker). */
|
|
874
646
|
async function probeRemoteHarnesses(target, refresh) {
|
|
875
647
|
const isWin = /^win/i.test((target.platform ?? '').trim());
|
|
876
648
|
const env = isWin ? undefined : { PATH: '$HOME/.agents/.cache/shims:$HOME/.local/bin:$PATH' };
|
|
@@ -885,13 +657,6 @@ async function probeRemoteHarnesses(target, refresh) {
|
|
|
885
657
|
const parsed = JSON.parse(res.stdout);
|
|
886
658
|
return parsed.rows ?? [];
|
|
887
659
|
}
|
|
888
|
-
/**
|
|
889
|
-
* Gather harness rows across the fleet: THIS host in process, every reachable
|
|
890
|
-
* peer over SSH. Shared by both `harnesses` and `accounts` (they differ only in
|
|
891
|
-
* how the rows are rendered). Honors an optional `--device` allowlist on both
|
|
892
|
-
* the local and remote rows. Bounded by the same per-device + overall deadlines
|
|
893
|
-
* as `fleet ping`, so one unreachable box can never stall the glance.
|
|
894
|
-
*/
|
|
895
660
|
export async function collectFleetHarnesses(opts) {
|
|
896
661
|
const self = machineId();
|
|
897
662
|
const want = opts.devices?.length ? new Set(opts.devices) : null;
|
|
@@ -989,7 +754,6 @@ export async function runDevicesAccounts(opts) {
|
|
|
989
754
|
console.log(line);
|
|
990
755
|
}
|
|
991
756
|
}
|
|
992
|
-
/** Resolve an {@link AuthCellColor} to a chalk painter. Single map for cells + labels. */
|
|
993
757
|
const CELL_PAINT = {
|
|
994
758
|
green: chalk.green,
|
|
995
759
|
yellow: chalk.yellow,
|
|
@@ -997,14 +761,6 @@ const CELL_PAINT = {
|
|
|
997
761
|
gray: chalk.gray,
|
|
998
762
|
dim: chalk.dim,
|
|
999
763
|
};
|
|
1000
|
-
/**
|
|
1001
|
-
* Color a per-host×agent cell. The numerator counts accounts that are usable
|
|
1002
|
-
* right now — live-verified PLUS signed-in-but-unverifiable (codex/grok) — over
|
|
1003
|
-
* the total, so a logged-in codex fleet reads "1/1", not a scary "0/1". Color is
|
|
1004
|
-
* the shared {@link authCellColor}: red only for revoked (re-login), yellow for
|
|
1005
|
-
* soft/expired (self-refreshes), gray for present-but-unverifiable, green when
|
|
1006
|
-
* all live.
|
|
1007
|
-
*/
|
|
1008
764
|
function authCell(summary, width) {
|
|
1009
765
|
if (summary.total === 0)
|
|
1010
766
|
return chalk.dim('·'.padEnd(width));
|
|
@@ -1012,15 +768,13 @@ function authCell(summary, width) {
|
|
|
1012
768
|
const padded = `${ok}/${summary.total}`.padEnd(width);
|
|
1013
769
|
return CELL_PAINT[authCellColor(summary)](padded);
|
|
1014
770
|
}
|
|
1015
|
-
/** Render the fleet auth matrix (device rows × agent columns) plus an optional per-account breakdown. */
|
|
1016
771
|
function renderAuthMatrix(results, opts) {
|
|
1017
|
-
// Only show agent columns that appear somewhere in the results.
|
|
1018
772
|
const present = new Set();
|
|
1019
773
|
for (const r of results)
|
|
1020
774
|
for (const row of r.rows)
|
|
1021
775
|
present.add(row.agent);
|
|
1022
776
|
const agents = ALL_AGENT_IDS.filter((a) => present.has(a));
|
|
1023
|
-
const cellW = 6;
|
|
777
|
+
const cellW = 6;
|
|
1024
778
|
const nameW = Math.max(6, ...results.map((r) => r.host.length));
|
|
1025
779
|
const lines = [chalk.bold('Fleet auth')];
|
|
1026
780
|
const header = ` ${'Device'.padEnd(nameW)} ${agents.map((a) => a.slice(0, cellW).padEnd(cellW)).join(' ')}`;
|
|
@@ -1063,7 +817,6 @@ function renderAuthMatrix(results, opts) {
|
|
|
1063
817
|
}
|
|
1064
818
|
return lines;
|
|
1065
819
|
}
|
|
1066
|
-
/** Register the `agents devices` command tree (also aliased as `fleet`). */
|
|
1067
820
|
function registerDevicesCommands(program) {
|
|
1068
821
|
const devicesCmd = program
|
|
1069
822
|
.command('devices')
|
|
@@ -1133,9 +886,7 @@ function registerDevicesCommands(program) {
|
|
|
1133
886
|
process.exit(1);
|
|
1134
887
|
}
|
|
1135
888
|
});
|
|
1136
|
-
// `agents fleet capture` — snapshot live state into agents.yaml fleet:.
|
|
1137
889
|
registerFleetCaptureCommand(devicesCmd);
|
|
1138
|
-
// `agents fleet apply` — canonical fleet reconcile (top-level apply is retired).
|
|
1139
890
|
registerFleetApplyAlias(devicesCmd);
|
|
1140
891
|
devicesCmd
|
|
1141
892
|
.command('register <name>')
|
|
@@ -1148,14 +899,11 @@ function registerDevicesCommands(program) {
|
|
|
1148
899
|
console.error(chalk.red(`'${name}' is not a current tailscale node. See 'agents devices sync'.`));
|
|
1149
900
|
process.exit(1);
|
|
1150
901
|
}
|
|
1151
|
-
await removeIgnored(name);
|
|
902
|
+
await removeIgnored(name);
|
|
1152
903
|
const d = await upsertDevice(name, nodeToDeviceInput(node));
|
|
1153
904
|
setDeviceDiscoveryStatus(name, 'approved');
|
|
1154
|
-
clearPendingSentinel(name);
|
|
905
|
+
clearPendingSentinel(name);
|
|
1155
906
|
console.log(chalk.green(`Registered '${name}'`) + chalk.gray(` (${d.platform})`));
|
|
1156
|
-
// A dismissal on another box still wins the union (ignored beats
|
|
1157
|
-
// approved), so approving here does not un-dismiss it fleet-wide — say so
|
|
1158
|
-
// rather than imply the node is now discoverable everywhere (PHNX-3315).
|
|
1159
907
|
const otherDismissals = loadIgnoredEntries().filter((e) => e.name === name);
|
|
1160
908
|
if (otherDismissals.length > 0 || getDeviceDiscoveryStatus(name) === 'ignored') {
|
|
1161
909
|
const boxes = [...new Set(otherDismissals.map((e) => e.ignoredOn))].sort().join(', ') || 'another box';
|
|
@@ -1176,7 +924,7 @@ function registerDevicesCommands(program) {
|
|
|
1176
924
|
await removeDevice(name);
|
|
1177
925
|
await addIgnored(name);
|
|
1178
926
|
setDeviceDiscoveryStatus(name, 'ignored');
|
|
1179
|
-
clearPendingSentinel(name);
|
|
927
|
+
clearPendingSentinel(name);
|
|
1180
928
|
console.log(chalk.green(`Ignored '${name}'`) + chalk.gray(" — it won't be suggested again. Undo with `agents devices unignore`."));
|
|
1181
929
|
}
|
|
1182
930
|
catch (err) {
|
|
@@ -1189,13 +937,8 @@ function registerDevicesCommands(program) {
|
|
|
1189
937
|
.description('Undo `ignore`: allow a node to be discovered and registered again.')
|
|
1190
938
|
.action(async (name) => {
|
|
1191
939
|
const wasIgnored = getDeviceDiscoveryStatus(name) === 'ignored' || loadIgnoredEntries().some((e) => e.name === name);
|
|
1192
|
-
// A box can edit only its OWN device doc (PHNX-3315), so this clears just
|
|
1193
|
-
// this box's dismissal/approval decision.
|
|
1194
940
|
await removeIgnored(name);
|
|
1195
941
|
setDeviceDiscoveryStatus(name, undefined);
|
|
1196
|
-
// Re-evaluate the cross-box union AFTER clearing our slice: another box's
|
|
1197
|
-
// dismissal keeps the node ignored fleet-wide (ignored beats approved), so
|
|
1198
|
-
// never report a false "no longer ignoring" — name the box(es) to clear.
|
|
1199
942
|
const remaining = loadIgnoredEntries().filter((e) => e.name === name);
|
|
1200
943
|
if (remaining.length > 0 || getDeviceDiscoveryStatus(name) === 'ignored') {
|
|
1201
944
|
const boxes = [...new Set(remaining.map((e) => e.ignoredOn))].sort().join(', ') || 'another box';
|
|
@@ -1252,13 +995,6 @@ function registerDevicesCommands(program) {
|
|
|
1252
995
|
is where dismissals are visible.
|
|
1253
996
|
`,
|
|
1254
997
|
});
|
|
1255
|
-
// ─── devices config (unified settings surface) ────────────────────────────
|
|
1256
|
-
//
|
|
1257
|
-
// ONE command for every per-device setting: `agents devices config <name>
|
|
1258
|
-
// [key] [value] [--unset] [--json]`. configure, note, set-interactive, set,
|
|
1259
|
-
// prefer, and unprefer are deleted (PHNX-4051) — use this command directly.
|
|
1260
|
-
// enable/disable stay as first-class sugar over auto-launch.enabled.
|
|
1261
|
-
/** Parse a raw CLI string into a config key's typed value (bool/int pass validation, strings verbatim). */
|
|
1262
998
|
const parseConfigValueInput = (spec, raw) => {
|
|
1263
999
|
switch (spec.type) {
|
|
1264
1000
|
case 'int': {
|
|
@@ -1281,16 +1017,13 @@ function registerDevicesCommands(program) {
|
|
|
1281
1017
|
const writeJson = (payload) => {
|
|
1282
1018
|
process.stdout.write(JSON.stringify(payload, null, 2) + '\n');
|
|
1283
1019
|
};
|
|
1284
|
-
/** The device-scope config entries for `name` (what the config surface edits). */
|
|
1285
1020
|
const deviceConfigEntries = (name) => listConfig({ device: name }).filter((e) => e.spec.scope === 'device');
|
|
1286
|
-
/** Render one entry's effective value with its layer tag. */
|
|
1287
1021
|
const entryValueText = (e) => {
|
|
1288
1022
|
if (e.source === 'default')
|
|
1289
1023
|
return chalk.gray('— (default)');
|
|
1290
1024
|
const tag = e.source === 'fleet' ? chalk.yellow(' (fleet default)') : e.source === 'user' ? chalk.gray(' (user scope)') : '';
|
|
1291
1025
|
return chalk.cyan(JSON.stringify(e.value)) + tag;
|
|
1292
1026
|
};
|
|
1293
|
-
/** Print the full resolved config for a device (bare invocation, non-menu). */
|
|
1294
1027
|
const printDevicesConfig = (name, json) => {
|
|
1295
1028
|
const entries = deviceConfigEntries(name);
|
|
1296
1029
|
if (json) {
|
|
@@ -1305,7 +1038,6 @@ function registerDevicesCommands(program) {
|
|
|
1305
1038
|
console.log(` ${e.spec.name.padEnd(24)} ${entryValueText(e)}${chalk.gray(` ${e.spec.description}`)}`);
|
|
1306
1039
|
}
|
|
1307
1040
|
};
|
|
1308
|
-
/** Print the fleet-wide defaults layer (`config --fleet`, bare). */
|
|
1309
1041
|
const printFleetConfig = (json) => {
|
|
1310
1042
|
const entries = listConfig({ fleet: true }).filter((e) => e.spec.scope === 'device');
|
|
1311
1043
|
if (json) {
|
|
@@ -1321,16 +1053,8 @@ function registerDevicesCommands(program) {
|
|
|
1321
1053
|
console.log(` ${e.spec.name.padEnd(24)} ${value}${chalk.gray(` ${e.spec.description}`)}`);
|
|
1322
1054
|
}
|
|
1323
1055
|
};
|
|
1324
|
-
/**
|
|
1325
|
-
* The `devices config` engine — shared by the config command's action and
|
|
1326
|
-
* every tombstone. `quiet` performs the write with no output (a tombstone
|
|
1327
|
-
* that prints its own legacy shape). `fleet` targets the fleet-wide defaults
|
|
1328
|
-
* layer instead of a device (`name` is then unused). Throws on a bad
|
|
1329
|
-
* key/value; callers map that to exit 1.
|
|
1330
|
-
*/
|
|
1331
1056
|
const runDevicesConfig = async (name, key, valueParts, opts) => {
|
|
1332
|
-
const spec = key ? configKeySpec(key) : undefined;
|
|
1333
|
-
// ── Fleet-defaults layer (`--fleet`): no device involved.
|
|
1057
|
+
const spec = key ? configKeySpec(key) : undefined;
|
|
1334
1058
|
if (opts.fleet) {
|
|
1335
1059
|
if (spec && spec.scope === 'user') {
|
|
1336
1060
|
throw new Error(`Config key '${spec.name}' is user-scope (already fleet-wide) — --fleet does not apply.`);
|
|
@@ -1378,8 +1102,6 @@ function registerDevicesCommands(program) {
|
|
|
1378
1102
|
printFleetConfig(Boolean(opts.json));
|
|
1379
1103
|
return;
|
|
1380
1104
|
}
|
|
1381
|
-
// User-scope keys (interactive.host) are stored centrally — the device name
|
|
1382
|
-
// is syntax only, so an unregistered name is not an error for them.
|
|
1383
1105
|
if (!spec || spec.scope === 'device')
|
|
1384
1106
|
await mustGetDevice(name);
|
|
1385
1107
|
if (opts.unset) {
|
|
@@ -1397,7 +1119,6 @@ function registerDevicesCommands(program) {
|
|
|
1397
1119
|
if (spec && valueParts.length > 0) {
|
|
1398
1120
|
let value;
|
|
1399
1121
|
if (spec.type === 'string-list') {
|
|
1400
|
-
// List keys (notes) APPEND — one entry per invocation.
|
|
1401
1122
|
const existing = getConfigValue(spec.name, { device: name }).value ?? [];
|
|
1402
1123
|
value = [...existing, valueParts.join(' ')];
|
|
1403
1124
|
}
|
|
@@ -1425,29 +1146,17 @@ function registerDevicesCommands(program) {
|
|
|
1425
1146
|
}
|
|
1426
1147
|
return;
|
|
1427
1148
|
}
|
|
1428
|
-
// Bare: TTY → the interactive settings menu; piped/--json → print.
|
|
1429
1149
|
if (opts.json || !isInteractiveTerminal()) {
|
|
1430
1150
|
printDevicesConfig(name, Boolean(opts.json));
|
|
1431
1151
|
return;
|
|
1432
1152
|
}
|
|
1433
1153
|
await runDevicesConfigMenu(name);
|
|
1434
1154
|
};
|
|
1435
|
-
/**
|
|
1436
|
-
* The `devices role` engine — read or write the fleet-wide role mark, and say
|
|
1437
|
-
* what it does to automatic placement.
|
|
1438
|
-
*
|
|
1439
|
-
* A role written here lands in that device's tracked per-device doc
|
|
1440
|
-
* (`devices/<name>/agents.yaml` `config.role`) and syncs with repo
|
|
1441
|
-
* push/pull. The vocabulary is `worker | personal | desktop`.
|
|
1442
|
-
*/
|
|
1443
1155
|
const runDevicesRole = async (name, role, opts) => {
|
|
1444
1156
|
if (!name) {
|
|
1445
1157
|
if (role)
|
|
1446
1158
|
throw new Error('Name a device: agents devices role <name> <worker|personal|desktop>');
|
|
1447
1159
|
const reg = await loadDevices();
|
|
1448
|
-
// The full registered roster, not just online — a fleet-wide `role`
|
|
1449
|
-
// default must reach a registered device even when it has no per-device
|
|
1450
|
-
// doc of its own, or it silently falls out of the worker allowlist.
|
|
1451
1160
|
const roles = listConfiguredDeviceRoles(Object.keys(reg));
|
|
1452
1161
|
const mode = autoPoolMode();
|
|
1453
1162
|
const online = Object.entries(reg)
|
|
@@ -1491,13 +1200,7 @@ function registerDevicesCommands(program) {
|
|
|
1491
1200
|
console.log(` ${name.padEnd(20)} ${current ? chalk.cyan(current) : chalk.gray('— (unmarked)')}`);
|
|
1492
1201
|
return;
|
|
1493
1202
|
}
|
|
1494
|
-
// configuredDeviceRole's key spec validates the value; a bad one throws with
|
|
1495
|
-
// the accepted list, which the command's catch turns into exit 1.
|
|
1496
1203
|
setConfiguredDeviceRole(name, role);
|
|
1497
|
-
// Full registered roster, mirroring the bare-listing branch above — a
|
|
1498
|
-
// fleet-wide `role` default must reach a doc-less registered device here
|
|
1499
|
-
// too, or `autoPoolWorkers` under-reports the allowlist right after this
|
|
1500
|
-
// write changed it.
|
|
1501
1204
|
const roles = listConfiguredDeviceRoles(Object.keys(await loadDevices()));
|
|
1502
1205
|
if (opts.json) {
|
|
1503
1206
|
writeJson({ device: name, role, autoPoolWorkers: listWorkerDevices({ roles }) });
|
|
@@ -1513,9 +1216,6 @@ function registerDevicesCommands(program) {
|
|
|
1513
1216
|
}
|
|
1514
1217
|
console.log(chalk.gray('Sync it to the fleet with `agents repo push`.'));
|
|
1515
1218
|
};
|
|
1516
|
-
/** The interactive settings menu: pick a key, edit it, repeat. TTY-only.
|
|
1517
|
-
* Shows EFFECTIVE values (with a fleet tag when inherited); edits always
|
|
1518
|
-
* write the device layer. */
|
|
1519
1219
|
const runDevicesConfigMenu = async (name) => {
|
|
1520
1220
|
const { select, input, confirm } = await import('@inquirer/prompts');
|
|
1521
1221
|
const DONE = '__done__';
|
|
@@ -1573,7 +1273,7 @@ function registerDevicesCommands(program) {
|
|
|
1573
1273
|
}
|
|
1574
1274
|
catch (err) {
|
|
1575
1275
|
if (isPromptCancelled(err))
|
|
1576
|
-
return;
|
|
1276
|
+
return;
|
|
1577
1277
|
throw err;
|
|
1578
1278
|
}
|
|
1579
1279
|
};
|
|
@@ -1589,7 +1289,6 @@ function registerDevicesCommands(program) {
|
|
|
1589
1289
|
.action(async (name, key, valueParts, opts) => {
|
|
1590
1290
|
try {
|
|
1591
1291
|
if (opts.fleet) {
|
|
1592
|
-
// Positionals shift left: the first one is the key, the rest the value.
|
|
1593
1292
|
const fleetValue = [key, ...(valueParts ?? [])].filter((v) => v !== undefined);
|
|
1594
1293
|
await runDevicesConfig(undefined, name, fleetValue, opts);
|
|
1595
1294
|
return;
|
|
@@ -1709,8 +1408,6 @@ function registerDevicesCommands(program) {
|
|
|
1709
1408
|
.option('--json', 'output machine-readable JSON')
|
|
1710
1409
|
.action(async (name, textParts, opts) => {
|
|
1711
1410
|
try {
|
|
1712
|
-
// Thin sugar over the 'description' config key — the same engine that
|
|
1713
|
-
// backs `agents devices config <name> description`, not a second path.
|
|
1714
1411
|
await runDevicesConfig(name, 'description', textParts ?? [], opts);
|
|
1715
1412
|
}
|
|
1716
1413
|
catch (err) {
|
|
@@ -1751,13 +1448,9 @@ function registerDevicesCommands(program) {
|
|
|
1751
1448
|
let statsMap;
|
|
1752
1449
|
let freshness;
|
|
1753
1450
|
if (opts.stats !== false) {
|
|
1754
|
-
// Cache-first: serve remote devices from the daemon-warmed cache
|
|
1755
|
-
// (instant), probe this machine locally, and only ssh out for missing or
|
|
1756
|
-
// forced (--refresh/--live) rows — so a warm read never hangs on a box.
|
|
1757
1451
|
const probeable = planFleetTargets(reg)
|
|
1758
1452
|
.filter((t) => !t.skip)
|
|
1759
1453
|
.map((t) => t.device);
|
|
1760
|
-
// Only spin when we'll actually ssh (forced, or a cold/partial cache).
|
|
1761
1454
|
const cache = readStatsCache();
|
|
1762
1455
|
const willSsh = forceRefresh || probeable.some((d) => d.name !== self && (!cache[d.name] || !isFreshDeviceStats(cache[d.name])));
|
|
1763
1456
|
const spinner = willSsh && isInteractiveTerminal()
|
|
@@ -1771,8 +1464,6 @@ function registerDevicesCommands(program) {
|
|
|
1771
1464
|
finally {
|
|
1772
1465
|
spinner?.stop();
|
|
1773
1466
|
}
|
|
1774
|
-
// Write the live verdict back so this and every other consumer read one
|
|
1775
|
-
// reachability truth instead of the stale tailscale snapshot (RUSH-1965).
|
|
1776
1467
|
if (statsMap)
|
|
1777
1468
|
await writeReachability(collectReachabilityWriteBacks(reg, statsMap)).catch(() => { });
|
|
1778
1469
|
}
|
|
@@ -1786,9 +1477,6 @@ function registerDevicesCommands(program) {
|
|
|
1786
1477
|
return {
|
|
1787
1478
|
...resolveDeviceProfile(reg[name]),
|
|
1788
1479
|
interactive: name === interactiveHost,
|
|
1789
|
-
// Roles as machine-readable fields: `role` is what the operator
|
|
1790
|
-
// marked (absent when unmarked), `autoPool` is the answer that
|
|
1791
|
-
// matters to a caller — may `--device auto` pick this box.
|
|
1792
1480
|
...(jsonRoles[name] ? { role: jsonRoles[name] } : {}),
|
|
1793
1481
|
...(typeof description === 'string' && description ? { description } : {}),
|
|
1794
1482
|
autoPool: autoPool.has(name),
|
|
@@ -1799,21 +1487,12 @@ function registerDevicesCommands(program) {
|
|
|
1799
1487
|
return;
|
|
1800
1488
|
}
|
|
1801
1489
|
console.log(chalk.bold(`Devices (${names.length})`));
|
|
1802
|
-
// Dismissed nodes are not devices (never in the registry) — surface their
|
|
1803
|
-
// count under the table so a "missing" node is explainable from the list.
|
|
1804
1490
|
const ignoredCount = loadIgnoredEntries().length;
|
|
1805
1491
|
for (const line of renderDeviceTable(reg, names, self, statsMap, opts.full, interactiveHost, { ignoredCount }))
|
|
1806
1492
|
console.log(line);
|
|
1807
1493
|
if (freshness?.servedFromCache && freshness.oldestFetchedAt != null) {
|
|
1808
1494
|
console.log(chalk.gray(` updated ${formatCheckedAge(freshness.oldestFetchedAt)} — pass --refresh (--live) for a live probe`));
|
|
1809
1495
|
}
|
|
1810
|
-
// Ephemeral crabbox leases live alongside the registered fleet but are never
|
|
1811
|
-
// written into the registry — surface them as their own live section, but only
|
|
1812
|
-
// behind --all (RUSH-2190). Reading them routes through crabboxEnv, whose
|
|
1813
|
-
// bundle auto-detect scans the keychain and can raise a Touch ID sheet AFTER
|
|
1814
|
-
// the table has printed — unacceptable for the default list, which hooks and
|
|
1815
|
-
// other non-interactive callers rely on. The predicate is exported so the
|
|
1816
|
-
// gate itself is unit-tested; keep it the ONLY condition guarding this call.
|
|
1817
1496
|
if (showLeasedBoxesSection(opts)) {
|
|
1818
1497
|
for (const line of loadLeasedBoxesSection())
|
|
1819
1498
|
console.log(line);
|
|
@@ -1870,10 +1549,6 @@ function registerDevicesCommands(program) {
|
|
|
1870
1549
|
.option('--local', "this machine only: print THIS host's status row (resource stats + live-agent workload). The publish endpoint the fleet-status read-union reads over ssh.")
|
|
1871
1550
|
.option('--verbose', 'show the full per-device auth/CLI/sync/version grid instead of the summary')
|
|
1872
1551
|
.action(async (opts, cmd) => {
|
|
1873
|
-
// The root program also defines a global `--verbose`; commander binds a
|
|
1874
|
-
// shared long flag to the program, not the leaf. Read the effective value
|
|
1875
|
-
// from the merged globals so `fleet status --verbose` works at either level
|
|
1876
|
-
// (same pattern as `fleet ping --verbose`).
|
|
1877
1552
|
const verbose = opts.verbose ?? Boolean(cmd.optsWithGlobals().verbose);
|
|
1878
1553
|
await runFleetStatus({ ...opts, verbose });
|
|
1879
1554
|
});
|
|
@@ -1885,11 +1560,6 @@ function registerDevicesCommands(program) {
|
|
|
1885
1560
|
.option('--verbose', 'show a per-account breakdown, not just the per-host rollup')
|
|
1886
1561
|
.option('--strict', 'exit non-zero when any account is revoked (expired is soft — it self-refreshes)')
|
|
1887
1562
|
.action(async (opts, cmd) => {
|
|
1888
|
-
// The root program also defines a global `--verbose` (startup self-heal
|
|
1889
|
-
// detail), and commander binds a shared long flag to the program, not the
|
|
1890
|
-
// leaf — so `fleet ping --verbose` never set opts.verbose and the
|
|
1891
|
-
// per-account breakdown was silently unreachable. Read the effective value
|
|
1892
|
-
// from the merged globals so the flag works at either level.
|
|
1893
1563
|
const verbose = opts.verbose ?? Boolean(cmd.optsWithGlobals().verbose);
|
|
1894
1564
|
await runFleetPing({ ...opts, verbose });
|
|
1895
1565
|
});
|
|
@@ -1906,8 +1576,6 @@ function registerDevicesCommands(program) {
|
|
|
1906
1576
|
plan = await resolveWorkerDevice({ platforms: csvList(opts.platform) });
|
|
1907
1577
|
}
|
|
1908
1578
|
catch (err) {
|
|
1909
|
-
// Fail loud with the resolver's own message. Never print a device name
|
|
1910
|
-
// we did not actually pick: a caller reading stdout would ship a tree to it.
|
|
1911
1579
|
console.error(err instanceof Error ? err.message : String(err));
|
|
1912
1580
|
process.exitCode = 1;
|
|
1913
1581
|
return;
|
|
@@ -1916,8 +1584,6 @@ function registerDevicesCommands(program) {
|
|
|
1916
1584
|
console.log(JSON.stringify(plan, null, 2));
|
|
1917
1585
|
return;
|
|
1918
1586
|
}
|
|
1919
|
-
// stdout is the name alone (`box="$(agents devices pick)"`); the human
|
|
1920
|
-
// detail goes to stderr so it never pollutes that capture.
|
|
1921
1587
|
const detail = plan.candidates
|
|
1922
1588
|
.map((c) => `${c.device}:${c.loadPercent === undefined ? '?' : `${Math.round(c.loadPercent)}%`}`)
|
|
1923
1589
|
.join(' ');
|
|
@@ -1989,9 +1655,6 @@ email) into a single row. Use \`agents devices harnesses\` for the per-install v
|
|
|
1989
1655
|
.option('--platform <platform>', 'windows | linux | macos')
|
|
1990
1656
|
.action(async (name, target, opts) => {
|
|
1991
1657
|
try {
|
|
1992
|
-
// The one place a device name is CHOSEN rather than observed, so the one
|
|
1993
|
-
// place the reserved-sentinel policy belongs. upsertDevice itself stays
|
|
1994
|
-
// shape-only — `devices sync` feeds it tailnet node names in a loop.
|
|
1995
1658
|
assertRegistrableDeviceName(name);
|
|
1996
1659
|
const { host, user } = splitUserHost(target);
|
|
1997
1660
|
const isIp = /^\d{1,3}(\.\d{1,3}){3}$/.test(host);
|
|
@@ -2085,9 +1748,6 @@ is reported \`failed\` (exit non-zero), never a stranded \`ok\`.
|
|
|
2085
1748
|
console.log(chalk.gray(`Running \`${cmd.join(' ')}\` on ${targets.filter((t) => !t.skip).length} online device(s)…`));
|
|
2086
1749
|
const self = machineId();
|
|
2087
1750
|
const results = runFleet(targets, cmd, { self });
|
|
2088
|
-
// `exit 0` from the upgrade only proves the npm global moved. Ask each box
|
|
2089
|
-
// what `agents` actually resolves to before calling the rollout a success
|
|
2090
|
-
// (RUSH-2446) — a dev install shadowing the global keeps running old code.
|
|
2091
1751
|
const verifications = verifyFleetRollout(targets, results, version, { self });
|
|
2092
1752
|
printFleetResults(results, verifications);
|
|
2093
1753
|
});
|
|
@@ -2171,13 +1831,6 @@ function fmtWtSize(n) {
|
|
|
2171
1831
|
}
|
|
2172
1832
|
return `${v.toFixed(v < 10 ? 1 : 0)}${units[i]}`;
|
|
2173
1833
|
}
|
|
2174
|
-
/**
|
|
2175
|
-
* `agents fleet worktrees` — surface the held set the sweep only counts. Never
|
|
2176
|
-
* removes anything; `--push` publishes on-no-remote stranded branches. This is
|
|
2177
|
-
* the CLI-native surfacing half of PHNX-3520 (the sweep itself lives in
|
|
2178
|
-
* phnx-labs/.agents; it still emits a bare count until a sibling change teaches
|
|
2179
|
-
* it to consume this).
|
|
2180
|
-
*/
|
|
2181
1834
|
async function runWorktreesHeld(opts) {
|
|
2182
1835
|
if (opts.bucket && !isHeldBucket(opts.bucket)) {
|
|
2183
1836
|
console.error(chalk.red(`Unknown bucket '${opts.bucket}'. Use one of: ${BUCKET_ORDER.join(', ')}`));
|
|
@@ -2236,7 +1889,6 @@ async function runWorktreesHeld(opts) {
|
|
|
2236
1889
|
console.log('\n' + chalk.yellow(`${stranded} branch${stranded === 1 ? '' : 'es'} with unmerged commits on no remote. Recover: agents fleet worktrees --push`));
|
|
2237
1890
|
}
|
|
2238
1891
|
}
|
|
2239
|
-
/** `--push`: publish every on-no-remote stranded branch. Never deletes. */
|
|
2240
1892
|
async function runWorktreesPush(held, opts) {
|
|
2241
1893
|
const candidates = held.filter((w) => w.bucket === 'unmerged-commits' && !w.hasRemoteBranch && w.branch);
|
|
2242
1894
|
if (candidates.length === 0) {
|
|
@@ -2267,7 +1919,6 @@ async function runWorktreesPush(held, opts) {
|
|
|
2267
1919
|
}
|
|
2268
1920
|
console.log('\n' + chalk.green(`Published ${pushed}/${candidates.length} stranded branch${candidates.length === 1 ? '' : 'es'}.`));
|
|
2269
1921
|
}
|
|
2270
|
-
/** `--fleet`: run this same read-only surface on every online device, aggregate. */
|
|
2271
1922
|
async function runWorktreesHeldFleet(opts) {
|
|
2272
1923
|
const reg = await loadDevices();
|
|
2273
1924
|
const targets = planFleetTargets(reg);
|
|
@@ -2296,10 +1947,6 @@ async function runWorktreesHeldFleet(opts) {
|
|
|
2296
1947
|
console.error(chalk.gray(` ${name}: unparseable output (older CLI?)`));
|
|
2297
1948
|
}
|
|
2298
1949
|
}
|
|
2299
|
-
// Apply the bucket filter to the per-device inputs BEFORE aggregating, so
|
|
2300
|
-
// `total`, per-`devices` totals, and `buckets` all describe the same filtered
|
|
2301
|
-
// set — zeroing buckets after the sum leaves `total` counting rows the output
|
|
2302
|
-
// no longer lists.
|
|
2303
1950
|
const scoped = opts.bucket
|
|
2304
1951
|
? perDevice.map((d) => ({ device: d.device, held: d.held.filter((w) => w.bucket === opts.bucket) }))
|
|
2305
1952
|
: perDevice;
|
|
@@ -2322,12 +1969,6 @@ async function runWorktreesHeldFleet(opts) {
|
|
|
2322
1969
|
}
|
|
2323
1970
|
}
|
|
2324
1971
|
}
|
|
2325
|
-
/**
|
|
2326
|
-
* `agents devices ps` — list tasks dispatched to devices (`agents run --device
|
|
2327
|
-
* <name> --no-follow`). Heals any 'running' record whose local follower died
|
|
2328
|
-
* (dropped connection, laptop sleep) against the remote `.exit` before listing,
|
|
2329
|
-
* so a finished run never shows stuck at 'running'.
|
|
2330
|
-
*/
|
|
2331
1972
|
async function doDeviceTaskPs(json) {
|
|
2332
1973
|
const tasks = reconcileRunningTasks(listTasks());
|
|
2333
1974
|
if (json) {
|
|
@@ -2347,9 +1988,7 @@ async function doDeviceTaskPs(json) {
|
|
|
2347
1988
|
console.log(t.id.padEnd(11) + nameCol + t.host.padEnd(16) + t.agent.padEnd(10) + status.padEnd(11) + promptCol);
|
|
2348
1989
|
}
|
|
2349
1990
|
}
|
|
2350
|
-
/** `agents devices stop <id>` — terminate a running dispatched task from the origin machine. */
|
|
2351
1991
|
async function doDeviceTaskStop(ref) {
|
|
2352
|
-
// Heal first so we don't try to kill a process that already exited.
|
|
2353
1992
|
const current = resolveTaskRef(ref);
|
|
2354
1993
|
if (!current) {
|
|
2355
1994
|
console.log(chalk.red(`Unknown task "${ref}".`));
|
|
@@ -2380,11 +2019,6 @@ async function doDeviceTaskStop(ref) {
|
|
|
2380
2019
|
process.exitCode = 1;
|
|
2381
2020
|
}
|
|
2382
2021
|
}
|
|
2383
|
-
/**
|
|
2384
|
-
* Parse `--argv`'s JSON array, or report exactly what was wrong and return
|
|
2385
|
-
* undefined. Fails loud rather than coercing: a caller that meant to pass argv
|
|
2386
|
-
* and typo'd the JSON must not silently get shell-string semantics instead.
|
|
2387
|
-
*/
|
|
2388
2022
|
export function parseArgvJson(raw, log = (line) => console.error(line)) {
|
|
2389
2023
|
let parsed;
|
|
2390
2024
|
try {
|
|
@@ -2407,7 +2041,6 @@ export function parseArgvJson(raw, log = (line) => console.error(line)) {
|
|
|
2407
2041
|
}
|
|
2408
2042
|
return parsed;
|
|
2409
2043
|
}
|
|
2410
|
-
/** Register the `agents ssh` smart wrapper. */
|
|
2411
2044
|
function registerSshWrapper(program) {
|
|
2412
2045
|
const sshCmd = program
|
|
2413
2046
|
.command('ssh <name> [cmd...]')
|
|
@@ -2444,8 +2077,6 @@ arrives intact. The positional form keeps its existing semantics — the remote
|
|
|
2444
2077
|
shell parses it — so the two are mutually exclusive rather than interchangeable.
|
|
2445
2078
|
`)
|
|
2446
2079
|
.action(async (name, cmd, opts) => {
|
|
2447
|
-
// `--argv` is a DIFFERENT delivery contract, not a spelling of the
|
|
2448
|
-
// positional form, so accepting both would have to silently pick one.
|
|
2449
2080
|
if (opts.argv !== undefined && cmd.length > 0) {
|
|
2450
2081
|
console.error(chalk.red('Pass either --argv <json> or a positional command, not both.'));
|
|
2451
2082
|
console.error(chalk.gray('--argv delivers exact tokens; the positional form is parsed by the remote shell.'));
|
|
@@ -2462,20 +2093,10 @@ shell parses it — so the two are mutually exclusive rather than interchangeabl
|
|
|
2462
2093
|
}
|
|
2463
2094
|
cmd = argvTokens;
|
|
2464
2095
|
}
|
|
2465
|
-
// Hidden askpass bridge: ssh execs the shim, which re-invokes us here.
|
|
2466
2096
|
if (name === '__askpass') {
|
|
2467
2097
|
await runAskpass();
|
|
2468
2098
|
return;
|
|
2469
2099
|
}
|
|
2470
|
-
// `auto` is the same affinity sentinel `agents run --device auto` resolves
|
|
2471
|
-
// (RUSH-2185) — pick the concrete device up front via the SAME engine
|
|
2472
|
-
// (resolveDeviceAffinity), rather than leaning on matchHost's generic
|
|
2473
|
-
// self-resolution (../lib/hosts/registry.js): `agents ssh` connects OUT to
|
|
2474
|
-
// a remote device, so a pick that lands on THIS machine is refused with a
|
|
2475
|
-
// clear message instead of self-SSHing — which also holds when this
|
|
2476
|
-
// machine was never itself enrolled as a device (matchHost would have
|
|
2477
|
-
// nothing to resolve "self" to, and mis-report the pick as "Unknown
|
|
2478
|
-
// device").
|
|
2479
2100
|
let target = name;
|
|
2480
2101
|
if (isDeviceInteractive(name)) {
|
|
2481
2102
|
const pinned = resolveInteractiveDevice();
|
|
@@ -2495,23 +2116,13 @@ shell parses it — so the two are mutually exclusive rather than interchangeabl
|
|
|
2495
2116
|
process.stderr.write(chalk.gray(`[agents] device=auto → ${plan.host}\n`));
|
|
2496
2117
|
target = plan.host;
|
|
2497
2118
|
}
|
|
2498
|
-
// Accept the full fleet target grammar: a registered `name`, a
|
|
2499
|
-
// `user@device` (same device, login user overridden — dialed via its
|
|
2500
|
-
// Tailscale route, not LAN DNS), or an ad-hoc `user@host`/`host` literal.
|
|
2501
|
-
// A bare unregistered alias still errors as "Unknown device".
|
|
2502
2119
|
const resolvedTarget = await resolveDeviceTarget(target);
|
|
2503
2120
|
if (!resolvedTarget) {
|
|
2504
|
-
|
|
2505
|
-
// it directly (crabbox@<tailnet|ip>:2222) before giving up.
|
|
2506
|
-
trySshLeasedBox(target, cmd); // exits the process on a match
|
|
2121
|
+
trySshLeasedBox(target, cmd);
|
|
2507
2122
|
console.error(chalk.red(`Unknown device '${target}'. See 'agents devices list'.`));
|
|
2508
2123
|
process.exit(1);
|
|
2509
2124
|
}
|
|
2510
|
-
// The effective profile: central config (ssh.*/platform/user) overlaid on
|
|
2511
|
-
// the discovery record.
|
|
2512
2125
|
const device = resolveDeviceProfile(resolvedTarget);
|
|
2513
|
-
// Preflight: a device Tailscale last saw offline would otherwise hang
|
|
2514
|
-
// for the full ConnectTimeout. Fail fast with a clear message instead.
|
|
2515
2126
|
if (device.tailscale && !device.tailscale.online) {
|
|
2516
2127
|
console.error(chalk.red(`Device '${device.name}' is offline (Tailscale last saw it ${device.tailscale.lastSeen ?? 'a while ago'}).`));
|
|
2517
2128
|
console.error(chalk.gray("Run 'agents devices sync' to refresh reachability."));
|
|
@@ -2522,22 +2133,11 @@ shell parses it — so the two are mutually exclusive rather than interchangeabl
|
|
|
2522
2133
|
}
|
|
2523
2134
|
try {
|
|
2524
2135
|
const shim = writeAskpassShim();
|
|
2525
|
-
// Pin the host key on first connect and verify strictly thereafter: the
|
|
2526
|
-
// managed known_hosts store must exist before ssh writes the learned key
|
|
2527
|
-
// into it, and a host already recorded there is checked with
|
|
2528
|
-
// StrictHostKeyChecking=yes (RUSH-1767).
|
|
2529
2136
|
ensureManagedKnownHostsDir();
|
|
2530
2137
|
const addr = hostNameFor(device);
|
|
2531
2138
|
const pinned = addr ? isHostPinned(addr) : false;
|
|
2532
|
-
// Interactive login (no cmd): mirror the caller's project directory on
|
|
2533
|
-
// the target when the same home-relative checkout exists there, matching
|
|
2534
|
-
// `agents run --device` (deriveMirroredCwd). Best-effort — a missing dir
|
|
2535
|
-
// falls back to the remote home. An explicit `cmd` keeps its cwd (RUSH-2412).
|
|
2536
2139
|
const mirrorCwd = cmd.length === 0 ? deriveMirroredCwd(process.cwd()) : undefined;
|
|
2537
2140
|
const { args, env } = buildSshInvocation(device, cmd, shim, { pinned }, { interactiveCwd: mirrorCwd, ...(argvTokens ? { argv: true } : {}) });
|
|
2538
|
-
// Interactive login: make the local terminal's terminfo (e.g.
|
|
2539
|
-
// xterm-ghostty) available on the remote so backspace/colors/clear work.
|
|
2540
|
-
// Best-effort + cached per host — never blocks the login (see terminfo.ts).
|
|
2541
2141
|
if (cmd.length === 0 && shouldSyncTerminfo({ term: process.env.TERM, shell: device.shell, interactive: process.stdout.isTTY ?? false })) {
|
|
2542
2142
|
const { args: tinfoArgs, env: tinfoEnv } = buildSshInvocation(device, ['tic', '-x', '-'], shim, { pinned });
|
|
2543
2143
|
syncTerminfoToDevice({ device, host: terminfoHostKey(device, addr), term: process.env.TERM, sshArgs: tinfoArgs, sshEnv: tinfoEnv });
|
|
@@ -2553,15 +2153,8 @@ shell parses it — so the two are mutually exclusive rather than interchangeabl
|
|
|
2553
2153
|
process.exit(1);
|
|
2554
2154
|
}
|
|
2555
2155
|
});
|
|
2556
|
-
// Keep the hidden askpass invocation out of help.
|
|
2557
2156
|
void sshCmd;
|
|
2558
2157
|
}
|
|
2559
|
-
/**
|
|
2560
|
-
* The askpass side of password auth. Invoked by the shim (which ssh execs with
|
|
2561
|
-
* SSH_ASKPASS): read the target bundle/key from the environment the wrapper
|
|
2562
|
-
* set, resolve it through the existing Keychain path, and print the password
|
|
2563
|
-
* to stdout for ssh to consume.
|
|
2564
|
-
*/
|
|
2565
2158
|
async function runAskpass() {
|
|
2566
2159
|
const bundle = process.env[ASKPASS_BUNDLE_ENV];
|
|
2567
2160
|
const key = process.env[ASKPASS_KEY_ENV] ?? 'password';
|
|
@@ -2569,9 +2162,6 @@ async function runAskpass() {
|
|
|
2569
2162
|
console.error(`askpass: ${ASKPASS_BUNDLE_ENV} not set`);
|
|
2570
2163
|
process.exit(1);
|
|
2571
2164
|
}
|
|
2572
|
-
// A read-only stats probe sets ASKPASS_AGENT_ONLY_ENV to force a broker-only
|
|
2573
|
-
// resolve even under a TTY — so `agents devices` never pops Touch ID just to
|
|
2574
|
-
// render load/mem for an uncached password-auth device (RUSH-1970).
|
|
2575
2165
|
const agentOnly = true;
|
|
2576
2166
|
try {
|
|
2577
2167
|
const { env } = await readAndResolveBundleEnv(bundle, { caller: 'agents ssh', keys: [key], keyMode: 'storage', agentOnly });
|
|
@@ -2587,7 +2177,6 @@ async function runAskpass() {
|
|
|
2587
2177
|
process.exit(1);
|
|
2588
2178
|
}
|
|
2589
2179
|
}
|
|
2590
|
-
/** Register both `agents ssh` and `agents devices`. */
|
|
2591
2180
|
export function registerSshCommands(program) {
|
|
2592
2181
|
registerSshWrapper(program);
|
|
2593
2182
|
registerDevicesCommands(program);
|