@phnx-labs/agents-cli 1.22.38 → 1.22.40
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 +302 -0
- package/README.md +111 -70
- package/dist/bin/agents +0 -0
- package/dist/bootstrap.js +46 -27
- package/dist/browser.js +2 -2
- package/dist/cli/command-registry.d.ts +135 -0
- package/dist/cli/command-registry.js +260 -0
- package/dist/commands/accounts.d.ts +20 -0
- package/dist/commands/accounts.js +186 -25
- package/dist/commands/apply.d.ts +3 -3
- package/dist/commands/apply.js +20 -63
- package/dist/commands/browser.js +206 -94
- package/dist/commands/budget.d.ts +7 -6
- package/dist/commands/budget.js +8 -7
- package/dist/commands/cloud.js +17 -20
- package/dist/commands/commands.js +1 -1
- package/dist/commands/computer-actions.d.ts +1 -35
- package/dist/commands/computer-actions.js +13 -181
- package/dist/commands/computer.d.ts +28 -3
- package/dist/commands/computer.js +93 -65
- package/dist/commands/config.js +47 -4
- package/dist/commands/cost.d.ts +2 -1
- package/dist/commands/cost.js +7 -6
- package/dist/commands/daemon.js +151 -4
- package/dist/commands/detach.js +1 -1
- package/dist/commands/doctor.js +19 -11
- package/dist/commands/events.js +1 -1
- package/dist/commands/exec.d.ts +2 -50
- package/dist/commands/exec.js +161 -216
- package/dist/commands/factory.js +1 -1
- package/dist/commands/feed.d.ts +2 -2
- package/dist/commands/feed.js +9 -12
- package/dist/commands/fleet-capture.js +25 -27
- package/dist/commands/focus.d.ts +2 -3
- package/dist/commands/focus.js +34 -9
- package/dist/commands/go.js +15 -5
- package/dist/commands/harness.d.ts +3 -3
- package/dist/commands/harness.js +53 -5
- package/dist/commands/hooks.js +1 -1
- package/dist/commands/import.js +2 -2
- package/dist/commands/insights.d.ts +5 -5
- package/dist/commands/insights.js +15 -9
- package/dist/commands/inspect.d.ts +2 -3
- package/dist/commands/inspect.js +4 -16
- package/dist/commands/logs.d.ts +2 -2
- package/dist/commands/logs.js +9 -9
- package/dist/commands/mcp.js +2 -2
- package/dist/commands/memory.js +1 -1
- package/dist/commands/message.d.ts +1 -1
- package/dist/commands/message.js +7 -7
- package/dist/commands/mine.d.ts +11 -8
- package/dist/commands/mine.js +11 -10
- package/dist/commands/models.js +1 -1
- package/dist/commands/modes.js +1 -1
- package/dist/commands/monitors.js +23 -6
- package/dist/commands/output.d.ts +7 -6
- package/dist/commands/output.js +11 -10
- package/dist/commands/packages.js +4 -4
- package/dist/commands/perf.js +1 -1
- package/dist/commands/permissions.js +49 -32
- package/dist/commands/plugins.d.ts +1 -1
- package/dist/commands/plugins.js +3 -3
- package/dist/commands/profiles.d.ts +6 -9
- package/dist/commands/profiles.js +8 -321
- package/dist/commands/projects.d.ts +9 -0
- package/dist/commands/projects.js +140 -8
- package/dist/commands/prune.js +5 -13
- package/dist/commands/refresh-rules.js +1 -1
- package/dist/commands/repo.d.ts +5 -7
- package/dist/commands/repo.js +34 -18
- package/dist/commands/resource-view.js +4 -0
- package/dist/commands/resume.d.ts +11 -7
- package/dist/commands/resume.js +82 -98
- package/dist/commands/route.d.ts +12 -0
- package/dist/commands/route.js +261 -0
- package/dist/commands/routines.d.ts +2 -3
- package/dist/commands/routines.js +120 -145
- package/dist/commands/rules.js +1 -1
- package/dist/commands/run-account-picker.d.ts +1 -1
- package/dist/commands/run-account-picker.js +2 -2
- package/dist/commands/run-broadcast.d.ts +21 -0
- package/dist/commands/run-broadcast.js +89 -0
- package/dist/commands/run-cloud.js +1 -1
- package/dist/commands/secrets-vault.d.ts +10 -0
- package/dist/commands/{login.js → secrets-vault.js} +34 -14
- package/dist/commands/secrets.d.ts +4 -4
- package/dist/commands/secrets.js +72 -63
- package/dist/commands/sessions-backfill.js +1 -1
- package/dist/commands/sessions-browser.d.ts +1 -1
- package/dist/commands/sessions-browser.js +9 -5
- package/dist/commands/sessions-export.js +2 -2
- package/dist/commands/sessions-inject.js +4 -5
- package/dist/commands/sessions-migrate.js +16 -27
- package/dist/commands/sessions-picker.d.ts +13 -0
- package/dist/commands/sessions-picker.js +182 -8
- package/dist/commands/sessions-resume.d.ts +7 -3
- package/dist/commands/sessions-resume.js +81 -33
- package/dist/commands/sessions-stats.js +2 -2
- package/dist/commands/sessions.d.ts +75 -68
- package/dist/commands/sessions.js +142 -180
- package/dist/commands/setup-computer.js +1 -1
- package/dist/commands/setup-fleet.js +3 -0
- package/dist/commands/setup-mine.d.ts +7 -3
- package/dist/commands/setup-mine.js +13 -8
- package/dist/commands/setup-secrets.js +2 -2
- package/dist/commands/setup-watchdog.js +2 -2
- package/dist/commands/setup.js +7 -2
- package/dist/commands/share.d.ts +65 -0
- package/dist/commands/share.js +253 -20
- package/dist/commands/skills.js +3 -3
- package/dist/commands/snapshot.d.ts +2 -2
- package/dist/commands/snapshot.js +9 -9
- package/dist/commands/ssh.d.ts +1 -1
- package/dist/commands/ssh.js +318 -48
- package/dist/commands/subagents.js +1 -1
- package/dist/commands/sync.js +24 -9
- package/dist/commands/teams.d.ts +2 -2
- package/dist/commands/teams.js +9 -18
- package/dist/commands/tmux.js +5 -1
- package/dist/commands/trash.js +1 -1
- package/dist/commands/usage.d.ts +1 -1
- package/dist/commands/usage.js +2 -2
- package/dist/commands/utils.d.ts +4 -14
- package/dist/commands/utils.js +6 -27
- package/dist/commands/versions.js +2 -2
- package/dist/commands/view.d.ts +9 -77
- package/dist/commands/view.js +23 -8
- package/dist/commands/watchdog.js +1 -1
- package/dist/commands/webhook.js +11 -25
- package/dist/commands/workflows.js +1 -1
- package/dist/index.js +1 -1
- package/dist/lib/account-capabilities.d.ts +39 -0
- package/dist/lib/account-capabilities.js +59 -0
- package/dist/lib/account-catalog.js +1 -1
- package/dist/lib/account-registry.d.ts +66 -0
- package/dist/lib/account-registry.js +151 -5
- package/dist/lib/{rotate.d.ts → accounting/rotate.d.ts} +4 -4
- package/dist/lib/{rotate.js → accounting/rotate.js} +8 -8
- package/dist/lib/{usage.d.ts → accounting/usage.d.ts} +4 -4
- package/dist/lib/{usage.js → accounting/usage.js} +11 -11
- package/dist/lib/agent-spec/provider.js +1 -1
- package/dist/lib/agents.d.ts +72 -4
- package/dist/lib/agents.js +231 -199
- package/dist/lib/answer-router.d.ts +2 -2
- package/dist/lib/ask-classifier.d.ts +1 -1
- package/dist/lib/ask-classifier.js +1 -1
- package/dist/lib/audit/log.js +1 -1
- package/dist/lib/auth-health.d.ts +1 -1
- package/dist/lib/auth-health.js +2 -2
- package/dist/lib/brand.js +1 -1
- package/dist/lib/browser/caller-identity.d.ts +28 -0
- package/dist/lib/browser/caller-identity.js +156 -0
- package/dist/lib/browser/cdp.js +1 -1
- package/dist/lib/browser/drivers/ssh.d.ts +1 -1
- package/dist/lib/browser/drivers/ssh.js +2 -2
- package/dist/lib/browser/hygiene.d.ts +10 -2
- package/dist/lib/browser/hygiene.js +7 -4
- package/dist/lib/browser/ipc.d.ts +22 -2
- package/dist/lib/browser/ipc.js +185 -21
- package/dist/lib/browser/profiles.d.ts +67 -3
- package/dist/lib/browser/profiles.js +129 -7
- package/dist/lib/browser/remote-control.d.ts +2 -2
- package/dist/lib/browser/remote-control.js +3 -3
- package/dist/lib/browser/runtime-state.d.ts +79 -0
- package/dist/lib/browser/runtime-state.js +119 -1
- package/dist/lib/browser/service.d.ts +113 -1
- package/dist/lib/browser/service.js +454 -40
- package/dist/lib/browser/sessions-list.d.ts +2 -1
- package/dist/lib/browser/sessions-list.js +4 -13
- package/dist/lib/browser/types.d.ts +18 -0
- package/dist/lib/budget/config.js +1 -1
- package/dist/lib/budget/ledger.js +1 -1
- package/dist/lib/byok-usage.js +1 -1
- package/dist/lib/capabilities.js +3 -15
- package/dist/lib/catchup.d.ts +1 -1
- package/dist/lib/catchup.js +1 -1
- package/dist/lib/cloud/dispatch.js +1 -1
- package/dist/lib/cloud/host.d.ts +3 -3
- package/dist/lib/cloud/host.js +5 -5
- package/dist/lib/cloud/rush.d.ts +9 -21
- package/dist/lib/cloud/rush.js +33 -120
- package/dist/lib/cloud/types.d.ts +2 -2
- package/dist/lib/commands.js +3 -13
- package/dist/lib/computer/actions.d.ts +36 -0
- package/dist/lib/computer/actions.js +162 -0
- package/dist/lib/computer/dispatch.d.ts +2 -2
- package/dist/lib/computer/dispatch.js +2 -2
- package/dist/lib/computer/sessions-list.d.ts +3 -3
- package/dist/lib/computer/sessions-list.js +2 -2
- package/dist/lib/config-keys.d.ts +12 -3
- package/dist/lib/config-keys.js +29 -6
- package/dist/lib/config-machine-keys.d.ts +4 -2
- package/dist/lib/config-machine-keys.js +6 -2
- package/dist/lib/crabbox/lease.js +9 -1
- package/dist/lib/crabbox/runtimes.d.ts +32 -7
- package/dist/lib/crabbox/runtimes.js +72 -30
- package/dist/lib/{daemon.d.ts → daemon/daemon.d.ts} +59 -1
- package/dist/lib/{daemon.js → daemon/daemon.js} +237 -49
- package/dist/lib/daemon-services.d.ts +1 -1
- package/dist/lib/daemon-services.js +5 -0
- package/dist/lib/daemon-ticks.d.ts +25 -0
- package/dist/lib/daemon-ticks.js +31 -1
- package/dist/lib/daemon-webhooks.d.ts +102 -0
- package/dist/lib/daemon-webhooks.js +210 -0
- package/dist/lib/device-config.d.ts +116 -72
- package/dist/lib/device-config.js +366 -132
- package/dist/lib/devices/config-migration.d.ts +29 -34
- package/dist/lib/devices/config-migration.js +209 -130
- package/dist/lib/devices/connect.d.ts +2 -2
- package/dist/lib/devices/connect.js +2 -2
- package/dist/lib/devices/discovery-policy.d.ts +30 -0
- package/dist/lib/devices/discovery-policy.js +101 -0
- package/dist/lib/devices/fleet-inventory.js +8 -3
- package/dist/lib/devices/harness-inventory.d.ts +1 -1
- package/dist/lib/devices/harness-inventory.js +12 -3
- package/dist/lib/devices/known-hosts.js +1 -1
- package/dist/lib/devices/pool.d.ts +61 -0
- package/dist/lib/devices/pool.js +83 -0
- package/dist/lib/devices/registry.d.ts +1 -1
- package/dist/lib/devices/registry.js +1 -1
- package/dist/lib/devices/resolve-profile.d.ts +2 -2
- package/dist/lib/devices/resolve-profile.js +2 -2
- package/dist/lib/devices/resolve-target.d.ts +1 -1
- package/dist/lib/devices/resolve-target.js +4 -4
- package/dist/lib/devices/self-host.d.ts +1 -1
- package/dist/lib/devices/self-host.js +3 -3
- package/dist/lib/devices/ssh-config.d.ts +1 -1
- package/dist/lib/devices/stats-cache.js +1 -1
- package/dist/lib/devices/sync.d.ts +3 -1
- package/dist/lib/devices/sync.js +3 -3
- package/dist/lib/doctor-diff.js +4 -4
- package/dist/lib/drift-sync.js +2 -2
- package/dist/lib/drift.js +2 -2
- package/dist/lib/event-families.d.ts +1 -1
- package/dist/lib/event-stream.d.ts +1 -1
- package/dist/lib/event-stream.js +2 -2
- package/dist/lib/events-ingest.js +2 -2
- package/dist/lib/exec.d.ts +8 -5
- package/dist/lib/exec.js +19 -13
- package/dist/lib/factory/snapshot.d.ts +1 -1
- package/dist/lib/factory/snapshot.js +1 -1
- package/dist/lib/{activity.d.ts → feed/activity.d.ts} +1 -1
- package/dist/lib/{activity.js → feed/activity.js} +7 -7
- package/dist/lib/{events.d.ts → feed/events.d.ts} +2 -2
- package/dist/lib/{events.js → feed/events.js} +5 -5
- package/dist/lib/{feed.js → feed/feed.js} +4 -4
- package/dist/lib/feed-outcome.d.ts +1 -1
- package/dist/lib/feed-policy.d.ts +1 -1
- package/dist/lib/feed-policy.js +1 -1
- package/dist/lib/feed-post.d.ts +1 -1
- package/dist/lib/feed-post.js +1 -1
- package/dist/lib/feed-ranking.d.ts +1 -1
- package/dist/lib/fleet/apply.d.ts +0 -6
- package/dist/lib/fleet/apply.js +18 -45
- package/dist/lib/fleet/auth-sync.d.ts +16 -35
- package/dist/lib/fleet/auth-sync.js +16 -75
- package/dist/lib/fleet/capture.js +8 -6
- package/dist/lib/fleet/manifest.js +23 -11
- package/dist/lib/fleet/types.d.ts +19 -7
- package/dist/lib/fleet-cache.d.ts +1 -1
- package/dist/lib/fleet-cache.js +1 -1
- package/dist/lib/format.d.ts +19 -0
- package/dist/lib/format.js +44 -1
- package/dist/lib/friction-heuristics.d.ts +1 -1
- package/dist/lib/git.d.ts +24 -1
- package/dist/lib/git.js +82 -38
- package/dist/lib/heal.js +3 -3
- package/dist/lib/hooks.d.ts +18 -0
- package/dist/lib/hooks.js +113 -1
- package/dist/lib/hosts/credentials.d.ts +30 -10
- package/dist/lib/hosts/credentials.js +38 -26
- package/dist/lib/hosts/dispatch.d.ts +3 -3
- package/dist/lib/hosts/dispatch.js +3 -3
- package/dist/lib/hosts/option.d.ts +3 -3
- package/dist/lib/hosts/option.js +7 -8
- package/dist/lib/hosts/passthrough.d.ts +17 -17
- package/dist/lib/hosts/passthrough.js +67 -50
- package/dist/lib/hosts/providers/devices.d.ts +1 -1
- package/dist/lib/hosts/providers/devices.js +1 -1
- package/dist/lib/hosts/reconcile.d.ts +1 -1
- package/dist/lib/hosts/reconcile.js +1 -1
- package/dist/lib/hosts/reconnect.d.ts +1 -1
- package/dist/lib/hosts/reconnect.js +2 -2
- package/dist/lib/hosts/registry.d.ts +5 -5
- package/dist/lib/hosts/registry.js +5 -5
- package/dist/lib/hosts/remote-cmd.d.ts +10 -10
- package/dist/lib/hosts/remote-cmd.js +25 -18
- package/dist/lib/hosts/remote-os.d.ts +4 -4
- package/dist/lib/hosts/remote-os.js +4 -4
- package/dist/lib/hosts/remote-session-id.d.ts +2 -2
- package/dist/lib/hosts/remote-session-id.js +2 -2
- package/dist/lib/hosts/routing-flag.d.ts +3 -3
- package/dist/lib/hosts/routing-flag.js +4 -5
- package/dist/lib/hosts/run-target.d.ts +4 -4
- package/dist/lib/hosts/run-target.js +4 -4
- package/dist/lib/hosts/session-index.d.ts +2 -2
- package/dist/lib/hosts/session-index.js +1 -1
- package/dist/lib/hosts/session-marker.d.ts +1 -1
- package/dist/lib/hosts/session-marker.js +1 -1
- package/dist/lib/hosts/types.d.ts +2 -2
- package/dist/lib/hosts/types.js +2 -2
- package/dist/lib/import.js +1 -1
- package/dist/lib/{migrate.d.ts → installations/migrate.d.ts} +49 -1
- package/dist/lib/{migrate.js → installations/migrate.js} +265 -38
- package/dist/lib/installations/resolve.js +1 -1
- package/dist/lib/installations/strategies.js +1 -1
- package/dist/lib/installations/update.js +2 -2
- package/dist/lib/{versions.d.ts → installations/versions.d.ts} +12 -3
- package/dist/lib/{versions.js → installations/versions.js} +51 -31
- package/dist/lib/isolation-boundary-report.js +1 -1
- package/dist/lib/linear-projects.d.ts +28 -0
- package/dist/lib/linear-projects.js +30 -0
- package/dist/lib/loop.js +1 -1
- package/dist/lib/mailbox-gc.js +1 -1
- package/dist/lib/mailbox.js +1 -1
- package/dist/lib/mcp-registry.d.ts +62 -0
- package/dist/lib/mcp-registry.js +177 -0
- package/dist/lib/mcp.d.ts +5 -0
- package/dist/lib/mcp.js +124 -307
- package/dist/lib/menubar/MenubarHelper.app/Contents/CodeResources +0 -0
- package/dist/lib/menubar/MenubarHelper.app/Contents/MacOS/MenubarHelper +0 -0
- package/dist/lib/menubar/install-menubar.d.ts +7 -0
- package/dist/lib/menubar/install-menubar.js +24 -6
- package/dist/lib/menubar/snapshot.d.ts +7 -0
- package/dist/lib/menubar/snapshot.js +8 -6
- package/dist/lib/models.js +1 -1
- package/dist/lib/monitors/config.d.ts +12 -0
- package/dist/lib/monitors/config.js +3 -0
- package/dist/lib/monitors/dispatch.js +26 -5
- package/dist/lib/monitors/engine.js +10 -0
- package/dist/lib/monitors/sources/webhook.d.ts +1 -1
- package/dist/lib/monitors/state.d.ts +42 -0
- package/dist/lib/monitors/state.js +30 -0
- package/dist/lib/notify.d.ts +1 -1
- package/dist/lib/observe-aliases.d.ts +2 -2
- package/dist/lib/observe-aliases.js +2 -11
- package/dist/lib/output/git-output.js +2 -2
- package/dist/lib/overdue.d.ts +1 -1
- package/dist/lib/overdue.js +1 -1
- package/dist/lib/permissions-registry.d.ts +65 -0
- package/dist/lib/permissions-registry.js +599 -0
- package/dist/lib/permissions.d.ts +24 -13
- package/dist/lib/permissions.js +52 -271
- package/dist/lib/picker.d.ts +16 -0
- package/dist/lib/picker.js +33 -3
- package/dist/lib/placement.d.ts +1 -1
- package/dist/lib/placement.js +4 -4
- package/dist/lib/platform/paths.d.ts +8 -0
- package/dist/lib/platform/paths.js +11 -0
- package/dist/lib/platform/posixpath.js +3 -3
- package/dist/lib/{plugin-marketplace.d.ts → plugins/plugin-marketplace.d.ts} +1 -1
- package/dist/lib/{plugin-marketplace.js → plugins/plugin-marketplace.js} +2 -2
- package/dist/lib/{plugins.d.ts → plugins/plugins.d.ts} +1 -1
- package/dist/lib/{plugins.js → plugins/plugins.js} +7 -7
- package/dist/lib/{skills.d.ts → plugins/skills.d.ts} +1 -1
- package/dist/lib/{skills.js → plugins/skills.js} +7 -7
- package/dist/lib/pricing/cost.d.ts +1 -1
- package/dist/lib/pricing/cost.js +1 -1
- package/dist/lib/profiles-presets.d.ts +1 -1
- package/dist/lib/profiles-presets.js +1 -1
- package/dist/lib/profiles.js +2 -2
- package/dist/lib/project-import.js +4 -1
- package/dist/lib/project-launch.d.ts +1 -1
- package/dist/lib/project-launch.js +3 -3
- package/dist/lib/project-pull.d.ts +128 -0
- package/dist/lib/project-pull.js +384 -0
- package/dist/lib/project-root.d.ts +2 -2
- package/dist/lib/project-root.js +2 -2
- package/dist/lib/project-status.js +1 -1
- package/dist/lib/projects.d.ts +23 -0
- package/dist/lib/projects.js +29 -6
- package/dist/lib/refresh.d.ts +12 -1
- package/dist/lib/refresh.js +16 -9
- package/dist/lib/registry.d.ts +9 -2
- package/dist/lib/registry.js +11 -4
- package/dist/lib/resources.d.ts +2 -2
- package/dist/lib/resources.js +2 -2
- package/dist/lib/routers.d.ts +81 -0
- package/dist/lib/routers.js +153 -0
- package/dist/lib/routine-context.d.ts +1 -0
- package/dist/lib/routine-context.js +7 -2
- package/dist/lib/routine-notify-owner.d.ts +1 -1
- package/dist/lib/routine-notify.d.ts +1 -1
- package/dist/lib/routine-notify.js +1 -1
- package/dist/lib/routine-process-cleanup.d.ts +1 -1
- package/dist/lib/routine-readiness.d.ts +1 -1
- package/dist/lib/routine-readiness.js +11 -4
- package/dist/lib/routines-placement.d.ts +12 -2
- package/dist/lib/routines-placement.js +20 -3
- package/dist/lib/routines-project.d.ts +1 -1
- package/dist/lib/routines-project.js +1 -1
- package/dist/lib/rules/compile.d.ts +1 -0
- package/dist/lib/rules/compile.js +10 -2
- package/dist/lib/rules/rules.js +1 -1
- package/dist/lib/run-notify.js +1 -1
- package/dist/lib/runner.d.ts +80 -2
- package/dist/lib/runner.js +241 -62
- package/dist/lib/sandbox.d.ts +1 -1
- package/dist/lib/scheduler.d.ts +1 -1
- package/dist/lib/scheduler.js +1 -1
- package/dist/lib/{routines.d.ts → scheduling/routines.d.ts} +54 -9
- package/dist/lib/{routines.js → scheduling/routines.js} +173 -14
- package/dist/lib/secrets/Agents CLI.app/Contents/CodeResources +0 -0
- package/dist/lib/secrets/Agents CLI.app/Contents/MacOS/Agents CLI +0 -0
- package/dist/lib/secrets/agent.js +2 -2
- package/dist/lib/secrets/audit.js +1 -1
- package/dist/lib/secrets/bundles.d.ts +3 -3
- package/dist/lib/secrets/bundles.js +7 -7
- package/dist/lib/secrets/index.js +1 -1
- package/dist/lib/secrets/list-filter.d.ts +1 -1
- package/dist/lib/secrets/list-filter.js +2 -2
- package/dist/lib/secrets/push.d.ts +1 -1
- package/dist/lib/secrets/push.js +10 -12
- package/dist/lib/secrets/remote.d.ts +12 -10
- package/dist/lib/secrets/remote.js +21 -14
- package/dist/lib/secrets/vault.js +2 -2
- package/dist/lib/self-heal/checks/shadowing.js +1 -1
- package/dist/lib/self-heal/checks/shims.js +1 -1
- package/dist/lib/self-update.d.ts +39 -4
- package/dist/lib/self-update.js +78 -25
- package/dist/lib/serve/control.d.ts +1 -1
- package/dist/lib/serve/control.js +4 -4
- package/dist/lib/serve/data.d.ts +1 -1
- package/dist/lib/serve/data.js +1 -1
- package/dist/lib/serve/stream.js +1 -1
- package/dist/lib/service-manifest.d.ts +29 -0
- package/dist/lib/service-manifest.js +80 -0
- package/dist/lib/session/active.d.ts +59 -7
- package/dist/lib/session/active.js +158 -17
- package/dist/lib/session/bash-command.js +1 -1
- package/dist/lib/session/claude-accounts.d.ts +1 -1
- package/dist/lib/session/claude-accounts.js +1 -1
- package/dist/lib/session/db.d.ts +10 -2
- package/dist/lib/session/db.js +25 -6
- package/dist/lib/session/discover.d.ts +77 -0
- package/dist/lib/session/discover.js +130 -25
- package/dist/lib/session/fork.js +1 -1
- package/dist/lib/session/inject.d.ts +1 -1
- package/dist/lib/session/insights.d.ts +1 -1
- package/dist/lib/session/insights.js +1 -1
- package/dist/lib/session/live-metadata.d.ts +15 -0
- package/dist/lib/session/live-metadata.js +76 -0
- package/dist/lib/session/migrate-targets.d.ts +1 -1
- package/dist/lib/session/recovery.d.ts +1 -1
- package/dist/lib/session/recovery.js +2 -2
- package/dist/lib/session/remote-active.d.ts +10 -1
- package/dist/lib/session/remote-active.js +8 -3
- package/dist/lib/session/remote-bundle.d.ts +1 -1
- package/dist/lib/session/remote-bundle.js +2 -2
- package/dist/lib/session/remote-list.d.ts +15 -4
- package/dist/lib/session/remote-list.js +40 -3
- package/dist/lib/session/remote.d.ts +5 -5
- package/dist/lib/session/remote.js +13 -17
- package/dist/lib/session/resume-command.d.ts +3 -2
- package/dist/lib/session/resume-command.js +4 -3
- package/dist/lib/session/resume-owner.d.ts +3 -3
- package/dist/lib/session/resume-owner.js +3 -3
- package/dist/lib/session/session-cache.d.ts +12 -0
- package/dist/lib/session/session-cache.js +2 -0
- package/dist/lib/session/shell-programs.js +1 -1
- package/dist/lib/session/state.js +5 -5
- package/dist/lib/session/team-filter.d.ts +1 -1
- package/dist/lib/session/team-filter.js +1 -1
- package/dist/lib/session/types.d.ts +3 -3
- package/dist/lib/session/width.d.ts +2 -2
- package/dist/lib/session/width.js +2 -2
- package/dist/lib/share/delete.d.ts +21 -0
- package/dist/lib/share/delete.js +42 -0
- package/dist/lib/share/publish.d.ts +82 -0
- package/dist/lib/share/publish.js +170 -18
- package/dist/lib/share/worker-template.js +172 -9
- package/dist/lib/shims.js +35 -7
- package/dist/lib/smart-launch.d.ts +36 -6
- package/dist/lib/smart-launch.js +65 -8
- package/dist/lib/snapshot.d.ts +4 -4
- package/dist/lib/snapshot.js +2 -2
- package/dist/lib/ssh-exec.d.ts +1 -1
- package/dist/lib/ssh-exec.js +2 -2
- package/dist/lib/ssh-tunnel.d.ts +10 -10
- package/dist/lib/ssh-tunnel.js +12 -12
- package/dist/lib/staleness/checkers/hooks.d.ts +1 -1
- package/dist/lib/staleness/checkers/hooks.js +1 -1
- package/dist/lib/staleness/detectors/permissions.js +0 -23
- package/dist/lib/staleness/detectors/plugins.js +1 -1
- package/dist/lib/staleness/fingerprint.js +1 -1
- package/dist/lib/staleness/layers.d.ts +1 -1
- package/dist/lib/staleness/layers.js +1 -1
- package/dist/lib/staleness/writers/mcp.js +3 -1
- package/dist/lib/staleness/writers/plugins.js +1 -1
- package/dist/lib/staleness/writers/types.d.ts +8 -0
- package/dist/lib/startup/command-registry.d.ts +5 -147
- package/dist/lib/startup/command-registry.js +38 -303
- package/dist/lib/startup/dev-build.d.ts +0 -21
- package/dist/lib/startup/dev-build.js +29 -8
- package/dist/lib/state.d.ts +19 -1
- package/dist/lib/state.js +120 -51
- package/dist/lib/subagents.js +1 -1
- package/dist/lib/sync-status.js +1 -1
- package/dist/lib/sync-umbrella.d.ts +6 -1
- package/dist/lib/sync-umbrella.js +9 -4
- package/dist/lib/teams/agents.js +2 -2
- package/dist/lib/teams/registry.js +1 -1
- package/dist/lib/terminal/backends/vscodium-agent.js +1 -1
- package/dist/lib/terminal/engine.js +1 -1
- package/dist/lib/terminal/index.d.ts +4 -0
- package/dist/lib/terminal/index.js +3 -0
- package/dist/lib/terminal/inject.d.ts +2 -2
- package/dist/lib/terminal/inject.js +2 -2
- package/dist/lib/terminal/transport.js +1 -1
- package/dist/lib/tmux/index.d.ts +1 -1
- package/dist/lib/tmux/index.js +1 -1
- package/dist/lib/tmux/session.d.ts +21 -5
- package/dist/lib/tmux/session.js +76 -22
- package/dist/lib/triggers/handlers.d.ts +1 -1
- package/dist/lib/triggers/handlers.js +2 -2
- package/dist/lib/triggers/webhook.d.ts +36 -2
- package/dist/lib/triggers/webhook.js +97 -42
- package/dist/lib/types.d.ts +18 -6
- package/dist/lib/usage-fleet.d.ts +1 -1
- package/dist/lib/usage-fleet.js +1 -1
- package/dist/lib/usage-refresh.d.ts +1 -1
- package/dist/lib/usage-refresh.js +3 -3
- package/dist/lib/version-duplicates.js +2 -2
- package/dist/lib/view-types.d.ts +56 -0
- package/dist/lib/view-types.js +1 -0
- package/dist/lib/watchdog/rotate.d.ts +2 -2
- package/dist/lib/watchdog/rotate.js +3 -3
- package/dist/lib/watchdog/runner.d.ts +2 -3
- package/dist/lib/watchdog/runner.js +3 -4
- package/dist/lib/workflows.js +1 -1
- package/package.json +2 -1
- package/scripts/postinstall.js +2 -2
- package/dist/commands/bench.d.ts +0 -2
- package/dist/commands/bench.js +0 -101
- package/dist/commands/cp.d.ts +0 -84
- package/dist/commands/cp.js +0 -231
- package/dist/commands/login.d.ts +0 -2
- package/dist/lib/resources/commands.d.ts +0 -46
- package/dist/lib/resources/commands.js +0 -211
- package/dist/lib/resources/hooks.d.ts +0 -16
- package/dist/lib/resources/hooks.js +0 -153
- package/dist/lib/resources/mcp.d.ts +0 -34
- package/dist/lib/resources/mcp.js +0 -250
- package/dist/lib/resources/memory.d.ts +0 -15
- package/dist/lib/resources/memory.js +0 -46
- package/dist/lib/resources/permissions.d.ts +0 -13
- package/dist/lib/resources/permissions.js +0 -202
- package/dist/lib/resources/rules.d.ts +0 -46
- package/dist/lib/resources/rules.js +0 -179
- package/dist/lib/resources/skills.d.ts +0 -37
- package/dist/lib/resources/skills.js +0 -247
- package/dist/lib/resources/subagents.d.ts +0 -46
- package/dist/lib/resources/subagents.js +0 -202
- /package/dist/lib/{feed.d.ts → feed/feed.d.ts} +0 -0
package/dist/lib/smart-launch.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Device placement for `--device auto
|
|
2
|
+
* Device placement for `--device auto`.
|
|
3
3
|
*
|
|
4
4
|
* Explicit auto placement probes live fleet health and harness readiness.
|
|
5
5
|
* Historical affinity remains for generic host resolution callers.
|
|
@@ -7,7 +7,8 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { queryAffinityRollup } from './session/db.js';
|
|
9
9
|
import { localMachineId } from './session/origin-machine.js';
|
|
10
|
-
import { loadDevicesSync } from './devices/registry.js';
|
|
10
|
+
import { isControlDevice, loadDevicesSync } from './devices/registry.js';
|
|
11
|
+
import { describeAutoPool, filterAutoPool, isAutoPoolMember } from './devices/pool.js';
|
|
11
12
|
import { normalizeHost } from './machine-id.js';
|
|
12
13
|
import { probePoolSignals } from './teams/placement-probe.js';
|
|
13
14
|
import { pickBestDevice } from './teams/scheduler.js';
|
|
@@ -45,7 +46,23 @@ export function sampleWeighted(candidates, rng = Math.random) {
|
|
|
45
46
|
}
|
|
46
47
|
return candidates[candidates.length - 1].key;
|
|
47
48
|
}
|
|
48
|
-
/**
|
|
49
|
+
/**
|
|
50
|
+
* Online device names from the local registry (+ local), narrowed to the
|
|
51
|
+
* automatic-placement pool.
|
|
52
|
+
*
|
|
53
|
+
* The pool rule lives in `devices/pool.ts` and is an allowlist once any device
|
|
54
|
+
* is marked `role=worker`: this is the single place both automatic-placement
|
|
55
|
+
* paths (`resolveDeviceAuto`, `resolveDeviceAffinity`) get their candidates, so
|
|
56
|
+
* marking workers moves every `--device auto` at once instead of one surface.
|
|
57
|
+
*
|
|
58
|
+
* Paired cockpits (`role: control` in the device registry) are dropped here,
|
|
59
|
+
* where the registry is already being read — they are control surfaces, not
|
|
60
|
+
* compute. It CAN return an empty list — a fleet where every marked worker is
|
|
61
|
+
* offline, or where this box is the only candidate and is marked `personal`. That is a
|
|
62
|
+
* real answer, and both callers fail loud on it rather than falling back to the
|
|
63
|
+
* local machine (which would be the exact box the operator marked personal to
|
|
64
|
+
* keep agents off).
|
|
65
|
+
*/
|
|
49
66
|
export function listOnlineDeviceNames(localName = localMachineId()) {
|
|
50
67
|
const names = new Set([normalizeHost(localName)]);
|
|
51
68
|
try {
|
|
@@ -57,13 +74,27 @@ export function listOnlineDeviceNames(localName = localMachineId()) {
|
|
|
57
74
|
// No tailscale snapshot → treat as candidate (registry-only box).
|
|
58
75
|
if (online === false)
|
|
59
76
|
continue;
|
|
77
|
+
// A paired cockpit (iPhone/iPad) is a control surface, not compute — it
|
|
78
|
+
// is never dialed for a session, so it is never a placement candidate.
|
|
79
|
+
if (isControlDevice(d))
|
|
80
|
+
continue;
|
|
60
81
|
names.add(normalizeHost(name));
|
|
61
82
|
}
|
|
62
83
|
}
|
|
63
84
|
catch {
|
|
64
85
|
/* registry missing — local only */
|
|
65
86
|
}
|
|
66
|
-
return [...names];
|
|
87
|
+
return filterAutoPool([...names]);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* The error both automatic-placement resolvers raise when device roles leave no
|
|
91
|
+
* candidate at all. Fail loud: the alternative — quietly running on the local
|
|
92
|
+
* machine — puts the agent on the box the operator marked `personal`.
|
|
93
|
+
*/
|
|
94
|
+
export function formatEmptyAutoPoolError() {
|
|
95
|
+
const marked = describeAutoPool();
|
|
96
|
+
return (`agents: no device is eligible for automatic placement${marked ? ` (${marked})` : ''} — ` +
|
|
97
|
+
'mark one with `agents devices role <name> worker`, or widen the pool with `agents config set auto.pool all`.');
|
|
67
98
|
}
|
|
68
99
|
export function formatNoHealthyDeviceError(pool, signals, agent) {
|
|
69
100
|
const excluded = pool.map((key) => {
|
|
@@ -78,7 +109,13 @@ export function formatNoHealthyDeviceError(pool, signals, agent) {
|
|
|
78
109
|
return `${key} (${reason})`;
|
|
79
110
|
}).join(', ');
|
|
80
111
|
const target = agent ? `can run ${agent}` : "for 'run auto'";
|
|
81
|
-
|
|
112
|
+
// Name the role narrowing when there is one: a fleet where every box but two
|
|
113
|
+
// is filtered out by a worker mark reads as "the fleet is down" without it.
|
|
114
|
+
// Roster on `pool` so a fleet-wide role default reaches a doc-less device
|
|
115
|
+
// in this error's own candidate set, not just the ones with a doc.
|
|
116
|
+
const marked = describeAutoPool({ roster: pool });
|
|
117
|
+
const poolNote = marked ? ` [pool: ${marked}]` : '';
|
|
118
|
+
return `agents: no healthy device ${target}${poolNote} — excluded: ${excluded}; earliest window resets unknown`;
|
|
82
119
|
}
|
|
83
120
|
/**
|
|
84
121
|
* Pick the least-loaded healthy device that can run `agent` when the harness is
|
|
@@ -90,8 +127,13 @@ export function formatNoHealthyDeviceError(pool, signals, agent) {
|
|
|
90
127
|
export async function resolveDeviceAuto(agent, opts = {}) {
|
|
91
128
|
const local = normalizeHost(opts.localMachine ?? localMachineId());
|
|
92
129
|
const pool = [...new Set((opts.eligibleHosts ?? listOnlineDeviceNames(local)).map(normalizeHost))];
|
|
93
|
-
|
|
130
|
+
// The local machine participates in the same probe as every peer — unless a
|
|
131
|
+
// role excludes it. Adding it unconditionally would put agents back on the box
|
|
132
|
+
// the operator marked `personal` precisely to keep them off it.
|
|
133
|
+
if (!pool.includes(local) && isAutoPoolMember(local))
|
|
94
134
|
pool.push(local);
|
|
135
|
+
if (pool.length === 0)
|
|
136
|
+
throw new Error(formatEmptyAutoPoolError());
|
|
95
137
|
const signals = await (opts.probe ?? probePoolSignals)(pool, agent);
|
|
96
138
|
if (!agent && !opts.probe) {
|
|
97
139
|
const { collectFleetHarnesses } = await import('../commands/ssh.js');
|
|
@@ -135,6 +177,12 @@ export async function resolveDeviceAuto(agent, opts = {}) {
|
|
|
135
177
|
}
|
|
136
178
|
/**
|
|
137
179
|
* Resolve host for `--device auto`. Does NOT pick harness or accounts.
|
|
180
|
+
*
|
|
181
|
+
* Draws from the same automatic-placement pool as {@link resolveDeviceAuto}, so
|
|
182
|
+
* `agents ssh auto`, the generic `--device auto` passthrough, and `matchHost`'s
|
|
183
|
+
* `auto` sentinel honour device roles too. Throws when roles leave the pool
|
|
184
|
+
* empty — a `null` host here means "run locally", which for a box marked
|
|
185
|
+
* `personal` is the outcome the mark exists to prevent.
|
|
138
186
|
*/
|
|
139
187
|
export function resolveDeviceAffinity(opts = {}) {
|
|
140
188
|
const local = normalizeHost(opts.localMachine ?? localMachineId());
|
|
@@ -142,9 +190,18 @@ export function resolveDeviceAffinity(opts = {}) {
|
|
|
142
190
|
const rng = opts.rng ?? Math.random;
|
|
143
191
|
const sinceDays = opts.sinceDays ?? 14;
|
|
144
192
|
const sinceMs = Date.now() - sinceDays * 24 * 60 * 60 * 1000;
|
|
193
|
+
// `listOnlineDeviceNames` always contained the local machine before device
|
|
194
|
+
// roles existed, so an empty default list can only mean roles excluded
|
|
195
|
+
// everything — fail loud, exactly as resolveDeviceAuto does. An explicitly
|
|
196
|
+
// empty `eligibleHosts` is the caller's own list and keeps the historical
|
|
197
|
+
// degrade-to-local behavior.
|
|
198
|
+
const usingDefaultPool = opts.eligibleHosts === undefined;
|
|
145
199
|
const eligible = new Set((opts.eligibleHosts ?? listOnlineDeviceNames(local)).map(normalizeHost));
|
|
146
|
-
if (eligible.size === 0)
|
|
200
|
+
if (eligible.size === 0) {
|
|
201
|
+
if (usingDefaultPool)
|
|
202
|
+
throw new Error(formatEmptyAutoPoolError());
|
|
147
203
|
eligible.add(local);
|
|
204
|
+
}
|
|
148
205
|
const deviceRows = opts.deviceAffinity ??
|
|
149
206
|
queryAffinityRollup({
|
|
150
207
|
groupBy: 'machine',
|
|
@@ -187,7 +244,7 @@ export function isDeviceAuto(value) {
|
|
|
187
244
|
}
|
|
188
245
|
const HOST_SLOTS = ['host', 'device', 'on', 'computer'];
|
|
189
246
|
/**
|
|
190
|
-
* Apply `--device auto`
|
|
247
|
+
* Apply `--device auto` (and deprecated `--smart`) onto run options.
|
|
191
248
|
* Mutates `options` in place. Placement failures propagate without rewriting
|
|
192
249
|
* `auto`, so callers fail loud instead of silently launching locally.
|
|
193
250
|
*/
|
package/dist/lib/snapshot.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `agents snapshot` — one-process fleet consumer snapshot.
|
|
2
|
+
* `agents devices snapshot` — one-process fleet consumer snapshot.
|
|
3
3
|
*
|
|
4
4
|
* Consumers (Factory watchdog, menubar, fleet scripts) used to fork:
|
|
5
5
|
* agents view <agent> --json × N harnesses
|
|
@@ -13,11 +13,11 @@
|
|
|
13
13
|
* Stores are not merged — inventory still comes from view, active rows from
|
|
14
14
|
* sessions, blocks from feed. Only the reader is consolidated.
|
|
15
15
|
*/
|
|
16
|
-
import { type OpenBlock } from './feed.js';
|
|
16
|
+
import { type OpenBlock } from './feed/feed.js';
|
|
17
17
|
import { type FleetAgentCounts } from './fleet-status.js';
|
|
18
18
|
import type { AgentId } from './types.js';
|
|
19
19
|
import type { UnifiedSyncStatus } from './sync-status.js';
|
|
20
|
-
import type { ViewJsonAgent } from '
|
|
20
|
+
import type { ViewJsonAgent } from './view-types.js';
|
|
21
21
|
/** One open-block row in the optional feed summary (no full question bodies). */
|
|
22
22
|
export interface SnapshotFeedBlock {
|
|
23
23
|
blockId: string;
|
|
@@ -44,7 +44,7 @@ export type SnapshotSessionRow = {
|
|
|
44
44
|
[key: string]: unknown;
|
|
45
45
|
};
|
|
46
46
|
/**
|
|
47
|
-
* Stable machine-readable contract for `agents snapshot --json`.
|
|
47
|
+
* Stable machine-readable contract for `agents devices snapshot --json`.
|
|
48
48
|
* Bump `version` only on breaking shape changes.
|
|
49
49
|
*/
|
|
50
50
|
export interface FleetSnapshot {
|
package/dist/lib/snapshot.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `agents snapshot` — one-process fleet consumer snapshot.
|
|
2
|
+
* `agents devices snapshot` — one-process fleet consumer snapshot.
|
|
3
3
|
*
|
|
4
4
|
* Consumers (Factory watchdog, menubar, fleet scripts) used to fork:
|
|
5
5
|
* agents view <agent> --json × N harnesses
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* sessions, blocks from feed. Only the reader is consolidated.
|
|
15
15
|
*/
|
|
16
16
|
import { machineId } from './machine-id.js';
|
|
17
|
-
import { listBlocks } from './feed.js';
|
|
17
|
+
import { listBlocks } from './feed/feed.js';
|
|
18
18
|
import { computeAgentCounts } from './fleet-status.js';
|
|
19
19
|
/** Summarize open blocks for the snapshot feed slice. Pure / unit-testable. */
|
|
20
20
|
export function summarizeFeedBlocks(blocks, limit = 50) {
|
package/dist/lib/ssh-exec.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Shared SSH exec primitive — the single hardened choke point for running a
|
|
3
3
|
* command on a remote host over the system `ssh`.
|
|
4
4
|
*
|
|
5
|
-
* `agents run --
|
|
5
|
+
* `agents run --device` dispatch and the browser driver both go through here so the
|
|
6
6
|
* connection hardening (`BatchMode`, `accept-new`, `ConnectTimeout`) and the
|
|
7
7
|
* target-injection guard live in exactly one place. Target validation is the
|
|
8
8
|
* canonical definition; `commands/secrets.ts` re-exports it.
|
package/dist/lib/ssh-exec.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Shared SSH exec primitive — the single hardened choke point for running a
|
|
3
3
|
* command on a remote host over the system `ssh`.
|
|
4
4
|
*
|
|
5
|
-
* `agents run --
|
|
5
|
+
* `agents run --device` dispatch and the browser driver both go through here so the
|
|
6
6
|
* connection hardening (`BatchMode`, `accept-new`, `ConnectTimeout`) and the
|
|
7
7
|
* target-injection guard live in exactly one place. Target validation is the
|
|
8
8
|
* canonical definition; `commands/secrets.ts` re-exports it.
|
|
@@ -83,7 +83,7 @@ export class RemoteUtf8Accumulator {
|
|
|
83
83
|
* OpenSSH connection-multiplexing options. The first connection to a host opens
|
|
84
84
|
* a control socket; subsequent connections (even from a *separate* `agents`
|
|
85
85
|
* invocation) reuse it, skipping the TCP+auth handshake — so repeated
|
|
86
|
-
* `--
|
|
86
|
+
* `--device <name>` calls to the same box feel local instead of paying ~100-300ms
|
|
87
87
|
* each. `ControlPersist=60s` keeps the master alive briefly after the last
|
|
88
88
|
* client exits. `%C` (a short fixed-length hash of local-host/remote/port/user)
|
|
89
89
|
* keeps the socket path well under macOS's 104-char `sun_path` limit.
|
package/dist/lib/ssh-tunnel.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*
|
|
6
6
|
* 1. `startSSHTunnel` — the generic `ssh -L localPort:127.0.0.1:remotePort -N`
|
|
7
7
|
* spawn, extracted verbatim from the browser CDP driver so both the browser
|
|
8
|
-
* and `agents computer --
|
|
8
|
+
* and `agents computer --device` reach a remote loopback service through one
|
|
9
9
|
* hardened tunnel. Behavior for the browser caller is unchanged (default,
|
|
10
10
|
* foreground, stderr-captured).
|
|
11
11
|
*
|
|
@@ -21,8 +21,8 @@ import { type DeviceProfile } from './devices/registry.js';
|
|
|
21
21
|
export interface StartTunnelOptions {
|
|
22
22
|
/**
|
|
23
23
|
* Detach the tunnel so it OUTLIVES this CLI process. Used by
|
|
24
|
-
* `agents computer start --
|
|
25
|
-
* verb invocations (`apps`, `click`, …) until `stop --
|
|
24
|
+
* `agents computer start --device` — the tunnel must persist across separate
|
|
25
|
+
* verb invocations (`apps`, `click`, …) until `stop --device` tears it down.
|
|
26
26
|
* The browser driver leaves this false: it holds the tunnel for the lifetime
|
|
27
27
|
* of one CDP session and kills it on cleanup.
|
|
28
28
|
*/
|
|
@@ -83,12 +83,12 @@ export declare function sha256File(file: string): Promise<string>;
|
|
|
83
83
|
*/
|
|
84
84
|
export declare function downloadWinHelperExe(version: string): Promise<string>;
|
|
85
85
|
/**
|
|
86
|
-
* Resolve the helper exe for `setup --
|
|
86
|
+
* Resolve the helper exe for `setup --device`: local build outputs first (repo
|
|
87
87
|
* checkout / bundled), then the checksum-verified release-asset download for
|
|
88
88
|
* the running CLI version. Throws with the tag it checked when neither exists.
|
|
89
89
|
*/
|
|
90
90
|
export declare function ensureWinHelperExe(version?: string): Promise<string>;
|
|
91
|
-
/** Persisted per-device tunnel state so verbs can reconnect after `start --
|
|
91
|
+
/** Persisted per-device tunnel state so verbs can reconnect after `start --device`. */
|
|
92
92
|
export interface RemoteTunnelState {
|
|
93
93
|
device: string;
|
|
94
94
|
target: string;
|
|
@@ -106,7 +106,7 @@ export declare function writeRemoteState(state: RemoteTunnelState): void;
|
|
|
106
106
|
export declare function clearRemoteState(device: string): void;
|
|
107
107
|
/**
|
|
108
108
|
* Local file holding the shared-secret token for a device's helper daemon.
|
|
109
|
-
* Written at `setup --
|
|
109
|
+
* Written at `setup --device` (0600), read at `start --device` so the RPC client
|
|
110
110
|
* authenticates. The remote daemon reads the same value from its own
|
|
111
111
|
* `--token-file`; the CLI is the source of truth and never round-trips it back.
|
|
112
112
|
*/
|
|
@@ -154,7 +154,7 @@ export declare function scpRemotePath(remotePath: string): string;
|
|
|
154
154
|
*/
|
|
155
155
|
export declare function buildScpArgs(target: string, remotePath: string, filePath: string, extraSshArgs?: string[]): string[];
|
|
156
156
|
/**
|
|
157
|
-
* `setup --
|
|
157
|
+
* `setup --device`: push the exe, then register + start the LOGON task. Remote
|
|
158
158
|
* PowerShell hops go through `sshExec` (BatchMode key auth — the same hardening
|
|
159
159
|
* the browser driver and `agents ssh` use), and the large exe rides a binary
|
|
160
160
|
* scp transfer. Throws with the remote stderr on any failure.
|
|
@@ -166,13 +166,13 @@ export declare function setupRemoteHelper(name: string): Promise<{
|
|
|
166
166
|
/** Reserve a free local TCP port by binding :0 and reading the assigned port. */
|
|
167
167
|
export declare function pickFreePort(): Promise<number>;
|
|
168
168
|
/**
|
|
169
|
-
* `start --
|
|
169
|
+
* `start --device`: open a detached ssh -L tunnel to the remote daemon, verify it
|
|
170
170
|
* answers over TCP, and persist the tunnel state so verbs can reconnect. Returns
|
|
171
171
|
* the state (and leaves the tunnel running in the background).
|
|
172
172
|
*/
|
|
173
173
|
export declare function startRemoteTunnel(name: string): Promise<RemoteTunnelState>;
|
|
174
174
|
/**
|
|
175
|
-
* `stop --
|
|
175
|
+
* `stop --device`: kill the local tunnel, unregister the remote task (best-effort
|
|
176
176
|
* — the box may be offline), and clear the persisted state.
|
|
177
177
|
*/
|
|
178
178
|
export declare function stopRemoteHelper(name: string): Promise<{
|
|
@@ -182,7 +182,7 @@ export declare function stopRemoteHelper(name: string): Promise<{
|
|
|
182
182
|
/**
|
|
183
183
|
* Point this process's RPC client at a device's live tunnel by setting
|
|
184
184
|
* COMPUTER_HELPER_TCP / COMPUTER_HELPER_TOKEN from persisted state. Called for
|
|
185
|
-
* remote verbs (`apps --
|
|
185
|
+
* remote verbs (`apps --device`, `click --device`, …) so the shared
|
|
186
186
|
* openComputerClient() transparently selects the TcpClient transport — no
|
|
187
187
|
* per-verb wiring. Exits with guidance when there is no active tunnel.
|
|
188
188
|
*/
|
package/dist/lib/ssh-tunnel.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*
|
|
6
6
|
* 1. `startSSHTunnel` — the generic `ssh -L localPort:127.0.0.1:remotePort -N`
|
|
7
7
|
* spawn, extracted verbatim from the browser CDP driver so both the browser
|
|
8
|
-
* and `agents computer --
|
|
8
|
+
* and `agents computer --device` reach a remote loopback service through one
|
|
9
9
|
* hardened tunnel. Behavior for the browser caller is unchanged (default,
|
|
10
10
|
* foreground, stderr-captured).
|
|
11
11
|
*
|
|
@@ -199,7 +199,7 @@ export async function downloadWinHelperExe(version) {
|
|
|
199
199
|
return cached;
|
|
200
200
|
}
|
|
201
201
|
/**
|
|
202
|
-
* Resolve the helper exe for `setup --
|
|
202
|
+
* Resolve the helper exe for `setup --device`: local build outputs first (repo
|
|
203
203
|
* checkout / bundled), then the checksum-verified release-asset download for
|
|
204
204
|
* the running CLI version. Throws with the tag it checked when neither exists.
|
|
205
205
|
*/
|
|
@@ -239,7 +239,7 @@ export function clearRemoteState(device) {
|
|
|
239
239
|
}
|
|
240
240
|
/**
|
|
241
241
|
* Local file holding the shared-secret token for a device's helper daemon.
|
|
242
|
-
* Written at `setup --
|
|
242
|
+
* Written at `setup --device` (0600), read at `start --device` so the RPC client
|
|
243
243
|
* authenticates. The remote daemon reads the same value from its own
|
|
244
244
|
* `--token-file`; the CLI is the source of truth and never round-trips it back.
|
|
245
245
|
*/
|
|
@@ -275,7 +275,7 @@ export async function resolveRemoteDevice(name) {
|
|
|
275
275
|
throw new Error(`Unknown device '${name}'. Register it with \`agents devices add\` / \`agents devices sync\`, then retry.`);
|
|
276
276
|
}
|
|
277
277
|
if (device.platform !== 'windows') {
|
|
278
|
-
throw new Error(`Device '${name}' is ${device.platform}, not windows. \`agents computer --
|
|
278
|
+
throw new Error(`Device '${name}' is ${device.platform}, not windows. \`agents computer --device\` drives the Windows computer-helper daemon.`);
|
|
279
279
|
}
|
|
280
280
|
const target = sshTargetFor(device); // validates address + injection guard
|
|
281
281
|
const host = hostNameFor(device); // sshTargetFor already threw if absent
|
|
@@ -392,7 +392,7 @@ function copyFileOverScp(target, remotePath, filePath, extraSshArgs = [], timeou
|
|
|
392
392
|
});
|
|
393
393
|
}
|
|
394
394
|
/**
|
|
395
|
-
* `setup --
|
|
395
|
+
* `setup --device`: push the exe, then register + start the LOGON task. Remote
|
|
396
396
|
* PowerShell hops go through `sshExec` (BatchMode key auth — the same hardening
|
|
397
397
|
* the browser driver and `agents ssh` use), and the large exe rides a binary
|
|
398
398
|
* scp transfer. Throws with the remote stderr on any failure.
|
|
@@ -441,7 +441,7 @@ export async function setupRemoteHelper(name) {
|
|
|
441
441
|
if (reg.code !== 0) {
|
|
442
442
|
throw new Error(`registering scheduled task on '${name}' failed (exit ${reg.code ?? 'null'}): ${reg.stderr.trim() || reg.stdout.trim()}`);
|
|
443
443
|
}
|
|
444
|
-
// Persist the token locally so `start --
|
|
444
|
+
// Persist the token locally so `start --device` authenticates to the daemon.
|
|
445
445
|
writeHelperToken(name, token);
|
|
446
446
|
return { target, taskName: REMOTE_TASK_NAME };
|
|
447
447
|
}
|
|
@@ -458,7 +458,7 @@ export function pickFreePort() {
|
|
|
458
458
|
});
|
|
459
459
|
}
|
|
460
460
|
/**
|
|
461
|
-
* `start --
|
|
461
|
+
* `start --device`: open a detached ssh -L tunnel to the remote daemon, verify it
|
|
462
462
|
* answers over TCP, and persist the tunnel state so verbs can reconnect. Returns
|
|
463
463
|
* the state (and leaves the tunnel running in the background).
|
|
464
464
|
*/
|
|
@@ -514,8 +514,8 @@ export async function startRemoteTunnel(name) {
|
|
|
514
514
|
}
|
|
515
515
|
catch { /* gone */ }
|
|
516
516
|
const hint = token
|
|
517
|
-
? `Is it installed? Run: agents computer setup --
|
|
518
|
-
: `No auth token on record for '${name}' — re-run: agents computer setup --
|
|
517
|
+
? `Is it installed? Run: agents computer setup --device ${name}`
|
|
518
|
+
: `No auth token on record for '${name}' — re-run: agents computer setup --device ${name}`;
|
|
519
519
|
throw new Error(`tunnel to '${name}' opened but the daemon did not answer (${probeErr}). ${hint}`);
|
|
520
520
|
}
|
|
521
521
|
const state = {
|
|
@@ -532,7 +532,7 @@ export async function startRemoteTunnel(name) {
|
|
|
532
532
|
return state;
|
|
533
533
|
}
|
|
534
534
|
/**
|
|
535
|
-
* `stop --
|
|
535
|
+
* `stop --device`: kill the local tunnel, unregister the remote task (best-effort
|
|
536
536
|
* — the box may be offline), and clear the persisted state.
|
|
537
537
|
*/
|
|
538
538
|
export async function stopRemoteHelper(name) {
|
|
@@ -566,7 +566,7 @@ export async function stopRemoteHelper(name) {
|
|
|
566
566
|
/**
|
|
567
567
|
* Point this process's RPC client at a device's live tunnel by setting
|
|
568
568
|
* COMPUTER_HELPER_TCP / COMPUTER_HELPER_TOKEN from persisted state. Called for
|
|
569
|
-
* remote verbs (`apps --
|
|
569
|
+
* remote verbs (`apps --device`, `click --device`, …) so the shared
|
|
570
570
|
* openComputerClient() transparently selects the TcpClient transport — no
|
|
571
571
|
* per-verb wiring. Exits with guidance when there is no active tunnel.
|
|
572
572
|
*/
|
|
@@ -574,7 +574,7 @@ export function hydrateRemoteEnvFromState(name) {
|
|
|
574
574
|
const state = readRemoteState(name);
|
|
575
575
|
if (!state) {
|
|
576
576
|
console.error(`No active remote tunnel for '${name}'.`);
|
|
577
|
-
console.error(`Run: agents computer start --
|
|
577
|
+
console.error(`Run: agents computer start --device ${name}`);
|
|
578
578
|
process.exit(1);
|
|
579
579
|
}
|
|
580
580
|
process.env.COMPUTER_HELPER_TCP = `127.0.0.1:${state.localPort}`;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Hooks staleness — one executable file per hook. Project layer is EXCLUDED
|
|
3
3
|
* by design: a cloned public repo with `.agents/hooks/foo` must not plant a
|
|
4
4
|
* hook that fires next time the user runs an agent inside it (see
|
|
5
|
-
* `src/lib/versions.ts:1832-1836`). Only user + system + extras count.
|
|
5
|
+
* `src/lib/installations/versions.ts:1832-1836`). Only user + system + extras count.
|
|
6
6
|
*
|
|
7
7
|
* Auxiliary files (README.md, promptcuts.yaml) live in hooks/ but are not
|
|
8
8
|
* hooks — the executable bit on the source distinguishes them. This matches
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Hooks staleness — one executable file per hook. Project layer is EXCLUDED
|
|
3
3
|
* by design: a cloned public repo with `.agents/hooks/foo` must not plant a
|
|
4
4
|
* hook that fires next time the user runs an agent inside it (see
|
|
5
|
-
* `src/lib/versions.ts:1832-1836`). Only user + system + extras count.
|
|
5
|
+
* `src/lib/installations/versions.ts:1832-1836`). Only user + system + extras count.
|
|
6
6
|
*
|
|
7
7
|
* Auxiliary files (README.md, promptcuts.yaml) live in hooks/ but are not
|
|
8
8
|
* hooks — the executable bit on the source distinguishes them. This matches
|
|
@@ -142,28 +142,6 @@ function buildGrokDetector() {
|
|
|
142
142
|
},
|
|
143
143
|
};
|
|
144
144
|
}
|
|
145
|
-
function buildGooseDetector() {
|
|
146
|
-
return {
|
|
147
|
-
kind: 'permissions',
|
|
148
|
-
agent: 'goose',
|
|
149
|
-
list({ versionHome }) {
|
|
150
|
-
const permissionsPath = path.join(versionHome, '.config', 'goose', 'permission.yaml');
|
|
151
|
-
if (!fs.existsSync(permissionsPath))
|
|
152
|
-
return [];
|
|
153
|
-
try {
|
|
154
|
-
const config = yaml.parse(fs.readFileSync(permissionsPath, 'utf-8'));
|
|
155
|
-
const user = config?.user;
|
|
156
|
-
const count = (Array.isArray(user?.always_allow) ? user.always_allow.length : 0) +
|
|
157
|
-
(Array.isArray(user?.ask_before) ? user.ask_before.length : 0) +
|
|
158
|
-
(Array.isArray(user?.never_allow) ? user.never_allow.length : 0);
|
|
159
|
-
if (count > 0)
|
|
160
|
-
return discoverPermissionGroups().map(g => g.name);
|
|
161
|
-
}
|
|
162
|
-
catch { /* parse fail */ }
|
|
163
|
-
return [];
|
|
164
|
-
},
|
|
165
|
-
};
|
|
166
|
-
}
|
|
167
145
|
function buildKimiDetector() {
|
|
168
146
|
return {
|
|
169
147
|
kind: 'permissions',
|
|
@@ -315,7 +293,6 @@ const handlers = {
|
|
|
315
293
|
opencode: buildOpenCodeDetector,
|
|
316
294
|
antigravity: buildAntigravityDetector,
|
|
317
295
|
grok: buildGrokDetector,
|
|
318
|
-
goose: buildGooseDetector,
|
|
319
296
|
kimi: buildKimiDetector,
|
|
320
297
|
cursor: buildCursorDetector,
|
|
321
298
|
droid: buildDroidDetector,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { capableAgents } from '../../capabilities.js';
|
|
2
|
-
import { discoverPlugins, isPluginSynced } from '../../plugins.js';
|
|
2
|
+
import { discoverPlugins, isPluginSynced } from '../../plugins/plugins.js';
|
|
3
3
|
import { lazyAgentMap } from '../writers/lazy-map.js';
|
|
4
4
|
function buildPluginsDetector(agent) {
|
|
5
5
|
return {
|
|
@@ -23,7 +23,7 @@ export function fingerprintFile(filePath) {
|
|
|
23
23
|
/**
|
|
24
24
|
* Names we never fingerprint: OS metadata, VCS bookkeeping, dep caches,
|
|
25
25
|
* build outputs. Matches the SKILL_COPY_IGNORE set used by the sync writer
|
|
26
|
-
* in `src/lib/versions.ts`.
|
|
26
|
+
* in `src/lib/installations/versions.ts`.
|
|
27
27
|
*
|
|
28
28
|
* Important: this is an allowlist of noise, NOT a blanket "skip every
|
|
29
29
|
* dot-prefixed entry". Plugins keep their manifest at
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* - "first-wins" (commands, skills, mcp, subagents, workflows, plugins):
|
|
8
8
|
* project > user > system > extras. Same-named entries shadow.
|
|
9
9
|
* - "first-wins, no project" (hooks): security exclusion — see
|
|
10
|
-
* `src/lib/versions.ts:1832-1836` for the rationale. User > system > extras.
|
|
10
|
+
* `src/lib/installations/versions.ts:1832-1836` for the rationale. User > system > extras.
|
|
11
11
|
* - "merged" (permissions): every layer contributes; first-wins on name.
|
|
12
12
|
* - "composed" (rules): preset + subrules resolved per-name across layers.
|
|
13
13
|
*/
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* - "first-wins" (commands, skills, mcp, subagents, workflows, plugins):
|
|
8
8
|
* project > user > system > extras. Same-named entries shadow.
|
|
9
9
|
* - "first-wins, no project" (hooks): security exclusion — see
|
|
10
|
-
* `src/lib/versions.ts:1832-1836` for the rationale. User > system > extras.
|
|
10
|
+
* `src/lib/installations/versions.ts:1832-1836` for the rationale. User > system > extras.
|
|
11
11
|
* - "merged" (permissions): every layer contributes; first-wins on name.
|
|
12
12
|
* - "composed" (rules): preset + subrules resolved per-name across layers.
|
|
13
13
|
*/
|
|
@@ -7,7 +7,9 @@ function buildMcpWriter(agent) {
|
|
|
7
7
|
agent,
|
|
8
8
|
write({ version, versionHome, selection, cwd }) {
|
|
9
9
|
const r = installMcpServers(agent, version, versionHome, selection, { cwd });
|
|
10
|
-
|
|
10
|
+
// Forward r.errors: dropping them is what let a harness with no config
|
|
11
|
+
// writer report a clean sync while writing nothing (RUSH-2677).
|
|
12
|
+
return { synced: r.applied, ...(r.errors.length ? { errors: r.errors } : {}) };
|
|
11
13
|
},
|
|
12
14
|
};
|
|
13
15
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { capableAgents } from '../../capabilities.js';
|
|
2
|
-
import { discoverPlugins, syncPluginToVersion, pluginSupportsAgent, cleanOrphanedPluginSkills } from '../../plugins.js';
|
|
2
|
+
import { discoverPlugins, syncPluginToVersion, pluginSupportsAgent, cleanOrphanedPluginSkills } from '../../plugins/plugins.js';
|
|
3
3
|
import { lazyAgentMap } from './lazy-map.js';
|
|
4
4
|
function buildPluginsWriter(agent) {
|
|
5
5
|
return {
|
|
@@ -28,6 +28,14 @@ export interface WriteArgs<Sel> {
|
|
|
28
28
|
export interface WriteResult {
|
|
29
29
|
/** Names actually written. Empty array = write produced nothing (not an error). */
|
|
30
30
|
synced: string[];
|
|
31
|
+
/**
|
|
32
|
+
* Per-item failures the writer could not complete, as user-facing sentences.
|
|
33
|
+
*
|
|
34
|
+
* `synced: []` alone cannot distinguish "nothing to do" from "refused to
|
|
35
|
+
* write and said why", which is how an unwritable harness reported success
|
|
36
|
+
* for its whole life (RUSH-2677). A writer that declines MUST say so here.
|
|
37
|
+
*/
|
|
38
|
+
errors?: string[];
|
|
31
39
|
}
|
|
32
40
|
/**
|
|
33
41
|
* Inverse of a write: locate and delete the materialized artifact for one
|