@phnx-labs/agents-cli 1.22.119 → 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 +236 -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 +20 -976
- package/dist/lib/session/actor-sidecar.d.ts +1 -32
- package/dist/lib/session/actor-sidecar.js +1 -41
- package/dist/lib/session/bookmarks.d.ts +0 -33
- package/dist/lib/session/bookmarks.js +0 -37
- package/dist/lib/session/bundle.d.ts +0 -86
- package/dist/lib/session/bundle.js +0 -54
- package/dist/lib/session/claude-accounts.d.ts +0 -40
- package/dist/lib/session/claude-accounts.js +0 -49
- package/dist/lib/session/cloud.d.ts +1 -23
- package/dist/lib/session/cloud.js +0 -26
- package/dist/lib/session/db.d.ts +5 -658
- package/dist/lib/session/db.js +22 -1443
- package/dist/lib/session/detached.d.ts +0 -21
- package/dist/lib/session/detached.js +0 -29
- package/dist/lib/session/discover.d.ts +3 -420
- package/dist/lib/session/discover.js +30 -1123
- package/dist/lib/session/fork.d.ts +1 -41
- package/dist/lib/session/fork.js +0 -19
- package/dist/lib/session/ghostty-tabs.d.ts +0 -24
- package/dist/lib/session/ghostty-tabs.js +0 -37
- package/dist/lib/session/glance-files.d.ts +19 -0
- package/dist/lib/session/glance-files.js +258 -0
- package/dist/lib/session/hook-sessions.d.ts +0 -33
- package/dist/lib/session/hook-sessions.js +4 -99
- package/dist/lib/session/host-link.d.ts +1 -94
- package/dist/lib/session/host-link.js +1 -81
- package/dist/lib/session/inject-target.d.ts +8 -0
- package/dist/lib/session/inject-target.js +32 -0
- package/dist/lib/session/inject.d.ts +0 -15
- package/dist/lib/session/inject.js +0 -15
- package/dist/lib/session/live-metadata.d.ts +1 -34
- package/dist/lib/session/live-metadata.js +1 -73
- package/dist/lib/session/local-tmux-attach.d.ts +0 -37
- package/dist/lib/session/local-tmux-attach.js +1 -76
- package/dist/lib/session/migrate-targets.d.ts +0 -46
- package/dist/lib/session/migrate-targets.js +0 -24
- package/dist/lib/session/migrations.d.ts +0 -12
- package/dist/lib/session/migrations.js +1 -20
- package/dist/lib/session/mirror.d.ts +0 -32
- package/dist/lib/session/mirror.js +0 -77
- package/dist/lib/session/origin-machine.js +0 -3
- package/dist/lib/session/pid-registry.d.ts +0 -80
- package/dist/lib/session/pid-registry.js +2 -81
- package/dist/lib/session/presence.d.ts +0 -39
- package/dist/lib/session/presence.js +2 -52
- package/dist/lib/session/process-view.d.ts +0 -11
- package/dist/lib/session/process-view.js +0 -25
- package/dist/lib/session/projection.d.ts +0 -3
- package/dist/lib/session/projection.js +0 -10
- package/dist/lib/session/provenance.d.ts +1 -37
- package/dist/lib/session/provenance.js +0 -69
- package/dist/lib/session/recovery.d.ts +1 -40
- package/dist/lib/session/recovery.js +2 -80
- package/dist/lib/session/relative-time.js +0 -3
- package/dist/lib/session/remote/peer-stream.d.ts +0 -42
- package/dist/lib/session/remote/peer-stream.js +0 -64
- package/dist/lib/session/remote/remote-bundle.d.ts +0 -6
- package/dist/lib/session/remote/remote-bundle.js +0 -21
- package/dist/lib/session/remote/remote-list.d.ts +1 -110
- package/dist/lib/session/remote/remote-list.js +5 -139
- package/dist/lib/session/remote/remote.d.ts +0 -98
- package/dist/lib/session/remote/remote.js +3 -119
- package/dist/lib/session/remote/watch.d.ts +1 -34
- package/dist/lib/session/remote/watch.js +12 -72
- package/dist/lib/session/remote-active.d.ts +0 -35
- package/dist/lib/session/remote-active.js +0 -48
- package/dist/lib/session/remote-bundle.js +0 -2
- package/dist/lib/session/remote-list.js +0 -2
- package/dist/lib/session/remote-preview-cache.d.ts +0 -7
- package/dist/lib/session/remote-preview-cache.js +1 -76
- package/dist/lib/session/remote.js +0 -2
- package/dist/lib/session/resume-command.d.ts +0 -6
- package/dist/lib/session/resume-command.js +0 -6
- package/dist/lib/session/resume-owner.d.ts +1 -52
- package/dist/lib/session/resume-owner.js +0 -56
- package/dist/lib/session/run-names.d.ts +0 -24
- package/dist/lib/session/run-names.js +0 -26
- package/dist/lib/session/session-cache.d.ts +2 -146
- package/dist/lib/session/session-cache.js +26 -203
- package/dist/lib/session/short-id.js +0 -3
- package/dist/lib/session/sync/agents.d.ts +0 -68
- package/dist/lib/session/sync/agents.js +0 -0
- package/dist/lib/session/sync/backend.d.ts +0 -39
- package/dist/lib/session/sync/backend.js +0 -45
- package/dist/lib/session/sync/config.d.ts +0 -27
- package/dist/lib/session/sync/config.js +0 -56
- package/dist/lib/session/sync/managed-config.d.ts +0 -17
- package/dist/lib/session/sync/managed-config.js +0 -17
- package/dist/lib/session/sync/managed-key.d.ts +0 -38
- package/dist/lib/session/sync/managed-key.js +1 -42
- package/dist/lib/session/sync/net-client.d.ts +0 -36
- package/dist/lib/session/sync/net-client.js +0 -30
- package/dist/lib/session/sync/provision.d.ts +0 -2
- package/dist/lib/session/sync/provision.js +0 -13
- package/dist/lib/session/sync/r2.d.ts +0 -20
- package/dist/lib/session/sync/r2.js +0 -20
- package/dist/lib/session/sync/transcript-crypto.d.ts +0 -37
- package/dist/lib/session/sync/transcript-crypto.js +5 -37
- package/dist/lib/session/sync/worker-template.d.ts +0 -5
- package/dist/lib/session/sync/worker-template.js +0 -40
- package/dist/lib/session/testdata/pid-registry-namespace.js +0 -2
- package/dist/lib/session/testdata/process-view-private.js +0 -1
- package/dist/lib/session/throughput.d.ts +0 -24
- package/dist/lib/session/throughput.js +1 -25
- package/dist/lib/session/timeline-pass.d.ts +1 -63
- package/dist/lib/session/timeline-pass.js +161 -148
- package/dist/lib/session/title.d.ts +0 -182
- package/dist/lib/session/title.js +0 -139
- package/dist/lib/session/tool-index.d.ts +2 -21
- package/dist/lib/session/tool-index.js +3 -75
- package/dist/lib/session/tool-store.d.ts +2 -48
- package/dist/lib/session/tool-store.js +1 -33
- package/dist/lib/session/viewing-in.d.ts +0 -67
- package/dist/lib/session/viewing-in.js +1 -71
- package/dist/lib/session/watch.js +0 -2
- package/dist/lib/session/width.js +0 -3
- package/dist/lib/sessions-client.d.ts +0 -46
- package/dist/lib/sessions-client.js +36 -113
- package/dist/lib/settings-manifest.d.ts +1 -17
- package/dist/lib/settings-manifest.js +4 -57
- package/dist/lib/setup-tool-install.d.ts +0 -1
- package/dist/lib/setup-tool-install.js +2 -7
- package/dist/lib/setup-tool-status.d.ts +0 -3
- package/dist/lib/setup-tool-status.js +4 -14
- package/dist/lib/sha256-asset.d.ts +0 -20
- package/dist/lib/sha256-asset.js +0 -20
- package/dist/lib/share-runtime.d.ts +0 -10
- package/dist/lib/share-runtime.js +1 -27
- package/dist/lib/shim-heal.d.ts +0 -15
- package/dist/lib/shim-heal.js +3 -29
- package/dist/lib/signin-badge.d.ts +0 -72
- package/dist/lib/signin-badge.js +0 -86
- package/dist/lib/sink-format.d.ts +0 -32
- package/dist/lib/sink-format.js +0 -14
- package/dist/lib/smart-launch.d.ts +0 -75
- package/dist/lib/smart-launch.js +1 -83
- package/dist/lib/snapshot.d.ts +0 -46
- package/dist/lib/snapshot.js +5 -31
- package/dist/lib/spinner.d.ts +0 -37
- package/dist/lib/spinner.js +0 -37
- package/dist/lib/sqlite.d.ts +0 -13
- package/dist/lib/sqlite.js +3 -71
- package/dist/lib/ssh-exec.d.ts +0 -209
- package/dist/lib/ssh-exec.js +11 -248
- package/dist/lib/ssh-tunnel.d.ts +0 -43
- package/dist/lib/ssh-tunnel.js +2 -48
- package/dist/lib/staleness/checkers/commands.d.ts +0 -4
- package/dist/lib/staleness/checkers/commands.js +0 -4
- package/dist/lib/staleness/checkers/hooks.d.ts +0 -10
- package/dist/lib/staleness/checkers/hooks.js +0 -15
- package/dist/lib/staleness/checkers/mcp.d.ts +0 -9
- package/dist/lib/staleness/checkers/mcp.js +0 -9
- package/dist/lib/staleness/checkers/permissions.d.ts +0 -12
- package/dist/lib/staleness/checkers/permissions.js +0 -13
- package/dist/lib/staleness/checkers/plugins.d.ts +0 -8
- package/dist/lib/staleness/checkers/plugins.js +0 -8
- package/dist/lib/staleness/checkers/rules.d.ts +0 -15
- package/dist/lib/staleness/checkers/rules.js +0 -26
- package/dist/lib/staleness/checkers/skills.d.ts +0 -4
- package/dist/lib/staleness/checkers/skills.js +0 -4
- package/dist/lib/staleness/checkers/subagents.d.ts +0 -9
- package/dist/lib/staleness/checkers/subagents.js +0 -9
- package/dist/lib/staleness/checkers/types.d.ts +0 -34
- package/dist/lib/staleness/checkers/types.js +0 -19
- package/dist/lib/staleness/checkers/workflows.d.ts +0 -7
- package/dist/lib/staleness/checkers/workflows.js +0 -7
- package/dist/lib/staleness/detectors/commands.js +0 -17
- package/dist/lib/staleness/detectors/hooks.js +1 -6
- package/dist/lib/staleness/detectors/mcp.js +0 -4
- package/dist/lib/staleness/detectors/permissions.js +10 -23
- package/dist/lib/staleness/detectors/rules.js +0 -6
- package/dist/lib/staleness/detectors/skills.d.ts +0 -1
- package/dist/lib/staleness/detectors/skills.js +1 -12
- package/dist/lib/staleness/detectors/types.d.ts +0 -10
- package/dist/lib/staleness/fingerprint.d.ts +0 -19
- package/dist/lib/staleness/fingerprint.js +0 -35
- package/dist/lib/staleness/index.d.ts +0 -28
- package/dist/lib/staleness/index.js +1 -45
- package/dist/lib/staleness/layers.d.ts +0 -23
- package/dist/lib/staleness/layers.js +0 -34
- package/dist/lib/staleness/prune.d.ts +0 -71
- package/dist/lib/staleness/prune.js +2 -27
- package/dist/lib/staleness/registry.d.ts +0 -10
- package/dist/lib/staleness/registry.js +3 -33
- package/dist/lib/staleness/types.d.ts +0 -36
- package/dist/lib/staleness/types.js +0 -5
- package/dist/lib/staleness/writers/commands.js +1 -48
- package/dist/lib/staleness/writers/hooks.js +1 -18
- package/dist/lib/staleness/writers/kinds.d.ts +0 -12
- package/dist/lib/staleness/writers/kinds.js +0 -1
- package/dist/lib/staleness/writers/lazy-map.d.ts +0 -11
- package/dist/lib/staleness/writers/mcp.js +0 -13
- package/dist/lib/staleness/writers/plugins.js +0 -4
- package/dist/lib/staleness/writers/rules.d.ts +0 -1
- package/dist/lib/staleness/writers/rules.js +1 -19
- package/dist/lib/staleness/writers/skills.js +3 -14
- package/dist/lib/staleness/writers/sources.d.ts +0 -11
- package/dist/lib/staleness/writers/sources.js +0 -32
- package/dist/lib/staleness/writers/subagents.js +0 -16
- package/dist/lib/staleness/writers/types.d.ts +0 -58
- package/dist/lib/staleness/writers/workflows.js +1 -1
- package/dist/lib/standalone-tools.d.ts +24 -0
- package/dist/lib/standalone-tools.js +58 -0
- package/dist/lib/star-nudge.d.ts +0 -32
- package/dist/lib/star-nudge.js +2 -36
- package/dist/lib/startup/command-registry.d.ts +0 -45
- package/dist/lib/startup/command-registry.js +1 -46
- package/dist/lib/startup/dev-build.d.ts +0 -9
- package/dist/lib/startup/dev-build.js +1 -42
- package/dist/lib/startup/root-command.d.ts +0 -19
- package/dist/lib/startup/root-command.js +0 -19
- package/dist/lib/startup/spellcheck.d.ts +0 -13
- package/dist/lib/startup/spellcheck.js +0 -13
- package/dist/lib/state.d.ts +0 -376
- package/dist/lib/state.js +19 -737
- package/dist/lib/storage/selection.d.ts +0 -40
- package/dist/lib/storage/selection.js +0 -29
- package/dist/lib/subagents-registry.d.ts +0 -56
- package/dist/lib/subagents-registry.js +0 -99
- package/dist/lib/subagents.d.ts +0 -128
- package/dist/lib/subagents.js +1 -158
- package/dist/lib/summarizer/config.d.ts +0 -37
- package/dist/lib/summarizer/config.js +0 -37
- package/dist/lib/summarizer/pass.d.ts +0 -20
- package/dist/lib/summarizer/pass.js +1 -34
- package/dist/lib/summarizer/summarize.d.ts +1 -49
- package/dist/lib/summarizer/summarize.js +0 -35
- package/dist/lib/sync-passphrase.d.ts +0 -16
- package/dist/lib/sync-passphrase.js +1 -18
- package/dist/lib/sync-status.d.ts +0 -72
- package/dist/lib/sync-status.js +0 -55
- package/dist/lib/sync-umbrella.d.ts +0 -54
- package/dist/lib/sync-umbrella.js +0 -48
- package/dist/lib/system-run-sync.d.ts +0 -5
- package/dist/lib/system-run-sync.js +1 -31
- package/dist/lib/teams/agents.d.ts +1 -444
- package/dist/lib/teams/agents.js +11 -871
- package/dist/lib/teams/api.d.ts +2 -52
- package/dist/lib/teams/api.js +4 -63
- package/dist/lib/teams/debug.d.ts +0 -6
- package/dist/lib/teams/debug.js +0 -6
- package/dist/lib/teams/delivery.d.ts +0 -41
- package/dist/lib/teams/delivery.js +0 -32
- package/dist/lib/teams/file_ops.d.ts +0 -11
- package/dist/lib/teams/file_ops.js +0 -11
- package/dist/lib/teams/forEach.d.ts +0 -76
- package/dist/lib/teams/forEach.js +1 -77
- package/dist/lib/teams/index.d.ts +1 -7
- package/dist/lib/teams/index.js +1 -7
- package/dist/lib/teams/parsers.d.ts +0 -4
- package/dist/lib/teams/parsers.js +0 -81
- package/dist/lib/teams/persistence.d.ts +0 -2
- package/dist/lib/teams/persistence.js +0 -12
- package/dist/lib/teams/placement-probe.d.ts +0 -12
- package/dist/lib/teams/placement-probe.js +1 -51
- package/dist/lib/teams/pr-watch.d.ts +0 -107
- package/dist/lib/teams/pr-watch.js +1 -107
- package/dist/lib/teams/registry.d.ts +0 -36
- package/dist/lib/teams/registry.js +0 -47
- package/dist/lib/teams/remoteWorktree.d.ts +0 -50
- package/dist/lib/teams/remoteWorktree.js +1 -96
- package/dist/lib/teams/scheduler.d.ts +0 -111
- package/dist/lib/teams/scheduler.js +2 -125
- package/dist/lib/teams/summarizer.d.ts +0 -22
- package/dist/lib/teams/summarizer.js +6 -50
- package/dist/lib/teams/supervisor.d.ts +0 -38
- package/dist/lib/teams/supervisor.js +0 -21
- package/dist/lib/teams/worktree.d.ts +0 -95
- package/dist/lib/teams/worktree.js +3 -110
- package/dist/lib/template.d.ts +0 -21
- package/dist/lib/template.js +0 -23
- package/dist/lib/term-client.d.ts +0 -26
- package/dist/lib/term-client.js +0 -48
- package/dist/lib/term-driver.d.ts +0 -5
- package/dist/lib/term-driver.js +0 -8
- package/dist/lib/terminal/backends/ghostty.d.ts +0 -2
- package/dist/lib/terminal/backends/ghostty.js +0 -12
- package/dist/lib/terminal/backends/index.d.ts +0 -17
- package/dist/lib/terminal/backends/index.js +0 -15
- package/dist/lib/terminal/backends/iterm.d.ts +0 -2
- package/dist/lib/terminal/backends/iterm.js +0 -10
- package/dist/lib/terminal/backends/terminal-app.d.ts +0 -10
- package/dist/lib/terminal/backends/terminal-app.js +0 -30
- package/dist/lib/terminal/backends/tmux.d.ts +0 -10
- package/dist/lib/terminal/backends/tmux.js +0 -2
- package/dist/lib/terminal/backends/vscodium-agent.d.ts +0 -25
- package/dist/lib/terminal/backends/vscodium-agent.js +0 -36
- package/dist/lib/terminal/engine.d.ts +0 -17
- package/dist/lib/terminal/engine.js +0 -10
- package/dist/lib/terminal/index.d.ts +0 -8
- package/dist/lib/terminal/inject.d.ts +1 -173
- package/dist/lib/terminal/inject.js +0 -146
- package/dist/lib/terminal/policy.d.ts +0 -8
- package/dist/lib/terminal/policy.js +0 -1
- package/dist/lib/terminal/preferred.d.ts +0 -66
- package/dist/lib/terminal/preferred.js +0 -30
- package/dist/lib/terminal/quote.d.ts +0 -8
- package/dist/lib/terminal/quote.js +0 -8
- package/dist/lib/terminal/resolve.d.ts +0 -46
- package/dist/lib/terminal/resolve.js +0 -30
- package/dist/lib/terminal/run-surface.d.ts +0 -56
- package/dist/lib/terminal/run-surface.js +0 -46
- package/dist/lib/terminal/shell.d.ts +0 -3
- package/dist/lib/terminal/shell.js +0 -13
- package/dist/lib/terminal/transport.d.ts +0 -14
- package/dist/lib/terminal/transport.js +1 -30
- package/dist/lib/terminal/types.d.ts +0 -40
- package/dist/lib/terminal/types.js +0 -10
- package/dist/lib/text/relative-time.d.ts +0 -36
- package/dist/lib/text/relative-time.js +0 -43
- package/dist/lib/text/short-id.d.ts +0 -16
- package/dist/lib/text/short-id.js +0 -16
- package/dist/lib/text/width.d.ts +0 -24
- package/dist/lib/text/width.js +10 -52
- package/dist/lib/tmux/binary.d.ts +0 -36
- package/dist/lib/tmux/binary.js +0 -28
- package/dist/lib/tmux/index.d.ts +0 -5
- package/dist/lib/tmux/index.js +0 -5
- package/dist/lib/tmux/orphan-reap.d.ts +0 -253
- package/dist/lib/tmux/orphan-reap.js +3 -299
- package/dist/lib/tmux/paths.d.ts +0 -14
- package/dist/lib/tmux/paths.js +0 -14
- package/dist/lib/tmux/session.d.ts +0 -263
- package/dist/lib/tmux/session.js +6 -344
- package/dist/lib/traces/backend.d.ts +0 -20
- package/dist/lib/traces/backend.js +0 -23
- package/dist/lib/traces/classify.d.ts +0 -20
- package/dist/lib/traces/classify.js +0 -7
- package/dist/lib/traces/insights.d.ts +1 -84
- package/dist/lib/traces/insights.js +0 -126
- package/dist/lib/traces/phenotype.d.ts +0 -69
- package/dist/lib/traces/phenotype.js +0 -150
- package/dist/lib/traces/provision.d.ts +0 -1
- package/dist/lib/traces/provision.js +0 -5
- package/dist/lib/traces/schema2-build.d.ts +3 -60
- package/dist/lib/traces/schema2-build.js +8 -149
- package/dist/lib/traces/schema2-danger.d.ts +0 -30
- package/dist/lib/traces/schema2-danger.js +1 -63
- package/dist/lib/traces/schema2.d.ts +0 -11
- package/dist/lib/traces/segments.d.ts +0 -44
- package/dist/lib/traces/segments.js +0 -65
- package/dist/lib/traces/sync.d.ts +2 -239
- package/dist/lib/traces/sync.js +15 -237
- package/dist/lib/traces/worker-template.d.ts +0 -3
- package/dist/lib/traces/worker-template.js +0 -29
- package/dist/lib/triggers/handlers.d.ts +0 -82
- package/dist/lib/triggers/handlers.js +0 -75
- package/dist/lib/triggers/webhook.d.ts +0 -158
- package/dist/lib/triggers/webhook.js +0 -143
- package/dist/lib/types.d.ts +0 -736
- package/dist/lib/types.js +0 -50
- package/dist/lib/uninstall.d.ts +0 -17
- package/dist/lib/uninstall.js +0 -75
- package/dist/lib/usage-backoff.d.ts +0 -20
- package/dist/lib/usage-backoff.js +3 -60
- package/dist/lib/usage-refresh.d.ts +0 -154
- package/dist/lib/usage-refresh.js +8 -212
- package/dist/lib/verbs.d.ts +0 -12
- package/dist/lib/verbs.js +0 -12
- package/dist/lib/version-duplicates.d.ts +0 -6
- package/dist/lib/version-duplicates.js +0 -6
- package/dist/lib/version.d.ts +0 -55
- package/dist/lib/version.js +1 -58
- package/dist/lib/view-types.d.ts +0 -48
- package/dist/lib/warn-unpushed.d.ts +0 -27
- package/dist/lib/warn-unpushed.js +1 -45
- package/dist/lib/watchdog/history.d.ts +0 -1
- package/dist/lib/watchdog/history.js +0 -3
- package/dist/lib/watchdog/index.js +0 -2
- package/dist/lib/watchdog/log.d.ts +0 -19
- package/dist/lib/watchdog/log.js +0 -34
- package/dist/lib/watchdog/read.d.ts +0 -27
- package/dist/lib/watchdog/read.js +3 -58
- package/dist/lib/watchdog/rotate.d.ts +0 -139
- package/dist/lib/watchdog/rotate.js +2 -151
- package/dist/lib/watchdog/runner.d.ts +0 -125
- package/dist/lib/watchdog/runner.js +3 -223
- package/dist/lib/watchdog/service.d.ts +0 -1
- package/dist/lib/watchdog/service.js +0 -2
- package/dist/lib/watchdog/watchdog-agent.d.ts +0 -31
- package/dist/lib/watchdog/watchdog-agent.js +0 -27
- package/dist/lib/watchdog/watchdog.d.ts +0 -7
- package/dist/lib/watchdog/watchdog.js +0 -10
- package/dist/lib/watchdog/watchdogTail.js +0 -7
- package/dist/lib/whats-new.d.ts +0 -10
- package/dist/lib/whats-new.js +0 -21
- package/dist/lib/workflows-registry.d.ts +0 -45
- package/dist/lib/workflows-registry.js +0 -60
- package/dist/lib/workflows.d.ts +0 -282
- package/dist/lib/workflows.js +3 -213
- package/dist/lib/worktree/held.d.ts +0 -89
- package/dist/lib/worktree/held.js +1 -103
- package/dist/lib/wrap.d.ts +0 -32
- package/dist/lib/wrap.js +0 -32
- package/dist/lib/yaml-io.d.ts +0 -45
- package/dist/lib/yaml-io.js +0 -47
- package/dist/session-tracker/dist/adapters/claude.js +0 -2
- package/dist/session-tracker/dist/hook.sh +4 -37
- package/dist/session-tracker/dist/index.d.ts +0 -7
- package/dist/session-tracker/dist/index.js +0 -5
- package/dist/session-tracker/dist/install-hook.d.ts +0 -5
- package/dist/session-tracker/dist/install-hook.js +1 -15
- package/dist/session-tracker/dist/prune-state.js +0 -4
- package/dist/session-tracker/dist/reader.js +0 -4
- package/dist/session-tracker/dist/state-file.d.ts +0 -3
- package/dist/session-tracker/dist/state-file.js +3 -8
- package/package.json +3 -4
- package/scripts/postinstall.js +8 -116
- package/dist/lib/session/artifacts.d.ts +0 -14
- package/dist/lib/session/artifacts.js +0 -101
- package/dist/lib/session/bash-command.d.ts +0 -63
- package/dist/lib/session/bash-command.js +0 -490
- package/dist/lib/session/digest.d.ts +0 -66
- package/dist/lib/session/digest.js +0 -328
- package/dist/lib/session/highlights.d.ts +0 -151
- package/dist/lib/session/highlights.js +0 -391
- package/dist/lib/session/insights.d.ts +0 -165
- package/dist/lib/session/insights.js +0 -563
- package/dist/lib/session/linear.d.ts +0 -19
- package/dist/lib/session/linear.js +0 -99
- package/dist/lib/session/parse.d.ts +0 -224
- package/dist/lib/session/parse.js +0 -2408
- package/dist/lib/session/prompt.d.ts +0 -213
- package/dist/lib/session/prompt.js +0 -601
- package/dist/lib/session/render.d.ts +0 -133
- package/dist/lib/session/render.js +0 -1047
- package/dist/lib/session/share-html.d.ts +0 -35
- package/dist/lib/session/share-html.js +0 -319
- package/dist/lib/session/shell-programs.d.ts +0 -33
- package/dist/lib/session/shell-programs.js +0 -380
- package/dist/lib/session/state.d.ts +0 -269
- package/dist/lib/session/state.js +0 -777
- package/dist/lib/session/stream-render.d.ts +0 -4
- package/dist/lib/session/stream-render.js +0 -131
- package/dist/lib/session/tail.d.ts +0 -88
- package/dist/lib/session/tail.js +0 -294
- package/dist/lib/session/team-filter.d.ts +0 -129
- package/dist/lib/session/team-filter.js +0 -269
- package/dist/lib/session/timeline.d.ts +0 -172
- package/dist/lib/session/timeline.js +0 -636
- package/dist/lib/session/tool-calls.d.ts +0 -132
- package/dist/lib/session/tool-calls.js +0 -674
- package/dist/lib/session/trajectory-compare.d.ts +0 -48
- package/dist/lib/session/trajectory-compare.js +0 -116
- package/dist/lib/session/trajectory-html.d.ts +0 -19
- package/dist/lib/session/trajectory-html.js +0 -771
- package/dist/lib/session/trajectory-lineage.d.ts +0 -93
- package/dist/lib/session/trajectory-lineage.js +0 -195
- package/dist/lib/session/trajectory-text.d.ts +0 -38
- package/dist/lib/session/trajectory-text.js +0 -284
- package/dist/lib/session/trajectory.d.ts +0 -145
- package/dist/lib/session/trajectory.js +0 -394
- package/dist/lib/session/types.d.ts +0 -627
- package/dist/lib/session/types.js +0 -43
|
@@ -1,19 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Install + lifecycle for the macOS menu-bar helper (`MenubarHelper.app`).
|
|
3
|
-
*
|
|
4
|
-
* Mirrors the stable-Application-Support-path-survives-npm-re-sign pattern and
|
|
5
|
-
* a RunAtLoad + KeepAlive user service, the same shape the deleted embedded
|
|
6
|
-
* secrets-agent used before it moved to the standalone secrets-cli (PHNX-3989).
|
|
7
|
-
*
|
|
8
|
-
* The helper is a no-Dock `.accessory` status-bar app. It reads live agent
|
|
9
|
-
* state directly from disk and shells `agents` only for actions, so the plist
|
|
10
|
-
* bakes in the node interpreter + entry point + bin path so the GUI process can
|
|
11
|
-
* find the CLI without a login PATH.
|
|
12
|
-
*
|
|
13
|
-
* Opt-out is sticky: `agents menubar disable` drops a sentinel that the upgrade
|
|
14
|
-
* migration (`installMenubarLaunchAgent` in migrate.ts) honors, so a disabled
|
|
15
|
-
* menu bar never silently comes back on the next release.
|
|
16
|
-
*/
|
|
17
1
|
import { fileURLToPath } from 'url';
|
|
18
2
|
import { execFileSync, spawnSync } from 'child_process';
|
|
19
3
|
import * as fs from 'fs';
|
|
@@ -31,85 +15,24 @@ import { cachedMenubarVersion, resolveMenubarVersion } from './resolve-version.j
|
|
|
31
15
|
const APP_BUNDLE_NAME = 'MenubarHelper.app';
|
|
32
16
|
const INSTALL_DIR_NAME = 'agents-cli';
|
|
33
17
|
const SERVICE_LABEL_BASE = 'com.phnx-labs.agents-menubar';
|
|
34
|
-
/**
|
|
35
|
-
* The bundled executable's basename (RUSH-3101) — what launchd execs directly
|
|
36
|
-
* inside `Contents/MacOS/`, bypassing LaunchServices name resolution. Before
|
|
37
|
-
* this it was `MenubarHelper`, so that raw Mach-O basename is exactly what
|
|
38
|
-
* macOS showed in System Settings > Privacy & Security > Accessibility and in
|
|
39
|
-
* the "would like to control this computer" prompt. Renaming this constant
|
|
40
|
-
* alone does NOT touch the bundle id, Team ID, or designated requirement
|
|
41
|
-
* (`SERVICE_LABEL_BASE`, `MENUBAR_HELPER_BUNDLE_ID` in download-menubar.ts) —
|
|
42
|
-
* those are what keep the existing Accessibility grant alive across upgrades.
|
|
43
|
-
* Every basename-matching check reads this constant rather than re-deriving
|
|
44
|
-
* the string; the Swift side (phnx-labs/agi-menu,
|
|
45
|
-
* `Sources/MenubarHelper/HelperIdentity.swift`) has its own equal.
|
|
46
|
-
*/
|
|
47
18
|
export const MENUBAR_HELPER_EXECUTABLE_NAME = 'AGI Menu';
|
|
48
|
-
/**
|
|
49
|
-
* launchd Label for this process's helper — the production identifier for a
|
|
50
|
-
* real invocation, namespaced under a redirected HOME (RUSH-2639). launchd
|
|
51
|
-
* routes bootout/bootstrap/kickstart by identifier alone, so without this a
|
|
52
|
-
* hermetic test fork's own teardown boots out the operator's live helper.
|
|
53
|
-
*/
|
|
54
19
|
export function serviceLabel() {
|
|
55
20
|
return namespacedServiceLabel(SERVICE_LABEL_BASE);
|
|
56
21
|
}
|
|
57
|
-
/**
|
|
58
|
-
* Minimum seconds between launchd restarts of the helper (`ThrottleInterval`).
|
|
59
|
-
*
|
|
60
|
-
* The helper can crash at startup on a loaded machine: `NSApplication.shared`
|
|
61
|
-
* segfaults inside `SLSNewConnection` when WindowServer is too starved to hand
|
|
62
|
-
* out a connection. With `KeepAlive` and no throttle, launchd relaunches on its
|
|
63
|
-
* 10s default, and each attempt spawns a fresh `agents doctor --json` before
|
|
64
|
-
* dying — so a starved box gets hit harder the worse it gets. 30s bounds that
|
|
65
|
-
* respawn rate while staying well inside "the menu bar came back on its own".
|
|
66
|
-
*
|
|
67
|
-
* This only paces the restarts. What actually stops the pile-up is the helper
|
|
68
|
-
* bounding and group-killing its own children (agi-menu's
|
|
69
|
-
* `Sources/MenubarHelper/ChildProcess.swift`); the two are complementary, not
|
|
70
|
-
* alternatives.
|
|
71
|
-
*/
|
|
72
22
|
const MENUBAR_THROTTLE_SECONDS = 30;
|
|
73
23
|
function onDarwin() {
|
|
74
24
|
return process.platform === 'darwin';
|
|
75
25
|
}
|
|
76
|
-
/** ~/Library/Application Support/agents-cli */
|
|
77
26
|
function installDir() {
|
|
78
27
|
return path.join(os.homedir(), 'Library', 'Application Support', INSTALL_DIR_NAME);
|
|
79
28
|
}
|
|
80
|
-
/** ~/Library/Application Support/agents-cli/MenubarHelper.app */
|
|
81
29
|
function installedAppPath() {
|
|
82
30
|
return path.join(installDir(), APP_BUNDLE_NAME);
|
|
83
31
|
}
|
|
84
|
-
/**
|
|
85
|
-
* Version stamp written next to the installed bundle. The upgrade self-heal
|
|
86
|
-
* compares this against the running CLI's version to decide whether the App
|
|
87
|
-
* Support copy + plist need to be rebuilt — without it, a `npm update` refreshes
|
|
88
|
-
* dist/index.js but leaves the menu bar running the OLD helper binary and a
|
|
89
|
-
* plist whose baked paths may have drifted.
|
|
90
|
-
*/
|
|
91
32
|
function installedVersionMarkerPath() {
|
|
92
33
|
return path.join(installDir(), '.menubar-version');
|
|
93
34
|
}
|
|
94
|
-
/**
|
|
95
|
-
* What the installed helper IS — deliberately not the CLI's version.
|
|
96
|
-
*
|
|
97
|
-
* `source` matters because the two install paths have different notions of
|
|
98
|
-
* "changed": a release bundle is identified by its helper version, while a local
|
|
99
|
-
* dev build has none (agi-menu's build.sh hardcodes CFBundleShortVersionString),
|
|
100
|
-
* so it is identified by the source path + mtime it was copied from.
|
|
101
|
-
*/
|
|
102
|
-
/** Version label for a bundle that has none of its own (a local dev build). */
|
|
103
35
|
export const LOCAL_BUILD_LABEL = 'local';
|
|
104
|
-
/**
|
|
105
|
-
* Read the stamp, tolerating the pre-JSON format.
|
|
106
|
-
*
|
|
107
|
-
* Older installs wrote a bare version string — and wrote the CLI's version into
|
|
108
|
-
* it, which is the bug this replaces. Such a stamp cannot be compared on the
|
|
109
|
-
* helper axis at all, so it reports `legacy` and is treated as stale exactly
|
|
110
|
-
* once, which re-stamps it in the new format. That mirrors the existing
|
|
111
|
-
* null-is-stale rule and is why the migration cannot loop.
|
|
112
|
-
*/
|
|
113
36
|
function readInstalledMenubarStamp() {
|
|
114
37
|
let raw;
|
|
115
38
|
try {
|
|
@@ -125,67 +48,30 @@ function readInstalledMenubarStamp() {
|
|
|
125
48
|
if (parsed && (parsed.source === 'release' || parsed.source === 'local'))
|
|
126
49
|
return parsed;
|
|
127
50
|
}
|
|
128
|
-
catch {
|
|
51
|
+
catch { }
|
|
129
52
|
return { source: 'legacy', raw };
|
|
130
53
|
}
|
|
131
|
-
/** Executable inside the installed bundle. */
|
|
132
54
|
function installedExecutablePath() {
|
|
133
55
|
return path.join(installedAppPath(), 'Contents', 'MacOS', MENUBAR_HELPER_EXECUTABLE_NAME);
|
|
134
56
|
}
|
|
135
|
-
/**
|
|
136
|
-
* Absolute path to the installed menu-bar helper executable if it exists on
|
|
137
|
-
* disk, else null. The desktop notifier (notify-desktop.ts) routes daemon
|
|
138
|
-
* notifications through this one-shot (`"AGI Menu" --notify ...`) so they
|
|
139
|
-
* carry the agents-cli mark rather than the generic osascript icon. Null on
|
|
140
|
-
* non-darwin or when the helper is not installed (menu bar disabled, a Linux
|
|
141
|
-
* package, or a dev checkout without a built bundle).
|
|
142
|
-
*/
|
|
143
57
|
export function resolveInstalledMenubarExecutable() {
|
|
144
58
|
if (!onDarwin())
|
|
145
59
|
return null;
|
|
146
60
|
const exec = installedExecutablePath();
|
|
147
61
|
return fs.existsSync(exec) ? exec : null;
|
|
148
62
|
}
|
|
149
|
-
/** ~/Library/LaunchAgents/com.phnx-labs.agents-menubar.plist */
|
|
150
63
|
function servicePlistPath() {
|
|
151
64
|
return path.join(os.homedir(), 'Library', 'LaunchAgents', `${serviceLabel()}.plist`);
|
|
152
65
|
}
|
|
153
|
-
/** Sticky opt-out marker written by `agents menubar disable`. */
|
|
154
66
|
function disabledSentinelPath() {
|
|
155
67
|
return path.join(getRuntimeStateDir(), 'menubar.disabled');
|
|
156
68
|
}
|
|
157
|
-
/** True if the user explicitly disabled the menu bar (don't auto-enable on upgrade). */
|
|
158
69
|
function menubarDisabledByUser() {
|
|
159
70
|
return fs.existsSync(disabledSentinelPath());
|
|
160
71
|
}
|
|
161
|
-
/** True if the launchd plist for the menu-bar service is installed. */
|
|
162
72
|
function menubarServiceInstalled() {
|
|
163
73
|
return onDarwin() && fs.existsSync(servicePlistPath());
|
|
164
74
|
}
|
|
165
|
-
/**
|
|
166
|
-
* Locate the source `.app` shipped alongside the compiled JS.
|
|
167
|
-
* 1. dist/lib/menubar/MenubarHelper.app — npm install layout (sibling of this file)
|
|
168
|
-
* 2. <repo>/bin/MenubarHelper.app — raw working tree (tsx/dev): the
|
|
169
|
-
* published bundle staged by scripts/stage-menubar-helper.sh, or a build
|
|
170
|
-
* copied in from a phnx-labs/agi-menu checkout
|
|
171
|
-
* 3. <on-disk install>/dist/lib/menubar/MenubarHelper.app — Bun single-file
|
|
172
|
-
* binary: `import.meta.url` is a virtual `/$bunfs/` path, so the sibling
|
|
173
|
-
* candidates above can't see the on-disk bundle; recover it via the
|
|
174
|
-
* `agents` launcher symlink.
|
|
175
|
-
* 4. the verified download cache for the RELEASE this machine has resolved
|
|
176
|
-
* (`cachedMenubarVersion`: the newest published build it last saw, never
|
|
177
|
-
* below the floor, the floor itself before any resolution) — the npm
|
|
178
|
-
* tarball ships no bundle (PHNX-4036), so on an `npm i -g` machine this is
|
|
179
|
-
* the only source there is. It is filled by `agents menubar setup` or by
|
|
180
|
-
* the detached background worker (`prefetchMenubarHelper`), never here:
|
|
181
|
-
* this resolver stays network-free so the startup self-heal stays cheap.
|
|
182
|
-
* Last so a bundle that ships with the build always wins; keyed by the
|
|
183
|
-
* resolved version so an older cached release is never picked up.
|
|
184
|
-
*
|
|
185
|
-
* `shippedAppPath` is candidates 1–3 alone: a bundle that ships WITH this
|
|
186
|
-
* install, which CLI upgrades own. The auto-update pass replaces a cached
|
|
187
|
-
* release (candidate 4) but never a shipped bundle.
|
|
188
|
-
*/
|
|
189
75
|
function sourceAppPath() {
|
|
190
76
|
const shipped = shippedAppPath();
|
|
191
77
|
if (shipped)
|
|
@@ -203,16 +89,11 @@ function shippedAppPath() {
|
|
|
203
89
|
candidates.push(path.resolve(here, '..', '..', '..', 'bin', APP_BUNDLE_NAME));
|
|
204
90
|
}
|
|
205
91
|
catch {
|
|
206
|
-
/* import.meta.url unavailable */
|
|
207
92
|
}
|
|
208
93
|
for (const c of candidates) {
|
|
209
94
|
if (fs.existsSync(c))
|
|
210
95
|
return c;
|
|
211
96
|
}
|
|
212
|
-
// Candidate 4 — only reached when the sibling candidates miss (the Bun
|
|
213
|
-
// single-file binary, whose `import.meta.url` is a virtual `/$bunfs/` path).
|
|
214
|
-
// Resolve the launcher symlink lazily so the common Node path pays no extra
|
|
215
|
-
// filesystem probe.
|
|
216
97
|
const layout = resolveInstalledLayout();
|
|
217
98
|
if (layout) {
|
|
218
99
|
const p = path.join(layout.distDir, 'lib', 'menubar', APP_BUNDLE_NAME);
|
|
@@ -221,23 +102,12 @@ function shippedAppPath() {
|
|
|
221
102
|
}
|
|
222
103
|
return null;
|
|
223
104
|
}
|
|
224
|
-
/** Where a downloaded copy of the floor release sits once fetched and verified. */
|
|
225
105
|
export function cachedFloorBundlePath() {
|
|
226
106
|
return path.join(menubarHelperCacheDir(helperFloor('menubar')), APP_BUNDLE_NAME);
|
|
227
107
|
}
|
|
228
|
-
/**
|
|
229
|
-
* Where the downloaded copy of the RESOLVED release sits (`cachedMenubarVersion`,
|
|
230
|
-
* so the floor's cache dir until this machine has resolved something newer).
|
|
231
|
-
* The startup self-heal installs from here, network-free.
|
|
232
|
-
*/
|
|
233
108
|
export function cachedReleaseBundlePath() {
|
|
234
109
|
return path.join(menubarHelperCacheDir(cachedMenubarVersion()), APP_BUNDLE_NAME);
|
|
235
110
|
}
|
|
236
|
-
/**
|
|
237
|
-
* The release version an explicit install should fetch: the newest published
|
|
238
|
-
* build, but never below what this Mac already runs — a release deleted after
|
|
239
|
-
* it was installed must not roll the helper back through `setup`/`enable`.
|
|
240
|
-
*/
|
|
241
111
|
async function menubarVersionToInstall(opts = {}) {
|
|
242
112
|
const resolved = await resolveMenubarVersion({ force: opts.force });
|
|
243
113
|
const installed = readInstalledMenubarStamp();
|
|
@@ -245,62 +115,32 @@ async function menubarVersionToInstall(opts = {}) {
|
|
|
245
115
|
return installed.helperVersion;
|
|
246
116
|
return resolved;
|
|
247
117
|
}
|
|
248
|
-
/** Resolve the compiled CLI entry (dist/index.js) so the helper can exec node directly. */
|
|
249
118
|
function resolveCliEntry() {
|
|
250
119
|
try {
|
|
251
120
|
const here = path.dirname(fileURLToPath(import.meta.url));
|
|
252
|
-
// dist/lib/menubar/install-menubar.js -> dist/index.js
|
|
253
121
|
const entry = path.resolve(here, '..', '..', 'index.js');
|
|
254
122
|
if (fs.existsSync(entry))
|
|
255
123
|
return entry;
|
|
256
124
|
}
|
|
257
125
|
catch {
|
|
258
|
-
/* ignore */
|
|
259
126
|
}
|
|
260
127
|
return null;
|
|
261
128
|
}
|
|
262
|
-
/**
|
|
263
|
-
* Register the freshly-installed bundle with LaunchServices.
|
|
264
|
-
*
|
|
265
|
-
* The helper is copied to ~/Library/Application Support (not /Applications) and
|
|
266
|
-
* launched only via launchd, so LaunchServices may never discover it on its own.
|
|
267
|
-
* A daemon notification posted by the one-shot `MenubarHelper --notify` process is
|
|
268
|
-
* attributed to this bundle, and macOS resolves the notification's LEFT-hand app
|
|
269
|
-
* icon from the bundle's LaunchServices record — so a bundle LS doesn't know about
|
|
270
|
-
* shows a blank app icon there (the right-hand contentImage is unaffected;
|
|
271
|
-
* appIconImage reads the `.icns` directly). `lsregister -f` registers the bundle at
|
|
272
|
-
* its current path so the OS can resolve its AppIcon for that slot. Best-effort:
|
|
273
|
-
* LaunchServices is advisory, and a failure here must never block install.
|
|
274
|
-
*/
|
|
275
129
|
function refreshBundleIconRegistration(appPath) {
|
|
276
130
|
const lsregister = '/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister';
|
|
277
131
|
const bin = fs.existsSync(lsregister) ? lsregister : 'lsregister';
|
|
278
132
|
const r = spawnSync(bin, ['-f', appPath], { stdio: ['ignore', 'ignore', 'ignore'] });
|
|
279
133
|
if (r.error) {
|
|
280
|
-
/* lsregister missing / moved — advisory only, ignore. */
|
|
281
134
|
}
|
|
282
135
|
}
|
|
283
|
-
/** True when the bundle carries a signature the kernel will accept at launch. */
|
|
284
136
|
export function codesignVerifies(appPath) {
|
|
285
137
|
const r = spawnSync('codesign', ['--verify', '--strict', appPath], { stdio: ['ignore', 'ignore', 'ignore'] });
|
|
286
138
|
return r.status === 0;
|
|
287
139
|
}
|
|
288
|
-
/**
|
|
289
|
-
* True when Gatekeeper will let the bundle execute on this machine.
|
|
290
|
-
* A Developer-ID-signed but un-notarized app is rejected by `spctl --assess`,
|
|
291
|
-
* which macOS surfaces as "the app is damaged" and can crash AppKit during
|
|
292
|
-
* launch. This is separate from `codesign --verify`: a signature can be valid
|
|
293
|
-
* while Gatekeeper still refuses to run it. The helper's own release
|
|
294
|
-
* (phnx-labs/agi-menu scripts/release.sh) notarizes + staples it and this repo's
|
|
295
|
-
* stage-menubar-helper.sh re-verifies it, so a shipped bundle passes this; the
|
|
296
|
-
* launch guards use it to fail loud rather than bootstrap a helper macOS would
|
|
297
|
-
* reject.
|
|
298
|
-
*/
|
|
299
140
|
export function gatekeeperAssesses(appPath) {
|
|
300
141
|
const r = spawnSync('spctl', ['--assess', '--type', 'exec', appPath], { stdio: ['ignore', 'ignore', 'ignore'] });
|
|
301
142
|
return r.status === 0;
|
|
302
143
|
}
|
|
303
|
-
/** True when the bundle carries a Developer ID TeamIdentifier (not ad-hoc). */
|
|
304
144
|
export function hasDeveloperIdSignature(appPath) {
|
|
305
145
|
const r = spawnSync('codesign', ['-dv', '--verbose=4', appPath], {
|
|
306
146
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
@@ -310,30 +150,13 @@ export function hasDeveloperIdSignature(appPath) {
|
|
|
310
150
|
const team = out.match(/TeamIdentifier=([A-Z0-9]+)/)?.[1];
|
|
311
151
|
return Boolean(team && team !== 'not set');
|
|
312
152
|
}
|
|
313
|
-
/**
|
|
314
|
-
* Copy the bundled `.app` to the stable user path (idempotent unless forced).
|
|
315
|
-
* Returns the installed executable path, or null if no source bundle ships
|
|
316
|
-
* with this install (e.g. Linux package, or a build without the helper).
|
|
317
|
-
*
|
|
318
|
-
* Also heals an older install that was ad-hoc re-signed over a Developer ID
|
|
319
|
-
* source: that unstable identity made Accessibility re-prompt on every upgrade.
|
|
320
|
-
* When the shipped source is Developer ID and the installed copy is only
|
|
321
|
-
* ad-hoc, replace it — even without forceReinstall.
|
|
322
|
-
*/
|
|
323
153
|
export function ensureMenubarAppInstalled(opts = {}) {
|
|
324
154
|
if (!onDarwin())
|
|
325
155
|
return null;
|
|
326
|
-
// An explicit `sourceAppPath` (a pre-downloaded cache path from the explicit
|
|
327
|
-
// enable/setup path) overrides local discovery. This function itself does NO
|
|
328
|
-
// network — the download happens in the async callers before they hand a path
|
|
329
|
-
// here, so the sync startup self-heal that calls it with no override stays
|
|
330
|
-
// network-free and simply no-ops when `sourceAppPath()` finds nothing.
|
|
331
156
|
const src = opts.sourceAppPath ?? sourceAppPath();
|
|
332
157
|
if (!src)
|
|
333
158
|
return null;
|
|
334
159
|
const dest = installedAppPath();
|
|
335
|
-
// Heal an older install that was ad-hoc re-signed over a Developer ID source:
|
|
336
|
-
// that unstable identity made Accessibility re-prompt on every upgrade.
|
|
337
160
|
const needsInstall = () => {
|
|
338
161
|
if (opts.forceReinstall)
|
|
339
162
|
return true;
|
|
@@ -341,21 +164,13 @@ export function ensureMenubarAppInstalled(opts = {}) {
|
|
|
341
164
|
return true;
|
|
342
165
|
return hasDeveloperIdSignature(src) && !hasDeveloperIdSignature(dest);
|
|
343
166
|
};
|
|
344
|
-
// Fast path: nothing to do.
|
|
345
167
|
if (!needsInstall())
|
|
346
168
|
return installedExecutablePath();
|
|
347
|
-
// Serialize the atomic install so concurrent `agents` invocations (this runs
|
|
348
|
-
// on the darwin startup path) don't race the swap or each re-copy — the
|
|
349
|
-
// stampede that transiently corrupted MenubarHelper.app and tripped the
|
|
350
|
-
// "damaged" dialog.
|
|
351
169
|
withInstallLock(dest, (heartbeat) => {
|
|
352
170
|
if (!needsInstall())
|
|
353
171
|
return;
|
|
354
172
|
copyAppBundle(src, dest);
|
|
355
|
-
heartbeat();
|
|
356
|
-
// A fresh copy is exactly when the bundle's icon can be new (first install) or
|
|
357
|
-
// superseded (upgrade) — register it so LaunchServices knows the bundle and can
|
|
358
|
-
// resolve its AppIcon for the left-hand slot of daemon notifications.
|
|
173
|
+
heartbeat();
|
|
359
174
|
refreshBundleIconRegistration(dest);
|
|
360
175
|
});
|
|
361
176
|
return installedExecutablePath();
|
|
@@ -367,16 +182,6 @@ export function generateServicePlist(execPath) {
|
|
|
367
182
|
const home = os.homedir();
|
|
368
183
|
const logPath = path.join(getHelpersDir(), 'menubar', 'menubar.log');
|
|
369
184
|
fs.mkdirSync(path.dirname(logPath), { recursive: true });
|
|
370
|
-
// Bake interpreter + entry + bin so the GUI helper can reach the CLI with no
|
|
371
|
-
// login PATH. AgentsCLI.swift prefers [AGENTS_NODE, AGENTS_ENTRY] when both
|
|
372
|
-
// exist, else falls back to AGENTS_BIN, else probes well-known paths.
|
|
373
|
-
//
|
|
374
|
-
// HOME is baked for the same reason (RUSH-2639, see service-manifest.ts):
|
|
375
|
-
// launchd applies this dict on top of the LOGIN SESSION's environment, not the
|
|
376
|
-
// environment of whoever called `launchctl bootstrap`. Without the key the
|
|
377
|
-
// helper resolves the account home and every `agents` call it makes bootstraps
|
|
378
|
-
// that home's `~/.agents` — which is how a hermetic test fork's helper wrote
|
|
379
|
-
// into the runner's real home.
|
|
380
185
|
const env = {
|
|
381
186
|
PATH: `/usr/local/bin:/usr/bin:/bin:/opt/homebrew/bin:${path.dirname(process.execPath)}:${home}/.local/bin`,
|
|
382
187
|
...serviceManifestHomeEnv(),
|
|
@@ -422,15 +227,6 @@ ${envXml}
|
|
|
422
227
|
</dict>
|
|
423
228
|
</plist>`;
|
|
424
229
|
}
|
|
425
|
-
/**
|
|
426
|
-
* Restart the menu-bar launchd agent from a clean state.
|
|
427
|
-
*
|
|
428
|
-
* Always `bootout` first: on modern macOS `bootstrap` fails when the job is
|
|
429
|
-
* already bootstrapped, and the deprecated `load -w` fallback is unreliable.
|
|
430
|
-
* A prior WindowServer disconnect can leave the job throttled so that a plain
|
|
431
|
-
* `kickstart -k` does not bring it back; booting it out and bootstrapping fresh
|
|
432
|
-
* is the only sequence that reliably re-attaches the status item.
|
|
433
|
-
*/
|
|
434
230
|
export function restartMenubarLaunchAgent(uid, plist, exec = execFileSync) {
|
|
435
231
|
const reg = serviceManagerRegistrationAllowed();
|
|
436
232
|
if (!reg.allowed) {
|
|
@@ -442,40 +238,16 @@ export function restartMenubarLaunchAgent(uid, plist, exec = execFileSync) {
|
|
|
442
238
|
try {
|
|
443
239
|
exec('launchctl', ['bootout', serviceTarget], opts);
|
|
444
240
|
}
|
|
445
|
-
catch {
|
|
241
|
+
catch { }
|
|
446
242
|
try {
|
|
447
243
|
exec('launchctl', ['bootstrap', `gui/${uid}`, plist], opts);
|
|
448
244
|
}
|
|
449
|
-
catch {
|
|
245
|
+
catch { }
|
|
450
246
|
try {
|
|
451
247
|
exec('launchctl', ['kickstart', serviceTarget], opts);
|
|
452
248
|
}
|
|
453
|
-
catch {
|
|
454
|
-
}
|
|
455
|
-
/**
|
|
456
|
-
* Force a running helper off the binary that was just swapped underneath it.
|
|
457
|
-
*
|
|
458
|
-
* `installMenubarLaunchAgentOnUpgrade()` calls this after a heal actually
|
|
459
|
-
* replaces the on-disk bundle (a version bump or the ad-hoc -> Developer ID
|
|
460
|
-
* transition — see `menubarHealReplacedBundle`). `restartMenubarLaunchAgent`
|
|
461
|
-
* (run moments earlier via `installAndStartService`) already attempts
|
|
462
|
-
* bootout+bootstrap+kickstart, but that targets the GUI launchd domain and
|
|
463
|
-
* fails silently — `launchctl kickstart -k gui/<uid>/<label>` prints "Could not
|
|
464
|
-
* find service ... in domain for user gui" — from a shell with no Aqua session,
|
|
465
|
-
* which is the ordinary case for `agents` invoked from a terminal/tmux/ssh
|
|
466
|
-
* session rather than literally the login item (verified live). When that
|
|
467
|
-
* happens the plist and on-disk bundle are current but the LIVE process is
|
|
468
|
-
* still the old binary, so it requests Accessibility under the OLD code
|
|
469
|
-
* identity and the grant never sticks.
|
|
470
|
-
*
|
|
471
|
-
* `kickstart -k` (force-restart, unlike the bare kickstart already tried) is
|
|
472
|
-
* attempted first since it is the clean launchd-native path when it works. If
|
|
473
|
-
* launchd has no record of the service in this context either, fall back to
|
|
474
|
-
* ending the specific pid(s) already confirmed to be running the installed
|
|
475
|
-
* bundle (`ownProcesses`, resolved by the caller via `liveMenubarProcesses`) —
|
|
476
|
-
* never a broad pkill. The launchd plist has `KeepAlive=true`, so the ended
|
|
477
|
-
* process is relaunched from the swapped binary within seconds.
|
|
478
|
-
*/
|
|
249
|
+
catch { }
|
|
250
|
+
}
|
|
479
251
|
export function restartMenubarHelperAfterSwap(uid, ownProcesses, exec = execFileSync, kill = endProcess) {
|
|
480
252
|
const reg = serviceManagerRegistrationAllowed();
|
|
481
253
|
if (!reg.allowed)
|
|
@@ -491,37 +263,15 @@ export function restartMenubarHelperAfterSwap(uid, ownProcesses, exec = execFile
|
|
|
491
263
|
kill(p.pid);
|
|
492
264
|
}
|
|
493
265
|
}
|
|
494
|
-
/**
|
|
495
|
-
* Sync install + start core: install the given (already-on-disk) source `.app`
|
|
496
|
-
* and start the launchd service. NO network — the source `.app` must already be
|
|
497
|
-
* local (a bundled/local copy for the sync startup self-heal, or a pre-downloaded
|
|
498
|
-
* cache path for the explicit async enable/setup path). Returns false on
|
|
499
|
-
* non-darwin, when no source resolves, or when the bundle fails the Gatekeeper
|
|
500
|
-
* check. Shared by the sync self-heal (`installMenubarLaunchAgentOnUpgrade`) and
|
|
501
|
-
* the async `enableMenubarService`.
|
|
502
|
-
*/
|
|
503
266
|
function startMenubarServiceFromSource(opts = {}) {
|
|
504
267
|
if (!onDarwin())
|
|
505
268
|
return false;
|
|
506
|
-
// Resolve the source HERE, once, and hand the SAME value to the installer and
|
|
507
|
-
// the stamp. Passing `opts.sourceAppPath` to both let them disagree: the
|
|
508
|
-
// installer falls back to `sourceAppPath()` internally, so on the self-heal
|
|
509
|
-
// path (which passes nothing) it would install a LOCAL build while the stamp
|
|
510
|
-
// recorded a release version. The next invocation then computed `local`, saw a
|
|
511
|
-
// kind mismatch, and reinstalled — every time, forever. That is the #2109
|
|
512
|
-
// storm this whole change exists to stop, so the two must read one variable.
|
|
513
269
|
const src = opts.sourceAppPath ?? sourceAppPath();
|
|
514
270
|
if (!src)
|
|
515
271
|
return false;
|
|
516
272
|
const exec = ensureMenubarAppInstalled({ forceReinstall: true, sourceAppPath: src });
|
|
517
273
|
if (!exec)
|
|
518
274
|
return false;
|
|
519
|
-
// Never bootstrap a helper macOS will reject at launch: an invalid signature
|
|
520
|
-
// under launchd KeepAlive crash-loops forever, and an un-notarized bundle is
|
|
521
|
-
// rejected by Gatekeeper as "damaged". A shipped helper is Developer-ID signed
|
|
522
|
-
// AND notarized (release build + the verify-menubar-helper.sh prepack gate), so
|
|
523
|
-
// this passes; if it ever doesn't, skip the service and point at the upgrade
|
|
524
|
-
// rather than re-signing over it (an ad-hoc re-sign never satisfies Gatekeeper).
|
|
525
275
|
if (!(codesignVerifies(installedAppPath()) && gatekeeperAssesses(installedAppPath()))) {
|
|
526
276
|
process.stderr.write('agents: AGI Menu is not notarized/valid on this machine; skipping launch. ' +
|
|
527
277
|
'Upgrade to a notarized build (npm i -g @phnx-labs/agents-cli), then `agents menubar setup`.\n');
|
|
@@ -532,45 +282,20 @@ function startMenubarServiceFromSource(opts = {}) {
|
|
|
532
282
|
installAndStartService(exec, stampFor(src));
|
|
533
283
|
return true;
|
|
534
284
|
}
|
|
535
|
-
/**
|
|
536
|
-
* Install + start the menu-bar helper as a launchd user service (idempotent).
|
|
537
|
-
* Clears the sticky opt-out, installs the .app, writes the plist, and
|
|
538
|
-
* bootstraps it into the GUI domain. Returns false on non-darwin or when no
|
|
539
|
-
* helper bundle can be resolved for this install.
|
|
540
|
-
*
|
|
541
|
-
* ASYNC and download-capable: this is the EXPLICIT user-initiated path
|
|
542
|
-
* (`agents menubar enable`). When no bundled/local `.app` ships (a fresh
|
|
543
|
-
* `npm i -g` machine whose tarball lacks the bundle), it fetches the signed +
|
|
544
|
-
* notarized release asset for the running CLI version — verified (sha256 +
|
|
545
|
-
* codesign + Team + designated-requirement pin + notarization) before install
|
|
546
|
-
* — and starts the service from that cached copy. The startup self-heal never
|
|
547
|
-
* routes here: it calls `startMenubarServiceFromSource` and stays sync +
|
|
548
|
-
* network-free, no-opping when no local source exists.
|
|
549
|
-
*/
|
|
550
285
|
export async function enableMenubarService(opts = { clearOptOut: true }) {
|
|
551
286
|
if (!onDarwin())
|
|
552
287
|
return false;
|
|
553
|
-
// A shipped bundle wins; otherwise fetch the newest published build (a cache
|
|
554
|
-
// hit when the background prefetch already has it), never below what runs.
|
|
555
288
|
let src = shippedAppPath();
|
|
556
289
|
if (!src)
|
|
557
290
|
src = await downloadMenubarHelperApp(await menubarVersionToInstall());
|
|
558
291
|
return startMenubarServiceFromSource({ ...opts, sourceAppPath: src });
|
|
559
292
|
}
|
|
560
|
-
/** Drop the sticky `agents menubar disable` sentinel. */
|
|
561
293
|
function clearMenubarOptOut() {
|
|
562
294
|
try {
|
|
563
295
|
fs.rmSync(disabledSentinelPath(), { force: true });
|
|
564
296
|
}
|
|
565
|
-
catch {
|
|
566
|
-
}
|
|
567
|
-
/**
|
|
568
|
-
* Write the launchd plist for `exec`, restart the job, and stamp the installed
|
|
569
|
-
* version. Shared by `enableMenubarService` and `runMenubarSetup` so the two
|
|
570
|
-
* cannot drift on what "installed and started" means — the version stamp in
|
|
571
|
-
* particular is what the upgrade self-heal reads to decide staleness, and a
|
|
572
|
-
* path that skipped it would make every later `agents` invocation reinstall.
|
|
573
|
-
*/
|
|
297
|
+
catch { }
|
|
298
|
+
}
|
|
574
299
|
function installAndStartService(exec, stamp) {
|
|
575
300
|
const plist = servicePlistPath();
|
|
576
301
|
fs.mkdirSync(path.dirname(plist), { recursive: true });
|
|
@@ -579,16 +304,8 @@ function installAndStartService(exec, stamp) {
|
|
|
579
304
|
try {
|
|
580
305
|
fs.writeFileSync(installedVersionMarkerPath(), JSON.stringify(stamp));
|
|
581
306
|
}
|
|
582
|
-
catch {
|
|
583
|
-
}
|
|
584
|
-
/**
|
|
585
|
-
* Render a stamp as a comparable/displayable version string.
|
|
586
|
-
*
|
|
587
|
-
* A local build has no version of its own, so it reports `local`; the ownership
|
|
588
|
-
* contest treats that as "not comparable" and falls through to its owner arm,
|
|
589
|
-
* which is the correct outcome — a dev build must never win a version contest
|
|
590
|
-
* against a release.
|
|
591
|
-
*/
|
|
307
|
+
catch { }
|
|
308
|
+
}
|
|
592
309
|
export function stampVersionLabel(stamp) {
|
|
593
310
|
if (!stamp)
|
|
594
311
|
return null;
|
|
@@ -598,30 +315,13 @@ export function stampVersionLabel(stamp) {
|
|
|
598
315
|
return null;
|
|
599
316
|
return LOCAL_BUILD_LABEL;
|
|
600
317
|
}
|
|
601
|
-
/** What this install would put on disk right now, as a stamp. */
|
|
602
318
|
function availableStamp() {
|
|
603
319
|
const src = sourceAppPath();
|
|
604
|
-
// No local bundle means the release path: what would be installed is the
|
|
605
|
-
// newest published helper this machine has resolved (cached, day-old at
|
|
606
|
-
// most), never below the floor — and the floor itself before the first
|
|
607
|
-
// resolution or offline.
|
|
608
320
|
return src ? stampFor(src) : { source: 'release', helperVersion: cachedMenubarVersion() };
|
|
609
321
|
}
|
|
610
|
-
/** The helper version this install would put on disk right now, for display. */
|
|
611
322
|
function availableHelperLabel() {
|
|
612
323
|
return stampVersionLabel(availableStamp()) ?? LOCAL_BUILD_LABEL;
|
|
613
324
|
}
|
|
614
|
-
/**
|
|
615
|
-
* Identify the bundle about to be installed, for the stamp.
|
|
616
|
-
*
|
|
617
|
-
* A bundle is a RELEASE iff it sits under the helper's own download cache —
|
|
618
|
-
* asked of `menubarHelperCacheDir`, not pattern-matched out of the path. A regex
|
|
619
|
-
* for `/v<x.y.z>/` gets this wrong in both directions: a checkout living under
|
|
620
|
-
* any directory that happens to contain a version-shaped segment reads as a
|
|
621
|
-
* release, and a release cache laid out differently reads as local. Either
|
|
622
|
-
* misclassification flips `source` between invocations, and a kind change is
|
|
623
|
-
* unconditionally stale — which is a reinstall loop.
|
|
624
|
-
*/
|
|
625
325
|
export function stampFor(resolvedSourceAppPath) {
|
|
626
326
|
const version = releaseVersionOfCachedBundle(resolvedSourceAppPath);
|
|
627
327
|
if (version)
|
|
@@ -630,19 +330,10 @@ export function stampFor(resolvedSourceAppPath) {
|
|
|
630
330
|
try {
|
|
631
331
|
mtime = fs.statSync(resolvedSourceAppPath).mtimeMs;
|
|
632
332
|
}
|
|
633
|
-
catch {
|
|
333
|
+
catch { }
|
|
634
334
|
return { source: 'local', sourceStamp: `${resolvedSourceAppPath}@${mtime}` };
|
|
635
335
|
}
|
|
636
|
-
/**
|
|
637
|
-
* The helper version a path denotes, iff it is inside that version's cache dir.
|
|
638
|
-
* Returns null for anything else — including a version-shaped path that is not
|
|
639
|
-
* actually the cache.
|
|
640
|
-
*/
|
|
641
336
|
export function releaseVersionOfCachedBundle(appPath, cacheDirFor = menubarHelperCacheDir) {
|
|
642
|
-
// Try EVERY version-shaped segment, not just the leftmost. A cached bundle
|
|
643
|
-
// under a home or mount path that itself contains an unrelated `vX.Y.Z`
|
|
644
|
-
// (an nvm dir, a versioned volume) would otherwise match that first segment,
|
|
645
|
-
// fail the prefix check, and be misclassified as a local build.
|
|
646
337
|
const resolved = path.resolve(appPath);
|
|
647
338
|
for (const m of appPath.matchAll(/v(\d+\.\d+\.\d+)/g)) {
|
|
648
339
|
const expected = path.resolve(cacheDirFor(m[1]));
|
|
@@ -651,21 +342,6 @@ export function releaseVersionOfCachedBundle(appPath, cacheDirFor = menubarHelpe
|
|
|
651
342
|
}
|
|
652
343
|
return null;
|
|
653
344
|
}
|
|
654
|
-
/**
|
|
655
|
-
* Pure staleness decision (no I/O) so the truth table is unit-testable.
|
|
656
|
-
*
|
|
657
|
-
* This compares the HELPER axis, not the CLI's. It used to compare the installed
|
|
658
|
-
* stamp against `getCliVersion()`, which was wrong in both directions once the
|
|
659
|
-
* helpers gained their own version line: every CLI release made an unchanged
|
|
660
|
-
* helper look stale and reinstalled it (the #2109 restart storm), while a
|
|
661
|
-
* genuinely newer helper at the same CLI version never looked stale at all.
|
|
662
|
-
*
|
|
663
|
-
* Stale when: the executable is gone; nothing is stamped; the stamp predates the
|
|
664
|
-
* JSON format (`legacy` — re-stamped once); the install KIND changed
|
|
665
|
-
* (local <-> release), since a dev build and a release bundle are not
|
|
666
|
-
* interchangeable; a release install whose available helper version is newer;
|
|
667
|
-
* or a local install whose source path or mtime moved.
|
|
668
|
-
*/
|
|
669
345
|
export function isMenubarStale(opts) {
|
|
670
346
|
if (!opts.execExists)
|
|
671
347
|
return true;
|
|
@@ -691,29 +367,11 @@ function menubarSetupStale() {
|
|
|
691
367
|
execExists: fs.existsSync(installedExecutablePath()),
|
|
692
368
|
});
|
|
693
369
|
}
|
|
694
|
-
/**
|
|
695
|
-
* Pure decision (no I/O): should the detached background worker download the
|
|
696
|
-
* floor release into the cache so the next startup self-heal has a source?
|
|
697
|
-
*
|
|
698
|
-
* The self-heal (`installMenubarLaunchAgentOnUpgrade`) is deliberately
|
|
699
|
-
* network-free, and the npm tarball ships no bundle, so without this step an
|
|
700
|
-
* `npm i -g` Mac keeps whatever helper it has — a crashing 1.1.2, a dead 0.1.0 —
|
|
701
|
-
* until someone runs `agents menubar setup` by hand. The worker fetches only
|
|
702
|
-
* when the fetch would change something: nothing else can act as a source, the
|
|
703
|
-
* user has not opted out, and either no service exists yet (the auto-enable the
|
|
704
|
-
* bootstrap promises) or the installed helper is older than the floor.
|
|
705
|
-
*/
|
|
706
370
|
export function menubarHelperPrefetchNeeded(opts) {
|
|
707
371
|
if (!opts.darwin || opts.disabledByUser || opts.hasSource)
|
|
708
372
|
return false;
|
|
709
373
|
return !opts.serviceInstalled || opts.stale;
|
|
710
374
|
}
|
|
711
|
-
/**
|
|
712
|
-
* Background half of the release-path self-heal: download + verify the floor
|
|
713
|
-
* release into the cache when `menubarHelperPrefetchNeeded` says so. Returns
|
|
714
|
-
* the cached path, or null when nothing was fetched. Run from the detached
|
|
715
|
-
* auto-pull worker; the foreground CLI never waits on it.
|
|
716
|
-
*/
|
|
717
375
|
export async function prefetchMenubarHelper() {
|
|
718
376
|
const needed = menubarHelperPrefetchNeeded({
|
|
719
377
|
darwin: onDarwin(),
|
|
@@ -726,47 +384,18 @@ export async function prefetchMenubarHelper() {
|
|
|
726
384
|
return null;
|
|
727
385
|
return downloadMenubarHelperApp(await menubarVersionToInstall());
|
|
728
386
|
}
|
|
729
|
-
/**
|
|
730
|
-
* Pure decision (no I/O): did THIS heal actually replace bundle content a live
|
|
731
|
-
* process could be running stale, as opposed to a plist-only repoint?
|
|
732
|
-
*
|
|
733
|
-
* `stale` (version bump or missing exec) and `needsDevIdHeal` (ad-hoc ->
|
|
734
|
-
* Developer ID) both mean the shipped `.app` differs from what is already
|
|
735
|
-
* installed — the exact condition under which a running helper can be left on
|
|
736
|
-
* an old code identity after `enableMenubarService` swaps the bundle. A
|
|
737
|
-
* repoint-only heal (`menubarSetupNeedsRepoint()` alone, same version, same
|
|
738
|
-
* signing identity) does NOT count: RUSH-3005 already owns the churn from
|
|
739
|
-
* mixed-Node-interpreter repoints, and restarting the helper on every one of
|
|
740
|
-
* those would double that churn rather than fix this bug.
|
|
741
|
-
*/
|
|
742
387
|
export function menubarHealReplacedBundle(opts) {
|
|
743
388
|
return opts.stale || opts.needsDevIdHeal;
|
|
744
389
|
}
|
|
745
|
-
/**
|
|
746
|
-
* Pure re-point decision (no I/O): the plist's baked interpreter/entry no longer
|
|
747
|
-
* match the install that is now running `agents`. This catches DUAL-INSTALL skew
|
|
748
|
-
* that a version bump can't — e.g. the plist was baked by an nvm copy but the
|
|
749
|
-
* user's `agents` now resolves to a bun copy (same or different version), so the
|
|
750
|
-
* helper keeps shelling the stale install for its menu data AND the quick-issue
|
|
751
|
-
* dispatch. A null active entry (a dev/tsx run where the compiled entry can't be
|
|
752
|
-
* resolved) never triggers a re-point, so it can't churn the plist onto a
|
|
753
|
-
* transient path.
|
|
754
|
-
*/
|
|
755
390
|
export function menubarPlistNeedsRepoint(opts) {
|
|
756
391
|
if (!opts.activeEntry)
|
|
757
|
-
return false;
|
|
392
|
+
return false;
|
|
758
393
|
if (opts.plistEntry !== opts.activeEntry)
|
|
759
394
|
return true;
|
|
760
|
-
// The entry path owns the helper. The same installed CLI may be invoked through
|
|
761
|
-
// several compatible Node interpreters (nvm, Homebrew, a parent process's
|
|
762
|
-
// process.execPath). Re-pointing merely because those valid interpreter paths
|
|
763
|
-
// differ makes every invocation replace and relaunch the shared helper. Keep the
|
|
764
|
-
// recorded interpreter until it disappears; then repoint to the active one.
|
|
765
395
|
if (opts.activeNode && (!opts.plistNode || !opts.plistNodeExists))
|
|
766
396
|
return true;
|
|
767
397
|
return false;
|
|
768
398
|
}
|
|
769
|
-
/** Read one EnvironmentVariables value from the installed service plist. */
|
|
770
399
|
function readPlistEnvValue(key) {
|
|
771
400
|
try {
|
|
772
401
|
const xml = fs.readFileSync(servicePlistPath(), 'utf-8');
|
|
@@ -777,7 +406,6 @@ function readPlistEnvValue(key) {
|
|
|
777
406
|
return null;
|
|
778
407
|
}
|
|
779
408
|
}
|
|
780
|
-
/** True when the installed plist points at a different install than the active one. */
|
|
781
409
|
function menubarSetupNeedsRepoint() {
|
|
782
410
|
const plistNode = readPlistEnvValue('AGENTS_NODE');
|
|
783
411
|
return menubarPlistNeedsRepoint({
|
|
@@ -788,10 +416,6 @@ function menubarSetupNeedsRepoint() {
|
|
|
788
416
|
activeNode: process.execPath,
|
|
789
417
|
});
|
|
790
418
|
}
|
|
791
|
-
/**
|
|
792
|
-
* Stop + remove the menu-bar service and write the sticky opt-out so the
|
|
793
|
-
* upgrade migration won't re-enable it.
|
|
794
|
-
*/
|
|
795
419
|
export function disableMenubarService() {
|
|
796
420
|
if (!onDarwin())
|
|
797
421
|
return;
|
|
@@ -806,7 +430,7 @@ export function disableMenubarService() {
|
|
|
806
430
|
try {
|
|
807
431
|
execFileSync('launchctl', ['unload', '-w', plist], { stdio: ['ignore', 'ignore', 'ignore'] });
|
|
808
432
|
}
|
|
809
|
-
catch {
|
|
433
|
+
catch { }
|
|
810
434
|
}
|
|
811
435
|
}
|
|
812
436
|
else {
|
|
@@ -815,73 +439,22 @@ export function disableMenubarService() {
|
|
|
815
439
|
try {
|
|
816
440
|
fs.unlinkSync(plist);
|
|
817
441
|
}
|
|
818
|
-
catch {
|
|
442
|
+
catch { }
|
|
819
443
|
try {
|
|
820
444
|
fs.mkdirSync(path.dirname(disabledSentinelPath()), { recursive: true });
|
|
821
445
|
fs.writeFileSync(disabledSentinelPath(), `disabled ${new Date().toISOString()}\n`);
|
|
822
446
|
}
|
|
823
|
-
catch {
|
|
824
|
-
}
|
|
825
|
-
/**
|
|
826
|
-
* Which install is allowed to (re)install the shared helper.
|
|
827
|
-
*
|
|
828
|
-
* The helper lives at ONE path in Application Support, but any number of
|
|
829
|
-
* agents-cli copies can be present on a box and every one of them runs the
|
|
830
|
-
* startup self-heal. The version stamp and the plist's baked `AGENTS_ENTRY` each
|
|
831
|
-
* record whichever copy acted last, so without an ownership rule every copy
|
|
832
|
-
* reads the others' marks as drift and recopies the bundle over them. Recopying
|
|
833
|
-
* replaces the executable under the live helper and kills it; launchd
|
|
834
|
-
* `KeepAlive` restarts it; the next copy repeats it. Measured on one box: a new
|
|
835
|
-
* pid every 5-15s, 578 launches in the helper's log, a status item that never
|
|
836
|
-
* stayed visible, and `agents menubar status` still reporting `running: yes`
|
|
837
|
-
* because a pid always existed (#2109).
|
|
838
|
-
*
|
|
839
|
-
* There is deliberately NO content comparison here. Comparing the shipped helper
|
|
840
|
-
* against the installed one cannot distinguish "real upgrade" from "another
|
|
841
|
-
* install's copy": the helper is rebuilt, re-signed and re-notarized on every
|
|
842
|
-
* helper release (phnx-labs/agi-menu scripts/release.sh), so consecutive releases
|
|
843
|
-
* ship byte-different bundles from identical Swift source — 1.22.20/21/22 all
|
|
844
|
-
* have the same 2876288-byte executable and three different sha256s AND three
|
|
845
|
-
* different CDHashes. Any digest gate therefore reports "changed" for exactly
|
|
846
|
-
* the skew case it was meant to exempt.
|
|
847
|
-
*
|
|
848
|
-
* So the installed version decides release skew: a newer signed release takes
|
|
849
|
-
* ownership immediately, an older release cannot downgrade it, and equal foreign
|
|
850
|
-
* releases retain the recorded owner. The plist's `AGENTS_ENTRY` remains the
|
|
851
|
-
* ownership signal for legacy state with no version marker, where the cooldown
|
|
852
|
-
* bounds takeover churn. Pure so the truth table is unit-testable.
|
|
853
|
-
*/
|
|
447
|
+
catch { }
|
|
448
|
+
}
|
|
854
449
|
export function mayInstallMenubarHelper(opts) {
|
|
855
|
-
// Repairs are never gated: a missing binary or a broken signing identity leaves
|
|
856
|
-
// the menu bar dead or re-prompting for Accessibility, and no other install can
|
|
857
|
-
// be "fighting" for a bundle that isn't there. Blocking these behind ownership
|
|
858
|
-
// is what turned the first version of this gate into a silent stuck state.
|
|
859
450
|
if (opts.helperExecMissing || opts.needsDevIdHeal)
|
|
860
451
|
return true;
|
|
861
|
-
// Can't resolve which install we are (a dev/tsx run) — never churn the plist.
|
|
862
452
|
if (!opts.activeEntry)
|
|
863
453
|
return false;
|
|
864
|
-
// No owner recorded yet (fresh or pre-`AGENTS_ENTRY` plist) — adopt it.
|
|
865
454
|
if (!opts.plistEntry)
|
|
866
455
|
return true;
|
|
867
|
-
// The recorded owner's entry path is gone from disk, so this install may adopt
|
|
868
|
-
// the helper — but a non-Developer-ID (ad-hoc/dev) source may NOT seize a
|
|
869
|
-
// healthy install this way. Recopying an ad-hoc bundle over the Developer-ID
|
|
870
|
-
// one poisons the shared Accessibility grant (an ad-hoc signature fails the
|
|
871
|
-
// grant's stored code requirement, so macOS revokes it and re-prompts on the
|
|
872
|
-
// next paste) and Gatekeeper then rejects the result as "damaged" (RUSH-2134).
|
|
873
|
-
// This does not strand a genuinely broken helper: escape (1) above
|
|
874
|
-
// (helperExecMissing / needsDevIdHeal) already lets ANY source repair a
|
|
875
|
-
// missing-or-ad-hoc install, so refusing here only declines to re-point the
|
|
876
|
-
// plist of a helper that is already present and working — the menu bar keeps
|
|
877
|
-
// running, nothing deadlocks.
|
|
878
456
|
if (!opts.ownerEntryExists)
|
|
879
457
|
return opts.sourceIsDeveloperId;
|
|
880
|
-
// `local` is a KIND marker, not a version — a dev build has none. Comparing it
|
|
881
|
-
// with compareVersions would order it against real semver arbitrarily and let a
|
|
882
|
-
// dev build win (or lose) a contest it should not enter. When either side is a
|
|
883
|
-
// local build the version arm is skipped entirely and the owner arm decides,
|
|
884
|
-
// which is the correct outcome: ownership, not version, distinguishes them.
|
|
885
458
|
const comparableVersions = opts.installedVersion && opts.currentVersion &&
|
|
886
459
|
opts.installedVersion !== LOCAL_BUILD_LABEL && opts.currentVersion !== LOCAL_BUILD_LABEL;
|
|
887
460
|
if (comparableVersions) {
|
|
@@ -893,34 +466,12 @@ export function mayInstallMenubarHelper(opts) {
|
|
|
893
466
|
return opts.plistEntry === opts.activeEntry;
|
|
894
467
|
}
|
|
895
468
|
if (opts.plistEntry === opts.activeEntry)
|
|
896
|
-
return true;
|
|
897
|
-
// A foreign install while the owner still exists. Refusing outright bounds the
|
|
898
|
-
// loop but strands the user when the recorded owner is a stale copy that simply
|
|
899
|
-
// still sits on disk (an old nvm node dir) while their daily driver upgrades:
|
|
900
|
-
// that install would never heal again. So it may take over, but only once per
|
|
901
|
-
// cooldown — which turns an every-invocation storm into at most one restart per
|
|
902
|
-
// cooldown while keeping every install able to make progress.
|
|
903
|
-
//
|
|
904
|
-
// Except an ad-hoc/dev-signed copy, which never seizes a healthy helper on a
|
|
905
|
-
// timer. `scripts/install.sh` deliberately puts a dev build beside the npm
|
|
906
|
-
// global, and its bundle cannot be notarized; letting it win the timed takeover
|
|
907
|
-
// would recopy an ad-hoc bundle over a good Developer-ID one, and Gatekeeper
|
|
908
|
-
// then rejects the result as "damaged" and AppKit crashes at launch (RUSH-2134)
|
|
909
|
-
// — trading a cosmetic loop for a broken menu bar. It can still take over when
|
|
910
|
-
// the owner is genuinely gone (above), which is the case that must not deadlock.
|
|
469
|
+
return true;
|
|
911
470
|
if (!opts.sourceIsDeveloperId)
|
|
912
471
|
return false;
|
|
913
472
|
return opts.msSinceLastHeal === null || opts.msSinceLastHeal >= opts.cooldownMs;
|
|
914
473
|
}
|
|
915
|
-
/**
|
|
916
|
-
* How long a non-owner install waits before it may take an unversioned legacy
|
|
917
|
-
* helper over. Long
|
|
918
|
-
* enough that a multi-install box restarts the helper at most once an hour
|
|
919
|
-
* instead of every few seconds; short enough that a user who switched installs
|
|
920
|
-
* gets their upgrade without hunting for `agents menubar setup`.
|
|
921
|
-
*/
|
|
922
474
|
const MENUBAR_TAKEOVER_COOLDOWN_MS = 60 * 60 * 1000;
|
|
923
|
-
/** Timestamp of the last self-heal reinstall, next to the version stamp. */
|
|
924
475
|
function lastHealMarkerPath() {
|
|
925
476
|
return path.join(installDir(), '.menubar-last-heal');
|
|
926
477
|
}
|
|
@@ -940,9 +491,8 @@ function stampMenubarHeal() {
|
|
|
940
491
|
fs.mkdirSync(installDir(), { recursive: true });
|
|
941
492
|
fs.writeFileSync(lastHealMarkerPath(), String(Date.now()));
|
|
942
493
|
}
|
|
943
|
-
catch {
|
|
494
|
+
catch { }
|
|
944
495
|
}
|
|
945
|
-
/** Whether this install may (re)install the helper (see `mayInstallMenubarHelper`). */
|
|
946
496
|
function mayHealMenubar(needsDevIdHeal) {
|
|
947
497
|
const plistEntry = readPlistEnvValue('AGENTS_ENTRY');
|
|
948
498
|
const src = sourceAppPath();
|
|
@@ -959,21 +509,6 @@ function mayHealMenubar(needsDevIdHeal) {
|
|
|
959
509
|
sourceIsDeveloperId: Boolean(src) && hasDeveloperIdSignature(src),
|
|
960
510
|
});
|
|
961
511
|
}
|
|
962
|
-
/**
|
|
963
|
-
* Startup self-heal, run on every darwin CLI invocation (see src/index.ts).
|
|
964
|
-
* No-ops cheaply (a couple of existsSync + a tiny file read) unless work is
|
|
965
|
-
* needed:
|
|
966
|
-
* - fresh install (no service yet) -> enable
|
|
967
|
-
* - upgrade (version stamp changed) or -> re-enable: recopy the new helper
|
|
968
|
-
* the App Support helper went missing binary + rewrite the plist + kick
|
|
969
|
-
*
|
|
970
|
-
* Without the staleness re-enable, `npm update` refreshed the CLI but left the
|
|
971
|
-
* menu bar running the previous release's helper binary on a possibly-stale
|
|
972
|
-
* plist. Everything past the ownership gate is unchanged; the gate is what stops
|
|
973
|
-
* coexisting installs reinstalling over each other forever (#2109). No-ops if:
|
|
974
|
-
* not darwin, the user opted out, or no helper bundle ships. Best-effort — never
|
|
975
|
-
* throws into startup.
|
|
976
|
-
*/
|
|
977
512
|
export function installMenubarLaunchAgentOnUpgrade() {
|
|
978
513
|
try {
|
|
979
514
|
if (!onDarwin())
|
|
@@ -986,46 +521,25 @@ export function installMenubarLaunchAgentOnUpgrade() {
|
|
|
986
521
|
startMenubarServiceFromSource({ clearOptOut: false });
|
|
987
522
|
return;
|
|
988
523
|
}
|
|
989
|
-
// Re-enable (recopy helper + rewrite plist) when the version drifted OR the
|
|
990
|
-
// plist's baked interpreter/entry no longer point at the install now running
|
|
991
|
-
// `agents` — e.g. the owner moved between node interpreters — OR the
|
|
992
|
-
// installed copy is still ad-hoc while the shipped source is Developer ID
|
|
993
|
-
// (older heal path; Accessibility re-prompts until the identity is restored).
|
|
994
524
|
const needsDevIdHeal = installedNeedsDevIdHeal();
|
|
995
525
|
const stale = menubarSetupStale();
|
|
996
526
|
if (!(stale || menubarSetupNeedsRepoint() || needsDevIdHeal))
|
|
997
527
|
return;
|
|
998
|
-
// ...but a copy that does not own the helper only gets to act on that drift
|
|
999
|
-
// once per cooldown. Without the gate every coexisting install recopies the
|
|
1000
|
-
// bundle on every invocation, killing the live helper on a loop (#2109).
|
|
1001
528
|
if (!mayHealMenubar(needsDevIdHeal))
|
|
1002
529
|
return;
|
|
1003
|
-
// Stamp only a heal that actually happened. `enableMenubarService` returns
|
|
1004
|
-
// false without installing when the bundle fails the Gatekeeper check, and
|
|
1005
|
-
// stamping first would spend the shared cooldown on a no-op — locking every
|
|
1006
|
-
// non-owner out for another hour while nothing had been fixed.
|
|
1007
530
|
if (startMenubarServiceFromSource({ clearOptOut: false })) {
|
|
1008
531
|
stampMenubarHeal();
|
|
1009
|
-
// One-time: the ad-hoc -> Developer ID transition leaves a dead TCC row
|
|
1010
|
-
// under the old identity (tccutil on zion reset it 11 times across
|
|
1011
|
-
// machines that made this jump) — clear it so the fresh grant sticks.
|
|
1012
532
|
if (shouldMigrateMenubarTcc({ needsDevIdHeal, alreadyMigrated: menubarTccAlreadyMigrated() })) {
|
|
1013
533
|
resetMenubarAccessibilityTcc();
|
|
1014
534
|
}
|
|
1015
|
-
// Only a REAL content swap (version bump or the Dev-ID transition) can
|
|
1016
|
-
// leave a running process on stale code — a plist-only repoint (handled
|
|
1017
|
-
// above by menubarSetupNeedsRepoint alone) is RUSH-3005's churn to own,
|
|
1018
|
-
// not this heal's to restart on top of.
|
|
1019
535
|
if (menubarHealReplacedBundle({ stale, needsDevIdHeal })) {
|
|
1020
536
|
restartMenubarHelperAfterSwap(process.getuid?.() ?? 0, liveMenubarProcesses().own);
|
|
1021
537
|
}
|
|
1022
538
|
}
|
|
1023
539
|
}
|
|
1024
540
|
catch {
|
|
1025
|
-
/* never block startup on the menu bar */
|
|
1026
541
|
}
|
|
1027
542
|
}
|
|
1028
|
-
/** True when App Support still has an ad-hoc copy but the npm bundle is Developer ID. */
|
|
1029
543
|
function installedNeedsDevIdHeal() {
|
|
1030
544
|
const src = sourceAppPath();
|
|
1031
545
|
if (!src || !fs.existsSync(installedAppPath()))
|
|
@@ -1034,57 +548,26 @@ function installedNeedsDevIdHeal() {
|
|
|
1034
548
|
return false;
|
|
1035
549
|
return hasDeveloperIdSignature(src);
|
|
1036
550
|
}
|
|
1037
|
-
/** Marker written once the one-time ad-hoc -> Developer ID TCC migration has
|
|
1038
|
-
* run on this machine, next to the version/heal stamps. */
|
|
1039
551
|
function tccMigrationMarkerPath() {
|
|
1040
552
|
return path.join(installDir(), '.menubar-tcc-migrated');
|
|
1041
553
|
}
|
|
1042
554
|
function menubarTccAlreadyMigrated() {
|
|
1043
555
|
return fs.existsSync(tccMigrationMarkerPath());
|
|
1044
556
|
}
|
|
1045
|
-
/**
|
|
1046
|
-
* Pure decision (no I/O): run the one-time `tccutil reset Accessibility` only
|
|
1047
|
-
* on a real ad-hoc -> Developer ID transition, and only once ever. A machine
|
|
1048
|
-
* that was always Developer ID never accumulated a dead TCC row under an
|
|
1049
|
-
* ad-hoc identity, so resetting there would just force a needless re-prompt;
|
|
1050
|
-
* a machine that already migrated must not be reset again on every heal.
|
|
1051
|
-
*/
|
|
1052
557
|
export function shouldMigrateMenubarTcc(opts) {
|
|
1053
558
|
return opts.needsDevIdHeal && !opts.alreadyMigrated;
|
|
1054
559
|
}
|
|
1055
|
-
/**
|
|
1056
|
-
* Reset the stale Accessibility grant TCC recorded against the pre-migration
|
|
1057
|
-
* ad-hoc identity, then stamp the marker so this never runs again on this
|
|
1058
|
-
* machine. Targets `SERVICE_LABEL_BASE` — the bundle's actual
|
|
1059
|
-
* `CFBundleIdentifier`/codesign `--identifier` (set by agi-menu's build.sh) that
|
|
1060
|
-
* TCC keys grants to — not the namespaced `serviceLabel()`, which exists only
|
|
1061
|
-
* to keep launchd job labels apart under a redirected HOME (RUSH-2639) and is
|
|
1062
|
-
* never the app's real identity. Best-effort: a missing/failing `tccutil`
|
|
1063
|
-
* (older macOS, a sandboxed test HOME) must never block the heal that just
|
|
1064
|
-
* fixed the signing identity itself.
|
|
1065
|
-
*/
|
|
1066
560
|
export function resetMenubarAccessibilityTcc(exec = execFileSync) {
|
|
1067
561
|
try {
|
|
1068
562
|
exec('tccutil', ['reset', 'Accessibility', SERVICE_LABEL_BASE], { stdio: ['ignore', 'ignore', 'ignore'] });
|
|
1069
563
|
}
|
|
1070
|
-
catch {
|
|
564
|
+
catch { }
|
|
1071
565
|
try {
|
|
1072
566
|
fs.mkdirSync(installDir(), { recursive: true });
|
|
1073
567
|
fs.writeFileSync(tccMigrationMarkerPath(), new Date().toISOString());
|
|
1074
568
|
}
|
|
1075
|
-
catch {
|
|
1076
|
-
}
|
|
1077
|
-
/**
|
|
1078
|
-
* Decide which live helper processes must be ended so exactly one status item
|
|
1079
|
-
* survives. Pure so the choice is unit-testable without a live menu bar.
|
|
1080
|
-
*
|
|
1081
|
-
* EVERY current process is ended, including the wanted one: the caller
|
|
1082
|
-
* re-kickstarts the launchd service straight after, so the survivor is the one
|
|
1083
|
-
* launchd owns (RunAtLoad + KeepAlive), not whichever copy happened to win a
|
|
1084
|
-
* race. Picking a survivor from a `ps` listing cannot do this — the list says
|
|
1085
|
-
* nothing about which pid launchd will keep alive, so leaving one alive risks
|
|
1086
|
-
* keeping the un-managed copy and re-creating the duplicate on next login.
|
|
1087
|
-
*/
|
|
569
|
+
catch { }
|
|
570
|
+
}
|
|
1088
571
|
export function processesToEnd(status) {
|
|
1089
572
|
return [...status.instances, ...status.foreignInstances];
|
|
1090
573
|
}
|
|
@@ -1092,22 +575,8 @@ function endProcess(pid) {
|
|
|
1092
575
|
try {
|
|
1093
576
|
process.kill(pid, 'SIGTERM');
|
|
1094
577
|
}
|
|
1095
|
-
catch {
|
|
1096
|
-
}
|
|
1097
|
-
/**
|
|
1098
|
-
* `agents menubar setup` — configure the menu bar end-to-end, idempotently.
|
|
1099
|
-
*
|
|
1100
|
-
* The one command that gets a machine to the intended state: exactly one status
|
|
1101
|
-
* item, owned by a launchd service that starts it at login and restarts it if it
|
|
1102
|
-
* dies. Each concern is a reported step, so a partial failure names itself
|
|
1103
|
-
* instead of hiding behind "enabled".
|
|
1104
|
-
*
|
|
1105
|
-
* 1. bundle — install/refresh the .app at the stable App Support path
|
|
1106
|
-
* 2. signature — a valid code identity (macOS 26+ SIGKILLs an invalid one)
|
|
1107
|
-
* 3. duplicates — end every live helper, so the only survivor is launchd's
|
|
1108
|
-
* 4. login item — write the plist (RunAtLoad + KeepAlive) and bootstrap it
|
|
1109
|
-
* 5. single — verify exactly one helper came back up
|
|
1110
|
-
*/
|
|
578
|
+
catch { }
|
|
579
|
+
}
|
|
1111
580
|
export async function runMenubarSetup() {
|
|
1112
581
|
const steps = [];
|
|
1113
582
|
const step = (name, outcome, detail) => {
|
|
@@ -1118,11 +587,6 @@ export async function runMenubarSetup() {
|
|
|
1118
587
|
return { steps, configured: false, status: getMenubarStatus() };
|
|
1119
588
|
}
|
|
1120
589
|
const before = getMenubarStatus();
|
|
1121
|
-
// Explicit user-initiated path: when no bundled/local `.app` ships (a fresh
|
|
1122
|
-
// `npm i -g` machine whose tarball lacks the bundle), fetch the signed +
|
|
1123
|
-
// notarized release asset for this CLI version. Verified (sha256 + codesign +
|
|
1124
|
-
// Team + designated-requirement pin + notarization) before install; the
|
|
1125
|
-
// cached copy is the source for `ensureMenubarAppInstalled` below.
|
|
1126
590
|
let src = shippedAppPath();
|
|
1127
591
|
if (!src) {
|
|
1128
592
|
try {
|
|
@@ -1133,9 +597,6 @@ export async function runMenubarSetup() {
|
|
|
1133
597
|
return { steps, configured: false, status: before };
|
|
1134
598
|
}
|
|
1135
599
|
}
|
|
1136
|
-
// 3 before 1: end the running copies BEFORE swapping the bundle underneath
|
|
1137
|
-
// them, so no helper keeps a status item alive on a binary that no longer
|
|
1138
|
-
// exists on disk.
|
|
1139
600
|
const doomed = processesToEnd(before);
|
|
1140
601
|
for (const p of doomed)
|
|
1141
602
|
endProcess(p.pid);
|
|
@@ -1153,21 +614,7 @@ export async function runMenubarSetup() {
|
|
|
1153
614
|
step('bundle', 'failed', 'could not install the helper bundle');
|
|
1154
615
|
return { steps, configured: false, status: getMenubarStatus() };
|
|
1155
616
|
}
|
|
1156
|
-
// The helper axis here too: this label read "ok" only when the installed
|
|
1157
|
-
// helper's stamp happened to equal the CLI's version, which after this change
|
|
1158
|
-
// is never true on a release install.
|
|
1159
|
-
//
|
|
1160
|
-
// Compare the STAMPS, not their labels. `stampVersionLabel` collapses every
|
|
1161
|
-
// local build to the literal 'local', discarding the mtime — so a real dev
|
|
1162
|
-
// rebuild (which the surrounding logic does correctly reinstall) would print
|
|
1163
|
-
// "ok" and hide that anything changed. That is the same collapse already
|
|
1164
|
-
// excluded in `versionMatches` and `mayInstallMenubarHelper`; this was the
|
|
1165
|
-
// third site and the only one still reading through the lossy label.
|
|
1166
617
|
const bundleStamp = readInstalledMenubarStamp();
|
|
1167
|
-
// Reuse the file's canonical comparator rather than a second, serialization
|
|
1168
|
-
// -based one: `JSON.stringify` was sound only because both stamps come from
|
|
1169
|
-
// `stampFor`, which is an implicit key-order dependency with no reason to
|
|
1170
|
-
// exist when isMenubarStale already answers exactly this question.
|
|
1171
618
|
const bundleUnchanged = bundleStamp !== null &&
|
|
1172
619
|
!isMenubarStale({ installed: bundleStamp, available: availableStamp(), execExists: true });
|
|
1173
620
|
step('bundle', bundleUnchanged ? 'ok' : 'changed', `${installedAppPath()} (${stampVersionLabel(bundleStamp) ?? 'unknown'})`);
|
|
@@ -1177,14 +624,9 @@ export async function runMenubarSetup() {
|
|
|
1177
624
|
return { steps, configured: false, status: getMenubarStatus() };
|
|
1178
625
|
}
|
|
1179
626
|
step('signature', 'ok', 'valid + notarized');
|
|
1180
|
-
// Clear the sticky opt-out: running `setup` is an explicit request for the
|
|
1181
|
-
// menu bar, so a stale `menubar disable` must not silently win.
|
|
1182
627
|
clearMenubarOptOut();
|
|
1183
628
|
installAndStartService(exec, stampFor(src ?? undefined));
|
|
1184
629
|
step('login item', before.serviceInstalled ? 'ok' : 'changed', `${serviceLabel()} — starts at login, restarts if it dies`);
|
|
1185
|
-
// launchd's bootstrap+kickstart is asynchronous; give the status item a beat
|
|
1186
|
-
// to claim the lock before counting instances, or `setup` reports zero on a
|
|
1187
|
-
// machine that is in fact coming up correctly.
|
|
1188
630
|
const after = waitForSingleInstance();
|
|
1189
631
|
if (after.instances.length === 1 && after.foreignInstances.length === 0) {
|
|
1190
632
|
step('single instance', 'ok', `pid ${after.instances[0].pid}`);
|
|
@@ -1202,10 +644,6 @@ export async function runMenubarSetup() {
|
|
|
1202
644
|
status: after,
|
|
1203
645
|
};
|
|
1204
646
|
}
|
|
1205
|
-
/**
|
|
1206
|
-
* Poll (up to ~3s) for launchd to bring the single helper back. Returns the
|
|
1207
|
-
* last status read either way — the caller decides what a miss means.
|
|
1208
|
-
*/
|
|
1209
647
|
function waitForSingleInstance() {
|
|
1210
648
|
let status = getMenubarStatus();
|
|
1211
649
|
for (let i = 0; i < 15 && status.instances.length !== 1; i++) {
|
|
@@ -1214,8 +652,6 @@ function waitForSingleInstance() {
|
|
|
1214
652
|
}
|
|
1215
653
|
return status;
|
|
1216
654
|
}
|
|
1217
|
-
/** Parse `ps -axo pid=,<field>=` into pid -> field. The field is the rest of the
|
|
1218
|
-
* line, so a path containing spaces (App Support does) survives intact. */
|
|
1219
655
|
function parsePsLines(psOutput) {
|
|
1220
656
|
const out = new Map();
|
|
1221
657
|
for (const line of psOutput.split('\n')) {
|
|
@@ -1225,26 +661,6 @@ function parsePsLines(psOutput) {
|
|
|
1225
661
|
}
|
|
1226
662
|
return out;
|
|
1227
663
|
}
|
|
1228
|
-
/**
|
|
1229
|
-
* Split the live MenubarHelper processes into the installed bundle's own
|
|
1230
|
-
* (`own`) and every other copy (`foreign`).
|
|
1231
|
-
*
|
|
1232
|
-
* `pgrep -f MenubarHelper` conflated the two, so a stray dev build could hold
|
|
1233
|
-
* the global Cmd-Shift-V chord (RegisterEventHotKey is first-come) while status
|
|
1234
|
-
* still reported a healthy `running: yes` — the paste was dead and nothing said
|
|
1235
|
-
* so. A foreign copy is the thing to look for, so name it.
|
|
1236
|
-
*
|
|
1237
|
-
* `own` is a LIST, not a boolean: two copies of the INSTALLED bundle can run at
|
|
1238
|
-
* once (launchd's KeepAlive service plus a LaunchServices/`open` launch of the
|
|
1239
|
-
* same .app), which is the duplicate the user actually sees — two agents marks
|
|
1240
|
-
* in the menu bar. Collapsing them to `running: true` reported that state as
|
|
1241
|
-
* healthy. The helper now refuses to be the second (SingleInstance.swift), and
|
|
1242
|
-
* `agents menubar setup` ends any duplicate a pre-fix helper left behind.
|
|
1243
|
-
*
|
|
1244
|
-
* Identity comes from `comm` (the resolved executable), never from a substring
|
|
1245
|
-
* of the command line: matching the latter flags any shell that merely mentions
|
|
1246
|
-
* the helper's name. `command` is consulted only to drop `--notify` one-shots.
|
|
1247
|
-
*/
|
|
1248
664
|
export function classifyMenubarProcesses(commOutput, commandOutput, installedExec) {
|
|
1249
665
|
const commands = parsePsLines(commandOutput);
|
|
1250
666
|
const own = [];
|
|
@@ -1252,8 +668,6 @@ export function classifyMenubarProcesses(commOutput, commandOutput, installedExe
|
|
|
1252
668
|
for (const [pid, executable] of parsePsLines(commOutput)) {
|
|
1253
669
|
if (path.basename(executable) !== MENUBAR_HELPER_EXECUTABLE_NAME)
|
|
1254
670
|
continue;
|
|
1255
|
-
// `--notify` is a one-shot that posts a notification and exits; it runs the
|
|
1256
|
-
// installed binary but never claims the status item or the chords.
|
|
1257
671
|
if ((commands.get(pid) || '').includes('--notify'))
|
|
1258
672
|
continue;
|
|
1259
673
|
if (executable === installedExec)
|
|
@@ -1263,7 +677,6 @@ export function classifyMenubarProcesses(commOutput, commandOutput, installedExe
|
|
|
1263
677
|
}
|
|
1264
678
|
return { own, foreign };
|
|
1265
679
|
}
|
|
1266
|
-
/** Live MenubarHelper processes, split by whether they are the installed bundle. */
|
|
1267
680
|
function liveMenubarProcesses() {
|
|
1268
681
|
if (!onDarwin())
|
|
1269
682
|
return { own: [], foreign: [] };
|
|
@@ -1293,30 +706,9 @@ export function getMenubarStatus() {
|
|
|
1293
706
|
disabledByUser: menubarDisabledByUser(),
|
|
1294
707
|
};
|
|
1295
708
|
}
|
|
1296
|
-
/**
|
|
1297
|
-
* Pure comparison (no I/O) behind the stale-process check: a helper pid that
|
|
1298
|
-
* started before the bundle on disk was last written is still running the
|
|
1299
|
-
* PREVIOUS binary — the exact condition `restartMenubarHelperAfterSwap` exists
|
|
1300
|
-
* to fix. Millisecond epoch timestamps in, so the truth table is unit-testable
|
|
1301
|
-
* without a live process or filesystem.
|
|
1302
|
-
*
|
|
1303
|
-
* The two timestamps do not have the same resolution. `pidStartTimeMs` parses
|
|
1304
|
-
* `ps -o lstart`, which prints whole SECONDS, while the bundle mtime carries
|
|
1305
|
-
* sub-second precision — and the restart this check exists to detect happens
|
|
1306
|
-
* within a second of the swap that triggered it. A raw `<` therefore called a
|
|
1307
|
-
* healthy just-restarted helper stale on essentially every upgrade: measured on
|
|
1308
|
-
* zion at 1.22.46, pid start 1787441353000 vs bundle mtime 1787441353700, 700ms
|
|
1309
|
-
* apart inside one second, reported as "running the OLD binary" and surfaced as
|
|
1310
|
-
* `accessibilityHintNeeded` — telling the user to re-grant Accessibility after
|
|
1311
|
-
* an upgrade that had already restarted the helper correctly. So the bundle
|
|
1312
|
-
* mtime is truncated to the same whole second `ps` reports before comparing: a
|
|
1313
|
-
* pid that started in the swap's own second is fresh, and a genuinely stale pid
|
|
1314
|
-
* (a full second or more older) is still caught.
|
|
1315
|
-
*/
|
|
1316
709
|
export function isMenubarProcessStaleAgainstBundle(pidStartedAtMs, bundleMtimeMs) {
|
|
1317
710
|
return pidStartedAtMs < Math.floor(bundleMtimeMs / 1000) * 1000;
|
|
1318
711
|
}
|
|
1319
|
-
/** Wall-clock start time of a live pid via `ps`, or null if it can't be read. */
|
|
1320
712
|
function pidStartTimeMs(pid) {
|
|
1321
713
|
const r = spawnSync('ps', ['-o', 'lstart=', '-p', String(pid)], {
|
|
1322
714
|
stdio: ['ignore', 'pipe', 'ignore'],
|
|
@@ -1330,14 +722,6 @@ function pidStartTimeMs(pid) {
|
|
|
1330
722
|
const t = new Date(raw).getTime();
|
|
1331
723
|
return Number.isNaN(t) ? null : t;
|
|
1332
724
|
}
|
|
1333
|
-
/**
|
|
1334
|
-
* `agents menubar doctor` — everything a human needs to tell "why did
|
|
1335
|
-
* Accessibility ask again" apart from "the helper is genuinely broken":
|
|
1336
|
-
* install path, version skew, whether the signing identity is update-stable,
|
|
1337
|
-
* and whether a live process predates the bundle it's supposed to be running.
|
|
1338
|
-
* Read-only: no install, no restart, no TCC reset — `agents menubar setup`
|
|
1339
|
-
* remains the command that fixes what this reports.
|
|
1340
|
-
*/
|
|
1341
725
|
export function buildMenubarDoctorReport() {
|
|
1342
726
|
if (!onDarwin()) {
|
|
1343
727
|
return {
|
|
@@ -1371,7 +755,7 @@ export function buildMenubarDoctorReport() {
|
|
|
1371
755
|
})
|
|
1372
756
|
.filter((p) => p !== null);
|
|
1373
757
|
}
|
|
1374
|
-
catch {
|
|
758
|
+
catch { }
|
|
1375
759
|
}
|
|
1376
760
|
return {
|
|
1377
761
|
platform: process.platform,
|
|
@@ -1379,9 +763,6 @@ export function buildMenubarDoctorReport() {
|
|
|
1379
763
|
installedVersion: status.installedVersion,
|
|
1380
764
|
currentVersion: status.currentVersion,
|
|
1381
765
|
cliVersion: status.cliVersion,
|
|
1382
|
-
// Two local builds are not a version "mismatch" — neither carries a version.
|
|
1383
|
-
// Reporting one told the user to run `setup` for a difference that does not
|
|
1384
|
-
// exist, which is what made the old hint fire forever.
|
|
1385
766
|
versionMatches: status.installedVersion === LOCAL_BUILD_LABEL && status.currentVersion === LOCAL_BUILD_LABEL
|
|
1386
767
|
? true
|
|
1387
768
|
: status.installedVersion === status.currentVersion,
|
|
@@ -1391,28 +772,6 @@ export function buildMenubarDoctorReport() {
|
|
|
1391
772
|
accessibilityHintNeeded: signingIdentity === 'ad-hoc' || staleRunningProcess.some((p) => p.stale),
|
|
1392
773
|
};
|
|
1393
774
|
}
|
|
1394
|
-
/**
|
|
1395
|
-
* Bring an installed release helper up to the newest published build, without
|
|
1396
|
-
* a human running `agents menubar setup`.
|
|
1397
|
-
*
|
|
1398
|
-
* Runs from the daemon's self-heal tick and right after `agents upgrade`. It
|
|
1399
|
-
* only ever moves a RELEASE install forward: a machine whose helper came from a
|
|
1400
|
-
* local build (a dev checkout) keeps it, a machine that never enabled the menu
|
|
1401
|
-
* bar or opted out is left alone, and the ownership contest that bounds
|
|
1402
|
-
* multi-install churn (`mayInstallMenubarHelper`) still applies. The bundle is
|
|
1403
|
-
* downloaded and verified by the same path every install uses (sha256,
|
|
1404
|
-
* codesign, Team, designated-requirement pin, notarization), swapped
|
|
1405
|
-
* atomically under the install lock at the same path and identity — which is
|
|
1406
|
-
* what keeps the Accessibility grant — and the running helper is restarted
|
|
1407
|
-
* from the new binary (`restartMenubarHelperAfterSwap`; launchd's KeepAlive
|
|
1408
|
-
* relaunches it within seconds). `dryRun` reports what would happen. Never
|
|
1409
|
-
* throws.
|
|
1410
|
-
*/
|
|
1411
|
-
/**
|
|
1412
|
-
* Pure (no I/O): whether an auto-update pass should proceed, and why not.
|
|
1413
|
-
* `shipped` is a bundle that ships WITH this install (never a downloaded
|
|
1414
|
-
* release cache) — CLI upgrades own that one. Returns null to proceed.
|
|
1415
|
-
*/
|
|
1416
775
|
export function menubarUpdateSkipReason(opts) {
|
|
1417
776
|
if (!opts.darwin)
|
|
1418
777
|
return 'macOS only';
|
|
@@ -1427,7 +786,6 @@ export function menubarUpdateSkipReason(opts) {
|
|
|
1427
786
|
}
|
|
1428
787
|
return null;
|
|
1429
788
|
}
|
|
1430
|
-
/** Pure (no I/O): what the pass does given the installed and available versions. */
|
|
1431
789
|
export function menubarUpdateOutcome(installed, available) {
|
|
1432
790
|
return compareVersions(available, installed) > 0 ? 'updated' : 'current';
|
|
1433
791
|
}
|
|
@@ -1461,7 +819,7 @@ export async function updateMenubarHelperIfNewer(opts = {}) {
|
|
|
1461
819
|
try {
|
|
1462
820
|
fs.writeFileSync(installedVersionMarkerPath(), JSON.stringify(stampFor(src)));
|
|
1463
821
|
}
|
|
1464
|
-
catch {
|
|
822
|
+
catch { }
|
|
1465
823
|
stampMenubarHeal();
|
|
1466
824
|
restartMenubarHelperAfterSwap(process.getuid?.() ?? 0, liveMenubarProcesses().own);
|
|
1467
825
|
return { outcome: 'updated', installed, available, detail: `AGI Menu ${installed} → ${available}` };
|