@phnx-labs/agents-cli 1.22.39 → 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 +294 -0
- package/README.md +111 -70
- package/dist/bin/agents +0 -0
- package/dist/bootstrap.js +45 -26
- 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 +16 -3
- 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 +160 -215
- 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 +186 -64
- 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 +2 -1
- package/dist/lib/config-keys.js +8 -4
- package/dist/lib/config-machine-keys.d.ts +4 -2
- package/dist/lib/config-machine-keys.js +5 -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 +85 -75
- package/dist/lib/device-config.js +279 -141
- 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 +10 -5
- package/dist/lib/devices/pool.js +5 -7
- 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 +4 -4
- package/dist/lib/exec.js +11 -11
- 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} +13 -1
- package/dist/lib/{migrate.js → installations/migrate.js} +160 -40
- 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 +4 -4
- package/dist/lib/smart-launch.js +6 -4
- 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
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { formatBytes } from '../format.js';
|
|
2
|
+
export { formatBytes };
|
|
1
3
|
import type { SessionMeta } from '../session/types.js';
|
|
2
4
|
export type ArtifactKind = 'screenshot' | 'pdf' | 'recording' | 'download';
|
|
3
5
|
export interface BrowserArtifact {
|
|
@@ -20,7 +22,6 @@ export declare function listProfileArtifacts(profile: string): BrowserArtifact[]
|
|
|
20
22
|
* when empty); otherwise every profile dir on disk that has at least one capture.
|
|
21
23
|
*/
|
|
22
24
|
export declare function listBrowserSessions(only?: string): ProfileArtifacts[];
|
|
23
|
-
export declare function formatBytes(n: number): string;
|
|
24
25
|
/** Per-kind counts over a flat artifact list — shared by the printed table and
|
|
25
26
|
* the interactive row labels. */
|
|
26
27
|
export declare function countByKind(artifacts: BrowserArtifact[]): Record<ArtifactKind, number>;
|
|
@@ -15,6 +15,9 @@
|
|
|
15
15
|
* `feed-post.ts` `resolvePostIdentity`), never a second parser.
|
|
16
16
|
*/
|
|
17
17
|
import * as fs from 'fs';
|
|
18
|
+
import { formatBytes } from '../format.js';
|
|
19
|
+
// Re-exported for the picker, which lists artifacts from this module's rows.
|
|
20
|
+
export { formatBytes };
|
|
18
21
|
import * as path from 'path';
|
|
19
22
|
import { spawnSync } from 'child_process';
|
|
20
23
|
import { getBrowserRuntimeDir, getProfileRuntimeDir } from './profiles.js';
|
|
@@ -22,7 +25,7 @@ import { formatRelativeTime } from '../session/relative-time.js';
|
|
|
22
25
|
import { getSessionById, listBrowserSessionRecords, pruneToolSessions } from '../session/db.js';
|
|
23
26
|
import { listPidSessionEntries } from '../session/pid-registry.js';
|
|
24
27
|
import { loadHookSessionIndex } from '../session/hook-sessions.js';
|
|
25
|
-
import { readRecentActivity } from '../activity.js';
|
|
28
|
+
import { readRecentActivity } from '../feed/activity.js';
|
|
26
29
|
const EXT_KIND = {
|
|
27
30
|
'.png': 'screenshot',
|
|
28
31
|
'.jpg': 'screenshot',
|
|
@@ -113,18 +116,6 @@ export function listBrowserSessions(only) {
|
|
|
113
116
|
.map((p) => ({ profile: p, artifacts: listProfileArtifacts(p) }))
|
|
114
117
|
.filter((r) => !!only || r.artifacts.length > 0);
|
|
115
118
|
}
|
|
116
|
-
export function formatBytes(n) {
|
|
117
|
-
if (n < 1024)
|
|
118
|
-
return `${n} B`;
|
|
119
|
-
const units = ['KB', 'MB', 'GB'];
|
|
120
|
-
let val = n / 1024;
|
|
121
|
-
let i = 0;
|
|
122
|
-
while (val >= 1024 && i < units.length - 1) {
|
|
123
|
-
val /= 1024;
|
|
124
|
-
i++;
|
|
125
|
-
}
|
|
126
|
-
return `${val < 10 ? val.toFixed(1) : Math.round(val)} ${units[i]}`;
|
|
127
|
-
}
|
|
128
119
|
/** Per-kind counts over a flat artifact list — shared by the printed table and
|
|
129
120
|
* the interactive row labels. */
|
|
130
121
|
export function countByKind(artifacts) {
|
|
@@ -72,7 +72,18 @@ export interface ChromeOptions {
|
|
|
72
72
|
}
|
|
73
73
|
export interface Task {
|
|
74
74
|
id: string;
|
|
75
|
+
/**
|
|
76
|
+
* Unique addressable handle used as the tasks map key, capture-dir name, and
|
|
77
|
+
* the value agents export as `$AGENTS_BROWSER_TASK`. Prefer the short `id`
|
|
78
|
+
* for auto-generated tasks; an explicit `--task` name still wins.
|
|
79
|
+
*/
|
|
75
80
|
name: string;
|
|
81
|
+
/**
|
|
82
|
+
* Human-readable label for `browser status`. Derived once from `--title`,
|
|
83
|
+
* else the first navigated host, else `untitled`. Distinct from `name` so a
|
|
84
|
+
* short machine id can stay addressable while status stays readable.
|
|
85
|
+
*/
|
|
86
|
+
label?: string;
|
|
76
87
|
profile: string;
|
|
77
88
|
tabs: Record<string, string>;
|
|
78
89
|
currentTabId?: string;
|
|
@@ -142,6 +153,8 @@ export interface ProfileStatus {
|
|
|
142
153
|
export interface TaskStatus {
|
|
143
154
|
id: string;
|
|
144
155
|
name: string;
|
|
156
|
+
/** Human label for status tables; falls back to name when absent. */
|
|
157
|
+
label?: string;
|
|
145
158
|
tabCount: number;
|
|
146
159
|
currentTabId?: string;
|
|
147
160
|
createdAt: number;
|
|
@@ -232,6 +245,11 @@ export interface IPCRequest {
|
|
|
232
245
|
until?: string;
|
|
233
246
|
appLevel?: string;
|
|
234
247
|
skipDomainSkill?: boolean;
|
|
248
|
+
/**
|
|
249
|
+
* Explicit human label for a new task (`agents browser start --title …`).
|
|
250
|
+
* When omitted, the label is derived from the first navigated host.
|
|
251
|
+
*/
|
|
252
|
+
title?: string;
|
|
235
253
|
/**
|
|
236
254
|
* Browser start: always open a new tab. Without it, `start --url` reclaims a
|
|
237
255
|
* tab that an ABANDONED task is still holding on this exact URL rather than
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* `per_day`/`per_project`/`per_agent` rather than wiping them.
|
|
9
9
|
*
|
|
10
10
|
* This is the single resolver the pre-flight gate, the live watcher, and the
|
|
11
|
-
* `agents budget` command all route through, so the effective cap set is
|
|
11
|
+
* `agents config budget` command all route through, so the effective cap set is
|
|
12
12
|
* computed in exactly one place.
|
|
13
13
|
*/
|
|
14
14
|
import * as fs from 'fs';
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Every dispatched run that produces token usage records one JSONL line under
|
|
5
5
|
* `<history>/spend/ledger.jsonl`. The ledger is the shared artifact #323's
|
|
6
|
-
* `agents cost` can later read for $ rollups, so the entry shape stays clean
|
|
6
|
+
* `agents insights cost` can later read for $ rollups, so the entry shape stays clean
|
|
7
7
|
* and stable: one record = one usage observation attributed to a run.
|
|
8
8
|
*
|
|
9
9
|
* `costUsd` is computed at write time via the canonical pricing module
|
package/dist/lib/byok-usage.js
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* API rather than the CLI's own usage tracking.
|
|
9
9
|
*/
|
|
10
10
|
import { hasKeychainToken, getKeychainToken } from './secrets/profiles.js';
|
|
11
|
-
import { renderBar, getUsageColor } from './usage.js';
|
|
11
|
+
import { renderBar, getUsageColor } from './accounting/usage.js';
|
|
12
12
|
import * as fs from 'node:fs';
|
|
13
13
|
import * as path from 'node:path';
|
|
14
14
|
import { createHash } from 'node:crypto';
|
package/dist/lib/capabilities.js
CHANGED
|
@@ -8,21 +8,9 @@
|
|
|
8
8
|
* reason instead of silently corrupting an older binary's settings file.
|
|
9
9
|
*/
|
|
10
10
|
import { AGENTS, MANAGED_AGENT_IDS } from './agents.js';
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
*/
|
|
15
|
-
function compareVersions(a, b) {
|
|
16
|
-
const aParts = a.split('.').map((n) => parseInt(n, 10) || 0);
|
|
17
|
-
const bParts = b.split('.').map((n) => parseInt(n, 10) || 0);
|
|
18
|
-
for (let i = 0; i < Math.max(aParts.length, bParts.length); i++) {
|
|
19
|
-
const aVal = aParts[i] || 0;
|
|
20
|
-
const bVal = bParts[i] || 0;
|
|
21
|
-
if (aVal !== bVal)
|
|
22
|
-
return aVal - bVal;
|
|
23
|
-
}
|
|
24
|
-
return 0;
|
|
25
|
-
}
|
|
11
|
+
// agent-spec/primitives is a leaf module — importing it creates no cycle, and it
|
|
12
|
+
// is the only compareVersions that honors OpenClaw's `-N` rebuild suffix.
|
|
13
|
+
import { compareVersions } from './agent-spec/primitives.js';
|
|
26
14
|
function getCapability(agent, cap) {
|
|
27
15
|
// Guard against unknown agent ids (e.g. a caller passing "claude@2.1.168"
|
|
28
16
|
// instead of "claude"). Without this, AGENTS[agent] is undefined and the
|
package/dist/lib/catchup.d.ts
CHANGED
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
* human running `agents routines catchup` — which neither an in-process flag
|
|
35
35
|
* nor `withFileLock` (synchronous; this pass awaits a spawn) can cover.
|
|
36
36
|
*/
|
|
37
|
-
import { type JobConfig, type RunMeta } from './routines.js';
|
|
37
|
+
import { type JobConfig, type RunMeta } from './scheduling/routines.js';
|
|
38
38
|
import { type OverdueJob } from './overdue.js';
|
|
39
39
|
/** What happened to one overdue routine on a catch-up pass. */
|
|
40
40
|
export interface CatchupOutcome {
|
package/dist/lib/catchup.js
CHANGED
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
*/
|
|
37
37
|
import * as fs from 'fs';
|
|
38
38
|
import * as path from 'path';
|
|
39
|
-
import { readJob, writeRunMeta, getRunDir, } from './routines.js';
|
|
39
|
+
import { readJob, writeRunMeta, getRunDir, } from './scheduling/routines.js';
|
|
40
40
|
import { detectOverdueJobs } from './overdue.js';
|
|
41
41
|
import { executeJobDetached } from './runner.js';
|
|
42
42
|
/**
|
|
@@ -15,7 +15,7 @@ import { die } from '../format.js';
|
|
|
15
15
|
import { insertTask, updateTaskStatus } from './store.js';
|
|
16
16
|
import { renderStream } from './stream.js';
|
|
17
17
|
import { MissingTargetError, MAX_IMAGES_PER_DISPATCH } from './types.js';
|
|
18
|
-
import { emit } from '../events.js';
|
|
18
|
+
import { emit } from '../feed/events.js';
|
|
19
19
|
import { shareRuntimeEnv } from '../share/config.js';
|
|
20
20
|
/** Map a supported image file extension to its wire mimeType. Rejects anything else. */
|
|
21
21
|
function imageMimeFromPath(file) {
|
package/dist/lib/cloud/host.d.ts
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Host cloud provider — your own machines as a task-execution backend.
|
|
3
3
|
*
|
|
4
4
|
* A thin adapter over the hosts subsystem (lib/hosts/*): `agents cloud run
|
|
5
|
-
* --provider host --
|
|
6
|
-
* launch as `agents run --
|
|
5
|
+
* --provider host --device <name>` dispatches through the SAME detached-SSH
|
|
6
|
+
* launch as `agents run --device`, and the resulting task shows up in BOTH
|
|
7
7
|
* `agents cloud ps` and `agents devices ps` — one store (the host-task sidecars
|
|
8
8
|
* under ~/.agents/.cache/hosts/), two views. No new transport, no relay: SSH
|
|
9
9
|
* is the only wire, exactly like the rest of the hosts design (docs/hosts.md).
|
|
@@ -43,7 +43,7 @@ export declare class HostCloudProvider implements CloudProvider {
|
|
|
43
43
|
*/
|
|
44
44
|
private reconcileMemoized;
|
|
45
45
|
/**
|
|
46
|
-
* Offset-tail the remote log (the same one-round-trip fetch the `run --
|
|
46
|
+
* Offset-tail the remote log (the same one-round-trip fetch the `run --device`
|
|
47
47
|
* follow uses) and yield it as `text` events until the `.exit` file lands.
|
|
48
48
|
*/
|
|
49
49
|
stream(taskId: string): AsyncIterable<CloudEvent>;
|
package/dist/lib/cloud/host.js
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Host cloud provider — your own machines as a task-execution backend.
|
|
3
3
|
*
|
|
4
4
|
* A thin adapter over the hosts subsystem (lib/hosts/*): `agents cloud run
|
|
5
|
-
* --provider host --
|
|
6
|
-
* launch as `agents run --
|
|
5
|
+
* --provider host --device <name>` dispatches through the SAME detached-SSH
|
|
6
|
+
* launch as `agents run --device`, and the resulting task shows up in BOTH
|
|
7
7
|
* `agents cloud ps` and `agents devices ps` — one store (the host-task sidecars
|
|
8
8
|
* under ~/.agents/.cache/hosts/), two views. No new transport, no relay: SSH
|
|
9
9
|
* is the only wire, exactly like the rest of the hosts design (docs/hosts.md).
|
|
@@ -77,7 +77,7 @@ export class HostCloudProvider {
|
|
|
77
77
|
async dispatch(options) {
|
|
78
78
|
const hostName = options.providerOptions?.host;
|
|
79
79
|
if (!hostName) {
|
|
80
|
-
throw new MissingTargetError('host', 'No host given. Pass --
|
|
80
|
+
throw new MissingTargetError('host', 'No host given. Pass --device <name> (a registered host, a device, a capability tag, or user@host).', 'List your machines: agents devices list · register more: agents devices sync');
|
|
81
81
|
}
|
|
82
82
|
if (resolveDispatchRepos(options).length > 0) {
|
|
83
83
|
throw new Error('--repo has no meaning for --provider host — the run executes in a directory on the machine, not a cloned repo. ' +
|
|
@@ -131,7 +131,7 @@ export class HostCloudProvider {
|
|
|
131
131
|
return updateTask(task.id, terminalPatch(st.code)) ?? task;
|
|
132
132
|
}
|
|
133
133
|
/**
|
|
134
|
-
* Offset-tail the remote log (the same one-round-trip fetch the `run --
|
|
134
|
+
* Offset-tail the remote log (the same one-round-trip fetch the `run --device`
|
|
135
135
|
* follow uses) and yield it as `text` events until the `.exit` file lands.
|
|
136
136
|
*/
|
|
137
137
|
async *stream(taskId) {
|
|
@@ -193,7 +193,7 @@ export class HostCloudProvider {
|
|
|
193
193
|
throw new Error(`Unknown host task: ${taskId}`);
|
|
194
194
|
if (!task.sessionId) {
|
|
195
195
|
throw new Error(`Host task ${taskId} has no session id to resume (only Claude runs capture one). ` +
|
|
196
|
-
`Start a follow-up run instead: agents run ${task.agent} "<prompt>" --
|
|
196
|
+
`Start a follow-up run instead: agents run ${task.agent} "<prompt>" --device ${task.host}`);
|
|
197
197
|
}
|
|
198
198
|
const host = await resolveHostRunTarget(task.host);
|
|
199
199
|
await dispatchPromptToHost(host, {
|
package/dist/lib/cloud/rush.d.ts
CHANGED
|
@@ -5,30 +5,26 @@
|
|
|
5
5
|
* Requires the Rush GitHub App installed on the target repo.
|
|
6
6
|
*/
|
|
7
7
|
import type { CloudProvider, CloudTask, CloudTaskStatus, CloudEvent, DispatchOptions, ProviderCapabilities, ImageAttachment, SkillRef } from './types.js';
|
|
8
|
-
export declare const RUSH_CONSENT_PATH: string;
|
|
9
|
-
export declare function hasRushUploadConsent(accountFingerprint: string, opts?: DispatchOptions, consentPath?: string): boolean;
|
|
10
8
|
/** One version's entry in the account manifest sent on every dispatch. */
|
|
11
9
|
export interface AccountManifestEntry {
|
|
12
10
|
version: string;
|
|
13
11
|
email: string;
|
|
14
|
-
cred_fp: string;
|
|
15
12
|
}
|
|
16
13
|
/**
|
|
17
|
-
* Manifest of the user's local Claude accounts
|
|
18
|
-
*
|
|
19
|
-
* to
|
|
20
|
-
*
|
|
14
|
+
* Manifest of the user's local Claude accounts (version + account email only).
|
|
15
|
+
* Sent on a non-balanced dispatch so the server knows which accounts exist and
|
|
16
|
+
* can route to one. It carries **no credential material** and does NOT read the
|
|
17
|
+
* native OAuth login (RUSH-2527 / SING-1b): agents-cli never reads a harness's
|
|
18
|
+
* interactive login to build this. When the server asks for the underlying token
|
|
19
|
+
* (a new account, or a rotation it can't otherwise resolve), the client does NOT
|
|
20
|
+
* upload it — there is no consented path to copy a native OAuth login to the
|
|
21
|
+
* cloud. Dispatch fails loud and steers to a portable provider account instead
|
|
22
|
+
* (see the 401 handler in `dispatch()`).
|
|
21
23
|
*/
|
|
22
24
|
export interface AccountManifest {
|
|
23
25
|
fp: string;
|
|
24
26
|
versions: AccountManifestEntry[];
|
|
25
27
|
}
|
|
26
|
-
/** Token blob uploaded on retry when the server detects drift. */
|
|
27
|
-
export interface AccountTokenEntry {
|
|
28
|
-
version: string;
|
|
29
|
-
/** Stringified OAuth credentials JSON (Mac: keychain blob; Linux: .credentials.json). */
|
|
30
|
-
credentials_json: string;
|
|
31
|
-
}
|
|
32
28
|
/**
|
|
33
29
|
* Read the raw OAuth credentials for one Claude version. On Mac, prefer the
|
|
34
30
|
* Keychain blob (canonical). On Linux/CI, fall back to `.claude/.credentials.json`
|
|
@@ -53,13 +49,6 @@ export declare function readClaudeCredentialsBlob(home: string): Promise<string
|
|
|
53
49
|
* to the platform-wide key, current behavior).
|
|
54
50
|
*/
|
|
55
51
|
export declare function buildAccountManifest(strategy?: string): Promise<AccountManifest | null>;
|
|
56
|
-
/**
|
|
57
|
-
* Re-load OAuth blobs for the given versions so they can be uploaded to the
|
|
58
|
-
* server on a retry. Only the versions named in the manifest are loaded — we
|
|
59
|
-
* never upload tokens for versions the server hasn't asked about.
|
|
60
|
-
*/
|
|
61
|
-
export declare function buildAccountTokensPayload(versions: string[]): Promise<AccountTokenEntry[]>;
|
|
62
|
-
export declare function accountTokensFingerprint(tokens: AccountTokenEntry[]): string;
|
|
63
52
|
/**
|
|
64
53
|
* Build the POST body for /api/v1/cloud-runs. Exported so tests can verify
|
|
65
54
|
* the back-compat shape (singular fields + repos[]) without needing real
|
|
@@ -77,7 +66,6 @@ export declare function buildDispatchBody(input: {
|
|
|
77
66
|
repo_name: string;
|
|
78
67
|
}>;
|
|
79
68
|
accountManifest?: AccountManifest | null;
|
|
80
|
-
accountTokens?: AccountTokenEntry[] | null;
|
|
81
69
|
/**
|
|
82
70
|
* Skill ride-alongs so the cloud pod isn't context-blind. Forwarded verbatim
|
|
83
71
|
* as `skills` so the Factory Floor can mount them by id/version before the
|
package/dist/lib/cloud/rush.js
CHANGED
|
@@ -9,53 +9,14 @@ import * as path from 'path';
|
|
|
9
9
|
import * as os from 'os';
|
|
10
10
|
import * as crypto from 'crypto';
|
|
11
11
|
import * as yaml from 'yaml';
|
|
12
|
-
import { getCloudDir } from '../state.js';
|
|
13
12
|
import { resolveDispatchRepos, normalizeProviderStatus, MAX_IMAGES_PER_DISPATCH } from './types.js';
|
|
14
13
|
import { parseSSE } from './stream.js';
|
|
15
|
-
import { listInstalledVersions, getVersionHomePath } from '../versions.js';
|
|
14
|
+
import { listInstalledVersions, getVersionHomePath } from '../installations/versions.js';
|
|
16
15
|
import { getAccountInfo } from '../agents.js';
|
|
17
|
-
import { loadClaudeOauth } from '../usage.js';
|
|
18
|
-
import { selectBalancedVersion } from '../rotate.js';
|
|
16
|
+
import { loadClaudeOauth } from '../accounting/usage.js';
|
|
17
|
+
import { selectBalancedVersion } from '../accounting/rotate.js';
|
|
19
18
|
const PROXY_BASE = process.env.RUSH_PROXY_BASE ?? 'https://api.prix.dev';
|
|
20
|
-
const PROXY_HOST = new URL(PROXY_BASE).host;
|
|
21
19
|
const USER_YAML = path.join(os.homedir(), '.rush', 'user.yaml');
|
|
22
|
-
// Persistent consent record for uploading Claude OAuth blobs to Rush Cloud.
|
|
23
|
-
// Created on first explicit consent (env var or flag); subsequent dispatches
|
|
24
|
-
// see it and proceed without re-prompting.
|
|
25
|
-
export const RUSH_CONSENT_PATH = path.join(getCloudDir(), 'rush-consent.json');
|
|
26
|
-
const RUSH_CONSENT_ENV = 'AGENTS_RUSH_UPLOAD_TOKENS';
|
|
27
|
-
export function hasRushUploadConsent(accountFingerprint, opts, consentPath = RUSH_CONSENT_PATH) {
|
|
28
|
-
if (process.env[RUSH_CONSENT_ENV] === '1')
|
|
29
|
-
return true;
|
|
30
|
-
const po = opts?.providerOptions;
|
|
31
|
-
if (po?.uploadAccountTokens === true)
|
|
32
|
-
return true;
|
|
33
|
-
try {
|
|
34
|
-
if (!fs.existsSync(consentPath))
|
|
35
|
-
return false;
|
|
36
|
-
const body = JSON.parse(fs.readFileSync(consentPath, 'utf-8'));
|
|
37
|
-
return body.host === PROXY_HOST && body.account_fingerprint === accountFingerprint;
|
|
38
|
-
}
|
|
39
|
-
catch {
|
|
40
|
-
return false;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
function recordRushUploadConsent(grantedBy, accountFingerprint) {
|
|
44
|
-
try {
|
|
45
|
-
fs.mkdirSync(path.dirname(RUSH_CONSENT_PATH), { recursive: true });
|
|
46
|
-
const body = {
|
|
47
|
-
granted_at: new Date().toISOString(),
|
|
48
|
-
granted_by: grantedBy,
|
|
49
|
-
host: PROXY_HOST,
|
|
50
|
-
account_fingerprint: accountFingerprint,
|
|
51
|
-
};
|
|
52
|
-
fs.writeFileSync(RUSH_CONSENT_PATH, JSON.stringify(body, null, 2), { mode: 0o600 });
|
|
53
|
-
}
|
|
54
|
-
catch {
|
|
55
|
-
// Non-fatal: consent persistence is a UX optimization, not a security
|
|
56
|
-
// boundary. Worst case, the user is asked to consent again next dispatch.
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
20
|
/** Read the Rush session access token from ~/.rush/user.yaml. */
|
|
60
21
|
function readToken() {
|
|
61
22
|
if (!fs.existsSync(USER_YAML)) {
|
|
@@ -217,40 +178,24 @@ export async function buildAccountManifest(strategy) {
|
|
|
217
178
|
}));
|
|
218
179
|
candidateVersions = rows.filter((r) => r !== null);
|
|
219
180
|
}
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
181
|
+
// RUSH-2527 / SING-1b: do NOT read the native OAuth login to fingerprint it.
|
|
182
|
+
// The manifest carries version + account email only — enough for the server to
|
|
183
|
+
// route to an account. If the server needs the token itself, the client does NOT
|
|
184
|
+
// upload it (there is no consented path to copy a native OAuth login to the
|
|
185
|
+
// cloud); dispatch fails loud and steers to a portable provider account.
|
|
186
|
+
const entries = candidateVersions
|
|
187
|
+
.map(({ version, email }) => ({ version, email }))
|
|
188
|
+
.sort((a, b) => a.version.localeCompare(b.version));
|
|
228
189
|
if (entries.length === 0)
|
|
229
190
|
return null;
|
|
230
|
-
entries.sort((a, b) => a.version.localeCompare(b.version));
|
|
231
191
|
const fp = sha256(JSON.stringify(entries));
|
|
232
192
|
return { fp, versions: entries };
|
|
233
193
|
}
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
export async function buildAccountTokensPayload(versions) {
|
|
240
|
-
const out = [];
|
|
241
|
-
for (const version of versions) {
|
|
242
|
-
const home = getVersionHomePath('claude', version);
|
|
243
|
-
const blob = await readClaudeCredentialsBlob(home);
|
|
244
|
-
if (!blob)
|
|
245
|
-
continue;
|
|
246
|
-
out.push({ version, credentials_json: blob });
|
|
247
|
-
}
|
|
248
|
-
return out;
|
|
249
|
-
}
|
|
250
|
-
export function accountTokensFingerprint(tokens) {
|
|
251
|
-
const canonical = [...tokens].sort((a, b) => a.version.localeCompare(b.version));
|
|
252
|
-
return sha256(JSON.stringify(canonical));
|
|
253
|
-
}
|
|
194
|
+
// buildAccountTokensPayload / accountTokensFingerprint (which read every installed
|
|
195
|
+
// Claude version's native OAuth token to upload it to the cloud) were REMOVED —
|
|
196
|
+
// SING-1b forbids reading or transferring a native OAuth / session login, even
|
|
197
|
+
// with consent. Cloud dispatch under a native login now fails loud and steers to a
|
|
198
|
+
// portable provider account (see the 401 handler in dispatch()).
|
|
254
199
|
/**
|
|
255
200
|
* Build the POST body for /api/v1/cloud-runs. Exported so tests can verify
|
|
256
201
|
* the back-compat shape (singular fields + repos[]) without needing real
|
|
@@ -277,9 +222,6 @@ export function buildDispatchBody(input) {
|
|
|
277
222
|
if (input.accountManifest) {
|
|
278
223
|
body.account_manifest = input.accountManifest;
|
|
279
224
|
}
|
|
280
|
-
if (input.accountTokens && input.accountTokens.length > 0) {
|
|
281
|
-
body.account_tokens = input.accountTokens;
|
|
282
|
-
}
|
|
283
225
|
if (input.skills && input.skills.length > 0) {
|
|
284
226
|
body.skills = input.skills;
|
|
285
227
|
}
|
|
@@ -364,56 +306,27 @@ export class RushCloudProvider {
|
|
|
364
306
|
env: options.env,
|
|
365
307
|
});
|
|
366
308
|
let res = await api('POST', '/api/v1/cloud-runs', token, body);
|
|
367
|
-
//
|
|
368
|
-
//
|
|
369
|
-
//
|
|
309
|
+
// The server asks the client to upload the underlying Claude OAuth token when
|
|
310
|
+
// it detects a new account or a rotation (401 + prompt_code). agents-cli NEVER
|
|
311
|
+
// reads or transfers a native OAuth / session login off this machine — not
|
|
312
|
+
// even with consent (SING-1b): a rotating token copied to the cloud is
|
|
313
|
+
// invalidated on its next refresh and logs the fleet out. Fail loud and steer
|
|
314
|
+
// to a portable provider account instead of exfiltrating the login.
|
|
370
315
|
if (res.status === 401 && accountManifest) {
|
|
371
316
|
const errBody = await res.clone().text();
|
|
372
317
|
const promptCode = parsePromptCode(errBody);
|
|
373
318
|
if (promptCode === 'NEW_ACCOUNT' || promptCode === 'TOKEN_ROTATED') {
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
``,
|
|
386
|
-
`To consent, re-run with one of:`,
|
|
387
|
-
` AGENTS_RUSH_UPLOAD_TOKENS=1 agents cloud run ...`,
|
|
388
|
-
` agents cloud run --upload-account-tokens ...`,
|
|
389
|
-
``,
|
|
390
|
-
`Consent will be recorded at ${RUSH_CONSENT_PATH} so you won't be asked again.`,
|
|
391
|
-
`Remove that file to revoke.`,
|
|
392
|
-
].join('\n'));
|
|
393
|
-
}
|
|
394
|
-
// Always-on stderr notice (no isTTY gate). Scripts and CI need to see
|
|
395
|
-
// this in their captured stderr / logs.
|
|
396
|
-
const grantedBy = process.env[RUSH_CONSENT_ENV] === '1' ? 'env'
|
|
397
|
-
: options.providerOptions?.uploadAccountTokens === true ? 'flag'
|
|
398
|
-
: 'manual';
|
|
399
|
-
process.stderr.write(`[rush] uploading ${accountTokens.length} account token(s) to ${PROXY_HOST}\n`);
|
|
400
|
-
const retryBody = buildDispatchBody({
|
|
401
|
-
agent: options.agent,
|
|
402
|
-
prompt: options.prompt,
|
|
403
|
-
mode: options.providerOptions?.mode,
|
|
404
|
-
resolvedRepos,
|
|
405
|
-
accountManifest,
|
|
406
|
-
accountTokens,
|
|
407
|
-
skills: options.skills,
|
|
408
|
-
images: options.images,
|
|
409
|
-
env: options.env,
|
|
410
|
-
});
|
|
411
|
-
res = await api('POST', '/api/v1/cloud-runs', token, retryBody);
|
|
412
|
-
// Persist consent on first successful upload so we don't re-prompt
|
|
413
|
-
// every time tokens rotate.
|
|
414
|
-
if (res.ok && grantedBy !== 'manual') {
|
|
415
|
-
recordRushUploadConsent(grantedBy, accountFingerprint);
|
|
416
|
-
}
|
|
319
|
+
throw new Error([
|
|
320
|
+
`Rush Cloud asked to sync your Claude login (reason: ${promptCode.toLowerCase()}), but`,
|
|
321
|
+
`agents-cli never copies a native OAuth / session login off this machine (SING-1b) —`,
|
|
322
|
+
`a rotating token uploaded to the cloud is invalidated on its next refresh.`,
|
|
323
|
+
``,
|
|
324
|
+
`Portable provider accounts can run locally or on a pinned fleet device, but cloud`,
|
|
325
|
+
`placement does not securely inject them yet. Create and sync one with:`,
|
|
326
|
+
` agents accounts add <name> --provider anthropic --auth api-key # or: --auth setup-token`,
|
|
327
|
+
` agents accounts sync <name> <device>`,
|
|
328
|
+
`then run locally or on that device with --account <name>. See docs/credential-management.md (SING-1b).`,
|
|
329
|
+
].join('\n'));
|
|
417
330
|
}
|
|
418
331
|
}
|
|
419
332
|
if (!res.ok) {
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Factory) implement, plus the shared task and event types that flow through
|
|
6
6
|
* the dispatch pipeline.
|
|
7
7
|
*/
|
|
8
|
-
import type { JobTrigger } from '../routines.js';
|
|
8
|
+
import type { JobTrigger } from '../scheduling/routines.js';
|
|
9
9
|
/**
|
|
10
10
|
* Identifier for a supported cloud dispatch backend.
|
|
11
11
|
*
|
|
@@ -19,7 +19,7 @@ import type { JobTrigger } from '../routines.js';
|
|
|
19
19
|
*
|
|
20
20
|
* Agents route to their native cloud automatically (see `cloudProvider` in the
|
|
21
21
|
* agent registry); `--provider` overrides. Nothing auto-routes to `host` — it
|
|
22
|
-
* is always an explicit `--provider host` (or `--
|
|
22
|
+
* is always an explicit `--provider host` (or `--device <name>`) choice.
|
|
23
23
|
*/
|
|
24
24
|
export type CloudProviderId = 'rush' | 'codex' | 'factory' | 'antigravity' | 'cursor' | 'host';
|
|
25
25
|
/**
|
package/dist/lib/commands.js
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* agent version homes.
|
|
8
8
|
*/
|
|
9
9
|
import * as fs from 'fs';
|
|
10
|
+
import { compareVersions } from './agent-spec/primitives.js';
|
|
10
11
|
import * as path from 'path';
|
|
11
12
|
import * as yaml from 'yaml';
|
|
12
13
|
import { AGENTS, ensureCommandsDir, agentConfigDirName, resolveAgentName } from './agents.js';
|
|
@@ -15,21 +16,10 @@ import { isDirectoryDoc } from './resources.js';
|
|
|
15
16
|
import { normalizeAliases } from './resource-aliases.js';
|
|
16
17
|
import { markdownToToml } from './convert.js';
|
|
17
18
|
import { getCommandsDir, getUserCommandsDir, getEnabledExtraRepos, getProjectAgentsDir, getSkillsDir, getTrashCommandsDir } from './state.js';
|
|
18
|
-
import { getEffectiveHome, getVersionHomePath, listInstalledVersions, resolveVersion } from './versions.js';
|
|
19
|
-
import { discoverPlugins } from './plugins.js';
|
|
19
|
+
import { getEffectiveHome, getVersionHomePath, listInstalledVersions, resolveVersion } from './installations/versions.js';
|
|
20
|
+
import { discoverPlugins } from './plugins/plugins.js';
|
|
20
21
|
import { commandSkillMatches, installCommandSkillToVersion, listCommandSkillsInVersion, removeCommandSkillFromVersion, shouldAlsoInstallCommandAsSkill, shouldInstallCommandAsSkill, } from './command-skills.js';
|
|
21
22
|
import { installGooseCommandToVersion, listGooseCommandsInVersion, gooseCommandMatches, removeGooseCommandFromVersion, } from './goose-commands.js';
|
|
22
|
-
function compareVersions(a, b) {
|
|
23
|
-
const aParts = a.split('.').map((n) => parseInt(n, 10) || 0);
|
|
24
|
-
const bParts = b.split('.').map((n) => parseInt(n, 10) || 0);
|
|
25
|
-
for (let i = 0; i < Math.max(aParts.length, bParts.length); i++) {
|
|
26
|
-
const aVal = aParts[i] || 0;
|
|
27
|
-
const bVal = bParts[i] || 0;
|
|
28
|
-
if (aVal !== bVal)
|
|
29
|
-
return aVal - bVal;
|
|
30
|
-
}
|
|
31
|
-
return 0;
|
|
32
|
-
}
|
|
33
23
|
function parseAgentsField(raw) {
|
|
34
24
|
if (raw == null)
|
|
35
25
|
return undefined;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { ComputerClient } from '../computer-rpc.js';
|
|
2
|
+
export interface AppInfo {
|
|
3
|
+
pid: number;
|
|
4
|
+
name: string;
|
|
5
|
+
bundle_id: string;
|
|
6
|
+
active: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function pickTarget(list: AppInfo[], opts: {
|
|
9
|
+
pid?: number;
|
|
10
|
+
bundle?: string;
|
|
11
|
+
}): {
|
|
12
|
+
ok: true;
|
|
13
|
+
app: AppInfo;
|
|
14
|
+
} | {
|
|
15
|
+
ok: false;
|
|
16
|
+
error: string;
|
|
17
|
+
};
|
|
18
|
+
export declare function resolveTargetPidDecision(client: ComputerClient, opts: {
|
|
19
|
+
pid?: number;
|
|
20
|
+
bundle?: string;
|
|
21
|
+
}, gate?: {
|
|
22
|
+
verb?: string;
|
|
23
|
+
env?: NodeJS.ProcessEnv;
|
|
24
|
+
nowMs?: number;
|
|
25
|
+
}): Promise<{
|
|
26
|
+
ok: true;
|
|
27
|
+
pid: number;
|
|
28
|
+
source: 'pid' | 'list_apps' | 'session_admission';
|
|
29
|
+
} | {
|
|
30
|
+
ok: false;
|
|
31
|
+
error: string;
|
|
32
|
+
}>;
|
|
33
|
+
export declare function emitComputerAction(verb: string, targetPid: number | undefined, opts: {
|
|
34
|
+
bundle?: string;
|
|
35
|
+
device?: string;
|
|
36
|
+
}, extra?: Record<string, unknown>): void;
|