@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
|
@@ -18,12 +18,14 @@ import * as path from 'path';
|
|
|
18
18
|
import { assertValidSshTarget, shellQuote } from '../ssh-exec.js';
|
|
19
19
|
import { resolveActor, actorEnv } from '../actor.js';
|
|
20
20
|
import { getCliLaunch } from '../cli-entry.js';
|
|
21
|
-
import { encodePwshBase64 } from '../pwsh.js';
|
|
21
|
+
import { encodePwshBase64, pwshLiteral, pwshNativeExecStatements } from '../pwsh.js';
|
|
22
|
+
import { quoteWin32ExecArg } from '../platform/exec.js';
|
|
22
23
|
import { homeRemainder, remoteCdPrefix } from '../project-root.js';
|
|
23
24
|
import { getCacheDir } from '../state.js';
|
|
24
25
|
import { hostKeyCheckingOpts } from './known-hosts.js';
|
|
25
26
|
import { hostNameFor } from './ssh-config.js';
|
|
26
27
|
import { resolveDeviceProfile } from './resolve-profile.js';
|
|
28
|
+
import { renderPowershellCommand, windowsAgentsInvocation } from '../hosts/remote-cmd.js';
|
|
27
29
|
/** Env var the askpass shim reads to know which bundle holds the password. */
|
|
28
30
|
export const ASKPASS_BUNDLE_ENV = 'AGENTS_SSH_BUNDLE';
|
|
29
31
|
/** Env var the askpass shim reads to know which key in the bundle is the password. */
|
|
@@ -72,20 +74,139 @@ export function fleetDialTarget(device) {
|
|
|
72
74
|
}
|
|
73
75
|
}
|
|
74
76
|
/**
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
77
|
+
* Render `cmd` as the single command string ssh sends to the peer.
|
|
78
|
+
*
|
|
79
|
+
* Windows devices speak PowerShell, so the result is run through
|
|
80
|
+
* `powershell -NoProfile -EncodedCommand`; POSIX devices get it as the remote
|
|
81
|
+
* login shell sees it. Returns undefined when no command was given (interactive
|
|
79
82
|
* login).
|
|
83
|
+
*
|
|
84
|
+
* TWO MODES, and the difference is load-bearing rather than a convenience.
|
|
85
|
+
*
|
|
86
|
+
* The default joins the tokens RAW. That is not a bug to be tidied away: every
|
|
87
|
+
* existing caller of `agents ssh` relies on the remote shell interpreting what it
|
|
88
|
+
* is handed — `agents ssh box 'bash -lc "cd x && make"'` arrives as ONE token
|
|
89
|
+
* whose pipeline, globs and redirections the peer's shell must expand. Quoting
|
|
90
|
+
* that would ship the whole line as a literal argument and break it.
|
|
91
|
+
*
|
|
92
|
+
* `{ argv: true }` is for a caller that genuinely holds an argv ARRAY and needs
|
|
93
|
+
* each element delivered as exactly one token. Joining those raw destroys any
|
|
94
|
+
* token containing a space or a metacharacter — `['--title', 'two words']`
|
|
95
|
+
* arrives as three tokens, and `'a & b'` arrives as a backgrounded command — which
|
|
96
|
+
* is what a native client hitting this path actually hit.
|
|
97
|
+
*
|
|
98
|
+
* So fidelity is opt-in at the call site that knows which shape it has, and the
|
|
99
|
+
* quoting itself reuses the canonical helpers (`shellQuote`, {@link pwshQuote})
|
|
100
|
+
* rather than introducing a third escaping scheme.
|
|
80
101
|
*/
|
|
81
|
-
export function wrapRemoteCommand(device, cmd) {
|
|
102
|
+
export function wrapRemoteCommand(device, cmd, opts = {}) {
|
|
82
103
|
if (cmd.length === 0)
|
|
83
104
|
return undefined;
|
|
84
|
-
const
|
|
105
|
+
const prelude = opts.prelude ?? [];
|
|
106
|
+
let script;
|
|
107
|
+
if (opts.argv) {
|
|
108
|
+
// Quote EACH caller token so the peer receives it byte-for-byte, then prefix
|
|
109
|
+
// the prelude VERBATIM — it is already shell syntax and re-quoting it would
|
|
110
|
+
// break it (see `fleetRemotePrelude`).
|
|
111
|
+
if (device.shell === 'powershell') {
|
|
112
|
+
script = pwshExactArgvScript(cmd, prelude);
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
script = [...prelude, ...cmd.map(shellQuote)].join(' ');
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
// The default joins raw, which is what lets a caller hand the remote shell
|
|
120
|
+
// something to interpret. See the docblock above for why both must exist.
|
|
121
|
+
script = [...prelude, ...cmd].join(' ');
|
|
122
|
+
}
|
|
85
123
|
if (device.shell === 'powershell') {
|
|
86
|
-
|
|
124
|
+
// Same renderer the Windows `agents` launcher uses, so a long script gets the
|
|
125
|
+
// compressed representation here too rather than only on that path. The
|
|
126
|
+
// interactive login route (`buildInteractiveShellCommand`, -NoExit) is
|
|
127
|
+
// deliberately left alone: it must stay an interactive session.
|
|
128
|
+
return renderPowershellCommand(script);
|
|
87
129
|
}
|
|
88
|
-
return
|
|
130
|
+
return script;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Single-quote one token for PowerShell's OWN parser. Inside a single-quoted pwsh
|
|
134
|
+
* string the only special character is `'`, escaped by doubling.
|
|
135
|
+
*
|
|
136
|
+
* This is correct for a value PowerShell itself consumes, and NOT sufficient for
|
|
137
|
+
* an argument handed on to a native program — see the Win32 note below.
|
|
138
|
+
*/
|
|
139
|
+
export function pwshQuote(token) {
|
|
140
|
+
return `'${token.replace(/'/g, "''")}'`;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Emit a PowerShell script that runs `cmd` with EXACT argv, for either kind of
|
|
144
|
+
* target a Windows peer can name.
|
|
145
|
+
*
|
|
146
|
+
* Windows has no argv array: a process receives ONE string and splits it itself.
|
|
147
|
+
* PowerShell 5.1 rebuilds that string when it invokes a native program, and its
|
|
148
|
+
* serializer is lossy — measured on a real peer, an EMPTY argument is dropped and
|
|
149
|
+
* an embedded `"` is discarded, so the callee's argv silently shifts.
|
|
150
|
+
*
|
|
151
|
+
* The obvious fix, the `--%` stop-parsing token, is NOT used, because measurement
|
|
152
|
+
* killed it three ways:
|
|
153
|
+
* - it only applies to a NATIVE command, and `agents` on Windows resolves to
|
|
154
|
+
* `agents.ps1`, so a script target received `--%` as a literal argument and
|
|
155
|
+
* the whole remainder as one string;
|
|
156
|
+
* - a token containing a NEWLINE terminates the directive, producing a parser
|
|
157
|
+
* error;
|
|
158
|
+
* - it performs cmd-style `%VAR%` expansion, so a literal `%PATH%` became six
|
|
159
|
+
* arguments — the exact opposite of exact argv.
|
|
160
|
+
*
|
|
161
|
+
* So the script branches on what the peer's own command discovery finds:
|
|
162
|
+
*
|
|
163
|
+
* - **native executable** — launched through `System.Diagnostics.Process` with a
|
|
164
|
+
* pre-built `Arguments` string escaped by {@link quoteWin32ExecArg}. .NET hands
|
|
165
|
+
* that string to `CreateProcess` essentially verbatim, so the child's
|
|
166
|
+
* `CommandLineToArgvW` reconstructs the tokens exactly; no shell sees it, so
|
|
167
|
+
* no `%VAR%` expansion and no newline sensitivity. `UseShellExecute = $false`
|
|
168
|
+
* with no redirection leaves the child on the inherited handles, which is what
|
|
169
|
+
* lets a binary stdout stream through unchanged.
|
|
170
|
+
* - **anything else** (a `.ps1`/`.cmd` launcher, a function, a cmdlet, an alias)
|
|
171
|
+
* — invoked with a splatted PowerShell array. That is an in-process call, so
|
|
172
|
+
* the native serializer is never involved and every token survives as itself.
|
|
173
|
+
*
|
|
174
|
+
* The exit code is propagated in both branches; a script launcher that sets no
|
|
175
|
+
* `$LASTEXITCODE` is left alone rather than forced to 0.
|
|
176
|
+
*/
|
|
177
|
+
function pwshExactArgvScript(cmd, prelude) {
|
|
178
|
+
// The Agents CLI gets the canonical launcher, not the generic dispatch. On
|
|
179
|
+
// Windows `agents` is an npm `agents.ps1` whose own body splats `$args` into
|
|
180
|
+
// native node.exe — the PowerShell 5.1 lossy path — so even a perfectly
|
|
181
|
+
// splatted call into that script loses an embedded quote one layer deeper.
|
|
182
|
+
// `windowsAgentsInvocation` resolves the package's declared entry and runs it
|
|
183
|
+
// directly, which is the only way the real Agents parser sees exact tokens.
|
|
184
|
+
const bin = cmd[0];
|
|
185
|
+
if (bin === 'agents' || bin === 'ag') {
|
|
186
|
+
// `windowsAgentsInvocation` leaves the child's code in `$zq`.
|
|
187
|
+
return [...prelude, windowsAgentsInvocation(cmd.slice(1), bin), 'exit $zq'].join('\n');
|
|
188
|
+
}
|
|
189
|
+
const program = pwshQuote(cmd[0]);
|
|
190
|
+
const rest = cmd.slice(1);
|
|
191
|
+
const splat = rest.length > 0 ? `@(${rest.map(pwshQuote).join(', ')})` : '@()';
|
|
192
|
+
return [
|
|
193
|
+
...prelude,
|
|
194
|
+
`$ErrorActionPreference='Stop'`,
|
|
195
|
+
`$__c = Get-Command -Name ${program} -ErrorAction Stop`,
|
|
196
|
+
`if ($__c.CommandType -eq 'Application') {`,
|
|
197
|
+
// One emitter for the .NET native-exec block, shared with the Windows
|
|
198
|
+
// `agents` launcher in `hosts/remote-cmd.ts`; a second copy would drift.
|
|
199
|
+
...pwshNativeExecStatements('$__c.Source', pwshLiteral(rest.map(quoteWin32ExecArg).join(' '))).map((line) => ` ${line}`),
|
|
200
|
+
// `pwshNativeExecStatements` names the process handle `$zp`.
|
|
201
|
+
` exit $zp.ExitCode`,
|
|
202
|
+
`}`,
|
|
203
|
+
// `@__a` SPLATS the array into separate arguments. `& $__c @(...)` on an
|
|
204
|
+
// array LITERAL does not splat — it passes one array-valued argument, which
|
|
205
|
+
// a real peer reported back as every token collapsed into one.
|
|
206
|
+
`$__a = ${splat}`,
|
|
207
|
+
`& $__c @__a`,
|
|
208
|
+
`if ($null -ne $LASTEXITCODE) { exit $LASTEXITCODE }`,
|
|
209
|
+
].join('\n');
|
|
89
210
|
}
|
|
90
211
|
/**
|
|
91
212
|
* True when `cmd` is a browser drive: `agents browser …`, `ag browser …`, or
|
|
@@ -123,22 +244,43 @@ export function isAgentsBrowserDrive(cmd) {
|
|
|
123
244
|
* fan-out stamps the marker before {@link buildSshInvocation}) is left unchanged
|
|
124
245
|
* so nothing is doubled.
|
|
125
246
|
*/
|
|
126
|
-
|
|
247
|
+
/**
|
|
248
|
+
* The provenance prefix as READY SHELL SYNTAX for the device's shell.
|
|
249
|
+
*
|
|
250
|
+
* These tokens are already quoted/escaped for their target shell — a POSIX
|
|
251
|
+
* `K=V` pair is `shellQuote`d here, and a PowerShell assignment is a complete
|
|
252
|
+
* statement with its own doubled quotes. That matters because argv mode quotes
|
|
253
|
+
* every token it is handed: quoting THESE again turns
|
|
254
|
+
* `'AGENTS_ACTOR=Some Name'` into `''\''AGENTS_ACTOR=Some Name'\'''` and turns a
|
|
255
|
+
* pwsh assignment into an inert string literal. So the prelude is composed
|
|
256
|
+
* SEPARATELY from the caller's argv rather than concatenated into it, and this is
|
|
257
|
+
* the single definition both paths use.
|
|
258
|
+
*/
|
|
259
|
+
export function fleetRemotePrelude(device, provenanceEnv = actorEnv(resolveActor())) {
|
|
127
260
|
if (device.shell === 'powershell') {
|
|
128
|
-
|
|
129
|
-
// is always this literal, so `startsWith` would only loosen it for no gain.
|
|
130
|
-
if (cmd[0] === `$env:AGENTS_FLEET_REMOTE='1';`)
|
|
131
|
-
return cmd;
|
|
132
|
-
const prelude = [
|
|
261
|
+
return [
|
|
133
262
|
`$env:AGENTS_FLEET_REMOTE='1';`,
|
|
134
263
|
...Object.entries(provenanceEnv).map(([k, v]) => `$env:${k}='${v.replace(/'/g, "''")}';`),
|
|
135
264
|
];
|
|
136
|
-
return [...prelude, ...cmd];
|
|
137
265
|
}
|
|
138
|
-
|
|
266
|
+
return [
|
|
267
|
+
'env',
|
|
268
|
+
'AGENTS_FLEET_REMOTE=1',
|
|
269
|
+
...Object.entries(provenanceEnv).map(([k, v]) => shellQuote(`${k}=${v}`)),
|
|
270
|
+
];
|
|
271
|
+
}
|
|
272
|
+
/** True when `cmd` already carries the prelude {@link fleetRemotePrelude} emits. */
|
|
273
|
+
function alreadyMarked(cmd, device) {
|
|
274
|
+
if (device.shell === 'powershell')
|
|
275
|
+
return cmd[0] === `$env:AGENTS_FLEET_REMOTE='1';`;
|
|
276
|
+
return cmd[0] === 'env' && cmd[1] === 'AGENTS_FLEET_REMOTE=1';
|
|
277
|
+
}
|
|
278
|
+
export function markFleetRemote(cmd, device, provenanceEnv = actorEnv(resolveActor())) {
|
|
279
|
+
// Exact-match guard: the marker token is always this literal, so `startsWith`
|
|
280
|
+
// would only loosen it for no gain.
|
|
281
|
+
if (alreadyMarked(cmd, device))
|
|
139
282
|
return cmd;
|
|
140
|
-
|
|
141
|
-
return ['env', 'AGENTS_FLEET_REMOTE=1', ...actorTokens, ...cmd];
|
|
283
|
+
return [...fleetRemotePrelude(device, provenanceEnv), ...cmd];
|
|
142
284
|
}
|
|
143
285
|
/**
|
|
144
286
|
* Build the remote command that starts an INTERACTIVE LOGIN shell inside a
|
|
@@ -229,10 +371,16 @@ export function buildSshInvocation(device, cmd, askpassShimPath, hostKey = {}, o
|
|
|
229
371
|
// Stamp the consent marker on the REMOTE command, not the local ssh env:
|
|
230
372
|
// SSH_ASKPASS lives on this side; AGENTS_FLEET_REMOTE must be visible to the
|
|
231
373
|
// process that runs on the peer.
|
|
232
|
-
|
|
374
|
+
// Provenance is composed as a PRELUDE, not prepended to the argv array. In argv
|
|
375
|
+
// mode every token handed to `wrapRemoteCommand` is quoted, and the prelude is
|
|
376
|
+
// already shell syntax — mixing them in meant the actor pairs were quoted twice
|
|
377
|
+
// (breaking any value with a space or a quote) and the pwsh assignments became
|
|
378
|
+
// inert string literals.
|
|
379
|
+
const needsProvenance = !interactive && isAgentsBrowserDrive(cmd) && !alreadyMarked(cmd, device);
|
|
380
|
+
const prelude = needsProvenance ? fleetRemotePrelude(device) : [];
|
|
233
381
|
const remote = interactive
|
|
234
382
|
? buildInteractiveShellCommand(device, opts.interactiveCwd)
|
|
235
|
-
: wrapRemoteCommand(device,
|
|
383
|
+
: wrapRemoteCommand(device, cmd, { ...(opts.argv ? { argv: true } : {}), ...(prelude.length > 0 ? { prelude } : {}) });
|
|
236
384
|
const env = {};
|
|
237
385
|
const args = [
|
|
238
386
|
...hostKeyCheckingOpts(hostKey.pinned ?? false, hostKey.knownHostsFile),
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
type DeviceDiscoveryStatus = 'approved' | 'ignored';
|
|
2
|
+
interface DeviceDiscoveryReconcileResult {
|
|
3
3
|
approved: string[];
|
|
4
4
|
ignored: string[];
|
|
5
5
|
registered: string[];
|
|
@@ -40,3 +40,4 @@ export declare function loadDeviceDiscoveryPolicies(): Map<string, DeviceDiscove
|
|
|
40
40
|
export declare function reconcileDeviceDiscoveryPolicies(): Promise<DeviceDiscoveryReconcileResult>;
|
|
41
41
|
/** Complete reconciliation from real `tailscale status --json` output. */
|
|
42
42
|
export declare function registerApprovedDevicesFromTailscale(json: string, approved: string[], ignored: string[], missing: string[]): Promise<DeviceDiscoveryReconcileResult>;
|
|
43
|
+
export {};
|
|
@@ -244,7 +244,7 @@ export function remediationFor(finding) {
|
|
|
244
244
|
case 'content-drift':
|
|
245
245
|
case 'stale':
|
|
246
246
|
// doctor diagnoses; `agents sync` fixes (the superset of the old
|
|
247
|
-
// `
|
|
247
|
+
// `agents sync`). A bare `agents sync <agent>` hits only the default
|
|
248
248
|
// version, so an agent-only row collapsed across versions must ask for
|
|
249
249
|
// @all to reach every one it covers.
|
|
250
250
|
if (agent && version)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/** Serve a cached snapshot without recomputing while it is younger than this. */
|
|
2
2
|
export declare const DOCTOR_OVERVIEW_FRESH_MS = 90000;
|
|
3
3
|
/** Injectable IO + clock so tests exercise the real fs at a temp dir, no mocks. */
|
|
4
|
-
|
|
4
|
+
interface DoctorOverviewCacheDeps {
|
|
5
5
|
/** Cache directory (default: the real `~/.agents/.cache`). */
|
|
6
6
|
dir?: string;
|
|
7
7
|
/** Clock (default: {@link Date.now}). */
|
|
@@ -29,7 +29,7 @@ export declare function invalidateDoctorOverviewCache(deps?: DoctorOverviewCache
|
|
|
29
29
|
* the way out. Call `release()` in a `finally` so a compute that throws still
|
|
30
30
|
* frees the lock promptly (idempotent).
|
|
31
31
|
*/
|
|
32
|
-
|
|
32
|
+
interface OverviewGate {
|
|
33
33
|
cached: string | null;
|
|
34
34
|
release?: () => void;
|
|
35
35
|
}
|
|
@@ -50,3 +50,4 @@ export declare function enterDoctorOverviewGate(opts?: {
|
|
|
50
50
|
forceRefresh?: boolean;
|
|
51
51
|
freshMs?: number;
|
|
52
52
|
}, deps?: DoctorOverviewCacheDeps): Promise<OverviewGate>;
|
|
53
|
+
export {};
|
|
@@ -111,7 +111,7 @@ export interface FleetDivergence {
|
|
|
111
111
|
/** Human-readable one-liner, ready for the warnings list. */
|
|
112
112
|
message: string;
|
|
113
113
|
}
|
|
114
|
-
|
|
114
|
+
interface FleetDivergenceReport {
|
|
115
115
|
/** Name of the device used as the comparison baseline (the local machine). */
|
|
116
116
|
baseline: string;
|
|
117
117
|
divergences: FleetDivergence[];
|
|
@@ -132,3 +132,4 @@ export interface FleetDivergenceReport {
|
|
|
132
132
|
* JSON output — and the tests — are stable.
|
|
133
133
|
*/
|
|
134
134
|
export declare function compareFleetInventories(devices: DeviceInventory[], baselineName: string): FleetDivergenceReport;
|
|
135
|
+
export {};
|
|
@@ -10,8 +10,6 @@
|
|
|
10
10
|
import type { DeviceProfile, DeviceRegistry } from './registry.js';
|
|
11
11
|
import type { DeviceStats } from './health.js';
|
|
12
12
|
export type FleetSkipReason = 'offline' | 'no-address';
|
|
13
|
-
/** npm dist-tags / semver pins only — rejects shell metacharacters. */
|
|
14
|
-
export declare const FLEET_VERSION_RE: RegExp;
|
|
15
13
|
export interface FleetTarget {
|
|
16
14
|
device: DeviceProfile;
|
|
17
15
|
/** When set, this device is not reached (skip with reason). */
|
|
@@ -112,7 +110,7 @@ export declare function runLocalCommand(cmd: string[], opts?: {
|
|
|
112
110
|
* cannot inject shell metacharacters into the remote command line.
|
|
113
111
|
*/
|
|
114
112
|
export declare function upgradeCommand(version?: string): string[];
|
|
115
|
-
|
|
113
|
+
interface RunFleetOptions {
|
|
116
114
|
/**
|
|
117
115
|
* Name of THIS machine. Its target runs the command **locally** (no ssh) — a
|
|
118
116
|
* box can't reliably ssh to itself and doesn't need to. Omit to ssh every
|
|
@@ -132,7 +130,7 @@ export interface RunFleetOptions {
|
|
|
132
130
|
* recorded as `failed` so one bad device never aborts the rest.
|
|
133
131
|
*/
|
|
134
132
|
export declare function runFleet(targets: FleetTarget[], cmd: string[], opts?: RunFleetOptions): FleetRunResult[];
|
|
135
|
-
|
|
133
|
+
interface FanOutDeviceOptions {
|
|
136
134
|
/**
|
|
137
135
|
* Per-device deadline in milliseconds. When set, any probe that does not
|
|
138
136
|
* settle within this window is abandoned via `Promise.race` against a
|
|
@@ -149,3 +147,4 @@ export interface FanOutDeviceOptions {
|
|
|
149
147
|
}
|
|
150
148
|
/** Run one async probe per device in parallel, preserving input order. */
|
|
151
149
|
export declare function fanOutDevices<T, Target extends FanOutDeviceTarget = FanOutDeviceTarget>(targets: Target[], probe: (target: Target) => Promise<T>, opts?: FanOutDeviceOptions): Promise<FanOutDeviceResult<T>[]>;
|
|
150
|
+
export {};
|
|
@@ -11,7 +11,7 @@ import { spawnSync } from 'child_process';
|
|
|
11
11
|
import { isSelfHost } from './self-host.js';
|
|
12
12
|
import { buildSshInvocation, sshTargetFor, writeAskpassShim } from './connect.js';
|
|
13
13
|
/** npm dist-tags / semver pins only — rejects shell metacharacters. */
|
|
14
|
-
|
|
14
|
+
const FLEET_VERSION_RE = /^[A-Za-z0-9._-]+$/;
|
|
15
15
|
/**
|
|
16
16
|
* Classify each registered device for a fleet operation.
|
|
17
17
|
*
|
|
@@ -51,7 +51,7 @@ export interface HostHarnessResult {
|
|
|
51
51
|
skipped?: string;
|
|
52
52
|
}
|
|
53
53
|
/** An account collapsed across the installs on one host that share it. */
|
|
54
|
-
|
|
54
|
+
interface AccountGroup {
|
|
55
55
|
/** Account display label, or null for the signed-out bucket. */
|
|
56
56
|
account: string | null;
|
|
57
57
|
/** Distinct agent ids using this account, sorted. */
|
|
@@ -130,7 +130,7 @@ export declare function renderHarnessMatrix(results: HostHarnessResult[]): strin
|
|
|
130
130
|
* account (installs sharing it collapsed), showing which harnesses use it. Pure.
|
|
131
131
|
*/
|
|
132
132
|
export declare function renderAccountsMatrix(results: HostHarnessResult[]): string[];
|
|
133
|
-
|
|
133
|
+
interface AccountFleetMatrixRow {
|
|
134
134
|
harness: AgentId;
|
|
135
135
|
name: string | null;
|
|
136
136
|
identityLabel: string;
|
|
@@ -147,3 +147,4 @@ export interface AccountFleetMatrixRow {
|
|
|
147
147
|
export declare function renderAccountFleetMatrix(rows: AccountFleetMatrixRow[], opts?: {
|
|
148
148
|
uncoveredDevices?: string[];
|
|
149
149
|
}): string[];
|
|
150
|
+
export {};
|
|
@@ -52,7 +52,7 @@ export interface FleetHealthRow {
|
|
|
52
52
|
* Undefined when no row has been published for the host yet. */
|
|
53
53
|
agents?: FleetAgentCounts;
|
|
54
54
|
}
|
|
55
|
-
|
|
55
|
+
interface FleetWarning {
|
|
56
56
|
kind: 'unreachable' | 'drift' | 'cli' | 'version-skew' | 'divergence';
|
|
57
57
|
devices: string[];
|
|
58
58
|
message: string;
|
|
@@ -82,7 +82,7 @@ export declare function freshnessFooter(rows: FleetHealthRow[], now?: number): s
|
|
|
82
82
|
export declare function shortVersion(version: string | null | undefined): string;
|
|
83
83
|
/** OS bucket label for grouping. Anything unrecognized falls under "Other". */
|
|
84
84
|
export declare function platformGroupLabel(platform: string | undefined): 'macOS' | 'Linux' | 'Windows' | 'Other';
|
|
85
|
-
|
|
85
|
+
interface FleetAttentionItem {
|
|
86
86
|
/** Leading mark: `○` offline, `⚠` config/CLI/version issue. */
|
|
87
87
|
glyph: 'offline' | 'warn';
|
|
88
88
|
subject: string;
|
|
@@ -106,3 +106,4 @@ export declare function renderFleetSummary(report: FleetHealthReport, opts?: {
|
|
|
106
106
|
self?: string;
|
|
107
107
|
now?: number;
|
|
108
108
|
}): string[];
|
|
109
|
+
export {};
|
|
@@ -49,13 +49,6 @@ export declare function probeBudgetMs(device: DeviceProfile): number;
|
|
|
49
49
|
export declare const WIN_PROBE_TIMEOUT_MS = 6000;
|
|
50
50
|
/** One-shot remote snapshot: load, memory, core count, then root filesystem. */
|
|
51
51
|
export declare const PROBE_SNIPPET = "uptime; echo ---AGSTAT---; (vm_stat 2>/dev/null || cat /proc/meminfo 2>/dev/null); echo ---AGSTAT---; (nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null); echo ---AGSTAT---; df -Pk / 2>/dev/null | tail -1";
|
|
52
|
-
/** Windows equivalent, one labeled line via CIM. PowerShell 5.1-safe: no `||`
|
|
53
|
-
* chaining, plain string concatenation. `LoadPercentage` is $null on some
|
|
54
|
-
* hosts/VMs, which concatenates to an empty field — the parser treats that as
|
|
55
|
-
* "no load signal" and headroom falls back to memory pressure alone.
|
|
56
|
-
* wrapRemoteCommand base64-encodes this for powershell-shell devices, so the
|
|
57
|
-
* quoting survives ssh intact. */
|
|
58
|
-
export declare const WIN_PROBE_SNIPPET = "$os = Get-CimInstance Win32_OperatingSystem; $cpu = (Get-CimInstance Win32_Processor | Measure-Object -Property LoadPercentage -Average).Average; $disk = Get-CimInstance Win32_LogicalDisk -Filter \"DeviceID='C:'\"; Write-Output ('AGWINSTAT load=' + $cpu + ' freeKb=' + $os.FreePhysicalMemory + ' totalKb=' + $os.TotalVisibleMemorySize + ' ncpu=' + $env:NUMBER_OF_PROCESSORS + ' diskFreeKb=' + ($disk.FreeSpace / 1KB) + ' diskTotalKb=' + ($disk.Size / 1KB))";
|
|
59
52
|
export declare function localProbeInvocation(platform: NodeJS.Platform): {
|
|
60
53
|
file: string;
|
|
61
54
|
args: string[];
|
|
@@ -114,7 +107,7 @@ export declare function parseProbeOutput(host: string, stdout: string, fetchedAt
|
|
|
114
107
|
* (e.g. CIM unavailable) keeps `reachable: true` — ssh answered — with no
|
|
115
108
|
* numbers, mirroring how garbage POSIX output degrades. */
|
|
116
109
|
export declare function parseWinProbeOutput(host: string, stdout: string, fetchedAt: number): DeviceStats;
|
|
117
|
-
|
|
110
|
+
interface FleetCapacity {
|
|
118
111
|
reachable: number;
|
|
119
112
|
cores: number;
|
|
120
113
|
memTotalBytes: number;
|
|
@@ -63,7 +63,7 @@ export const PROBE_SNIPPET = `uptime; echo ${SEP}; (vm_stat 2>/dev/null || cat /
|
|
|
63
63
|
* "no load signal" and headroom falls back to memory pressure alone.
|
|
64
64
|
* wrapRemoteCommand base64-encodes this for powershell-shell devices, so the
|
|
65
65
|
* quoting survives ssh intact. */
|
|
66
|
-
|
|
66
|
+
const WIN_PROBE_SNIPPET = `$os = Get-CimInstance Win32_OperatingSystem; $cpu = (Get-CimInstance Win32_Processor | Measure-Object -Property LoadPercentage -Average).Average; $disk = Get-CimInstance Win32_LogicalDisk -Filter "DeviceID='C:'"; Write-Output ('AGWINSTAT load=' + $cpu + ' freeKb=' + $os.FreePhysicalMemory + ' totalKb=' + $os.TotalVisibleMemorySize + ' ncpu=' + $env:NUMBER_OF_PROCESSORS + ' diskFreeKb=' + ($disk.FreeSpace / 1KB) + ' diskTotalKb=' + ($disk.Size / 1KB))`;
|
|
67
67
|
export function localProbeInvocation(platform) {
|
|
68
68
|
return platform === 'win32'
|
|
69
69
|
? { file: 'powershell', args: ['-NoProfile', '-Command', WIN_PROBE_SNIPPET] }
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
/** The reserved `--device` value meaning the box the human is at. */
|
|
2
|
-
export declare const INTERACTIVE_DEVICE_SENTINEL = "interactive";
|
|
3
1
|
/** True when a host flag value is the interactive sentinel. */
|
|
4
2
|
export declare function isDeviceInteractive(value: string | undefined | null): boolean;
|
|
5
3
|
/**
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
import { getConfigValue } from '../device-config.js';
|
|
20
20
|
import { RESERVED_DEVICE_NAMES } from './registry.js';
|
|
21
21
|
/** The reserved `--device` value meaning the box the human is at. */
|
|
22
|
-
|
|
22
|
+
const INTERACTIVE_DEVICE_SENTINEL = 'interactive';
|
|
23
23
|
/** True when a host flag value is the interactive sentinel. */
|
|
24
24
|
export function isDeviceInteractive(value) {
|
|
25
25
|
return typeof value === 'string' && value.trim().toLowerCase() === INTERACTIVE_DEVICE_SENTINEL;
|
|
@@ -3,8 +3,6 @@ import type { DeviceProfile } from './registry.js';
|
|
|
3
3
|
export declare function managedKnownHostsPath(): string;
|
|
4
4
|
/** Ensure the parent directory of the managed store exists (mode 0700). */
|
|
5
5
|
export declare function ensureManagedKnownHostsDir(file?: string): void;
|
|
6
|
-
/** Read the managed store, or '' when it does not exist yet. */
|
|
7
|
-
export declare function readManagedKnownHosts(file?: string): string;
|
|
8
6
|
/**
|
|
9
7
|
* True if `host` has at least one pinned key line in `content`. Pure (content
|
|
10
8
|
* in) so the match logic is unit-testable without touching disk. Matching is
|
|
@@ -44,7 +42,7 @@ export declare function hostKeyCheckingOpts(pinned: boolean, file?: string): str
|
|
|
44
42
|
* contract is unit-testable without spawning ssh-keyscan.
|
|
45
43
|
*/
|
|
46
44
|
export declare function newKnownHostsLines(existing: string, scanned: string): string[];
|
|
47
|
-
|
|
45
|
+
interface PinResult {
|
|
48
46
|
/** True if the host is pinned in the managed store after this call. */
|
|
49
47
|
pinned: boolean;
|
|
50
48
|
/** How many new key lines were appended. */
|
|
@@ -58,20 +56,4 @@ export interface PinResult {
|
|
|
58
56
|
* network (the spawn stays in `pinHostKey`).
|
|
59
57
|
*/
|
|
60
58
|
export declare function recordScannedKeys(host: string, scanned: string, file?: string): PinResult;
|
|
61
|
-
|
|
62
|
-
* `ssh-keyscan` a host at a trusted moment and append any new key lines to the
|
|
63
|
-
* managed store, idempotently. This is the explicit pin path; the implicit one
|
|
64
|
-
* is a normal `accept-new` connection whose learned key lands in the same store.
|
|
65
|
-
* Returns whether the host is pinned afterward.
|
|
66
|
-
*
|
|
67
|
-
* Host-name-agnostic: it scans whatever address it is handed, so it also pins a
|
|
68
|
-
* host `agents ssh` can't reach — notably a bare `~/.ssh/config` `Host` alias,
|
|
69
|
-
* which is not a registered device. The `--copy-creds` gate (commands/exec.ts)
|
|
70
|
-
* calls this for exactly that case so the credential copy is usable for
|
|
71
|
-
* ssh-config-alias hosts (RUSH-1767).
|
|
72
|
-
*/
|
|
73
|
-
export declare function pinHostKey(host: string, opts?: {
|
|
74
|
-
file?: string;
|
|
75
|
-
timeoutMs?: number;
|
|
76
|
-
port?: number;
|
|
77
|
-
}): PinResult;
|
|
59
|
+
export {};
|
|
@@ -32,7 +32,7 @@ export function ensureManagedKnownHostsDir(file = managedKnownHostsPath()) {
|
|
|
32
32
|
fs.mkdirSync(path.dirname(file), { recursive: true, mode: 0o700 });
|
|
33
33
|
}
|
|
34
34
|
/** Read the managed store, or '' when it does not exist yet. */
|
|
35
|
-
|
|
35
|
+
function readManagedKnownHosts(file = managedKnownHostsPath()) {
|
|
36
36
|
try {
|
|
37
37
|
return fs.readFileSync(file, 'utf-8');
|
|
38
38
|
}
|
|
@@ -135,7 +135,7 @@ export function recordScannedKeys(host, scanned, file = managedKnownHostsPath())
|
|
|
135
135
|
* calls this for exactly that case so the credential copy is usable for
|
|
136
136
|
* ssh-config-alias hosts (RUSH-1767).
|
|
137
137
|
*/
|
|
138
|
-
|
|
138
|
+
function pinHostKey(host, opts = {}) {
|
|
139
139
|
// Same injection guard as sshExec: a host starting with `-` (or carrying shell
|
|
140
140
|
// metacharacters) must never reach ssh-keyscan as a bare argv where it could
|
|
141
141
|
// be parsed as a flag.
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
* ranker ({@link autoLaunchPreferredSet}, applied by `pickBestDevice`).
|
|
31
31
|
*/
|
|
32
32
|
import { type AutoLaunchPreference, type AutoPoolMode, type ConfiguredDeviceRole } from '../device-config.js';
|
|
33
|
-
|
|
33
|
+
interface AutoPoolOptions {
|
|
34
34
|
/** Pool mode; defaults to the configured `auto.pool`. */
|
|
35
35
|
mode?: AutoPoolMode;
|
|
36
36
|
/** Configured roles by device name; defaults to the fleet-shared block. */
|
|
@@ -77,3 +77,4 @@ export declare function listWorkerDevices(opts?: Pick<AutoPoolOptions, 'roles'>)
|
|
|
77
77
|
* callers can append it unconditionally.
|
|
78
78
|
*/
|
|
79
79
|
export declare function describeAutoPool(opts?: AutoPoolOptions): string;
|
|
80
|
+
export {};
|
|
@@ -3,14 +3,14 @@ import { type DeviceProfile } from './registry.js';
|
|
|
3
3
|
export { splitUserHost };
|
|
4
4
|
/** A dialable peer: the ssh target, the machine id used to tag its rows, a
|
|
5
5
|
* display name, and the OS family that picks the remote shell dialect. */
|
|
6
|
-
|
|
6
|
+
interface ResolvedSshTarget {
|
|
7
7
|
target: string;
|
|
8
8
|
machine: string;
|
|
9
9
|
name: string;
|
|
10
10
|
os?: string;
|
|
11
11
|
extraSshArgs?: string[];
|
|
12
12
|
}
|
|
13
|
-
|
|
13
|
+
interface ResolvedExplicitTargetSet {
|
|
14
14
|
targets: ResolvedSshTarget[];
|
|
15
15
|
unresolved: string[];
|
|
16
16
|
}
|
|
@@ -43,7 +43,7 @@ import { runLocalCommand, runOnDevice, type FleetRunResult, type FleetTarget } f
|
|
|
43
43
|
* falling back to the unresolved path where `readlink -f` is unavailable.
|
|
44
44
|
*/
|
|
45
45
|
export declare function rolloutVerifyCommand(): string[];
|
|
46
|
-
|
|
46
|
+
interface RolloutProbe {
|
|
47
47
|
/** Path the box's own `agents` resolves to, symlinks followed. */
|
|
48
48
|
resolvedPath?: string;
|
|
49
49
|
/** Version that resolved copy reports. */
|
|
@@ -81,7 +81,7 @@ export declare function isRolloutSuccess(verdict: RolloutVerdict): boolean;
|
|
|
81
81
|
export declare function resolveRolloutTarget(explicitVersion: string | undefined, probes: RolloutProbe[]): string | undefined;
|
|
82
82
|
/** Classify one box's probe against the rollout target. */
|
|
83
83
|
export declare function classifyRolloutVerification(probe: RolloutProbe, targetVersion: string | undefined): RolloutVerification;
|
|
84
|
-
|
|
84
|
+
interface VerifyFleetRolloutOptions {
|
|
85
85
|
/** Name of THIS machine; its target is probed locally, mirroring `runFleet`. */
|
|
86
86
|
self?: string;
|
|
87
87
|
/** Injectable ssh runner (tests). */
|
|
@@ -99,3 +99,4 @@ export interface VerifyFleetRolloutOptions {
|
|
|
99
99
|
* "we could not check" and "it is upgraded" are different answers.
|
|
100
100
|
*/
|
|
101
101
|
export declare function verifyFleetRollout(targets: FleetTarget[], results: FleetRunResult[], explicitVersion: string | undefined, opts?: VerifyFleetRolloutOptions): Map<string, RolloutVerification>;
|
|
102
|
+
export {};
|
|
@@ -42,7 +42,7 @@ export declare function writeStatsCache(entries: Record<string, DeviceStats>): v
|
|
|
42
42
|
export declare function removeStatsCacheEntry(name: string): void;
|
|
43
43
|
/** Immutable cache pruning primitive, exported for lifecycle regression tests. */
|
|
44
44
|
export declare function pruneStatsCache(entries: Record<string, DeviceStats>, name: string): Record<string, DeviceStats>;
|
|
45
|
-
|
|
45
|
+
interface FleetStatsResult {
|
|
46
46
|
/** name → stats for every requested device (cache-served + freshly probed). */
|
|
47
47
|
stats: Map<string, DeviceStats>;
|
|
48
48
|
/** Oldest `fetchedAt` among the returned rows, or null when empty. Drives the
|
|
@@ -51,7 +51,7 @@ export interface FleetStatsResult {
|
|
|
51
51
|
/** True when at least one row was served from cache rather than probed this call. */
|
|
52
52
|
servedFromCache: boolean;
|
|
53
53
|
}
|
|
54
|
-
|
|
54
|
+
interface LoadFleetStatsOptions {
|
|
55
55
|
/** Skip the cache and live-probe every device (the `--refresh`/`--live` path). */
|
|
56
56
|
forceRefresh?: boolean;
|
|
57
57
|
/** Device name of THIS machine — always probed locally (no ssh), never cached-served. */
|
|
@@ -70,3 +70,4 @@ export interface LoadFleetStatsOptions {
|
|
|
70
70
|
* `reachable: false` row exactly as the live probe does.
|
|
71
71
|
*/
|
|
72
72
|
export declare function loadFleetStats(devices: DeviceProfile[], opts?: LoadFleetStatsOptions): Promise<FleetStatsResult>;
|
|
73
|
+
export {};
|
|
@@ -34,8 +34,8 @@ export declare function withDefaultUser(input: DeviceInput, prevUser: string | u
|
|
|
34
34
|
* through the menu-bar "NEW DEVICES → Register / Ignore" gate instead of
|
|
35
35
|
* silently landing in the registry.
|
|
36
36
|
*/
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
type DeviceSyncMode = 'bootstrap' | 'refresh';
|
|
38
|
+
interface DeviceSyncResult {
|
|
39
39
|
/** False when discovery could not run (e.g. tailscale absent) in soft mode. */
|
|
40
40
|
ok: boolean;
|
|
41
41
|
/** Number of tailscale nodes upserted into the registry. */
|
|
@@ -89,7 +89,7 @@ export declare function runDeviceSync(opts?: {
|
|
|
89
89
|
soft?: boolean;
|
|
90
90
|
mode?: DeviceSyncMode;
|
|
91
91
|
}): Promise<DeviceSyncResult>;
|
|
92
|
-
|
|
92
|
+
interface EnsureDevicesResult {
|
|
93
93
|
/** Names newly resolved from Tailscale and upserted into the registry. */
|
|
94
94
|
registered: string[];
|
|
95
95
|
/** Names that could not be resolved (not on the tailnet / tailscale absent). */
|
|
@@ -102,7 +102,7 @@ export interface EnsureDevicesResult {
|
|
|
102
102
|
* registered names need nothing. Pure so the bootstrap's filter matrix is
|
|
103
103
|
* unit-testable without a tailnet or registry writes.
|
|
104
104
|
*/
|
|
105
|
-
|
|
105
|
+
interface WantedPartition {
|
|
106
106
|
toRegister: string[];
|
|
107
107
|
unresolved: string[];
|
|
108
108
|
}
|
|
@@ -127,10 +127,11 @@ export declare function ensureDevicesRegistered(wantedNames: string[]): Promise<
|
|
|
127
127
|
* => remove from the registry if it was there, and ignore it so auto-sync never
|
|
128
128
|
* re-adds it.
|
|
129
129
|
*/
|
|
130
|
-
|
|
130
|
+
interface DeviceReconciliation {
|
|
131
131
|
toRegister: string[];
|
|
132
132
|
toUnignore: string[];
|
|
133
133
|
toRemove: string[];
|
|
134
134
|
toIgnore: string[];
|
|
135
135
|
}
|
|
136
136
|
export declare function planDeviceReconciliation(allNames: Iterable<string>, keep: Iterable<string>, registered: Iterable<string>, ignored: Iterable<string>): DeviceReconciliation;
|
|
137
|
+
export {};
|