@phnx-labs/agents-cli 1.22.39 → 1.22.41
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 +316 -0
- package/README.md +116 -70
- package/dist/bin/agents +0 -0
- package/dist/bootstrap.js +45 -27
- package/dist/browser.js +2 -2
- package/dist/cli/command-registry.d.ts +135 -0
- package/dist/cli/command-registry.js +259 -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.d.ts +15 -0
- package/dist/commands/browser.js +318 -131
- 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 +12 -23
- 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 +158 -159
- 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 +14 -0
- package/dist/commands/sessions-picker.js +209 -13
- package/dist/commands/sessions-resume.d.ts +7 -3
- package/dist/commands/sessions-resume.js +81 -33
- package/dist/commands/sessions-share.d.ts +25 -0
- package/dist/commands/sessions-share.js +166 -0
- package/dist/commands/sessions-stats.js +2 -2
- package/dist/commands/sessions.d.ts +75 -68
- package/dist/commands/sessions.js +144 -180
- package/dist/commands/setup-browser.js +1 -1
- 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-preferences.js +2 -2
- 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 +25 -34
- 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 +5 -1
- package/dist/lib/browser/chrome.js +12 -1
- package/dist/lib/browser/drivers/ssh.d.ts +1 -1
- package/dist/lib/browser/drivers/ssh.js +3 -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 +69 -5
- package/dist/lib/browser/profiles.js +135 -13
- 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 +137 -2
- package/dist/lib/browser/service.js +492 -54
- 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 +19 -1
- 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 +104 -0
- package/dist/lib/daemon-webhooks.js +215 -0
- package/dist/lib/device-config.d.ts +85 -75
- package/dist/lib/device-config.js +280 -142
- 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 +3 -3
- package/dist/lib/observe-aliases.js +3 -21
- 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-key.js +7 -0
- 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 +261 -67
- 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 +4 -4
- package/dist/lib/secrets/bundles.js +8 -8
- package/dist/lib/secrets/headless.d.ts +16 -0
- package/dist/lib/secrets/headless.js +21 -0
- 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 +21 -17
- package/dist/lib/secrets/remote.js +39 -23
- 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/share-html.d.ts +55 -0
- package/dist/lib/session/share-html.js +319 -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/settings-manifest.d.ts +2 -0
- package/dist/lib/settings-manifest.js +81 -3
- package/dist/lib/share/delete.d.ts +21 -0
- package/dist/lib/share/delete.js +42 -0
- package/dist/lib/share/publish.d.ts +120 -0
- package/dist/lib/share/publish.js +243 -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 +6 -147
- package/dist/lib/startup/command-registry.js +40 -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 +38 -3
- package/dist/lib/triggers/handlers.js +58 -7
- package/dist/lib/triggers/webhook.d.ts +113 -5
- package/dist/lib/triggers/webhook.js +223 -44
- package/dist/lib/types.d.ts +19 -7
- 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/dist/lib/wrap.d.ts +33 -0
- package/dist/lib/wrap.js +70 -0
- 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
|
@@ -13,7 +13,8 @@ import { makeVerbDispatcher } from '../lib/computer/dispatch.js';
|
|
|
13
13
|
import { makeClaudeResponder, resolveApiKey, DEFAULT_CLAUDE_MODEL, DEFAULT_CLAUDE_BASE_URL } from '../lib/computer/model.js';
|
|
14
14
|
import { TASK_PREVIEW_MAX_CHARS } from '../lib/computer/sessions-list.js';
|
|
15
15
|
import { runComputerSessionsCommand } from './computer-sessions-picker.js';
|
|
16
|
-
import { truncate } from '../lib/events.js';
|
|
16
|
+
import { truncate } from '../lib/feed/events.js';
|
|
17
|
+
import { namespacedServiceLabel, serviceManifestHomeEnv } from '../lib/service-manifest.js';
|
|
17
18
|
// Help groups — mirror `agents browser` so the mental model carries over.
|
|
18
19
|
const COMPUTER_HELP_GROUPS = [
|
|
19
20
|
{ title: 'Installation', names: ['setup'] },
|
|
@@ -23,16 +24,16 @@ const COMPUTER_HELP_GROUPS = [
|
|
|
23
24
|
{ title: 'Interact', names: ['launch', 'raise', 'click', 'right-click', 'type', 'type-text', 'key', 'drag', 'scroll', 'ax-action', 'focus', 'wait'] },
|
|
24
25
|
{ title: 'History and discovery', names: ['sessions'] },
|
|
25
26
|
];
|
|
26
|
-
// Subcommands that manage the `--
|
|
27
|
+
// Subcommands that manage the `--device` remote path themselves (provisioning /
|
|
27
28
|
// tunnel lifecycle, or daemon-state reporting that must degrade gracefully
|
|
28
|
-
// when no tunnel is recorded). Every other `--
|
|
29
|
+
// when no tunnel is recorded). Every other `--device`-bearing subcommand is a
|
|
29
30
|
// plain verb that just needs the TCP endpoint hydrated before it runs.
|
|
30
31
|
const REMOTE_LIFECYCLE = new Set(['setup', 'start', 'stop', 'status', 'reload']);
|
|
31
32
|
/**
|
|
32
33
|
* Pure platform gate. The computer subsystem is macOS-only for LOCAL driving
|
|
33
34
|
* (Accessibility / launchctl). It is NOT blocked off macOS when a remote daemon
|
|
34
35
|
* is reachable — either a configured TCP endpoint (COMPUTER_HELPER_TCP, e.g. a
|
|
35
|
-
* Windows daemon over a tunnel) or a `--
|
|
36
|
+
* Windows daemon over a tunnel) or a `--device <name>` remote invocation. Kept
|
|
36
37
|
* pure so the gating rule is unit-testable without a live command tree.
|
|
37
38
|
*/
|
|
38
39
|
export function shouldBlockOffPlatform(opts) {
|
|
@@ -40,7 +41,7 @@ export function shouldBlockOffPlatform(opts) {
|
|
|
40
41
|
return false;
|
|
41
42
|
if (opts.tcpConfigured)
|
|
42
43
|
return false; // remote (Windows) daemon over a tunnel
|
|
43
|
-
if (opts.
|
|
44
|
+
if (opts.device)
|
|
44
45
|
return false; // remote path resolves its own endpoint
|
|
45
46
|
return true;
|
|
46
47
|
}
|
|
@@ -83,21 +84,21 @@ export function reconcileScreenshotExt(outPath, buf) {
|
|
|
83
84
|
export function registerComputerCommand(program) {
|
|
84
85
|
const computer = program
|
|
85
86
|
.command('computer')
|
|
86
|
-
.description('Drive macOS apps via Accessibility, or a remote Windows
|
|
87
|
+
.description('Drive macOS apps via Accessibility, or a remote Windows device with --device — list, screenshot, click, type')
|
|
87
88
|
// The whole subsystem is macOS Accessibility / TCC for LOCAL driving. Off
|
|
88
89
|
// macOS it still works against a remote daemon (COMPUTER_HELPER_TCP set, or
|
|
89
|
-
// a `--
|
|
90
|
+
// a `--device <name>` invocation). Fail fast with a clear message only when
|
|
90
91
|
// neither remote path is available, instead of a downstream launchctl error.
|
|
91
92
|
.hook('preAction', async (_thisCommand, actionCommand) => {
|
|
92
|
-
const
|
|
93
|
-
// Verbs with --
|
|
94
|
-
// sets COMPUTER_HELPER_TCP so the shared client picks the TCP transport.
|
|
95
|
-
if (
|
|
96
|
-
hydrateRemoteEnvFromState(
|
|
93
|
+
const device = actionCommand.opts().device;
|
|
94
|
+
// Verbs with --device reconnect to the tunnel `start --device` recorded;
|
|
95
|
+
// this sets COMPUTER_HELPER_TCP so the shared client picks the TCP transport.
|
|
96
|
+
if (device && !REMOTE_LIFECYCLE.has(actionCommand.name())) {
|
|
97
|
+
hydrateRemoteEnvFromState(device);
|
|
97
98
|
}
|
|
98
|
-
if (shouldBlockOffPlatform({ platform: process.platform, tcpConfigured: resolveTcpEndpoint() != null,
|
|
99
|
+
if (shouldBlockOffPlatform({ platform: process.platform, tcpConfigured: resolveTcpEndpoint() != null, device })) {
|
|
99
100
|
console.error('agents computer: macOS only for local driving — it uses the macOS Accessibility API.');
|
|
100
|
-
console.error('For a remote Windows
|
|
101
|
+
console.error('For a remote Windows device: register it with `agents devices`, then use --device (or set COMPUTER_HELPER_TCP).');
|
|
101
102
|
process.exit(1);
|
|
102
103
|
}
|
|
103
104
|
});
|
|
@@ -119,11 +120,11 @@ export function registerComputerSubcommands(program) {
|
|
|
119
120
|
function registerStatusCommand(program) {
|
|
120
121
|
program
|
|
121
122
|
.command('status')
|
|
122
|
-
.description('Report install state, daemon state, and Accessibility trust — or a remote Windows daemon with --
|
|
123
|
-
.option('--
|
|
123
|
+
.description('Report install state, daemon state, and Accessibility trust — or a remote Windows daemon with --device')
|
|
124
|
+
.option('--device <name>', 'Report the remote Windows daemon (tunnel + liveness) instead of the local helper')
|
|
124
125
|
.action(async (opts) => {
|
|
125
|
-
if (opts.
|
|
126
|
-
await reportRemoteStatus(opts.
|
|
126
|
+
if (opts.device) {
|
|
127
|
+
await reportRemoteStatus(opts.device);
|
|
127
128
|
return;
|
|
128
129
|
}
|
|
129
130
|
const socketPath = resolveSocketPath();
|
|
@@ -172,21 +173,21 @@ function registerStatusCommand(program) {
|
|
|
172
173
|
}
|
|
173
174
|
});
|
|
174
175
|
}
|
|
175
|
-
// status --
|
|
176
|
+
// status --device: the local checks (app install, launchd socket, policy files)
|
|
176
177
|
// are macOS concepts — a remote Windows daemon is reported from what actually
|
|
177
178
|
// exists for it: the recorded tunnel and a live trust_status probe through it.
|
|
178
|
-
async function reportRemoteStatus(
|
|
179
|
-
console.log(`
|
|
180
|
-
const state = readRemoteState(
|
|
179
|
+
async function reportRemoteStatus(device) {
|
|
180
|
+
console.log(`device: ${device}`);
|
|
181
|
+
const state = readRemoteState(device);
|
|
181
182
|
if (!state) {
|
|
182
183
|
console.log('tunnel: none');
|
|
183
184
|
console.log('daemon: unknown (no tunnel to probe through)');
|
|
184
185
|
console.log('');
|
|
185
|
-
console.log(`Run: agents computer start --
|
|
186
|
+
console.log(`Run: agents computer start --device ${device}`);
|
|
186
187
|
process.exit(1);
|
|
187
188
|
}
|
|
188
189
|
console.log(`tunnel: 127.0.0.1:${state.localPort} -> ${state.target} (127.0.0.1:${state.remotePort})`);
|
|
189
|
-
hydrateRemoteEnvFromState(
|
|
190
|
+
hydrateRemoteEnvFromState(device);
|
|
190
191
|
try {
|
|
191
192
|
const client = openComputerClient();
|
|
192
193
|
try {
|
|
@@ -210,7 +211,7 @@ async function reportRemoteStatus(host) {
|
|
|
210
211
|
console.log('daemon: unreachable');
|
|
211
212
|
console.log(` ${err.message}`);
|
|
212
213
|
console.log('');
|
|
213
|
-
console.log(`Run: agents computer start --
|
|
214
|
+
console.log(`Run: agents computer start --device ${device}`);
|
|
214
215
|
process.exit(1);
|
|
215
216
|
}
|
|
216
217
|
}
|
|
@@ -227,12 +228,12 @@ export function buildRestartTaskScript(taskName, exeName) {
|
|
|
227
228
|
`Write-Output 'restarted'`,
|
|
228
229
|
].join('; ');
|
|
229
230
|
}
|
|
230
|
-
// reload --
|
|
231
|
+
// reload --device: the Windows daemon has no policy file to re-read (it
|
|
231
232
|
// enforces no allow-list — see TrustStatus in native/computer-win/Rpc.cs), so
|
|
232
233
|
// reload means bounce the daemon via its scheduled task — the way to pick up
|
|
233
234
|
// a freshly pushed exe — then prove it answers through the recorded tunnel.
|
|
234
|
-
async function reloadRemoteHelper(
|
|
235
|
-
const { target } = await resolveRemoteDevice(
|
|
235
|
+
async function reloadRemoteHelper(device) {
|
|
236
|
+
const { target } = await resolveRemoteDevice(device);
|
|
236
237
|
const script = buildRestartTaskScript(REMOTE_TASK_NAME, WIN_HELPER_EXE);
|
|
237
238
|
const res = sshExec(target, `powershell -NoProfile -NonInteractive -EncodedCommand ${encodePowershell(script)}`, { timeoutMs: 60_000 });
|
|
238
239
|
if (res.code !== 0) {
|
|
@@ -241,12 +242,12 @@ async function reloadRemoteHelper(host) {
|
|
|
241
242
|
process.exit(1);
|
|
242
243
|
}
|
|
243
244
|
console.log(`task: restarted "${REMOTE_TASK_NAME}" on ${target}`);
|
|
244
|
-
const state = readRemoteState(
|
|
245
|
+
const state = readRemoteState(device);
|
|
245
246
|
if (!state) {
|
|
246
|
-
console.log(`(no tunnel recorded — run \`agents computer start --
|
|
247
|
+
console.log(`(no tunnel recorded — run \`agents computer start --device ${device}\` to drive it)`);
|
|
247
248
|
return;
|
|
248
249
|
}
|
|
249
|
-
hydrateRemoteEnvFromState(
|
|
250
|
+
hydrateRemoteEnvFromState(device);
|
|
250
251
|
// The relaunched daemon needs a beat to rebind its port; poll through the
|
|
251
252
|
// tunnel until it answers.
|
|
252
253
|
const deadline = Date.now() + 15_000;
|
|
@@ -290,7 +291,7 @@ function registerRunCommand(program) {
|
|
|
290
291
|
.option('--model <id>', `Model id (default: ${DEFAULT_CLAUDE_MODEL})`)
|
|
291
292
|
.option('--max-steps <n>', 'Max model turns before giving up', (v) => parseInt(v, 10), 12)
|
|
292
293
|
.option('--max-tokens <n>', 'Max tokens per model turn', (v) => parseInt(v, 10), 1024)
|
|
293
|
-
.option('--
|
|
294
|
+
.option('--device <name>', 'Drive a remote Windows device (requires `agents computer start --device <name>` first)')
|
|
294
295
|
.option('--json', 'Emit the final loop result as JSON')
|
|
295
296
|
.action(async (opts) => {
|
|
296
297
|
const apiKey = resolveApiKey({ apiKey: undefined, baseUrl: opts.baseUrl });
|
|
@@ -305,9 +306,9 @@ function registerRunCommand(program) {
|
|
|
305
306
|
model: opts.model,
|
|
306
307
|
maxTokens: opts.maxTokens,
|
|
307
308
|
});
|
|
308
|
-
emitComputerRunTaskMarker({ task: opts.task, bundle: opts.bundle,
|
|
309
|
+
emitComputerRunTaskMarker({ task: opts.task, bundle: opts.bundle, device: opts.device });
|
|
309
310
|
await withClient(async (client) => {
|
|
310
|
-
const dispatch = makeVerbDispatcher(client, {
|
|
311
|
+
const dispatch = makeVerbDispatcher(client, { device: opts.device });
|
|
311
312
|
const targetInput = opts.bundle ? { bundle: opts.bundle } : {};
|
|
312
313
|
const result = await runComputerLoop({
|
|
313
314
|
task: opts.task,
|
|
@@ -337,7 +338,7 @@ function registerSessionsCommand(program) {
|
|
|
337
338
|
program
|
|
338
339
|
.command('sessions')
|
|
339
340
|
.description('Browse computer-driving history, grouped by run — one row per `agents computer` invocation')
|
|
340
|
-
.option('--machine <name>', 'Only rows invoked from/driving this machine (hostname, machineId, or --
|
|
341
|
+
.option('--machine <name>', 'Only rows invoked from/driving this machine (hostname, machineId, or --device name)')
|
|
341
342
|
.option('--limit <n>', 'Cap the flat/--no-interactive table at this many rows (default 50; --json is unbounded)', (v) => parseInt(v, 10))
|
|
342
343
|
.option('--json', 'Emit machine-readable JSON')
|
|
343
344
|
.option('--no-interactive', 'Print the flat listing instead of opening the interactive run browser')
|
|
@@ -357,7 +358,7 @@ function registerSessionsCommand(program) {
|
|
|
357
358
|
* `emitComputerAction`.
|
|
358
359
|
*/
|
|
359
360
|
export function emitComputerRunTaskMarker(opts) {
|
|
360
|
-
emitComputerAction('run', undefined, { bundle: opts.bundle,
|
|
361
|
+
emitComputerAction('run', undefined, { bundle: opts.bundle, device: opts.device }, {
|
|
361
362
|
task: truncate(opts.task, TASK_PREVIEW_MAX_CHARS),
|
|
362
363
|
});
|
|
363
364
|
}
|
|
@@ -388,11 +389,11 @@ function registerScreenshotCommand(program) {
|
|
|
388
389
|
.description('Capture a window (default: largest), enumerate windows (--list), or the whole display (--display)')
|
|
389
390
|
.option('--bundle <id>', 'Bundle id to capture (default: frontmost allow-listed app)')
|
|
390
391
|
.option('--pid <n>', 'Target pid directly (overrides --bundle)', (v) => parseInt(v, 10))
|
|
391
|
-
.option('--
|
|
392
|
+
.option('--device <name>', 'Drive a remote Windows device (requires `agents computer start --device <name>` first)')
|
|
392
393
|
.option('--list', 'List the app\'s windows (id/title/layer/bounds) instead of capturing — reveals modals/popups')
|
|
393
394
|
.option('--window-id <n>', 'Capture a specific window by id (from --list)', (v) => parseInt(v, 10))
|
|
394
395
|
.option('--display', 'Capture the whole display the app is on (composites stacked modals)')
|
|
395
|
-
.option('--out <path>', 'Output image path — extension auto-corrected to the encoded format (JPEG on macOS, PNG on a Windows --
|
|
396
|
+
.option('--out <path>', 'Output image path — extension auto-corrected to the encoded format (JPEG on macOS, PNG on a Windows --device)', './computer-screenshot.jpg')
|
|
396
397
|
.option('--quality <n>', 'JPEG quality 1-100 (macOS capture only; the Windows helper encodes lossless PNG and ignores this)', (v) => parseInt(v, 10), 85)
|
|
397
398
|
.option('--json', 'Emit JSON (metadata for captures; window list for --list)')
|
|
398
399
|
.action(async (opts) => {
|
|
@@ -479,7 +480,16 @@ function registerScreenshotCommand(program) {
|
|
|
479
480
|
const HELPER_BUNDLE_ID = 'com.phnx-labs.computer-helper';
|
|
480
481
|
const HELPER_APP_NAME = 'Computer Helper.app';
|
|
481
482
|
const HELPER_APP_DEST = `/Applications/${HELPER_APP_NAME}`;
|
|
482
|
-
|
|
483
|
+
/**
|
|
484
|
+
* launchd Label for this process's helper — the production identifier for a real
|
|
485
|
+
* invocation, namespaced under a redirected HOME (RUSH-2639). launchd routes
|
|
486
|
+
* bootout/bootstrap/kickstart/print by identifier alone, never by the plist's
|
|
487
|
+
* path, so without this a process running under a sandbox HOME tears down the
|
|
488
|
+
* operator's live helper.
|
|
489
|
+
*/
|
|
490
|
+
export function helperLabel() {
|
|
491
|
+
return namespacedServiceLabel(HELPER_BUNDLE_ID);
|
|
492
|
+
}
|
|
483
493
|
/**
|
|
484
494
|
* Install the macOS helper locally: resolve (or download + verify) the signed,
|
|
485
495
|
* notarized .app, copy it to /Applications, verify the destination signature,
|
|
@@ -499,7 +509,7 @@ export async function installComputerHelperMacLocal() {
|
|
|
499
509
|
}
|
|
500
510
|
const socketPath = resolveSocketPath();
|
|
501
511
|
const logPath = resolveLogPath();
|
|
502
|
-
const plistPath = path.join(os.homedir(), 'Library', 'LaunchAgents', `${
|
|
512
|
+
const plistPath = path.join(os.homedir(), 'Library', 'LaunchAgents', `${helperLabel()}.plist`);
|
|
503
513
|
console.log(`source: ${srcApp}`);
|
|
504
514
|
console.log(`dest: ${HELPER_APP_DEST}`);
|
|
505
515
|
// 1. Copy to /Applications/ via ditto (preserves xattrs + codesign metadata).
|
|
@@ -531,7 +541,7 @@ export async function installComputerHelperMacLocal() {
|
|
|
531
541
|
fs.mkdirSync(path.dirname(logPath), { recursive: true });
|
|
532
542
|
// 4. Write the LaunchAgent plist but DO NOT bootstrap it (opt-in via `start`).
|
|
533
543
|
const execInsideApp = path.join(HELPER_APP_DEST, 'Contents', 'MacOS', 'ComputerHelper');
|
|
534
|
-
const plistContent = renderLaunchAgentPlist({ label:
|
|
544
|
+
const plistContent = renderLaunchAgentPlist({ label: helperLabel(), exec: execInsideApp, socketPath, logPath });
|
|
535
545
|
fs.mkdirSync(path.dirname(plistPath), { recursive: true });
|
|
536
546
|
fs.writeFileSync(plistPath, plistContent);
|
|
537
547
|
console.log(`wrote plist: ${plistPath} (NOT activated)`);
|
|
@@ -544,7 +554,7 @@ export async function installComputerHelperMacLocal() {
|
|
|
544
554
|
* Shared by `agents computer start` and the `agents setup computer` wizard.
|
|
545
555
|
*/
|
|
546
556
|
export async function activateComputerHelperMacLocal() {
|
|
547
|
-
const plistPath = path.join(os.homedir(), 'Library', 'LaunchAgents', `${
|
|
557
|
+
const plistPath = path.join(os.homedir(), 'Library', 'LaunchAgents', `${helperLabel()}.plist`);
|
|
548
558
|
const socketPath = resolveSocketPath();
|
|
549
559
|
const logPath = resolveLogPath();
|
|
550
560
|
if (!fs.existsSync(plistPath))
|
|
@@ -591,7 +601,7 @@ export async function activateComputerHelperMacLocal() {
|
|
|
591
601
|
}
|
|
592
602
|
// Force restart so we pick up the latest binary.
|
|
593
603
|
try {
|
|
594
|
-
execFileSync('/bin/launchctl', ['kickstart', '-k', `${domain}/${
|
|
604
|
+
execFileSync('/bin/launchctl', ['kickstart', '-k', `${domain}/${helperLabel()}`], { stdio: 'pipe' });
|
|
595
605
|
}
|
|
596
606
|
catch (err) {
|
|
597
607
|
throw new Error(`launchctl kickstart failed: ${err.message}`);
|
|
@@ -650,16 +660,16 @@ function registerSetupCommand(program) {
|
|
|
650
660
|
program
|
|
651
661
|
.command('setup')
|
|
652
662
|
.alias('install-helper')
|
|
653
|
-
.description('Install the helper — locally to /Applications/ (macOS), or to a remote Windows
|
|
654
|
-
.option('--
|
|
663
|
+
.description('Install the helper — locally to /Applications/ (macOS), or to a remote Windows device with --device')
|
|
664
|
+
.option('--device <name>', 'Provision a remote Windows device (push the exe + register a LOGON task) instead of installing locally')
|
|
655
665
|
.action(async (opts) => {
|
|
656
|
-
if (opts.
|
|
666
|
+
if (opts.device) {
|
|
657
667
|
try {
|
|
658
|
-
const { target, taskName } = await setupRemoteHelper(opts.
|
|
668
|
+
const { target, taskName } = await setupRemoteHelper(opts.device);
|
|
659
669
|
console.log(`pushed computer-helper-win.exe to ${target}`);
|
|
660
670
|
console.log(`registered LOGON scheduled task "${taskName}" (interactive session, started now)`);
|
|
661
671
|
console.log('');
|
|
662
|
-
console.log(`Next: agents computer start --
|
|
672
|
+
console.log(`Next: agents computer start --device ${opts.device}`);
|
|
663
673
|
}
|
|
664
674
|
catch (err) {
|
|
665
675
|
console.error(`error: ${err.message}`);
|
|
@@ -698,17 +708,17 @@ function registerSetupCommand(program) {
|
|
|
698
708
|
function registerStartCommand(program) {
|
|
699
709
|
program
|
|
700
710
|
.command('start')
|
|
701
|
-
.description('Activate the helper daemon — local launchd (macOS) or a remote Windows tunnel with --
|
|
702
|
-
.option('--
|
|
711
|
+
.description('Activate the helper daemon — local launchd (macOS) or a remote Windows tunnel with --device')
|
|
712
|
+
.option('--device <name>', 'Open a tunnel to the remote Windows daemon and record it for --device verbs')
|
|
703
713
|
.action(async (opts) => {
|
|
704
|
-
if (opts.
|
|
714
|
+
if (opts.device) {
|
|
705
715
|
try {
|
|
706
|
-
const state = await startRemoteTunnel(opts.
|
|
716
|
+
const state = await startRemoteTunnel(opts.device);
|
|
707
717
|
console.log(`tunnel: 127.0.0.1:${state.localPort} -> ${state.target} (127.0.0.1:${state.remotePort})`);
|
|
708
718
|
console.log(`daemon: answering (ssh pid ${state.tunnelPid})`);
|
|
709
719
|
console.log('');
|
|
710
|
-
console.log(`Drive it: agents computer apps --
|
|
711
|
-
console.log(`Stop: agents computer stop --
|
|
720
|
+
console.log(`Drive it: agents computer apps --device ${opts.device}`);
|
|
721
|
+
console.log(`Stop: agents computer stop --device ${opts.device}`);
|
|
712
722
|
}
|
|
713
723
|
catch (err) {
|
|
714
724
|
console.error(`error: ${err.message}`);
|
|
@@ -733,12 +743,12 @@ function registerStartCommand(program) {
|
|
|
733
743
|
function registerReloadCommand(program) {
|
|
734
744
|
program
|
|
735
745
|
.command('reload')
|
|
736
|
-
.description('Reload the allow-list policy (SIGHUP the local daemon) — or restart a remote Windows daemon with --
|
|
737
|
-
.option('--
|
|
746
|
+
.description('Reload the allow-list policy (SIGHUP the local daemon) — or restart a remote Windows daemon with --device')
|
|
747
|
+
.option('--device <name>', 'Restart the remote Windows daemon (its scheduled task) instead of SIGHUPing the local one')
|
|
738
748
|
.action(async (opts) => {
|
|
739
|
-
if (opts.
|
|
749
|
+
if (opts.device) {
|
|
740
750
|
try {
|
|
741
|
-
await reloadRemoteHelper(opts.
|
|
751
|
+
await reloadRemoteHelper(opts.device);
|
|
742
752
|
}
|
|
743
753
|
catch (err) {
|
|
744
754
|
console.error(`error: ${err.message}`);
|
|
@@ -771,7 +781,7 @@ function registerReloadCommand(program) {
|
|
|
771
781
|
const domain = `gui/${uid}`;
|
|
772
782
|
let pid = null;
|
|
773
783
|
try {
|
|
774
|
-
const out = execFileSync('/bin/launchctl', ['print', `${domain}/${
|
|
784
|
+
const out = execFileSync('/bin/launchctl', ['print', `${domain}/${helperLabel()}`], { encoding: 'utf-8' });
|
|
775
785
|
const m = out.match(/\bpid\s*=\s*(\d+)/);
|
|
776
786
|
if (m)
|
|
777
787
|
pid = parseInt(m[1], 10);
|
|
@@ -809,12 +819,12 @@ function registerReloadCommand(program) {
|
|
|
809
819
|
function registerStopCommand(program) {
|
|
810
820
|
program
|
|
811
821
|
.command('stop')
|
|
812
|
-
.description('Deactivate the helper daemon — local launchd (macOS) or a remote Windows tunnel with --
|
|
813
|
-
.option('--
|
|
822
|
+
.description('Deactivate the helper daemon — local launchd (macOS) or a remote Windows tunnel with --device')
|
|
823
|
+
.option('--device <name>', 'Tear down the remote tunnel and unregister the scheduled task')
|
|
814
824
|
.action(async (opts) => {
|
|
815
|
-
if (opts.
|
|
825
|
+
if (opts.device) {
|
|
816
826
|
try {
|
|
817
|
-
const { tunnelKilled, taskRemoved } = await stopRemoteHelper(opts.
|
|
827
|
+
const { tunnelKilled, taskRemoved } = await stopRemoteHelper(opts.device);
|
|
818
828
|
console.log(`tunnel: ${tunnelKilled ? 'closed' : 'not running'}`);
|
|
819
829
|
console.log(`task: ${taskRemoved ? 'unregistered' : 'not removed (device offline?)'}`);
|
|
820
830
|
}
|
|
@@ -825,7 +835,7 @@ function registerStopCommand(program) {
|
|
|
825
835
|
return;
|
|
826
836
|
}
|
|
827
837
|
const home = os.homedir();
|
|
828
|
-
const plistPath = path.join(home, 'Library', 'LaunchAgents', `${
|
|
838
|
+
const plistPath = path.join(home, 'Library', 'LaunchAgents', `${helperLabel()}.plist`);
|
|
829
839
|
const socketPath = resolveSocketPath();
|
|
830
840
|
const uid = process.getuid?.();
|
|
831
841
|
if (typeof uid !== 'number') {
|
|
@@ -851,7 +861,21 @@ function registerStopCommand(program) {
|
|
|
851
861
|
}
|
|
852
862
|
});
|
|
853
863
|
}
|
|
854
|
-
|
|
864
|
+
/**
|
|
865
|
+
* The helper's launchd plist.
|
|
866
|
+
*
|
|
867
|
+
* The `EnvironmentVariables` dict carries HOME (RUSH-2639, see
|
|
868
|
+
* `lib/service-manifest.ts`): launchd applies this dict on top of the LOGIN
|
|
869
|
+
* SESSION's environment, never the environment of whoever called `launchctl
|
|
870
|
+
* bootstrap`, so a manifest that omits HOME hands the helper the account home no
|
|
871
|
+
* matter which home the caller resolved. That is a silent escape from any
|
|
872
|
+
* redirected HOME — the hermetic test harness's, and an agent's isolated version
|
|
873
|
+
* home alike.
|
|
874
|
+
*/
|
|
875
|
+
export function renderLaunchAgentPlist(opts) {
|
|
876
|
+
const envXml = Object.entries(serviceManifestHomeEnv())
|
|
877
|
+
.map(([k, v]) => ` <key>${escapeXml(k)}</key>\n <string>${escapeXml(v)}</string>`)
|
|
878
|
+
.join('\n');
|
|
855
879
|
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
856
880
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
857
881
|
<plist version="1.0">
|
|
@@ -864,6 +888,10 @@ function renderLaunchAgentPlist(opts) {
|
|
|
864
888
|
<string>--socket</string>
|
|
865
889
|
<string>${escapeXml(opts.socketPath)}</string>
|
|
866
890
|
</array>
|
|
891
|
+
<key>EnvironmentVariables</key>
|
|
892
|
+
<dict>
|
|
893
|
+
${envXml}
|
|
894
|
+
</dict>
|
|
867
895
|
<key>RunAtLoad</key>
|
|
868
896
|
<true/>
|
|
869
897
|
<key>KeepAlive</key>
|
package/dist/commands/config.js
CHANGED
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
import chalk from 'chalk';
|
|
17
17
|
import { setHelpSections } from '../lib/help.js';
|
|
18
18
|
import { parseConfigKey, formatAgentVersion, devicePropertyToConfigName, configKeyStorageHint, } from '../lib/config-keys.js';
|
|
19
|
+
import { registerBudgetCommand } from './budget.js';
|
|
19
20
|
import { resolveRunDefaults, setRunDefaultModel, setRunDefaultMode, setRunDefaultEffort, unsetRunDefault, } from '../lib/run-defaults.js';
|
|
20
21
|
import { resolveTierOverride, setTierOverride, clearTierOverride } from '../lib/model-tier-overrides.js';
|
|
21
22
|
import { getConfigValue, setConfigValue, unsetConfigValue, listConfig, } from '../lib/device-config.js';
|
|
@@ -63,6 +64,11 @@ function parseValue(key, parsed, raw) {
|
|
|
63
64
|
case 'tmux':
|
|
64
65
|
case 'browser.remote-control':
|
|
65
66
|
return parseBool(raw, key);
|
|
67
|
+
case 'browser.task-idle-minutes':
|
|
68
|
+
if (!/^\d+$/.test(raw.trim())) {
|
|
69
|
+
throw new Error(`Config key '${key}' expects a non-negative integer, got '${raw}'.`);
|
|
70
|
+
}
|
|
71
|
+
return Number.parseInt(raw.trim(), 10);
|
|
66
72
|
case 'notes':
|
|
67
73
|
return raw.trim();
|
|
68
74
|
case 'browser.profile':
|
|
@@ -111,8 +117,8 @@ function setConfig(parsed, value) {
|
|
|
111
117
|
return;
|
|
112
118
|
}
|
|
113
119
|
case 'browser': {
|
|
114
|
-
// Device-local default lives in the
|
|
115
|
-
//
|
|
120
|
+
// Device-local default lives in the per-device doc's config: block
|
|
121
|
+
// (same store `agents devices config` / getConfigValue use). Bare
|
|
116
122
|
// browser.profile targets this machine; devices.<name>.browser.profile
|
|
117
123
|
// targets a peer.
|
|
118
124
|
setConfigValue('browser.profile', value, parsed.device ? { device: parsed.device } : undefined);
|
|
@@ -295,6 +301,9 @@ function* listDeviceConfigEntries(device) {
|
|
|
295
301
|
case 'browser.remote-control':
|
|
296
302
|
key = `${prefix}browser.remote-control`;
|
|
297
303
|
break;
|
|
304
|
+
case 'browser.task-idle-minutes':
|
|
305
|
+
key = `${prefix}browser.task-idle-minutes`;
|
|
306
|
+
break;
|
|
298
307
|
case 'notes':
|
|
299
308
|
key = `${prefix}notes`;
|
|
300
309
|
break;
|
|
@@ -314,7 +323,7 @@ function* listDeviceConfigEntries(device) {
|
|
|
314
323
|
export function registerConfigCommand(program) {
|
|
315
324
|
const config = program
|
|
316
325
|
.command('config')
|
|
317
|
-
.description('Get, set, list, and unset run defaults, tier overrides, the projects root, and
|
|
326
|
+
.description('Get, set, list, and unset run defaults, tier overrides, the projects root, device options, and spend caps.');
|
|
318
327
|
setHelpSections(config, {
|
|
319
328
|
examples: `
|
|
320
329
|
agents config set run.claude@*.model best
|
|
@@ -331,11 +340,14 @@ export function registerConfigCommand(program) {
|
|
|
331
340
|
agents config unset run.claude@*.tier.best
|
|
332
341
|
agents config unset usage.primary-host
|
|
333
342
|
agents config list
|
|
343
|
+
agents config budget
|
|
344
|
+
agents config budget set per_day 50
|
|
334
345
|
`,
|
|
335
346
|
notes: `
|
|
336
347
|
Every agent/harness reference uses agent@version. Use * for all versions.
|
|
337
348
|
Tier overrides are part of the run namespace: run.<agent@version>.tier.<tier>.
|
|
338
349
|
Project root is auto-inferred from the current Git repository when unset.
|
|
350
|
+
Spend caps live under \`agents config budget\` (not a top-level command).
|
|
339
351
|
`,
|
|
340
352
|
});
|
|
341
353
|
config
|
|
@@ -428,4 +440,5 @@ export function registerConfigCommand(program) {
|
|
|
428
440
|
process.exit(1);
|
|
429
441
|
}
|
|
430
442
|
});
|
|
443
|
+
registerBudgetCommand(config);
|
|
431
444
|
}
|
package/dist/commands/cost.d.ts
CHANGED
|
@@ -9,4 +9,5 @@
|
|
|
9
9
|
* quota status per agent and is left untouched.
|
|
10
10
|
*/
|
|
11
11
|
import type { Command } from 'commander';
|
|
12
|
-
|
|
12
|
+
/** Register `agents insights cost` under the insights parent. */
|
|
13
|
+
export declare function registerCostCommand(insightsCmd: Command): void;
|
package/dist/commands/cost.js
CHANGED
|
@@ -5,18 +5,19 @@ import { queryUsageRollup, topSessionsByCost, } from '../lib/session/db.js';
|
|
|
5
5
|
import { formatUsd, PRICING_VERSION } from '../lib/pricing/index.js';
|
|
6
6
|
import { formatDuration } from '../lib/session/render.js';
|
|
7
7
|
import { terminalWidth, truncateToWidth, stringWidth, padToWidth } from '../lib/session/width.js';
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
/** Register `agents insights cost` under the insights parent. */
|
|
9
|
+
export function registerCostCommand(insightsCmd) {
|
|
10
|
+
addHostOption(insightsCmd.command('cost'))
|
|
10
11
|
.description('Roll up $ cost and duration across local agent sessions')
|
|
11
12
|
.option('--json', 'Output the rollup as JSON')
|
|
12
13
|
.option('--since <time>', 'Only sessions newer than this (e.g., 7d, 4w, or ISO date)')
|
|
13
14
|
.option('--by <dimension>', 'Group the breakdown by: agent (default), project, day, or account (the Claude org that produced each session)')
|
|
14
15
|
.addHelpText('after', `
|
|
15
16
|
Examples:
|
|
16
|
-
agents cost Daily histogram + top sessions + per-agent breakdown
|
|
17
|
-
agents cost --since 30d Last 30 days only
|
|
18
|
-
agents cost --by project Break down by project instead of agent
|
|
19
|
-
agents cost --by day --json Machine-readable daily rollup
|
|
17
|
+
agents insights cost Daily histogram + top sessions + per-agent breakdown
|
|
18
|
+
agents insights cost --since 30d Last 30 days only
|
|
19
|
+
agents insights cost --by project Break down by project instead of agent
|
|
20
|
+
agents insights cost --by day --json Machine-readable daily rollup
|
|
20
21
|
|
|
21
22
|
Cost is computed offline from a versioned per-model price table (${PRICING_VERSION}).
|
|
22
23
|
`)
|