@phnx-labs/agents-cli 1.22.38 → 1.22.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +302 -0
- package/README.md +111 -70
- package/dist/bin/agents +0 -0
- package/dist/bootstrap.js +46 -27
- package/dist/browser.js +2 -2
- package/dist/cli/command-registry.d.ts +135 -0
- package/dist/cli/command-registry.js +260 -0
- package/dist/commands/accounts.d.ts +20 -0
- package/dist/commands/accounts.js +186 -25
- package/dist/commands/apply.d.ts +3 -3
- package/dist/commands/apply.js +20 -63
- package/dist/commands/browser.js +206 -94
- package/dist/commands/budget.d.ts +7 -6
- package/dist/commands/budget.js +8 -7
- package/dist/commands/cloud.js +17 -20
- package/dist/commands/commands.js +1 -1
- package/dist/commands/computer-actions.d.ts +1 -35
- package/dist/commands/computer-actions.js +13 -181
- package/dist/commands/computer.d.ts +28 -3
- package/dist/commands/computer.js +93 -65
- package/dist/commands/config.js +47 -4
- package/dist/commands/cost.d.ts +2 -1
- package/dist/commands/cost.js +7 -6
- package/dist/commands/daemon.js +151 -4
- package/dist/commands/detach.js +1 -1
- package/dist/commands/doctor.js +19 -11
- package/dist/commands/events.js +1 -1
- package/dist/commands/exec.d.ts +2 -50
- package/dist/commands/exec.js +161 -216
- package/dist/commands/factory.js +1 -1
- package/dist/commands/feed.d.ts +2 -2
- package/dist/commands/feed.js +9 -12
- package/dist/commands/fleet-capture.js +25 -27
- package/dist/commands/focus.d.ts +2 -3
- package/dist/commands/focus.js +34 -9
- package/dist/commands/go.js +15 -5
- package/dist/commands/harness.d.ts +3 -3
- package/dist/commands/harness.js +53 -5
- package/dist/commands/hooks.js +1 -1
- package/dist/commands/import.js +2 -2
- package/dist/commands/insights.d.ts +5 -5
- package/dist/commands/insights.js +15 -9
- package/dist/commands/inspect.d.ts +2 -3
- package/dist/commands/inspect.js +4 -16
- package/dist/commands/logs.d.ts +2 -2
- package/dist/commands/logs.js +9 -9
- package/dist/commands/mcp.js +2 -2
- package/dist/commands/memory.js +1 -1
- package/dist/commands/message.d.ts +1 -1
- package/dist/commands/message.js +7 -7
- package/dist/commands/mine.d.ts +11 -8
- package/dist/commands/mine.js +11 -10
- package/dist/commands/models.js +1 -1
- package/dist/commands/modes.js +1 -1
- package/dist/commands/monitors.js +23 -6
- package/dist/commands/output.d.ts +7 -6
- package/dist/commands/output.js +11 -10
- package/dist/commands/packages.js +4 -4
- package/dist/commands/perf.js +1 -1
- package/dist/commands/permissions.js +49 -32
- package/dist/commands/plugins.d.ts +1 -1
- package/dist/commands/plugins.js +3 -3
- package/dist/commands/profiles.d.ts +6 -9
- package/dist/commands/profiles.js +8 -321
- package/dist/commands/projects.d.ts +9 -0
- package/dist/commands/projects.js +140 -8
- package/dist/commands/prune.js +5 -13
- package/dist/commands/refresh-rules.js +1 -1
- package/dist/commands/repo.d.ts +5 -7
- package/dist/commands/repo.js +34 -18
- package/dist/commands/resource-view.js +4 -0
- package/dist/commands/resume.d.ts +11 -7
- package/dist/commands/resume.js +82 -98
- package/dist/commands/route.d.ts +12 -0
- package/dist/commands/route.js +261 -0
- package/dist/commands/routines.d.ts +2 -3
- package/dist/commands/routines.js +120 -145
- package/dist/commands/rules.js +1 -1
- package/dist/commands/run-account-picker.d.ts +1 -1
- package/dist/commands/run-account-picker.js +2 -2
- package/dist/commands/run-broadcast.d.ts +21 -0
- package/dist/commands/run-broadcast.js +89 -0
- package/dist/commands/run-cloud.js +1 -1
- package/dist/commands/secrets-vault.d.ts +10 -0
- package/dist/commands/{login.js → secrets-vault.js} +34 -14
- package/dist/commands/secrets.d.ts +4 -4
- package/dist/commands/secrets.js +72 -63
- package/dist/commands/sessions-backfill.js +1 -1
- package/dist/commands/sessions-browser.d.ts +1 -1
- package/dist/commands/sessions-browser.js +9 -5
- package/dist/commands/sessions-export.js +2 -2
- package/dist/commands/sessions-inject.js +4 -5
- package/dist/commands/sessions-migrate.js +16 -27
- package/dist/commands/sessions-picker.d.ts +13 -0
- package/dist/commands/sessions-picker.js +182 -8
- package/dist/commands/sessions-resume.d.ts +7 -3
- package/dist/commands/sessions-resume.js +81 -33
- package/dist/commands/sessions-stats.js +2 -2
- package/dist/commands/sessions.d.ts +75 -68
- package/dist/commands/sessions.js +142 -180
- package/dist/commands/setup-computer.js +1 -1
- package/dist/commands/setup-fleet.js +3 -0
- package/dist/commands/setup-mine.d.ts +7 -3
- package/dist/commands/setup-mine.js +13 -8
- package/dist/commands/setup-secrets.js +2 -2
- package/dist/commands/setup-watchdog.js +2 -2
- package/dist/commands/setup.js +7 -2
- package/dist/commands/share.d.ts +65 -0
- package/dist/commands/share.js +253 -20
- package/dist/commands/skills.js +3 -3
- package/dist/commands/snapshot.d.ts +2 -2
- package/dist/commands/snapshot.js +9 -9
- package/dist/commands/ssh.d.ts +1 -1
- package/dist/commands/ssh.js +318 -48
- package/dist/commands/subagents.js +1 -1
- package/dist/commands/sync.js +24 -9
- package/dist/commands/teams.d.ts +2 -2
- package/dist/commands/teams.js +9 -18
- package/dist/commands/tmux.js +5 -1
- package/dist/commands/trash.js +1 -1
- package/dist/commands/usage.d.ts +1 -1
- package/dist/commands/usage.js +2 -2
- package/dist/commands/utils.d.ts +4 -14
- package/dist/commands/utils.js +6 -27
- package/dist/commands/versions.js +2 -2
- package/dist/commands/view.d.ts +9 -77
- package/dist/commands/view.js +23 -8
- package/dist/commands/watchdog.js +1 -1
- package/dist/commands/webhook.js +11 -25
- package/dist/commands/workflows.js +1 -1
- package/dist/index.js +1 -1
- package/dist/lib/account-capabilities.d.ts +39 -0
- package/dist/lib/account-capabilities.js +59 -0
- package/dist/lib/account-catalog.js +1 -1
- package/dist/lib/account-registry.d.ts +66 -0
- package/dist/lib/account-registry.js +151 -5
- package/dist/lib/{rotate.d.ts → accounting/rotate.d.ts} +4 -4
- package/dist/lib/{rotate.js → accounting/rotate.js} +8 -8
- package/dist/lib/{usage.d.ts → accounting/usage.d.ts} +4 -4
- package/dist/lib/{usage.js → accounting/usage.js} +11 -11
- package/dist/lib/agent-spec/provider.js +1 -1
- package/dist/lib/agents.d.ts +72 -4
- package/dist/lib/agents.js +231 -199
- package/dist/lib/answer-router.d.ts +2 -2
- package/dist/lib/ask-classifier.d.ts +1 -1
- package/dist/lib/ask-classifier.js +1 -1
- package/dist/lib/audit/log.js +1 -1
- package/dist/lib/auth-health.d.ts +1 -1
- package/dist/lib/auth-health.js +2 -2
- package/dist/lib/brand.js +1 -1
- package/dist/lib/browser/caller-identity.d.ts +28 -0
- package/dist/lib/browser/caller-identity.js +156 -0
- package/dist/lib/browser/cdp.js +1 -1
- package/dist/lib/browser/drivers/ssh.d.ts +1 -1
- package/dist/lib/browser/drivers/ssh.js +2 -2
- package/dist/lib/browser/hygiene.d.ts +10 -2
- package/dist/lib/browser/hygiene.js +7 -4
- package/dist/lib/browser/ipc.d.ts +22 -2
- package/dist/lib/browser/ipc.js +185 -21
- package/dist/lib/browser/profiles.d.ts +67 -3
- package/dist/lib/browser/profiles.js +129 -7
- package/dist/lib/browser/remote-control.d.ts +2 -2
- package/dist/lib/browser/remote-control.js +3 -3
- package/dist/lib/browser/runtime-state.d.ts +79 -0
- package/dist/lib/browser/runtime-state.js +119 -1
- package/dist/lib/browser/service.d.ts +113 -1
- package/dist/lib/browser/service.js +454 -40
- package/dist/lib/browser/sessions-list.d.ts +2 -1
- package/dist/lib/browser/sessions-list.js +4 -13
- package/dist/lib/browser/types.d.ts +18 -0
- package/dist/lib/budget/config.js +1 -1
- package/dist/lib/budget/ledger.js +1 -1
- package/dist/lib/byok-usage.js +1 -1
- package/dist/lib/capabilities.js +3 -15
- package/dist/lib/catchup.d.ts +1 -1
- package/dist/lib/catchup.js +1 -1
- package/dist/lib/cloud/dispatch.js +1 -1
- package/dist/lib/cloud/host.d.ts +3 -3
- package/dist/lib/cloud/host.js +5 -5
- package/dist/lib/cloud/rush.d.ts +9 -21
- package/dist/lib/cloud/rush.js +33 -120
- package/dist/lib/cloud/types.d.ts +2 -2
- package/dist/lib/commands.js +3 -13
- package/dist/lib/computer/actions.d.ts +36 -0
- package/dist/lib/computer/actions.js +162 -0
- package/dist/lib/computer/dispatch.d.ts +2 -2
- package/dist/lib/computer/dispatch.js +2 -2
- package/dist/lib/computer/sessions-list.d.ts +3 -3
- package/dist/lib/computer/sessions-list.js +2 -2
- package/dist/lib/config-keys.d.ts +12 -3
- package/dist/lib/config-keys.js +29 -6
- package/dist/lib/config-machine-keys.d.ts +4 -2
- package/dist/lib/config-machine-keys.js +6 -2
- package/dist/lib/crabbox/lease.js +9 -1
- package/dist/lib/crabbox/runtimes.d.ts +32 -7
- package/dist/lib/crabbox/runtimes.js +72 -30
- package/dist/lib/{daemon.d.ts → daemon/daemon.d.ts} +59 -1
- package/dist/lib/{daemon.js → daemon/daemon.js} +237 -49
- package/dist/lib/daemon-services.d.ts +1 -1
- package/dist/lib/daemon-services.js +5 -0
- package/dist/lib/daemon-ticks.d.ts +25 -0
- package/dist/lib/daemon-ticks.js +31 -1
- package/dist/lib/daemon-webhooks.d.ts +102 -0
- package/dist/lib/daemon-webhooks.js +210 -0
- package/dist/lib/device-config.d.ts +116 -72
- package/dist/lib/device-config.js +366 -132
- package/dist/lib/devices/config-migration.d.ts +29 -34
- package/dist/lib/devices/config-migration.js +209 -130
- package/dist/lib/devices/connect.d.ts +2 -2
- package/dist/lib/devices/connect.js +2 -2
- package/dist/lib/devices/discovery-policy.d.ts +30 -0
- package/dist/lib/devices/discovery-policy.js +101 -0
- package/dist/lib/devices/fleet-inventory.js +8 -3
- package/dist/lib/devices/harness-inventory.d.ts +1 -1
- package/dist/lib/devices/harness-inventory.js +12 -3
- package/dist/lib/devices/known-hosts.js +1 -1
- package/dist/lib/devices/pool.d.ts +61 -0
- package/dist/lib/devices/pool.js +83 -0
- package/dist/lib/devices/registry.d.ts +1 -1
- package/dist/lib/devices/registry.js +1 -1
- package/dist/lib/devices/resolve-profile.d.ts +2 -2
- package/dist/lib/devices/resolve-profile.js +2 -2
- package/dist/lib/devices/resolve-target.d.ts +1 -1
- package/dist/lib/devices/resolve-target.js +4 -4
- package/dist/lib/devices/self-host.d.ts +1 -1
- package/dist/lib/devices/self-host.js +3 -3
- package/dist/lib/devices/ssh-config.d.ts +1 -1
- package/dist/lib/devices/stats-cache.js +1 -1
- package/dist/lib/devices/sync.d.ts +3 -1
- package/dist/lib/devices/sync.js +3 -3
- package/dist/lib/doctor-diff.js +4 -4
- package/dist/lib/drift-sync.js +2 -2
- package/dist/lib/drift.js +2 -2
- package/dist/lib/event-families.d.ts +1 -1
- package/dist/lib/event-stream.d.ts +1 -1
- package/dist/lib/event-stream.js +2 -2
- package/dist/lib/events-ingest.js +2 -2
- package/dist/lib/exec.d.ts +8 -5
- package/dist/lib/exec.js +19 -13
- package/dist/lib/factory/snapshot.d.ts +1 -1
- package/dist/lib/factory/snapshot.js +1 -1
- package/dist/lib/{activity.d.ts → feed/activity.d.ts} +1 -1
- package/dist/lib/{activity.js → feed/activity.js} +7 -7
- package/dist/lib/{events.d.ts → feed/events.d.ts} +2 -2
- package/dist/lib/{events.js → feed/events.js} +5 -5
- package/dist/lib/{feed.js → feed/feed.js} +4 -4
- package/dist/lib/feed-outcome.d.ts +1 -1
- package/dist/lib/feed-policy.d.ts +1 -1
- package/dist/lib/feed-policy.js +1 -1
- package/dist/lib/feed-post.d.ts +1 -1
- package/dist/lib/feed-post.js +1 -1
- package/dist/lib/feed-ranking.d.ts +1 -1
- package/dist/lib/fleet/apply.d.ts +0 -6
- package/dist/lib/fleet/apply.js +18 -45
- package/dist/lib/fleet/auth-sync.d.ts +16 -35
- package/dist/lib/fleet/auth-sync.js +16 -75
- package/dist/lib/fleet/capture.js +8 -6
- package/dist/lib/fleet/manifest.js +23 -11
- package/dist/lib/fleet/types.d.ts +19 -7
- package/dist/lib/fleet-cache.d.ts +1 -1
- package/dist/lib/fleet-cache.js +1 -1
- package/dist/lib/format.d.ts +19 -0
- package/dist/lib/format.js +44 -1
- package/dist/lib/friction-heuristics.d.ts +1 -1
- package/dist/lib/git.d.ts +24 -1
- package/dist/lib/git.js +82 -38
- package/dist/lib/heal.js +3 -3
- package/dist/lib/hooks.d.ts +18 -0
- package/dist/lib/hooks.js +113 -1
- package/dist/lib/hosts/credentials.d.ts +30 -10
- package/dist/lib/hosts/credentials.js +38 -26
- package/dist/lib/hosts/dispatch.d.ts +3 -3
- package/dist/lib/hosts/dispatch.js +3 -3
- package/dist/lib/hosts/option.d.ts +3 -3
- package/dist/lib/hosts/option.js +7 -8
- package/dist/lib/hosts/passthrough.d.ts +17 -17
- package/dist/lib/hosts/passthrough.js +67 -50
- package/dist/lib/hosts/providers/devices.d.ts +1 -1
- package/dist/lib/hosts/providers/devices.js +1 -1
- package/dist/lib/hosts/reconcile.d.ts +1 -1
- package/dist/lib/hosts/reconcile.js +1 -1
- package/dist/lib/hosts/reconnect.d.ts +1 -1
- package/dist/lib/hosts/reconnect.js +2 -2
- package/dist/lib/hosts/registry.d.ts +5 -5
- package/dist/lib/hosts/registry.js +5 -5
- package/dist/lib/hosts/remote-cmd.d.ts +10 -10
- package/dist/lib/hosts/remote-cmd.js +25 -18
- package/dist/lib/hosts/remote-os.d.ts +4 -4
- package/dist/lib/hosts/remote-os.js +4 -4
- package/dist/lib/hosts/remote-session-id.d.ts +2 -2
- package/dist/lib/hosts/remote-session-id.js +2 -2
- package/dist/lib/hosts/routing-flag.d.ts +3 -3
- package/dist/lib/hosts/routing-flag.js +4 -5
- package/dist/lib/hosts/run-target.d.ts +4 -4
- package/dist/lib/hosts/run-target.js +4 -4
- package/dist/lib/hosts/session-index.d.ts +2 -2
- package/dist/lib/hosts/session-index.js +1 -1
- package/dist/lib/hosts/session-marker.d.ts +1 -1
- package/dist/lib/hosts/session-marker.js +1 -1
- package/dist/lib/hosts/types.d.ts +2 -2
- package/dist/lib/hosts/types.js +2 -2
- package/dist/lib/import.js +1 -1
- package/dist/lib/{migrate.d.ts → installations/migrate.d.ts} +49 -1
- package/dist/lib/{migrate.js → installations/migrate.js} +265 -38
- package/dist/lib/installations/resolve.js +1 -1
- package/dist/lib/installations/strategies.js +1 -1
- package/dist/lib/installations/update.js +2 -2
- package/dist/lib/{versions.d.ts → installations/versions.d.ts} +12 -3
- package/dist/lib/{versions.js → installations/versions.js} +51 -31
- package/dist/lib/isolation-boundary-report.js +1 -1
- package/dist/lib/linear-projects.d.ts +28 -0
- package/dist/lib/linear-projects.js +30 -0
- package/dist/lib/loop.js +1 -1
- package/dist/lib/mailbox-gc.js +1 -1
- package/dist/lib/mailbox.js +1 -1
- package/dist/lib/mcp-registry.d.ts +62 -0
- package/dist/lib/mcp-registry.js +177 -0
- package/dist/lib/mcp.d.ts +5 -0
- package/dist/lib/mcp.js +124 -307
- package/dist/lib/menubar/MenubarHelper.app/Contents/CodeResources +0 -0
- package/dist/lib/menubar/MenubarHelper.app/Contents/MacOS/MenubarHelper +0 -0
- package/dist/lib/menubar/install-menubar.d.ts +7 -0
- package/dist/lib/menubar/install-menubar.js +24 -6
- package/dist/lib/menubar/snapshot.d.ts +7 -0
- package/dist/lib/menubar/snapshot.js +8 -6
- package/dist/lib/models.js +1 -1
- package/dist/lib/monitors/config.d.ts +12 -0
- package/dist/lib/monitors/config.js +3 -0
- package/dist/lib/monitors/dispatch.js +26 -5
- package/dist/lib/monitors/engine.js +10 -0
- package/dist/lib/monitors/sources/webhook.d.ts +1 -1
- package/dist/lib/monitors/state.d.ts +42 -0
- package/dist/lib/monitors/state.js +30 -0
- package/dist/lib/notify.d.ts +1 -1
- package/dist/lib/observe-aliases.d.ts +2 -2
- package/dist/lib/observe-aliases.js +2 -11
- package/dist/lib/output/git-output.js +2 -2
- package/dist/lib/overdue.d.ts +1 -1
- package/dist/lib/overdue.js +1 -1
- package/dist/lib/permissions-registry.d.ts +65 -0
- package/dist/lib/permissions-registry.js +599 -0
- package/dist/lib/permissions.d.ts +24 -13
- package/dist/lib/permissions.js +52 -271
- package/dist/lib/picker.d.ts +16 -0
- package/dist/lib/picker.js +33 -3
- package/dist/lib/placement.d.ts +1 -1
- package/dist/lib/placement.js +4 -4
- package/dist/lib/platform/paths.d.ts +8 -0
- package/dist/lib/platform/paths.js +11 -0
- package/dist/lib/platform/posixpath.js +3 -3
- package/dist/lib/{plugin-marketplace.d.ts → plugins/plugin-marketplace.d.ts} +1 -1
- package/dist/lib/{plugin-marketplace.js → plugins/plugin-marketplace.js} +2 -2
- package/dist/lib/{plugins.d.ts → plugins/plugins.d.ts} +1 -1
- package/dist/lib/{plugins.js → plugins/plugins.js} +7 -7
- package/dist/lib/{skills.d.ts → plugins/skills.d.ts} +1 -1
- package/dist/lib/{skills.js → plugins/skills.js} +7 -7
- package/dist/lib/pricing/cost.d.ts +1 -1
- package/dist/lib/pricing/cost.js +1 -1
- package/dist/lib/profiles-presets.d.ts +1 -1
- package/dist/lib/profiles-presets.js +1 -1
- package/dist/lib/profiles.js +2 -2
- package/dist/lib/project-import.js +4 -1
- package/dist/lib/project-launch.d.ts +1 -1
- package/dist/lib/project-launch.js +3 -3
- package/dist/lib/project-pull.d.ts +128 -0
- package/dist/lib/project-pull.js +384 -0
- package/dist/lib/project-root.d.ts +2 -2
- package/dist/lib/project-root.js +2 -2
- package/dist/lib/project-status.js +1 -1
- package/dist/lib/projects.d.ts +23 -0
- package/dist/lib/projects.js +29 -6
- package/dist/lib/refresh.d.ts +12 -1
- package/dist/lib/refresh.js +16 -9
- package/dist/lib/registry.d.ts +9 -2
- package/dist/lib/registry.js +11 -4
- package/dist/lib/resources.d.ts +2 -2
- package/dist/lib/resources.js +2 -2
- package/dist/lib/routers.d.ts +81 -0
- package/dist/lib/routers.js +153 -0
- package/dist/lib/routine-context.d.ts +1 -0
- package/dist/lib/routine-context.js +7 -2
- package/dist/lib/routine-notify-owner.d.ts +1 -1
- package/dist/lib/routine-notify.d.ts +1 -1
- package/dist/lib/routine-notify.js +1 -1
- package/dist/lib/routine-process-cleanup.d.ts +1 -1
- package/dist/lib/routine-readiness.d.ts +1 -1
- package/dist/lib/routine-readiness.js +11 -4
- package/dist/lib/routines-placement.d.ts +12 -2
- package/dist/lib/routines-placement.js +20 -3
- package/dist/lib/routines-project.d.ts +1 -1
- package/dist/lib/routines-project.js +1 -1
- package/dist/lib/rules/compile.d.ts +1 -0
- package/dist/lib/rules/compile.js +10 -2
- package/dist/lib/rules/rules.js +1 -1
- package/dist/lib/run-notify.js +1 -1
- package/dist/lib/runner.d.ts +80 -2
- package/dist/lib/runner.js +241 -62
- package/dist/lib/sandbox.d.ts +1 -1
- package/dist/lib/scheduler.d.ts +1 -1
- package/dist/lib/scheduler.js +1 -1
- package/dist/lib/{routines.d.ts → scheduling/routines.d.ts} +54 -9
- package/dist/lib/{routines.js → scheduling/routines.js} +173 -14
- package/dist/lib/secrets/Agents CLI.app/Contents/CodeResources +0 -0
- package/dist/lib/secrets/Agents CLI.app/Contents/MacOS/Agents CLI +0 -0
- package/dist/lib/secrets/agent.js +2 -2
- package/dist/lib/secrets/audit.js +1 -1
- package/dist/lib/secrets/bundles.d.ts +3 -3
- package/dist/lib/secrets/bundles.js +7 -7
- package/dist/lib/secrets/index.js +1 -1
- package/dist/lib/secrets/list-filter.d.ts +1 -1
- package/dist/lib/secrets/list-filter.js +2 -2
- package/dist/lib/secrets/push.d.ts +1 -1
- package/dist/lib/secrets/push.js +10 -12
- package/dist/lib/secrets/remote.d.ts +12 -10
- package/dist/lib/secrets/remote.js +21 -14
- package/dist/lib/secrets/vault.js +2 -2
- package/dist/lib/self-heal/checks/shadowing.js +1 -1
- package/dist/lib/self-heal/checks/shims.js +1 -1
- package/dist/lib/self-update.d.ts +39 -4
- package/dist/lib/self-update.js +78 -25
- package/dist/lib/serve/control.d.ts +1 -1
- package/dist/lib/serve/control.js +4 -4
- package/dist/lib/serve/data.d.ts +1 -1
- package/dist/lib/serve/data.js +1 -1
- package/dist/lib/serve/stream.js +1 -1
- package/dist/lib/service-manifest.d.ts +29 -0
- package/dist/lib/service-manifest.js +80 -0
- package/dist/lib/session/active.d.ts +59 -7
- package/dist/lib/session/active.js +158 -17
- package/dist/lib/session/bash-command.js +1 -1
- package/dist/lib/session/claude-accounts.d.ts +1 -1
- package/dist/lib/session/claude-accounts.js +1 -1
- package/dist/lib/session/db.d.ts +10 -2
- package/dist/lib/session/db.js +25 -6
- package/dist/lib/session/discover.d.ts +77 -0
- package/dist/lib/session/discover.js +130 -25
- package/dist/lib/session/fork.js +1 -1
- package/dist/lib/session/inject.d.ts +1 -1
- package/dist/lib/session/insights.d.ts +1 -1
- package/dist/lib/session/insights.js +1 -1
- package/dist/lib/session/live-metadata.d.ts +15 -0
- package/dist/lib/session/live-metadata.js +76 -0
- package/dist/lib/session/migrate-targets.d.ts +1 -1
- package/dist/lib/session/recovery.d.ts +1 -1
- package/dist/lib/session/recovery.js +2 -2
- package/dist/lib/session/remote-active.d.ts +10 -1
- package/dist/lib/session/remote-active.js +8 -3
- package/dist/lib/session/remote-bundle.d.ts +1 -1
- package/dist/lib/session/remote-bundle.js +2 -2
- package/dist/lib/session/remote-list.d.ts +15 -4
- package/dist/lib/session/remote-list.js +40 -3
- package/dist/lib/session/remote.d.ts +5 -5
- package/dist/lib/session/remote.js +13 -17
- package/dist/lib/session/resume-command.d.ts +3 -2
- package/dist/lib/session/resume-command.js +4 -3
- package/dist/lib/session/resume-owner.d.ts +3 -3
- package/dist/lib/session/resume-owner.js +3 -3
- package/dist/lib/session/session-cache.d.ts +12 -0
- package/dist/lib/session/session-cache.js +2 -0
- package/dist/lib/session/shell-programs.js +1 -1
- package/dist/lib/session/state.js +5 -5
- package/dist/lib/session/team-filter.d.ts +1 -1
- package/dist/lib/session/team-filter.js +1 -1
- package/dist/lib/session/types.d.ts +3 -3
- package/dist/lib/session/width.d.ts +2 -2
- package/dist/lib/session/width.js +2 -2
- package/dist/lib/share/delete.d.ts +21 -0
- package/dist/lib/share/delete.js +42 -0
- package/dist/lib/share/publish.d.ts +82 -0
- package/dist/lib/share/publish.js +170 -18
- package/dist/lib/share/worker-template.js +172 -9
- package/dist/lib/shims.js +35 -7
- package/dist/lib/smart-launch.d.ts +36 -6
- package/dist/lib/smart-launch.js +65 -8
- package/dist/lib/snapshot.d.ts +4 -4
- package/dist/lib/snapshot.js +2 -2
- package/dist/lib/ssh-exec.d.ts +1 -1
- package/dist/lib/ssh-exec.js +2 -2
- package/dist/lib/ssh-tunnel.d.ts +10 -10
- package/dist/lib/ssh-tunnel.js +12 -12
- package/dist/lib/staleness/checkers/hooks.d.ts +1 -1
- package/dist/lib/staleness/checkers/hooks.js +1 -1
- package/dist/lib/staleness/detectors/permissions.js +0 -23
- package/dist/lib/staleness/detectors/plugins.js +1 -1
- package/dist/lib/staleness/fingerprint.js +1 -1
- package/dist/lib/staleness/layers.d.ts +1 -1
- package/dist/lib/staleness/layers.js +1 -1
- package/dist/lib/staleness/writers/mcp.js +3 -1
- package/dist/lib/staleness/writers/plugins.js +1 -1
- package/dist/lib/staleness/writers/types.d.ts +8 -0
- package/dist/lib/startup/command-registry.d.ts +5 -147
- package/dist/lib/startup/command-registry.js +38 -303
- package/dist/lib/startup/dev-build.d.ts +0 -21
- package/dist/lib/startup/dev-build.js +29 -8
- package/dist/lib/state.d.ts +19 -1
- package/dist/lib/state.js +120 -51
- package/dist/lib/subagents.js +1 -1
- package/dist/lib/sync-status.js +1 -1
- package/dist/lib/sync-umbrella.d.ts +6 -1
- package/dist/lib/sync-umbrella.js +9 -4
- package/dist/lib/teams/agents.js +2 -2
- package/dist/lib/teams/registry.js +1 -1
- package/dist/lib/terminal/backends/vscodium-agent.js +1 -1
- package/dist/lib/terminal/engine.js +1 -1
- package/dist/lib/terminal/index.d.ts +4 -0
- package/dist/lib/terminal/index.js +3 -0
- package/dist/lib/terminal/inject.d.ts +2 -2
- package/dist/lib/terminal/inject.js +2 -2
- package/dist/lib/terminal/transport.js +1 -1
- package/dist/lib/tmux/index.d.ts +1 -1
- package/dist/lib/tmux/index.js +1 -1
- package/dist/lib/tmux/session.d.ts +21 -5
- package/dist/lib/tmux/session.js +76 -22
- package/dist/lib/triggers/handlers.d.ts +1 -1
- package/dist/lib/triggers/handlers.js +2 -2
- package/dist/lib/triggers/webhook.d.ts +36 -2
- package/dist/lib/triggers/webhook.js +97 -42
- package/dist/lib/types.d.ts +18 -6
- package/dist/lib/usage-fleet.d.ts +1 -1
- package/dist/lib/usage-fleet.js +1 -1
- package/dist/lib/usage-refresh.d.ts +1 -1
- package/dist/lib/usage-refresh.js +3 -3
- package/dist/lib/version-duplicates.js +2 -2
- package/dist/lib/view-types.d.ts +56 -0
- package/dist/lib/view-types.js +1 -0
- package/dist/lib/watchdog/rotate.d.ts +2 -2
- package/dist/lib/watchdog/rotate.js +3 -3
- package/dist/lib/watchdog/runner.d.ts +2 -3
- package/dist/lib/watchdog/runner.js +3 -4
- package/dist/lib/workflows.js +1 -1
- package/package.json +2 -1
- package/scripts/postinstall.js +2 -2
- package/dist/commands/bench.d.ts +0 -2
- package/dist/commands/bench.js +0 -101
- package/dist/commands/cp.d.ts +0 -84
- package/dist/commands/cp.js +0 -231
- package/dist/commands/login.d.ts +0 -2
- package/dist/lib/resources/commands.d.ts +0 -46
- package/dist/lib/resources/commands.js +0 -211
- package/dist/lib/resources/hooks.d.ts +0 -16
- package/dist/lib/resources/hooks.js +0 -153
- package/dist/lib/resources/mcp.d.ts +0 -34
- package/dist/lib/resources/mcp.js +0 -250
- package/dist/lib/resources/memory.d.ts +0 -15
- package/dist/lib/resources/memory.js +0 -46
- package/dist/lib/resources/permissions.d.ts +0 -13
- package/dist/lib/resources/permissions.js +0 -202
- package/dist/lib/resources/rules.d.ts +0 -46
- package/dist/lib/resources/rules.js +0 -179
- package/dist/lib/resources/skills.d.ts +0 -37
- package/dist/lib/resources/skills.js +0 -247
- package/dist/lib/resources/subagents.d.ts +0 -46
- package/dist/lib/resources/subagents.js +0 -202
- /package/dist/lib/{feed.d.ts → feed/feed.d.ts} +0 -0
package/dist/lib/permissions.js
CHANGED
|
@@ -17,6 +17,10 @@ import { safeJoin } from './paths.js';
|
|
|
17
17
|
import { agentConfigDirName } from './agents.js';
|
|
18
18
|
import { supports } from './capabilities.js';
|
|
19
19
|
import { updateGeminiSettings } from './gemini-settings.js';
|
|
20
|
+
// The canonical<->native tool vocabularies live in the registry, which also owns
|
|
21
|
+
// the reverse projections — so the serializers below and the readers there can
|
|
22
|
+
// never disagree about what `fs_read` or `developer__shell` means.
|
|
23
|
+
import { ANTIGRAVITY_ACTION_BY_TOOL, CANONICAL_TO_OPENCLAW_TOOL, stripJsonComments, GROK_TOOL_BY_CANONICAL, KIRO_CAPABILITY_BY_TOOL, PERMISSION_TARGETS, readCanonicalPermissions, } from './permissions-registry.js';
|
|
20
24
|
const HOME = os.homedir();
|
|
21
25
|
// PERMISSIONS_CAPABLE_AGENTS removed — use `capableAgents('allowlist')`
|
|
22
26
|
// from lib/capabilities.ts. The capability matrix on AgentConfig is the
|
|
@@ -622,19 +626,6 @@ export function convertToDroidFormat(set) {
|
|
|
622
626
|
commandDenylist: commands(set.deny ?? []),
|
|
623
627
|
};
|
|
624
628
|
}
|
|
625
|
-
/**
|
|
626
|
-
* Canonical tool -> OpenClaw tool id. OpenClaw gates at TOOL granularity only
|
|
627
|
-
* (no sub-command/path/domain patterns), so only these whole-tool ids exist.
|
|
628
|
-
* Any canonical tool not in this map is unsupported and skipped.
|
|
629
|
-
*/
|
|
630
|
-
const CANONICAL_TO_OPENCLAW_TOOL = {
|
|
631
|
-
bash: 'exec',
|
|
632
|
-
read: 'read',
|
|
633
|
-
write: 'write',
|
|
634
|
-
edit: 'write',
|
|
635
|
-
webfetch: 'web_fetch',
|
|
636
|
-
websearch: 'web_search',
|
|
637
|
-
};
|
|
638
629
|
/**
|
|
639
630
|
* Convert canonical permission set to OpenClaw's `tools.alsoAllow`/`tools.deny`.
|
|
640
631
|
*
|
|
@@ -740,55 +731,6 @@ function serializeAntigravityEntries(perms) {
|
|
|
740
731
|
}
|
|
741
732
|
return Array.from(out);
|
|
742
733
|
}
|
|
743
|
-
const ANTIGRAVITY_ACTION_BY_TOOL = {
|
|
744
|
-
bash: 'command',
|
|
745
|
-
read: 'read_file',
|
|
746
|
-
write: 'write_file',
|
|
747
|
-
webfetch: 'read_url',
|
|
748
|
-
};
|
|
749
|
-
const GOOSE_TOOL_BY_CANONICAL = {
|
|
750
|
-
bash: 'developer__shell',
|
|
751
|
-
read: 'developer__text_editor',
|
|
752
|
-
write: 'developer__text_editor',
|
|
753
|
-
edit: 'developer__text_editor',
|
|
754
|
-
grep: 'developer__analyze',
|
|
755
|
-
glob: 'developer__analyze',
|
|
756
|
-
webfetch: 'developer__fetch',
|
|
757
|
-
mcp: undefined,
|
|
758
|
-
};
|
|
759
|
-
function canonicalToGooseTool(permission) {
|
|
760
|
-
if (BLANKET_BASH_FORMS.has(permission))
|
|
761
|
-
return 'developer__shell';
|
|
762
|
-
const parsed = parseCanonicalPattern(permission);
|
|
763
|
-
if (!parsed)
|
|
764
|
-
return null;
|
|
765
|
-
return GOOSE_TOOL_BY_CANONICAL[parsed.tool] ?? null;
|
|
766
|
-
}
|
|
767
|
-
/** Convert canonical permissions to Goose's per-tool permission.yaml shape. */
|
|
768
|
-
export function convertToGooseFormat(set) {
|
|
769
|
-
const alwaysAllow = new Set();
|
|
770
|
-
const neverAllow = new Set();
|
|
771
|
-
for (const permission of set.allow) {
|
|
772
|
-
const tool = canonicalToGooseTool(permission);
|
|
773
|
-
if (tool)
|
|
774
|
-
alwaysAllow.add(tool);
|
|
775
|
-
}
|
|
776
|
-
for (const permission of set.deny ?? []) {
|
|
777
|
-
const tool = canonicalToGooseTool(permission);
|
|
778
|
-
if (tool)
|
|
779
|
-
neverAllow.add(tool);
|
|
780
|
-
}
|
|
781
|
-
for (const tool of neverAllow) {
|
|
782
|
-
alwaysAllow.delete(tool);
|
|
783
|
-
}
|
|
784
|
-
return {
|
|
785
|
-
user: {
|
|
786
|
-
always_allow: Array.from(alwaysAllow).sort(),
|
|
787
|
-
ask_before: [],
|
|
788
|
-
never_allow: Array.from(neverAllow).sort(),
|
|
789
|
-
},
|
|
790
|
-
};
|
|
791
|
-
}
|
|
792
734
|
/**
|
|
793
735
|
* Convert canonical permission set to Grok format.
|
|
794
736
|
* Grok reads ~/.grok/config.toml with
|
|
@@ -813,13 +755,6 @@ export function convertToGrokFormat(set) {
|
|
|
813
755
|
}
|
|
814
756
|
return { permission: { rules } };
|
|
815
757
|
}
|
|
816
|
-
const GROK_TOOL_BY_CANONICAL = {
|
|
817
|
-
bash: 'bash',
|
|
818
|
-
read: 'read',
|
|
819
|
-
write: 'edit',
|
|
820
|
-
grep: 'grep',
|
|
821
|
-
webfetch: 'webfetch',
|
|
822
|
-
};
|
|
823
758
|
function canonicalToGrokRule(perm, action) {
|
|
824
759
|
if (BLANKET_BASH_FORMS.has(perm)) {
|
|
825
760
|
return { action, tool: 'bash', pattern: '*' };
|
|
@@ -873,20 +808,6 @@ function canonicalToKiroRule(perm, effect) {
|
|
|
873
808
|
: parsed.pattern;
|
|
874
809
|
return { capability, effect, match: [pattern] };
|
|
875
810
|
}
|
|
876
|
-
const KIRO_CAPABILITY_BY_TOOL = {
|
|
877
|
-
bash: 'shell',
|
|
878
|
-
read: 'fs_read',
|
|
879
|
-
grep: 'fs_read',
|
|
880
|
-
glob: 'fs_read',
|
|
881
|
-
write: 'fs_write',
|
|
882
|
-
edit: 'fs_write',
|
|
883
|
-
notebookedit: 'fs_write',
|
|
884
|
-
webfetch: 'web_fetch',
|
|
885
|
-
websearch: 'web_search',
|
|
886
|
-
mcp: 'mcp',
|
|
887
|
-
subagent: 'subagent',
|
|
888
|
-
skill: 'skill',
|
|
889
|
-
};
|
|
890
811
|
/**
|
|
891
812
|
* Parse a canonical permission string preserving the tool's original casing.
|
|
892
813
|
* `parseCanonicalPattern` lowercases the tool name, which is fine for Grok
|
|
@@ -1100,56 +1021,6 @@ export function convertToCodexFormat(set, cwd) {
|
|
|
1100
1021
|
// ============================================================================
|
|
1101
1022
|
// Read agent permissions from native configs
|
|
1102
1023
|
// ============================================================================
|
|
1103
|
-
/**
|
|
1104
|
-
* Strip JSON comments for JSONC parsing.
|
|
1105
|
-
*/
|
|
1106
|
-
function stripJsonComments(content) {
|
|
1107
|
-
let result = '';
|
|
1108
|
-
let inString = false;
|
|
1109
|
-
let escape = false;
|
|
1110
|
-
let i = 0;
|
|
1111
|
-
while (i < content.length) {
|
|
1112
|
-
const char = content[i];
|
|
1113
|
-
const next = content[i + 1];
|
|
1114
|
-
if (escape) {
|
|
1115
|
-
result += char;
|
|
1116
|
-
escape = false;
|
|
1117
|
-
i++;
|
|
1118
|
-
continue;
|
|
1119
|
-
}
|
|
1120
|
-
if (char === '\\' && inString) {
|
|
1121
|
-
result += char;
|
|
1122
|
-
escape = true;
|
|
1123
|
-
i++;
|
|
1124
|
-
continue;
|
|
1125
|
-
}
|
|
1126
|
-
if (char === '"') {
|
|
1127
|
-
inString = !inString;
|
|
1128
|
-
result += char;
|
|
1129
|
-
i++;
|
|
1130
|
-
continue;
|
|
1131
|
-
}
|
|
1132
|
-
if (!inString) {
|
|
1133
|
-
if (char === '/' && next === '/') {
|
|
1134
|
-
while (i < content.length && content[i] !== '\n') {
|
|
1135
|
-
i++;
|
|
1136
|
-
}
|
|
1137
|
-
continue;
|
|
1138
|
-
}
|
|
1139
|
-
if (char === '/' && next === '*') {
|
|
1140
|
-
i += 2;
|
|
1141
|
-
while (i < content.length && !(content[i] === '*' && content[i + 1] === '/')) {
|
|
1142
|
-
i++;
|
|
1143
|
-
}
|
|
1144
|
-
i += 2;
|
|
1145
|
-
continue;
|
|
1146
|
-
}
|
|
1147
|
-
}
|
|
1148
|
-
result += char;
|
|
1149
|
-
i++;
|
|
1150
|
-
}
|
|
1151
|
-
return result;
|
|
1152
|
-
}
|
|
1153
1024
|
/**
|
|
1154
1025
|
* Read Claude's current permissions from settings.json.
|
|
1155
1026
|
*/
|
|
@@ -1238,7 +1109,17 @@ function readCodexPermissions(scope = 'user', cwd, options) {
|
|
|
1238
1109
|
}
|
|
1239
1110
|
}
|
|
1240
1111
|
/**
|
|
1241
|
-
* Read agent
|
|
1112
|
+
* Read an agent's currently installed permissions.
|
|
1113
|
+
*
|
|
1114
|
+
* claude/opencode/codex return their NATIVE shape, because `agents permissions
|
|
1115
|
+
* list` renders those three specially — Codex especially, whose config records a
|
|
1116
|
+
* sandbox mode rather than a rule list, so its own fields say more than the
|
|
1117
|
+
* blanket grants that mode widens into.
|
|
1118
|
+
*
|
|
1119
|
+
* Every other allowlist-capable harness returns the canonical `PermissionSet`
|
|
1120
|
+
* that `PERMISSION_TARGETS` reads back. Before RUSH-2676 they returned `null`,
|
|
1121
|
+
* so permissions written for cursor, antigravity, grok, kimi, droid,
|
|
1122
|
+
* copilot, kiro, openclaw and hermes were reported as absent.
|
|
1242
1123
|
*/
|
|
1243
1124
|
export function readAgentPermissions(agentId, scope = 'user', cwd, options) {
|
|
1244
1125
|
switch (agentId) {
|
|
@@ -1249,7 +1130,7 @@ export function readAgentPermissions(agentId, scope = 'user', cwd, options) {
|
|
|
1249
1130
|
case 'codex':
|
|
1250
1131
|
return readCodexPermissions(scope, cwd, options);
|
|
1251
1132
|
default:
|
|
1252
|
-
return
|
|
1133
|
+
return readCanonicalPermissions(agentId, scope, cwd, options?.home);
|
|
1253
1134
|
}
|
|
1254
1135
|
}
|
|
1255
1136
|
// ============================================================================
|
|
@@ -1582,47 +1463,6 @@ export function applyPermissionsToVersion(agentId, set, versionHome, merge = tru
|
|
|
1582
1463
|
fs.writeFileSync(configPath, TOML.stringify(config), 'utf-8');
|
|
1583
1464
|
return { success: true };
|
|
1584
1465
|
}
|
|
1585
|
-
if (agentId === 'goose') {
|
|
1586
|
-
const permissionsPath = path.join(versionHome, '.config', 'goose', 'permission.yaml');
|
|
1587
|
-
let config = {};
|
|
1588
|
-
if (fs.existsSync(permissionsPath)) {
|
|
1589
|
-
const parsed = yaml.parse(fs.readFileSync(permissionsPath, 'utf-8'));
|
|
1590
|
-
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
1591
|
-
config = parsed;
|
|
1592
|
-
}
|
|
1593
|
-
}
|
|
1594
|
-
const converted = convertToGooseFormat(set).user;
|
|
1595
|
-
const user = (typeof config.user === 'object' && config.user !== null && !Array.isArray(config.user))
|
|
1596
|
-
? config.user
|
|
1597
|
-
: {};
|
|
1598
|
-
const currentAlways = Array.isArray(user.always_allow) ? user.always_allow.filter((v) => typeof v === 'string') : [];
|
|
1599
|
-
const currentAsk = Array.isArray(user.ask_before) ? user.ask_before.filter((v) => typeof v === 'string') : [];
|
|
1600
|
-
const currentNever = Array.isArray(user.never_allow) ? user.never_allow.filter((v) => typeof v === 'string') : [];
|
|
1601
|
-
if (merge) {
|
|
1602
|
-
const incomingAlways = new Set(converted.always_allow);
|
|
1603
|
-
const incomingNever = new Set(converted.never_allow);
|
|
1604
|
-
const touched = new Set([...incomingAlways, ...incomingNever]);
|
|
1605
|
-
const always = new Set(currentAlways.filter(tool => !touched.has(tool)));
|
|
1606
|
-
const ask = new Set(currentAsk.filter(tool => !touched.has(tool)));
|
|
1607
|
-
const never = new Set(currentNever.filter(tool => !touched.has(tool)));
|
|
1608
|
-
for (const tool of incomingAlways)
|
|
1609
|
-
always.add(tool);
|
|
1610
|
-
for (const tool of incomingNever)
|
|
1611
|
-
never.add(tool);
|
|
1612
|
-
user.always_allow = Array.from(always).sort();
|
|
1613
|
-
user.ask_before = Array.from(ask).sort();
|
|
1614
|
-
user.never_allow = Array.from(never).sort();
|
|
1615
|
-
}
|
|
1616
|
-
else {
|
|
1617
|
-
user.always_allow = converted.always_allow;
|
|
1618
|
-
user.ask_before = converted.ask_before;
|
|
1619
|
-
user.never_allow = converted.never_allow;
|
|
1620
|
-
}
|
|
1621
|
-
config.user = user;
|
|
1622
|
-
fs.mkdirSync(path.dirname(permissionsPath), { recursive: true });
|
|
1623
|
-
fs.writeFileSync(permissionsPath, yaml.stringify(config), 'utf-8');
|
|
1624
|
-
return { success: true };
|
|
1625
|
-
}
|
|
1626
1466
|
if (agentId === 'kimi') {
|
|
1627
1467
|
const configPath = path.join(versionHome, '.kimi-code', 'config.toml');
|
|
1628
1468
|
let config = {};
|
|
@@ -1918,109 +1758,50 @@ export function codexToCanonical(perms) {
|
|
|
1918
1758
|
};
|
|
1919
1759
|
}
|
|
1920
1760
|
/**
|
|
1921
|
-
* Export
|
|
1761
|
+
* Export permissions from a specific config file path to canonical format,
|
|
1762
|
+
* auto-detecting the harness from the path.
|
|
1763
|
+
*
|
|
1764
|
+
* Detection walks `PERMISSION_TARGETS` and matches each harness's own declared
|
|
1765
|
+
* filename + parent directory, so it covers all 13 rather than the three
|
|
1766
|
+
* hardcoded `.claude`/`.opencode`/`.codex` fragments it used to know about.
|
|
1922
1767
|
*/
|
|
1923
|
-
function
|
|
1924
|
-
|
|
1925
|
-
if (!perms)
|
|
1768
|
+
export function exportPermissionsFromPath(filePath) {
|
|
1769
|
+
if (!fs.existsSync(filePath))
|
|
1926
1770
|
return null;
|
|
1927
|
-
|
|
1928
|
-
|
|
1929
|
-
|
|
1930
|
-
|
|
1931
|
-
return openCodeToCanonical(perms);
|
|
1932
|
-
case 'codex':
|
|
1933
|
-
return codexToCanonical(perms);
|
|
1934
|
-
default:
|
|
1935
|
-
return null;
|
|
1936
|
-
}
|
|
1771
|
+
const agentId = detectPermissionAgentFromPath(filePath);
|
|
1772
|
+
if (!agentId)
|
|
1773
|
+
return null;
|
|
1774
|
+
return PERMISSION_TARGETS[agentId].toCanonical(filePath);
|
|
1937
1775
|
}
|
|
1938
1776
|
/**
|
|
1939
|
-
*
|
|
1940
|
-
*
|
|
1777
|
+
* Which harness owns `filePath`, by comparing against the trailing path segments
|
|
1778
|
+
* each registry target declares. Longer (more specific) suffixes win, so
|
|
1779
|
+
* `.kiro/settings/permissions.yaml` is never mistaken for a bare `permissions.yaml`.
|
|
1941
1780
|
*/
|
|
1942
|
-
export function
|
|
1943
|
-
|
|
1944
|
-
|
|
1945
|
-
|
|
1946
|
-
|
|
1947
|
-
|
|
1948
|
-
|
|
1949
|
-
|
|
1950
|
-
|
|
1951
|
-
|
|
1952
|
-
|
|
1953
|
-
|
|
1954
|
-
|
|
1955
|
-
|
|
1956
|
-
|
|
1957
|
-
|
|
1958
|
-
|
|
1959
|
-
|
|
1960
|
-
|
|
1961
|
-
|
|
1962
|
-
}
|
|
1963
|
-
else if (filePath.includes('.opencode')) {
|
|
1964
|
-
agentId = 'opencode';
|
|
1965
|
-
}
|
|
1966
|
-
else if (filePath.includes('.codex')) {
|
|
1967
|
-
agentId = 'codex';
|
|
1968
|
-
}
|
|
1969
|
-
if (!agentId) {
|
|
1970
|
-
return null;
|
|
1971
|
-
}
|
|
1972
|
-
try {
|
|
1973
|
-
switch (agentId) {
|
|
1974
|
-
case 'claude': {
|
|
1975
|
-
const config = JSON.parse(content);
|
|
1976
|
-
if (config.permissions) {
|
|
1977
|
-
return claudeToCanonical({
|
|
1978
|
-
permissions: {
|
|
1979
|
-
allow: config.permissions.allow || [],
|
|
1980
|
-
deny: config.permissions.deny || [],
|
|
1981
|
-
},
|
|
1982
|
-
});
|
|
1983
|
-
}
|
|
1984
|
-
return null;
|
|
1985
|
-
}
|
|
1986
|
-
case 'opencode': {
|
|
1987
|
-
// Strip JSONC comments
|
|
1988
|
-
const jsonContent = content.replace(/\/\/.*$/gm, '').replace(/\/\*[\s\S]*?\*\//g, '');
|
|
1989
|
-
const config = JSON.parse(jsonContent);
|
|
1990
|
-
if (config.permission) {
|
|
1991
|
-
return openCodeToCanonical({
|
|
1992
|
-
permission: {
|
|
1993
|
-
bash: config.permission.bash || {},
|
|
1994
|
-
},
|
|
1995
|
-
});
|
|
1996
|
-
}
|
|
1997
|
-
return null;
|
|
1998
|
-
}
|
|
1999
|
-
case 'codex': {
|
|
2000
|
-
const config = TOML.parse(content);
|
|
2001
|
-
const perms = {};
|
|
2002
|
-
if (config.approval_policy) {
|
|
2003
|
-
perms.approval_policy = config.approval_policy;
|
|
2004
|
-
}
|
|
2005
|
-
if (config.sandbox_mode) {
|
|
2006
|
-
perms.sandbox_mode = config.sandbox_mode;
|
|
2007
|
-
}
|
|
2008
|
-
if (config.sandbox_workspace_write) {
|
|
2009
|
-
const sw = config.sandbox_workspace_write;
|
|
2010
|
-
perms.sandbox_workspace_write = {
|
|
2011
|
-
network_access: sw.network_access,
|
|
2012
|
-
writable_roots: sw.writable_roots,
|
|
2013
|
-
};
|
|
2014
|
-
}
|
|
2015
|
-
return codexToCanonical(perms);
|
|
1781
|
+
export function detectPermissionAgentFromPath(filePath) {
|
|
1782
|
+
const normalized = path.resolve(filePath).split(path.sep).join('/');
|
|
1783
|
+
let best = null;
|
|
1784
|
+
for (const [agent, target] of Object.entries(PERMISSION_TARGETS)) {
|
|
1785
|
+
const agentId = agent;
|
|
1786
|
+
// `altSuffixes` first: home()/project() may probe the filesystem to choose
|
|
1787
|
+
// between accepted spellings, and with an empty root that probe resolves
|
|
1788
|
+
// against process.cwd() -- so detection must not depend on it.
|
|
1789
|
+
const candidates = [
|
|
1790
|
+
...(target.altSuffixes ?? []),
|
|
1791
|
+
target.home(''),
|
|
1792
|
+
...(target.project ? [target.project('')] : []),
|
|
1793
|
+
];
|
|
1794
|
+
for (const candidate of candidates) {
|
|
1795
|
+
const suffix = candidate.split(path.sep).join('/').replace(/^\/+/, '');
|
|
1796
|
+
if (!suffix)
|
|
1797
|
+
continue;
|
|
1798
|
+
if (normalized === suffix || normalized.endsWith(`/${suffix}`)) {
|
|
1799
|
+
if (!best || suffix.length > best.length)
|
|
1800
|
+
best = { agentId, length: suffix.length };
|
|
2016
1801
|
}
|
|
2017
|
-
default:
|
|
2018
|
-
return null;
|
|
2019
1802
|
}
|
|
2020
1803
|
}
|
|
2021
|
-
|
|
2022
|
-
return null;
|
|
2023
|
-
}
|
|
1804
|
+
return best?.agentId ?? null;
|
|
2024
1805
|
}
|
|
2025
1806
|
/**
|
|
2026
1807
|
* Save a permission set to central storage.
|
package/dist/lib/picker.d.ts
CHANGED
|
@@ -26,7 +26,21 @@ export interface PickerConfig<T> {
|
|
|
26
26
|
filter: (query: string) => Array<T | Separator>;
|
|
27
27
|
labelFor: (item: T, query: string) => string;
|
|
28
28
|
buildPreview?: (item: T) => string;
|
|
29
|
+
/**
|
|
30
|
+
* Called once with a repaint trigger for the open prompt. An async preview
|
|
31
|
+
* source (e.g. a remote row's digest arriving over SSH) invokes the trigger
|
|
32
|
+
* when data `buildPreview` reported as pending is now ready, so the pane
|
|
33
|
+
* refreshes without a keypress. The trigger is inert after the prompt closes.
|
|
34
|
+
*/
|
|
35
|
+
registerPreviewRepaint?: (repaint: () => void) => void;
|
|
29
36
|
shortIdFor?: (item: T) => string;
|
|
37
|
+
/**
|
|
38
|
+
* Prefix each selectable row with its 1-based position in the current
|
|
39
|
+
* filtered list (` 1.`, ` 12.`), right-aligned so the labels stay columnar
|
|
40
|
+
* and a user scanning a long list can tell where they are. Separators are
|
|
41
|
+
* never numbered.
|
|
42
|
+
*/
|
|
43
|
+
numbered?: boolean;
|
|
30
44
|
pageSize?: number;
|
|
31
45
|
initialSearch?: string;
|
|
32
46
|
emptyMessage?: string;
|
|
@@ -120,6 +134,8 @@ export interface DynamicPickerConfig<T, F, A = never> {
|
|
|
120
134
|
/** Client-side text filter over the loaded pool (the `S` search). */
|
|
121
135
|
matches?: (item: T, query: string) => boolean;
|
|
122
136
|
buildPreview?: (item: T) => string;
|
|
137
|
+
/** See {@link PickerConfig.registerPreviewRepaint}. */
|
|
138
|
+
registerPreviewRepaint?: (repaint: () => void) => void;
|
|
123
139
|
/** Dim summary of the current filter state, rendered in the header. */
|
|
124
140
|
headerFor?: (filter: F) => string;
|
|
125
141
|
/** The hotkey-legend help line; receives the mode so it can adapt. */
|
package/dist/lib/picker.js
CHANGED
|
@@ -136,12 +136,35 @@ export function itemPicker(config) {
|
|
|
136
136
|
const [status, setStatus] = useState('idle');
|
|
137
137
|
const [searchTerm, setSearchTerm] = useState(cfg.initialSearch ?? '');
|
|
138
138
|
const [previewOpen, setPreviewOpen] = useState(Boolean(cfg.buildPreview));
|
|
139
|
+
// An async preview source repaints the pane by bumping this nonce; the
|
|
140
|
+
// counter lives in a ref because the trigger closure would otherwise hold a
|
|
141
|
+
// stale value and the second repaint would silently no-op (the same
|
|
142
|
+
// stale-closure trap dynamicPicker's reloadNonce documents).
|
|
143
|
+
const [, setPreviewNonce] = useState(0);
|
|
144
|
+
const previewNonce = useRef(0);
|
|
145
|
+
useEffect(() => {
|
|
146
|
+
cfg.registerPreviewRepaint?.(() => setPreviewNonce((previewNonce.current += 1)));
|
|
147
|
+
}, []);
|
|
139
148
|
const prefix = usePrefix({ status, theme });
|
|
140
149
|
const results = useMemo(() => {
|
|
141
150
|
const filtered = cfg.filter(searchTerm).slice(0, 50);
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
151
|
+
// Ordinals count only selectable rows, in filtered order, and are padded
|
|
152
|
+
// to the widest index so single- and double-digit rows stay aligned.
|
|
153
|
+
const selectableCount = filtered.filter((it) => !Separator.isSeparator(it)).length;
|
|
154
|
+
const ordinalWidth = String(Math.max(1, selectableCount)).length;
|
|
155
|
+
let ordinal = 0;
|
|
156
|
+
return filtered.map((item) => {
|
|
157
|
+
if (Separator.isSeparator(item))
|
|
158
|
+
return item;
|
|
159
|
+
const label = cfg.labelFor(item, searchTerm);
|
|
160
|
+
if (!cfg.numbered)
|
|
161
|
+
return { value: item, label };
|
|
162
|
+
ordinal += 1;
|
|
163
|
+
return {
|
|
164
|
+
value: item,
|
|
165
|
+
label: `${chalk.gray(`${String(ordinal).padStart(ordinalWidth)}.`)} ${label}`,
|
|
166
|
+
};
|
|
167
|
+
});
|
|
145
168
|
}, [searchTerm]);
|
|
146
169
|
// A row is selectable unless it is a divider (Separator). Navigation and the
|
|
147
170
|
// initial cursor skip dividers, and enter never resolves one.
|
|
@@ -472,6 +495,13 @@ export function dynamicPicker(config) {
|
|
|
472
495
|
// changed) can keep the cursor where the user left it. Snapping back to the
|
|
473
496
|
// top every time you star a row would make the key unusable for a second one.
|
|
474
497
|
const loadedFilter = useRef(undefined);
|
|
498
|
+
// Async preview repaint — same ref-counter shape as reloadNonce above, but
|
|
499
|
+
// it only re-renders (buildPreview runs in render) without re-running load.
|
|
500
|
+
const [, setPreviewNonce] = useState(0);
|
|
501
|
+
const previewNonce = useRef(0);
|
|
502
|
+
useEffect(() => {
|
|
503
|
+
cfg.registerPreviewRepaint?.(() => setPreviewNonce((previewNonce.current += 1)));
|
|
504
|
+
}, []);
|
|
475
505
|
useEffect(() => {
|
|
476
506
|
const my = ++gen.current;
|
|
477
507
|
const filterChanged = loadedFilter.current !== filter;
|
package/dist/lib/placement.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Placement — one model for "where does the body run?"
|
|
3
3
|
*
|
|
4
4
|
* The CLI grew several doors that all mean execution target:
|
|
5
|
-
* run --
|
|
5
|
+
* run --device / --lease / --box / --cloud
|
|
6
6
|
* routines --placement / --run-on / hostStrategy
|
|
7
7
|
* monitors --run-on (body) vs --device (owner — NOT placement)
|
|
8
8
|
* teams --device (teammate pin)
|
package/dist/lib/placement.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Placement — one model for "where does the body run?"
|
|
3
3
|
*
|
|
4
4
|
* The CLI grew several doors that all mean execution target:
|
|
5
|
-
* run --
|
|
5
|
+
* run --device / --lease / --box / --cloud
|
|
6
6
|
* routines --placement / --run-on / hostStrategy
|
|
7
7
|
* monitors --run-on (body) vs --device (owner — NOT placement)
|
|
8
8
|
* teams --device (teammate pin)
|
|
@@ -98,7 +98,7 @@ export function placementFromRunFlags(flags) {
|
|
|
98
98
|
if (where)
|
|
99
99
|
placementFlags.push('--where');
|
|
100
100
|
if (hostT)
|
|
101
|
-
placementFlags.push('--
|
|
101
|
+
placementFlags.push('--device');
|
|
102
102
|
if (hasLease)
|
|
103
103
|
placementFlags.push('--lease');
|
|
104
104
|
if (hasBox)
|
|
@@ -120,7 +120,7 @@ export function placementFromRunFlags(flags) {
|
|
|
120
120
|
return { kind: 'lease', target: backend, source: '--lease' };
|
|
121
121
|
}
|
|
122
122
|
if (hostT)
|
|
123
|
-
return { kind: 'device', target: hostT, source: '--
|
|
123
|
+
return { kind: 'device', target: hostT, source: '--device' };
|
|
124
124
|
return { kind: 'local', source: 'default' };
|
|
125
125
|
}
|
|
126
126
|
/**
|
|
@@ -182,7 +182,7 @@ export const PLACEMENT_MATRIX = `
|
|
|
182
182
|
Intent Flag / path
|
|
183
183
|
───────────────────────────── ──────────────────────────────────────────
|
|
184
184
|
This machine (default) or --where local
|
|
185
|
-
Named fleet box --where device:<name> (= --
|
|
185
|
+
Named fleet box --where device:<name> (= --device)
|
|
186
186
|
Affinity pick (14d usage) --where auto (= --device auto)
|
|
187
187
|
Disposable cloud box --where lease (= --lease)
|
|
188
188
|
Reuse warm crabbox --box <slug>
|
|
@@ -34,6 +34,14 @@ export declare function isWindowsAbsolutePath(p: string): boolean;
|
|
|
34
34
|
* (no backslashes) it returns the value unchanged.
|
|
35
35
|
*/
|
|
36
36
|
export declare function toPosix(p: string): string;
|
|
37
|
+
/**
|
|
38
|
+
* Fold forward slashes to the platform's native separator. The inverse of
|
|
39
|
+
* {@link toPosix}: use when a path from a source that emits POSIX separators on
|
|
40
|
+
* every OS — notably `git`, whose `rev-parse` prints `C:/Users/...` on Windows —
|
|
41
|
+
* must become a native filesystem path so it compares equal to one built with
|
|
42
|
+
* `path.*`. On POSIX (`path.sep === '/'`) it returns the value unchanged.
|
|
43
|
+
*/
|
|
44
|
+
export declare function toNativePath(p: string, sep?: string): string;
|
|
37
45
|
/**
|
|
38
46
|
* Derive a filesystem-safe key/slug from an absolute path. Drops the Windows
|
|
39
47
|
* drive colon (`:` is illegal in NTFS filenames / is the ADS separator) and
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Path classification + normalization, platform-aware.
|
|
3
3
|
*/
|
|
4
4
|
import * as os from 'os';
|
|
5
|
+
import * as path from 'path';
|
|
5
6
|
/** Windows drive-letter absolute path: `C:\` or `C:/`. */
|
|
6
7
|
const WIN_DRIVE_RE = /^[a-zA-Z]:[\\/]/;
|
|
7
8
|
/**
|
|
@@ -65,6 +66,16 @@ export function isWindowsAbsolutePath(p) {
|
|
|
65
66
|
export function toPosix(p) {
|
|
66
67
|
return p.replace(/\\/g, '/');
|
|
67
68
|
}
|
|
69
|
+
/**
|
|
70
|
+
* Fold forward slashes to the platform's native separator. The inverse of
|
|
71
|
+
* {@link toPosix}: use when a path from a source that emits POSIX separators on
|
|
72
|
+
* every OS — notably `git`, whose `rev-parse` prints `C:/Users/...` on Windows —
|
|
73
|
+
* must become a native filesystem path so it compares equal to one built with
|
|
74
|
+
* `path.*`. On POSIX (`path.sep === '/'`) it returns the value unchanged.
|
|
75
|
+
*/
|
|
76
|
+
export function toNativePath(p, sep = path.sep) {
|
|
77
|
+
return sep === '/' ? p : p.replace(/\//g, sep);
|
|
78
|
+
}
|
|
68
79
|
/**
|
|
69
80
|
* Derive a filesystem-safe key/slug from an absolute path. Drops the Windows
|
|
70
81
|
* drive colon (`:` is illegal in NTFS filenames / is the ADS separator) and
|
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
* bin symlink into the npm global-bin dir; under nvm (and other per-user node
|
|
6
6
|
* prefixes) that dir is absent from a *non-interactive login* shell's PATH, so
|
|
7
7
|
* `bash -lc 'agents …'` fails with command-not-found. That breaks every
|
|
8
|
-
* consumer that drives a login shell on the box: `agents secrets export --
|
|
8
|
+
* consumer that drives a login shell on the box: `agents secrets export --device`
|
|
9
9
|
* (which runs `bash -lc 'agents secrets import …'` on the remote) and the
|
|
10
|
-
* routines daemon (`src/lib/daemon.ts`, which falls back to bare `agents`).
|
|
10
|
+
* routines daemon (`src/lib/daemon/daemon.ts`, which falls back to bare `agents`).
|
|
11
11
|
*
|
|
12
12
|
* The fix mirrors the Windows postinstall branch (which registers npm's
|
|
13
13
|
* global-bin dir on the user PATH): symlink the entrypoint into ~/.local/bin —
|
|
@@ -65,7 +65,7 @@ export function ensureLocalBinSymlink(name, target, dir = localBinDir()) {
|
|
|
65
65
|
/**
|
|
66
66
|
* Absolute path to `bash`. We probe bash specifically — NOT the user's $SHELL —
|
|
67
67
|
* because the consumers we are healing run `bash -lc` regardless of login shell:
|
|
68
|
-
* `secrets export --
|
|
68
|
+
* `secrets export --device` builds `bash -lc 'agents secrets import …'` for the
|
|
69
69
|
* remote, and the routines daemon resolves `agents` the same way. On a box whose
|
|
70
70
|
* login shell is zsh, zsh's login PATH may lack ~/.local/bin while bash's
|
|
71
71
|
* includes it (Debian/Ubuntu ~/.profile) — so probing $SHELL would give the
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
* / registerMarketplace / syncAllMarketplaces) all key off a MarketplaceSpec so
|
|
26
26
|
* the catalog name and on-disk layout are derived, never hard-coded per call.
|
|
27
27
|
*/
|
|
28
|
-
import type { AgentId, DiscoveredPlugin, MarketplaceSpec, DiscoveredMarketplace } from '
|
|
28
|
+
import type { AgentId, DiscoveredPlugin, MarketplaceSpec, DiscoveredMarketplace } from '../types.js';
|
|
29
29
|
/**
|
|
30
30
|
* Canonical name for the user-repo marketplace (~/.agents/plugins/). Kept as an
|
|
31
31
|
* exported constant for callers that operate on the user repo directly and for
|
|
@@ -26,9 +26,9 @@
|
|
|
26
26
|
* the catalog name and on-disk layout are derived, never hard-coded per call.
|
|
27
27
|
*/
|
|
28
28
|
import * as fs from 'fs';
|
|
29
|
-
import { agentConfigDirName } from '
|
|
29
|
+
import { agentConfigDirName } from '../agents.js';
|
|
30
30
|
import * as path from 'path';
|
|
31
|
-
import { getPluginsDir, getEnabledExtraRepos, getProjectPluginsDir, getSystemPluginsDir } from '
|
|
31
|
+
import { getPluginsDir, getEnabledExtraRepos, getProjectPluginsDir, getSystemPluginsDir } from '../state.js';
|
|
32
32
|
/**
|
|
33
33
|
* Canonical name for the user-repo marketplace (~/.agents/plugins/). Kept as an
|
|
34
34
|
* exported constant for callers that operate on the user repo directly and for
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* contents into agent version homes. Workflows under a plugin’s workflows/
|
|
10
10
|
* are resolved at run time by resolveWorkflowRef (Phase 5 packaging).
|
|
11
11
|
*/
|
|
12
|
-
import type { AgentId, DiscoveredPlugin, PluginManifest, MarketplaceSpec } from '
|
|
12
|
+
import type { AgentId, DiscoveredPlugin, PluginManifest, MarketplaceSpec } from '../types.js';
|
|
13
13
|
export interface PluginCapabilities {
|
|
14
14
|
hasHooks: boolean;
|
|
15
15
|
hasMcp: boolean;
|
|
@@ -13,13 +13,13 @@ import * as fs from 'fs';
|
|
|
13
13
|
import * as path from 'path';
|
|
14
14
|
import * as yaml from 'yaml';
|
|
15
15
|
import { execFileSync } from 'child_process';
|
|
16
|
-
import { getPluginsDir, getTrashPluginsDir, getExtraPluginsDir, getProjectPluginsDir, getSystemPluginsDir } from '
|
|
17
|
-
import { IS_WINDOWS, isWindowsAbsolutePath, homeDir } from '
|
|
18
|
-
import { assertSafeGitTransport, resolveSnapshotSha } from '
|
|
19
|
-
import { listInstalledVersions, getVersionHomePath } from '
|
|
20
|
-
import { AGENTS, agentConfigDirName } from '
|
|
21
|
-
import { capableAgents, isCapable } from '
|
|
22
|
-
import { shouldInstallCommandAsSkill, installCommandSkillToVersion } from '
|
|
16
|
+
import { getPluginsDir, getTrashPluginsDir, getExtraPluginsDir, getProjectPluginsDir, getSystemPluginsDir } from '../state.js';
|
|
17
|
+
import { IS_WINDOWS, isWindowsAbsolutePath, homeDir } from '../platform/index.js';
|
|
18
|
+
import { assertSafeGitTransport, resolveSnapshotSha } from '../git.js';
|
|
19
|
+
import { listInstalledVersions, getVersionHomePath } from '../installations/versions.js';
|
|
20
|
+
import { AGENTS, agentConfigDirName } from '../agents.js';
|
|
21
|
+
import { capableAgents, isCapable } from '../capabilities.js';
|
|
22
|
+
import { shouldInstallCommandAsSkill, installCommandSkillToVersion } from '../command-skills.js';
|
|
23
23
|
import { copyPluginToMarketplace, syncMarketplaceManifest, registerMarketplace, unregisterMarketplace, addPluginToSettings, removePluginFromSettings, removePluginFromMarketplace, registerDroidInstalledPlugin, unregisterDroidInstalledPlugin, isDroidPluginInstalled, registerCopilotInstalledPlugin, unregisterCopilotInstalledPlugin, marketplaceIsEmpty, removeEmptyMarketplaceDir, isInstalledInMarketplace, marketplaceRoot, discoverMarketplaces, marketplaceNameFor, MARKETPLACE_NAME, PROJECT_MARKETPLACE_NAME, SYSTEM_MARKETPLACE_NAME, } from './plugin-marketplace.js';
|
|
24
24
|
const PLUGIN_MANIFEST_DIR = '.claude-plugin';
|
|
25
25
|
const PLUGIN_MANIFEST_FILE = 'plugin.json';
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* (rules/, examples/, etc.). This module handles parsing skill metadata,
|
|
7
7
|
* installing skills into agent version homes, and tracking installation state.
|
|
8
8
|
*/
|
|
9
|
-
import type { AgentId, SkillMetadata, InstalledSkill } from '
|
|
9
|
+
import type { AgentId, SkillMetadata, InstalledSkill } from '../types.js';
|
|
10
10
|
/** User-scoped skills dir (~/.agents/skills/). Used for installs. */
|
|
11
11
|
export declare function getSkillsDir(): string;
|
|
12
12
|
export declare function ensureCentralSkillsDir(): void;
|