@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
|
@@ -1,247 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Skills resource handler.
|
|
3
|
-
*
|
|
4
|
-
* Skills are directory bundles with a SKILL.md containing YAML frontmatter.
|
|
5
|
-
* Format is the same for all agents. Resolution order: project > user > system.
|
|
6
|
-
*/
|
|
7
|
-
import * as fs from 'fs';
|
|
8
|
-
import { AGENTS, agentConfigDirName, isAgentHardDeprecated } from '../agents.js';
|
|
9
|
-
import * as path from 'path';
|
|
10
|
-
import * as yaml from 'yaml';
|
|
11
|
-
import { getSystemSkillsDir, getUserSkillsDir, getProjectAgentsDir, getEnabledExtraRepos, } from '../state.js';
|
|
12
|
-
/** Default provider uses the real state module. */
|
|
13
|
-
const defaultProvider = {
|
|
14
|
-
getSystemSkillsDir,
|
|
15
|
-
getUserSkillsDir,
|
|
16
|
-
getProjectAgentsDir,
|
|
17
|
-
getEnabledExtraRepos,
|
|
18
|
-
};
|
|
19
|
-
/**
|
|
20
|
-
* Parse SKILL.md frontmatter to extract skill metadata.
|
|
21
|
-
* Returns null if the file doesn't exist or has no valid frontmatter.
|
|
22
|
-
*/
|
|
23
|
-
function parseSkillMetadata(skillDir) {
|
|
24
|
-
const skillMdPath = path.join(skillDir, 'SKILL.md');
|
|
25
|
-
if (!fs.existsSync(skillMdPath)) {
|
|
26
|
-
return null;
|
|
27
|
-
}
|
|
28
|
-
try {
|
|
29
|
-
const content = fs.readFileSync(skillMdPath, 'utf-8');
|
|
30
|
-
const lines = content.split('\n');
|
|
31
|
-
// Check for YAML frontmatter (required)
|
|
32
|
-
if (lines[0] === '---') {
|
|
33
|
-
const endIndex = lines.slice(1).findIndex((l) => l === '---');
|
|
34
|
-
if (endIndex > 0) {
|
|
35
|
-
const frontmatter = lines.slice(1, endIndex + 1).join('\n');
|
|
36
|
-
const parsed = yaml.parse(frontmatter);
|
|
37
|
-
return {
|
|
38
|
-
name: parsed.name || '',
|
|
39
|
-
description: parsed.description || '',
|
|
40
|
-
author: parsed.author,
|
|
41
|
-
version: parsed.version,
|
|
42
|
-
license: parsed.license,
|
|
43
|
-
keywords: parsed.keywords,
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
return null;
|
|
48
|
-
}
|
|
49
|
-
catch {
|
|
50
|
-
return null;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Count .md files in the skill's rules/ subdirectory.
|
|
55
|
-
*/
|
|
56
|
-
function countSkillRules(skillDir) {
|
|
57
|
-
const rulesDir = path.join(skillDir, 'rules');
|
|
58
|
-
if (!fs.existsSync(rulesDir)) {
|
|
59
|
-
return 0;
|
|
60
|
-
}
|
|
61
|
-
try {
|
|
62
|
-
const files = fs.readdirSync(rulesDir);
|
|
63
|
-
return files.filter((f) => f.endsWith('.md')).length;
|
|
64
|
-
}
|
|
65
|
-
catch {
|
|
66
|
-
return 0;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Count bundled resource files in a skill directory (everything except SKILL.md).
|
|
71
|
-
*/
|
|
72
|
-
function countSkillFiles(skillDir) {
|
|
73
|
-
if (!fs.existsSync(skillDir))
|
|
74
|
-
return 0;
|
|
75
|
-
let count = 0;
|
|
76
|
-
const walk = (dir) => {
|
|
77
|
-
let entries;
|
|
78
|
-
try {
|
|
79
|
-
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
80
|
-
}
|
|
81
|
-
catch {
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
for (const entry of entries) {
|
|
85
|
-
if (entry.name.startsWith('.'))
|
|
86
|
-
continue;
|
|
87
|
-
const full = path.join(dir, entry.name);
|
|
88
|
-
if (entry.isDirectory()) {
|
|
89
|
-
walk(full);
|
|
90
|
-
}
|
|
91
|
-
else if (entry.isFile()) {
|
|
92
|
-
if (dir === skillDir && entry.name === 'SKILL.md')
|
|
93
|
-
continue;
|
|
94
|
-
count++;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
};
|
|
98
|
-
walk(skillDir);
|
|
99
|
-
return count;
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* List skill directories in a given base path.
|
|
103
|
-
* Returns array of { name, fullPath } for directories containing SKILL.md.
|
|
104
|
-
*/
|
|
105
|
-
function listSkillsInDir(baseDir) {
|
|
106
|
-
if (!fs.existsSync(baseDir))
|
|
107
|
-
return [];
|
|
108
|
-
const results = [];
|
|
109
|
-
try {
|
|
110
|
-
const entries = fs.readdirSync(baseDir, { withFileTypes: true });
|
|
111
|
-
for (const entry of entries) {
|
|
112
|
-
if (!entry.isDirectory() || entry.name.startsWith('.'))
|
|
113
|
-
continue;
|
|
114
|
-
const fullPath = path.join(baseDir, entry.name);
|
|
115
|
-
const skillMdPath = path.join(fullPath, 'SKILL.md');
|
|
116
|
-
if (fs.existsSync(skillMdPath)) {
|
|
117
|
-
results.push({ name: entry.name, fullPath });
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
catch {
|
|
122
|
-
// Ignore errors
|
|
123
|
-
}
|
|
124
|
-
return results;
|
|
125
|
-
}
|
|
126
|
-
/**
|
|
127
|
-
* Get layer directories for skill resolution.
|
|
128
|
-
*/
|
|
129
|
-
function getLayerDirs(cwd, provider = defaultProvider) {
|
|
130
|
-
const layers = [];
|
|
131
|
-
// Project layer
|
|
132
|
-
const projectDir = cwd ? provider.getProjectAgentsDir(cwd) : null;
|
|
133
|
-
if (projectDir) {
|
|
134
|
-
layers.push({ layer: 'project', dir: path.join(projectDir, 'skills') });
|
|
135
|
-
}
|
|
136
|
-
// User layer
|
|
137
|
-
layers.push({ layer: 'user', dir: provider.getUserSkillsDir() });
|
|
138
|
-
// Extra repos (treated as user layer since they're user-configured)
|
|
139
|
-
for (const extra of provider.getEnabledExtraRepos()) {
|
|
140
|
-
layers.push({ layer: 'user', dir: path.join(extra.dir, 'skills') });
|
|
141
|
-
}
|
|
142
|
-
// System layer
|
|
143
|
-
layers.push({ layer: 'system', dir: provider.getSystemSkillsDir() });
|
|
144
|
-
return layers;
|
|
145
|
-
}
|
|
146
|
-
/**
|
|
147
|
-
* Create a SkillsHandler with the given layer directory provider.
|
|
148
|
-
* Useful for testing with custom directory structures.
|
|
149
|
-
*/
|
|
150
|
-
export function createSkillsHandler(provider = defaultProvider) {
|
|
151
|
-
return {
|
|
152
|
-
kind: 'skill',
|
|
153
|
-
listAll(_agent, cwd) {
|
|
154
|
-
const seen = new Map();
|
|
155
|
-
const layers = getLayerDirs(cwd, provider);
|
|
156
|
-
// Process in order: project > user > system
|
|
157
|
-
// First occurrence wins (higher layer takes precedence)
|
|
158
|
-
for (const { layer, dir } of layers) {
|
|
159
|
-
const skills = listSkillsInDir(dir);
|
|
160
|
-
for (const { name, fullPath } of skills) {
|
|
161
|
-
if (seen.has(name))
|
|
162
|
-
continue; // Higher layer already has this skill
|
|
163
|
-
const metadata = parseSkillMetadata(fullPath);
|
|
164
|
-
if (!metadata)
|
|
165
|
-
continue; // Skip invalid skills
|
|
166
|
-
seen.set(name, {
|
|
167
|
-
name,
|
|
168
|
-
item: {
|
|
169
|
-
metadata,
|
|
170
|
-
ruleCount: countSkillRules(fullPath),
|
|
171
|
-
fileCount: countSkillFiles(fullPath),
|
|
172
|
-
},
|
|
173
|
-
layer,
|
|
174
|
-
path: fullPath,
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
return Array.from(seen.values()).sort((a, b) => a.name.localeCompare(b.name));
|
|
179
|
-
},
|
|
180
|
-
resolve(_agent, name, cwd) {
|
|
181
|
-
const layers = getLayerDirs(cwd, provider);
|
|
182
|
-
for (const { layer, dir } of layers) {
|
|
183
|
-
const skillPath = path.join(dir, name);
|
|
184
|
-
const skillMdPath = path.join(skillPath, 'SKILL.md');
|
|
185
|
-
if (fs.existsSync(skillMdPath)) {
|
|
186
|
-
const metadata = parseSkillMetadata(skillPath);
|
|
187
|
-
if (!metadata)
|
|
188
|
-
continue;
|
|
189
|
-
return {
|
|
190
|
-
name,
|
|
191
|
-
item: {
|
|
192
|
-
metadata,
|
|
193
|
-
ruleCount: countSkillRules(skillPath),
|
|
194
|
-
fileCount: countSkillFiles(skillPath),
|
|
195
|
-
},
|
|
196
|
-
layer,
|
|
197
|
-
path: skillPath,
|
|
198
|
-
};
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
return null;
|
|
202
|
-
},
|
|
203
|
-
sync(agent, versionHome, cwd) {
|
|
204
|
-
if (isAgentHardDeprecated(agent)) {
|
|
205
|
-
return;
|
|
206
|
-
}
|
|
207
|
-
// Agents that read directly from central ~/.agents/skills/ (e.g. Gemini,
|
|
208
|
-
// Goose via the Summon extension) should not get a per-version copy.
|
|
209
|
-
if (AGENTS[agent]?.nativeAgentsSkillsDir) {
|
|
210
|
-
return;
|
|
211
|
-
}
|
|
212
|
-
const targetDir = path.join(versionHome, agentConfigDirName(agent), 'skills');
|
|
213
|
-
// Ensure target directory exists
|
|
214
|
-
if (!fs.existsSync(targetDir)) {
|
|
215
|
-
fs.mkdirSync(targetDir, { recursive: true });
|
|
216
|
-
}
|
|
217
|
-
const resolved = this.listAll(agent, cwd);
|
|
218
|
-
for (const skill of resolved) {
|
|
219
|
-
const targetPath = path.join(targetDir, skill.name);
|
|
220
|
-
// Remove existing if present
|
|
221
|
-
if (fs.existsSync(targetPath) || fs.lstatSync(targetPath, { throwIfNoEntry: false })) {
|
|
222
|
-
try {
|
|
223
|
-
fs.rmSync(targetPath, { recursive: true, force: true });
|
|
224
|
-
}
|
|
225
|
-
catch {
|
|
226
|
-
// Ignore removal errors
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
// Copy skill directory
|
|
230
|
-
try {
|
|
231
|
-
fs.cpSync(skill.path, targetPath, { recursive: true });
|
|
232
|
-
}
|
|
233
|
-
catch {
|
|
234
|
-
// Ignore copy errors
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
},
|
|
238
|
-
format(_agent) {
|
|
239
|
-
return 'md';
|
|
240
|
-
},
|
|
241
|
-
targetDir(agent) {
|
|
242
|
-
return `${agentConfigDirName(agent)}/skills`;
|
|
243
|
-
},
|
|
244
|
-
};
|
|
245
|
-
}
|
|
246
|
-
/** Default handler using real state module paths. */
|
|
247
|
-
export const SkillsHandler = createSkillsHandler();
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Subagents resource handler.
|
|
3
|
-
*
|
|
4
|
-
* Subagents are YAML files stored in subagents/ directories across layers.
|
|
5
|
-
* Format is the same for all agents. Resolution order: project > user > system.
|
|
6
|
-
*/
|
|
7
|
-
import type { AgentId, ResolvedItem, ResourceHandler } from './types.js';
|
|
8
|
-
/** Parsed content of a subagent YAML file. */
|
|
9
|
-
export interface SubagentItem {
|
|
10
|
-
name: string;
|
|
11
|
-
description: string;
|
|
12
|
-
model?: string;
|
|
13
|
-
/** Hex color for UI display. */
|
|
14
|
-
color?: string;
|
|
15
|
-
/** Additional agent-specific config. */
|
|
16
|
-
config?: Record<string, unknown>;
|
|
17
|
-
}
|
|
18
|
-
export declare class SubagentsHandler implements ResourceHandler<SubagentItem> {
|
|
19
|
-
readonly kind: "subagent";
|
|
20
|
-
/**
|
|
21
|
-
* List all subagents across layers, with higher layer winning on name conflict.
|
|
22
|
-
* Returns a union of all subagents, deduplicated by name.
|
|
23
|
-
*/
|
|
24
|
-
listAll(_agent: AgentId, cwd?: string): ResolvedItem<SubagentItem>[];
|
|
25
|
-
/**
|
|
26
|
-
* Resolve a single subagent by name.
|
|
27
|
-
* Returns the winning layer's version, or null if not found.
|
|
28
|
-
*/
|
|
29
|
-
resolve(_agent: AgentId, name: string, cwd?: string): ResolvedItem<SubagentItem> | null;
|
|
30
|
-
/**
|
|
31
|
-
* Sync resolved subagents to the agent's version home directory.
|
|
32
|
-
* Copies YAML files to the target directory.
|
|
33
|
-
*/
|
|
34
|
-
sync(agent: AgentId, versionHome: string, cwd?: string): void;
|
|
35
|
-
/**
|
|
36
|
-
* Get the file format this resource uses for a given agent.
|
|
37
|
-
* Subagents always use YAML format.
|
|
38
|
-
*/
|
|
39
|
-
format(_agent: AgentId): 'md' | 'toml' | 'json' | 'yaml';
|
|
40
|
-
/**
|
|
41
|
-
* Get the target directory name in the agent's version home.
|
|
42
|
-
*/
|
|
43
|
-
targetDir(_agent: AgentId): string;
|
|
44
|
-
}
|
|
45
|
-
/** Singleton instance of the SubagentsHandler. */
|
|
46
|
-
export declare const subagentsHandler: SubagentsHandler;
|
|
@@ -1,202 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Subagents resource handler.
|
|
3
|
-
*
|
|
4
|
-
* Subagents are YAML files stored in subagents/ directories across layers.
|
|
5
|
-
* Format is the same for all agents. Resolution order: project > user > system.
|
|
6
|
-
*/
|
|
7
|
-
import * as fs from 'fs';
|
|
8
|
-
import * as path from 'path';
|
|
9
|
-
import * as yaml from 'yaml';
|
|
10
|
-
import { getProjectAgentsDir, getUserSubagentsDir, getSystemSubagentsDir, getEnabledExtraRepos, } from '../state.js';
|
|
11
|
-
import { isAgentHardDeprecated } from '../agents.js';
|
|
12
|
-
/** Get layer directories for subagent resolution. */
|
|
13
|
-
function getLayerDirs(cwd) {
|
|
14
|
-
const projectDir = getProjectAgentsDir(cwd);
|
|
15
|
-
const extraRepos = getEnabledExtraRepos();
|
|
16
|
-
return {
|
|
17
|
-
system: path.join(getSystemSubagentsDir()),
|
|
18
|
-
user: getUserSubagentsDir(),
|
|
19
|
-
project: projectDir ? path.join(projectDir, 'subagents') : null,
|
|
20
|
-
extra: extraRepos.map((e) => path.join(e.dir, 'subagents')),
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
/** Map source directory to layer name. */
|
|
24
|
-
function dirToLayer(dir, dirs) {
|
|
25
|
-
if (dirs.project && dir.startsWith(dirs.project))
|
|
26
|
-
return 'project';
|
|
27
|
-
if (dir.startsWith(dirs.user))
|
|
28
|
-
return 'user';
|
|
29
|
-
return 'system';
|
|
30
|
-
}
|
|
31
|
-
/** Parse a subagent YAML file and return parsed item. */
|
|
32
|
-
function parseSubagentYaml(filePath) {
|
|
33
|
-
if (!fs.existsSync(filePath)) {
|
|
34
|
-
return null;
|
|
35
|
-
}
|
|
36
|
-
try {
|
|
37
|
-
const content = fs.readFileSync(filePath, 'utf-8');
|
|
38
|
-
const parsed = yaml.parse(content);
|
|
39
|
-
if (!parsed || typeof parsed !== 'object') {
|
|
40
|
-
return null;
|
|
41
|
-
}
|
|
42
|
-
return {
|
|
43
|
-
name: parsed.name || '',
|
|
44
|
-
description: parsed.description || '',
|
|
45
|
-
model: parsed.model,
|
|
46
|
-
color: parsed.color,
|
|
47
|
-
config: parsed.config,
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
catch {
|
|
51
|
-
return null;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
/** Extract name from filename (removes .yaml/.yml extension). */
|
|
55
|
-
function nameFromFile(filename) {
|
|
56
|
-
return filename.replace(/\.ya?ml$/, '');
|
|
57
|
-
}
|
|
58
|
-
export class SubagentsHandler {
|
|
59
|
-
kind = 'subagent';
|
|
60
|
-
/**
|
|
61
|
-
* List all subagents across layers, with higher layer winning on name conflict.
|
|
62
|
-
* Returns a union of all subagents, deduplicated by name.
|
|
63
|
-
*/
|
|
64
|
-
listAll(_agent, cwd) {
|
|
65
|
-
const dirs = getLayerDirs(cwd);
|
|
66
|
-
const seen = new Set();
|
|
67
|
-
const results = [];
|
|
68
|
-
// Order: project > user > system > extra (extra comes last after system)
|
|
69
|
-
const layerDirs = [];
|
|
70
|
-
if (dirs.project && fs.existsSync(dirs.project)) {
|
|
71
|
-
layerDirs.push({ dir: dirs.project, layer: 'project' });
|
|
72
|
-
}
|
|
73
|
-
if (fs.existsSync(dirs.user)) {
|
|
74
|
-
layerDirs.push({ dir: dirs.user, layer: 'user' });
|
|
75
|
-
}
|
|
76
|
-
if (fs.existsSync(dirs.system)) {
|
|
77
|
-
layerDirs.push({ dir: dirs.system, layer: 'system' });
|
|
78
|
-
}
|
|
79
|
-
for (const extraDir of dirs.extra) {
|
|
80
|
-
if (fs.existsSync(extraDir)) {
|
|
81
|
-
layerDirs.push({ dir: extraDir, layer: 'system' });
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
for (const { dir, layer } of layerDirs) {
|
|
85
|
-
let entries;
|
|
86
|
-
try {
|
|
87
|
-
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
88
|
-
}
|
|
89
|
-
catch {
|
|
90
|
-
continue;
|
|
91
|
-
}
|
|
92
|
-
for (const entry of entries) {
|
|
93
|
-
if (!entry.isFile())
|
|
94
|
-
continue;
|
|
95
|
-
if (!entry.name.endsWith('.yaml') && !entry.name.endsWith('.yml'))
|
|
96
|
-
continue;
|
|
97
|
-
if (entry.name.startsWith('.'))
|
|
98
|
-
continue;
|
|
99
|
-
const name = nameFromFile(entry.name);
|
|
100
|
-
if (seen.has(name))
|
|
101
|
-
continue;
|
|
102
|
-
const filePath = path.join(dir, entry.name);
|
|
103
|
-
const item = parseSubagentYaml(filePath);
|
|
104
|
-
if (!item)
|
|
105
|
-
continue;
|
|
106
|
-
seen.add(name);
|
|
107
|
-
results.push({
|
|
108
|
-
name,
|
|
109
|
-
item,
|
|
110
|
-
layer,
|
|
111
|
-
path: filePath,
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
return results;
|
|
116
|
-
}
|
|
117
|
-
/**
|
|
118
|
-
* Resolve a single subagent by name.
|
|
119
|
-
* Returns the winning layer's version, or null if not found.
|
|
120
|
-
*/
|
|
121
|
-
resolve(_agent, name, cwd) {
|
|
122
|
-
const dirs = getLayerDirs(cwd);
|
|
123
|
-
// Order: project > user > system > extra
|
|
124
|
-
const searchDirs = [];
|
|
125
|
-
if (dirs.project) {
|
|
126
|
-
searchDirs.push({ dir: dirs.project, layer: 'project' });
|
|
127
|
-
}
|
|
128
|
-
searchDirs.push({ dir: dirs.user, layer: 'user' });
|
|
129
|
-
searchDirs.push({ dir: dirs.system, layer: 'system' });
|
|
130
|
-
for (const extraDir of dirs.extra) {
|
|
131
|
-
searchDirs.push({ dir: extraDir, layer: 'system' });
|
|
132
|
-
}
|
|
133
|
-
for (const { dir, layer } of searchDirs) {
|
|
134
|
-
if (!fs.existsSync(dir))
|
|
135
|
-
continue;
|
|
136
|
-
// Try .yaml first, then .yml
|
|
137
|
-
for (const ext of ['.yaml', '.yml']) {
|
|
138
|
-
const filePath = path.join(dir, name + ext);
|
|
139
|
-
if (fs.existsSync(filePath)) {
|
|
140
|
-
const item = parseSubagentYaml(filePath);
|
|
141
|
-
if (item) {
|
|
142
|
-
return {
|
|
143
|
-
name,
|
|
144
|
-
item,
|
|
145
|
-
layer,
|
|
146
|
-
path: filePath,
|
|
147
|
-
};
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
return null;
|
|
153
|
-
}
|
|
154
|
-
/**
|
|
155
|
-
* Sync resolved subagents to the agent's version home directory.
|
|
156
|
-
* Copies YAML files to the target directory.
|
|
157
|
-
*/
|
|
158
|
-
sync(agent, versionHome, cwd) {
|
|
159
|
-
if (isAgentHardDeprecated(agent)) {
|
|
160
|
-
return;
|
|
161
|
-
}
|
|
162
|
-
const targetDir = path.join(versionHome, this.targetDir(agent));
|
|
163
|
-
// Ensure target directory exists
|
|
164
|
-
if (!fs.existsSync(targetDir)) {
|
|
165
|
-
fs.mkdirSync(targetDir, { recursive: true });
|
|
166
|
-
}
|
|
167
|
-
// Clear existing subagents in target
|
|
168
|
-
try {
|
|
169
|
-
const existing = fs.readdirSync(targetDir);
|
|
170
|
-
for (const file of existing) {
|
|
171
|
-
if (file.endsWith('.yaml') || file.endsWith('.yml')) {
|
|
172
|
-
fs.unlinkSync(path.join(targetDir, file));
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
catch {
|
|
177
|
-
// Ignore errors during cleanup
|
|
178
|
-
}
|
|
179
|
-
// Copy all resolved subagents
|
|
180
|
-
const resolved = this.listAll(agent, cwd);
|
|
181
|
-
for (const { name, path: sourcePath } of resolved) {
|
|
182
|
-
const ext = sourcePath.endsWith('.yml') ? '.yml' : '.yaml';
|
|
183
|
-
const targetPath = path.join(targetDir, name + ext);
|
|
184
|
-
fs.copyFileSync(sourcePath, targetPath);
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
/**
|
|
188
|
-
* Get the file format this resource uses for a given agent.
|
|
189
|
-
* Subagents always use YAML format.
|
|
190
|
-
*/
|
|
191
|
-
format(_agent) {
|
|
192
|
-
return 'yaml';
|
|
193
|
-
}
|
|
194
|
-
/**
|
|
195
|
-
* Get the target directory name in the agent's version home.
|
|
196
|
-
*/
|
|
197
|
-
targetDir(_agent) {
|
|
198
|
-
return 'subagents';
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
/** Singleton instance of the SubagentsHandler. */
|
|
202
|
-
export const subagentsHandler = new SubagentsHandler();
|
|
File without changes
|