@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,265 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical tool activity on the feed stream — browser tasks and computer runs
|
|
3
|
+
* projected into one row contract, alongside the agent and attention rows.
|
|
4
|
+
*
|
|
5
|
+
* WHY A PROJECTION AND NOT A NEW STORE. Both sources already exist and already
|
|
6
|
+
* have an owner: `agents browser sessions` groups a profile's captures into
|
|
7
|
+
* task-first rows (`browser/sessions-list.ts`), and `agents computer sessions`
|
|
8
|
+
* groups `computer.action` ledger entries into run rows
|
|
9
|
+
* (`computer/sessions-list.ts`). A menu-bar or Fleet view that wanted the same
|
|
10
|
+
* information had only one way to get it: shell out to those two commands, per
|
|
11
|
+
* tool, per device, on a timer. That is the per-tool polling this module
|
|
12
|
+
* removes — the rows ride the ONE stream `agents feed watch --json` already
|
|
13
|
+
* holds open, so a consumer switching its All/Agents/Browser/Computer filter
|
|
14
|
+
* spawns zero commands.
|
|
15
|
+
*
|
|
16
|
+
* WHAT IS DELIBERATELY DIFFERENT BETWEEN THE TWO KINDS. A browser task is a
|
|
17
|
+
* LIVE resource: it is bound in the task index while it exists, it can be
|
|
18
|
+
* driven, and it can be closed (`agents browser done --task <name>`). A
|
|
19
|
+
* computer run is a LEDGER ENTRY: the actions already happened, the CLI process
|
|
20
|
+
* that performed them has exited, and there is nothing to stop. So
|
|
21
|
+
* {@link ComputerToolRow} pins `live: false` and carries no close/stop command
|
|
22
|
+
* at all — inventing one would offer an operator a control that cannot work.
|
|
23
|
+
*
|
|
24
|
+
* PRIVACY. Rows carry capture PATHS and names, never contents, and a task URL
|
|
25
|
+
* is redacted ({@link redactToolUrl}) before it leaves this process: userinfo
|
|
26
|
+
* is stripped and credential-shaped query parameters are replaced. The feed is
|
|
27
|
+
* read by the menu bar, the extension, and any `--json` consumer; a bearer
|
|
28
|
+
* token in a `?access_token=` is exactly the value that must not ride it.
|
|
29
|
+
*/
|
|
30
|
+
import { createHash } from 'node:crypto';
|
|
31
|
+
import { normalizeHost } from '../machine-id.js';
|
|
32
|
+
import { sessionHeadline } from '../session/title.js';
|
|
33
|
+
/** Newest captures retained per row. A task with hundreds of screenshots must
|
|
34
|
+
* not turn one stream envelope into a megabyte. */
|
|
35
|
+
export const TOOL_CAPTURE_LIMIT = 20;
|
|
36
|
+
/** Newest actions retained per computer row, for the same reason. */
|
|
37
|
+
export const TOOL_ACTION_LIMIT = 50;
|
|
38
|
+
/** Stable identity for one tool row within one device scope. */
|
|
39
|
+
export function toolRowKey(scope, kind, identity) {
|
|
40
|
+
return createHash('sha256').update(`${scope}\0${kind}\0${identity}`).digest('base64url').slice(0, 22);
|
|
41
|
+
}
|
|
42
|
+
/** Query parameters whose value is a credential, not a locator. */
|
|
43
|
+
const CREDENTIAL_PARAM = /(token|secret|password|passwd|pwd|api[-_]?key|auth|session|signature|sig|code)/i;
|
|
44
|
+
const REDACTED = '<redacted>';
|
|
45
|
+
/**
|
|
46
|
+
* A task URL safe to publish: userinfo removed and credential-shaped query
|
|
47
|
+
* parameters replaced. A string that does not parse as a URL is dropped
|
|
48
|
+
* entirely rather than published unexamined — it cannot be redacted safely.
|
|
49
|
+
*/
|
|
50
|
+
export function redactToolUrl(raw) {
|
|
51
|
+
if (!raw)
|
|
52
|
+
return undefined;
|
|
53
|
+
let url;
|
|
54
|
+
try {
|
|
55
|
+
url = new URL(raw);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
url.username = '';
|
|
61
|
+
url.password = '';
|
|
62
|
+
for (const key of [...url.searchParams.keys()]) {
|
|
63
|
+
if (CREDENTIAL_PARAM.test(key))
|
|
64
|
+
url.searchParams.set(key, REDACTED);
|
|
65
|
+
}
|
|
66
|
+
// A fragment is where OAuth implicit flows put the token, and nothing on a
|
|
67
|
+
// status row needs it.
|
|
68
|
+
if (url.hash)
|
|
69
|
+
url.hash = '';
|
|
70
|
+
return url.toString();
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* The owning agent session, or nothing.
|
|
74
|
+
*
|
|
75
|
+
* `sessionId` is passed in as the EFFECTIVE identity rather than read off the
|
|
76
|
+
* capture row: a task's session is recorded in the live task record and in the
|
|
77
|
+
* device binding as well as in the durable capture history, and a row assembled
|
|
78
|
+
* from only one of those had an owner on some paths and not others. Resolving the
|
|
79
|
+
* effective id first is what makes the owner link consistent for one task however
|
|
80
|
+
* its row was assembled.
|
|
81
|
+
*
|
|
82
|
+
* Returns undefined when no id is known. `recordBrowserSession`/`emit` are
|
|
83
|
+
* pre-existing no-ops for some paths, so closed history genuinely lacks an owner
|
|
84
|
+
* sometimes — and an invented link would be worse than an absent one.
|
|
85
|
+
*/
|
|
86
|
+
function ownerOf(sessionId, linkedSession, scope) {
|
|
87
|
+
if (!sessionId)
|
|
88
|
+
return undefined;
|
|
89
|
+
const session = linkedSession ?? undefined;
|
|
90
|
+
// One headline ladder for the whole CLI (SES-14c): a row's own `label`, then the
|
|
91
|
+
// daemon-generated title, then the first-prompt topic. Re-deriving it here would
|
|
92
|
+
// silently drop the generated-title rung and show a different name for the same
|
|
93
|
+
// session than `agents sessions` does.
|
|
94
|
+
const label = session ? sessionHeadline(session) : undefined;
|
|
95
|
+
return {
|
|
96
|
+
sessionId,
|
|
97
|
+
device: normalizeHost(session?.machine ?? scope),
|
|
98
|
+
...(label ? { label } : {}),
|
|
99
|
+
...(session?.agent ? { agent: session.agent } : {}),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/** A machine name, or undefined for the `unknown` not-identified sentinel. */
|
|
103
|
+
function knownMachine(machine) {
|
|
104
|
+
return machine && machine !== 'unknown' ? machine : undefined;
|
|
105
|
+
}
|
|
106
|
+
function countBy(items, key) {
|
|
107
|
+
const counts = {};
|
|
108
|
+
for (const item of items)
|
|
109
|
+
counts[key(item)] = (counts[key(item)] ?? 0) + 1;
|
|
110
|
+
return counts;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* A browser task the task index binds but that has produced no capture yet.
|
|
114
|
+
*
|
|
115
|
+
* `buildBrowserSessionRows` derives its rows from captures on disk, so a task
|
|
116
|
+
* that was just opened — bound, live, drivable, closable — had no row at all
|
|
117
|
+
* until its first screenshot landed. That is the window an operator most wants
|
|
118
|
+
* to see, and it is exactly when a Sessions pane showed nothing. This
|
|
119
|
+
* synthesizes the zero-capture row so it goes through the SAME projection rather
|
|
120
|
+
* than a second parallel one.
|
|
121
|
+
*/
|
|
122
|
+
export function boundBrowserRow(task, binding) {
|
|
123
|
+
return {
|
|
124
|
+
kind: 'task', task, profile: binding.profile ?? '',
|
|
125
|
+
linkStatus: 'unlinked', artifacts: [],
|
|
126
|
+
counts: { screenshot: 0, pdf: 0, recording: 0, download: 0 },
|
|
127
|
+
latestMtimeMs: 0,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* One browser task (or a profile's downloads bucket) as a tool row. Pure: the
|
|
132
|
+
* liveness verdict is passed in, because only the machine running the browser
|
|
133
|
+
* daemon holds the task index that answers it.
|
|
134
|
+
*/
|
|
135
|
+
export function projectBrowserToolRow(scope, row, binding, live) {
|
|
136
|
+
const host = normalizeHost(scope);
|
|
137
|
+
// Live means the task still EXISTS: either this host's browser holds a live
|
|
138
|
+
// record for it, or the task index still routes it (which is the case for a
|
|
139
|
+
// task whose browser runs on another device).
|
|
140
|
+
const isLive = Boolean(row.task) && (live !== undefined || binding !== undefined);
|
|
141
|
+
const captures = row.artifacts.slice(0, TOOL_CAPTURE_LIMIT).map((artifact) => ({
|
|
142
|
+
kind: artifact.kind, name: artifact.name, path: artifact.path, host, bytes: artifact.bytes, atMs: artifact.mtimeMs,
|
|
143
|
+
}));
|
|
144
|
+
const oldest = row.artifacts.length > 0 ? row.artifacts[row.artifacts.length - 1].mtimeMs : row.latestMtimeMs;
|
|
145
|
+
const url = redactToolUrl(binding?.url);
|
|
146
|
+
// One effective identity for the row AND its owner link, resolved before either
|
|
147
|
+
// is built: durable capture history first (it survives the task), then the live
|
|
148
|
+
// record, then the device binding.
|
|
149
|
+
const sessionId = row.sessionId ?? live?.sessionId ?? binding?.sessionId;
|
|
150
|
+
const launchId = row.launchId ?? live?.launchId ?? binding?.launchId;
|
|
151
|
+
const owner = ownerOf(sessionId, row.linkedSession, host);
|
|
152
|
+
// Tabs are only knowable from a LIVE task record on THIS host; a row projected
|
|
153
|
+
// from captures alone, or from a binding pointing at another device, genuinely
|
|
154
|
+
// does not know them and says so by omitting the field.
|
|
155
|
+
const tabs = live?.tabs;
|
|
156
|
+
const showTab = tabs?.find((tab) => tab.current && !tab.borrowed)?.id
|
|
157
|
+
?? tabs?.find((tab) => !tab.borrowed)?.id;
|
|
158
|
+
const startedAtMs = live?.startedAtMs ?? binding?.createdAt ?? oldest;
|
|
159
|
+
// A task with no captures has no capture mtime to sort by. `lastActionAt` is
|
|
160
|
+
// refreshed by every task-scoped action, so it is the honest freshness key;
|
|
161
|
+
// its own start is the fallback. Reporting 0 would sort a brand-new live task
|
|
162
|
+
// to the very bottom of a newest-first list.
|
|
163
|
+
const updatedAtMs = Math.max(row.latestMtimeMs, live?.lastActionAtMs ?? 0) || startedAtMs;
|
|
164
|
+
return {
|
|
165
|
+
kind: 'browser',
|
|
166
|
+
// Keyed on the TASK, never on the profile. A task with no captures yet is
|
|
167
|
+
// discovered from the task index, where the profile may not be recorded, so
|
|
168
|
+
// folding the profile into the identity would give the same task two
|
|
169
|
+
// different keys and render it twice the moment its first capture landed.
|
|
170
|
+
// Task names are unique within a machine's task index, which is the scope
|
|
171
|
+
// this key is already qualified by. The downloads bucket has no task, so it
|
|
172
|
+
// keys on its profile — one such row per profile, which is what it is.
|
|
173
|
+
rowKey: toolRowKey(host, 'browser', row.task ? `task\0${row.task}` : `downloads\0${row.profile}`),
|
|
174
|
+
scope: host,
|
|
175
|
+
device: normalizeHost(binding?.device ?? host),
|
|
176
|
+
live: isLive,
|
|
177
|
+
...(row.task ? { task: row.task } : {}),
|
|
178
|
+
...(sessionId ? { sessionId } : {}),
|
|
179
|
+
...(launchId ? { launchId } : {}),
|
|
180
|
+
...(row.linkedSession?.agent ? { agent: row.linkedSession.agent } : {}),
|
|
181
|
+
...(owner ? { owner } : {}),
|
|
182
|
+
linkStatus: row.linkedSession ? 'linked' : sessionId ? 'unresolved' : 'unlinked',
|
|
183
|
+
startedAtMs,
|
|
184
|
+
updatedAtMs,
|
|
185
|
+
captures,
|
|
186
|
+
captureCounts: countBy(row.artifacts, (artifact) => artifact.kind),
|
|
187
|
+
profile: row.profile || live?.profile || '',
|
|
188
|
+
...(url ? { url } : {}),
|
|
189
|
+
...(tabs ? { tabs } : {}),
|
|
190
|
+
// `runOn` is the OBSERVING host, not `device`: the binding that resolves the
|
|
191
|
+
// task's device lives here, and passing `--device` to a later verb is
|
|
192
|
+
// refused outright. See {@link ToolCommand}.
|
|
193
|
+
...(isLive && showTab ? { showCommand: { command: 'agents', args: ['browser', 'tab', 'focus', showTab, '--task', row.task], runOn: host } } : {}),
|
|
194
|
+
...(isLive ? { closeCommand: { command: 'agents', args: ['browser', 'done', '--task', row.task], runOn: host } } : {}),
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* One computer run as a tool row. `live` is pinned false and no close/stop
|
|
199
|
+
* command is produced: the emitting CLI process is already gone.
|
|
200
|
+
*/
|
|
201
|
+
export function projectComputerToolRow(scope, row) {
|
|
202
|
+
const host = normalizeHost(scope);
|
|
203
|
+
const owner = ownerOf(row.sessionId, row.linkedSession, host);
|
|
204
|
+
const agent = row.agent ?? row.linkedSession?.agent;
|
|
205
|
+
// Captures come ONLY from a `capture` the producer recorded after the file was
|
|
206
|
+
// written. A screenshot action from before the producer carried that field has
|
|
207
|
+
// no path to report, and this deliberately reports none rather than guessing one
|
|
208
|
+
// from an output flag — a fabricated path is worse than an honest absence.
|
|
209
|
+
//
|
|
210
|
+
// `host` is the INVOKING machine, never `remoteHost`. The engine's helper RPC
|
|
211
|
+
// returns the image as base64 and the invoking process resolves `--out` and
|
|
212
|
+
// writes the file locally, so even a remote-desktop run leaves its screenshot
|
|
213
|
+
// on the box that ran the command. Naming the driven host would send a consumer
|
|
214
|
+
// looking for the file on a machine it was never written to.
|
|
215
|
+
const captures = [];
|
|
216
|
+
const captureCounts = {};
|
|
217
|
+
for (const action of row.actions) {
|
|
218
|
+
if (!action.capture)
|
|
219
|
+
continue;
|
|
220
|
+
captureCounts[action.capture.kind] = (captureCounts[action.capture.kind] ?? 0) + 1;
|
|
221
|
+
if (captures.length >= TOOL_CAPTURE_LIMIT)
|
|
222
|
+
continue;
|
|
223
|
+
captures.push({
|
|
224
|
+
kind: action.capture.kind, name: action.capture.name, path: action.capture.path,
|
|
225
|
+
host,
|
|
226
|
+
...(action.capture.bytes !== undefined ? { bytes: action.capture.bytes } : {}),
|
|
227
|
+
atMs: action.tsMs,
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
const actions = row.actions.slice(0, TOOL_ACTION_LIMIT).map((action) => ({
|
|
231
|
+
verb: action.verb, atMs: action.tsMs,
|
|
232
|
+
...(action.host ? { host: action.host } : {}),
|
|
233
|
+
...(action.bundle ? { bundle: action.bundle } : {}),
|
|
234
|
+
}));
|
|
235
|
+
return {
|
|
236
|
+
kind: 'computer',
|
|
237
|
+
rowKey: toolRowKey(host, 'computer', row.invocationId ?? `${row.machine}\0${row.pid ?? ''}\0${row.startMs}`),
|
|
238
|
+
scope: host,
|
|
239
|
+
// `groupIntoComputerRuns` writes the literal 'unknown' when no record in the
|
|
240
|
+
// run identified a machine, which is a sentinel for "not identified" and not a
|
|
241
|
+
// device name. Publishing it made a locally-run action unaddressable and made
|
|
242
|
+
// it disappear under a device filter, so it resolves to the observing host —
|
|
243
|
+
// which is the machine whose ledger the run was read from.
|
|
244
|
+
device: normalizeHost(row.remoteHost ?? knownMachine(row.machine) ?? host),
|
|
245
|
+
live: false,
|
|
246
|
+
...(row.task ? { task: row.task } : {}),
|
|
247
|
+
...(row.sessionId ? { sessionId: row.sessionId } : {}),
|
|
248
|
+
...(row.launchId ? { launchId: row.launchId } : {}),
|
|
249
|
+
...(agent ? { agent } : {}),
|
|
250
|
+
...(owner ? { owner } : {}),
|
|
251
|
+
linkStatus: row.linkStatus,
|
|
252
|
+
startedAtMs: row.startMs,
|
|
253
|
+
updatedAtMs: row.endMs,
|
|
254
|
+
captures,
|
|
255
|
+
captureCounts,
|
|
256
|
+
...(row.bundle ? { bundle: row.bundle } : {}),
|
|
257
|
+
actions,
|
|
258
|
+
actionCounts: { ...row.counts },
|
|
259
|
+
...(row.recoveredActionCount !== undefined ? { recoveredActionCount: row.recoveredActionCount } : {}),
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
/** Newest first across both kinds — the order a consumer renders. */
|
|
263
|
+
export function sortToolRows(rows) {
|
|
264
|
+
return [...rows].sort((a, b) => b.updatedAtMs - a.updatedAtMs);
|
|
265
|
+
}
|
package/dist/lib/feed/watch.d.ts
CHANGED
|
@@ -1,64 +1,30 @@
|
|
|
1
|
-
import { type SessionWatchEnvelope, type
|
|
2
|
-
import {
|
|
3
|
-
import { type
|
|
1
|
+
import { type SessionWatchEnvelope, type WatchLocalOptions } from '../session/watch.js';
|
|
2
|
+
import { watchToolActivity } from './tool-activity.js';
|
|
3
|
+
import { type ToolRow } from './tools.js';
|
|
4
|
+
import { FeedWatchState, type FeedWatchEnvelope } from './envelope.js';
|
|
5
|
+
import { FeedHub } from './hub.js';
|
|
6
|
+
import { getCachedToolSetup, subscribeToolSetup, type ToolSetupRow } from '../setup-tool-status.js';
|
|
4
7
|
import type { GhExec } from '../github/pr-mergeable.js';
|
|
5
|
-
export
|
|
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
|
-
} | Base & {
|
|
19
|
-
type: 'agent.upsert';
|
|
20
|
-
rowKey: string;
|
|
21
|
-
agent: SessionWatchRow;
|
|
22
|
-
} | Base & {
|
|
23
|
-
type: 'agent.remove';
|
|
24
|
-
rowKey: string;
|
|
25
|
-
} | Base & {
|
|
26
|
-
type: 'attention.upsert';
|
|
27
|
-
rowKey: string;
|
|
28
|
-
attention: AttentionItem;
|
|
29
|
-
} | Base & {
|
|
30
|
-
type: 'attention.remove';
|
|
31
|
-
rowKey: string;
|
|
32
|
-
} | Base & {
|
|
33
|
-
type: 'activity.append';
|
|
34
|
-
event: ActivityEvent;
|
|
35
|
-
} | Base & {
|
|
36
|
-
type: 'scope';
|
|
37
|
-
capturedAt: number;
|
|
38
|
-
status: SessionWatchScopeStatus;
|
|
39
|
-
reason?: string;
|
|
40
|
-
} | Base & {
|
|
41
|
-
type: 'heartbeat';
|
|
42
|
-
capturedAt: number;
|
|
43
|
-
};
|
|
44
|
-
type FeedWatchPayload = FeedWatchEnvelope extends infer Envelope ? Envelope extends FeedWatchEnvelope ? Omit<Envelope, 'v' | 'streamId' | 'sequence'> : never : never;
|
|
45
|
-
export declare class FeedWatchState {
|
|
46
|
-
readonly streamId: string;
|
|
47
|
-
private sequence;
|
|
48
|
-
constructor(streamId?: `${string}-${string}-${string}-${string}-${string}`);
|
|
49
|
-
emit(event: FeedWatchPayload): FeedWatchEnvelope;
|
|
50
|
-
}
|
|
8
|
+
export { FeedWatchState, type FeedWatchEnvelope, type FeedWatchPayload } from './envelope.js';
|
|
51
9
|
/** Reuse session ownership reconciliation for the combined operator stream. */
|
|
52
10
|
export declare class FeedSessionProjection {
|
|
53
11
|
private readonly state;
|
|
54
12
|
private readonly sessions;
|
|
55
13
|
private readonly observations;
|
|
56
14
|
private projectedAttention;
|
|
15
|
+
/**
|
|
16
|
+
* Tool rows per observing scope. A reset replaces one scope's rows and must
|
|
17
|
+
* not touch another's — the same per-scope rule the agent rows follow, and
|
|
18
|
+
* the reason a peer reconnecting cannot erase the local machine's tasks.
|
|
19
|
+
*/
|
|
20
|
+
private readonly toolsByScope;
|
|
21
|
+
/** Whole-set per scope; see the `setup.snapshot` docblock in `envelope.ts`. */
|
|
22
|
+
private readonly setupByScope;
|
|
57
23
|
constructor(state?: FeedWatchState);
|
|
58
24
|
apply(event: FeedWatchEnvelope): FeedWatchEnvelope[];
|
|
59
25
|
}
|
|
60
|
-
export declare function projectSessionEnvelope(event: SessionWatchEnvelope, state: FeedWatchState, gh?: GhExec): Promise<FeedWatchEnvelope[]>;
|
|
61
|
-
|
|
26
|
+
export declare function projectSessionEnvelope(event: SessionWatchEnvelope, state: FeedWatchState, gh?: GhExec, tools?: ToolRow[], setup?: ToolSetupRow[]): Promise<FeedWatchEnvelope[]>;
|
|
27
|
+
interface WatchLocalFeedOptions {
|
|
62
28
|
scope: string;
|
|
63
29
|
signal: AbortSignal;
|
|
64
30
|
emit: (event: FeedWatchEnvelope) => void;
|
|
@@ -70,11 +36,44 @@ export interface WatchLocalFeedOptions {
|
|
|
70
36
|
sessions?: Pick<WatchLocalOptions, 'readCache' | 'readPrevious' | 'journalPath' | 'journalPollMs' | 'heartbeatMs'>;
|
|
71
37
|
/** The `gh` runner behind PR status; a test passes a recorded table. */
|
|
72
38
|
gh?: GhExec;
|
|
39
|
+
/** Tool-activity inputs, forwarded verbatim to {@link watchToolActivity}. */
|
|
40
|
+
tools?: Pick<Parameters<typeof watchToolActivity>[0], 'sweepMs' | 'roots' | 'sources'>;
|
|
41
|
+
/**
|
|
42
|
+
* Tool-setup readers. The setup teammate owns DETECTION
|
|
43
|
+
* (`lib/setup-tool-status.ts`); this stream only publishes what its cache
|
|
44
|
+
* already holds, and never triggers a probe of its own.
|
|
45
|
+
*/
|
|
46
|
+
setup?: {
|
|
47
|
+
read?: typeof getCachedToolSetup;
|
|
48
|
+
subscribe?: typeof subscribeToolSetup;
|
|
49
|
+
};
|
|
73
50
|
}
|
|
74
51
|
export declare function watchLocalFeed(options: WatchLocalFeedOptions): Promise<void>;
|
|
52
|
+
/**
|
|
53
|
+
* The one ingress for an envelope produced by ANOTHER agents-cli.
|
|
54
|
+
*
|
|
55
|
+
* `tools` was added to the `reset` payload within protocol v1, so a peer on an
|
|
56
|
+
* older CLI is a correct v1 producer that simply reports no tool rows — which is
|
|
57
|
+
* true of it, not a data defect to paper over. Normalizing HERE, at the single
|
|
58
|
+
* place a foreign envelope enters, is what keeps every consumer downstream able
|
|
59
|
+
* to treat the field as present instead of each re-checking it. A mixed-version
|
|
60
|
+
* fleet is the normal state during a rollout, so an absent field must not take
|
|
61
|
+
* the whole fan-out down.
|
|
62
|
+
*/
|
|
63
|
+
export declare function normalizePeerEnvelope(event: FeedWatchEnvelope): FeedWatchEnvelope;
|
|
64
|
+
/** The shared local collector, constructed on first use. Exposed for tests. */
|
|
65
|
+
export declare function sharedLocalFeedHub(): FeedHub;
|
|
66
|
+
/** Reset the shared collector. Tests only — it must not leak across cases. */
|
|
67
|
+
export declare function resetSharedLocalFeedHub(): Promise<void>;
|
|
68
|
+
/**
|
|
69
|
+
* Subscribe to this machine's rows through the shared collector, until abort.
|
|
70
|
+
*/
|
|
71
|
+
export declare function subscribeSharedLocalFeed(options: {
|
|
72
|
+
signal: AbortSignal;
|
|
73
|
+
emit: (event: FeedWatchEnvelope) => void;
|
|
74
|
+
}): Promise<void>;
|
|
75
75
|
export declare function watchFleetFeed(options: {
|
|
76
76
|
signal: AbortSignal;
|
|
77
77
|
emit: (event: FeedWatchEnvelope) => void;
|
|
78
78
|
reconnectMs?: number;
|
|
79
79
|
}): Promise<void>;
|
|
80
|
-
export {};
|
package/dist/lib/feed/watch.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { SessionProjection } from '../session/projection.js';
|
|
2
|
-
import { randomUUID } from 'node:crypto';
|
|
3
2
|
import * as fs from 'node:fs';
|
|
4
3
|
import * as path from 'node:path';
|
|
5
4
|
import { loadDevices, isDialableDevice } from '../devices/registry.js';
|
|
@@ -12,22 +11,26 @@ import { watchLocalSessions } from '../session/watch.js';
|
|
|
12
11
|
import { readBlock, readResolution, blockIdForSession } from './feed.js';
|
|
13
12
|
import { reconcileAttention } from './attention.js';
|
|
14
13
|
import { ActivityStream } from './activity-stream.js';
|
|
14
|
+
import { collectToolRows, watchToolActivity } from './tool-activity.js';
|
|
15
|
+
import { FeedWatchState } from './envelope.js';
|
|
16
|
+
import { FeedHub } from './hub.js';
|
|
17
|
+
import { getCachedToolSetup, subscribeToolSetup } from '../setup-tool-status.js';
|
|
15
18
|
import { PR_STATUS_TTL_MS, readPullRequestStatus, withPullRequestStatus } from './pr-status.js';
|
|
16
|
-
export
|
|
17
|
-
export class FeedWatchState {
|
|
18
|
-
streamId;
|
|
19
|
-
sequence = 0;
|
|
20
|
-
constructor(streamId = randomUUID()) { this.streamId = streamId; }
|
|
21
|
-
emit(event) {
|
|
22
|
-
return { v: 1, streamId: this.streamId, sequence: ++this.sequence, ...event };
|
|
23
|
-
}
|
|
24
|
-
}
|
|
19
|
+
export { FeedWatchState } from './envelope.js';
|
|
25
20
|
/** Reuse session ownership reconciliation for the combined operator stream. */
|
|
26
21
|
export class FeedSessionProjection {
|
|
27
22
|
state;
|
|
28
23
|
sessions = new SessionProjection();
|
|
29
24
|
observations = new Map();
|
|
30
25
|
projectedAttention = new Map();
|
|
26
|
+
/**
|
|
27
|
+
* Tool rows per observing scope. A reset replaces one scope's rows and must
|
|
28
|
+
* not touch another's — the same per-scope rule the agent rows follow, and
|
|
29
|
+
* the reason a peer reconnecting cannot erase the local machine's tasks.
|
|
30
|
+
*/
|
|
31
|
+
toolsByScope = new Map();
|
|
32
|
+
/** Whole-set per scope; see the `setup.snapshot` docblock in `envelope.ts`. */
|
|
33
|
+
setupByScope = new Map();
|
|
31
34
|
constructor(state = new FeedWatchState()) {
|
|
32
35
|
this.state = state;
|
|
33
36
|
}
|
|
@@ -44,6 +47,8 @@ export class FeedSessionProjection {
|
|
|
44
47
|
attention.set(row.rowKey, item);
|
|
45
48
|
}
|
|
46
49
|
this.observations.set(scope, attention);
|
|
50
|
+
this.toolsByScope.set(scope, new Map(event.tools.map((tool) => [tool.rowKey, tool])));
|
|
51
|
+
this.setupByScope.set(scope, event.setup);
|
|
47
52
|
}
|
|
48
53
|
else if (event.type === 'agent.upsert') {
|
|
49
54
|
sessionEvent = { ...base, type: 'upsert', rowKey: event.rowKey, row: event.agent };
|
|
@@ -60,6 +65,20 @@ export class FeedSessionProjection {
|
|
|
60
65
|
else if (event.type === 'attention.remove') {
|
|
61
66
|
this.observations.get(scope)?.delete(event.rowKey);
|
|
62
67
|
}
|
|
68
|
+
else if (event.type === 'tool.upsert') {
|
|
69
|
+
if (!this.toolsByScope.has(scope))
|
|
70
|
+
this.toolsByScope.set(scope, new Map());
|
|
71
|
+
this.toolsByScope.get(scope).set(event.rowKey, event.tool);
|
|
72
|
+
return [this.state.emit({ type: 'tool.upsert', scope, rowKey: event.rowKey, tool: event.tool })];
|
|
73
|
+
}
|
|
74
|
+
else if (event.type === 'tool.remove') {
|
|
75
|
+
this.toolsByScope.get(scope)?.delete(event.rowKey);
|
|
76
|
+
return [this.state.emit({ type: 'tool.remove', scope, rowKey: event.rowKey })];
|
|
77
|
+
}
|
|
78
|
+
else if (event.type === 'setup.snapshot') {
|
|
79
|
+
this.setupByScope.set(scope, event.setup);
|
|
80
|
+
return [this.state.emit({ type: 'setup.snapshot', scope, capturedAt: event.capturedAt, setup: event.setup })];
|
|
81
|
+
}
|
|
63
82
|
else {
|
|
64
83
|
const { v: _v, streamId: _streamId, sequence: _sequence, ...payload } = event;
|
|
65
84
|
return [this.state.emit(payload)];
|
|
@@ -78,7 +97,9 @@ export class FeedSessionProjection {
|
|
|
78
97
|
if (rowEvent.type === 'reset') {
|
|
79
98
|
resetScopes.add(rowEvent.scope);
|
|
80
99
|
result.push(this.state.emit({ type: 'reset', scope: rowEvent.scope, capturedAt: rowEvent.capturedAt, agents: rowEvent.rows,
|
|
81
|
-
attention: [...next.values()].filter(value => value.scope === rowEvent.scope).map(value => value.item)
|
|
100
|
+
attention: [...next.values()].filter(value => value.scope === rowEvent.scope).map(value => value.item),
|
|
101
|
+
tools: [...(this.toolsByScope.get(rowEvent.scope)?.values() ?? [])],
|
|
102
|
+
setup: this.setupByScope.get(rowEvent.scope) ?? [] }));
|
|
82
103
|
}
|
|
83
104
|
else if (rowEvent.type === 'upsert') {
|
|
84
105
|
result.push(this.state.emit({ type: 'agent.upsert', scope: rowEvent.scope, rowKey: rowEvent.rowKey, agent: rowEvent.row }));
|
|
@@ -137,11 +158,11 @@ async function projectAgent(agent, gh) {
|
|
|
137
158
|
const pullRequest = await pullRequestFor(agent, gh);
|
|
138
159
|
return { agent: withPullRequestStatus(agent, pullRequest), attention: attentionFor(agent, pullRequest) };
|
|
139
160
|
}
|
|
140
|
-
export async function projectSessionEnvelope(event, state, gh) {
|
|
161
|
+
export async function projectSessionEnvelope(event, state, gh, tools = [], setup = []) {
|
|
141
162
|
if (event.type === 'reset') {
|
|
142
163
|
const projected = await Promise.all(event.rows.map((row) => projectAgent(row, gh)));
|
|
143
164
|
const attention = projected.map((p) => p.attention).filter((item) => item !== undefined);
|
|
144
|
-
return [state.emit({ type: 'reset', capturedAt: event.capturedAt, scope: event.scope, agents: projected.map((p) => p.agent), attention })];
|
|
165
|
+
return [state.emit({ type: 'reset', capturedAt: event.capturedAt, scope: event.scope, agents: projected.map((p) => p.agent), attention, tools, setup })];
|
|
145
166
|
}
|
|
146
167
|
if (event.type === 'upsert') {
|
|
147
168
|
const { agent, attention } = await projectAgent(event.row, gh);
|
|
@@ -199,6 +220,23 @@ export async function watchLocalFeed(options) {
|
|
|
199
220
|
// dropping it from a window the caller believes was covered.
|
|
200
221
|
const activity = new ActivityStream();
|
|
201
222
|
let activityCursor = Date.now();
|
|
223
|
+
// The tool rows as this machine last projected them. Held here rather than
|
|
224
|
+
// re-collected per reset: a session-watch reconnect emits a fresh reset, and
|
|
225
|
+
// re-reading the browser tree and the ledger for it would reintroduce exactly
|
|
226
|
+
// the per-render cost `tool-activity.ts` exists to remove.
|
|
227
|
+
let toolRows = collectToolRows(options.scope, options.tools?.sources).rows;
|
|
228
|
+
// Setup rows come from the setup teammate's cache, never from a probe here:
|
|
229
|
+
// `getCachedToolSetup` reads metadata plus the last EXPLICIT health check, so
|
|
230
|
+
// publishing it costs no subprocess and cannot unlock a secret store.
|
|
231
|
+
const readSetup = options.setup?.read ?? getCachedToolSetup;
|
|
232
|
+
let setupRows = (() => {
|
|
233
|
+
try {
|
|
234
|
+
return readSetup();
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
return [];
|
|
238
|
+
}
|
|
239
|
+
})();
|
|
202
240
|
const agents = new Map();
|
|
203
241
|
const attention = new Map();
|
|
204
242
|
// The PR status last projected onto each row, so a merge or a check verdict
|
|
@@ -246,7 +284,30 @@ export async function watchLocalFeed(options) {
|
|
|
246
284
|
await reconcileRows();
|
|
247
285
|
});
|
|
248
286
|
}, options.activityPollMs ?? 500);
|
|
249
|
-
const
|
|
287
|
+
const toolWatch = watchToolActivity({
|
|
288
|
+
...options.tools, scope: options.scope, signal: options.signal, initial: toolRows,
|
|
289
|
+
onDiff: (diff) => {
|
|
290
|
+
for (const tool of diff.upserts) {
|
|
291
|
+
toolRows = [...toolRows.filter((row) => row.rowKey !== tool.rowKey), tool];
|
|
292
|
+
options.emit(state.emit({ type: 'tool.upsert', scope: options.scope, rowKey: tool.rowKey, tool }));
|
|
293
|
+
}
|
|
294
|
+
for (const rowKey of diff.removes) {
|
|
295
|
+
toolRows = toolRows.filter((row) => row.rowKey !== rowKey);
|
|
296
|
+
options.emit(state.emit({ type: 'tool.remove', scope: options.scope, rowKey }));
|
|
297
|
+
}
|
|
298
|
+
},
|
|
299
|
+
});
|
|
300
|
+
// The setup cache is file-backed and notifies on change, so a Settings pane
|
|
301
|
+
// costs no polling: `subscribeToolSetup` is the invalidation the setup side
|
|
302
|
+
// publishes for exactly this consumer.
|
|
303
|
+
const stopSetupWatch = (options.setup?.subscribe ?? subscribeToolSetup)((rows) => {
|
|
304
|
+
const next = JSON.stringify(rows);
|
|
305
|
+
if (next === JSON.stringify(setupRows))
|
|
306
|
+
return;
|
|
307
|
+
setupRows = rows;
|
|
308
|
+
options.emit(state.emit({ type: 'setup.snapshot', scope: options.scope, capturedAt: Date.now(), setup: rows }));
|
|
309
|
+
});
|
|
310
|
+
const stopActivity = () => { clearInterval(activityTimer); stopAttentionWatch(); activity.close(); toolWatch.stop(); stopSetupWatch(); };
|
|
250
311
|
options.signal.addEventListener('abort', stopActivity, { once: true });
|
|
251
312
|
try {
|
|
252
313
|
await watchLocalSessions({ ...options.sessions, scope: options.scope, signal: options.signal, emit: (event) => {
|
|
@@ -262,7 +323,7 @@ export async function watchLocalFeed(options) {
|
|
|
262
323
|
attention.delete(event.rowKey);
|
|
263
324
|
prStatus.delete(event.rowKey);
|
|
264
325
|
}
|
|
265
|
-
pending = pending.then(() => projectSessionEnvelope(event, state, options.gh)).then((events) => {
|
|
326
|
+
pending = pending.then(() => projectSessionEnvelope(event, state, options.gh, toolRows, setupRows)).then((events) => {
|
|
266
327
|
for (const projected of events) {
|
|
267
328
|
if (projected.type === 'reset') {
|
|
268
329
|
attention.clear();
|
|
@@ -302,6 +363,75 @@ function remoteFeedWatchCommand(os) {
|
|
|
302
363
|
? buildWindowsAgentsCommand({ args })
|
|
303
364
|
: `bash -lc ${shellQuote(`agents ${args.map(shellQuote).join(' ')}`)}`;
|
|
304
365
|
}
|
|
366
|
+
/**
|
|
367
|
+
* The one ingress for an envelope produced by ANOTHER agents-cli.
|
|
368
|
+
*
|
|
369
|
+
* `tools` was added to the `reset` payload within protocol v1, so a peer on an
|
|
370
|
+
* older CLI is a correct v1 producer that simply reports no tool rows — which is
|
|
371
|
+
* true of it, not a data defect to paper over. Normalizing HERE, at the single
|
|
372
|
+
* place a foreign envelope enters, is what keeps every consumer downstream able
|
|
373
|
+
* to treat the field as present instead of each re-checking it. A mixed-version
|
|
374
|
+
* fleet is the normal state during a rollout, so an absent field must not take
|
|
375
|
+
* the whole fan-out down.
|
|
376
|
+
*/
|
|
377
|
+
export function normalizePeerEnvelope(event) {
|
|
378
|
+
if (event.type !== 'reset')
|
|
379
|
+
return event;
|
|
380
|
+
if (Array.isArray(event.tools) && Array.isArray(event.setup))
|
|
381
|
+
return event;
|
|
382
|
+
return { ...event, tools: event.tools ?? [], setup: event.setup ?? [] };
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* The process-wide local collector, shared by refcount.
|
|
386
|
+
*
|
|
387
|
+
* `watchLocalFeed` is cheap per tick but NOT free to duplicate: each call builds
|
|
388
|
+
* its own `ActivityStream` cursor set over the activity directory, its own
|
|
389
|
+
* recursive tool watchers, its own feed/resolution watchers and its own
|
|
390
|
+
* setup subscription. Two callers in one process paid all of that twice and
|
|
391
|
+
* produced identical envelopes — and there are genuinely two callers on a daemon
|
|
392
|
+
* box: the fleet fan-out (which watches the local scope alongside every peer)
|
|
393
|
+
* and anything else that wants this machine's rows.
|
|
394
|
+
*
|
|
395
|
+
* One {@link FeedHub} over `watchLocalFeed` collapses them: the watcher starts on
|
|
396
|
+
* the first subscriber, stops on the last, and a late subscriber is caught up
|
|
397
|
+
* from held state instead of constructing a second cursor set.
|
|
398
|
+
*
|
|
399
|
+
* This is deliberately PROCESS-wide and not machine-wide. Making `feed watch
|
|
400
|
+
* --json --local` attach to the daemon instead would be the machine-wide
|
|
401
|
+
* version, and it would put a daemon dependency on the one command the fleet
|
|
402
|
+
* fan-out runs over ssh on every peer — a peer with a sick daemon would drop off
|
|
403
|
+
* the fleet stream entirely rather than degrade. The cross-process sharing that
|
|
404
|
+
* matters is the FLEET stream, which is what the daemon hub serves.
|
|
405
|
+
*/
|
|
406
|
+
let sharedLocal = null;
|
|
407
|
+
/** The shared local collector, constructed on first use. Exposed for tests. */
|
|
408
|
+
export function sharedLocalFeedHub() {
|
|
409
|
+
return sharedLocal ??= new FeedHub({
|
|
410
|
+
watch: (hubOptions) => watchLocalFeed({
|
|
411
|
+
scope: machineId(), signal: hubOptions.signal, emit: hubOptions.emit,
|
|
412
|
+
}),
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
/** Reset the shared collector. Tests only — it must not leak across cases. */
|
|
416
|
+
export async function resetSharedLocalFeedHub() {
|
|
417
|
+
const hub = sharedLocal;
|
|
418
|
+
sharedLocal = null;
|
|
419
|
+
await hub?.close();
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Subscribe to this machine's rows through the shared collector, until abort.
|
|
423
|
+
*/
|
|
424
|
+
export function subscribeSharedLocalFeed(options) {
|
|
425
|
+
const detach = sharedLocalFeedHub().subscribe(options.emit);
|
|
426
|
+
return new Promise((resolve) => {
|
|
427
|
+
if (options.signal.aborted) {
|
|
428
|
+
detach();
|
|
429
|
+
resolve();
|
|
430
|
+
return;
|
|
431
|
+
}
|
|
432
|
+
options.signal.addEventListener('abort', () => { detach(); resolve(); }, { once: true });
|
|
433
|
+
});
|
|
434
|
+
}
|
|
305
435
|
export async function watchFleetFeed(options) {
|
|
306
436
|
const coordinator = new FeedWatchState();
|
|
307
437
|
const projection = new FeedSessionProjection(coordinator);
|
|
@@ -309,7 +439,7 @@ export async function watchFleetFeed(options) {
|
|
|
309
439
|
for (const projected of projection.apply(event))
|
|
310
440
|
options.emit(projected);
|
|
311
441
|
};
|
|
312
|
-
const local =
|
|
442
|
+
const local = subscribeSharedLocalFeed({ signal: options.signal, emit: forward });
|
|
313
443
|
let devices;
|
|
314
444
|
try {
|
|
315
445
|
devices = await loadDevices();
|
|
@@ -332,7 +462,7 @@ export async function watchFleetFeed(options) {
|
|
|
332
462
|
const event = JSON.parse(line);
|
|
333
463
|
if (event.v !== 1)
|
|
334
464
|
return false;
|
|
335
|
-
forward(event);
|
|
465
|
+
forward(normalizePeerEnvelope(event));
|
|
336
466
|
return true;
|
|
337
467
|
}
|
|
338
468
|
catch {
|