@phnx-labs/agents-cli 1.22.113 → 1.22.114
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 +29 -0
- package/README.md +10 -11
- package/dist/cli/command-registry.d.ts +0 -60
- package/dist/cli/command-registry.js +59 -61
- package/dist/commands/apply.d.ts +0 -4
- package/dist/commands/apply.js +3 -3
- 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/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/feed.d.ts +3 -3
- package/dist/commands/feed.js +1 -1
- package/dist/commands/focus.d.ts +4 -4
- 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/message.d.ts +1 -1
- package/dist/commands/message.js +3 -3
- package/dist/commands/projects.d.ts +2 -18
- package/dist/commands/projects.js +89 -3
- package/dist/commands/resource-view.d.ts +3 -2
- package/dist/commands/resume.d.ts +0 -1
- package/dist/commands/resume.js +1 -1
- 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 +21 -2
- package/dist/commands/sessions-backfill.d.ts +2 -35
- package/dist/commands/sessions-backfill.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 -5
- 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 +10 -10
- package/dist/commands/setup-mine.d.ts +0 -6
- package/dist/commands/setup-mine.js +1 -1
- package/dist/commands/setup.d.ts +3 -4
- package/dist/commands/setup.js +1 -1
- package/dist/commands/share.d.ts +8 -8
- 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 +1 -1
- package/dist/commands/tmux.d.ts +1 -1
- package/dist/commands/tmux.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/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/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 +5 -5
- 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 +4 -4
- package/dist/lib/browser/service.d.ts +4 -4
- 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 +1 -1
- 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/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/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-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 +1 -1
- 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 +2 -1
- 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 +2 -1
- 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/events.d.ts +2 -47
- package/dist/lib/feed/events.js +1 -141
- package/dist/lib/feed/feed.d.ts +9 -42
- package/dist/lib/feed/feed.js +1 -60
- package/dist/lib/feed/pr-status.d.ts +0 -2
- package/dist/lib/feed/pr-status.js +1 -5
- package/dist/lib/feed/watch.d.ts +1 -2
- package/dist/lib/feed/watch.js +0 -1
- 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 +2 -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 -65
- package/dist/lib/git.js +3 -142
- 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 +4 -3
- 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/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/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/reconcile-and-repair.d.ts +5 -4
- package/dist/lib/redact.d.ts +7 -1
- package/dist/lib/redact.js +94 -3
- package/dist/lib/refresh-coordinator.d.ts +2 -1
- package/dist/lib/refresh.d.ts +3 -2
- 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-client.d.ts +0 -17
- package/dist/lib/secrets-client.js +4 -26
- 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 +2 -1
- package/dist/lib/session/detached.js +2 -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 +2 -5
- package/dist/lib/session/remote/peer-stream.js +2 -2
- 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 +5 -5
- 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/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/settings-manifest.d.ts +2 -1
- package/dist/lib/share/delete.d.ts +5 -4
- package/dist/lib/share/html.d.ts +0 -2
- package/dist/lib/share/html.js +9 -9
- package/dist/lib/share/http-error.d.ts +3 -2
- package/dist/lib/share/og.d.ts +2 -1
- package/dist/lib/share/provision.d.ts +2 -2
- package/dist/lib/share/publish.d.ts +4 -13
- package/dist/lib/share/publish.js +2 -2
- package/dist/lib/shim-heal.d.ts +1 -5
- package/dist/lib/shim-heal.js +0 -6
- package/dist/lib/smart-launch.d.ts +4 -5
- package/dist/lib/smart-launch.js +1 -1
- package/dist/lib/snapshot.d.ts +3 -2
- package/dist/lib/ssh-exec.d.ts +5 -4
- 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.js +1 -1
- package/dist/lib/state.d.ts +1 -3
- package/dist/lib/state.js +1 -4
- 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 +4 -3
- 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/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 +1 -3
- package/dist/lib/traces/provision.js +1 -1
- 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 +3 -3
- 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 +2 -3
- package/scripts/postinstall.js +5 -4
- package/dist/commands/pty.d.ts +0 -20
- package/dist/commands/pty.js +0 -404
- 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
|
@@ -133,20 +133,12 @@ export declare function parsePrUrl(prUrl: string): {
|
|
|
133
133
|
repo: string;
|
|
134
134
|
number: number;
|
|
135
135
|
} | null;
|
|
136
|
-
/** Fetch the current CI checks for a PR via `gh pr checks`. Returns [] on any gh error. */
|
|
137
|
-
export declare function fetchPrChecks(prUrl: string): Promise<PrCheck[]>;
|
|
138
|
-
/** Fetch review comments for a PR via `gh api`. Returns [] on any gh error. */
|
|
139
|
-
export declare function fetchPrReviewComments(prUrl: string): Promise<PrReviewComment[]>;
|
|
140
|
-
/** Fetch the failing-run logs for a check via `gh run view --log-failed`. Best-effort, truncated. */
|
|
141
|
-
export declare function fetchCiFailureLogs(check: PrCheck, maxChars?: number): Promise<string>;
|
|
142
|
-
/** Collect a live PR snapshot from `gh`. The poll-mode seam for `runPrWatch`. */
|
|
143
|
-
export declare function pollPrSnapshot(prUrl: string, sourceTeammate: string | null): Promise<PrSnapshot>;
|
|
144
136
|
/** A PR to watch, paired with the teammate that opened it. */
|
|
145
137
|
export interface WatchTarget {
|
|
146
138
|
prUrl: string;
|
|
147
139
|
sourceTeammate: string | null;
|
|
148
140
|
}
|
|
149
|
-
|
|
141
|
+
interface PrWatchDeps {
|
|
150
142
|
/** Discover which PRs to watch this pass (teammates may open PRs mid-run). */
|
|
151
143
|
resolveTargets: () => Promise<WatchTarget[]>;
|
|
152
144
|
/** Snapshot one PR's CI + review comments. Defaults to `pollPrSnapshot`. */
|
|
@@ -192,7 +184,7 @@ export type PrWatchEvent = {
|
|
|
192
184
|
message: string;
|
|
193
185
|
timestamp: string;
|
|
194
186
|
};
|
|
195
|
-
|
|
187
|
+
interface PrWatchOptions {
|
|
196
188
|
intervalMs?: number;
|
|
197
189
|
/** Stop after this many polls (0 / undefined = run until signalled). */
|
|
198
190
|
maxPolls?: number;
|
|
@@ -205,7 +197,7 @@ export interface PrWatchOptions {
|
|
|
205
197
|
/** Abort signal — resolves the loop at the next interval boundary. */
|
|
206
198
|
shouldStop?: () => boolean;
|
|
207
199
|
}
|
|
208
|
-
|
|
200
|
+
interface PrWatchResult {
|
|
209
201
|
polls: number;
|
|
210
202
|
spawned: number;
|
|
211
203
|
/** How many PRs escalated to a human (wave budget exhausted). */
|
|
@@ -224,3 +216,4 @@ export interface PrWatchResult {
|
|
|
224
216
|
* and `waves` hard-caps the total spawns per PR (issue #338).
|
|
225
217
|
*/
|
|
226
218
|
export declare function runPrWatch(deps: PrWatchDeps, opts?: PrWatchOptions): Promise<PrWatchResult>;
|
|
219
|
+
export {};
|
|
@@ -194,7 +194,7 @@ export function parsePrUrl(prUrl) {
|
|
|
194
194
|
// PrReviewComment shapes and hand them straight to decidePrActions.
|
|
195
195
|
// ---------------------------------------------------------------------------
|
|
196
196
|
/** Fetch the current CI checks for a PR via `gh pr checks`. Returns [] on any gh error. */
|
|
197
|
-
|
|
197
|
+
async function fetchPrChecks(prUrl) {
|
|
198
198
|
try {
|
|
199
199
|
const { stdout } = await execFileAsync('gh', ['pr', 'checks', prUrl, '--json', 'name,state,link,workflow'], { maxBuffer: 8 * 1024 * 1024 });
|
|
200
200
|
const raw = JSON.parse(stdout);
|
|
@@ -213,7 +213,7 @@ export async function fetchPrChecks(prUrl) {
|
|
|
213
213
|
}
|
|
214
214
|
}
|
|
215
215
|
/** Fetch review comments for a PR via `gh api`. Returns [] on any gh error. */
|
|
216
|
-
|
|
216
|
+
async function fetchPrReviewComments(prUrl) {
|
|
217
217
|
const parsed = parsePrUrl(prUrl);
|
|
218
218
|
if (!parsed)
|
|
219
219
|
return [];
|
|
@@ -239,7 +239,7 @@ export async function fetchPrReviewComments(prUrl) {
|
|
|
239
239
|
}
|
|
240
240
|
}
|
|
241
241
|
/** Fetch the failing-run logs for a check via `gh run view --log-failed`. Best-effort, truncated. */
|
|
242
|
-
|
|
242
|
+
async function fetchCiFailureLogs(check, maxChars = 8000) {
|
|
243
243
|
const runId = check.link?.match(/\/runs\/(\d+)/)?.[1] ?? check.link?.match(/\/actions\/runs\/(\d+)/)?.[1];
|
|
244
244
|
if (!runId)
|
|
245
245
|
return '';
|
|
@@ -255,7 +255,7 @@ export async function fetchCiFailureLogs(check, maxChars = 8000) {
|
|
|
255
255
|
}
|
|
256
256
|
}
|
|
257
257
|
/** Collect a live PR snapshot from `gh`. The poll-mode seam for `runPrWatch`. */
|
|
258
|
-
|
|
258
|
+
async function pollPrSnapshot(prUrl, sourceTeammate) {
|
|
259
259
|
const [checks, comments] = await Promise.all([
|
|
260
260
|
fetchPrChecks(prUrl),
|
|
261
261
|
fetchPrReviewComments(prUrl),
|
|
@@ -34,7 +34,7 @@ export type TeamRegistry = Record<string, TeamMeta>;
|
|
|
34
34
|
* write, which is exactly the data-loss path we are trying to close.
|
|
35
35
|
*/
|
|
36
36
|
export declare function loadTeams(): Promise<TeamRegistry>;
|
|
37
|
-
|
|
37
|
+
interface CreateTeamOptions {
|
|
38
38
|
description?: string;
|
|
39
39
|
enableWorktrees?: boolean;
|
|
40
40
|
/** Path to an existing worktree for all teammates to share. */
|
|
@@ -52,8 +52,6 @@ export declare function createTeam(name: string, options?: CreateTeamOptions): P
|
|
|
52
52
|
export declare function ensureTeam(name: string): Promise<TeamMeta>;
|
|
53
53
|
/** Mark a team as disbanded so saveMeta will not resurrect its teammates. */
|
|
54
54
|
export declare function markTeamDisbanded(name: string): Promise<void>;
|
|
55
|
-
/** Clear a disband tombstone — called when the name is re-created. */
|
|
56
|
-
export declare function clearTeamDisbanded(name: string): Promise<void>;
|
|
57
55
|
/** True when the team was disbanded and has not been re-created since. */
|
|
58
56
|
export declare function isTeamDisbanded(name: string): Promise<boolean>;
|
|
59
57
|
/** Remove a team from the registry. Returns false if the team did not exist. */
|
|
@@ -62,3 +60,4 @@ export declare function removeTeam(name: string): Promise<boolean>;
|
|
|
62
60
|
export declare function teamExists(name: string): Promise<boolean>;
|
|
63
61
|
/** Get metadata for a specific team. Returns null if team does not exist. */
|
|
64
62
|
export declare function getTeam(name: string): Promise<TeamMeta | null>;
|
|
63
|
+
export {};
|
|
@@ -151,7 +151,7 @@ export async function markTeamDisbanded(name) {
|
|
|
151
151
|
await fs.writeFile(disbandedPath(name), JSON.stringify({ team: name, disbanded_at: new Date().toISOString() }), 'utf-8');
|
|
152
152
|
}
|
|
153
153
|
/** Clear a disband tombstone — called when the name is re-created. */
|
|
154
|
-
|
|
154
|
+
async function clearTeamDisbanded(name) {
|
|
155
155
|
try {
|
|
156
156
|
await fs.unlink(disbandedPath(name));
|
|
157
157
|
}
|
|
@@ -9,22 +9,6 @@ interface RemoteSshOptions {
|
|
|
9
9
|
* single-quoted, so odd path characters stay safe.
|
|
10
10
|
*/
|
|
11
11
|
export declare function remotePathExpr(p: string): string;
|
|
12
|
-
/**
|
|
13
|
-
* Resolve the ABSOLUTE git top-level for a (possibly `~`-relative) repo path on
|
|
14
|
-
* the host, or null when it isn't a git repo / the host is unreachable. Used by
|
|
15
|
-
* `ensureRemoteRepo` to both VALIDATE and CANONICALIZE a repo location, so every
|
|
16
|
-
* downstream remote command (launch `cd`, worktree create, polling) works from an
|
|
17
|
-
* absolute path with no tilde-expansion hazard.
|
|
18
|
-
*/
|
|
19
|
-
export declare function resolveRemoteRepoRoot(target: string, repoPath: string, opts?: RemoteSshOptions): string | null;
|
|
20
|
-
/** True when `repoPath` is a git working tree on the host. */
|
|
21
|
-
export declare function isRemoteGitRepo(target: string, repoPath: string, opts?: RemoteSshOptions): boolean;
|
|
22
|
-
/**
|
|
23
|
-
* Resolve the host repo's default branch name (origin/HEAD → `main`/`master`/…).
|
|
24
|
-
* Falls back to `main` when origin/HEAD isn't set, matching the local recipe's
|
|
25
|
-
* `remote set-head` step.
|
|
26
|
-
*/
|
|
27
|
-
export declare function remoteDefaultBranch(target: string, repoPath: string, opts?: RemoteSshOptions): string;
|
|
28
12
|
/**
|
|
29
13
|
* Create a worktree on the host for a teammate, branched off the freshly-fetched
|
|
30
14
|
* default branch. Returns the absolute worktree path on the host.
|
|
@@ -40,7 +40,7 @@ export function remotePathExpr(p) {
|
|
|
40
40
|
* downstream remote command (launch `cd`, worktree create, polling) works from an
|
|
41
41
|
* absolute path with no tilde-expansion hazard.
|
|
42
42
|
*/
|
|
43
|
-
|
|
43
|
+
function resolveRemoteRepoRoot(target, repoPath, opts = {}) {
|
|
44
44
|
assertValidSshTarget(target);
|
|
45
45
|
const cmd = `git -C ${remotePathExpr(repoPath)} rev-parse --show-toplevel 2>/dev/null`;
|
|
46
46
|
const res = sshExec(target, cmd, { timeoutMs: 15000, multiplex: true, extraSshArgs: opts.extraSshArgs });
|
|
@@ -57,7 +57,7 @@ function remoteGit(target, repoPath, args, timeoutMs = 60000, opts = {}) {
|
|
|
57
57
|
return res.stdout.trim();
|
|
58
58
|
}
|
|
59
59
|
/** True when `repoPath` is a git working tree on the host. */
|
|
60
|
-
|
|
60
|
+
function isRemoteGitRepo(target, repoPath, opts = {}) {
|
|
61
61
|
assertValidSshTarget(target);
|
|
62
62
|
// remotePathExpr so a `~`/`$HOME`-relative path (the canonical repos dir) expands
|
|
63
63
|
// on the host — plain shellQuote would single-quote the tilde into a literal,
|
|
@@ -71,7 +71,7 @@ export function isRemoteGitRepo(target, repoPath, opts = {}) {
|
|
|
71
71
|
* Falls back to `main` when origin/HEAD isn't set, matching the local recipe's
|
|
72
72
|
* `remote set-head` step.
|
|
73
73
|
*/
|
|
74
|
-
|
|
74
|
+
function remoteDefaultBranch(target, repoPath, opts = {}) {
|
|
75
75
|
assertValidSshTarget(target);
|
|
76
76
|
try {
|
|
77
77
|
// Refresh origin/HEAD first so a repo cloned before the default was set resolves.
|
|
@@ -31,7 +31,7 @@ export interface DevicePlacementSignal {
|
|
|
31
31
|
pickerEligible?: boolean;
|
|
32
32
|
}
|
|
33
33
|
/** Team fields the placement cascade reads (a subset of TeamMeta). */
|
|
34
|
-
|
|
34
|
+
interface PlacementTeam {
|
|
35
35
|
devices?: string[];
|
|
36
36
|
}
|
|
37
37
|
/**
|
|
@@ -44,7 +44,7 @@ export interface PlacementTeam {
|
|
|
44
44
|
* honors caps: an explicit pin or a pool of one is the user's own choice and
|
|
45
45
|
* is never second-guessed.
|
|
46
46
|
*/
|
|
47
|
-
|
|
47
|
+
interface PlacementOptions {
|
|
48
48
|
/** Worker pool used when the team does not declare an explicit device pool. */
|
|
49
49
|
defaultDevices?: string[];
|
|
50
50
|
maxConcurrent?: Record<string, number>;
|
|
@@ -59,7 +59,7 @@ export interface PlacementOptions {
|
|
|
59
59
|
agentLabel?: string;
|
|
60
60
|
/**
|
|
61
61
|
* Normalized hosts boosted with `auto-launch.preferred` (set by
|
|
62
|
-
* `agents devices
|
|
62
|
+
* `agents devices config <name> auto-launch.preferred on`). A preferred device ranks ahead of a
|
|
63
63
|
* non-preferred one among the eligible survivors — after the signed-in tier
|
|
64
64
|
* (a preferred box that can't run the agent is still no use) and before load,
|
|
65
65
|
* so an operator boost overrides load-based ordering without overriding hard
|
|
@@ -69,9 +69,9 @@ export interface PlacementOptions {
|
|
|
69
69
|
preferred?: ReadonlySet<string>;
|
|
70
70
|
}
|
|
71
71
|
/** Why a device was excluded from the viable set, for the fail-loud message. */
|
|
72
|
-
|
|
72
|
+
type ExclusionReason = 'unreachable' | 'probe-timed-out' | 'overloaded' | 'capped' | 'not-installed';
|
|
73
73
|
/** A pool device dropped from the auto-pick, with the reason + live detail. */
|
|
74
|
-
|
|
74
|
+
interface ExcludedDevice {
|
|
75
75
|
device: string;
|
|
76
76
|
reason: ExclusionReason;
|
|
77
77
|
/** Present for `capped`: `running/cap`. */
|
|
@@ -155,3 +155,4 @@ export declare function pickBestDevice(devices: string[], roster: RosterEntry[],
|
|
|
155
155
|
export declare function resolvePlacement(team: PlacementTeam, explicitDevice: string | null, roster: RosterEntry[], opts?: PlacementOptions): {
|
|
156
156
|
device: string | null;
|
|
157
157
|
};
|
|
158
|
+
export {};
|
|
@@ -269,7 +269,7 @@ export function pickBestDevice(devices, roster, opts) {
|
|
|
269
269
|
const signedIn = (sa?.signedIn === true ? 0 : 1) - (sb?.signedIn === true ? 0 : 1);
|
|
270
270
|
if (signedIn !== 0)
|
|
271
271
|
return signedIn;
|
|
272
|
-
// (a2) operator-preferred device next — `agents devices
|
|
272
|
+
// (a2) operator-preferred device next — `agents devices config <name> auto-launch.preferred on`
|
|
273
273
|
// boosts a box above its load-equal peers, overriding load-based order.
|
|
274
274
|
const preferred = opts?.preferred;
|
|
275
275
|
if (preferred && preferred.size > 0) {
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
import type { AgentManager, AgentProcess } from './agents.js';
|
|
21
21
|
import type { TeamBudgetWatcher } from '../budget/live-team.js';
|
|
22
22
|
import type { BreachInfo } from '../budget/enforce.js';
|
|
23
|
-
|
|
23
|
+
interface WaveSummary {
|
|
24
24
|
wave: number;
|
|
25
25
|
timestamp: string;
|
|
26
26
|
team: string;
|
|
@@ -31,7 +31,7 @@ export interface WaveSummary {
|
|
|
31
31
|
failed: number;
|
|
32
32
|
drained: boolean;
|
|
33
33
|
}
|
|
34
|
-
|
|
34
|
+
interface SupervisorOptions {
|
|
35
35
|
team: string;
|
|
36
36
|
intervalMs?: number;
|
|
37
37
|
maxWaves?: number;
|
|
@@ -47,7 +47,7 @@ export interface SupervisorOptions {
|
|
|
47
47
|
/** Called with the breach details when the budget watcher trips. */
|
|
48
48
|
onBudgetBreach?: (breach: BreachInfo) => void;
|
|
49
49
|
}
|
|
50
|
-
|
|
50
|
+
interface SupervisorResult {
|
|
51
51
|
waves: number;
|
|
52
52
|
stoppedBy: 'drained' | 'max-waves' | 'signal' | 'callback' | 'budget';
|
|
53
53
|
elapsed_ms: number;
|
|
@@ -66,3 +66,4 @@ export interface SupervisorResult {
|
|
|
66
66
|
* returns false from onWave, or SIGINT/SIGTERM arrives.
|
|
67
67
|
*/
|
|
68
68
|
export declare function runSupervisor(mgr: AgentManager, opts: SupervisorOptions): Promise<SupervisorResult>;
|
|
69
|
+
export {};
|
|
@@ -12,15 +12,6 @@ export declare function getGitRoot(dir: string): Promise<string>;
|
|
|
12
12
|
* Check if a worktree directory has uncommitted changes.
|
|
13
13
|
*/
|
|
14
14
|
export declare function hasUncommittedChanges(worktreePath: string): Promise<boolean>;
|
|
15
|
-
/** Default cap on diff text so one giant worktree can't blow up the serve dashboard. */
|
|
16
|
-
export declare const DEFAULT_DIFF_MAX_BYTES = 200000;
|
|
17
|
-
/**
|
|
18
|
-
* Return the uncommitted working-tree diff for a worktree (staged + unstaged,
|
|
19
|
-
* relative to HEAD), capped so a huge diff can't overwhelm the read-only serve
|
|
20
|
-
* dashboard. Read-only: shells out to `git diff HEAD` and never mutates state.
|
|
21
|
-
* Returns '' when the path isn't a git worktree or has no pending changes.
|
|
22
|
-
*/
|
|
23
|
-
export declare function gitDiff(worktreePath: string, maxBytes?: number): Promise<string>;
|
|
24
15
|
/**
|
|
25
16
|
* Resolve the repo's default branch name (origin/HEAD → `main`/`master`/…).
|
|
26
17
|
* Refreshes origin/HEAD first so a repo cloned before the default was set resolves.
|
|
@@ -45,38 +45,6 @@ export async function hasUncommittedChanges(worktreePath) {
|
|
|
45
45
|
return false;
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
|
-
/** Default cap on diff text so one giant worktree can't blow up the serve dashboard. */
|
|
49
|
-
export const DEFAULT_DIFF_MAX_BYTES = 200_000;
|
|
50
|
-
/**
|
|
51
|
-
* Return the uncommitted working-tree diff for a worktree (staged + unstaged,
|
|
52
|
-
* relative to HEAD), capped so a huge diff can't overwhelm the read-only serve
|
|
53
|
-
* dashboard. Read-only: shells out to `git diff HEAD` and never mutates state.
|
|
54
|
-
* Returns '' when the path isn't a git worktree or has no pending changes.
|
|
55
|
-
*/
|
|
56
|
-
export async function gitDiff(worktreePath, maxBytes = DEFAULT_DIFF_MAX_BYTES) {
|
|
57
|
-
// Size the capture buffer off the cap (not an arbitrary 1MB floor) so a diff
|
|
58
|
-
// that overshoots gets TRUNCATED, never silently dropped. A diff larger than
|
|
59
|
-
// the buffer overflows maxBuffer, but Node still hands us the captured prefix
|
|
60
|
-
// on the rejection — we truncate that below rather than losing it to ''.
|
|
61
|
-
const maxBuffer = maxBytes * 4;
|
|
62
|
-
const truncate = (s) => s.slice(0, maxBytes) + `\n… [diff truncated at ${maxBytes} bytes]`;
|
|
63
|
-
try {
|
|
64
|
-
const { stdout } = await execFileAsync('git', ['diff', 'HEAD'], {
|
|
65
|
-
cwd: worktreePath,
|
|
66
|
-
maxBuffer,
|
|
67
|
-
});
|
|
68
|
-
return stdout.length > maxBytes ? truncate(stdout) : stdout;
|
|
69
|
-
}
|
|
70
|
-
catch (err) {
|
|
71
|
-
// ENOBUFS on an oversized diff still carries the partial capture; truncate
|
|
72
|
-
// it so the dashboard shows "[diff truncated]" instead of "no changes".
|
|
73
|
-
// A genuine non-git-worktree error has no stdout → fall through to ''.
|
|
74
|
-
const partial = err?.stdout;
|
|
75
|
-
if (typeof partial === 'string' && partial.length > 0)
|
|
76
|
-
return truncate(partial);
|
|
77
|
-
return '';
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
48
|
/**
|
|
81
49
|
* Resolve the repo's default branch name (origin/HEAD → `main`/`master`/…).
|
|
82
50
|
* Refreshes origin/HEAD first so a repo cloned before the default was set resolves.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export declare const TERM_NOT_INSTALLED_ERROR = "The standalone `term` CLI is not installed. npm i -g @phnx-labs/term-cli";
|
|
2
|
+
/** JSON response envelope from `term`, mirroring the old PTY sidecar's shape. */
|
|
3
|
+
export interface TermResponse {
|
|
4
|
+
ok: boolean;
|
|
5
|
+
error?: string;
|
|
6
|
+
[key: string]: any;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Resolve the `term` binary to exec: `$TERM_BIN` first (exact override, used
|
|
10
|
+
* by tests and by an operator pinning a specific install), else an ordinary
|
|
11
|
+
* PATH lookup. Returns null when neither resolves — the caller must fail loud
|
|
12
|
+
* with {@link TERM_NOT_INSTALLED_ERROR} rather than falling back to anything.
|
|
13
|
+
*/
|
|
14
|
+
export declare function resolveTermBin(): string | null;
|
|
15
|
+
export interface TermStartOptions {
|
|
16
|
+
rows?: number;
|
|
17
|
+
cols?: number;
|
|
18
|
+
shell?: string;
|
|
19
|
+
cwd?: string;
|
|
20
|
+
}
|
|
21
|
+
/** `term start [-r rows] [-c cols] [-s shell] [-d cwd] --json` → the new session id. */
|
|
22
|
+
export declare function termStart(opts?: TermStartOptions): Promise<TermResponse>;
|
|
23
|
+
/** `term exec <id> <command> --json` — send a command, non-blocking. */
|
|
24
|
+
export declare function termExec(id: string, command: string): Promise<TermResponse>;
|
|
25
|
+
/**
|
|
26
|
+
* `term write <id> <input> --raw --json` — send raw bytes to the session.
|
|
27
|
+
* `--raw` is load-bearing: the caller here always supplies already-literal
|
|
28
|
+
* bytes (e.g. `\x1b[B\r` as real control characters from a JS string), never
|
|
29
|
+
* the `pty write` CLI's `\n`/`\t`/`\e`/`\xHH` textual escape syntax, so `term`
|
|
30
|
+
* must not re-interpret them.
|
|
31
|
+
*/
|
|
32
|
+
export declare function termWrite(id: string, input: string): Promise<TermResponse>;
|
|
33
|
+
/** `term screen <id> --json` → `{ screen, exited, cols, rows }`. */
|
|
34
|
+
export declare function termScreen(id: string): Promise<TermResponse>;
|
|
35
|
+
/**
|
|
36
|
+
* `term stop <id>` — end the session and clean up.
|
|
37
|
+
*
|
|
38
|
+
* Unlike every other verb, `stop` has no `--json` mode and prints nothing on
|
|
39
|
+
* success (confirmed against a real built `term` binary — a bare `--json`
|
|
40
|
+
* flag errors `unknown option '--json'`, and success alone leaves stdout
|
|
41
|
+
* empty), so this synthesizes the `{ ok }` envelope from the exit code
|
|
42
|
+
* instead of routing through {@link runTerm}'s stdout-JSON parse.
|
|
43
|
+
*/
|
|
44
|
+
export declare function termStop(id: string): Promise<TermResponse>;
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `term` client — thin subprocess wrapper over the standalone `term` CLI
|
|
3
|
+
* (published separately as `@phnx-labs/term-cli`), the PTY engine this repo
|
|
4
|
+
* used to own directly (`agents pty`, removed in PHNX-4091). `term` mirrors the
|
|
5
|
+
* old `agents pty` verbs/flags/JSON shapes 1:1 (`start`, `exec`, `read`,
|
|
6
|
+
* `write`, `screen`, `signal`, `resize`, `list`, `stop`, `server start|stop|
|
|
7
|
+
* status`, hidden `_server`) and owns starting/reusing its own background
|
|
8
|
+
* sidecar itself — this client never manages that process, it only shells out
|
|
9
|
+
* to the CLI and parses one line of JSON per call.
|
|
10
|
+
*
|
|
11
|
+
* Resolution order:
|
|
12
|
+
* 1. `$TERM_BIN` — an explicit override (a full path, or a PATH-resolvable
|
|
13
|
+
* name other than `term`). Sets the exact binary this client execs; the
|
|
14
|
+
* one legitimate use besides pointing at a real install is a test double.
|
|
15
|
+
* 2. `findInPath('term')` — the ordinary PATH lookup (skips this CLI's own
|
|
16
|
+
* shims dir, same as every other native-binary resolution in this repo).
|
|
17
|
+
*
|
|
18
|
+
* Neither resolving is the expected state until `@phnx-labs/term-cli` is
|
|
19
|
+
* published and installed — every call fails loud with
|
|
20
|
+
* {@link TERM_NOT_INSTALLED_ERROR} rather than silently no-op'ing.
|
|
21
|
+
*/
|
|
22
|
+
import { execFile } from 'node:child_process';
|
|
23
|
+
import { findInPath } from './agent-spec/agents.js';
|
|
24
|
+
export const TERM_NOT_INSTALLED_ERROR = 'The standalone `term` CLI is not installed. npm i -g @phnx-labs/term-cli';
|
|
25
|
+
/**
|
|
26
|
+
* Resolve the `term` binary to exec: `$TERM_BIN` first (exact override, used
|
|
27
|
+
* by tests and by an operator pinning a specific install), else an ordinary
|
|
28
|
+
* PATH lookup. Returns null when neither resolves — the caller must fail loud
|
|
29
|
+
* with {@link TERM_NOT_INSTALLED_ERROR} rather than falling back to anything.
|
|
30
|
+
*/
|
|
31
|
+
export function resolveTermBin() {
|
|
32
|
+
const override = process.env.TERM_BIN;
|
|
33
|
+
if (override && override.trim().length > 0)
|
|
34
|
+
return override.trim();
|
|
35
|
+
return findInPath('term');
|
|
36
|
+
}
|
|
37
|
+
/** Run one `term <args>` invocation and parse the trailing JSON line from stdout. */
|
|
38
|
+
function runTerm(args) {
|
|
39
|
+
return new Promise((resolve, reject) => {
|
|
40
|
+
const bin = resolveTermBin();
|
|
41
|
+
if (!bin) {
|
|
42
|
+
reject(new Error(TERM_NOT_INSTALLED_ERROR));
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
execFile(bin, args, { maxBuffer: 16 * 1024 * 1024, timeout: 30_000 }, (err, stdout, stderr) => {
|
|
46
|
+
const out = stdout.toString().trim();
|
|
47
|
+
if (!out) {
|
|
48
|
+
reject(new Error(`term ${args[0]} produced no output: ${stderr.toString().trim() || (err ? err.message : 'unknown error')}`));
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
// `term` may emit progress on earlier lines; the response is the last line.
|
|
52
|
+
const line = out.split('\n').pop() ?? '';
|
|
53
|
+
try {
|
|
54
|
+
resolve(JSON.parse(line));
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
reject(new Error(`Invalid JSON from term: ${out.slice(0, 200)}`));
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
/** `term start [-r rows] [-c cols] [-s shell] [-d cwd] --json` → the new session id. */
|
|
63
|
+
export function termStart(opts = {}) {
|
|
64
|
+
const args = ['start', '--json'];
|
|
65
|
+
if (opts.rows)
|
|
66
|
+
args.push('-r', String(opts.rows));
|
|
67
|
+
if (opts.cols)
|
|
68
|
+
args.push('-c', String(opts.cols));
|
|
69
|
+
if (opts.shell)
|
|
70
|
+
args.push('-s', opts.shell);
|
|
71
|
+
if (opts.cwd)
|
|
72
|
+
args.push('-d', opts.cwd);
|
|
73
|
+
return runTerm(args);
|
|
74
|
+
}
|
|
75
|
+
/** `term exec <id> <command> --json` — send a command, non-blocking. */
|
|
76
|
+
export function termExec(id, command) {
|
|
77
|
+
return runTerm(['exec', id, command, '--json']);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* `term write <id> <input> --raw --json` — send raw bytes to the session.
|
|
81
|
+
* `--raw` is load-bearing: the caller here always supplies already-literal
|
|
82
|
+
* bytes (e.g. `\x1b[B\r` as real control characters from a JS string), never
|
|
83
|
+
* the `pty write` CLI's `\n`/`\t`/`\e`/`\xHH` textual escape syntax, so `term`
|
|
84
|
+
* must not re-interpret them.
|
|
85
|
+
*/
|
|
86
|
+
export function termWrite(id, input) {
|
|
87
|
+
return runTerm(['write', id, input, '--raw', '--json']);
|
|
88
|
+
}
|
|
89
|
+
/** `term screen <id> --json` → `{ screen, exited, cols, rows }`. */
|
|
90
|
+
export function termScreen(id) {
|
|
91
|
+
return runTerm(['screen', id, '--json']);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* `term stop <id>` — end the session and clean up.
|
|
95
|
+
*
|
|
96
|
+
* Unlike every other verb, `stop` has no `--json` mode and prints nothing on
|
|
97
|
+
* success (confirmed against a real built `term` binary — a bare `--json`
|
|
98
|
+
* flag errors `unknown option '--json'`, and success alone leaves stdout
|
|
99
|
+
* empty), so this synthesizes the `{ ok }` envelope from the exit code
|
|
100
|
+
* instead of routing through {@link runTerm}'s stdout-JSON parse.
|
|
101
|
+
*/
|
|
102
|
+
export function termStop(id) {
|
|
103
|
+
return new Promise((resolve, reject) => {
|
|
104
|
+
const bin = resolveTermBin();
|
|
105
|
+
if (!bin) {
|
|
106
|
+
reject(new Error(TERM_NOT_INSTALLED_ERROR));
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
execFile(bin, ['stop', id], { maxBuffer: 16 * 1024 * 1024, timeout: 30_000 }, (err, _stdout, stderr) => {
|
|
110
|
+
if (err) {
|
|
111
|
+
resolve({ ok: false, error: stderr.toString().trim() || err.message });
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
resolve({ ok: true });
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
}
|
|
@@ -33,8 +33,6 @@
|
|
|
33
33
|
* via System Events keystrokes, stealing focus. The resolver refuses
|
|
34
34
|
* to route here by default (see resolve.ts); it stays behind an
|
|
35
35
|
* explicit opt-in.
|
|
36
|
-
* - pty → the `agents pty write` sidecar path (ptyRequest). Local-only —
|
|
37
|
-
* the sidecar is not an engine transport surface.
|
|
38
36
|
*
|
|
39
37
|
* Ink-TUI Enter semantics: Claude's Ink TUI swallows an Enter fused to the text,
|
|
40
38
|
* so the default path delivers the text and the Enter as TWO SEPARATE writes
|
|
@@ -45,8 +43,7 @@ import { type HostResolver } from './transport.js';
|
|
|
45
43
|
import { type LaunchSpec, type EngineContext } from './types.js';
|
|
46
44
|
/**
|
|
47
45
|
* An already-running surface to type into. A superset of the engine's launch
|
|
48
|
-
* `Backend
|
|
49
|
-
* be injected into.
|
|
46
|
+
* `Backend`.
|
|
50
47
|
*/
|
|
51
48
|
export type InjectTarget = {
|
|
52
49
|
backend: 'tmux';
|
|
@@ -70,9 +67,6 @@ export type InjectTarget = {
|
|
|
70
67
|
} | {
|
|
71
68
|
backend: 'ghostty';
|
|
72
69
|
window?: string;
|
|
73
|
-
} | {
|
|
74
|
-
backend: 'pty';
|
|
75
|
-
id: string;
|
|
76
70
|
};
|
|
77
71
|
export type InjectBackend = InjectTarget['backend'];
|
|
78
72
|
export interface InjectOptions {
|
|
@@ -101,10 +95,9 @@ export interface InjectResult {
|
|
|
101
95
|
/**
|
|
102
96
|
* Delivery is CONFIRMED to have reached the running agent, not merely dispatched.
|
|
103
97
|
*
|
|
104
|
-
* For tmux / iterm / ghostty
|
|
98
|
+
* For tmux / iterm / ghostty, `ok` already means delivered: `tmux
|
|
105
99
|
* send-keys` errors on a missing pane, `osascript write text` errors on a bad
|
|
106
|
-
* session id
|
|
107
|
-
* successful transport IS the confirmation. For **vscodium**, `ok` only means the
|
|
100
|
+
* session id — so a successful transport IS the confirmation. For **vscodium**, `ok` only means the
|
|
108
101
|
* editor CLI accepted the `--open-url` hand-off; whether the swarm-ext extension
|
|
109
102
|
* actually parsed the verb and typed anything is unknown from the CLI side (the
|
|
110
103
|
* ext must ack — RUSH follow-up). So vscodium is delivered-but-UNCONFIRMED, and
|
|
@@ -117,12 +110,6 @@ export interface InjectResult {
|
|
|
117
110
|
specs?: LaunchSpec[];
|
|
118
111
|
error?: string;
|
|
119
112
|
}
|
|
120
|
-
/**
|
|
121
|
-
* Whether a successful transport on this backend CONFIRMS delivery to the agent.
|
|
122
|
-
* Everything but vscodium self-confirms (see InjectResult.confirmed); vscodium's
|
|
123
|
-
* `--open-url` is fire-and-forget until the swarm-ext extension acks the verb.
|
|
124
|
-
*/
|
|
125
|
-
export declare function backendConfirmsDelivery(backend: InjectBackend): boolean;
|
|
126
113
|
/**
|
|
127
114
|
* argv for `tmux send-keys` targeting a pane by id. Starts with `tmux` (like the
|
|
128
115
|
* engine's `tmuxTabArgv`) so the same transport runs it locally or over SSH. The
|
|
@@ -33,15 +33,12 @@
|
|
|
33
33
|
* via System Events keystrokes, stealing focus. The resolver refuses
|
|
34
34
|
* to route here by default (see resolve.ts); it stays behind an
|
|
35
35
|
* explicit opt-in.
|
|
36
|
-
* - pty → the `agents pty write` sidecar path (ptyRequest). Local-only —
|
|
37
|
-
* the sidecar is not an engine transport surface.
|
|
38
36
|
*
|
|
39
37
|
* Ink-TUI Enter semantics: Claude's Ink TUI swallows an Enter fused to the text,
|
|
40
38
|
* so the default path delivers the text and the Enter as TWO SEPARATE writes
|
|
41
39
|
* (swarmify's `sendText(text,false)` then `sendText('\r',false)`). `combined`
|
|
42
40
|
* opts into one fused write for plain shells / REPLs.
|
|
43
41
|
*/
|
|
44
|
-
import { ptyRequest } from '../pty-client.js';
|
|
45
42
|
import { appleScriptStr } from './quote.js';
|
|
46
43
|
import { runSpec } from './transport.js';
|
|
47
44
|
import { itermBackend, ghosttyBackend } from './backends/index.js';
|
|
@@ -51,7 +48,7 @@ import { currentContext } from './types.js';
|
|
|
51
48
|
* Everything but vscodium self-confirms (see InjectResult.confirmed); vscodium's
|
|
52
49
|
* `--open-url` is fire-and-forget until the swarm-ext extension acks the verb.
|
|
53
50
|
*/
|
|
54
|
-
|
|
51
|
+
function backendConfirmsDelivery(backend) {
|
|
55
52
|
return backend !== 'vscodium';
|
|
56
53
|
}
|
|
57
54
|
/** Carriage return — what Enter delivers into a raw PTY/tmux byte stream. */
|
|
@@ -185,28 +182,6 @@ export function vscodiumInjectUri(scheme, terminalId, text, opts) {
|
|
|
185
182
|
export function vscodiumInjectSpec(target, text, opts) {
|
|
186
183
|
return { argv: [target.cli, '--open-url', vscodiumInjectUri(target.scheme, target.terminalId, text, opts)] };
|
|
187
184
|
}
|
|
188
|
-
// --- pty --------------------------------------------------------------------
|
|
189
|
-
async function injectPty(target, text, o) {
|
|
190
|
-
if (o.host && o.host !== 'local') {
|
|
191
|
-
return { ok: false, confirmed: false, backend: 'pty', writes: 0, error: 'pty injection is local-only (the sidecar is not a remote surface)' };
|
|
192
|
-
}
|
|
193
|
-
// Same Ink-safe split as tmux: text write, then a separate CR write.
|
|
194
|
-
const writes = o.enter && o.combined ? [text + CR] : o.enter ? [text, CR] : [text];
|
|
195
|
-
if (o.dryRun)
|
|
196
|
-
return { ok: true, confirmed: true, backend: 'pty', writes: writes.length };
|
|
197
|
-
try {
|
|
198
|
-
for (const input of writes) {
|
|
199
|
-
const res = await ptyRequest('write', target.id, { input });
|
|
200
|
-
if (!res.ok)
|
|
201
|
-
return { ok: false, confirmed: false, backend: 'pty', writes: 0, error: res.error ?? 'pty write failed' };
|
|
202
|
-
}
|
|
203
|
-
// A successful sidecar write reached the fd — real delivery.
|
|
204
|
-
return { ok: true, confirmed: true, backend: 'pty', writes: writes.length };
|
|
205
|
-
}
|
|
206
|
-
catch (err) {
|
|
207
|
-
return { ok: false, confirmed: false, backend: 'pty', writes: 0, error: err instanceof Error ? err.message : String(err) };
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
185
|
// --- public entry -----------------------------------------------------------
|
|
211
186
|
/**
|
|
212
187
|
* Deliver `text` (+ Enter) into an existing terminal surface. Resolves the
|
|
@@ -216,9 +191,6 @@ async function injectPty(target, text, o) {
|
|
|
216
191
|
export async function injectIntoTerminal(target, text, opts = {}) {
|
|
217
192
|
const enter = opts.enter !== false;
|
|
218
193
|
const combined = opts.combined === true;
|
|
219
|
-
if (target.backend === 'pty') {
|
|
220
|
-
return injectPty(target, text, { enter, combined, host: opts.host, dryRun: opts.dryRun });
|
|
221
|
-
}
|
|
222
194
|
// tmux + AppleScript + editor-CLI backends all run through the engine transport.
|
|
223
195
|
const specs = target.backend === 'tmux'
|
|
224
196
|
? tmuxInjectSpecs(target, text, { enter, combined, socket: opts.socket })
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* Resolution reads the agent's INHERITED ENV (via session provenance) plus the
|
|
12
12
|
* IDE's live-terminals registry (off disk) — no cooperation from the agent:
|
|
13
13
|
*
|
|
14
|
-
* tmux > iterm > vscodium
|
|
14
|
+
* tmux > iterm > vscodium
|
|
15
15
|
*
|
|
16
16
|
* tmux wins whenever present: a `tmux send-keys -t <pane>` reaches the pane no
|
|
17
17
|
* matter which host app (iTerm / Ghostty / VS Code) is above it, so it's correct
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
import type { ActiveSession } from '../session/active.js';
|
|
26
26
|
import type { InjectTarget } from './inject.js';
|
|
27
27
|
/** A resolved rail, or an honest refusal. The watchdog acts only on `addressable: true`. */
|
|
28
|
-
export type InjectRail = 'tmux' | 'iterm' | 'vscodium' | 'ghostty'
|
|
28
|
+
export type InjectRail = 'tmux' | 'iterm' | 'vscodium' | 'ghostty';
|
|
29
29
|
export type InjectResolution = {
|
|
30
30
|
addressable: true;
|
|
31
31
|
rail: InjectRail;
|
|
@@ -43,12 +43,6 @@ export interface ResolveOptions {
|
|
|
43
43
|
* a Ghostty session with no tmux resolves to un-addressable instead.
|
|
44
44
|
*/
|
|
45
45
|
allowGhosttyFocus?: boolean;
|
|
46
|
-
/**
|
|
47
|
-
* A known `agents pty` sidecar id for this session, if the caller has one. No
|
|
48
|
-
* automatic sessionId -> pty mapping exists yet, so pty is only emitted when
|
|
49
|
-
* supplied here (the lowest-precedence rail).
|
|
50
|
-
*/
|
|
51
|
-
ptyId?: string;
|
|
52
46
|
}
|
|
53
47
|
/**
|
|
54
48
|
* Human-facing recovery hint for a session the resolver judged un-addressable.
|
|
@@ -59,7 +53,7 @@ export declare function addressabilityRecoveryHint(session: ActiveSession, fallb
|
|
|
59
53
|
/**
|
|
60
54
|
* Resolve a target from an already-fetched ActiveSession. Pure — no I/O — so the
|
|
61
55
|
* precedence logic is unit-testable without the process table. This is where the
|
|
62
|
-
* tmux > iterm > vscodium
|
|
56
|
+
* tmux > iterm > vscodium precedence and the Ghostty refusal live.
|
|
63
57
|
*/
|
|
64
58
|
export declare function resolveInjectTargetForSession(session: ActiveSession, opts?: ResolveOptions): InjectResolution;
|
|
65
59
|
/**
|
|
@@ -33,12 +33,12 @@ export function addressabilityRecoveryHint(session, fallbackId) {
|
|
|
33
33
|
if (session.host) {
|
|
34
34
|
return `Host '${session.host}' has no addressable rail here. ${interactive ? `Enable tmux wrapping with \`${tmuxCmd}\` and re-launch, or ` : ''}use \`${resumeCmd}\` to continue this session.`;
|
|
35
35
|
}
|
|
36
|
-
return `This session has no addressable terminal rail (not tmux, iTerm, an IDE terminal
|
|
36
|
+
return `This session has no addressable terminal rail (not tmux, iTerm, or an IDE terminal). ${interactive ? `Enable tmux wrapping with \`${tmuxCmd}\` and re-launch, or ` : ''}use \`${resumeCmd}\` to continue this session.`;
|
|
37
37
|
}
|
|
38
38
|
/**
|
|
39
39
|
* Resolve a target from an already-fetched ActiveSession. Pure — no I/O — so the
|
|
40
40
|
* precedence logic is unit-testable without the process table. This is where the
|
|
41
|
-
* tmux > iterm > vscodium
|
|
41
|
+
* tmux > iterm > vscodium precedence and the Ghostty refusal live.
|
|
42
42
|
*/
|
|
43
43
|
export function resolveInjectTargetForSession(session, opts = {}) {
|
|
44
44
|
const prov = session.provenance;
|
|
@@ -77,11 +77,7 @@ export function resolveInjectTargetForSession(session, opts = {}) {
|
|
|
77
77
|
target: { backend: 'vscodium', terminalId: session.sessionId, cli: variant.cli, scheme: variant.scheme },
|
|
78
78
|
};
|
|
79
79
|
}
|
|
80
|
-
// 4.
|
|
81
|
-
if (opts.ptyId) {
|
|
82
|
-
return { addressable: true, rail: 'pty', target: { backend: 'pty', id: opts.ptyId } };
|
|
83
|
-
}
|
|
84
|
-
// 5. Ghostty — no per-split addressing exists. Refuse by default; the coarse,
|
|
80
|
+
// 4. Ghostty — no per-split addressing exists. Refuse by default; the coarse,
|
|
85
81
|
// focus-stealing window path is opt-in only.
|
|
86
82
|
if (session.host === 'ghostty') {
|
|
87
83
|
if (opts.allowGhosttyFocus) {
|