@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
|
@@ -1,7 +1,60 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
2
|
import { type BrowserProfile } from '../lib/browser/profiles.js';
|
|
3
3
|
import { listInstalledBrowsers } from '../lib/browser/chrome.js';
|
|
4
|
+
import type { DeviceProfile } from '../lib/devices/registry.js';
|
|
4
5
|
export declare function remoteStartTaskName(stdout: string, explicit?: string): string | undefined;
|
|
6
|
+
/**
|
|
7
|
+
* Fetch an absolute remote file into a private local path, bounded.
|
|
8
|
+
*
|
|
9
|
+
* Bounded for real, not by a pre-flight `stat`: the byte budget is enforced on the
|
|
10
|
+
* stream as it arrives (`sshExecRawStream` + `cat`), so a file that grows between
|
|
11
|
+
* a size check and the copy — or a peer that lies about the size — still cannot
|
|
12
|
+
* spend more than the budget. `scp` could not do this; it would transfer
|
|
13
|
+
* everything before this process got a chance to refuse.
|
|
14
|
+
*
|
|
15
|
+
* The local file is written 0600 inside a 0700 directory, because a capture can
|
|
16
|
+
* show anything that was on the peer's screen and a world-readable temp path
|
|
17
|
+
* would publish it to every local user.
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* The command that streams one file's RAW BYTES to stdout on the device's shell.
|
|
21
|
+
*
|
|
22
|
+
* Platform-correct, not one command with a portable-looking name. On Windows
|
|
23
|
+
* `cat` is an alias for `Get-Content`, which is a TEXT reader: it decodes the
|
|
24
|
+
* file, splits it into lines, and re-encodes on output — so a screenshot arrives
|
|
25
|
+
* corrupted rather than merely reordered. The .NET path opens a `FileStream` and
|
|
26
|
+
* copies it into the raw stdout handle, bypassing PowerShell's object/text
|
|
27
|
+
* pipeline entirely, which is the only way binary survives.
|
|
28
|
+
*/
|
|
29
|
+
export declare function remoteReadFileArgv(remotePath: string, shell: DeviceProfile['shell']): string[];
|
|
30
|
+
/**
|
|
31
|
+
* Largest capture `browser show --device` will pull. A capture is a screenshot,
|
|
32
|
+
* a PDF or a short recording; anything past this is not something a viewer should
|
|
33
|
+
* stream over ssh, and the cap is what makes the transfer BOUNDED rather than
|
|
34
|
+
* "however big the peer's file happens to be".
|
|
35
|
+
*/
|
|
36
|
+
export declare const REMOTE_VIEW_MAX_BYTES: number;
|
|
37
|
+
/**
|
|
38
|
+
* Fetch an absolute remote file into a private local path, bounded.
|
|
39
|
+
*
|
|
40
|
+
* Auth is the CANONICAL device path, not a hand-rolled ssh: `buildSshInvocation`
|
|
41
|
+
* supplies the askpass shim for a password-auth box, `-i`/`IdentitiesOnly` for an
|
|
42
|
+
* explicit identity file, and the managed known-hosts pinning. Building the ssh
|
|
43
|
+
* args here instead meant a password-auth device could not be reached at all and
|
|
44
|
+
* an explicit `identityFile` was silently ignored.
|
|
45
|
+
*
|
|
46
|
+
* Bounded for real, not by a pre-flight `stat`: the byte budget is enforced on the
|
|
47
|
+
* stream as it arrives, so a file that grows between a size check and the copy — or
|
|
48
|
+
* a peer that misreports its size — still cannot spend more than the budget.
|
|
49
|
+
*
|
|
50
|
+
* The local file is written 0600 inside a 0700 directory, because a capture can
|
|
51
|
+
* show anything that was on the peer's screen and a world-readable temp path
|
|
52
|
+
* would publish it to every local user.
|
|
53
|
+
*/
|
|
54
|
+
export declare function fetchRemoteFileForViewing(device: string, remotePath: string, localPath: string, opts?: {
|
|
55
|
+
maxBytes?: number;
|
|
56
|
+
timeoutMs?: number;
|
|
57
|
+
}): Promise<void>;
|
|
5
58
|
/**
|
|
6
59
|
* The fleet browser hub this box drives by default (`browser.device`), or
|
|
7
60
|
* undefined to drive locally. It is one fleet-synced value in the central
|
package/dist/commands/browser.js
CHANGED
|
@@ -25,7 +25,11 @@ import { withActorEnv } from '../lib/hosts/dispatch.js';
|
|
|
25
25
|
import { streamAgentsOnHost, passthroughSshOptions, } from '../lib/hosts/passthrough.js';
|
|
26
26
|
import { buildRemoteAgentsInvocation, HOST_ROUTING_SPECS, stripRoutingFlags, } from '../lib/hosts/remote-cmd.js';
|
|
27
27
|
import { resolveRemoteOsSync } from '../lib/hosts/remote-os.js';
|
|
28
|
-
import { sshExec, SSH_OPTS } from '../lib/ssh-exec.js';
|
|
28
|
+
import { sshExec, SSH_OPTS, sshStreamWithArgs } from '../lib/ssh-exec.js';
|
|
29
|
+
import { getBrowserRuntimeDir } from '../lib/state.js';
|
|
30
|
+
import { buildSshInvocation, writeAskpassShim } from '../lib/devices/connect.js';
|
|
31
|
+
import { resolveDeviceProfile } from '../lib/devices/resolve-profile.js';
|
|
32
|
+
import { resolveDeviceTarget } from '../lib/devices/resolve-target.js';
|
|
29
33
|
import { flagValue } from '../lib/hosts/routing-flag.js';
|
|
30
34
|
import { browserTaskPicker } from './browser-picker.js';
|
|
31
35
|
import { assertRemoteControlAllowed, isFleetRemoteInvocation } from '../lib/browser/remote-control.js';
|
|
@@ -35,7 +39,7 @@ import { registerCommandGroups, setHelpSections } from '../lib/help.js';
|
|
|
35
39
|
import { buildHar } from '../lib/browser/har.js';
|
|
36
40
|
import { getCliVersion } from '../lib/version.js';
|
|
37
41
|
import { runBrowserIPCStream } from '../lib/browser/stream.js';
|
|
38
|
-
import { machineId } from '../lib/machine-id.js';
|
|
42
|
+
import { machineId, normalizeHost } from '../lib/machine-id.js';
|
|
39
43
|
import { isArcRunning } from '../lib/browser/drivers/arc.js';
|
|
40
44
|
import { resolveBrowserTarget } from '../lib/browser/resolve-target.js';
|
|
41
45
|
/**
|
|
@@ -179,6 +183,158 @@ export function remoteStartTaskName(stdout, explicit) {
|
|
|
179
183
|
}
|
|
180
184
|
return trimmed.split('\n').map((line) => line.trim()).find(Boolean);
|
|
181
185
|
}
|
|
186
|
+
/**
|
|
187
|
+
* Fetch an absolute remote file into a private local path, bounded.
|
|
188
|
+
*
|
|
189
|
+
* Bounded for real, not by a pre-flight `stat`: the byte budget is enforced on the
|
|
190
|
+
* stream as it arrives (`sshExecRawStream` + `cat`), so a file that grows between
|
|
191
|
+
* a size check and the copy — or a peer that lies about the size — still cannot
|
|
192
|
+
* spend more than the budget. `scp` could not do this; it would transfer
|
|
193
|
+
* everything before this process got a chance to refuse.
|
|
194
|
+
*
|
|
195
|
+
* The local file is written 0600 inside a 0700 directory, because a capture can
|
|
196
|
+
* show anything that was on the peer's screen and a world-readable temp path
|
|
197
|
+
* would publish it to every local user.
|
|
198
|
+
*/
|
|
199
|
+
/**
|
|
200
|
+
* The command that streams one file's RAW BYTES to stdout on the device's shell.
|
|
201
|
+
*
|
|
202
|
+
* Platform-correct, not one command with a portable-looking name. On Windows
|
|
203
|
+
* `cat` is an alias for `Get-Content`, which is a TEXT reader: it decodes the
|
|
204
|
+
* file, splits it into lines, and re-encodes on output — so a screenshot arrives
|
|
205
|
+
* corrupted rather than merely reordered. The .NET path opens a `FileStream` and
|
|
206
|
+
* copies it into the raw stdout handle, bypassing PowerShell's object/text
|
|
207
|
+
* pipeline entirely, which is the only way binary survives.
|
|
208
|
+
*/
|
|
209
|
+
export function remoteReadFileArgv(remotePath, shell) {
|
|
210
|
+
if (shell === 'powershell') {
|
|
211
|
+
// Single-quoted inside the script with pwsh's own doubling, because this whole
|
|
212
|
+
// script is ONE argv token to the outer powershell.
|
|
213
|
+
const literal = remotePath.replace(/'/g, "''");
|
|
214
|
+
return ['powershell', '-NoProfile', '-Command', [
|
|
215
|
+
'$ErrorActionPreference=' + "'Stop';",
|
|
216
|
+
`$in=[System.IO.File]::OpenRead('${literal}');`,
|
|
217
|
+
'try{$out=[System.Console]::OpenStandardOutput();$in.CopyTo($out);$out.Flush()}finally{$in.Dispose()}',
|
|
218
|
+
].join(' ')];
|
|
219
|
+
}
|
|
220
|
+
// `--` so a path that begins with a dash is a path, not an option.
|
|
221
|
+
return ['cat', '--', remotePath];
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Largest capture `browser show --device` will pull. A capture is a screenshot,
|
|
225
|
+
* a PDF or a short recording; anything past this is not something a viewer should
|
|
226
|
+
* stream over ssh, and the cap is what makes the transfer BOUNDED rather than
|
|
227
|
+
* "however big the peer's file happens to be".
|
|
228
|
+
*/
|
|
229
|
+
export const REMOTE_VIEW_MAX_BYTES = 64 * 1024 * 1024;
|
|
230
|
+
/** Write a whole buffer, looping until it is all out. */
|
|
231
|
+
function writeFully(handle, chunk) {
|
|
232
|
+
let offset = 0;
|
|
233
|
+
while (offset < chunk.length) {
|
|
234
|
+
// `writeSync` may write FEWER bytes than asked (a signal, a pipe boundary),
|
|
235
|
+
// and ignoring the return value silently truncated the file mid-capture.
|
|
236
|
+
const wrote = fs.writeSync(handle, chunk, offset, chunk.length - offset);
|
|
237
|
+
if (wrote <= 0)
|
|
238
|
+
throw new Error('local write made no progress');
|
|
239
|
+
offset += wrote;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Fetch an absolute remote file into a private local path, bounded.
|
|
244
|
+
*
|
|
245
|
+
* Auth is the CANONICAL device path, not a hand-rolled ssh: `buildSshInvocation`
|
|
246
|
+
* supplies the askpass shim for a password-auth box, `-i`/`IdentitiesOnly` for an
|
|
247
|
+
* explicit identity file, and the managed known-hosts pinning. Building the ssh
|
|
248
|
+
* args here instead meant a password-auth device could not be reached at all and
|
|
249
|
+
* an explicit `identityFile` was silently ignored.
|
|
250
|
+
*
|
|
251
|
+
* Bounded for real, not by a pre-flight `stat`: the byte budget is enforced on the
|
|
252
|
+
* stream as it arrives, so a file that grows between a size check and the copy — or
|
|
253
|
+
* a peer that misreports its size — still cannot spend more than the budget.
|
|
254
|
+
*
|
|
255
|
+
* The local file is written 0600 inside a 0700 directory, because a capture can
|
|
256
|
+
* show anything that was on the peer's screen and a world-readable temp path
|
|
257
|
+
* would publish it to every local user.
|
|
258
|
+
*/
|
|
259
|
+
export async function fetchRemoteFileForViewing(device, remotePath, localPath, opts = {}) {
|
|
260
|
+
const posixAbsolute = path.posix.isAbsolute(remotePath);
|
|
261
|
+
const windowsAbsolute = /^[A-Za-z]:[\\/]/.test(remotePath) || /^\\\\/.test(remotePath);
|
|
262
|
+
if (!posixAbsolute && !windowsAbsolute) {
|
|
263
|
+
throw new Error(`Remote path must be absolute: got "${remotePath}".\n`
|
|
264
|
+
+ 'This machine cannot resolve the peer\'s working directory, so a relative path\n'
|
|
265
|
+
+ 'would name a different file there than you meant here.');
|
|
266
|
+
}
|
|
267
|
+
// `resolveDeviceTarget` is the SAME resolver `agents ssh` uses, so it yields the
|
|
268
|
+
// full device profile — platform, shell and auth — that `buildSshInvocation`
|
|
269
|
+
// needs. `resolveHost` returns a hosts-registry `Host`, which carries none of
|
|
270
|
+
// that: with it, a password-auth device could not be reached and an explicit
|
|
271
|
+
// identityFile was silently dropped.
|
|
272
|
+
const resolved = await resolveDeviceTarget(device);
|
|
273
|
+
if (!resolved)
|
|
274
|
+
throw new Error(`Unknown device "${device}". Next: agents devices list`);
|
|
275
|
+
const profile = resolveDeviceProfile(resolved);
|
|
276
|
+
const maxBytes = opts.maxBytes ?? REMOTE_VIEW_MAX_BYTES;
|
|
277
|
+
// A POSIX device cannot read a Windows path and vice versa; saying so here beats
|
|
278
|
+
// a confusing shell error from the peer.
|
|
279
|
+
if (profile.shell === 'powershell' && posixAbsolute && !windowsAbsolute) {
|
|
280
|
+
throw new Error(`"${remotePath}" is a POSIX path but ${device} runs PowerShell. Pass the Windows path (e.g. C:\\Users\\…).`);
|
|
281
|
+
}
|
|
282
|
+
if (profile.shell !== 'powershell' && windowsAbsolute) {
|
|
283
|
+
throw new Error(`"${remotePath}" is a Windows path but ${device} is a POSIX host. Pass the absolute POSIX path.`);
|
|
284
|
+
}
|
|
285
|
+
const resolvedLocal = path.resolve(localPath);
|
|
286
|
+
const dir = path.dirname(resolvedLocal);
|
|
287
|
+
fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
288
|
+
fs.chmodSync(dir, 0o700);
|
|
289
|
+
const handle = fs.openSync(resolvedLocal, 'w', 0o600);
|
|
290
|
+
let written = 0;
|
|
291
|
+
let overflow = false;
|
|
292
|
+
const controller = new AbortController();
|
|
293
|
+
try {
|
|
294
|
+
// `argv: true` is what makes a path containing a space or a quote survive —
|
|
295
|
+
// the same exact-token delivery `agents ssh --argv` exposes.
|
|
296
|
+
const { args, env } = buildSshInvocation(profile, remoteReadFileArgv(remotePath, profile.shell), writeAskpassShim(), {}, { argv: true });
|
|
297
|
+
const result = await sshStreamWithArgs({
|
|
298
|
+
args,
|
|
299
|
+
env,
|
|
300
|
+
timeoutMs: opts.timeoutMs ?? 120_000,
|
|
301
|
+
signal: controller.signal,
|
|
302
|
+
onStdout: (chunk) => {
|
|
303
|
+
if (overflow)
|
|
304
|
+
return;
|
|
305
|
+
if (written + chunk.length > maxBytes) {
|
|
306
|
+
overflow = true;
|
|
307
|
+
controller.abort();
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
writeFully(handle, chunk);
|
|
311
|
+
written += chunk.length;
|
|
312
|
+
},
|
|
313
|
+
});
|
|
314
|
+
if (overflow) {
|
|
315
|
+
throw new Error(`Refusing to pull ${device}:${remotePath}: larger than the ${maxBytes}-byte view budget.`);
|
|
316
|
+
}
|
|
317
|
+
if (result.timedOut)
|
|
318
|
+
throw new Error(`Timed out pulling ${device}:${remotePath}.`);
|
|
319
|
+
if (result.code !== 0) {
|
|
320
|
+
const detail = result.stderr.toString('utf8').trim();
|
|
321
|
+
throw new Error(`Failed to read ${device}:${remotePath}${detail ? `: ${detail}` : ` (ssh exited ${result.code})`}`);
|
|
322
|
+
}
|
|
323
|
+
if (written === 0)
|
|
324
|
+
throw new Error(`${device}:${remotePath} is empty or was not readable.`);
|
|
325
|
+
}
|
|
326
|
+
catch (error) {
|
|
327
|
+
// Never leave a partial file behind for a viewer to open as if it were whole.
|
|
328
|
+
try {
|
|
329
|
+
fs.unlinkSync(resolvedLocal);
|
|
330
|
+
}
|
|
331
|
+
catch { /* nothing to clean */ }
|
|
332
|
+
throw error;
|
|
333
|
+
}
|
|
334
|
+
finally {
|
|
335
|
+
fs.closeSync(handle);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
182
338
|
async function pullRemoteFile(device, remotePath, localPath) {
|
|
183
339
|
const host = await resolveHost(device);
|
|
184
340
|
if (!host) {
|
|
@@ -2071,8 +2227,14 @@ function registerTaskCommands(browser) {
|
|
|
2071
2227
|
});
|
|
2072
2228
|
browser
|
|
2073
2229
|
.command('show <url>')
|
|
2074
|
-
.description('Open a URL for a human to read: goes to browser.viewer (default: browser.profile), and binds no task')
|
|
2230
|
+
.description('Open a URL or local file for a human to read: goes to browser.viewer (default: browser.profile), and binds no task')
|
|
2075
2231
|
.option('--os-browser', 'Use the OS default handler instead of the configured viewer')
|
|
2232
|
+
// `--device` here names WHERE THE FILE IS, not where to open it. `show` is the
|
|
2233
|
+
// one browser verb narrowly exempt from the task-routing refusal
|
|
2234
|
+
// (`REJECT_DEVICE_MESSAGE`) because it binds no task and has nothing to route:
|
|
2235
|
+
// it is a local viewer, so the flag can only mean "the source lives there".
|
|
2236
|
+
// Every other verb still refuses `--device` — a task is bound at `start`.
|
|
2237
|
+
.option('--device <name>', 'fetch the file from this device, then view it locally (absolute path only)')
|
|
2076
2238
|
.option('--json', 'Output machine-readable JSON')
|
|
2077
2239
|
.action(async (url, opts) => {
|
|
2078
2240
|
// The entry point external tools need. `navigate` binds a task, which the
|
|
@@ -2083,20 +2245,48 @@ function registerTaskCommands(browser) {
|
|
|
2083
2245
|
// drive letter (`C:\Users\me\plan.html`), so a real path was treated as a
|
|
2084
2246
|
// URL. A scheme is at least two characters.
|
|
2085
2247
|
const isLocalFile = !/^[a-z][a-z0-9+.-]+:/i.test(url);
|
|
2086
|
-
|
|
2087
|
-
|
|
2248
|
+
let localTarget = isLocalFile ? path.resolve(url) : undefined;
|
|
2249
|
+
let fetched;
|
|
2250
|
+
if (opts.device) {
|
|
2251
|
+
// A URL is already reachable from here, so `--device` with one is a
|
|
2252
|
+
// contradiction rather than a no-op: it says the source is remote while
|
|
2253
|
+
// naming something that is not a file on that peer.
|
|
2254
|
+
if (!isLocalFile) {
|
|
2255
|
+
console.error(`--device names the device holding a FILE, so it cannot be combined with a URL.\n Drop --device to open ${url} here, or pass an absolute path on ${opts.device}.`);
|
|
2256
|
+
process.exit(1);
|
|
2257
|
+
}
|
|
2258
|
+
// The peer's path, verbatim — NOT path.resolve()'d, which would rewrite it
|
|
2259
|
+
// against this machine's cwd and name a different file there.
|
|
2260
|
+
const remotePath = url;
|
|
2261
|
+
const dir = path.join(getBrowserRuntimeDir(), 'remote-views');
|
|
2262
|
+
fetched = path.join(dir, `${normalizeHost(opts.device)}-${Date.now()}-${path.basename(remotePath) || 'capture'}`);
|
|
2263
|
+
try {
|
|
2264
|
+
await fetchRemoteFileForViewing(opts.device, remotePath, fetched);
|
|
2265
|
+
}
|
|
2266
|
+
catch (error) {
|
|
2267
|
+
console.error(error.message);
|
|
2268
|
+
process.exit(1);
|
|
2269
|
+
}
|
|
2270
|
+
localTarget = fetched;
|
|
2271
|
+
}
|
|
2272
|
+
const outcome = localTarget
|
|
2273
|
+
? await showFile(localTarget, { osBrowser: opts.osBrowser })
|
|
2088
2274
|
: await showUrl(url, { osBrowser: opts.osBrowser });
|
|
2275
|
+
// The fetched copy is what a viewer actually opened, so it is what the
|
|
2276
|
+
// caller is told about — pointing at the peer's path would name a file that
|
|
2277
|
+
// is not on this machine.
|
|
2278
|
+
const shown = fetched ?? url;
|
|
2089
2279
|
if (opts.json) {
|
|
2090
|
-
console.log(JSON.stringify(outcome, null, 2));
|
|
2280
|
+
console.log(JSON.stringify({ ...outcome, ...(fetched ? { source: `${opts.device}:${url}`, local: fetched } : {}) }, null, 2));
|
|
2091
2281
|
}
|
|
2092
2282
|
else if (outcome.via === 'none') {
|
|
2093
|
-
console.error(`Could not open a browser — open this yourself:\n ${
|
|
2283
|
+
console.error(`Could not open a browser — open this yourself:\n ${shown}`);
|
|
2094
2284
|
}
|
|
2095
2285
|
else if (outcome.via === 'profile') {
|
|
2096
|
-
console.log(`Shown in ${outcome.profile}: ${
|
|
2286
|
+
console.log(`Shown in ${outcome.profile}: ${shown}`);
|
|
2097
2287
|
}
|
|
2098
2288
|
else {
|
|
2099
|
-
console.log(`Opened in the OS default browser: ${
|
|
2289
|
+
console.log(`Opened in the OS default browser: ${shown}`);
|
|
2100
2290
|
}
|
|
2101
2291
|
if (outcome.via === 'none')
|
|
2102
2292
|
process.exit(1);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type ComputerRunRow } from '../lib/computer/sessions-list.js';
|
|
2
|
-
|
|
2
|
+
interface ComputerSessionsCommandOpts {
|
|
3
3
|
machine?: string;
|
|
4
4
|
/** Row cap for the flat table only — the interactive picker is searchable
|
|
5
5
|
* and shows every row regardless (see `runComputerSessions`). */
|
|
@@ -19,3 +19,4 @@ export declare function shouldOpenInteractiveComputerSessions(opts: ComputerSess
|
|
|
19
19
|
* split so both call sites stay in lockstep.
|
|
20
20
|
*/
|
|
21
21
|
export declare function runComputerSessionsCommand(opts: ComputerSessionsCommandOpts): Promise<void>;
|
|
22
|
+
export {};
|
|
@@ -39,6 +39,7 @@
|
|
|
39
39
|
* own event ledger.
|
|
40
40
|
*/
|
|
41
41
|
import { Command } from 'commander';
|
|
42
|
+
import { type ComputerTargetContext } from '../lib/computer/context.js';
|
|
42
43
|
/**
|
|
43
44
|
* The verb catalog. Descriptions are the consumer's (they appear in
|
|
44
45
|
* `agents computer --help`); flags are the engine's.
|
|
@@ -65,38 +66,32 @@ export declare function shouldBlockOffPlatform(opts: {
|
|
|
65
66
|
device?: string;
|
|
66
67
|
}): boolean;
|
|
67
68
|
/**
|
|
68
|
-
* Put `--
|
|
69
|
+
* Put `--host <address>` on the argv handed to the engine.
|
|
69
70
|
*
|
|
70
71
|
* commander CONSUMES the `--device` it declares, so a verb that only read
|
|
71
72
|
* `opts.device` forwarded an argv with no remote selector in it and the engine
|
|
72
73
|
* — which selects the remote path from its own argv — ran the invocation
|
|
73
74
|
* LOCALLY. That is how `setup --device win-mini` installed the macOS helper on
|
|
74
75
|
* the laptop. The flag is re-inserted immediately after the verb rather than
|
|
75
|
-
* appended, so a verb whose operands are variadic cannot swallow it.
|
|
76
|
+
* appended, so a verb whose operands are variadic cannot swallow it. A `--host`
|
|
77
|
+
* the caller already typed always wins — it is never overwritten (PHNX-4090).
|
|
76
78
|
*
|
|
77
79
|
* Pure, so the re-insertion is testable without spawning the engine.
|
|
78
80
|
*/
|
|
79
|
-
export declare function
|
|
81
|
+
export declare function withHostFlag(argv: string[], host?: string): string[];
|
|
80
82
|
/**
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
* no
|
|
83
|
+
* Resolve `--device <name>` to the `--host <address>` the engine actually
|
|
84
|
+
* speaks (PHNX-4090). A device's `computer.host` config (`agents config set
|
|
85
|
+
* devices.<name>.computer.host <address>`) wins when set — `vnc://`/`tcp://`
|
|
86
|
+
* carries no ssh identity, `ssh://` still resolves one against the fleet. With
|
|
87
|
+
* no `computer.host`, fall back to the fleet's ssh identity exactly as before
|
|
88
|
+
* (Windows-only — the tunnel this repo has always provisioned).
|
|
86
89
|
*/
|
|
87
|
-
export declare function
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
/** Skip recording — lifecycle verbs are not user actions. */
|
|
91
|
-
record?: boolean;
|
|
92
|
-
/** Read the engine's stdout instead of letting it reach the terminal. */
|
|
93
|
-
capture?: boolean;
|
|
94
|
-
}): Promise<{
|
|
95
|
-
exitCode: number;
|
|
96
|
-
stdout: string;
|
|
90
|
+
export declare function resolveDeviceHost(device: string): Promise<{
|
|
91
|
+
host: string;
|
|
92
|
+
target: ComputerTargetContext;
|
|
97
93
|
}>;
|
|
98
94
|
export declare function registerComputerCommand(program: Command): void;
|
|
99
|
-
export declare function registerComputerSubcommands(program: Command): void;
|
|
100
95
|
/**
|
|
101
96
|
* Install the macOS helper through the engine. Used by the `agents setup
|
|
102
97
|
* computer` wizard, which still owns the TCC hand-holding — that is a
|
|
@@ -42,6 +42,9 @@ import { registerCommandGroups, setHelpSections } from '../lib/help.js';
|
|
|
42
42
|
import { loadComputerAllowList, loadDefaultPeers, resolveTcpEndpoint, resolveVncEndpoint, } from '../lib/computer/policy.js';
|
|
43
43
|
import { buildComputerContext } from '../lib/computer/context.js';
|
|
44
44
|
import { recordComputerAction } from '../lib/computer/record.js';
|
|
45
|
+
import { resolveRemoteDevice } from '../lib/ssh-tunnel.js';
|
|
46
|
+
import { getConfigValue } from '../lib/device-config.js';
|
|
47
|
+
import { parseAddress, sshTarget } from '../lib/address.js';
|
|
45
48
|
import { isComputerClientError, resolveComputerBin, runComputer, } from '../lib/computer-client.js';
|
|
46
49
|
import { runComputerSessionsCommand } from './computer-sessions-picker.js';
|
|
47
50
|
// Help groups — mirror `agents browser` so the mental model carries over.
|
|
@@ -99,22 +102,65 @@ export function shouldBlockOffPlatform(opts) {
|
|
|
99
102
|
return true;
|
|
100
103
|
}
|
|
101
104
|
/**
|
|
102
|
-
* Put `--
|
|
105
|
+
* Put `--host <address>` on the argv handed to the engine.
|
|
103
106
|
*
|
|
104
107
|
* commander CONSUMES the `--device` it declares, so a verb that only read
|
|
105
108
|
* `opts.device` forwarded an argv with no remote selector in it and the engine
|
|
106
109
|
* — which selects the remote path from its own argv — ran the invocation
|
|
107
110
|
* LOCALLY. That is how `setup --device win-mini` installed the macOS helper on
|
|
108
111
|
* the laptop. The flag is re-inserted immediately after the verb rather than
|
|
109
|
-
* appended, so a verb whose operands are variadic cannot swallow it.
|
|
112
|
+
* appended, so a verb whose operands are variadic cannot swallow it. A `--host`
|
|
113
|
+
* the caller already typed always wins — it is never overwritten (PHNX-4090).
|
|
110
114
|
*
|
|
111
115
|
* Pure, so the re-insertion is testable without spawning the engine.
|
|
112
116
|
*/
|
|
113
|
-
export function
|
|
114
|
-
if (!
|
|
117
|
+
export function withHostFlag(argv, host) {
|
|
118
|
+
if (!host)
|
|
119
|
+
return argv;
|
|
120
|
+
if (argv.some((arg) => arg === '--host' || arg.startsWith('--host=')))
|
|
115
121
|
return argv;
|
|
116
122
|
const [verb, ...rest] = argv;
|
|
117
|
-
return [verb, '--
|
|
123
|
+
return [verb, '--host', host, ...rest];
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Resolve `--device <name>` to the `--host <address>` the engine actually
|
|
127
|
+
* speaks (PHNX-4090). A device's `computer.host` config (`agents config set
|
|
128
|
+
* devices.<name>.computer.host <address>`) wins when set — `vnc://`/`tcp://`
|
|
129
|
+
* carries no ssh identity, `ssh://` still resolves one against the fleet. With
|
|
130
|
+
* no `computer.host`, fall back to the fleet's ssh identity exactly as before
|
|
131
|
+
* (Windows-only — the tunnel this repo has always provisioned).
|
|
132
|
+
*/
|
|
133
|
+
export async function resolveDeviceHost(device) {
|
|
134
|
+
const configured = getConfigValue('computer.host', { device }).value;
|
|
135
|
+
if (configured) {
|
|
136
|
+
const addr = parseAddress(configured);
|
|
137
|
+
if (addr.scheme === 'vnc' || addr.scheme === 'tcp') {
|
|
138
|
+
// No ssh identity involved — the transport is RFB or a raw helper socket.
|
|
139
|
+
return { host: configured, target: { alias: device, host: addr.host, user: addr.user ?? '', hostname: addr.host, platform: addr.scheme, sshArgs: [] } };
|
|
140
|
+
}
|
|
141
|
+
// The configured address IS the connection target — an ssh:// override
|
|
142
|
+
// naming a different host/user/port than the device registry must actually
|
|
143
|
+
// take effect, not be silently replaced by the registry's own resolution.
|
|
144
|
+
// Only the ssh identity (key file flags) comes from the fleet; the target
|
|
145
|
+
// string forwarded on --host and the one recorded on fd-3 must be the same
|
|
146
|
+
// `sshTarget(addr)` the engine itself derives from that same --host value,
|
|
147
|
+
// or the engine's own context-vs-argv match (`resolveContextDevice`) misses
|
|
148
|
+
// and silently drops the identity args instead of failing loud.
|
|
149
|
+
const resolved = await resolveRemoteDevice(device, {});
|
|
150
|
+
const target = sshTarget(addr);
|
|
151
|
+
return {
|
|
152
|
+
host: configured,
|
|
153
|
+
target: { alias: device, host: target, user: addr.user ?? resolved.user, hostname: addr.host, platform: resolved.device.platform, sshArgs: resolved.identityArgs },
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
const resolved = await resolveRemoteDevice(device, {
|
|
157
|
+
expectPlatform: 'windows',
|
|
158
|
+
forWhat: '`agents computer --device` drives the Windows computer-helper daemon, so it',
|
|
159
|
+
});
|
|
160
|
+
return {
|
|
161
|
+
host: `ssh://${resolved.target}`,
|
|
162
|
+
target: { alias: device, host: resolved.target, user: resolved.user, hostname: resolved.host, platform: resolved.device.platform, sshArgs: resolved.identityArgs },
|
|
163
|
+
};
|
|
118
164
|
}
|
|
119
165
|
/**
|
|
120
166
|
* Forward one invocation to the engine and propagate its exit code.
|
|
@@ -123,7 +169,7 @@ export function withDeviceFlag(argv, device) {
|
|
|
123
169
|
* is the one the engine cannot: it prints the install line and exits 1. There is
|
|
124
170
|
* no fallback engine to reach for — that is the point of the extraction.
|
|
125
171
|
*/
|
|
126
|
-
|
|
172
|
+
async function forwardToComputer(opts) {
|
|
127
173
|
let bin;
|
|
128
174
|
try {
|
|
129
175
|
bin = resolveComputerBin();
|
|
@@ -136,10 +182,19 @@ export async function forwardToComputer(opts) {
|
|
|
136
182
|
throw err;
|
|
137
183
|
}
|
|
138
184
|
const hostFlag = opts.argv.findIndex(arg => arg === '--host' || arg.startsWith('--host='));
|
|
139
|
-
|
|
140
|
-
|
|
185
|
+
let host = hostFlag < 0 ? undefined : (opts.argv[hostFlag].includes('=') ? opts.argv[hostFlag].slice(7) : opts.argv[hostFlag + 1]);
|
|
186
|
+
let target;
|
|
187
|
+
// A device is resolved to --host here rather than forwarded as --device: the
|
|
188
|
+
// engine has no fleet registry of its own (PHNX-4090). An explicit --host on
|
|
189
|
+
// the command line always wins over --device, so this only runs without one.
|
|
190
|
+
if (!host && opts.device) {
|
|
191
|
+
const resolved = await resolveDeviceHost(opts.device);
|
|
192
|
+
host = resolved.host;
|
|
193
|
+
target = resolved.target;
|
|
194
|
+
}
|
|
195
|
+
const context = await buildComputerContext({ device: opts.device, host, target, computerBin: bin });
|
|
141
196
|
return runComputer({
|
|
142
|
-
argv:
|
|
197
|
+
argv: withHostFlag(opts.argv, host),
|
|
143
198
|
context,
|
|
144
199
|
capture: opts.capture,
|
|
145
200
|
onEvent: opts.record === false
|
|
@@ -224,7 +279,7 @@ export function registerComputerCommand(program) {
|
|
|
224
279
|
`,
|
|
225
280
|
});
|
|
226
281
|
}
|
|
227
|
-
|
|
282
|
+
function registerComputerSubcommands(program) {
|
|
228
283
|
registerSetupCommand(program);
|
|
229
284
|
registerStartCommand(program);
|
|
230
285
|
registerStopCommand(program);
|
package/dist/commands/config.js
CHANGED
|
@@ -15,11 +15,11 @@
|
|
|
15
15
|
import chalk from 'chalk';
|
|
16
16
|
import { AGENTS } from '../lib/agents.js';
|
|
17
17
|
import { setHelpSections } from '../lib/help.js';
|
|
18
|
-
import { parseConfigKey, formatAgentVersion, devicePropertyToConfigName, configKeyStorageHint, } from '../lib/config-keys.js';
|
|
18
|
+
import { parseConfigKey, formatConfigKey, formatAgentVersion, devicePropertyToConfigName, configKeyStorageHint, MENUBAR_MENU_PROPERTIES, } from '../lib/config-keys.js';
|
|
19
19
|
import { registerBudgetCommand } from './budget.js';
|
|
20
20
|
import { resolveRunDefaults, setRunDefaultModel, setRunDefaultMode, setRunDefaultEffort, unsetRunDefault, } from '../lib/run-defaults.js';
|
|
21
21
|
import { resolveTierOverride, setTierOverride, clearTierOverride } from '../lib/model-tier-overrides.js';
|
|
22
|
-
import { getConfigValue, setConfigValue, unsetConfigValue, listConfig, } from '../lib/device-config.js';
|
|
22
|
+
import { getConfigValue, setConfigValue, unsetConfigValue, listConfig, configKeySpec, } from '../lib/device-config.js';
|
|
23
23
|
import { readMeta, updateMeta } from '../lib/state.js';
|
|
24
24
|
import { MODEL_TIERS } from '../lib/model-tiers.js';
|
|
25
25
|
import { machineId } from '../lib/machine-id.js';
|
|
@@ -51,6 +51,20 @@ function parseValue(key, parsed, raw) {
|
|
|
51
51
|
return parsed.property === 'enabled' ? parseBool(raw, key) : raw.trim();
|
|
52
52
|
case 'updates':
|
|
53
53
|
return parseBool(raw, key);
|
|
54
|
+
case 'menubar': {
|
|
55
|
+
// The type (and enum validation) live in the device-config spec; parse the
|
|
56
|
+
// raw string to that type here so setConfigValue's assertion passes.
|
|
57
|
+
const spec = configKeySpec(formatConfigKey(parsed));
|
|
58
|
+
if (spec.type === 'bool')
|
|
59
|
+
return parseBool(raw, key);
|
|
60
|
+
if (spec.type === 'int') {
|
|
61
|
+
if (!/^\d+$/.test(raw.trim())) {
|
|
62
|
+
throw new Error(`Config key '${key}' expects an integer, got '${raw}'.`);
|
|
63
|
+
}
|
|
64
|
+
return Number.parseInt(raw.trim(), 10);
|
|
65
|
+
}
|
|
66
|
+
return raw.trim();
|
|
67
|
+
}
|
|
54
68
|
case 'device': {
|
|
55
69
|
const property = parsed.property;
|
|
56
70
|
switch (property) {
|
|
@@ -74,8 +88,11 @@ function parseValue(key, parsed, raw) {
|
|
|
74
88
|
return Number.parseInt(raw.trim(), 10);
|
|
75
89
|
case 'notes':
|
|
76
90
|
return raw.trim();
|
|
91
|
+
case 'formFactor':
|
|
92
|
+
return raw.trim();
|
|
77
93
|
case 'browser.profile':
|
|
78
94
|
case 'browser.viewer':
|
|
95
|
+
case 'computer.host':
|
|
79
96
|
return raw.trim();
|
|
80
97
|
}
|
|
81
98
|
// A device property with no arm above used to fall out of the switch and
|
|
@@ -143,6 +160,10 @@ function setConfig(parsed, value) {
|
|
|
143
160
|
setGlobalAutoUpdateEnabled(value);
|
|
144
161
|
return;
|
|
145
162
|
}
|
|
163
|
+
case 'menubar': {
|
|
164
|
+
setConfigValue(formatConfigKey(parsed), value);
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
146
167
|
case 'device': {
|
|
147
168
|
const configName = devicePropertyToConfigName(parsed.property);
|
|
148
169
|
if (parsed.property === 'notes') {
|
|
@@ -217,6 +238,12 @@ function unsetConfig(parsed) {
|
|
|
217
238
|
unsetGlobalAutoUpdateEnabled();
|
|
218
239
|
return had;
|
|
219
240
|
}
|
|
241
|
+
case 'menubar': {
|
|
242
|
+
const name = formatConfigKey(parsed);
|
|
243
|
+
const had = getConfigValue(name).value !== undefined;
|
|
244
|
+
unsetConfigValue(name);
|
|
245
|
+
return had;
|
|
246
|
+
}
|
|
220
247
|
case 'device': {
|
|
221
248
|
const configName = devicePropertyToConfigName(parsed.property);
|
|
222
249
|
const had = getConfigValue(configName, { device: parsed.device }).value !== undefined;
|
|
@@ -251,6 +278,8 @@ function getConfig(parsed) {
|
|
|
251
278
|
return getConfigValue(`summarizer.${parsed.property}`).value;
|
|
252
279
|
case 'updates':
|
|
253
280
|
return parsed.agent ? rawAgentAutoUpdateSetting(parsed.agent) : rawGlobalAutoUpdateSetting();
|
|
281
|
+
case 'menubar':
|
|
282
|
+
return getConfigValue(formatConfigKey(parsed)).value;
|
|
254
283
|
case 'device': {
|
|
255
284
|
const configName = devicePropertyToConfigName(parsed.property);
|
|
256
285
|
return getConfigValue(configName, { device: parsed.device }).value;
|
|
@@ -345,6 +374,15 @@ function* listCentralConfigEntries() {
|
|
|
345
374
|
yield { key, value, hint: configKeyStorageHint(parseConfigKey(key)) };
|
|
346
375
|
}
|
|
347
376
|
}
|
|
377
|
+
// AGI Menu preferences (PHNX-3999) — user scope, syncs fleet-wide. Only set
|
|
378
|
+
// keys are listed; the native menu falls back to its own defaults for the rest.
|
|
379
|
+
for (const prop of MENUBAR_MENU_PROPERTIES) {
|
|
380
|
+
const key = `menubar.menu.${prop}`;
|
|
381
|
+
const value = getConfigValue(key).value;
|
|
382
|
+
if (value !== undefined) {
|
|
383
|
+
yield { key, value, hint: configKeyStorageHint(parseConfigKey(key)) };
|
|
384
|
+
}
|
|
385
|
+
}
|
|
348
386
|
}
|
|
349
387
|
/** Collect device-scope config entries. */
|
|
350
388
|
function* listDeviceConfigEntries(device) {
|
|
@@ -378,6 +416,9 @@ function* listDeviceConfigEntries(device) {
|
|
|
378
416
|
case 'notes':
|
|
379
417
|
key = `${prefix}notes`;
|
|
380
418
|
break;
|
|
419
|
+
case 'formFactor':
|
|
420
|
+
key = `${prefix}formFactor`;
|
|
421
|
+
break;
|
|
381
422
|
case 'browser.profile':
|
|
382
423
|
// The self device's default browser profile is already surfaced as the
|
|
383
424
|
// top-level `browser.profile` key; skip it here to avoid duplication.
|
|
@@ -391,6 +432,9 @@ function* listDeviceConfigEntries(device) {
|
|
|
391
432
|
continue;
|
|
392
433
|
key = `${prefix}browser.viewer`;
|
|
393
434
|
break;
|
|
435
|
+
case 'computer.host':
|
|
436
|
+
key = `${prefix}computer.host`;
|
|
437
|
+
break;
|
|
394
438
|
default:
|
|
395
439
|
// A `default: continue` here silently drops any device property with no
|
|
396
440
|
// arm — which is how browser.viewer was invisible to `config list` after
|
|
@@ -17,29 +17,6 @@
|
|
|
17
17
|
* duplicating it.
|
|
18
18
|
*/
|
|
19
19
|
import type { Command } from 'commander';
|
|
20
|
-
import { type DaemonServiceId } from '../lib/daemon-services.js';
|
|
21
|
-
/** Parse a `ps -o etime=` value (`[[dd-]hh:]mm:ss`) into elapsed seconds. */
|
|
22
|
-
export declare function parseEtimeToSeconds(raw: string): number | null;
|
|
23
20
|
/** Elapsed wall-clock seconds since `pid` started, or null if unavailable (best-effort, POSIX only). */
|
|
24
21
|
export declare function uptimeSeconds(pid: number): number | null;
|
|
25
|
-
/** One row of the roster every registered daemon service — supervisor-managed or legacy — renders in `agents daemon services`. */
|
|
26
|
-
export interface DaemonServiceRow {
|
|
27
|
-
id: DaemonServiceId;
|
|
28
|
-
title: string;
|
|
29
|
-
description: string;
|
|
30
|
-
enabled: boolean;
|
|
31
|
-
/**
|
|
32
|
-
* `ServiceSupervisor`'s real lifecycle state when `supervised` is true
|
|
33
|
-
* (`idle`/`running`/`parked`/`stopped`, written cross-process via
|
|
34
|
-
* `recordSubsystemState`). A legacy `setInterval`-driven service has no such
|
|
35
|
-
* record, so its state is inferred from `enabled` + whether the daemon
|
|
36
|
-
* process is up — labelled distinctly so a reader can't mistake it for a
|
|
37
|
-
* measured value.
|
|
38
|
-
*/
|
|
39
|
-
state: string;
|
|
40
|
-
supervised: boolean;
|
|
41
|
-
lastRunMs: number | null;
|
|
42
|
-
lastError: string | null;
|
|
43
|
-
consecutiveFailures: number;
|
|
44
|
-
}
|
|
45
22
|
export declare function registerDaemonCommand(program: Command): void;
|
package/dist/commands/daemon.js
CHANGED
|
@@ -254,7 +254,7 @@ function registryScopedDuplicates(processes, ownerPid) {
|
|
|
254
254
|
return processes.filter((p) => registered.has(p.pid));
|
|
255
255
|
}
|
|
256
256
|
/** Parse a `ps -o etime=` value (`[[dd-]hh:]mm:ss`) into elapsed seconds. */
|
|
257
|
-
|
|
257
|
+
function parseEtimeToSeconds(raw) {
|
|
258
258
|
const m = raw.match(/^(?:(\d+)-)?(?:(\d+):)?(\d+):(\d+)$/);
|
|
259
259
|
if (!m)
|
|
260
260
|
return null;
|