@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,11 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Scheduled job (routine) configuration and run history management.
|
|
3
|
-
*
|
|
4
|
-
* Routines are YAML files in ~/.agents/routines/ that define recurring or
|
|
5
|
-
* one-shot agent tasks. This module handles CRUD operations on job configs,
|
|
6
|
-
* run metadata persistence, prompt variable expansion, and one-shot "at" time
|
|
7
|
-
* scheduling.
|
|
8
|
-
*/
|
|
9
1
|
import * as fs from 'fs';
|
|
10
2
|
import * as path from 'path';
|
|
11
3
|
import * as yaml from 'yaml';
|
|
@@ -82,7 +74,7 @@ export function buildRoutineListJson() {
|
|
|
82
74
|
try {
|
|
83
75
|
monitorRunningJobs();
|
|
84
76
|
}
|
|
85
|
-
catch {
|
|
77
|
+
catch { }
|
|
86
78
|
const jobs = listJobsForDisplay(process.cwd());
|
|
87
79
|
if (jobs.length === 0)
|
|
88
80
|
return [];
|
|
@@ -95,7 +87,6 @@ export function buildRoutineListJson() {
|
|
|
95
87
|
overdueSet.add(job.name);
|
|
96
88
|
}
|
|
97
89
|
catch {
|
|
98
|
-
// Best-effort indicator; never block the list on detection errors.
|
|
99
90
|
}
|
|
100
91
|
const now = new Date();
|
|
101
92
|
const knownProjectNames = new Set(listProjectDefs().map((project) => project.name));
|
|
@@ -142,29 +133,11 @@ export function buildRoutineListJson() {
|
|
|
142
133
|
scheduler.stopAll();
|
|
143
134
|
}
|
|
144
135
|
}
|
|
145
|
-
/**
|
|
146
|
-
* The per-routine rows behind `agents routines status --json`. Distinct from
|
|
147
|
-
* {@link buildRoutineListJson}: this is the scheduler-truth surface the daemon
|
|
148
|
-
* owns — per routine it names the single owner device, the last fire's outcome
|
|
149
|
-
* and error, and any in-flight spawn — the fields an operator (or the menu bar /
|
|
150
|
-
* ext) needs to answer "did this routine fire, and is one running right now?"
|
|
151
|
-
* that the definition-shaped `list --json` does not carry (PHNX-3215).
|
|
152
|
-
*
|
|
153
|
-
* `monitorRunningJobs()` runs first to reap runs whose process has exited, then
|
|
154
|
-
* `inFlight` is gated on {@link isRunGenuinelyInFlight} — NOT on `status ===
|
|
155
|
-
* 'running'` alone, because a provisional pre-spawn claim is `running` with a
|
|
156
|
-
* null pid that the reaper does not touch (RUSH-2640).
|
|
157
|
-
*
|
|
158
|
-
* The routine set is the schedulable one ({@link listJobs}, the same
|
|
159
|
-
* `getDaemonStatus`/`routines status` counts), not the display set
|
|
160
|
-
* {@link buildRoutineListJson} uses — a scheduler-status surface names what the
|
|
161
|
-
* daemon can actually fire, not discoverable-but-unmaterialised project routines.
|
|
162
|
-
*/
|
|
163
136
|
export function buildRoutineStatusRows() {
|
|
164
137
|
try {
|
|
165
138
|
monitorRunningJobs();
|
|
166
139
|
}
|
|
167
|
-
catch {
|
|
140
|
+
catch { }
|
|
168
141
|
const jobs = listJobs();
|
|
169
142
|
if (jobs.length === 0)
|
|
170
143
|
return [];
|
|
@@ -177,7 +150,6 @@ export function buildRoutineStatusRows() {
|
|
|
177
150
|
overdueSet.add(job.name);
|
|
178
151
|
}
|
|
179
152
|
catch {
|
|
180
|
-
// Best-effort indicator; never block status on detection errors.
|
|
181
153
|
}
|
|
182
154
|
const now = new Date();
|
|
183
155
|
return jobs.map((job) => {
|
|
@@ -212,14 +184,12 @@ export function buildRoutineStatusRows() {
|
|
|
212
184
|
}
|
|
213
185
|
}
|
|
214
186
|
export const HOST_STRATEGIES = ['local', 'host', 'fleet', 'cloud'];
|
|
215
|
-
/** Canonical set of accepted GitHub trigger events — single source for validation. */
|
|
216
187
|
export const GITHUB_TRIGGER_EVENTS = [
|
|
217
188
|
'pull_request',
|
|
218
189
|
'push',
|
|
219
190
|
'issue_comment',
|
|
220
191
|
'workflow_run',
|
|
221
192
|
];
|
|
222
|
-
/** Canonical set of accepted Linear trigger events — single source for validation. */
|
|
223
193
|
const LINEAR_TRIGGER_EVENTS = [
|
|
224
194
|
'Issue',
|
|
225
195
|
'IssueLabel',
|
|
@@ -227,11 +197,6 @@ const LINEAR_TRIGGER_EVENTS = [
|
|
|
227
197
|
'Project',
|
|
228
198
|
'Cycle',
|
|
229
199
|
];
|
|
230
|
-
/**
|
|
231
|
-
* Map a user-facing `--on` alias to a canonical GitHub trigger event.
|
|
232
|
-
* Accepts the canonical names plus friendly shortcuts (e.g. `pr`, `pr_opened`
|
|
233
|
-
* → `pull_request`, `comment` → `issue_comment`). Returns null when unknown.
|
|
234
|
-
*/
|
|
235
200
|
export function normalizeTriggerEvent(input) {
|
|
236
201
|
const key = input.trim().toLowerCase();
|
|
237
202
|
const aliases = {
|
|
@@ -247,30 +212,12 @@ export function normalizeTriggerEvent(input) {
|
|
|
247
212
|
};
|
|
248
213
|
return aliases[key] ?? null;
|
|
249
214
|
}
|
|
250
|
-
/**
|
|
251
|
-
* Canonical form of a routine's `projects` field: drop non-string and empty
|
|
252
|
-
* entries and deduplicate while preserving first-seen order. This is the single
|
|
253
|
-
* source of truth for project-name normalization, applied at the schema
|
|
254
|
-
* boundary (`writeJob` before persistence) and at grouping (`computeProjectGroupKind`)
|
|
255
|
-
* so a hand-authored YAML with duplicates (`projects: [myapp, myapp]`) is
|
|
256
|
-
* treated identically to the canonical single-entry form everywhere.
|
|
257
|
-
*
|
|
258
|
-
* Returns `undefined` when nothing survives, so callers can omit the field.
|
|
259
|
-
*/
|
|
260
215
|
export function normalizeProjects(projects) {
|
|
261
216
|
if (!Array.isArray(projects) || projects.length === 0)
|
|
262
217
|
return undefined;
|
|
263
218
|
const out = [...new Set(projects.filter((p) => typeof p === 'string' && p !== ''))];
|
|
264
219
|
return out.length === 0 ? undefined : out;
|
|
265
220
|
}
|
|
266
|
-
/**
|
|
267
|
-
* Classify a routine's `projects` field into a discriminated {@link ProjectGroup}.
|
|
268
|
-
* Duplicates are collapsed first ({@link normalizeProjects}), so `[myapp, myapp]`
|
|
269
|
-
* is a single named project, not a "Cross-project" span.
|
|
270
|
-
*
|
|
271
|
-
* @param projects - The routine's projects array (may be undefined).
|
|
272
|
-
* @param knownProjectNames - The set of currently defined project names (from `listProjectDefs`).
|
|
273
|
-
*/
|
|
274
221
|
export function computeProjectGroupKind(projects, knownProjectNames) {
|
|
275
222
|
const norm = normalizeProjects(projects);
|
|
276
223
|
if (!norm)
|
|
@@ -284,7 +231,6 @@ export function computeProjectGroupKind(projects, knownProjectNames) {
|
|
|
284
231
|
return { kind: 'named', name: norm[0] };
|
|
285
232
|
return { kind: 'cross' };
|
|
286
233
|
}
|
|
287
|
-
/** Human display title for a {@link ProjectGroup}. */
|
|
288
234
|
export function projectGroupTitle(group) {
|
|
289
235
|
switch (group.kind) {
|
|
290
236
|
case 'named': return group.name;
|
|
@@ -294,16 +240,9 @@ export function projectGroupTitle(group) {
|
|
|
294
240
|
case 'unknown': return 'Unknown projects';
|
|
295
241
|
}
|
|
296
242
|
}
|
|
297
|
-
/**
|
|
298
|
-
* Stable bucket key for a {@link ProjectGroup}. Named projects key on their name
|
|
299
|
-
* under a `named:` prefix; specials key on their `kind` under a `special:` prefix.
|
|
300
|
-
* The two namespaces can never collide, so a project named "Operations" gets its
|
|
301
|
-
* own bucket separate from the no-project "Operations" special.
|
|
302
|
-
*/
|
|
303
243
|
export function projectGroupKey(group) {
|
|
304
244
|
return group.kind === 'named' ? `named:${group.name}` : `special:${group.kind}`;
|
|
305
245
|
}
|
|
306
|
-
/** Sort rank for a {@link ProjectGroup}: named projects first, then specials in a fixed order. */
|
|
307
246
|
export function projectGroupOrder(group) {
|
|
308
247
|
switch (group.kind) {
|
|
309
248
|
case 'named': return 0;
|
|
@@ -313,28 +252,9 @@ export function projectGroupOrder(group) {
|
|
|
313
252
|
case 'unknown': return 4;
|
|
314
253
|
}
|
|
315
254
|
}
|
|
316
|
-
/**
|
|
317
|
-
* Compute the display group label for a routine's `projects` field.
|
|
318
|
-
*
|
|
319
|
-
* Kept as the label-returning form for the JSON `projectGroup` field and any
|
|
320
|
-
* text consumer; grouping and ordering use the discriminated
|
|
321
|
-
* {@link computeProjectGroupKind}/{@link projectGroupKey} instead so buckets are
|
|
322
|
-
* never keyed on the label.
|
|
323
|
-
*
|
|
324
|
-
* @param projects - The routine's projects array (may be undefined).
|
|
325
|
-
* @param knownProjectNames - The set of currently defined project names (from `listProjectDefs`).
|
|
326
|
-
*
|
|
327
|
-
* Returns one of:
|
|
328
|
-
* - A specific project name — when `projects` has exactly one known name.
|
|
329
|
-
* - `"All projects"` — when `projects` is `["*"]`.
|
|
330
|
-
* - `"Cross-project"` — when `projects` has multiple distinct known entries.
|
|
331
|
-
* - `"Operations"` — when `projects` is absent or empty.
|
|
332
|
-
* - `"Unknown projects"` — when any entry is no longer a defined project (stale).
|
|
333
|
-
*/
|
|
334
255
|
export function computeProjectGroup(projects, knownProjectNames) {
|
|
335
256
|
return projectGroupTitle(computeProjectGroupKind(projects, knownProjectNames));
|
|
336
257
|
}
|
|
337
|
-
/** A real-filesystem {@link ContextFsProbe} for readiness checks on this machine. */
|
|
338
258
|
function realFsProbe() {
|
|
339
259
|
return {
|
|
340
260
|
exists: (p) => fs.existsSync(p),
|
|
@@ -353,7 +273,6 @@ function realFsProbe() {
|
|
|
353
273
|
} },
|
|
354
274
|
};
|
|
355
275
|
}
|
|
356
|
-
/** Classify a routine by its body kind — governs the execution-context fallback rules. */
|
|
357
276
|
function jobRoutineKind(config) {
|
|
358
277
|
if (config.command)
|
|
359
278
|
return 'command';
|
|
@@ -361,14 +280,6 @@ function jobRoutineKind(config) {
|
|
|
361
280
|
return 'workflow';
|
|
362
281
|
return 'agent';
|
|
363
282
|
}
|
|
364
|
-
/**
|
|
365
|
-
* Resolve a routine's execution context (working directory + structural/fs
|
|
366
|
-
* readiness) by bridging its `project`/`cwd` fields into the pure
|
|
367
|
-
* {@link resolveRoutineExecutionContext} resolver. Local placement resolves
|
|
368
|
-
* against this machine's `$HOME` with a real filesystem probe; a caller may
|
|
369
|
-
* inject a different target home / probe (e.g. `null` to defer existence for a
|
|
370
|
-
* remote target).
|
|
371
|
-
*/
|
|
372
283
|
export function resolveJobExecutionContext(config, opts = {}) {
|
|
373
284
|
const targetHome = opts.targetHome ?? os.homedir();
|
|
374
285
|
const mode = opts.mode ?? 'local';
|
|
@@ -379,7 +290,7 @@ export function resolveJobExecutionContext(config, opts = {}) {
|
|
|
379
290
|
if (config.project !== undefined && projectResolution === undefined) {
|
|
380
291
|
const def = loadProjectDef(config.project);
|
|
381
292
|
projectResolution = def
|
|
382
|
-
? { defined: true, base: projectBasePath(def, true) }
|
|
293
|
+
? { defined: true, base: projectBasePath(def, true) }
|
|
383
294
|
: { defined: false };
|
|
384
295
|
}
|
|
385
296
|
return resolveRoutineExecutionContext({
|
|
@@ -393,11 +304,6 @@ export function resolveJobExecutionContext(config, opts = {}) {
|
|
|
393
304
|
probe,
|
|
394
305
|
});
|
|
395
306
|
}
|
|
396
|
-
/**
|
|
397
|
-
* Finalize a run record with a terminal status, computing `duration` from
|
|
398
|
-
* `startedAt` and the completion timestamp. Keeps failure-reason population
|
|
399
|
-
* centralized so every completion path writes the same machine-readable fields.
|
|
400
|
-
*/
|
|
401
307
|
export function finalizeRunMeta(meta, status, exitCode, opts) {
|
|
402
308
|
meta.status = status;
|
|
403
309
|
meta.exitCode = exitCode;
|
|
@@ -414,21 +320,6 @@ export function finalizeRunMeta(meta, status, exitCode, opts) {
|
|
|
414
320
|
delete meta.errorMessage;
|
|
415
321
|
}
|
|
416
322
|
}
|
|
417
|
-
/**
|
|
418
|
-
* True when the job may execute on this machine: no `devices` allowlist (or
|
|
419
|
-
* empty), or the allowlist includes this device. Both sides go through
|
|
420
|
-
* `normalizeHost` so `Yosemite-S0`, `yosemite-s0.tailnet.ts.net`, and
|
|
421
|
-
* `yosemite-s0` all agree. Every fire path (cron scheduler, webhook,
|
|
422
|
-
* catchup/overdue, manual run) gates on this.
|
|
423
|
-
*
|
|
424
|
-
* A monitor- or webhook-dispatched job ({@link JobConfig.dispatchedBy} set) skips
|
|
425
|
-
* the routine activation manifest: it is not a routine, so its name can never be
|
|
426
|
-
* a member and the lookup could only ever answer "not activated here"
|
|
427
|
-
* (RUSH-2681 for monitors; the same hole broke every `run.agent`/`run.workflow`
|
|
428
|
-
* webhook handler, which the receiver logged as `fired` while the run record read
|
|
429
|
-
* `skipped` with an empty allowlist). Ownership was already decided upstream — by
|
|
430
|
-
* the monitor's `device:` pin, or by the one box the webhook was delivered to.
|
|
431
|
-
*/
|
|
432
323
|
export function jobRunsOnThisDevice(config) {
|
|
433
324
|
if (config.dispatchedBy === undefined) {
|
|
434
325
|
const activated = routineEnabledOnThisDevice(config.name);
|
|
@@ -436,33 +327,11 @@ export function jobRunsOnThisDevice(config) {
|
|
|
436
327
|
return activated;
|
|
437
328
|
}
|
|
438
329
|
const owner = routineOwnerDevice(config);
|
|
439
|
-
// Unrestricted: no pin means fleet-wide by design (`watchdog`, `check-updates`).
|
|
440
330
|
if (owner === null)
|
|
441
331
|
return true;
|
|
442
332
|
return owner === machineId();
|
|
443
333
|
}
|
|
444
|
-
/**
|
|
445
|
-
* The ONE device that owns a routine — the single daemon allowed to fire it.
|
|
446
|
-
*
|
|
447
|
-
* `devices` is an allowlist, and every listed device used to fire
|
|
448
|
-
* independently, so a routine pinned to two boxes ran **twice** per schedule:
|
|
449
|
-
* two full agent sessions doing identical work, burning double the quota. On
|
|
450
|
-
* this fleet seven routines were in that state, e.g. `security-sweep` running
|
|
451
|
-
* at 15:30:02 on one box and 15:30:03 on the other, both completing.
|
|
452
|
-
*
|
|
453
|
-
* Ownership is a pure function of the config — the first entry in normalized
|
|
454
|
-
* sort order — so every daemon independently reaches the same answer with no
|
|
455
|
-
* lease, no cross-device coordination, and no split brain when the fleet
|
|
456
|
-
* partitions. A multi-entry pin is a misconfiguration
|
|
457
|
-
* ({@link hasAmbiguousDevicePin}); this keeps such a routine running exactly
|
|
458
|
-
* once instead of silently dropping it, while `validateJob` refuses to create
|
|
459
|
-
* a new one and `agents doctor` surfaces the existing ones.
|
|
460
|
-
*
|
|
461
|
-
* Returns null when the routine is unrestricted (empty or omitted `devices`).
|
|
462
|
-
*/
|
|
463
334
|
export function routineOwnerDevice(config) {
|
|
464
|
-
// A non-array `devices` is a separate validation error; don't throw here and
|
|
465
|
-
// don't double-report it.
|
|
466
335
|
if (!Array.isArray(config.devices))
|
|
467
336
|
return null;
|
|
468
337
|
const devices = config.devices.map((d) => normalizeHost(String(d))).filter(Boolean);
|
|
@@ -470,24 +339,12 @@ export function routineOwnerDevice(config) {
|
|
|
470
339
|
return null;
|
|
471
340
|
return [...devices].sort()[0];
|
|
472
341
|
}
|
|
473
|
-
/**
|
|
474
|
-
* Does this routine name more than one distinct device? Such a pin used to mean
|
|
475
|
-
* "fire on each of them"; it now means "fire only on the first", which is
|
|
476
|
-
* almost certainly not what the author intended either way — so it is reported
|
|
477
|
-
* as a misconfiguration rather than silently reinterpreted.
|
|
478
|
-
*/
|
|
479
342
|
export function hasAmbiguousDevicePin(config) {
|
|
480
343
|
if (!Array.isArray(config.devices))
|
|
481
344
|
return false;
|
|
482
345
|
const devices = new Set(config.devices.map((d) => normalizeHost(String(d))).filter(Boolean));
|
|
483
346
|
return devices.size > 1;
|
|
484
347
|
}
|
|
485
|
-
/**
|
|
486
|
-
* Every routine carrying a multi-device pin. Surfaced by `agents doctor` and
|
|
487
|
-
* `agents routines list` so an existing misconfiguration is visible rather than
|
|
488
|
-
* silently reinterpreted: before ownership became singular each of these fired
|
|
489
|
-
* once per listed device, doubling the work and the agent spend.
|
|
490
|
-
*/
|
|
491
348
|
export function findAmbiguousDevicePins(cwd) {
|
|
492
349
|
return listJobs(cwd)
|
|
493
350
|
.filter((job) => job.enabled && hasAmbiguousDevicePin(job))
|
|
@@ -497,11 +354,6 @@ export function findAmbiguousDevicePins(cwd) {
|
|
|
497
354
|
owner: routineOwnerDevice(job) ?? '',
|
|
498
355
|
}));
|
|
499
356
|
}
|
|
500
|
-
/**
|
|
501
|
-
* Resolve the effective host strategy for a job.
|
|
502
|
-
* Bare `host:` without an explicit strategy implies `host` (back-compat with
|
|
503
|
-
* pre-hostStrategy YAML). Otherwise default to `local`.
|
|
504
|
-
*/
|
|
505
357
|
export function resolveHostStrategy(config) {
|
|
506
358
|
if (config.hostStrategy)
|
|
507
359
|
return config.hostStrategy;
|
|
@@ -509,10 +361,6 @@ export function resolveHostStrategy(config) {
|
|
|
509
361
|
return 'host';
|
|
510
362
|
return 'local';
|
|
511
363
|
}
|
|
512
|
-
/**
|
|
513
|
-
* Parse a CLI `--placement` value into a HostStrategy, or null when empty.
|
|
514
|
-
* Throws a human-readable Error for unknown values.
|
|
515
|
-
*/
|
|
516
364
|
export function parseHostStrategy(raw) {
|
|
517
365
|
if (raw === undefined || raw === null || raw === '')
|
|
518
366
|
return null;
|
|
@@ -521,35 +369,19 @@ export function parseHostStrategy(raw) {
|
|
|
521
369
|
return v;
|
|
522
370
|
throw new Error(`Invalid placement '${raw}'. Use one of: ${HOST_STRATEGIES.join(', ')}`);
|
|
523
371
|
}
|
|
524
|
-
/**
|
|
525
|
-
* Strategies that dispatch the job body off the firing machine. Without a
|
|
526
|
-
* `devices` pin every daemon in the fleet would fire and each would dispatch
|
|
527
|
-
* once — N× duplicate runs. Callers pin to this machine when the user did not
|
|
528
|
-
* set an explicit allowlist.
|
|
529
|
-
*/
|
|
530
372
|
export function placementRequiresFiringPin(strategy) {
|
|
531
373
|
return strategy === 'host' || strategy === 'fleet' || strategy === 'cloud';
|
|
532
374
|
}
|
|
533
|
-
/**
|
|
534
|
-
* Return null when the job may run here; otherwise return a structured,
|
|
535
|
-
* human-friendly eligibility failure. Centralizes the message/suggestion
|
|
536
|
-
* construction so manual run, executeJob, and executeJobDetached stay in
|
|
537
|
-
* sync. Scheduler/webhook/overdue paths continue to use jobRunsOnThisDevice.
|
|
538
|
-
*/
|
|
539
375
|
export function checkJobDeviceEligibility(config) {
|
|
540
376
|
if (jobRunsOnThisDevice(config))
|
|
541
377
|
return null;
|
|
542
378
|
const allowed = (config.devices ?? []).map((d) => normalizeHost(d));
|
|
543
379
|
const allowedLabel = allowed.join(', ');
|
|
544
|
-
// The owner is the lowest normalized name, not the first entry as written —
|
|
545
|
-
// suggesting allowed[0] on an unsorted list points at a device that will
|
|
546
|
-
// refuse the run for exactly the same reason.
|
|
547
380
|
const firstHost = routineOwnerDevice(config) ?? allowed[0] ?? 'HOST';
|
|
548
381
|
const message = `Job '${config.name}' can only run on: ${allowedLabel}`;
|
|
549
382
|
const suggestion = `agents routines run ${config.name} --device ${firstHost}`;
|
|
550
383
|
return { message, suggestion, allowedLabel, firstHost };
|
|
551
384
|
}
|
|
552
|
-
/** Default values applied to every job config when fields are omitted. */
|
|
553
385
|
const JOB_DEFAULTS = {
|
|
554
386
|
mode: 'auto',
|
|
555
387
|
effort: 'auto',
|
|
@@ -570,18 +402,6 @@ function overlayUserRoutineDevices(job, userJob) {
|
|
|
570
402
|
}
|
|
571
403
|
return merged;
|
|
572
404
|
}
|
|
573
|
-
/**
|
|
574
|
-
* List all job configs, scanning project > user > system routine dirs.
|
|
575
|
-
* Higher layers shadow lower ones of the same name (first-seen wins): a project
|
|
576
|
-
* routine shadows a user routine, and a user routine shadows a system routine
|
|
577
|
-
* (`~/.agents/.system/routines/`, shipped via gh:phnx-labs/.agents-system).
|
|
578
|
-
* When a same-name project routine wins for inspection, the user-layer
|
|
579
|
-
* `devices` allowlist is overlaid only if the project routine does not declare
|
|
580
|
-
* its own allowlist, so CWD project discovery cannot hide an operational fleet
|
|
581
|
-
* pin or erase a project-authored one.
|
|
582
|
-
* Project discovery is opt-in via `cwd`; the daemon (which calls `listJobs()`
|
|
583
|
-
* with no argument) sees user + system routines.
|
|
584
|
-
*/
|
|
585
405
|
export function listJobs(cwd) {
|
|
586
406
|
ensureAgentsDir();
|
|
587
407
|
const seen = new Set();
|
|
@@ -614,14 +434,6 @@ export function listJobs(cwd) {
|
|
|
614
434
|
}
|
|
615
435
|
return jobs.map(applyDeviceActivation);
|
|
616
436
|
}
|
|
617
|
-
/**
|
|
618
|
-
* Read a single job config by name, checking project > user > system.
|
|
619
|
-
* Same-name project routines keep the user-layer `devices` allowlist only when
|
|
620
|
-
* the project routine does not declare its own allowlist, for the same reason
|
|
621
|
-
* as listJobs().
|
|
622
|
-
* Project discovery is opt-in via `cwd`; daemon callers pass no argument and
|
|
623
|
-
* resolve user + system routines.
|
|
624
|
-
*/
|
|
625
437
|
export function readJob(name, cwd) {
|
|
626
438
|
ensureAgentsDir();
|
|
627
439
|
const userDir = getRoutinesDir();
|
|
@@ -656,14 +468,6 @@ function readJobFromDir(dir, name) {
|
|
|
656
468
|
}
|
|
657
469
|
return null;
|
|
658
470
|
}
|
|
659
|
-
/**
|
|
660
|
-
* Read one routine file, preserving WHY it failed.
|
|
661
|
-
*
|
|
662
|
-
* `readJobFile` collapses all four fail-closed paths to `null`, which is right
|
|
663
|
-
* for the loaders (an inert routine must not run) but leaves a broken routine
|
|
664
|
-
* invisible in every view — the one routine an operator most needs to see. Same
|
|
665
|
-
* reading, reason kept, for diagnostic surfaces like `agents inspect --routines`.
|
|
666
|
-
*/
|
|
667
471
|
export function readJobFileResult(filePath) {
|
|
668
472
|
let content;
|
|
669
473
|
try {
|
|
@@ -682,32 +486,15 @@ export function readJobFileResult(filePath) {
|
|
|
682
486
|
if (!parsed || typeof parsed !== 'object') {
|
|
683
487
|
return { config: null, problem: 'not a YAML map' };
|
|
684
488
|
}
|
|
685
|
-
// Fail closed on the legacy singular `device` key. A routine that still
|
|
686
|
-
// carries it after v12 startup migration is unmigrated state and must be
|
|
687
|
-
// treated as unavailable/inert rather than unrestricted.
|
|
688
489
|
if (Object.prototype.hasOwnProperty.call(parsed, 'device')) {
|
|
689
490
|
return { config: null, problem: 'legacy `device:` key — inert until migrated to `devices:`' };
|
|
690
491
|
}
|
|
691
|
-
// Fail closed on a malformed `devices` too. Ownership treats a non-array as
|
|
692
|
-
// "no pin", and the daemon's load path never calls validateJob — so a YAML
|
|
693
|
-
// typo (`devices: yosemite-s0` instead of a list) would silently promote the
|
|
694
|
-
// routine to fleet-wide and fire it on EVERY box. Inert-and-loud beats
|
|
695
|
-
// unrestricted-and-silent.
|
|
696
492
|
if (Object.prototype.hasOwnProperty.call(parsed, 'devices')
|
|
697
493
|
&& parsed.devices !== undefined
|
|
698
494
|
&& parsed.devices !== null
|
|
699
495
|
&& !Array.isArray(parsed.devices)) {
|
|
700
496
|
return { config: null, problem: '`devices:` must be a list — routine is inert' };
|
|
701
497
|
}
|
|
702
|
-
// Fail closed on `dispatchedBy`. It is a runtime-only marker set by
|
|
703
|
-
// lib/monitors/dispatch.ts on a job that has no definition file, and it makes
|
|
704
|
-
// `jobRunsOnThisDevice` SKIP this device's routine activation manifest. A
|
|
705
|
-
// routine YAML carrying it would therefore fire on every box regardless of
|
|
706
|
-
// activation, on every path (scheduler, overdue, webhook) — the same
|
|
707
|
-
// unrestricted-and-silent outcome the `devices:` guard above exists to
|
|
708
|
-
// prevent, and the daemon's load path never calls validateJob. It is never
|
|
709
|
-
// written back (writeJob deletes it), so its presence here means hand-authored
|
|
710
|
-
// state, not drift.
|
|
711
498
|
if (Object.prototype.hasOwnProperty.call(parsed, 'dispatchedBy')) {
|
|
712
499
|
return { config: null, problem: '`dispatchedBy:` is a runtime-only monitor/webhook marker, not a routine field — routine is inert' };
|
|
713
500
|
}
|
|
@@ -716,9 +503,6 @@ export function readJobFileResult(filePath) {
|
|
|
716
503
|
...JOB_DEFAULTS,
|
|
717
504
|
...parsed,
|
|
718
505
|
name: parsed.name || path.basename(filePath).replace(/\.ya?ml$/, ''),
|
|
719
|
-
// Before a device manifest exists, preserve only explicit legacy state.
|
|
720
|
-
// A new built-in definition with no `enabled:` field stays opt-in until
|
|
721
|
-
// setup materializes this host's routines list.
|
|
722
506
|
enabled: Object.prototype.hasOwnProperty.call(parsed, 'enabled') ? parsed.enabled !== false : false,
|
|
723
507
|
},
|
|
724
508
|
problem: null,
|
|
@@ -727,23 +511,10 @@ export function readJobFileResult(filePath) {
|
|
|
727
511
|
function readJobFile(filePath) {
|
|
728
512
|
return readJobFileResult(filePath).config;
|
|
729
513
|
}
|
|
730
|
-
/** Write a job config to disk, omitting fields that match defaults.
|
|
731
|
-
*
|
|
732
|
-
* Updates the one existing supported extension (.yml or .yaml) atomically.
|
|
733
|
-
* New routines are written as .yml. If both extensions exist for the same
|
|
734
|
-
* name, the write fails explicitly so we never choose or drop a sibling.
|
|
735
|
-
*/
|
|
736
514
|
export function writeJob(config) {
|
|
737
515
|
ensureAgentsDir();
|
|
738
|
-
// Stamp the creator once (RUSH-2020). An edit re-writes a config loaded from
|
|
739
|
-
// disk, which already carries `actor`, so this preserves the original creator;
|
|
740
|
-
// only a brand-new routine (no actor yet) gets the current resolver.
|
|
741
516
|
if (!config.actor)
|
|
742
517
|
config.actor = resolveActor().id;
|
|
743
|
-
// Stamped once, on first write, and preserved by every later edit (an edit
|
|
744
|
-
// re-writes a config loaded from disk, which already carries it). This is the
|
|
745
|
-
// floor overdue detection uses so a routine is never judged against fires
|
|
746
|
-
// that predate it.
|
|
747
518
|
if (!config.createdAt)
|
|
748
519
|
config.createdAt = new Date().toISOString();
|
|
749
520
|
const jobsDir = getRoutinesDir();
|
|
@@ -768,14 +539,7 @@ export function writeJob(config) {
|
|
|
768
539
|
if (output.catchup === true || output.catchup === undefined)
|
|
769
540
|
delete output.catchup;
|
|
770
541
|
delete output.devices;
|
|
771
|
-
// Runtime-only monitor marker — a definition on disk must never carry it (see
|
|
772
|
-
// the read-side guard in readJobFileResult), so strip it at the one schema
|
|
773
|
-
// boundary rather than trusting every caller.
|
|
774
542
|
delete output.dispatchedBy;
|
|
775
|
-
// Persist projects in canonical form: deduplicated, first-seen order, field
|
|
776
|
-
// omitted when nothing survives. This is the schema boundary, so a routine
|
|
777
|
-
// written from any path (add, edit, enable/disable re-write) lands canonical
|
|
778
|
-
// regardless of how the caller assembled the array.
|
|
779
543
|
const normProjects = normalizeProjects(output.projects);
|
|
780
544
|
if (normProjects)
|
|
781
545
|
output.projects = normProjects;
|
|
@@ -792,21 +556,6 @@ export function writeJob(config) {
|
|
|
792
556
|
}
|
|
793
557
|
atomicWriteFileSync(filePath, serializeJob(output, existingText));
|
|
794
558
|
}
|
|
795
|
-
/**
|
|
796
|
-
* Serialize a job config, preserving the on-disk formatting of an existing file.
|
|
797
|
-
*
|
|
798
|
-
* A full `yaml.stringify(config)` re-emits the whole document — restyling every
|
|
799
|
-
* scalar (unquoting `schedule`, re-wrapping the folded `prompt` block, reordering
|
|
800
|
-
* keys). When a routine is only being toggled (pause/resume) or re-pinned
|
|
801
|
-
* (`devices --set`), that rewrites the entire file, leaving the git-backed
|
|
802
|
-
* `~/.agents` tree perpetually dirty so `agents repo pull` refuses to sync across
|
|
803
|
-
* the fleet. To keep the diff to the field that actually changed, we edit the
|
|
804
|
-
* existing document in place and only re-render touched nodes; untouched nodes
|
|
805
|
-
* (notably the large `prompt` block) keep their byte-for-byte formatting.
|
|
806
|
-
*
|
|
807
|
-
* `existingText` is the current file contents, or null for a new file. New,
|
|
808
|
-
* unparseable, and non-mapping documents fall back to canonical `yaml.stringify`.
|
|
809
|
-
*/
|
|
810
559
|
export function serializeJob(output, existingText) {
|
|
811
560
|
if (existingText == null)
|
|
812
561
|
return yaml.stringify(output);
|
|
@@ -814,26 +563,16 @@ export function serializeJob(output, existingText) {
|
|
|
814
563
|
if (doc.errors.length > 0 || !yaml.isMap(doc.contents))
|
|
815
564
|
return yaml.stringify(output);
|
|
816
565
|
const existing = (doc.toJS() ?? {});
|
|
817
|
-
// Update or add only the keys that actually changed; leave the rest untouched
|
|
818
|
-
// so their original formatting is preserved.
|
|
819
566
|
for (const [key, value] of Object.entries(output)) {
|
|
820
567
|
if (JSON.stringify(existing[key]) !== JSON.stringify(value))
|
|
821
568
|
doc.set(key, value);
|
|
822
569
|
}
|
|
823
|
-
// Drop keys that no longer belong (e.g. an omitted default, or `devices`
|
|
824
|
-
// cleared back to fleet-wide).
|
|
825
570
|
for (const key of Object.keys(existing)) {
|
|
826
571
|
if (!(key in output))
|
|
827
572
|
doc.delete(key);
|
|
828
573
|
}
|
|
829
|
-
// `flowCollectionPadding: false` keeps a re-serialized flow sequence in the
|
|
830
|
-
// committed no-padding form (`[a, b]`, not `[ a, b ]`). Routine YAML lives in
|
|
831
|
-
// the same git-backed `~/.agents` repo as agents.yaml, so the same emitter
|
|
832
|
-
// padding would leave the tracked file dirty and block `agents repo pull`
|
|
833
|
-
// fleet-wide (RUSH-2505). Node styles are otherwise preserved.
|
|
834
574
|
return doc.toString({ flowCollectionPadding: false });
|
|
835
575
|
}
|
|
836
|
-
/** Delete a job config file by name. Returns true if the file existed. */
|
|
837
576
|
export function deleteJob(name) {
|
|
838
577
|
const jobsDir = getRoutinesDir();
|
|
839
578
|
for (const ext of ['.yml', '.yaml']) {
|
|
@@ -845,7 +584,6 @@ export function deleteJob(name) {
|
|
|
845
584
|
}
|
|
846
585
|
return false;
|
|
847
586
|
}
|
|
848
|
-
/** Enable or disable a job by name. */
|
|
849
587
|
export function setJobEnabled(name, enabled) {
|
|
850
588
|
const job = readJob(name);
|
|
851
589
|
if (!job)
|
|
@@ -855,29 +593,21 @@ export function setJobEnabled(name, enabled) {
|
|
|
855
593
|
: [];
|
|
856
594
|
setRoutineEnabledOnThisDevice(name, enabled, legacyEnabled);
|
|
857
595
|
}
|
|
858
|
-
/** Materialize legacy definition state into this device's activation manifest. */
|
|
859
596
|
export function migrateLegacyRoutineActivation() {
|
|
860
597
|
if (enabledRoutineNames() !== null)
|
|
861
598
|
return false;
|
|
862
|
-
// Legacy activation migration preserves FILE-BACKED routines' old
|
|
863
|
-
// `enabled:`/`devices:` state into the device manifest. A box with zero
|
|
864
|
-
// routines never grows a manifest here (nothing enabled or pinned to seed).
|
|
865
599
|
const jobs = listJobs();
|
|
866
600
|
if (!jobs.some((job) => job.enabled || Array.isArray(job.devices)))
|
|
867
601
|
return false;
|
|
868
602
|
replaceEnabledRoutines(jobs.filter((job) => job.enabled && jobRunsOnThisDevice(job)).map((job) => job.name));
|
|
869
603
|
return true;
|
|
870
604
|
}
|
|
871
|
-
/** Validate a partial job config, returning a list of human-readable errors. */
|
|
872
605
|
export function validateJob(config) {
|
|
873
606
|
const errors = [];
|
|
874
607
|
if (!config.name || typeof config.name !== 'string') {
|
|
875
608
|
errors.push('name is required');
|
|
876
609
|
}
|
|
877
610
|
else if (!isSafeSegmentName(config.name)) {
|
|
878
|
-
// The name becomes a filesystem path segment (overlay HOME under the
|
|
879
|
-
// routines dir). Reject separators, '.'/'..', and null bytes so a synced
|
|
880
|
-
// config can't traverse out of ~/.agents/routines.
|
|
881
611
|
errors.push(`invalid name ${JSON.stringify(config.name)}: must be a single path segment ` +
|
|
882
612
|
`(no '/', '\\\\', or null bytes, and not '.' or '..')`);
|
|
883
613
|
}
|
|
@@ -891,7 +621,6 @@ export function validateJob(config) {
|
|
|
891
621
|
errors.push('schedule must be a cron expression string');
|
|
892
622
|
}
|
|
893
623
|
else {
|
|
894
|
-
// Validate cron expression is parseable
|
|
895
624
|
try {
|
|
896
625
|
new Cron(config.schedule);
|
|
897
626
|
}
|
|
@@ -922,17 +651,7 @@ export function validateJob(config) {
|
|
|
922
651
|
}
|
|
923
652
|
else if (hasAgent && config.agent && strategy === 'local' &&
|
|
924
653
|
!ROUTINE_AGENT_IDS.includes(config.agent) &&
|
|
925
|
-
// A custom harness is exempt from the local-daemon command table: the
|
|
926
|
-
// runner delegates it to `agents run <name>`, the same path workflow
|
|
927
|
-
// jobs take, so no ROUTINE_AGENT_COMMANDS template is needed.
|
|
928
654
|
!isCustomHarnessName(config.agent)) {
|
|
929
|
-
// The local daemon only knows how to build a command for the agents in
|
|
930
|
-
// ROUTINE_AGENT_IDS (baked from AGENT_COMMANDS in runner.ts) — anything else is a
|
|
931
|
-
// real, installable agent (it passed the ALL_AGENT_IDS check above) but one
|
|
932
|
-
// the daemon can't fire itself, so reject it now instead of accepting the
|
|
933
|
-
// routine and failing at fire time (runner.ts buildJobCommand: "Unsupported
|
|
934
|
-
// agent for daemon jobs"). host/fleet/cloud placement dispatches through
|
|
935
|
-
// `agents run`/a cloud provider instead of this table, so they're exempt.
|
|
936
655
|
errors.push(`agent '${config.agent}' is not supported by the local routine daemon; use one of: ` +
|
|
937
656
|
`${ROUTINE_AGENT_IDS.join(', ')} (or set hostStrategy: host/fleet/cloud to run it elsewhere)`);
|
|
938
657
|
}
|
|
@@ -942,9 +661,6 @@ export function validateJob(config) {
|
|
|
942
661
|
}
|
|
943
662
|
}
|
|
944
663
|
if (config.resume !== undefined) {
|
|
945
|
-
// Only claude/codex support native `--resume`; other agents would emit a resume
|
|
946
|
-
// flag they don't understand. Resume reopens an agent session, so it is
|
|
947
|
-
// incompatible with workflow and loop jobs (which have no single session to reopen).
|
|
948
664
|
const RESUMABLE_AGENTS = ['claude', 'codex'];
|
|
949
665
|
if (typeof config.resume !== 'string' || config.resume.trim() === '') {
|
|
950
666
|
errors.push('resume must be a non-empty session id string');
|
|
@@ -976,7 +692,6 @@ export function validateJob(config) {
|
|
|
976
692
|
if (config.effort && !['low', 'medium', 'high', 'xhigh', 'max', 'auto'].includes(config.effort)) {
|
|
977
693
|
errors.push('effort must be low, medium, high, xhigh, max, or auto');
|
|
978
694
|
}
|
|
979
|
-
// command routines run a plain shell and never build a prompt; agent/workflow routines require one.
|
|
980
695
|
if (!hasCommand && (!config.prompt || typeof config.prompt !== 'string')) {
|
|
981
696
|
errors.push('prompt is required');
|
|
982
697
|
}
|
|
@@ -1004,13 +719,9 @@ export function validateJob(config) {
|
|
|
1004
719
|
if (strategy === 'host' && (!config.host || config.host.trim() === '')) {
|
|
1005
720
|
errors.push("hostStrategy: host requires host: (set via --run-on or host: in YAML)");
|
|
1006
721
|
}
|
|
1007
|
-
// `host: auto` is fire-time fleet placement (resolveDeviceAuto), never a
|
|
1008
|
-
// literal SSH target — it is only meaningful under hostStrategy: fleet.
|
|
1009
722
|
if (config.host === 'auto' && strategy !== 'fleet') {
|
|
1010
723
|
errors.push("host: auto requires hostStrategy: fleet (set via --run-on auto) — 'auto' is a fire-time device pick, not a machine name");
|
|
1011
724
|
}
|
|
1012
|
-
// Remote placement (host/fleet/cloud) can't carry workflow/loop/command yet —
|
|
1013
|
-
// those live on the firing machine.
|
|
1014
725
|
if (strategy === 'host' || strategy === 'fleet' || strategy === 'cloud') {
|
|
1015
726
|
if (config.workflow) {
|
|
1016
727
|
errors.push(`${strategy} placement can't be combined with workflow: yet — run the workflow locally or convert it to a plain prompt`);
|
|
@@ -1037,9 +748,6 @@ export function validateJob(config) {
|
|
|
1037
748
|
else if (config.cwd !== undefined && (typeof config.cwd !== 'string' || config.cwd.trim() === '')) {
|
|
1038
749
|
errors.push('cwd (the portable execution directory) must be a non-empty path string');
|
|
1039
750
|
}
|
|
1040
|
-
// `remoteCwd` is the legacy host-placement path; `cwd` is its canonical
|
|
1041
|
-
// replacement. The two split path semantics, so they must never coexist — the
|
|
1042
|
-
// one-shot migration folds remoteCwd into cwd, and a conflicting pair pauses.
|
|
1043
751
|
if (config.cwd !== undefined && config.remoteCwd !== undefined) {
|
|
1044
752
|
errors.push('cwd and remoteCwd both set — remoteCwd is the legacy form of cwd; keep only cwd');
|
|
1045
753
|
}
|
|
@@ -1069,9 +777,6 @@ export function validateJob(config) {
|
|
|
1069
777
|
}
|
|
1070
778
|
}
|
|
1071
779
|
}
|
|
1072
|
-
// A routine belongs to exactly one device. Listing several used to fire it
|
|
1073
|
-
// once per device — duplicate work, duplicate spend — and making them elect
|
|
1074
|
-
// one owner at runtime would need cross-device coordination nobody wants.
|
|
1075
780
|
if (hasAmbiguousDevicePin(config)) {
|
|
1076
781
|
errors.push(`devices lists ${new Set(config.devices.map((d) => normalizeHost(String(d)))).size} devices; a routine runs on exactly one. ` +
|
|
1077
782
|
'Pin the single device that should own it, e.g. devices: [yosemite-s0]. ' +
|
|
@@ -1085,7 +790,6 @@ export function validateJob(config) {
|
|
|
1085
790
|
errors.push('projects must be an array of project names (or ["*"] for all projects)');
|
|
1086
791
|
}
|
|
1087
792
|
else if (config.projects.length === 1 && config.projects[0] === '*') {
|
|
1088
|
-
// ["*"] is valid: "all projects" sentinel
|
|
1089
793
|
}
|
|
1090
794
|
else if (config.projects.includes('*')) {
|
|
1091
795
|
errors.push('projects: "*" (all projects) must be the sole entry');
|
|
@@ -1105,7 +809,6 @@ export function validateJob(config) {
|
|
|
1105
809
|
}
|
|
1106
810
|
return errors;
|
|
1107
811
|
}
|
|
1108
|
-
/** Validate a job trigger block, returning a list of human-readable errors. */
|
|
1109
812
|
export function validateTrigger(trigger) {
|
|
1110
813
|
const errors = [];
|
|
1111
814
|
if (!trigger || typeof trigger !== 'object') {
|
|
@@ -1162,7 +865,6 @@ function isParseableDate(value) {
|
|
|
1162
865
|
const ts = Date.parse(value);
|
|
1163
866
|
return Number.isFinite(ts);
|
|
1164
867
|
}
|
|
1165
|
-
/** True when a job's endAt has already elapsed. False when endAt is unset or in the future. */
|
|
1166
868
|
export function isPastEndAt(config, now = new Date()) {
|
|
1167
869
|
if (!config.endAt)
|
|
1168
870
|
return false;
|
|
@@ -1297,10 +999,6 @@ function getPath(obj, path) {
|
|
|
1297
999
|
}
|
|
1298
1000
|
return current;
|
|
1299
1001
|
}
|
|
1300
|
-
/**
|
|
1301
|
-
* Substitute `{{dotted.path}}` placeholders in a string using a webhook context.
|
|
1302
|
-
* Missing values are replaced with an empty string.
|
|
1303
|
-
*/
|
|
1304
1002
|
export function substituteWebhookPrompt(prompt, context) {
|
|
1305
1003
|
return prompt.replace(/\{\{([^{}]+)\}\}/g, (_, rawPath) => {
|
|
1306
1004
|
const value = getPath(context, rawPath.trim());
|
|
@@ -1309,24 +1007,6 @@ export function substituteWebhookPrompt(prompt, context) {
|
|
|
1309
1007
|
return String(value);
|
|
1310
1008
|
});
|
|
1311
1009
|
}
|
|
1312
|
-
/**
|
|
1313
|
-
* Substitute `{{dotted.path}}` placeholders in a string destined for a SHELL,
|
|
1314
|
-
* quoting every substituted value so payload content cannot break out of it.
|
|
1315
|
-
*
|
|
1316
|
-
* `run.command` is executed through a shell, and its context is built from an
|
|
1317
|
-
* external webhook payload — `issue.title`, `issue.description`, and the GitHub
|
|
1318
|
-
* `pull_request` fields are free text any outside contributor can set. Pasting
|
|
1319
|
-
* those in raw (as {@link substituteWebhookPrompt} does, correctly, for prompts)
|
|
1320
|
-
* turns an operator's `echo {{issue.title}}` into a command-injection sink.
|
|
1321
|
-
*
|
|
1322
|
-
* The template itself is operator-authored and stays unquoted, so pipes,
|
|
1323
|
-
* redirects, and `&&` in the configured command keep working. Only the
|
|
1324
|
-
* interpolated values are quoted.
|
|
1325
|
-
*
|
|
1326
|
-
* POSIX `sh` quoting: wrap in single quotes and close/escape/reopen for any
|
|
1327
|
-
* embedded single quote. `exec` uses `cmd.exe` on Windows, which does not
|
|
1328
|
-
* honour these rules — see `assertShellSubstitutionSupported`.
|
|
1329
|
-
*/
|
|
1330
1010
|
export function substituteWebhookCommand(command, context) {
|
|
1331
1011
|
return command.replace(/\{\{([^{}]+)\}\}/g, (_, rawPath) => {
|
|
1332
1012
|
const value = getPath(context, rawPath.trim());
|
|
@@ -1335,14 +1015,6 @@ export function substituteWebhookCommand(command, context) {
|
|
|
1335
1015
|
return `'${String(value).replace(/'/g, `'\\''`)}'`;
|
|
1336
1016
|
});
|
|
1337
1017
|
}
|
|
1338
|
-
/**
|
|
1339
|
-
* Refuse a `run.command` carrying placeholders on a platform whose shell we
|
|
1340
|
-
* cannot safely quote for. `child_process.exec` runs through `cmd.exe` on
|
|
1341
|
-
* Windows, where POSIX single-quoting is not a quoting mechanism at all, so
|
|
1342
|
-
* {@link substituteWebhookCommand} would not contain a hostile value.
|
|
1343
|
-
*
|
|
1344
|
-
* Fail loud rather than execute something we cannot prove is safe.
|
|
1345
|
-
*/
|
|
1346
1018
|
export function assertShellSubstitutionSupported(command, platform = process.platform) {
|
|
1347
1019
|
if (platform === 'win32' && /\{\{[^{}]+\}\}/.test(command)) {
|
|
1348
1020
|
throw new Error('run.command with {{…}} placeholders is not supported on Windows: the values come from an ' +
|
|
@@ -1350,37 +1022,27 @@ export function assertShellSubstitutionSupported(command, platform = process.pla
|
|
|
1350
1022
|
'command with no placeholders.');
|
|
1351
1023
|
}
|
|
1352
1024
|
}
|
|
1353
|
-
/** Expand built-in and user-defined template variables in a job's prompt string. */
|
|
1354
1025
|
export function resolveJobPrompt(config, context) {
|
|
1355
1026
|
const now = new Date();
|
|
1356
1027
|
const tz = config.timezone || Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
1357
1028
|
const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
|
|
1358
|
-
// Compute date/day/time in the job's configured timezone
|
|
1359
|
-
// Use Intl.DateTimeFormat to get the weekday name directly in the target timezone
|
|
1360
1029
|
const localDayName = new Intl.DateTimeFormat('en-US', { timeZone: tz, weekday: 'long' }).format(now);
|
|
1361
1030
|
const localDay = days.includes(localDayName) ? localDayName : days[now.getDay()];
|
|
1362
|
-
const localDate = now.toLocaleDateString('en-CA', { timeZone: tz });
|
|
1363
|
-
const localTime = now.toLocaleTimeString('en-GB', { timeZone: tz, hour12: false });
|
|
1031
|
+
const localDate = now.toLocaleDateString('en-CA', { timeZone: tz });
|
|
1032
|
+
const localTime = now.toLocaleTimeString('en-GB', { timeZone: tz, hour12: false });
|
|
1364
1033
|
let prompt = config.prompt;
|
|
1365
|
-
// Built-in variables (timezone-aware)
|
|
1366
1034
|
prompt = prompt.replace(/\{day\}/g, localDay);
|
|
1367
1035
|
prompt = prompt.replace(/\{date\}/g, localDate);
|
|
1368
1036
|
prompt = prompt.replace(/\{time\}/g, localTime);
|
|
1369
1037
|
prompt = prompt.replace(/\{job_name\}/g, config.name);
|
|
1370
|
-
// User-defined variables
|
|
1371
1038
|
if (config.variables) {
|
|
1372
1039
|
for (const [key, value] of Object.entries(config.variables)) {
|
|
1373
1040
|
prompt = prompt.replace(new RegExp(`\\{${key}\\}`, 'g'), value);
|
|
1374
1041
|
}
|
|
1375
1042
|
}
|
|
1376
|
-
// Webhook-driven variables ({{issue.identifier}}, {{updatedFrom.state.name}}, ...)
|
|
1377
1043
|
if (context) {
|
|
1378
1044
|
prompt = substituteWebhookPrompt(prompt, context);
|
|
1379
1045
|
}
|
|
1380
|
-
// Last report (special handling). Only a COMPLETED run's report is injected —
|
|
1381
|
-
// a failed run's report.md is the agent's error text (e.g. a login prompt on
|
|
1382
|
-
// an auth failure), and feeding that into the next prompt poisons every
|
|
1383
|
-
// subsequent run until a human intervenes.
|
|
1384
1046
|
const latestRun = getLatestCompletedRun(config.name);
|
|
1385
1047
|
if (latestRun) {
|
|
1386
1048
|
const reportPath = path.join(getJobRunsDir(config.name), latestRun.runId, 'report.md');
|
|
@@ -1397,10 +1059,6 @@ export function resolveJobPrompt(config, context) {
|
|
|
1397
1059
|
}
|
|
1398
1060
|
return prompt;
|
|
1399
1061
|
}
|
|
1400
|
-
/** Parse a human-readable timeout string (e.g. "10m", "2h", "1h30m", "3d", "1w") into milliseconds.
|
|
1401
|
-
* Accepts combinations of w (weeks), d (days), h (hours), m (minutes).
|
|
1402
|
-
* Returns null if the string is empty, matches nothing, totals zero, or exceeds 1 week.
|
|
1403
|
-
*/
|
|
1404
1062
|
export function parseTimeout(timeout) {
|
|
1405
1063
|
const match = timeout.match(/^(?:(\d+)w)?(?:(\d+)d)?(?:(\d+)h)?(?:(\d+)m)?$/);
|
|
1406
1064
|
if (!match)
|
|
@@ -1412,12 +1070,11 @@ export function parseTimeout(timeout) {
|
|
|
1412
1070
|
const ms = ((weeks * 7 + days) * 24 * 60 + hours * 60 + minutes) * 60 * 1000;
|
|
1413
1071
|
if (ms <= 0)
|
|
1414
1072
|
return null;
|
|
1415
|
-
const ONE_WEEK_MS = 7 * 24 * 60 * 60 * 1000;
|
|
1073
|
+
const ONE_WEEK_MS = 7 * 24 * 60 * 60 * 1000;
|
|
1416
1074
|
if (ms > ONE_WEEK_MS)
|
|
1417
1075
|
return null;
|
|
1418
1076
|
return ms;
|
|
1419
1077
|
}
|
|
1420
|
-
/** List all run metadata entries for a job, sorted chronologically. */
|
|
1421
1078
|
export function listRuns(jobName) {
|
|
1422
1079
|
const jobRunsDir = getJobRunsDir(jobName);
|
|
1423
1080
|
if (!fs.existsSync(jobRunsDir))
|
|
@@ -1434,17 +1091,10 @@ export function listRuns(jobName) {
|
|
|
1434
1091
|
}
|
|
1435
1092
|
return runs;
|
|
1436
1093
|
}
|
|
1437
|
-
/** Get the most recent run for a job, or null if never run. */
|
|
1438
1094
|
export function getLatestRun(jobName) {
|
|
1439
1095
|
const runs = listRuns(jobName);
|
|
1440
1096
|
return runs.length > 0 ? runs[runs.length - 1] : null;
|
|
1441
1097
|
}
|
|
1442
|
-
/**
|
|
1443
|
-
* Get the most recent COMPLETED run for a job, or null if none has completed.
|
|
1444
|
-
* Used to resolve `{last_report}` so a failed run's error text (e.g. an auth
|
|
1445
|
-
* login prompt written into report.md) can never be injected into the next
|
|
1446
|
-
* run's prompt.
|
|
1447
|
-
*/
|
|
1448
1098
|
export function getLatestCompletedRun(jobName) {
|
|
1449
1099
|
const runs = listRuns(jobName);
|
|
1450
1100
|
for (let i = runs.length - 1; i >= 0; i--) {
|
|
@@ -1453,11 +1103,6 @@ export function getLatestCompletedRun(jobName) {
|
|
|
1453
1103
|
}
|
|
1454
1104
|
return null;
|
|
1455
1105
|
}
|
|
1456
|
-
/**
|
|
1457
|
-
* Fold a job's run history (`listRuns`) into a duration + outcome summary.
|
|
1458
|
-
* `missed` fires (no process ever ran) carry no `duration` and are excluded
|
|
1459
|
-
* from the latency percentiles but still counted in `count`/`missed`.
|
|
1460
|
-
*/
|
|
1461
1106
|
export function routineStats(jobName) {
|
|
1462
1107
|
const runs = listRuns(jobName);
|
|
1463
1108
|
const failed = runs.filter((r) => r.status === 'failed' || r.status === 'timeout').length;
|
|
@@ -1478,14 +1123,12 @@ export function routineStats(jobName) {
|
|
|
1478
1123
|
p95: Math.round(percentile(durations, 95)),
|
|
1479
1124
|
};
|
|
1480
1125
|
}
|
|
1481
|
-
/** Persist run metadata to its run directory as meta.json. */
|
|
1482
1126
|
export function writeRunMeta(meta) {
|
|
1483
1127
|
ensureAgentsDir();
|
|
1484
1128
|
const runDir = path.join(getJobRunsDir(meta.jobName), meta.runId);
|
|
1485
1129
|
fs.mkdirSync(runDir, { recursive: true });
|
|
1486
1130
|
fs.writeFileSync(path.join(runDir, 'meta.json'), JSON.stringify(meta, null, 2), 'utf-8');
|
|
1487
1131
|
}
|
|
1488
|
-
/** Read run metadata from disk. Returns null if missing or corrupt. */
|
|
1489
1132
|
export function readRunMeta(jobName, runId) {
|
|
1490
1133
|
const metaPath = path.join(getJobRunsDir(jobName), runId, 'meta.json');
|
|
1491
1134
|
if (!fs.existsSync(metaPath))
|
|
@@ -1497,77 +1140,23 @@ export function readRunMeta(jobName, runId) {
|
|
|
1497
1140
|
return null;
|
|
1498
1141
|
}
|
|
1499
1142
|
}
|
|
1500
|
-
/**
|
|
1501
|
-
* Runs directory for a single job, with the (untrusted) job name contained to a
|
|
1502
|
-
* single segment beneath the runs dir — same guard as `getJobHomePath`. The name
|
|
1503
|
-
* comes from routine YAML and can arrive via a synced config repo; every runs-dir
|
|
1504
|
-
* sink (run dir, meta read/write, last-report read) routes through here so a
|
|
1505
|
-
* crafted `name` like `../../../../tmp/x` can't `mkdirSync`/write `stdout.log`,
|
|
1506
|
-
* `meta.json`, or `report.md` outside `~/.agents/.history/runs`.
|
|
1507
|
-
*/
|
|
1508
1143
|
export function getJobRunsDir(jobName) {
|
|
1509
1144
|
return safeJoin(getRunsDir(), jobName);
|
|
1510
1145
|
}
|
|
1511
|
-
/** Get the filesystem path for a specific run's directory. */
|
|
1512
1146
|
export function getRunDir(jobName, runId) {
|
|
1513
1147
|
return path.join(getJobRunsDir(jobName), runId);
|
|
1514
1148
|
}
|
|
1515
|
-
/**
|
|
1516
|
-
* The run id a scheduled fire is recorded under — derived from its intended UTC
|
|
1517
|
-
* fire time so the SAME slot always maps to the SAME run directory. This is what
|
|
1518
|
-
* makes the single-fire claim meaningful: a duplicate cron delivery for one slot
|
|
1519
|
-
* computes the same id and loses the atomic `mkdir` claim. Shares the derivation
|
|
1520
|
-
* with `missedRunId` (catchup.ts) so a missed-then-caught-up fire and a live fire
|
|
1521
|
-
* for the same UTC slot are one record.
|
|
1522
|
-
*/
|
|
1523
1149
|
export function slotRunId(scheduledFor) {
|
|
1524
1150
|
const iso = typeof scheduledFor === 'string' ? scheduledFor : scheduledFor.toISOString();
|
|
1525
1151
|
return iso.replace(/[:.]/g, '-');
|
|
1526
1152
|
}
|
|
1527
|
-
/**
|
|
1528
|
-
* Lookback windows for {@link alignedSlotForFire}, narrowest first. A wider
|
|
1529
|
-
* window is tried ONLY when the narrower one found no fire, so:
|
|
1530
|
-
* - a dense schedule (every-minute) resolves in the 1-hour window — ~60 steps,
|
|
1531
|
-
* not ~10080 — which matters because the forward-timer path now runs this on
|
|
1532
|
-
* every fire (a live fire is milliseconds past its boundary, so the narrowest
|
|
1533
|
-
* window always contains it);
|
|
1534
|
-
* - a sparse schedule (`0 9 1,13,25 * *` has 12-day gaps; monthly/quarterly/
|
|
1535
|
-
* annual) still resolves, because a fixed short window silently blinded
|
|
1536
|
-
* overdue detection to any cron whose gap exceeded it.
|
|
1537
|
-
* A narrower window can only ever find the true most-recent fire ≤ `at` or
|
|
1538
|
-
* nothing (never a wrong boundary), so prepending the cheap windows is
|
|
1539
|
-
* behavior-preserving for the sparse-schedule overdue path.
|
|
1540
|
-
*/
|
|
1541
1153
|
const HOUR_MS = 60 * 60 * 1000;
|
|
1542
1154
|
const DAY_MS = 24 * HOUR_MS;
|
|
1543
1155
|
const SLOT_LOOKBACK_WINDOWS_MS = [HOUR_MS, DAY_MS, 7 * DAY_MS, 32 * DAY_MS, 93 * DAY_MS, 400 * DAY_MS];
|
|
1544
|
-
/**
|
|
1545
|
-
* The aligned schedule boundary a fire belongs to: the most recent occurrence of
|
|
1546
|
-
* `cron` at or before `at`.
|
|
1547
|
-
*
|
|
1548
|
-
* This is the occurrence IDENTITY that {@link slotRunId} (forward dispatch) and
|
|
1549
|
-
* `missedRunId` (catchup.ts) must both key on. croner's `currentRun()` inside a
|
|
1550
|
-
* fire callback is the JITTERED wall-clock trigger instant (it carries
|
|
1551
|
-
* milliseconds — verified), not the aligned boundary, so keying `slotRunId`
|
|
1552
|
-
* directly on it produced a distinct id per delivery: two callbacks for one
|
|
1553
|
-
* occurrence each claimed a different run dir and both launched, and a live fire
|
|
1554
|
-
* never collided with its catch-up twin (which keys on the aligned
|
|
1555
|
-
* `previousExpectedFire`). Flooring both to this boundary is what makes the
|
|
1556
|
-
* single-fire claim a structural claim on `(routine, scheduledFor)` (SING-15).
|
|
1557
|
-
*
|
|
1558
|
-
* croner's `previousRun()` takes no argument and returns null on a freshly
|
|
1559
|
-
* constructed instance, so we walk `nextRun(cursor)` forward from a lookback
|
|
1560
|
-
* window and keep the last fire still ≤ `at` — the same derivation catchup's
|
|
1561
|
-
* overdue detection has always used.
|
|
1562
|
-
*/
|
|
1563
1156
|
export function alignedSlotForFire(cron, at) {
|
|
1564
1157
|
for (const window of SLOT_LOOKBACK_WINDOWS_MS) {
|
|
1565
1158
|
let cursor = new Date(at.getTime() - window);
|
|
1566
1159
|
let last = null;
|
|
1567
|
-
// Cap iterations: an every-minute schedule yields ≤ 10080 steps over a week;
|
|
1568
|
-
// 20k is a paranoia bound against pathological patterns. Only a schedule that
|
|
1569
|
-
// found nothing in the narrower window reaches a wider one, and such a
|
|
1570
|
-
// schedule is sparse, so the cap is never the binding constraint.
|
|
1571
1160
|
for (let i = 0; i < 20000; i++) {
|
|
1572
1161
|
const next = cron.nextRun(cursor);
|
|
1573
1162
|
if (!next || next.getTime() > at.getTime())
|
|
@@ -1580,19 +1169,11 @@ export function alignedSlotForFire(cron, at) {
|
|
|
1580
1169
|
}
|
|
1581
1170
|
return null;
|
|
1582
1171
|
}
|
|
1583
|
-
/**
|
|
1584
|
-
* Atomically CLAIM a run directory. Returns true on a successful claim, false
|
|
1585
|
-
* when the directory already exists (another caller — even in a separate process
|
|
1586
|
-
* — owns this (routine, slot) pair). The non-recursive `mkdir` is a single
|
|
1587
|
-
* filesystem test-and-set on every POSIX filesystem, the same primitive
|
|
1588
|
-
* `claimMissedFire` relies on; it holds across processes where an in-process flag
|
|
1589
|
-
* or a released lock cannot.
|
|
1590
|
-
*/
|
|
1591
1172
|
export function claimRunSlot(jobName, runId) {
|
|
1592
1173
|
const runDir = getRunDir(jobName, runId);
|
|
1593
1174
|
fs.mkdirSync(path.dirname(runDir), { recursive: true });
|
|
1594
1175
|
try {
|
|
1595
|
-
fs.mkdirSync(runDir);
|
|
1176
|
+
fs.mkdirSync(runDir);
|
|
1596
1177
|
return true;
|
|
1597
1178
|
}
|
|
1598
1179
|
catch (err) {
|
|
@@ -1601,7 +1182,6 @@ export function claimRunSlot(jobName, runId) {
|
|
|
1601
1182
|
throw err;
|
|
1602
1183
|
}
|
|
1603
1184
|
}
|
|
1604
|
-
/** Discover routine YAML files in a repository's routines/ directory. */
|
|
1605
1185
|
export function discoverJobsFromRepo(repoPath) {
|
|
1606
1186
|
const jobsPath = path.join(repoPath, 'routines');
|
|
1607
1187
|
if (!fs.existsSync(jobsPath))
|
|
@@ -1613,26 +1193,9 @@ export function discoverJobsFromRepo(repoPath) {
|
|
|
1613
1193
|
path: path.join(jobsPath, f),
|
|
1614
1194
|
}));
|
|
1615
1195
|
}
|
|
1616
|
-
/** Check whether a job with the given name exists on disk. */
|
|
1617
1196
|
export function jobExists(name) {
|
|
1618
1197
|
return readJob(name) !== null;
|
|
1619
1198
|
}
|
|
1620
|
-
/**
|
|
1621
|
-
* True when `sourcePath` already IS the canonical user-layer file for `name`.
|
|
1622
|
-
*
|
|
1623
|
-
* `agents routines add <file>` copies a definition into the routines dir, but
|
|
1624
|
-
* users routinely point it at the file that already lives there — the release
|
|
1625
|
-
* train's own `~/.agents/routines/release-train.yml`. `writeJob` would then
|
|
1626
|
-
* re-serialize that file in place and, per {@link serializeJob}, delete every
|
|
1627
|
-
* key absent from the canonical output — silently dropping the legacy
|
|
1628
|
-
* `devices:` pin from config tracked in the git-backed `~/.agents` repo
|
|
1629
|
-
* (RUSH-2517). Callers use this to skip the write when there is nothing to
|
|
1630
|
-
* copy.
|
|
1631
|
-
*
|
|
1632
|
-
* Compares real paths so a symlinked `~/.agents` (the normal layout) still
|
|
1633
|
-
* matches, and falls back to a resolved-path compare when either side cannot be
|
|
1634
|
-
* realpath'd.
|
|
1635
|
-
*/
|
|
1636
1199
|
export function isCanonicalRoutineSource(sourcePath, name) {
|
|
1637
1200
|
const jobsDir = getRoutinesDir();
|
|
1638
1201
|
const real = (p) => {
|
|
@@ -1646,7 +1209,6 @@ export function isCanonicalRoutineSource(sourcePath, name) {
|
|
|
1646
1209
|
const source = real(sourcePath);
|
|
1647
1210
|
return ['.yml', '.yaml'].some((ext) => real(safeJoin(jobsDir, name + ext)) === source);
|
|
1648
1211
|
}
|
|
1649
|
-
/** Get the filesystem path of a job's YAML config file, or null if not found. */
|
|
1650
1212
|
export function getJobPath(name) {
|
|
1651
1213
|
const jobsDir = getRoutinesDir();
|
|
1652
1214
|
for (const ext of ['.yml', '.yaml']) {
|
|
@@ -1657,17 +1219,6 @@ export function getJobPath(name) {
|
|
|
1657
1219
|
}
|
|
1658
1220
|
return null;
|
|
1659
1221
|
}
|
|
1660
|
-
/**
|
|
1661
|
-
* Resolve a routine's YAML across EVERY layer `listJobs`/`readJob` read — user
|
|
1662
|
-
* then system — not just the user dir.
|
|
1663
|
-
*
|
|
1664
|
-
* `getJobPath` is user-layer only because its callers write there. Read paths
|
|
1665
|
-
* that ask "when did this routine come to exist" need the system layer too:
|
|
1666
|
-
* a built-in shipped in the system repo has no user-layer file and no
|
|
1667
|
-
* `createdAt`, so a user-layer-only lookup returns null, the overdue floor is
|
|
1668
|
-
* skipped, and the routine reads as instantly overdue on first daemon start —
|
|
1669
|
-
* exactly the case the floor exists to prevent.
|
|
1670
|
-
*/
|
|
1671
1222
|
export function resolveJobFilePath(name) {
|
|
1672
1223
|
const userPath = getJobPath(name);
|
|
1673
1224
|
if (userPath)
|
|
@@ -1679,16 +1230,7 @@ export function resolveJobFilePath(name) {
|
|
|
1679
1230
|
}
|
|
1680
1231
|
return null;
|
|
1681
1232
|
}
|
|
1682
|
-
/**
|
|
1683
|
-
* Parse an "at" time string into a one-shot cron expression.
|
|
1684
|
-
* Supports formats like:
|
|
1685
|
-
* - "9:00" or "09:00" - today at 9:00 AM (or tomorrow if past)
|
|
1686
|
-
* - "14:30" - today at 2:30 PM
|
|
1687
|
-
* - "2026-02-24 09:00" - specific date and time
|
|
1688
|
-
* Returns null if invalid format.
|
|
1689
|
-
*/
|
|
1690
1233
|
export function parseAtTime(atTime) {
|
|
1691
|
-
// Try parsing as "HH:MM" format
|
|
1692
1234
|
const timeMatch = atTime.match(/^(\d{1,2}):(\d{2})$/);
|
|
1693
1235
|
if (timeMatch) {
|
|
1694
1236
|
const hour = parseInt(timeMatch[1], 10);
|
|
@@ -1698,16 +1240,13 @@ export function parseAtTime(atTime) {
|
|
|
1698
1240
|
const now = new Date();
|
|
1699
1241
|
let targetDate = new Date();
|
|
1700
1242
|
targetDate.setHours(hour, minute, 0, 0);
|
|
1701
|
-
// If the time has already passed today, schedule for tomorrow
|
|
1702
1243
|
if (targetDate <= now) {
|
|
1703
1244
|
targetDate.setDate(targetDate.getDate() + 1);
|
|
1704
1245
|
}
|
|
1705
1246
|
const day = targetDate.getDate();
|
|
1706
1247
|
const month = targetDate.getMonth() + 1;
|
|
1707
|
-
// Cron format: minute hour day month *
|
|
1708
1248
|
return { schedule: `${minute} ${hour} ${day} ${month} *`, runOnce: true };
|
|
1709
1249
|
}
|
|
1710
|
-
// Try parsing as "YYYY-MM-DD HH:MM" format
|
|
1711
1250
|
const dateTimeMatch = atTime.match(/^(\d{4})-(\d{2})-(\d{2})\s+(\d{1,2}):(\d{2})$/);
|
|
1712
1251
|
if (dateTimeMatch) {
|
|
1713
1252
|
const year = parseInt(dateTimeMatch[1], 10);
|
|
@@ -1719,13 +1258,10 @@ export function parseAtTime(atTime) {
|
|
|
1719
1258
|
return null;
|
|
1720
1259
|
if (hour < 0 || hour > 23 || minute < 0 || minute > 59)
|
|
1721
1260
|
return null;
|
|
1722
|
-
// Note: croner doesn't support year, so we just use month/day
|
|
1723
|
-
// The job will fire on that date each year unless removed
|
|
1724
1261
|
return { schedule: `${minute} ${hour} ${day} ${month} *`, runOnce: true };
|
|
1725
1262
|
}
|
|
1726
1263
|
return null;
|
|
1727
1264
|
}
|
|
1728
|
-
/** List all job names that have run directories. */
|
|
1729
1265
|
export function listJobsWithRuns() {
|
|
1730
1266
|
const runsDir = getRunsDir();
|
|
1731
1267
|
if (!fs.existsSync(runsDir))
|
|
@@ -1734,7 +1270,6 @@ export function listJobsWithRuns() {
|
|
|
1734
1270
|
.filter((e) => e.isDirectory())
|
|
1735
1271
|
.map((e) => e.name);
|
|
1736
1272
|
}
|
|
1737
|
-
/** Count total runs across all jobs. */
|
|
1738
1273
|
export function countAllRuns() {
|
|
1739
1274
|
let total = 0;
|
|
1740
1275
|
for (const jobName of listJobsWithRuns()) {
|
|
@@ -1742,7 +1277,6 @@ export function countAllRuns() {
|
|
|
1742
1277
|
}
|
|
1743
1278
|
return total;
|
|
1744
1279
|
}
|
|
1745
|
-
/** Preview runs that would be pruned (keeping only the most recent `keep` per job). */
|
|
1746
1280
|
export function previewRunsPrune(keep) {
|
|
1747
1281
|
const toPrune = [];
|
|
1748
1282
|
for (const jobName of listJobsWithRuns()) {
|
|
@@ -1756,7 +1290,6 @@ export function previewRunsPrune(keep) {
|
|
|
1756
1290
|
}
|
|
1757
1291
|
return toPrune;
|
|
1758
1292
|
}
|
|
1759
|
-
/** Delete old runs, keeping only the most recent `keep` per job. Returns bytes freed and run count. */
|
|
1760
1293
|
export function pruneRuns(keep) {
|
|
1761
1294
|
let deleted = 0;
|
|
1762
1295
|
let bytesFreed = 0;
|
|
@@ -1788,7 +1321,7 @@ function getDirSize(dirPath) {
|
|
|
1788
1321
|
try {
|
|
1789
1322
|
size += fs.statSync(fullPath).size;
|
|
1790
1323
|
}
|
|
1791
|
-
catch {
|
|
1324
|
+
catch { }
|
|
1792
1325
|
}
|
|
1793
1326
|
}
|
|
1794
1327
|
return size;
|