@phnx-labs/agents-cli 1.22.113 → 1.22.115
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 +139 -0
- package/README.md +32 -113
- package/dist/browser.js +0 -0
- package/dist/cli/command-registry.d.ts +0 -60
- package/dist/cli/command-registry.js +57 -66
- package/dist/commands/accounts.d.ts +3 -77
- package/dist/commands/accounts.js +13 -366
- package/dist/commands/apply.d.ts +0 -4
- package/dist/commands/apply.js +3 -3
- package/dist/commands/audit.js +1 -1
- package/dist/commands/auth.js +0 -2
- package/dist/commands/browser-picker.d.ts +3 -6
- package/dist/commands/browser-picker.js +2 -2
- package/dist/commands/browser-sessions-picker.d.ts +2 -1
- package/dist/commands/browser.d.ts +53 -0
- package/dist/commands/browser.js +199 -9
- package/dist/commands/computer-sessions-picker.d.ts +2 -1
- package/dist/commands/computer.d.ts +14 -19
- package/dist/commands/computer.js +65 -10
- package/dist/commands/config.js +46 -2
- package/dist/commands/daemon.d.ts +0 -23
- package/dist/commands/daemon.js +1 -1
- package/dist/commands/detach-core.d.ts +2 -1
- package/dist/commands/detach.d.ts +0 -3
- package/dist/commands/detach.js +3 -3
- package/dist/commands/doctor.d.ts +2 -3
- package/dist/commands/doctor.js +0 -11
- package/dist/commands/events.d.ts +1 -3
- package/dist/commands/events.js +4 -7
- package/dist/commands/exec.d.ts +0 -1
- package/dist/commands/exec.js +2 -7
- package/dist/commands/feed-watch.js +52 -8
- package/dist/commands/feed.d.ts +3 -3
- package/dist/commands/feed.js +1 -1
- package/dist/commands/focus.d.ts +4 -4
- package/dist/commands/focus.js +1 -1
- package/dist/commands/go.d.ts +0 -17
- package/dist/commands/go.js +2 -19
- package/dist/commands/harness-hooks.d.ts +0 -7
- package/dist/commands/harness-hooks.js +1 -1
- package/dist/commands/harness-wizard.d.ts +2 -2
- package/dist/commands/harness.d.ts +3 -8
- package/dist/commands/harness.js +1 -1
- package/dist/commands/inspect.d.ts +2 -3
- package/dist/commands/inspect.js +1 -1
- package/dist/commands/logs.js +1 -1
- package/dist/commands/mcp.js +8 -83
- package/dist/commands/memory.js +4 -47
- package/dist/commands/message.d.ts +1 -1
- package/dist/commands/message.js +7 -7
- package/dist/commands/plugins.js +1 -93
- package/dist/commands/projects.d.ts +2 -18
- package/dist/commands/projects.js +89 -3
- package/dist/commands/repo.js +0 -44
- package/dist/commands/resource-view.d.ts +3 -2
- package/dist/commands/resume.d.ts +0 -1
- package/dist/commands/resume.js +5 -2
- package/dist/commands/routines.d.ts +1 -3
- package/dist/commands/routines.js +1 -1
- package/dist/commands/run-account-picker.d.ts +2 -1
- package/dist/commands/run-broadcast.d.ts +2 -1
- package/dist/commands/run-device-picker.d.ts +2 -1
- package/dist/commands/secrets-passthrough.d.ts +14 -0
- package/dist/commands/secrets-passthrough.js +23 -4
- package/dist/commands/send.d.ts +4 -4
- package/dist/commands/send.js +6 -51
- package/dist/commands/sessions-backfill.d.ts +2 -35
- package/dist/commands/sessions-backfill.js +1 -1
- package/dist/commands/sessions-backup-setup.js +1 -1
- package/dist/commands/sessions-bookmark.d.ts +0 -10
- package/dist/commands/sessions-bookmark.js +1 -1
- package/dist/commands/sessions-inject.d.ts +2 -3
- package/dist/commands/sessions-inject.js +8 -17
- package/dist/commands/sessions-picker-factory.d.ts +4 -14
- package/dist/commands/sessions-picker-factory.js +2 -2
- package/dist/commands/sessions-picker.d.ts +3 -9
- package/dist/commands/sessions-picker.js +2 -2
- package/dist/commands/sessions-resume.d.ts +2 -4
- package/dist/commands/sessions-resume.js +0 -6
- package/dist/commands/sessions-share.d.ts +5 -7
- package/dist/commands/sessions-share.js +98 -49
- package/dist/commands/sessions-stats.d.ts +2 -1
- package/dist/commands/sessions-stop.d.ts +0 -3
- package/dist/commands/sessions-stop.js +1 -1
- package/dist/commands/sessions-tail.d.ts +2 -1
- package/dist/commands/sessions-trace.d.ts +4 -6
- package/dist/commands/sessions-trace.js +1 -1
- package/dist/commands/sessions.d.ts +13 -104
- package/dist/commands/sessions.js +11 -18
- package/dist/commands/setup-browser.js +18 -2
- package/dist/commands/setup-computer.js +20 -6
- package/dist/commands/setup-mine.d.ts +0 -6
- package/dist/commands/setup-mine.js +1 -1
- package/dist/commands/setup-secrets.js +24 -4
- package/dist/commands/setup-terminal.d.ts +3 -0
- package/dist/commands/setup-terminal.js +22 -0
- package/dist/commands/setup.d.ts +3 -4
- package/dist/commands/setup.js +21 -11
- package/dist/commands/skills.js +0 -8
- package/dist/commands/ssh.d.ts +6 -0
- package/dist/commands/ssh.js +92 -233
- package/dist/commands/sync.js +14 -5
- package/dist/commands/teams-picker.d.ts +2 -5
- package/dist/commands/teams-picker.js +2 -2
- package/dist/commands/teams.d.ts +1 -7
- package/dist/commands/teams.js +2 -2
- package/dist/commands/tmux.d.ts +1 -1
- package/dist/commands/tmux.js +1 -1
- package/dist/commands/traces.js +1 -1
- package/dist/commands/upgrade.d.ts +2 -1
- package/dist/commands/utils.d.ts +1 -1
- package/dist/commands/utils.js +1 -1
- package/dist/lib/account-capabilities.d.ts +2 -1
- package/dist/lib/account-catalog.d.ts +4 -13
- package/dist/lib/account-catalog.js +1 -1
- package/dist/lib/account-registry.d.ts +3 -4
- package/dist/lib/account-registry.js +1 -1
- package/dist/lib/accounting/account-launch.d.ts +4 -3
- package/dist/lib/accounting/account-pool.d.ts +2 -1
- package/dist/lib/accounting/rotate.d.ts +3 -9
- package/dist/lib/accounting/rotate.js +2 -14
- package/dist/lib/accounting/usage-sync.d.ts +5 -4
- package/dist/lib/accounting/usage.d.ts +7 -31
- package/dist/lib/accounting/usage.js +4 -4
- package/dist/lib/accounts/add.d.ts +0 -5
- package/dist/lib/accounts/add.js +1 -7
- package/dist/lib/accounts/migrate.d.ts +8 -8
- package/dist/lib/accounts/migrate.js +1 -1
- package/dist/lib/acp/client.d.ts +3 -2
- package/dist/lib/acp/harnesses.d.ts +2 -2
- package/dist/lib/acp/harnesses.js +1 -1
- package/dist/lib/acp/run.d.ts +2 -1
- package/dist/lib/actor.d.ts +3 -2
- package/dist/lib/add-dir.d.ts +2 -17
- package/dist/lib/add-dir.js +2 -6
- package/dist/lib/address.d.ts +56 -0
- package/dist/lib/address.js +143 -0
- package/dist/lib/agent-spec/agents.d.ts +12 -28
- package/dist/lib/agent-spec/agents.js +2 -6
- package/dist/lib/agent-spec/primitives.d.ts +0 -7
- package/dist/lib/agent-spec/primitives.js +0 -6
- package/dist/lib/agent-spec/types.d.ts +2 -1
- package/dist/lib/analytics/dashboard.d.ts +1 -5
- package/dist/lib/analytics/dashboard.js +0 -2
- package/dist/lib/analytics/mix-commands.d.ts +0 -7
- package/dist/lib/analytics/mix-commands.js +3 -3
- package/dist/lib/analytics/recipes.d.ts +0 -12
- package/dist/lib/analytics/recipes.js +7 -31
- package/dist/lib/analytics/usage-db.d.ts +5 -32
- package/dist/lib/analytics/usage-db.js +1 -70
- package/dist/lib/answer-router.d.ts +7 -6
- package/dist/lib/answer-router.js +5 -11
- package/dist/lib/artifact-actions.d.ts +0 -4
- package/dist/lib/artifacts-client.d.ts +20 -0
- package/dist/lib/artifacts-client.js +46 -0
- package/dist/lib/ask-classifier.d.ts +3 -4
- package/dist/lib/ask-classifier.js +0 -7
- package/dist/lib/auth-health.d.ts +3 -46
- package/dist/lib/auth-health.js +3 -3
- package/dist/lib/auth-mint.d.ts +6 -6
- package/dist/lib/auth-mint.js +7 -7
- package/dist/lib/bench/runner.d.ts +2 -2
- package/dist/lib/bench/runner.js +1 -1
- package/dist/lib/bench/storage.d.ts +0 -1
- package/dist/lib/bench/storage.js +1 -1
- package/dist/lib/boot-profile.d.ts +0 -2
- package/dist/lib/boot-profile.js +0 -4
- package/dist/lib/brand.d.ts +0 -6
- package/dist/lib/brand.js +1 -1
- package/dist/lib/browser/arc-discovery.d.ts +4 -12
- package/dist/lib/browser/arc-discovery.js +1 -1
- package/dist/lib/browser/cdp.d.ts +1 -1
- package/dist/lib/browser/chrome.d.ts +2 -2
- package/dist/lib/browser/chrome.js +0 -4
- package/dist/lib/browser/chromium-discovery.d.ts +3 -2
- package/dist/lib/browser/drivers/arc.d.ts +3 -20
- package/dist/lib/browser/drivers/arc.js +2 -7
- package/dist/lib/browser/drivers/firefox.d.ts +2 -6
- package/dist/lib/browser/drivers/firefox.js +1 -1
- package/dist/lib/browser/drivers/local.d.ts +2 -1
- package/dist/lib/browser/drivers/ssh.d.ts +2 -3
- package/dist/lib/browser/drivers/ssh.js +0 -7
- package/dist/lib/browser/firefox-discovery.d.ts +4 -3
- package/dist/lib/browser/har.d.ts +8 -7
- package/dist/lib/browser/hygiene.d.ts +2 -3
- package/dist/lib/browser/hygiene.js +1 -1
- package/dist/lib/browser/ipc.d.ts +4 -3
- package/dist/lib/browser/ipc.js +1 -1
- package/dist/lib/browser/login-detection.d.ts +1 -8
- package/dist/lib/browser/registry.d.ts +2 -1
- package/dist/lib/browser/remote-control.d.ts +0 -7
- package/dist/lib/browser/remote-control.js +2 -2
- package/dist/lib/browser/resolve-target.d.ts +2 -6
- package/dist/lib/browser/resolve-target.js +3 -3
- package/dist/lib/browser/runtime-state.d.ts +59 -4
- package/dist/lib/browser/runtime-state.js +99 -18
- package/dist/lib/browser/service.d.ts +4 -4
- package/dist/lib/browser/service.js +21 -1
- package/dist/lib/browser/sessions-list.d.ts +0 -10
- package/dist/lib/browser/sessions-list.js +3 -3
- package/dist/lib/browser/stream.d.ts +2 -1
- package/dist/lib/browser/task-index.d.ts +4 -4
- package/dist/lib/browser/task-index.js +1 -1
- package/dist/lib/browser/types.d.ts +0 -20
- package/dist/lib/browser/types.js +1 -34
- package/dist/lib/browser/upload.d.ts +0 -27
- package/dist/lib/budget/ledger.d.ts +0 -2
- package/dist/lib/budget/ledger.js +1 -1
- package/dist/lib/budget/live-cloud.d.ts +2 -1
- package/dist/lib/budget/preflight.d.ts +3 -5
- package/dist/lib/budget/preflight.js +1 -1
- package/dist/lib/catchup.d.ts +2 -1
- package/dist/lib/channels/owner-forward.d.ts +5 -4
- package/dist/lib/channels/owner-sink.js +2 -2
- package/dist/lib/channels/providers/desktop.js +1 -1
- package/dist/lib/channels/providers/rush.d.ts +2 -1
- package/dist/lib/channels/registry.d.ts +1 -1
- package/dist/lib/channels/registry.js +1 -1
- package/dist/lib/channels/resolve.d.ts +3 -2
- package/dist/lib/channels/send.d.ts +5 -4
- package/dist/lib/cli-resources.d.ts +3 -9
- package/dist/lib/cli-resources.js +4 -2
- package/dist/lib/cloud/cursor.d.ts +1 -2
- package/dist/lib/cloud/cursor.js +1 -1
- package/dist/lib/cloud/dispatch.d.ts +2 -1
- package/dist/lib/cloud/dispatch.js +1 -1
- package/dist/lib/cloud/factory.d.ts +0 -2
- package/dist/lib/cloud/factory.js +1 -1
- package/dist/lib/cloud/rush.d.ts +3 -11
- package/dist/lib/cloud/rush.js +1 -1
- package/dist/lib/cloud/session-index.d.ts +2 -1
- package/dist/lib/cloud/types.d.ts +2 -1
- package/dist/lib/cloudflare/creds.d.ts +10 -0
- package/dist/lib/cloudflare/creds.js +46 -0
- package/dist/lib/cloudflare/provision.d.ts +35 -0
- package/dist/lib/cloudflare/provision.js +144 -0
- package/dist/lib/codex-policy.d.ts +2 -1
- package/dist/lib/commands.d.ts +7 -7
- package/dist/lib/commands.js +1 -1
- package/dist/lib/comms-render.d.ts +1 -1
- package/dist/lib/computer/context.d.ts +11 -3
- package/dist/lib/computer/context.js +2 -2
- package/dist/lib/computer/policy.d.ts +0 -12
- package/dist/lib/computer/policy.js +1 -1
- package/dist/lib/computer/sessions-list.d.ts +55 -0
- package/dist/lib/computer/sessions-list.js +168 -1
- package/dist/lib/computer-client.d.ts +3 -3
- package/dist/lib/computer-client.js +0 -1
- package/dist/lib/concurrency.d.ts +2 -1
- package/dist/lib/config-keys.d.ts +16 -3
- package/dist/lib/config-keys.js +47 -2
- package/dist/lib/convert.d.ts +0 -12
- package/dist/lib/convert.js +1 -12
- package/dist/lib/crabbox/cli.d.ts +6 -24
- package/dist/lib/crabbox/cli.js +2 -28
- package/dist/lib/crabbox/lease.d.ts +5 -6
- package/dist/lib/crabbox/lease.js +1 -1
- package/dist/lib/crabbox/progress.d.ts +2 -1
- package/dist/lib/crabbox/setup-copy.d.ts +2 -3
- package/dist/lib/crabbox/setup-copy.js +1 -1
- package/dist/lib/daemon/account-state-daemon-service.d.ts +1 -1
- package/dist/lib/daemon/attention-notify-service.d.ts +2 -1
- package/dist/lib/daemon/catchup-service.d.ts +2 -1
- package/dist/lib/daemon/daemon.d.ts +4 -4
- package/dist/lib/daemon/daemon.js +9 -2
- package/dist/lib/daemon/feed-stream-service.d.ts +23 -0
- package/dist/lib/daemon/feed-stream-service.js +40 -0
- package/dist/lib/daemon/harness-update-service.d.ts +2 -19
- package/dist/lib/daemon/harness-update-service.js +3 -3
- package/dist/lib/daemon/runner.d.ts +3 -3
- package/dist/lib/daemon/self-update-service.d.ts +1 -16
- package/dist/lib/daemon/self-update-service.js +6 -6
- package/dist/lib/daemon/state-dir-check-service.d.ts +2 -1
- package/dist/lib/daemon/supervisor.d.ts +3 -2
- package/dist/lib/daemon-services.d.ts +3 -2
- package/dist/lib/daemon-services.js +5 -0
- package/dist/lib/daemon-webhooks.d.ts +1 -1
- package/dist/lib/deeplink/register.d.ts +3 -13
- package/dist/lib/deeplink/register.js +3 -3
- package/dist/lib/deeplink/url.d.ts +3 -2
- package/dist/lib/device-config.d.ts +4 -15
- package/dist/lib/device-config.js +164 -8
- package/dist/lib/devices/connect.d.ts +51 -6
- package/dist/lib/devices/connect.js +169 -21
- package/dist/lib/devices/discovery-policy.d.ts +3 -2
- package/dist/lib/devices/doctor-findings.js +1 -1
- package/dist/lib/devices/doctor-overview-cache.d.ts +3 -2
- package/dist/lib/devices/fleet-divergence.d.ts +2 -1
- package/dist/lib/devices/fleet.d.ts +3 -4
- package/dist/lib/devices/fleet.js +1 -1
- package/dist/lib/devices/harness-inventory.d.ts +3 -2
- package/dist/lib/devices/health-report.d.ts +3 -2
- package/dist/lib/devices/health.d.ts +1 -8
- package/dist/lib/devices/health.js +1 -1
- package/dist/lib/devices/interactive-host.d.ts +0 -2
- package/dist/lib/devices/interactive-host.js +1 -1
- package/dist/lib/devices/known-hosts.d.ts +2 -20
- package/dist/lib/devices/known-hosts.js +2 -2
- package/dist/lib/devices/pool.d.ts +2 -1
- package/dist/lib/devices/resolve-target.d.ts +2 -2
- package/dist/lib/devices/rollout-verify.d.ts +3 -2
- package/dist/lib/devices/stats-cache.d.ts +3 -2
- package/dist/lib/devices/sync.d.ts +6 -5
- package/dist/lib/devices/worker-pick.d.ts +3 -12
- package/dist/lib/devices/worker-pick.js +1 -1
- package/dist/lib/diff-text.d.ts +2 -1
- package/dist/lib/doctor-diff.d.ts +2 -1
- package/dist/lib/drift-sync.d.ts +3 -2
- package/dist/lib/drift.d.ts +3 -3
- package/dist/lib/drift.js +1 -1
- package/dist/lib/event-families.d.ts +0 -6
- package/dist/lib/event-families.js +3 -3
- package/dist/lib/event-provenance.d.ts +2 -1
- package/dist/lib/events-ingest.d.ts +4 -3
- package/dist/lib/exec-account-home.d.ts +2 -4
- package/dist/lib/exec-account-home.js +1 -1
- package/dist/lib/exec-bounded.d.ts +3 -4
- package/dist/lib/exec-bounded.js +1 -1
- package/dist/lib/exec.d.ts +6 -18
- package/dist/lib/exec.js +1 -1
- package/dist/lib/factory/snapshot.d.ts +2 -2
- package/dist/lib/factory/snapshot.js +1 -1
- package/dist/lib/feed/activity-stream.d.ts +2 -5
- package/dist/lib/feed/activity-stream.js +2 -2
- package/dist/lib/feed/activity.d.ts +8 -33
- package/dist/lib/feed/activity.js +8 -8
- package/dist/lib/feed/answer.d.ts +3 -2
- package/dist/lib/feed/attention.js +5 -1
- package/dist/lib/feed/envelope.d.ts +79 -0
- package/dist/lib/feed/envelope.js +23 -0
- package/dist/lib/feed/events.d.ts +8 -47
- package/dist/lib/feed/events.js +9 -141
- package/dist/lib/feed/feed.d.ts +9 -42
- package/dist/lib/feed/feed.js +1 -60
- package/dist/lib/feed/hub-server.d.ts +86 -0
- package/dist/lib/feed/hub-server.js +334 -0
- package/dist/lib/feed/hub.d.ts +95 -0
- package/dist/lib/feed/hub.js +255 -0
- package/dist/lib/feed/pr-status.d.ts +0 -2
- package/dist/lib/feed/pr-status.js +1 -5
- package/dist/lib/feed/tool-activity.d.ts +108 -0
- package/dist/lib/feed/tool-activity.js +313 -0
- package/dist/lib/feed/tools.d.ts +198 -0
- package/dist/lib/feed/tools.js +265 -0
- package/dist/lib/feed/watch.d.ts +51 -52
- package/dist/lib/feed/watch.js +147 -17
- package/dist/lib/feed-broadcast.d.ts +5 -47
- package/dist/lib/feed-broadcast.js +9 -9
- package/dist/lib/feed-outcome.d.ts +3 -6
- package/dist/lib/feed-outcome.js +2 -2
- package/dist/lib/feed-policy.d.ts +5 -6
- package/dist/lib/feed-policy.js +2 -2
- package/dist/lib/feed-post.d.ts +3 -4
- package/dist/lib/feed-post.js +1 -1
- package/dist/lib/feed-ranking.d.ts +2 -2
- package/dist/lib/feed-ranking.js +1 -1
- package/dist/lib/fleet/apply.d.ts +5 -6
- package/dist/lib/fleet/apply.js +4 -4
- package/dist/lib/fleet/manifest.d.ts +2 -1
- package/dist/lib/fleet/remote-login.d.ts +18 -36
- package/dist/lib/fleet/remote-login.js +20 -19
- package/dist/lib/fleet/types.d.ts +0 -8
- package/dist/lib/fleet-cache.d.ts +1 -18
- package/dist/lib/fleet-cache.js +0 -5
- package/dist/lib/fleet-shared-repo-sync.d.ts +3 -3
- package/dist/lib/fleet-shared-repo-sync.js +1 -1
- package/dist/lib/fleet-shared-state.d.ts +3 -2
- package/dist/lib/format.d.ts +3 -2
- package/dist/lib/format.js +1 -1
- package/dist/lib/friction-heuristics.d.ts +2 -1
- package/dist/lib/fs-walk.d.ts +2 -1
- package/dist/lib/fuzzy.d.ts +2 -1
- package/dist/lib/gemini-settings.d.ts +0 -1
- package/dist/lib/gemini-settings.js +1 -1
- package/dist/lib/git.d.ts +7 -81
- package/dist/lib/git.js +2 -199
- package/dist/lib/github/gh-overload.d.ts +0 -4
- package/dist/lib/github/gh-overload.js +2 -2
- package/dist/lib/github/project-prs.d.ts +118 -0
- package/dist/lib/github/project-prs.js +173 -0
- package/dist/lib/github/rest.d.ts +2 -1
- package/dist/lib/harness/exec-config-version.d.ts +2 -1
- package/dist/lib/harness-auth-capabilities.d.ts +5 -4
- package/dist/lib/harness-connection-test.d.ts +2 -1
- package/dist/lib/heal.d.ts +3 -20
- package/dist/lib/heal.js +2 -39
- package/dist/lib/help.d.ts +3 -2
- package/dist/lib/helper-download.d.ts +0 -12
- package/dist/lib/helper-download.js +2 -2
- package/dist/lib/helper-versions.d.ts +2 -1
- package/dist/lib/helper-versions.js +1 -1
- package/dist/lib/hooks/install.d.ts +8 -49
- package/dist/lib/hooks/install.js +2 -96
- package/dist/lib/hooks/match.d.ts +2 -1
- package/dist/lib/hosts/credential-transport.d.ts +0 -2
- package/dist/lib/hosts/credential-transport.js +1 -1
- package/dist/lib/hosts/dispatch.d.ts +2 -24
- package/dist/lib/hosts/dispatch.js +2 -2
- package/dist/lib/hosts/logs.d.ts +2 -1
- package/dist/lib/hosts/passthrough.d.ts +1 -1
- package/dist/lib/hosts/passthrough.js +0 -1
- package/dist/lib/hosts/progress.d.ts +0 -5
- package/dist/lib/hosts/progress.js +1 -1
- package/dist/lib/hosts/ready.d.ts +3 -4
- package/dist/lib/hosts/ready.js +0 -8
- package/dist/lib/hosts/reconcile.d.ts +2 -8
- package/dist/lib/hosts/reconcile.js +1 -1
- package/dist/lib/hosts/reconnect.d.ts +4 -11
- package/dist/lib/hosts/reconnect.js +2 -2
- package/dist/lib/hosts/registry.d.ts +1 -1
- package/dist/lib/hosts/remote-cmd.d.ts +55 -4
- package/dist/lib/hosts/remote-cmd.js +125 -8
- package/dist/lib/hosts/remote-cmd.test-fixture.d.ts +2 -0
- package/dist/lib/hosts/remote-cmd.test-fixture.js +22 -0
- package/dist/lib/hosts/session-index.d.ts +3 -2
- package/dist/lib/hosts/ssh-config.d.ts +2 -3
- package/dist/lib/hosts/ssh-config.js +0 -10
- package/dist/lib/humans.d.ts +0 -2
- package/dist/lib/humans.js +2 -2
- package/dist/lib/import.d.ts +4 -3
- package/dist/lib/installations/installation-lock.d.ts +0 -2
- package/dist/lib/installations/installation-lock.js +2 -2
- package/dist/lib/installations/launch-gate.d.ts +0 -9
- package/dist/lib/installations/launch-gate.js +1 -1
- package/dist/lib/installations/migrate.d.ts +0 -11
- package/dist/lib/installations/migrate.js +1 -1
- package/dist/lib/installations/shims.d.ts +1 -1
- package/dist/lib/installations/shims.js +2 -2
- package/dist/lib/installations/update-runtime.js +1 -1
- package/dist/lib/linear-cache.d.ts +2 -1
- package/dist/lib/linux-userns.d.ts +2 -3
- package/dist/lib/linux-userns.js +0 -4
- package/dist/lib/loop.d.ts +2 -1
- package/dist/lib/mailbox-gc.d.ts +2 -1
- package/dist/lib/mailbox-target.d.ts +2 -1
- package/dist/lib/mailbox.d.ts +0 -6
- package/dist/lib/mailbox.js +1 -1
- package/dist/lib/manifest.d.ts +0 -14
- package/dist/lib/manifest.js +2 -2
- package/dist/lib/mcp-registry.d.ts +2 -1
- package/dist/lib/mcp.js +17 -11
- package/dist/lib/memory.d.ts +2 -13
- package/dist/lib/memory.js +4 -4
- package/dist/lib/menubar/download-menubar.d.ts +0 -2
- package/dist/lib/menubar/download-menubar.js +1 -5
- package/dist/lib/menubar/install-menubar.d.ts +3 -14
- package/dist/lib/menubar/install-menubar.js +3 -3
- package/dist/lib/menubar/migrate-prefs.d.ts +53 -0
- package/dist/lib/menubar/migrate-prefs.js +168 -0
- package/dist/lib/menubar/resolve-version.d.ts +1 -9
- package/dist/lib/menubar/resolve-version.js +4 -4
- package/dist/lib/menubar/snapshot.d.ts +24 -2
- package/dist/lib/menubar/snapshot.js +26 -0
- package/dist/lib/model-tier-overrides.d.ts +3 -2
- package/dist/lib/monitors/config.d.ts +0 -2
- package/dist/lib/monitors/config.js +0 -4
- package/dist/lib/monitors/engine.d.ts +1 -1
- package/dist/lib/monitors/remote.d.ts +3 -2
- package/dist/lib/monitors/sources/webhook.d.ts +2 -15
- package/dist/lib/monitors/sources/webhook.js +1 -38
- package/dist/lib/monitors/state.d.ts +4 -7
- package/dist/lib/monitors/state.js +2 -2
- package/dist/lib/notify.d.ts +1 -1
- package/dist/lib/notify.js +1 -1
- package/dist/lib/onepassword.d.ts +5 -14
- package/dist/lib/onepassword.js +0 -64
- package/dist/lib/open-url.d.ts +3 -2
- package/dist/lib/openclaw-keychain.d.ts +4 -17
- package/dist/lib/openclaw-keychain.js +3 -33
- package/dist/lib/operator.d.ts +2 -2
- package/dist/lib/operator.js +1 -1
- package/dist/lib/output/git-output.d.ts +4 -14
- package/dist/lib/output/git-output.js +1 -1
- package/dist/lib/owner-message.d.ts +3 -29
- package/dist/lib/owner-message.js +3 -3
- package/dist/lib/packages/output-home.d.ts +2 -4
- package/dist/lib/packages/output-home.js +2 -2
- package/dist/lib/perf/db.d.ts +0 -2
- package/dist/lib/perf/db.js +2 -7
- package/dist/lib/permissions-registry.d.ts +2 -3
- package/dist/lib/permissions-registry.js +0 -4
- package/dist/lib/permissions.d.ts +6 -16
- package/dist/lib/permissions.js +2 -15
- package/dist/lib/picker.d.ts +6 -5
- package/dist/lib/placement.d.ts +3 -6
- package/dist/lib/placement.js +0 -17
- package/dist/lib/platform/posixpath.d.ts +2 -1
- package/dist/lib/platform/winpath.d.ts +2 -1
- package/dist/lib/plugins/plugin-marketplace.d.ts +2 -2
- package/dist/lib/plugins/plugin-marketplace.js +1 -1
- package/dist/lib/pr-land-detach.d.ts +2 -1
- package/dist/lib/probe.d.ts +4 -1
- package/dist/lib/probe.js +5 -2
- package/dist/lib/profiles-presets.d.ts +2 -1
- package/dist/lib/profiles.d.ts +3 -9
- package/dist/lib/profiles.js +1 -9
- package/dist/lib/project-doctor.d.ts +2 -1
- package/dist/lib/project-launch.d.ts +2 -2
- package/dist/lib/project-probe.d.ts +4 -3
- package/dist/lib/project-pull.d.ts +2 -1
- package/dist/lib/project-resources.d.ts +2 -2
- package/dist/lib/project-resources.js +1 -1
- package/dist/lib/project-root.d.ts +2 -6
- package/dist/lib/project-root.js +1 -1
- package/dist/lib/project-schedule.d.ts +2 -1
- package/dist/lib/project-status.d.ts +2 -16
- package/dist/lib/project-status.js +3 -3
- package/dist/lib/pwsh.d.ts +33 -0
- package/dist/lib/pwsh.js +56 -0
- package/dist/lib/reconcile-and-repair.d.ts +5 -4
- package/dist/lib/redact.d.ts +15 -1
- package/dist/lib/redact.js +105 -3
- package/dist/lib/refresh-coordinator.d.ts +2 -1
- package/dist/lib/refresh.d.ts +9 -4
- package/dist/lib/refresh.js +92 -72
- package/dist/lib/remote-agents-json.d.ts +3 -2
- package/dist/lib/reserved-stores.d.ts +0 -2
- package/dist/lib/reserved-stores.js +3 -5
- package/dist/lib/resource-content-diff.d.ts +0 -2
- package/dist/lib/resource-content-diff.js +1 -1
- package/dist/lib/resource-patterns.d.ts +2 -1
- package/dist/lib/resource-profiles.d.ts +2 -8
- package/dist/lib/resource-profiles.js +3 -27
- package/dist/lib/resources/workflows.d.ts +1 -1
- package/dist/lib/resources.d.ts +4 -9
- package/dist/lib/resources.js +1 -1
- package/dist/lib/routine-context.d.ts +2 -5
- package/dist/lib/routine-context.js +2 -2
- package/dist/lib/routine-notify-owner.d.ts +8 -7
- package/dist/lib/routine-notify-owner.js +5 -5
- package/dist/lib/routine-process-cleanup.d.ts +2 -1
- package/dist/lib/routine-readiness.d.ts +0 -2
- package/dist/lib/routine-readiness.js +0 -7
- package/dist/lib/routines-project.d.ts +3 -4
- package/dist/lib/routines-project.js +1 -1
- package/dist/lib/rules/compile.d.ts +3 -25
- package/dist/lib/rules/compile.js +1 -1
- package/dist/lib/rules/compose.d.ts +3 -9
- package/dist/lib/rules/rules.d.ts +4 -15
- package/dist/lib/rules/rules.js +1 -64
- package/dist/lib/run-defaults.d.ts +1 -1
- package/dist/lib/run-notify.d.ts +2 -1
- package/dist/lib/run-trace-sync.d.ts +1 -1
- package/dist/lib/run-trace-sync.js +1 -1
- package/dist/lib/scheduler.d.ts +2 -1
- package/dist/lib/scheduling/routines.d.ts +9 -21
- package/dist/lib/scheduling/routines.js +3 -46
- package/dist/lib/secrets-cli.d.ts +11 -0
- package/dist/lib/secrets-cli.js +30 -0
- package/dist/lib/secrets-client.d.ts +0 -17
- package/dist/lib/secrets-client.js +7 -28
- package/dist/lib/secrets-policy.d.ts +12 -17
- package/dist/lib/secrets-policy.js +5 -5
- package/dist/lib/secrets-types.d.ts +3 -2
- package/dist/lib/secrets-types.js +2 -1
- package/dist/lib/self-heal/checks/install-staging.js +1 -1
- package/dist/lib/self-heal/registry.d.ts +3 -2
- package/dist/lib/self-heal/types.d.ts +1 -1
- package/dist/lib/self-heal/types.js +1 -1
- package/dist/lib/self-update.d.ts +5 -5
- package/dist/lib/self-update.js +4 -4
- package/dist/lib/session/actor-sidecar.d.ts +3 -2
- package/dist/lib/session/artifacts.d.ts +0 -2
- package/dist/lib/session/artifacts.js +1 -1
- package/dist/lib/session/bash-command.d.ts +2 -7
- package/dist/lib/session/bundle.d.ts +4 -6
- package/dist/lib/session/bundle.js +1 -5
- package/dist/lib/session/cloud.d.ts +0 -4
- package/dist/lib/session/cloud.js +2 -15
- package/dist/lib/session/detached.d.ts +9 -1
- package/dist/lib/session/detached.js +31 -2
- package/dist/lib/session/digest.d.ts +2 -2
- package/dist/lib/session/digest.js +1 -1
- package/dist/lib/session/fork.d.ts +3 -2
- package/dist/lib/session/highlights.d.ts +6 -5
- package/dist/lib/session/hook-sessions.d.ts +2 -1
- package/dist/lib/session/host-link.d.ts +2 -1
- package/dist/lib/session/inject.d.ts +1 -1
- package/dist/lib/session/inject.js +1 -1
- package/dist/lib/session/insights.d.ts +3 -15
- package/dist/lib/session/insights.js +2 -2
- package/dist/lib/session/local-tmux-attach.d.ts +2 -18
- package/dist/lib/session/local-tmux-attach.js +1 -1
- package/dist/lib/session/migrations.d.ts +0 -1
- package/dist/lib/session/migrations.js +1 -1
- package/dist/lib/session/mirror.d.ts +5 -8
- package/dist/lib/session/mirror.js +2 -2
- package/dist/lib/session/parse.d.ts +1 -32
- package/dist/lib/session/parse.js +4 -4
- package/dist/lib/session/presence.d.ts +2 -1
- package/dist/lib/session/prompt.d.ts +3 -2
- package/dist/lib/session/prompt.js +38 -1
- package/dist/lib/session/recovery.d.ts +3 -2
- package/dist/lib/session/remote/peer-stream.d.ts +26 -7
- package/dist/lib/session/remote/peer-stream.js +35 -8
- package/dist/lib/session/remote/remote-bundle.d.ts +2 -1
- package/dist/lib/session/remote/remote-list.d.ts +5 -5
- package/dist/lib/session/remote/remote.d.ts +4 -3
- package/dist/lib/session/remote/watch.d.ts +2 -7
- package/dist/lib/session/remote/watch.js +3 -3
- package/dist/lib/session/remote-active.d.ts +2 -1
- package/dist/lib/session/render.d.ts +2 -2
- package/dist/lib/session/render.js +1 -1
- package/dist/lib/session/resume-owner.d.ts +1 -1
- package/dist/lib/session/resume-owner.js +1 -1
- package/dist/lib/session/run-names.d.ts +2 -1
- package/dist/lib/session/session-cache.d.ts +7 -26
- package/dist/lib/session/session-cache.js +2 -8
- package/dist/lib/session/share-html.d.ts +1 -21
- package/dist/lib/session/share-html.js +1 -1
- package/dist/lib/session/shell-programs.d.ts +2 -1
- package/dist/lib/session/state.d.ts +41 -8
- package/dist/lib/session/state.js +112 -11
- package/dist/lib/session/stream-render.d.ts +2 -1
- package/dist/lib/session/sync/agents.d.ts +0 -4
- package/dist/lib/session/sync/agents.js +0 -0
- package/dist/lib/session/sync/backend.d.ts +8 -8
- package/dist/lib/session/sync/backend.js +3 -3
- package/dist/lib/session/sync/managed-config.d.ts +0 -8
- package/dist/lib/session/sync/managed-key.d.ts +0 -2
- package/dist/lib/session/sync/managed-key.js +1 -1
- package/dist/lib/session/sync/provision.d.ts +1 -1
- package/dist/lib/session/sync/provision.js +2 -2
- package/dist/lib/session/sync/r2.d.ts +4 -1
- package/dist/lib/session/sync/r2.js +4 -7
- package/dist/lib/session/sync/transcript-crypto.d.ts +2 -1
- package/dist/lib/session/tail.d.ts +2 -1
- package/dist/lib/session/team-filter.d.ts +1 -1
- package/dist/lib/session/throughput.d.ts +2 -3
- package/dist/lib/session/throughput.js +1 -1
- package/dist/lib/session/timeline-pass.d.ts +3 -42
- package/dist/lib/session/timeline-pass.js +4 -4
- package/dist/lib/session/timeline.d.ts +3 -13
- package/dist/lib/session/timeline.js +3 -3
- package/dist/lib/session/tool-calls.d.ts +2 -2
- package/dist/lib/session/tool-calls.js +1 -1
- package/dist/lib/session/tool-index.d.ts +0 -8
- package/dist/lib/session/tool-index.js +2 -2
- package/dist/lib/session/tool-store.d.ts +2 -1
- package/dist/lib/session/trajectory-compare.d.ts +2 -1
- package/dist/lib/session/trajectory-lineage.d.ts +2 -1
- package/dist/lib/session/trajectory-text.d.ts +3 -2
- package/dist/lib/session/trajectory.d.ts +2 -1
- package/dist/lib/session/viewing-in.d.ts +2 -1
- package/dist/lib/sessions-client.js +0 -3
- package/dist/lib/settings-manifest.d.ts +2 -1
- package/dist/lib/setup-tool-install.d.ts +3 -0
- package/dist/lib/setup-tool-install.js +26 -0
- package/dist/lib/setup-tool-status.d.ts +22 -0
- package/dist/lib/setup-tool-status.js +215 -0
- package/dist/lib/share-runtime.d.ts +11 -0
- package/dist/lib/share-runtime.js +63 -0
- package/dist/lib/shim-heal.d.ts +1 -5
- package/dist/lib/shim-heal.js +0 -6
- package/dist/lib/smart-launch.d.ts +5 -10
- package/dist/lib/smart-launch.js +4 -12
- package/dist/lib/snapshot.d.ts +3 -2
- package/dist/lib/ssh-exec.d.ts +49 -4
- package/dist/lib/ssh-exec.js +119 -0
- package/dist/lib/ssh-tunnel.d.ts +3 -2
- package/dist/lib/staleness/checkers/permissions.d.ts +0 -2
- package/dist/lib/staleness/checkers/permissions.js +1 -1
- package/dist/lib/staleness/fingerprint.d.ts +0 -7
- package/dist/lib/staleness/fingerprint.js +1 -1
- package/dist/lib/staleness/prune.d.ts +3 -2
- package/dist/lib/staleness/registry.d.ts +1 -1
- package/dist/lib/staleness/writers/sources.d.ts +0 -8
- package/dist/lib/staleness/writers/sources.js +1 -1
- package/dist/lib/startup/command-registry.d.ts +6 -4
- package/dist/lib/startup/command-registry.js +11 -8
- package/dist/lib/state.d.ts +1 -3
- package/dist/lib/state.js +3 -6
- package/dist/lib/storage/selection.d.ts +2 -2
- package/dist/lib/storage/selection.js +2 -2
- package/dist/lib/subagents-registry.d.ts +4 -3
- package/dist/lib/subagents.d.ts +2 -1
- package/dist/lib/subagents.js +3 -2
- package/dist/lib/summarizer/pass.d.ts +3 -6
- package/dist/lib/summarizer/pass.js +2 -2
- package/dist/lib/summarizer/summarize.d.ts +4 -3
- package/dist/lib/sync-passphrase.d.ts +3 -2
- package/dist/lib/sync-status.d.ts +3 -16
- package/dist/lib/sync-status.js +2 -2
- package/dist/lib/sync-umbrella.d.ts +9 -3
- package/dist/lib/sync-umbrella.js +18 -10
- package/dist/lib/system-run-sync.d.ts +2 -1
- package/dist/lib/teams/agents.d.ts +2 -4
- package/dist/lib/teams/agents.js +1 -1
- package/dist/lib/teams/forEach.d.ts +3 -2
- package/dist/lib/teams/pr-watch.d.ts +4 -11
- package/dist/lib/teams/pr-watch.js +4 -4
- package/dist/lib/teams/registry.d.ts +2 -3
- package/dist/lib/teams/registry.js +1 -1
- package/dist/lib/teams/remoteWorktree.d.ts +0 -16
- package/dist/lib/teams/remoteWorktree.js +3 -3
- package/dist/lib/teams/scheduler.d.ts +6 -5
- package/dist/lib/teams/scheduler.js +1 -1
- package/dist/lib/teams/supervisor.d.ts +4 -3
- package/dist/lib/teams/worktree.d.ts +0 -9
- package/dist/lib/teams/worktree.js +0 -32
- package/dist/lib/term-client.d.ts +44 -0
- package/dist/lib/term-client.js +117 -0
- package/dist/lib/terminal/inject.d.ts +3 -16
- package/dist/lib/terminal/inject.js +1 -29
- package/dist/lib/terminal/resolve.d.ts +3 -9
- package/dist/lib/terminal/resolve.js +3 -7
- package/dist/lib/tmux/binary.d.ts +2 -1
- package/dist/lib/tmux/orphan-reap.d.ts +6 -7
- package/dist/lib/tmux/orphan-reap.js +1 -1
- package/dist/lib/tmux/session.d.ts +4 -3
- package/dist/lib/traces/backend.d.ts +1 -2
- package/dist/lib/traces/backend.js +1 -2
- package/dist/lib/traces/classify.d.ts +3 -2
- package/dist/lib/traces/config.d.ts +0 -8
- package/dist/lib/traces/insights.d.ts +2 -1
- package/dist/lib/traces/phenotype.d.ts +3 -3
- package/dist/lib/traces/provision.d.ts +2 -4
- package/dist/lib/traces/provision.js +3 -3
- package/dist/lib/traces/schema2-build.d.ts +1 -1
- package/dist/lib/traces/schema2-danger.d.ts +2 -1
- package/dist/lib/traces/schema2.d.ts +5 -4
- package/dist/lib/traces/segments.d.ts +4 -20
- package/dist/lib/traces/segments.js +3 -3
- package/dist/lib/traces/sync.d.ts +2 -3
- package/dist/lib/traces/sync.js +1 -1
- package/dist/lib/triggers/handlers.d.ts +4 -13
- package/dist/lib/triggers/handlers.js +1 -1
- package/dist/lib/triggers/webhook.d.ts +5 -27
- package/dist/lib/triggers/webhook.js +4 -4
- package/dist/lib/types.d.ts +11 -9
- package/dist/lib/usage-refresh.d.ts +4 -10
- package/dist/lib/usage-refresh.js +3 -8
- package/dist/lib/verbs.d.ts +2 -1
- package/dist/lib/version-duplicates.d.ts +2 -3
- package/dist/lib/version-duplicates.js +3 -33
- package/dist/lib/version.d.ts +2 -1
- package/dist/lib/warn-unpushed.d.ts +2 -1
- package/dist/lib/watchdog/history.d.ts +3 -2
- package/dist/lib/watchdog/log.d.ts +0 -6
- package/dist/lib/watchdog/log.js +1 -1
- package/dist/lib/watchdog/rotate.d.ts +2 -26
- package/dist/lib/watchdog/rotate.js +4 -12
- package/dist/lib/watchdog/runner.d.ts +0 -7
- package/dist/lib/watchdog/runner.js +4 -4
- package/dist/lib/watchdog/service.d.ts +2 -2
- package/dist/lib/watchdog/service.js +1 -1
- package/dist/lib/watchdog/watchdog-agent.d.ts +2 -1
- package/dist/lib/watchdog/watchdog.d.ts +2 -1
- package/dist/lib/watchdog/watchdogTail.d.ts +2 -1
- package/dist/lib/workflows-registry.d.ts +3 -2
- package/dist/lib/workflows.d.ts +4 -7
- package/dist/lib/workflows.js +1 -1
- package/dist/lib/worktree/held.d.ts +4 -28
- package/dist/lib/worktree/held.js +3 -3
- package/package.json +3 -5
- package/scripts/postinstall.js +5 -4
- package/dist/commands/artifacts-setup.d.ts +0 -53
- package/dist/commands/artifacts-setup.js +0 -161
- package/dist/commands/artifacts.d.ts +0 -18
- package/dist/commands/artifacts.js +0 -58
- package/dist/commands/attach.d.ts +0 -12
- package/dist/commands/attach.js +0 -86
- package/dist/commands/auth-mint.d.ts +0 -12
- package/dist/commands/auth-mint.js +0 -108
- package/dist/commands/pty.d.ts +0 -20
- package/dist/commands/pty.js +0 -404
- package/dist/commands/reconnect.d.ts +0 -46
- package/dist/commands/reconnect.js +0 -115
- package/dist/commands/share.d.ts +0 -293
- package/dist/commands/share.js +0 -1424
- package/dist/lib/config-machine-keys.d.ts +0 -14
- package/dist/lib/config-machine-keys.js +0 -21
- package/dist/lib/pty-client.d.ts +0 -49
- package/dist/lib/pty-client.js +0 -315
- package/dist/lib/pty-server.d.ts +0 -59
- package/dist/lib/pty-server.js +0 -653
- package/dist/lib/share/analytics.d.ts +0 -13
- package/dist/lib/share/analytics.js +0 -45
- package/dist/lib/share/backend.d.ts +0 -120
- package/dist/lib/share/backend.js +0 -176
- package/dist/lib/share/capture.d.ts +0 -31
- package/dist/lib/share/capture.js +0 -174
- package/dist/lib/share/config.d.ts +0 -72
- package/dist/lib/share/config.js +0 -211
- package/dist/lib/share/delete.d.ts +0 -122
- package/dist/lib/share/delete.js +0 -173
- package/dist/lib/share/html.d.ts +0 -22
- package/dist/lib/share/html.js +0 -88
- package/dist/lib/share/http-error.d.ts +0 -52
- package/dist/lib/share/http-error.js +0 -65
- package/dist/lib/share/og.d.ts +0 -25
- package/dist/lib/share/og.js +0 -84
- package/dist/lib/share/provision.d.ts +0 -127
- package/dist/lib/share/provision.js +0 -285
- package/dist/lib/share/publish.d.ts +0 -388
- package/dist/lib/share/publish.js +0 -818
- package/dist/lib/share/worker-template.d.ts +0 -27
- package/dist/lib/share/worker-template.js +0 -2424
- package/dist/lib/storage/index.d.ts +0 -14
- package/dist/lib/storage/index.js +0 -14
- package/dist/lib/storage/visibility.d.ts +0 -82
- package/dist/lib/storage/visibility.js +0 -99
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { SessionWatchRow, SessionWatchScopeStatus } from '../session/watch.js';
|
|
2
|
+
import type { ToolSetupRow } from '../setup-tool-status.js';
|
|
3
|
+
import type { AttentionItem } from './attention.js';
|
|
4
|
+
import type { ActivityEvent } from './activity.js';
|
|
5
|
+
import type { ToolRow } from './tools.js';
|
|
6
|
+
type Base = {
|
|
7
|
+
v: 1;
|
|
8
|
+
type: string;
|
|
9
|
+
streamId: string;
|
|
10
|
+
sequence: number;
|
|
11
|
+
scope: string;
|
|
12
|
+
};
|
|
13
|
+
export type FeedWatchEnvelope = Base & {
|
|
14
|
+
type: 'reset';
|
|
15
|
+
capturedAt: number;
|
|
16
|
+
agents: SessionWatchRow[];
|
|
17
|
+
attention: AttentionItem[];
|
|
18
|
+
tools: ToolRow[];
|
|
19
|
+
/** This device's tool-setup rows; see `setup.snapshot` for why it is a set. */
|
|
20
|
+
setup: ToolSetupRow[];
|
|
21
|
+
} | Base & {
|
|
22
|
+
type: 'agent.upsert';
|
|
23
|
+
rowKey: string;
|
|
24
|
+
agent: SessionWatchRow;
|
|
25
|
+
} | Base & {
|
|
26
|
+
type: 'agent.remove';
|
|
27
|
+
rowKey: string;
|
|
28
|
+
} | Base & {
|
|
29
|
+
type: 'attention.upsert';
|
|
30
|
+
rowKey: string;
|
|
31
|
+
attention: AttentionItem;
|
|
32
|
+
} | Base & {
|
|
33
|
+
type: 'attention.remove';
|
|
34
|
+
rowKey: string;
|
|
35
|
+
} | Base & {
|
|
36
|
+
type: 'activity.append';
|
|
37
|
+
event: ActivityEvent;
|
|
38
|
+
}
|
|
39
|
+
/** A browser task or computer run, projected by `feed/tools.ts`. */
|
|
40
|
+
| Base & {
|
|
41
|
+
type: 'tool.upsert';
|
|
42
|
+
rowKey: string;
|
|
43
|
+
tool: ToolRow;
|
|
44
|
+
} | Base & {
|
|
45
|
+
type: 'tool.remove';
|
|
46
|
+
rowKey: string;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* The whole tool-setup set for one device, replaced at once.
|
|
50
|
+
*
|
|
51
|
+
* Deliberately a SNAPSHOT and not per-row upserts: `getCachedToolSetup` always
|
|
52
|
+
* answers for every tool in `SETUP_TOOLS`, so "browser is ready" and "computer
|
|
53
|
+
* needs setup" are one coherent reading of the box taken at one moment. Sending
|
|
54
|
+
* three independent upserts would let a consumer render a mix of two different
|
|
55
|
+
* readings, and there is no row to *remove* — a tool that is not installed is a
|
|
56
|
+
* row saying so, which is exactly what a Setup pane must show.
|
|
57
|
+
*/
|
|
58
|
+
| Base & {
|
|
59
|
+
type: 'setup.snapshot';
|
|
60
|
+
capturedAt: number;
|
|
61
|
+
setup: ToolSetupRow[];
|
|
62
|
+
} | Base & {
|
|
63
|
+
type: 'scope';
|
|
64
|
+
capturedAt: number;
|
|
65
|
+
status: SessionWatchScopeStatus;
|
|
66
|
+
reason?: string;
|
|
67
|
+
} | Base & {
|
|
68
|
+
type: 'heartbeat';
|
|
69
|
+
capturedAt: number;
|
|
70
|
+
};
|
|
71
|
+
export type FeedWatchPayload = FeedWatchEnvelope extends infer Envelope ? Envelope extends FeedWatchEnvelope ? Omit<Envelope, 'v' | 'streamId' | 'sequence'> : never : never;
|
|
72
|
+
/** Per-subscriber stream identity and monotonic sequence. */
|
|
73
|
+
export declare class FeedWatchState {
|
|
74
|
+
readonly streamId: string;
|
|
75
|
+
private sequence;
|
|
76
|
+
constructor(streamId?: `${string}-${string}-${string}-${string}-${string}`);
|
|
77
|
+
emit(event: FeedWatchPayload): FeedWatchEnvelope;
|
|
78
|
+
}
|
|
79
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The feed stream's envelope contract and its sequencer.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from `watch.ts` so the three modules that all speak this protocol —
|
|
5
|
+
* the producer (`watch.ts`), the shared collector (`hub.ts`), and the socket
|
|
6
|
+
* boundary (`hub-server.ts`) — can depend on the contract without depending on
|
|
7
|
+
* each other. `watch.ts` needs `FeedHub` to share its local collector and
|
|
8
|
+
* `hub.ts` needs the sequencer, so leaving both here is what keeps that from
|
|
9
|
+
* being an import cycle.
|
|
10
|
+
*
|
|
11
|
+
* `watch.ts` re-exports everything in this file, so every existing importer is
|
|
12
|
+
* unaffected.
|
|
13
|
+
*/
|
|
14
|
+
import { randomUUID } from 'node:crypto';
|
|
15
|
+
/** Per-subscriber stream identity and monotonic sequence. */
|
|
16
|
+
export class FeedWatchState {
|
|
17
|
+
streamId;
|
|
18
|
+
sequence = 0;
|
|
19
|
+
constructor(streamId = randomUUID()) { this.streamId = streamId; }
|
|
20
|
+
emit(event) {
|
|
21
|
+
return { v: 1, streamId: this.streamId, sequence: ++this.sequence, ...event };
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -12,6 +12,12 @@
|
|
|
12
12
|
* - Performance tracking: withTiming() wrapper for any async function
|
|
13
13
|
*/
|
|
14
14
|
import type { ActorKind } from '../actor.js';
|
|
15
|
+
/**
|
|
16
|
+
* The directory today's ledger is appended to. Exported for the tool-activity
|
|
17
|
+
* collector, which watches it instead of re-running `agents computer sessions`
|
|
18
|
+
* on a timer to notice a new `computer.action` (see `feed/tool-activity.ts`).
|
|
19
|
+
*/
|
|
20
|
+
export declare function getEventsDir(): string;
|
|
15
21
|
export type EventLevel = 'audit' | 'warn' | 'info' | 'debug';
|
|
16
22
|
export type EventType = 'agent.run.start' | 'agent.run.end' | 'agent.spawn.start' | 'agent.spawn.end' | 'run.dispatched' | 'run.launch' | 'daemon.start' | 'daemon.stop' | 'daemon.error' | 'daemon.info' | 'routine.start' | 'routine.end' | 'watchdog.action' | 'version.install' | 'version.switch' | 'version.remove' | 'skill.install' | 'skill.remove' | 'browser.launch' | 'browser.close' | 'browser.navigate' | 'browser.screenshot' | 'computer.action' | 'secrets.get' | 'secrets.unlocked' | 'secrets.create' | 'secrets.import' | 'secrets.export' | 'secrets.view' | 'secrets.lease-denied' | 'secrets.lease-expire' | 'secrets.set' | 'secrets.delete' | 'secrets.rename' | 'cloud.dispatch' | 'cloud.complete' | 'cloud.cancel' | 'cloud.message' | 'teams.create' | 'teams.add' | 'teams.start' | 'teams.complete' | 'teams.disband' | 'hook.fire' | 'hook.complete' | 'hook.error' | 'mcp.add' | 'mcp.remove' | 'mcp.register' | 'resource.sync' | 'rotation.resolved' | 'rotation.unresolved' | 'command.start' | 'command.end' | 'perf.timing' | 'session.start' | 'session.end' | 'webhook.received' | 'webhook.authorized' | 'webhook.rejected' | 'webhook.matched' | 'webhook.fired' | 'webhook.failed' | 'webhook.handler.start' | 'webhook.handler.end' | 'plan.created' | 'pr.opened' | 'pr.merged' | 'worktree.created' | 'worktree.removed' | 'commit.created' | 'pushed' | 'subagent.spawned' | 'artifact.created' | 'task.completed' | 'checklist.created' | 'status.posted' | 'file.edited' | 'factory.command' | 'factory.action' | 'factory.uri' | 'factory.launch' | 'friction' | 'error' | 'warn' | 'info' | 'debug';
|
|
17
23
|
/** Every known event kind. Derived from {@link EVENT_TYPE_TABLE}, never hand-listed. */
|
|
@@ -75,17 +81,6 @@ export interface EventPayload {
|
|
|
75
81
|
[key: string]: unknown;
|
|
76
82
|
}
|
|
77
83
|
export type EventRecord = EventMeta & EventPayload;
|
|
78
|
-
/**
|
|
79
|
-
* Move root-level and interim flat-history event families into dated directories.
|
|
80
|
-
*
|
|
81
|
-
* The common case is a whole-family rename into an empty destination. A
|
|
82
|
-
* Each segment is assigned to the local calendar day of its filesystem mtime;
|
|
83
|
-
* new writes are split by day at source. A partially completed migration keeps
|
|
84
|
-
* the destination active file authoritative and assigns a fresh archive number,
|
|
85
|
-
* so no record is overwritten or silently discarded. The legacy active-file
|
|
86
|
-
* lock serializes this with older installed processes that still append there.
|
|
87
|
-
*/
|
|
88
|
-
export declare function migrateLegacyEventLogs(userDir?: string): number;
|
|
89
84
|
/**
|
|
90
85
|
* Replace a prompt string with length + short SHA so we can correlate runs
|
|
91
86
|
* without persisting the raw text. Returns the fields to spread into a payload.
|
|
@@ -158,14 +153,6 @@ export declare function emitRoutineEndAsync(meta: RoutineEndMeta): Promise<void>
|
|
|
158
153
|
* const result = time('parse-config', () => parseConfig(path));
|
|
159
154
|
*/
|
|
160
155
|
export declare function time<T>(label: string, fn: () => T, payload?: EventPayload): T;
|
|
161
|
-
/**
|
|
162
|
-
* Measure execution time of an async function.
|
|
163
|
-
* Emits a perf.timing event with the duration.
|
|
164
|
-
*
|
|
165
|
-
* @example
|
|
166
|
-
* const result = await timeAsync('fetch-data', () => fetchData(url));
|
|
167
|
-
*/
|
|
168
|
-
export declare function timeAsync<T>(label: string, fn: () => Promise<T>, payload?: EventPayload): Promise<T>;
|
|
169
156
|
/**
|
|
170
157
|
* Create a timing context for measuring multiple phases of an operation.
|
|
171
158
|
* Useful for tracking startup time vs execution time.
|
|
@@ -182,15 +169,6 @@ export declare function createTimer(label: string, payload?: EventPayload): {
|
|
|
182
169
|
end: (endPayload?: EventPayload) => void;
|
|
183
170
|
elapsed: () => number;
|
|
184
171
|
};
|
|
185
|
-
/**
|
|
186
|
-
* Higher-order function that wraps an async function with timing.
|
|
187
|
-
* The wrapper emits start/end events automatically.
|
|
188
|
-
*
|
|
189
|
-
* @example
|
|
190
|
-
* const timedFetch = withTiming('fetch', fetchData, { service: 'api' });
|
|
191
|
-
* const result = await timedFetch(url);
|
|
192
|
-
*/
|
|
193
|
-
export declare function withTiming<Args extends unknown[], R>(label: string, fn: (...args: Args) => Promise<R>, basePayload?: EventPayload): (...args: Args) => Promise<R>;
|
|
194
172
|
/**
|
|
195
173
|
* Emit a command.start event with CLI args.
|
|
196
174
|
* Returns a done() function to emit command.end with duration.
|
|
@@ -202,10 +180,6 @@ export declare function withTiming<Args extends unknown[], R>(label: string, fn:
|
|
|
202
180
|
* done({ exitCode: 0 });
|
|
203
181
|
*/
|
|
204
182
|
export declare function emitCommand(command: string, args?: string[], payload?: EventPayload): (endPayload?: EventPayload) => void;
|
|
205
|
-
/**
|
|
206
|
-
* Emit an error event with full details.
|
|
207
|
-
*/
|
|
208
|
-
export declare function emitError(err: Error | string, payload?: EventPayload): void;
|
|
209
183
|
/**
|
|
210
184
|
* Emit a friction event — a structured, point-of-use record of a failure or
|
|
211
185
|
* block the CLI just hit. `surface` is the subsystem (teams, browser, secrets,
|
|
@@ -213,7 +187,7 @@ export declare function emitError(err: Error | string, payload?: EventPayload):
|
|
|
213
187
|
* the same failure across sessions (e.g. 'remote-cwd-on-add', 'not-installed').
|
|
214
188
|
*/
|
|
215
189
|
export declare function emitFriction(surface: string, failureId: string, payload?: EventPayload): void;
|
|
216
|
-
|
|
190
|
+
interface RotationResult {
|
|
217
191
|
removedByAge: number;
|
|
218
192
|
removedBySize: number;
|
|
219
193
|
bytesReclaimed: number;
|
|
@@ -250,20 +224,7 @@ export declare function queryToolUsageForSessions(sessionIds: ReadonlySet<string
|
|
|
250
224
|
usedBrowser: boolean;
|
|
251
225
|
usedComputer: boolean;
|
|
252
226
|
}>;
|
|
253
|
-
|
|
254
|
-
* Get performance stats for a specific label.
|
|
255
|
-
*/
|
|
256
|
-
export declare function getTimingStats(label: string, options?: {
|
|
257
|
-
days?: number;
|
|
258
|
-
}): {
|
|
259
|
-
count: number;
|
|
260
|
-
avgMs: number;
|
|
261
|
-
minMs: number;
|
|
262
|
-
maxMs: number;
|
|
263
|
-
p50Ms: number;
|
|
264
|
-
p95Ms: number;
|
|
265
|
-
} | null;
|
|
266
|
-
export interface EventStats {
|
|
227
|
+
interface EventStats {
|
|
267
228
|
totalEvents: number;
|
|
268
229
|
byLevel: Record<string, number>;
|
|
269
230
|
byEvent: Record<string, number>;
|
package/dist/lib/feed/events.js
CHANGED
|
@@ -88,6 +88,14 @@ function eventsPath(date = new Date()) {
|
|
|
88
88
|
function eventsDir(date = new Date()) {
|
|
89
89
|
return path.dirname(eventsPath(date));
|
|
90
90
|
}
|
|
91
|
+
/**
|
|
92
|
+
* The directory today's ledger is appended to. Exported for the tool-activity
|
|
93
|
+
* collector, which watches it instead of re-running `agents computer sessions`
|
|
94
|
+
* on a timer to notice a new `computer.action` (see `feed/tool-activity.ts`).
|
|
95
|
+
*/
|
|
96
|
+
export function getEventsDir() {
|
|
97
|
+
return eventsDir();
|
|
98
|
+
}
|
|
91
99
|
/** Default retention period in days. */
|
|
92
100
|
const DEFAULT_RETENTION_DAYS = 7;
|
|
93
101
|
/** Default total footprint for the active log plus gzip archives (50 MiB). */
|
|
@@ -233,7 +241,7 @@ function ensureLogsDir() {
|
|
|
233
241
|
* so no record is overwritten or silently discarded. The legacy active-file
|
|
234
242
|
* lock serializes this with older installed processes that still append there.
|
|
235
243
|
*/
|
|
236
|
-
|
|
244
|
+
function migrateLegacyEventLogs(userDir = userAgentsDir()) {
|
|
237
245
|
if (_eventsPathOverride || _legacyMigrationChecked)
|
|
238
246
|
return 0;
|
|
239
247
|
_legacyMigrationChecked = true;
|
|
@@ -660,56 +668,6 @@ export function time(label, fn, payload = {}) {
|
|
|
660
668
|
throw err;
|
|
661
669
|
}
|
|
662
670
|
}
|
|
663
|
-
/**
|
|
664
|
-
* Measure execution time of an async function.
|
|
665
|
-
* Emits a perf.timing event with the duration.
|
|
666
|
-
*
|
|
667
|
-
* @example
|
|
668
|
-
* const result = await timeAsync('fetch-data', () => fetchData(url));
|
|
669
|
-
*/
|
|
670
|
-
export async function timeAsync(label, fn, payload = {}) {
|
|
671
|
-
const start = Date.now();
|
|
672
|
-
try {
|
|
673
|
-
const result = await fn();
|
|
674
|
-
const durationMs = Date.now() - start;
|
|
675
|
-
emit('perf.timing', {
|
|
676
|
-
...payload,
|
|
677
|
-
label,
|
|
678
|
-
durationMs,
|
|
679
|
-
status: 'success',
|
|
680
|
-
});
|
|
681
|
-
recordPerfTiming({
|
|
682
|
-
label,
|
|
683
|
-
durationMs,
|
|
684
|
-
status: 'success',
|
|
685
|
-
agent: payload.agent,
|
|
686
|
-
version: payload.version,
|
|
687
|
-
sessionId: payload.sessionId,
|
|
688
|
-
cwd: payload.cwd,
|
|
689
|
-
});
|
|
690
|
-
return result;
|
|
691
|
-
}
|
|
692
|
-
catch (err) {
|
|
693
|
-
const durationMs = Date.now() - start;
|
|
694
|
-
emit('perf.timing', {
|
|
695
|
-
...payload,
|
|
696
|
-
label,
|
|
697
|
-
durationMs,
|
|
698
|
-
status: 'error',
|
|
699
|
-
error: err instanceof Error ? err.message : String(err),
|
|
700
|
-
});
|
|
701
|
-
recordPerfTiming({
|
|
702
|
-
label,
|
|
703
|
-
durationMs,
|
|
704
|
-
status: 'error',
|
|
705
|
-
agent: payload.agent,
|
|
706
|
-
version: payload.version,
|
|
707
|
-
sessionId: payload.sessionId,
|
|
708
|
-
cwd: payload.cwd,
|
|
709
|
-
});
|
|
710
|
-
throw err;
|
|
711
|
-
}
|
|
712
|
-
}
|
|
713
671
|
/**
|
|
714
672
|
* Create a timing context for measuring multiple phases of an operation.
|
|
715
673
|
* Useful for tracking startup time vs execution time.
|
|
@@ -755,59 +713,6 @@ export function createTimer(label, payload = {}) {
|
|
|
755
713
|
},
|
|
756
714
|
};
|
|
757
715
|
}
|
|
758
|
-
/**
|
|
759
|
-
* Higher-order function that wraps an async function with timing.
|
|
760
|
-
* The wrapper emits start/end events automatically.
|
|
761
|
-
*
|
|
762
|
-
* @example
|
|
763
|
-
* const timedFetch = withTiming('fetch', fetchData, { service: 'api' });
|
|
764
|
-
* const result = await timedFetch(url);
|
|
765
|
-
*/
|
|
766
|
-
export function withTiming(label, fn, basePayload = {}) {
|
|
767
|
-
return async (...args) => {
|
|
768
|
-
const start = Date.now();
|
|
769
|
-
try {
|
|
770
|
-
const result = await fn(...args);
|
|
771
|
-
const durationMs = Date.now() - start;
|
|
772
|
-
emit('perf.timing', {
|
|
773
|
-
...basePayload,
|
|
774
|
-
label,
|
|
775
|
-
durationMs,
|
|
776
|
-
status: 'success',
|
|
777
|
-
});
|
|
778
|
-
recordPerfTiming({
|
|
779
|
-
label,
|
|
780
|
-
durationMs,
|
|
781
|
-
status: 'success',
|
|
782
|
-
agent: basePayload.agent,
|
|
783
|
-
version: basePayload.version,
|
|
784
|
-
sessionId: basePayload.sessionId,
|
|
785
|
-
cwd: basePayload.cwd,
|
|
786
|
-
});
|
|
787
|
-
return result;
|
|
788
|
-
}
|
|
789
|
-
catch (err) {
|
|
790
|
-
const durationMs = Date.now() - start;
|
|
791
|
-
emit('perf.timing', {
|
|
792
|
-
...basePayload,
|
|
793
|
-
label,
|
|
794
|
-
durationMs,
|
|
795
|
-
status: 'error',
|
|
796
|
-
error: err instanceof Error ? err.message : String(err),
|
|
797
|
-
});
|
|
798
|
-
recordPerfTiming({
|
|
799
|
-
label,
|
|
800
|
-
durationMs,
|
|
801
|
-
status: 'error',
|
|
802
|
-
agent: basePayload.agent,
|
|
803
|
-
version: basePayload.version,
|
|
804
|
-
sessionId: basePayload.sessionId,
|
|
805
|
-
cwd: basePayload.cwd,
|
|
806
|
-
});
|
|
807
|
-
throw err;
|
|
808
|
-
}
|
|
809
|
-
};
|
|
810
|
-
}
|
|
811
716
|
// ─── Command Tracking ─────────────────────────────────────────────────────────
|
|
812
717
|
/**
|
|
813
718
|
* Emit a command.start event with CLI args.
|
|
@@ -827,18 +732,6 @@ export function emitCommand(command, args = [], payload = {}) {
|
|
|
827
732
|
cwd: process.cwd(),
|
|
828
733
|
});
|
|
829
734
|
}
|
|
830
|
-
// ─── Error Tracking ───────────────────────────────────────────────────────────
|
|
831
|
-
/**
|
|
832
|
-
* Emit an error event with full details.
|
|
833
|
-
*/
|
|
834
|
-
export function emitError(err, payload = {}) {
|
|
835
|
-
const error = err instanceof Error ? err : new Error(err);
|
|
836
|
-
emit('error', {
|
|
837
|
-
...payload,
|
|
838
|
-
error: error.message,
|
|
839
|
-
errorStack: truncate(error.stack, 1000),
|
|
840
|
-
});
|
|
841
|
-
}
|
|
842
735
|
/**
|
|
843
736
|
* Emit a friction event — a structured, point-of-use record of a failure or
|
|
844
737
|
* block the CLI just hit. `surface` is the subsystem (teams, browser, secrets,
|
|
@@ -1183,31 +1076,6 @@ export function queryToolUsageForSessions(sessionIds) {
|
|
|
1183
1076
|
}
|
|
1184
1077
|
return result;
|
|
1185
1078
|
}
|
|
1186
|
-
// ─── Stats ────────────────────────────────────────────────────────────────────
|
|
1187
|
-
/**
|
|
1188
|
-
* Get performance stats for a specific label.
|
|
1189
|
-
*/
|
|
1190
|
-
export function getTimingStats(label, options = {}) {
|
|
1191
|
-
const days = options.days ?? 7;
|
|
1192
|
-
const startDate = new Date();
|
|
1193
|
-
startDate.setDate(startDate.getDate() - days);
|
|
1194
|
-
const events = query({
|
|
1195
|
-
startDate,
|
|
1196
|
-
eventTypes: ['perf.timing'],
|
|
1197
|
-
}).filter(e => e.label === label && typeof e.durationMs === 'number');
|
|
1198
|
-
if (events.length === 0)
|
|
1199
|
-
return null;
|
|
1200
|
-
const durations = events.map(e => e.durationMs).sort((a, b) => a - b);
|
|
1201
|
-
const sum = durations.reduce((a, b) => a + b, 0);
|
|
1202
|
-
return {
|
|
1203
|
-
count: durations.length,
|
|
1204
|
-
avgMs: Math.round(sum / durations.length),
|
|
1205
|
-
minMs: durations[0],
|
|
1206
|
-
maxMs: durations[durations.length - 1],
|
|
1207
|
-
p50Ms: durations[Math.floor(durations.length * 0.5)],
|
|
1208
|
-
p95Ms: durations[Math.floor(durations.length * 0.95)],
|
|
1209
|
-
};
|
|
1210
|
-
}
|
|
1211
1079
|
export function stats(options = {}) {
|
|
1212
1080
|
const days = options.days ?? 7;
|
|
1213
1081
|
const startDate = new Date();
|
package/dist/lib/feed/feed.d.ts
CHANGED
|
@@ -7,6 +7,12 @@ export interface BlockQuestion {
|
|
|
7
7
|
header?: string;
|
|
8
8
|
options?: BlockOption[];
|
|
9
9
|
multiSelect?: boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Preceding report/explanation for a prose question — the context that came
|
|
12
|
+
* BEFORE the trailing ask, Markdown + newlines preserved (PHNX-3999). The
|
|
13
|
+
* operator UI renders it under the question; absent for a structured question.
|
|
14
|
+
*/
|
|
15
|
+
context?: string;
|
|
10
16
|
}
|
|
11
17
|
export interface MessageReceipt {
|
|
12
18
|
/** The message id this receipt describes. */
|
|
@@ -230,8 +236,6 @@ export declare function deriveBlockState(block: OpenBlock): AttentionState;
|
|
|
230
236
|
export declare function recordResolution(resolution: AttentionResolution, root?: string): void;
|
|
231
237
|
/** Read the latest resolution tombstone for a block, if one exists. */
|
|
232
238
|
export declare function readResolution(blockId: string, root?: string): AttentionResolution | undefined;
|
|
233
|
-
/** Read every resolution tombstone. Returns them sorted by stable block filename. */
|
|
234
|
-
export declare function listResolutions(root?: string): AttentionResolution[];
|
|
235
239
|
/**
|
|
236
240
|
* Stable block id for a session. One block per session -- a new question
|
|
237
241
|
* replaces the previous one (the agent can only ask one question at a time).
|
|
@@ -239,7 +243,7 @@ export declare function listResolutions(root?: string): AttentionResolution[];
|
|
|
239
243
|
export declare function blockIdForSession(sessionId: string): string;
|
|
240
244
|
/** Read one block record. Returns undefined when missing or corrupt. */
|
|
241
245
|
export declare function readBlock(blockId: string, root?: string): OpenBlock | undefined;
|
|
242
|
-
|
|
246
|
+
type RecordAnswerResult = {
|
|
243
247
|
ok: true;
|
|
244
248
|
} | {
|
|
245
249
|
ok: false;
|
|
@@ -292,10 +296,6 @@ export declare function recordParked(blockId: string, root?: string): void;
|
|
|
292
296
|
export declare function recordDefaulted(blockId: string, root?: string): void;
|
|
293
297
|
/** Mark that an urgent block was paged to the phone. */
|
|
294
298
|
export declare function recordNotified(blockId: string, root?: string): void;
|
|
295
|
-
/** Convenience: record that a terminal answer closed the block. */
|
|
296
|
-
export declare function recordTerminalAnswer(blockId: string, root?: string): void;
|
|
297
|
-
/** Remove answered marker and receipts for a block (used by block removal/GC). */
|
|
298
|
-
export declare function clearBlockLifecycle(blockId: string, root?: string): void;
|
|
299
299
|
/** Identity of the agent declaring a block — the subset of `PostIdentity` it needs. */
|
|
300
300
|
export interface DeclaringAgent {
|
|
301
301
|
sessionId: string;
|
|
@@ -304,7 +304,7 @@ export interface DeclaringAgent {
|
|
|
304
304
|
runtime: string;
|
|
305
305
|
cwd?: string;
|
|
306
306
|
}
|
|
307
|
-
|
|
307
|
+
interface DeclareBlockInput {
|
|
308
308
|
/** What the agent needs from the user, front-loaded. */
|
|
309
309
|
text: string;
|
|
310
310
|
/** Answerable choices, if the ask is a pick-one. */
|
|
@@ -347,40 +347,6 @@ export declare function removeBlock(blockId: string, root?: string): boolean;
|
|
|
347
347
|
* CLI-writable user hooks dir without a separate file in the npm tarball.
|
|
348
348
|
*/
|
|
349
349
|
export declare const FEED_PUBLISH_HOOK_SCRIPT = "#!/usr/bin/env python3\n\"\"\"Publish and clear open-block records for `agents feed`.\n\nThe manifest invokes this script for top-level AskUserQuestion calls, waiting\nnotifications, question answers, and session lifecycle events. One atomic file\nper session means a new block replaces the previous block. Answer/resume/stop\nevents remove it so `agents feed` only lists decisions that are still open.\n\nSub-agent gate: when the PreToolUse payload carries `agent_type`, this is a\nTask/Agent subagent -- skip. Only the top-level agent publishes. Verified on\nClaude Code 2.1.170 (2026-07).\n\nFail-open: ANY error is swallowed so a feed hiccup never blocks a tool call.\n\"\"\"\nimport os\nimport sys\nimport json\nimport re\nimport socket\nimport tempfile\nfrom datetime import datetime, timezone\n\n# Notification subtypes that mean something is PENDING. Claude's idle_prompt is\n# deliberately absent: it fires a minute after the turn ended with the operator\n# idle, which is a finished turn, not a request -- publishing it put an\n# Approve/Deny banner on a session that had already answered \"pong\" (PHNX-3999).\nWAITING_NOTIFICATION_TYPES = {\n \"permission_prompt\",\n \"elicitation_dialog\",\n}\nCLEAR_EVENTS = {\n \"PostToolUse\",\n \"Stop\",\n \"SessionEnd\",\n}\n# Codex emits a PermissionRequest event (not Claude's Notification) when it\n# blocks on an approval prompt. Claude never fires PermissionRequest, so the\n# same script handles both: PermissionRequest maps to an approval-class block\n# with a high cost-of-delay so 'agents feed --dispatch' pages it as urgent.\n\n\ndef read_json(path):\n try:\n with open(path) as f:\n return json.load(f)\n except Exception:\n return None\n\n\ndef write_json(path, value):\n dir_name = os.path.dirname(path)\n os.makedirs(dir_name, exist_ok=True)\n fd, tmp = tempfile.mkstemp(dir=dir_name, suffix=\".tmp\")\n try:\n with os.fdopen(fd, \"w\") as f:\n json.dump(value, f, indent=2)\n os.replace(tmp, path)\n except Exception:\n try:\n os.unlink(tmp)\n except Exception:\n pass\n\n\ndef project_from_cwd(cwd):\n \"\"\"Basename of cwd, with worktree paths resolved to their repo name.\"\"\"\n if not cwd:\n return None\n norm = cwd.replace(\"\\\\\", \"/\").rstrip(\"/\")\n if not norm:\n return None\n marker = \"/.agents/worktrees/\"\n idx = norm.find(marker)\n if idx > 0:\n repo_path = norm[:idx]\n base = repo_path[repo_path.rfind(\"/\") + 1:]\n if base:\n return base\n base = norm[norm.rfind(\"/\") + 1:]\n return base or None\n\n\ndef main():\n raw = sys.stdin.read()\n try:\n payload = json.loads(raw) if raw.strip() else {}\n except Exception:\n return\n\n # Sub-agent gate.\n if payload.get(\"agent_type\"):\n return\n\n session_id = payload.get(\"session_id\", \"\")\n if not session_id:\n return\n\n safe_session_id = re.sub(r\"[^A-Za-z0-9._-]\", \"-\", session_id)\n block_id = f\"block-{safe_session_id}\"\n home = os.environ.get(\"HOME\") or os.path.expanduser(\"~\")\n feed_dir = os.path.join(home, \".agents\", \".history\", \"feed\")\n answered_dir = os.path.join(feed_dir, \"answered\")\n asks_dir = os.path.join(feed_dir, \"asks\")\n target = os.path.join(feed_dir, f\"{block_id}.json\")\n hook_event = payload.get(\"hook_event_name\", \"PreToolUse\")\n\n if hook_event in CLEAR_EVENTS:\n # A declared block (`agents feed post --blocked`) is the agent explicitly\n # saying it is stuck. Unlike a question/notification/approval block -- which\n # tracks an in-flight harness prompt that a lifecycle event resolves -- a\n # declared block stays open until it is actually ANSWERED. So while it is\n # still UNANSWERED, Stop/SessionEnd/PostToolUse must never silently drop it:\n # otherwise the needs-you record vanishes the moment the agent parks the block\n # and its turn ends -- exactly when the owner still needs to see and answer it.\n # Once it IS answered (an answered marker exists), it clears like any other\n # block by falling through below -- which frees that marker too, so a later\n # `--blocked` in the same session is not falsely locked as already-answered\n # (recordAnswer creates the marker with O_EXCL).\n try:\n with open(target) as existing_file:\n existing = json.load(existing_file)\n answered = os.path.exists(os.path.join(answered_dir, f\"{block_id}.json\"))\n if existing.get(\"kind\") == \"declared\" and not answered:\n return\n except Exception:\n pass\n # A matcher-less PostToolUse clear (registered for Codex so an approved\n # tool clears its approval card) must NOT wipe an open AskUserQuestion\n # while an unrelated tool runs mid-question -- those are cleared only by\n # the AskUserQuestion-matched PostToolUse. So on PostToolUse, keep a\n # 'question' block; approval/notification blocks clear once the tool runs.\n if hook_event == \"PostToolUse\":\n try:\n with open(target) as existing_file:\n existing = json.load(existing_file)\n if existing.get(\"kind\") == \"question\" and payload.get(\"tool_name\") != \"AskUserQuestion\":\n return\n except Exception:\n pass\n try:\n os.unlink(target)\n except FileNotFoundError:\n pass\n except Exception:\n pass\n # Also clear the answered marker so a future question for this session\n # is not permanently locked.\n try:\n os.unlink(os.path.join(answered_dir, f\"{block_id}.json\"))\n except FileNotFoundError:\n pass\n except Exception:\n pass\n return\n\n # Terminal answers (human typed in the TUI) record an answered marker and\n # remove the block file so the feed stops showing it within one poll cycle.\n # The marker stays behind so a concurrent surface cannot double-answer.\n # A resolution tombstone is written BEFORE unlink (matching TS recordAnswer)\n # so a stale lifecycle re-read cannot resurrect this generation.\n if hook_event == \"UserPromptSubmit\":\n os.makedirs(answered_dir, exist_ok=True)\n marker = os.path.join(answered_dir, f\"{block_id}.json\")\n now_iso = datetime.now(timezone.utc).isoformat()\n try:\n fd = os.open(marker, os.O_WRONLY | os.O_CREAT | os.O_EXCL, 0o644)\n record = {\n \"answeredAt\": now_iso,\n \"answeredFrom\": \"terminal\",\n }\n with os.fdopen(fd, \"w\") as f:\n json.dump(record, f, indent=2)\n except FileExistsError:\n pass\n except Exception:\n pass\n # Tombstone first, then drop the open-block view. A missing/corrupt\n # block means there is nothing to resolve; fail open.\n existing = read_json(target)\n if isinstance(existing, dict):\n generation = existing.get(\"generation\") or existing.get(\"ts\")\n if generation:\n tombstone = {\n \"blockId\": block_id,\n \"generation\": generation,\n \"resolvedAt\": now_iso,\n \"reason\": \"answered\",\n }\n source_cursor = existing.get(\"sourceCursor\")\n if source_cursor:\n tombstone[\"sourceCursor\"] = source_cursor\n write_json(\n os.path.join(feed_dir, \"resolutions\", f\"{block_id}.json\"),\n tombstone,\n )\n # Remove the visible block so the feed drops the answered question.\n try:\n os.unlink(target)\n except FileNotFoundError:\n pass\n except Exception:\n pass\n return\n\n notification_type = None\n codex_approval = False\n if hook_event == \"Notification\":\n notification_type = payload.get(\"notification_type\", \"\")\n if notification_type not in WAITING_NOTIFICATION_TYPES:\n return\n # Claude emits a generic permission notification after presenting an\n # AskUserQuestion. Keep the structured questions and options already\n # published for this session instead of replacing them with that less\n # useful notification text.\n try:\n with open(target) as existing_file:\n existing = json.load(existing_file)\n if existing.get(\"kind\") == \"question\":\n return\n except Exception:\n pass\n message = payload.get(\"message\", \"\")\n if not message:\n return\n normalized_questions = [{\n \"text\": message,\n \"header\": payload.get(\"title\") or notification_type.replace(\"_\", \" \").title(),\n \"multiSelect\": False,\n }]\n kind = \"notification\"\n elif hook_event == \"PermissionRequest\":\n # Codex approval prompt. The payload mirrors PreToolUse (tool_name,\n # tool_input) but carries no questions -- Codex is asking to run a tool,\n # not asking the operator a multiple-choice question. Publish it as a\n # notification-kind approval block naming the tool so the feed and the\n # phone notifier can surface it, and so AGI EXT can bridge\n # it to a VS Code notification.\n tool_name = payload.get(\"tool_name\") or \"a tool\"\n tool_input = payload.get(\"tool_input\", {})\n command = \"\"\n if isinstance(tool_input, dict):\n command = (\n tool_input.get(\"command\")\n or tool_input.get(\"cmd\")\n or tool_input.get(\"path\")\n or \"\"\n )\n if isinstance(command, list):\n command = \" \".join(str(c) for c in command)\n detail = f\": {command}\" if command else \"\"\n normalized_questions = [{\n \"text\": f\"Codex needs approval to run {tool_name}{detail}\",\n \"header\": \"Approval needed\",\n \"multiSelect\": False,\n }]\n kind = \"notification\"\n notification_type = \"permission_prompt\"\n codex_approval = True\n else:\n tool_input = payload.get(\"tool_input\", {})\n questions = tool_input.get(\"questions\", [])\n if not questions:\n return\n normalized_questions = []\n for q in questions:\n if not isinstance(q, dict):\n continue\n question = {\n \"text\": q.get(\"question\", q.get(\"header\", \"\")),\n \"header\": q.get(\"header\"),\n \"multiSelect\": q.get(\"multiSelect\", False),\n }\n raw_opts = q.get(\"options\", [])\n if raw_opts:\n question[\"options\"] = [\n {\"label\": o.get(\"label\", \"\"), \"description\": o.get(\"description\")}\n for o in raw_opts\n if isinstance(o, dict)\n ]\n normalized_questions.append(question)\n if not normalized_questions:\n return\n kind = \"question\"\n\n # Identity from env (set by agents-cli at spawn).\n mailbox_id = os.path.basename(\n os.environ.get(\"AGENTS_MAILBOX_DIR\", \"\").rstrip(\"/\")\n ) or session_id\n\n now = datetime.now(timezone.utc)\n now_iso = now.isoformat()\n now_ms = int(now.timestamp() * 1000)\n stats_path = os.path.join(asks_dir, f\"{safe_session_id}.json\")\n stats = read_json(stats_path) or {}\n recent = stats.get(\"recentAskTimestamps\") if isinstance(stats, dict) else []\n if not isinstance(recent, list):\n recent = []\n recent.append(now_iso)\n # Keep enough history for rolling one-hour needy detection without unbounded\n # per-session files. The TypeScript reader applies the exact time window.\n recent = recent[-200:]\n write_json(stats_path, {\n \"sessionId\": session_id,\n \"mailboxId\": mailbox_id,\n \"firstAskAt\": stats.get(\"firstAskAt\") or now_iso,\n \"lastAskAt\": now_iso,\n \"totalAskCount\": int(stats.get(\"totalAskCount\") or 0) + 1,\n \"recentAskTimestamps\": recent,\n })\n\n hostname = os.environ.get(\"AGENTS_SYNC_MACHINE_ID\") or socket.gethostname()\n host = hostname.split(\".\")[0].strip().lower()\n host = re.sub(r\"[^a-z0-9_-]\", \"-\", host) or \"unknown\"\n\n runtime = os.environ.get(\"AGENTS_RUNTIME\", \"headless\")\n cwd = payload.get(\"cwd\") or os.environ.get(\"AGENTS_CWD\")\n project = project_from_cwd(cwd)\n\n block = {\n \"blockId\": block_id,\n \"sessionId\": session_id,\n \"mailboxId\": mailbox_id,\n \"host\": host,\n \"runtime\": runtime,\n \"ts\": now_iso,\n # Write-time cursor so a new generation is not suppressed when\n # session.lastActivityMs is unresolvable (cloud / remote / index-lag).\n \"sourceCursor\": {\"lastActivityMs\": now_ms},\n \"questions\": normalized_questions,\n \"kind\": kind,\n }\n if project:\n block[\"project\"] = project\n if notification_type:\n block[\"notificationType\"] = notification_type\n\n # A Codex PermissionRequest is a real approval gate: mark it approval-class\n # with a high cost-of-delay so 'agents feed --dispatch' classifies it urgent\n # (isPhoneUrgent gates on costOfDelay >= phoneNotifyThreshold, default\n # 'medium') and pages the phone. A plain 'deny' is the safe default.\n if codex_approval:\n block[\"blockClass\"] = \"approval\"\n block[\"costOfDelay\"] = \"high\"\n block[\"safeDefault\"] = \"deny\"\n\n # Optional multi-operator control metadata passed by the agent in the\n # AskUserQuestion tool_input. Defaults keep the existing behavior. A Codex\n # PermissionRequest carries tool ARGS in tool_input (command/path), not\n # operator controls, so it is excluded here -- its class/cost is stamped\n # above from codex_approval.\n controls = payload.get(\"tool_input\", {}) if hook_event not in (\"Notification\", \"PermissionRequest\") else {}\n block_class = controls.get(\"blockClass\") if isinstance(controls, dict) else None\n if block_class in (\"approval\", \"decision\"):\n block[\"blockClass\"] = block_class\n consequence = controls.get(\"consequence\") if isinstance(controls, dict) else None\n if consequence:\n block[\"consequence\"] = consequence\n allowed = controls.get(\"allowedOperators\") if isinstance(controls, dict) else None\n if isinstance(allowed, list):\n block[\"allowedOperators\"] = [str(a) for a in allowed]\n timeout = controls.get(\"timeoutMinutes\") if isinstance(controls, dict) else None\n if isinstance(timeout, (int, float)) and timeout > 0:\n block[\"timeoutMinutes\"] = int(timeout)\n safe_default = controls.get(\"safeDefault\") if isinstance(controls, dict) else None\n if isinstance(safe_default, str):\n block[\"safeDefault\"] = safe_default\n cost = controls.get(\"costOfDelay\") if isinstance(controls, dict) else None\n if cost in (\"low\", \"medium\", \"high\"):\n block[\"costOfDelay\"] = cost\n\n # Publishing a new question clears any stale answered marker from the\n # previous question in this session.\n try:\n os.unlink(os.path.join(answered_dir, f\"{block_id}.json\"))\n except FileNotFoundError:\n pass\n except Exception:\n pass\n\n # Python's expanduser() ignores HOME on Windows, while agents-cli honors a\n # HOME override on every platform. Use the same anchor so hooks and the CLI\n # always read/write one feed store (including temp-home and sandbox runs).\n os.makedirs(feed_dir, exist_ok=True)\n\n fd, tmp = tempfile.mkstemp(dir=feed_dir, suffix=\".tmp\")\n try:\n with os.fdopen(fd, \"w\") as f:\n json.dump(block, f, indent=2)\n os.replace(tmp, target)\n except Exception:\n try:\n os.unlink(tmp)\n except Exception:\n pass\n\n\nif __name__ == \"__main__\":\n try:\n main()\n except Exception:\n pass # fail open\n";
|
|
350
|
-
/** Manifest entry for the feed-publish hook, matching the ManifestHook shape. */
|
|
351
|
-
export declare const FEED_PUBLISH_HOOK_MANIFEST: {
|
|
352
|
-
name: string;
|
|
353
|
-
events: string[];
|
|
354
|
-
matcher: string;
|
|
355
|
-
script: string;
|
|
356
|
-
timeout: number;
|
|
357
|
-
};
|
|
358
|
-
export declare const FEED_NOTIFICATION_HOOK_MANIFEST: {
|
|
359
|
-
name: string;
|
|
360
|
-
events: string[];
|
|
361
|
-
matcher: string;
|
|
362
|
-
script: string;
|
|
363
|
-
timeout: number;
|
|
364
|
-
};
|
|
365
|
-
export declare const FEED_PERMISSION_HOOK_MANIFEST: {
|
|
366
|
-
name: string;
|
|
367
|
-
events: string[];
|
|
368
|
-
script: string;
|
|
369
|
-
timeout: number;
|
|
370
|
-
};
|
|
371
|
-
export declare const FEED_ANSWERED_HOOK_MANIFEST: {
|
|
372
|
-
name: string;
|
|
373
|
-
events: string[];
|
|
374
|
-
matcher: string;
|
|
375
|
-
script: string;
|
|
376
|
-
timeout: number;
|
|
377
|
-
};
|
|
378
|
-
export declare const FEED_LIFECYCLE_HOOK_MANIFEST: {
|
|
379
|
-
name: string;
|
|
380
|
-
events: string[];
|
|
381
|
-
script: string;
|
|
382
|
-
timeout: number;
|
|
383
|
-
};
|
|
384
350
|
/**
|
|
385
351
|
* Install the feed-publish hook script into the user hooks dir and add its
|
|
386
352
|
* manifest entry to the user agents.yaml. The system repo is an auto-pulled,
|
|
@@ -391,3 +357,4 @@ export declare function ensureFeedPublishHook(userAgentsDir?: string): {
|
|
|
391
357
|
installed: boolean;
|
|
392
358
|
error?: string;
|
|
393
359
|
};
|
|
360
|
+
export {};
|
package/dist/lib/feed/feed.js
CHANGED
|
@@ -85,24 +85,6 @@ export function recordResolution(resolution, root) {
|
|
|
85
85
|
export function readResolution(blockId, root) {
|
|
86
86
|
return safeReadJson(path.join(resolutionDir(root ?? getFeedDir()), `${blockId}.json`));
|
|
87
87
|
}
|
|
88
|
-
/** Read every resolution tombstone. Returns them sorted by stable block filename. */
|
|
89
|
-
export function listResolutions(root) {
|
|
90
|
-
const dir = resolutionDir(root ?? getFeedDir());
|
|
91
|
-
let names;
|
|
92
|
-
try {
|
|
93
|
-
names = fs.readdirSync(dir);
|
|
94
|
-
}
|
|
95
|
-
catch {
|
|
96
|
-
return [];
|
|
97
|
-
}
|
|
98
|
-
const out = [];
|
|
99
|
-
for (const name of names.filter(n => n.endsWith('.json')).sort()) {
|
|
100
|
-
const parsed = safeReadJson(path.join(dir, name));
|
|
101
|
-
if (parsed?.blockId && parsed.generation && parsed.reason)
|
|
102
|
-
out.push(parsed);
|
|
103
|
-
}
|
|
104
|
-
return out;
|
|
105
|
-
}
|
|
106
88
|
/**
|
|
107
89
|
* Stable block id for a session. One block per session -- a new question
|
|
108
90
|
* replaces the previous one (the agent can only ask one question at a time).
|
|
@@ -345,12 +327,8 @@ export function recordNotified(blockId, root) {
|
|
|
345
327
|
block.notifiedAt = new Date().toISOString();
|
|
346
328
|
publishBlock(block, dir);
|
|
347
329
|
}
|
|
348
|
-
/** Convenience: record that a terminal answer closed the block. */
|
|
349
|
-
export function recordTerminalAnswer(blockId, root) {
|
|
350
|
-
recordAnswer(blockId, { answeredFrom: 'terminal' }, root);
|
|
351
|
-
}
|
|
352
330
|
/** Remove answered marker and receipts for a block (used by block removal/GC). */
|
|
353
|
-
|
|
331
|
+
function clearBlockLifecycle(blockId, root) {
|
|
354
332
|
const dir = root ?? getFeedDir();
|
|
355
333
|
for (const sub of [answeredDir(dir), receiptDir(dir)]) {
|
|
356
334
|
try {
|
|
@@ -913,43 +891,6 @@ if __name__ == "__main__":
|
|
|
913
891
|
except Exception:
|
|
914
892
|
pass # fail open
|
|
915
893
|
`;
|
|
916
|
-
/** Manifest entry for the feed-publish hook, matching the ManifestHook shape. */
|
|
917
|
-
export const FEED_PUBLISH_HOOK_MANIFEST = {
|
|
918
|
-
name: 'feed-publish',
|
|
919
|
-
events: ['PreToolUse'],
|
|
920
|
-
matcher: 'AskUserQuestion',
|
|
921
|
-
script: '10-feed-publish.py',
|
|
922
|
-
timeout: 5,
|
|
923
|
-
};
|
|
924
|
-
export const FEED_NOTIFICATION_HOOK_MANIFEST = {
|
|
925
|
-
name: 'feed-publish-notification',
|
|
926
|
-
events: ['Notification'],
|
|
927
|
-
matcher: 'permission_prompt|elicitation_dialog',
|
|
928
|
-
script: '10-feed-publish.py',
|
|
929
|
-
timeout: 5,
|
|
930
|
-
};
|
|
931
|
-
// Codex fires PermissionRequest (not Claude's Notification) when it blocks on an
|
|
932
|
-
// approval prompt. The same script handles it, publishing a high-cost approval
|
|
933
|
-
// block so the feed dispatch pages the phone. PermissionRequest has no matcher.
|
|
934
|
-
export const FEED_PERMISSION_HOOK_MANIFEST = {
|
|
935
|
-
name: 'feed-publish-permission',
|
|
936
|
-
events: ['PermissionRequest'],
|
|
937
|
-
script: '10-feed-publish.py',
|
|
938
|
-
timeout: 5,
|
|
939
|
-
};
|
|
940
|
-
export const FEED_ANSWERED_HOOK_MANIFEST = {
|
|
941
|
-
name: 'feed-clear-answered',
|
|
942
|
-
events: ['PostToolUse'],
|
|
943
|
-
matcher: 'AskUserQuestion',
|
|
944
|
-
script: '10-feed-publish.py',
|
|
945
|
-
timeout: 5,
|
|
946
|
-
};
|
|
947
|
-
export const FEED_LIFECYCLE_HOOK_MANIFEST = {
|
|
948
|
-
name: 'feed-clear-lifecycle',
|
|
949
|
-
events: ['Stop', 'UserPromptSubmit', 'SessionEnd'],
|
|
950
|
-
script: '10-feed-publish.py',
|
|
951
|
-
timeout: 5,
|
|
952
|
-
};
|
|
953
894
|
/**
|
|
954
895
|
* Install the feed-publish hook script into the user hooks dir and add its
|
|
955
896
|
* manifest entry to the user agents.yaml. The system repo is an auto-pulled,
|