@ashx-j/lunr 0.2.11 → 0.2.13
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 +13 -0
- package/README.md +211 -236
- package/dist/builtin-extensions/ashxj-tui.d.ts +3 -0
- package/dist/builtin-extensions/ashxj-tui.d.ts.map +1 -1
- package/dist/builtin-extensions/ashxj-tui.js +28 -11
- package/dist/builtin-extensions/ashxj-tui.js.map +1 -1
- package/dist/builtin-extensions/index.d.ts.map +1 -1
- package/dist/builtin-extensions/index.js +0 -2
- package/dist/builtin-extensions/index.js.map +1 -1
- package/dist/builtin-extensions/lunr-cron.d.ts +1 -1
- package/dist/builtin-extensions/lunr-cron.d.ts.map +1 -1
- package/dist/builtin-extensions/lunr-cron.js +1 -1
- package/dist/builtin-extensions/lunr-cron.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/chain-validation.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/chain-validation.js +3 -3
- package/dist/builtin-extensions/pi-subagents/src/extension/chain-validation.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/doctor.d.ts +0 -2
- package/dist/builtin-extensions/pi-subagents/src/extension/doctor.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/doctor.js +1 -23
- package/dist/builtin-extensions/pi-subagents/src/extension/doctor.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.js +6 -7
- package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/index.js +7 -14
- package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.d.ts +12 -9
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js +38 -34
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts +3 -3
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js +32 -47
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.d.ts +7 -10
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.js +90 -109
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.d.ts +3 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.js +37 -50
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/scheduled-runs.d.ts +4 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/background/scheduled-runs.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/scheduled-runs.js +5 -5
- package/dist/builtin-extensions/pi-subagents/src/runs/background/scheduled-runs.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js +31 -13
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-clarify.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-clarify.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-clarify.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.d.ts +4 -3
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js +48 -20
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js +90 -64
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts +6 -8
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js +262 -161
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/acceptance.d.ts +2 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/acceptance.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/acceptance.js +24 -33
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/acceptance.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.d.ts +25 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.d.ts.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.js +51 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.js.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/dynamic-fanout.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/dynamic-fanout.js +20 -3
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/dynamic-fanout.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts +4 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.d.ts +5 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.js +9 -3
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.js +2 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.js +20 -17
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.d.ts +70 -0
- package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.d.ts.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.js +153 -0
- package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.js.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/shared/settings.d.ts +13 -8
- package/dist/builtin-extensions/pi-subagents/src/shared/settings.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/settings.js +20 -51
- package/dist/builtin-extensions/pi-subagents/src/shared/settings.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts +80 -20
- package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/types.js +10 -2
- package/dist/builtin-extensions/pi-subagents/src/shared/types.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js +20 -32
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts +2 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js +23 -449
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts +2 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.js +13 -11
- package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/runtime.d.ts +2 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/runtime.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/runtime.js +18 -17
- package/dist/builtin-extensions/pi-subagents/src/watchdog/runtime.js.map +1 -1
- package/dist/builtin-extensions/simple-pi-memory.d.ts +2 -2
- package/dist/builtin-extensions/simple-pi-memory.d.ts.map +1 -1
- package/dist/builtin-extensions/simple-pi-memory.js +41 -17
- package/dist/builtin-extensions/simple-pi-memory.js.map +1 -1
- package/dist/catalog/models.json +1 -1
- package/dist/catalog/providers/amazon-bedrock.json +1 -1
- package/dist/catalog/providers/azure-openai-responses.json +1 -1
- package/dist/catalog/providers/cloudflare-ai-gateway.json +1 -1
- package/dist/catalog/providers/cloudflare-workers-ai.json +1 -1
- package/dist/catalog/providers/fireworks.json +1 -1
- package/dist/catalog/providers/github-copilot.json +1 -1
- package/dist/catalog/providers/huggingface.json +1 -1
- package/dist/catalog/providers/minimax-cn.json +1 -1
- package/dist/catalog/providers/minimax.json +1 -1
- package/dist/catalog/providers/mistral.json +1 -1
- package/dist/catalog/providers/nvidia.json +1 -1
- package/dist/catalog/providers/openai.json +1 -1
- package/dist/catalog/providers/opencode-go.json +1 -1
- package/dist/catalog/providers/opencode.json +1 -1
- package/dist/catalog/providers/openrouter.json +1 -1
- package/dist/catalog/providers/qwen-cloud-cn.json +1 -1
- package/dist/catalog/providers/qwen-cloud.json +1 -1
- package/dist/catalog/providers/qwen-token-plan-cn.json +1 -1
- package/dist/catalog/providers/qwen-token-plan.json +1 -1
- package/dist/catalog/providers/together.json +1 -1
- package/dist/catalog/providers/vercel-ai-gateway.json +1 -1
- package/dist/catalog/providers/zai-coding-cn.json +1 -1
- package/dist/catalog/providers/zai.json +1 -1
- package/dist/catalog/publication.json +3 -3
- package/dist/core/agent-session.d.ts +7 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +34 -4
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/context-breakdown.d.ts +3 -1
- package/dist/core/context-breakdown.d.ts.map +1 -1
- package/dist/core/context-breakdown.js +5 -2
- package/dist/core/context-breakdown.js.map +1 -1
- package/dist/core/customize.d.ts +2 -0
- package/dist/core/customize.d.ts.map +1 -1
- package/dist/core/customize.js +6 -0
- package/dist/core/customize.js.map +1 -1
- package/dist/core/memory-cap.d.ts +4 -8
- package/dist/core/memory-cap.d.ts.map +1 -1
- package/dist/core/memory-cap.js +8 -8
- package/dist/core/memory-cap.js.map +1 -1
- package/dist/core/permissions.d.ts +2 -0
- package/dist/core/permissions.d.ts.map +1 -1
- package/dist/core/permissions.js +30 -14
- package/dist/core/permissions.js.map +1 -1
- package/dist/core/plan-mode.d.ts.map +1 -1
- package/dist/core/plan-mode.js +1 -9
- package/dist/core/plan-mode.js.map +1 -1
- package/dist/core/rollback.d.ts.map +1 -1
- package/dist/core/rollback.js +1 -1
- package/dist/core/rollback.js.map +1 -1
- package/dist/core/settings-manager.d.ts +16 -5
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +37 -10
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +1 -5
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/subagent-permission-inherit.d.ts +34 -22
- package/dist/core/subagent-permission-inherit.d.ts.map +1 -1
- package/dist/core/subagent-permission-inherit.js +37 -80
- package/dist/core/subagent-permission-inherit.js.map +1 -1
- package/dist/core/swarm.d.ts.map +1 -1
- package/dist/core/swarm.js +13 -7
- package/dist/core/swarm.js.map +1 -1
- package/dist/core/system-prompt.d.ts +6 -4
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +38 -48
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/usage-adapters/openai-codex.d.ts +1 -1
- package/dist/core/usage-adapters/openai-codex.d.ts.map +1 -1
- package/dist/core/usage-adapters/openai-codex.js +22 -17
- package/dist/core/usage-adapters/openai-codex.js.map +1 -1
- package/dist/core/usage-service.d.ts +10 -1
- package/dist/core/usage-service.d.ts.map +1 -1
- package/dist/core/usage-service.js +17 -6
- package/dist/core/usage-service.js.map +1 -1
- package/dist/gateway/agent-bridge.d.ts.map +1 -1
- package/dist/gateway/agent-bridge.js +1 -4
- package/dist/gateway/agent-bridge.js.map +1 -1
- package/dist/gateway/cron.d.ts.map +1 -1
- package/dist/gateway/cron.js +1 -4
- package/dist/gateway/cron.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +0 -5
- package/dist/main.js.map +1 -1
- package/dist/migrations.d.ts +2 -0
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +21 -0
- package/dist/migrations.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +7 -4
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +122 -162
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/usage-view.d.ts +1 -1
- package/dist/modes/interactive/components/usage-view.d.ts.map +1 -1
- package/dist/modes/interactive/components/usage-view.js +7 -4
- package/dist/modes/interactive/components/usage-view.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +1 -2
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +55 -96
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/skill-tag-autocomplete.d.ts +13 -0
- package/dist/modes/interactive/skill-tag-autocomplete.d.ts.map +1 -0
- package/dist/modes/interactive/skill-tag-autocomplete.js +72 -0
- package/dist/modes/interactive/skill-tag-autocomplete.js.map +1 -0
- package/docs/compaction.md +23 -23
- package/docs/containerization.md +24 -24
- package/docs/custom-provider.md +18 -18
- package/docs/development.md +16 -15
- package/docs/docs.json +6 -2
- package/docs/extensions.md +82 -80
- package/docs/features.md +102 -0
- package/docs/index.md +25 -19
- package/docs/json.md +7 -7
- package/docs/keybindings.md +4 -4
- package/docs/models.md +2 -2
- package/docs/packages.md +38 -42
- package/docs/prompt-templates.md +4 -4
- package/docs/providers.md +22 -10
- package/docs/quickstart.md +81 -46
- package/docs/rpc.md +7 -13
- package/docs/sdk.md +43 -41
- package/docs/security.md +18 -18
- package/docs/session-format.md +9 -9
- package/docs/sessions.md +13 -12
- package/docs/settings.md +63 -24
- package/docs/shell-aliases.md +2 -2
- package/docs/skills.md +21 -11
- package/docs/terminal-setup.md +5 -5
- package/docs/termux.md +7 -7
- package/docs/themes.md +12 -14
- package/docs/tmux.md +4 -4
- package/docs/tui.md +23 -23
- package/docs/usage.md +112 -87
- package/docs/windows.md +10 -2
- package/examples/README.md +3 -1
- package/examples/extensions/README.md +6 -6
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/doom-overlay/README.md +2 -2
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/plan-mode/README.md +3 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/subagent/README.md +13 -11
- package/examples/extensions/todo.ts +2 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/examples/sdk/README.md +9 -5
- package/package.json +6 -7
- package/dist/builtin-extensions/lunr-behavior.d.ts +0 -44
- package/dist/builtin-extensions/lunr-behavior.d.ts.map +0 -1
- package/dist/builtin-extensions/lunr-behavior.js +0 -213
- package/dist/builtin-extensions/lunr-behavior.js.map +0 -1
- package/dist/builtin-extensions/pi-subagents/agents/context-builder.md +0 -46
- package/dist/builtin-extensions/pi-subagents/agents/deep-researcher.md +0 -36
- package/dist/builtin-extensions/pi-subagents/agents/delegate.md +0 -12
- package/dist/builtin-extensions/pi-subagents/agents/oracle.md +0 -73
- package/dist/builtin-extensions/pi-subagents/agents/planner.md +0 -55
- package/dist/builtin-extensions/pi-subagents/agents/research-writer.md +0 -37
- package/dist/builtin-extensions/pi-subagents/agents/researcher.md +0 -52
- package/dist/builtin-extensions/pi-subagents/agents/reviewer.md +0 -79
- package/dist/builtin-extensions/pi-subagents/agents/scout.md +0 -50
- package/dist/builtin-extensions/pi-subagents/agents/worker.md +0 -55
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.d.ts +0 -20
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.d.ts.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.js +0 -1273
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.js.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-memory.d.ts +0 -49
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-memory.d.ts.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-memory.js +0 -252
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-memory.js.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-scope.d.ts +0 -3
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-scope.d.ts.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-scope.js +0 -6
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-scope.js.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-selection.d.ts +0 -3
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-selection.d.ts.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-selection.js +0 -23
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-selection.js.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-serializer.d.ts +0 -8
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-serializer.d.ts.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-serializer.js +0 -143
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-serializer.js.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agents.d.ts +0 -176
- package/dist/builtin-extensions/pi-subagents/src/agents/agents.d.ts.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agents.js +0 -1326
- package/dist/builtin-extensions/pi-subagents/src/agents/agents.js.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/chain-serializer.d.ts +0 -7
- package/dist/builtin-extensions/pi-subagents/src/agents/chain-serializer.d.ts.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/chain-serializer.js +0 -307
- package/dist/builtin-extensions/pi-subagents/src/agents/chain-serializer.js.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/identity.d.ts +0 -8
- package/dist/builtin-extensions/pi-subagents/src/agents/identity.d.ts.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/identity.js +0 -30
- package/dist/builtin-extensions/pi-subagents/src/agents/identity.js.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/proactive-skills.d.ts +0 -35
- package/dist/builtin-extensions/pi-subagents/src/agents/proactive-skills.d.ts.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/proactive-skills.js +0 -151
- package/dist/builtin-extensions/pi-subagents/src/agents/proactive-skills.js.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.d.ts +0 -131
- package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.d.ts.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.js +0 -491
- package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.js.map +0 -1
- package/dist/core/behavior-preset.d.ts +0 -60
- package/dist/core/behavior-preset.d.ts.map +0 -1
- package/dist/core/behavior-preset.js +0 -257
- package/dist/core/behavior-preset.js.map +0 -1
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agent discovery and configuration
|
|
3
|
-
*/
|
|
4
|
-
import type { AcceptanceInput, AcceptanceRole, OutputMode, ToolBudgetConfig, TurnBudgetConfig } from "../shared/types.ts";
|
|
5
|
-
import { type ModelScopeConfig } from "../runs/shared/model-scope.ts";
|
|
6
|
-
export { buildRuntimeName, frontmatterNameForConfig, parsePackageName } from "./identity.ts";
|
|
7
|
-
export type AgentScope = "user" | "project" | "both";
|
|
8
|
-
export type AgentSource = "builtin" | "package" | "user" | "project";
|
|
9
|
-
type SystemPromptMode = "append" | "replace";
|
|
10
|
-
export type AgentDefaultContext = "fresh" | "fork";
|
|
11
|
-
export type AgentMemoryScope = "project" | "user";
|
|
12
|
-
export interface AgentMemoryConfig {
|
|
13
|
-
scope: AgentMemoryScope;
|
|
14
|
-
path: string;
|
|
15
|
-
}
|
|
16
|
-
export declare const BUILTIN_AGENT_NAMES: readonly ["context-builder", "delegate", "oracle", "planner", "researcher", "reviewer", "scout", "worker"];
|
|
17
|
-
export declare function defaultSystemPromptMode(name: string): SystemPromptMode;
|
|
18
|
-
export declare function defaultInheritProjectContext(name: string): boolean;
|
|
19
|
-
export declare function defaultInheritSkills(): boolean;
|
|
20
|
-
export interface BuiltinAgentOverrideBase {
|
|
21
|
-
model?: string;
|
|
22
|
-
fallbackModels?: string[];
|
|
23
|
-
thinking?: string | false;
|
|
24
|
-
systemPromptMode: SystemPromptMode;
|
|
25
|
-
inheritProjectContext: boolean;
|
|
26
|
-
inheritSkills: boolean;
|
|
27
|
-
defaultContext?: AgentDefaultContext;
|
|
28
|
-
acceptanceRole?: AcceptanceRole;
|
|
29
|
-
disabled?: boolean;
|
|
30
|
-
systemPrompt: string;
|
|
31
|
-
skills?: string[];
|
|
32
|
-
skillPath?: string[];
|
|
33
|
-
tools?: string[];
|
|
34
|
-
mcpDirectTools?: string[];
|
|
35
|
-
subagentOnlyExtensions?: string[];
|
|
36
|
-
completionGuard?: boolean;
|
|
37
|
-
toolBudget?: ToolBudgetConfig;
|
|
38
|
-
}
|
|
39
|
-
interface BuiltinAgentOverrideConfig {
|
|
40
|
-
model?: string | false;
|
|
41
|
-
fallbackModels?: string[] | false;
|
|
42
|
-
thinking?: string | false;
|
|
43
|
-
systemPromptMode?: SystemPromptMode;
|
|
44
|
-
inheritProjectContext?: boolean;
|
|
45
|
-
inheritSkills?: boolean;
|
|
46
|
-
defaultContext?: AgentDefaultContext | false;
|
|
47
|
-
acceptanceRole?: AcceptanceRole | false;
|
|
48
|
-
disabled?: boolean;
|
|
49
|
-
systemPrompt?: string;
|
|
50
|
-
skills?: string[] | false;
|
|
51
|
-
tools?: string[] | false;
|
|
52
|
-
subagentOnlyExtensions?: string[] | false;
|
|
53
|
-
completionGuard?: boolean;
|
|
54
|
-
toolBudget?: ToolBudgetConfig | false;
|
|
55
|
-
}
|
|
56
|
-
interface BuiltinAgentOverrideInfo {
|
|
57
|
-
scope: "user" | "project";
|
|
58
|
-
path: string;
|
|
59
|
-
base: BuiltinAgentOverrideBase;
|
|
60
|
-
}
|
|
61
|
-
export interface AgentModelSourceInfo {
|
|
62
|
-
type: "subagents.defaultModel";
|
|
63
|
-
scope: "user" | "project";
|
|
64
|
-
path: string;
|
|
65
|
-
model: string;
|
|
66
|
-
}
|
|
67
|
-
export interface AgentConfig {
|
|
68
|
-
name: string;
|
|
69
|
-
localName?: string;
|
|
70
|
-
packageName?: string;
|
|
71
|
-
description: string;
|
|
72
|
-
tools?: string[];
|
|
73
|
-
mcpDirectTools?: string[];
|
|
74
|
-
model?: string;
|
|
75
|
-
fallbackModels?: string[];
|
|
76
|
-
thinking?: string | false;
|
|
77
|
-
systemPromptMode: SystemPromptMode;
|
|
78
|
-
inheritProjectContext: boolean;
|
|
79
|
-
inheritSkills: boolean;
|
|
80
|
-
defaultContext?: AgentDefaultContext;
|
|
81
|
-
defaultAsync?: boolean;
|
|
82
|
-
defaultTimeoutMs?: number;
|
|
83
|
-
defaultTurnBudget?: TurnBudgetConfig;
|
|
84
|
-
defaultAcceptance?: AcceptanceInput;
|
|
85
|
-
acceptanceRole?: AcceptanceRole;
|
|
86
|
-
systemPrompt: string;
|
|
87
|
-
source: AgentSource;
|
|
88
|
-
filePath: string;
|
|
89
|
-
skills?: string[];
|
|
90
|
-
skillPath?: string[];
|
|
91
|
-
extensions?: string[];
|
|
92
|
-
subagentOnlyExtensions?: string[];
|
|
93
|
-
output?: string;
|
|
94
|
-
defaultReads?: string[];
|
|
95
|
-
defaultProgress?: boolean;
|
|
96
|
-
interactive?: boolean;
|
|
97
|
-
maxSubagentDepth?: number;
|
|
98
|
-
completionGuard?: boolean;
|
|
99
|
-
toolBudget?: ToolBudgetConfig;
|
|
100
|
-
memory?: AgentMemoryConfig;
|
|
101
|
-
disabled?: boolean;
|
|
102
|
-
extraFields?: Record<string, string>;
|
|
103
|
-
override?: BuiltinAgentOverrideInfo;
|
|
104
|
-
modelSource?: AgentModelSourceInfo;
|
|
105
|
-
}
|
|
106
|
-
export interface ChainStepConfig {
|
|
107
|
-
agent?: string;
|
|
108
|
-
task?: string;
|
|
109
|
-
phase?: string;
|
|
110
|
-
label?: string;
|
|
111
|
-
as?: string;
|
|
112
|
-
outputSchema?: string | Record<string, unknown>;
|
|
113
|
-
output?: string | false;
|
|
114
|
-
outputMode?: OutputMode;
|
|
115
|
-
reads?: string[] | false;
|
|
116
|
-
model?: string;
|
|
117
|
-
skills?: string[] | false;
|
|
118
|
-
progress?: boolean;
|
|
119
|
-
parallel?: unknown;
|
|
120
|
-
expand?: unknown;
|
|
121
|
-
collect?: unknown;
|
|
122
|
-
concurrency?: number;
|
|
123
|
-
failFast?: boolean;
|
|
124
|
-
worktree?: boolean;
|
|
125
|
-
acceptance?: AcceptanceInput;
|
|
126
|
-
toolBudget?: ToolBudgetConfig;
|
|
127
|
-
}
|
|
128
|
-
export interface ChainConfig {
|
|
129
|
-
name: string;
|
|
130
|
-
localName?: string;
|
|
131
|
-
packageName?: string;
|
|
132
|
-
description: string;
|
|
133
|
-
source: AgentSource;
|
|
134
|
-
filePath: string;
|
|
135
|
-
steps: ChainStepConfig[];
|
|
136
|
-
extraFields?: Record<string, string>;
|
|
137
|
-
}
|
|
138
|
-
export interface ChainDiscoveryDiagnostic {
|
|
139
|
-
source: AgentSource;
|
|
140
|
-
filePath: string;
|
|
141
|
-
error: string;
|
|
142
|
-
}
|
|
143
|
-
interface AgentDiscoveryResult {
|
|
144
|
-
agents: AgentConfig[];
|
|
145
|
-
projectAgentsDir: string | null;
|
|
146
|
-
modelScope?: ModelScopeConfig;
|
|
147
|
-
}
|
|
148
|
-
export declare function findNearestProjectRoot(cwd: string): string | null;
|
|
149
|
-
export declare function buildBuiltinOverrideConfig(base: BuiltinAgentOverrideBase, draft: Pick<AgentConfig, "model" | "fallbackModels" | "thinking" | "systemPromptMode" | "inheritProjectContext" | "inheritSkills" | "defaultContext" | "acceptanceRole" | "disabled" | "systemPrompt" | "skills" | "tools" | "mcpDirectTools" | "subagentOnlyExtensions" | "completionGuard" | "toolBudget">): BuiltinAgentOverrideConfig | undefined;
|
|
150
|
-
export declare function saveBuiltinAgentOverride(cwd: string, name: string, scope: "user" | "project", override: BuiltinAgentOverrideConfig): string;
|
|
151
|
-
export declare function removeBuiltinAgentOverride(cwd: string, name: string, scope: "user" | "project"): {
|
|
152
|
-
path: string;
|
|
153
|
-
removed: boolean;
|
|
154
|
-
};
|
|
155
|
-
export declare function mergeBuiltinAgentOverride(cwd: string, name: string, scope: "user" | "project", fields: BuiltinAgentOverrideConfig): string;
|
|
156
|
-
export declare function removeBuiltinAgentOverrideFields(cwd: string, name: string, scope: "user" | "project", fields: string[]): {
|
|
157
|
-
path: string;
|
|
158
|
-
removed: boolean;
|
|
159
|
-
};
|
|
160
|
-
export declare const EXTRA_AGENT_DIRS_ENV = "PI_SUBAGENT_EXTRA_AGENT_DIRS";
|
|
161
|
-
export declare function discoverAgents(cwd: string, scope: AgentScope): AgentDiscoveryResult;
|
|
162
|
-
export declare function discoverAgentsAll(cwd: string): {
|
|
163
|
-
builtin: AgentConfig[];
|
|
164
|
-
package: AgentConfig[];
|
|
165
|
-
user: AgentConfig[];
|
|
166
|
-
project: AgentConfig[];
|
|
167
|
-
chains: ChainConfig[];
|
|
168
|
-
chainDiagnostics: ChainDiscoveryDiagnostic[];
|
|
169
|
-
userDir: string;
|
|
170
|
-
projectDir: string | null;
|
|
171
|
-
userChainDir: string;
|
|
172
|
-
projectChainDir: string | null;
|
|
173
|
-
userSettingsPath: string;
|
|
174
|
-
projectSettingsPath: string | null;
|
|
175
|
-
};
|
|
176
|
-
//# sourceMappingURL=agents.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/agents/agents.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n/**\n * Agent discovery and configuration\n */\n\nimport { execSync } from \"node:child_process\";\nimport * as fs from \"node:fs\";\nimport { parse as parseYaml } from \"yaml\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { AcceptanceInput, AcceptanceRole, OutputMode, ToolBudgetConfig, TurnBudgetConfig } from \"../shared/types.ts\";\nimport { getAgentDir, getProjectConfigDir } from \"../shared/utils.ts\";\nimport { KNOWN_FIELDS } from \"./agent-serializer.ts\";\nimport { parseChain, parseJsonChain } from \"./chain-serializer.ts\";\nimport { mergeAgentsForScope } from \"./agent-selection.ts\";\nimport { parseFrontmatter } from \"./frontmatter.ts\";\nimport { buildRuntimeName, parsePackageName } from \"./identity.ts\";\nimport { parseModelScopeConfig, type ModelScopeConfig } from \"../runs/shared/model-scope.ts\";\nexport { buildRuntimeName, frontmatterNameForConfig, parsePackageName } from \"./identity.ts\";\nimport { parseMemoryFrontmatter } from \"./agent-memory.ts\";\nimport { resolveTurnBudgetConfig } from \"../runs/shared/turn-budget.ts\";\nimport { validateAcceptanceInput } from \"../runs/shared/acceptance.ts\";\n\nexport type AgentScope = \"user\" | \"project\" | \"both\";\n\nexport type AgentSource = \"builtin\" | \"package\" | \"user\" | \"project\";\ntype SystemPromptMode = \"append\" | \"replace\";\nexport type AgentDefaultContext = \"fresh\" | \"fork\";\n\nexport type AgentMemoryScope = \"project\" | \"user\";\n\nexport interface AgentMemoryConfig {\n\tscope: AgentMemoryScope;\n\tpath: string;\n}\n\nexport const BUILTIN_AGENT_NAMES = [\n\t\"context-builder\",\n\t\"delegate\",\n\t\"oracle\",\n\t\"planner\",\n\t\"researcher\",\n\t\"reviewer\",\n\t\"scout\",\n\t\"worker\",\n] as const;\n\nexport function defaultSystemPromptMode(name: string): SystemPromptMode {\n\treturn name === \"delegate\" ? \"append\" : \"replace\";\n}\n\nexport function defaultInheritProjectContext(name: string): boolean {\n\treturn name === \"delegate\";\n}\n\nexport function defaultInheritSkills(): boolean {\n\treturn false;\n}\n\nexport interface BuiltinAgentOverrideBase {\n\tmodel?: string;\n\tfallbackModels?: string[];\n\tthinking?: string | false;\n\tsystemPromptMode: SystemPromptMode;\n\tinheritProjectContext: boolean;\n\tinheritSkills: boolean;\n\tdefaultContext?: AgentDefaultContext;\n\tacceptanceRole?: AcceptanceRole;\n\tdisabled?: boolean;\n\tsystemPrompt: string;\n\tskills?: string[];\n\tskillPath?: string[];\n\ttools?: string[];\n\tmcpDirectTools?: string[];\n\tsubagentOnlyExtensions?: string[];\n\tcompletionGuard?: boolean;\n\ttoolBudget?: ToolBudgetConfig;\n}\n\ninterface BuiltinAgentOverrideConfig {\n\tmodel?: string | false;\n\tfallbackModels?: string[] | false;\n\tthinking?: string | false;\n\tsystemPromptMode?: SystemPromptMode;\n\tinheritProjectContext?: boolean;\n\tinheritSkills?: boolean;\n\tdefaultContext?: AgentDefaultContext | false;\n\tacceptanceRole?: AcceptanceRole | false;\n\tdisabled?: boolean;\n\tsystemPrompt?: string;\n\tskills?: string[] | false;\n\ttools?: string[] | false;\n\tsubagentOnlyExtensions?: string[] | false;\n\tcompletionGuard?: boolean;\n\ttoolBudget?: ToolBudgetConfig | false;\n}\n\ninterface BuiltinAgentOverrideInfo {\n\tscope: \"user\" | \"project\";\n\tpath: string;\n\tbase: BuiltinAgentOverrideBase;\n}\n\nexport interface AgentModelSourceInfo {\n\ttype: \"subagents.defaultModel\";\n\tscope: \"user\" | \"project\";\n\tpath: string;\n\tmodel: string;\n}\n\nexport interface AgentConfig {\n\tname: string;\n\tlocalName?: string;\n\tpackageName?: string;\n\tdescription: string;\n\ttools?: string[];\n\tmcpDirectTools?: string[];\n\tmodel?: string;\n\tfallbackModels?: string[];\n\tthinking?: string | false;\n\tsystemPromptMode: SystemPromptMode;\n\tinheritProjectContext: boolean;\n\tinheritSkills: boolean;\n\tdefaultContext?: AgentDefaultContext;\n\tdefaultAsync?: boolean;\n\tdefaultTimeoutMs?: number;\n\tdefaultTurnBudget?: TurnBudgetConfig;\n\tdefaultAcceptance?: AcceptanceInput;\n\tacceptanceRole?: AcceptanceRole;\n\tsystemPrompt: string;\n\tsource: AgentSource;\n\tfilePath: string;\n\tskills?: string[];\n\tskillPath?: string[];\n\textensions?: string[];\n\tsubagentOnlyExtensions?: string[];\n\toutput?: string;\n\tdefaultReads?: string[];\n\tdefaultProgress?: boolean;\n\tinteractive?: boolean;\n\tmaxSubagentDepth?: number;\n\tcompletionGuard?: boolean;\n\ttoolBudget?: ToolBudgetConfig;\n\tmemory?: AgentMemoryConfig;\n\tdisabled?: boolean;\n\textraFields?: Record<string, string>;\n\toverride?: BuiltinAgentOverrideInfo;\n\tmodelSource?: AgentModelSourceInfo;\n}\n\ninterface SubagentSettings {\n\toverrides: Record<string, BuiltinAgentOverrideConfig>;\n\tdefaultModel?: string;\n\tdisableBuiltins?: boolean;\n\tdisableThinking?: boolean;\n\tmodelScope?: ModelScopeConfig;\n}\n\nconst EMPTY_SUBAGENT_SETTINGS: SubagentSettings = { overrides: {} };\nconst agentFrontmatterFields = new WeakMap<AgentConfig, Set<string>>();\n\nexport interface ChainStepConfig {\n\tagent?: string;\n\ttask?: string;\n\tphase?: string;\n\tlabel?: string;\n\tas?: string;\n\toutputSchema?: string | Record<string, unknown>;\n\toutput?: string | false;\n\toutputMode?: OutputMode;\n\treads?: string[] | false;\n\tmodel?: string;\n\tskills?: string[] | false;\n\tprogress?: boolean;\n\tparallel?: unknown;\n\texpand?: unknown;\n\tcollect?: unknown;\n\tconcurrency?: number;\n\tfailFast?: boolean;\n\tworktree?: boolean;\n\tacceptance?: AcceptanceInput;\n\ttoolBudget?: ToolBudgetConfig;\n}\n\nexport interface ChainConfig {\n\tname: string;\n\tlocalName?: string;\n\tpackageName?: string;\n\tdescription: string;\n\tsource: AgentSource;\n\tfilePath: string;\n\tsteps: ChainStepConfig[];\n\textraFields?: Record<string, string>;\n}\n\nexport interface ChainDiscoveryDiagnostic {\n\tsource: AgentSource;\n\tfilePath: string;\n\terror: string;\n}\n\ninterface AgentDiscoveryResult {\n\tagents: AgentConfig[];\n\tprojectAgentsDir: string | null;\n\tmodelScope?: ModelScopeConfig;\n}\n\nfunction getUserChainDir(): string {\n\treturn path.join(getAgentDir(), \"chains\");\n}\n\ninterface PackageSubagentPaths {\n\tagents: string[];\n\tchains: string[];\n}\n\nlet cachedGlobalNpmRoot: string | null = null;\n\nfunction readJsonFileBestEffort(filePath: string): unknown {\n\ttry {\n\t\treturn JSON.parse(fs.readFileSync(filePath, \"utf-8\"));\n\t} catch {\n\t\t// Installed package scans are opportunistic; bad third-party manifests\n\t\t// should not break local agent discovery.\n\t\treturn null;\n\t}\n}\n\nfunction readOptionalJsonFile(filePath: string): unknown {\n\ttry {\n\t\treturn JSON.parse(fs.readFileSync(filePath, \"utf-8\"));\n\t} catch (error) {\n\t\tconst code = typeof error === \"object\" && error !== null && \"code\" in error\n\t\t\t? (error as { code?: unknown }).code\n\t\t\t: undefined;\n\t\tif (code === \"ENOENT\") return null;\n\t\tthrow error;\n\t}\n}\n\nfunction isSafePackagePath(value: string): boolean {\n\treturn value.length > 0\n\t\t&& !path.isAbsolute(value)\n\t\t&& value.split(/[\\\\/]/).every((part) => part.length > 0 && part !== \".\" && part !== \"..\");\n}\n\nfunction parseNpmPackageName(source: string): string | undefined {\n\tconst spec = source.slice(4).trim();\n\tif (!spec) return undefined;\n\tconst match = spec.match(/^(@?[^@]+(?:\\/[^@]+)?)(?:@(.+))?$/);\n\tconst packageName = match?.[1] ?? spec;\n\treturn isSafePackagePath(packageName) ? packageName : undefined;\n}\n\nfunction stripGitRef(repoPath: string): string {\n\tconst atIndex = repoPath.indexOf(\"@\");\n\tconst hashIndex = repoPath.indexOf(\"#\");\n\tconst refIndex = [atIndex, hashIndex].filter((index) => index >= 0).sort((a, b) => a - b)[0];\n\treturn refIndex === undefined ? repoPath : repoPath.slice(0, refIndex);\n}\n\nfunction parseGitPackagePath(source: string): { host: string; repoPath: string } | undefined {\n\tconst spec = source.slice(4).trim();\n\tif (!spec) return undefined;\n\n\tlet host = \"\";\n\tlet repoPath = \"\";\n\tconst scpLike = spec.match(/^git@([^:]+):(.+)$/);\n\tif (scpLike) {\n\t\thost = scpLike[1] ?? \"\";\n\t\trepoPath = scpLike[2] ?? \"\";\n\t} else if (/^[a-z][a-z0-9+.-]*:\\/\\//i.test(spec)) {\n\t\ttry {\n\t\t\tconst url = new URL(spec);\n\t\t\thost = url.hostname;\n\t\t\trepoPath = url.pathname.replace(/^\\/+/, \"\");\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t} else {\n\t\tconst slashIndex = spec.indexOf(\"/\");\n\t\tif (slashIndex < 0) return undefined;\n\t\thost = spec.slice(0, slashIndex);\n\t\trepoPath = spec.slice(slashIndex + 1);\n\t}\n\n\tconst normalizedPath = stripGitRef(repoPath).replace(/\\.git$/, \"\").replace(/^\\/+/, \"\");\n\tif (!host || !isSafePackagePath(host) || !isSafePackagePath(normalizedPath) || normalizedPath.split(/[\\\\/]/).length < 2) {\n\t\treturn undefined;\n\t}\n\treturn { host, repoPath: normalizedPath };\n}\n\nfunction resolveSettingsPackageRoot(source: string, baseDir: string): string | undefined {\n\tconst trimmed = source.trim();\n\tif (!trimmed) return undefined;\n\tif (trimmed.startsWith(\"git:\")) {\n\t\tconst parsed = parseGitPackagePath(trimmed);\n\t\treturn parsed ? path.join(baseDir, \"git\", parsed.host, parsed.repoPath) : undefined;\n\t}\n\tif (trimmed.startsWith(\"npm:\")) {\n\t\tconst packageName = parseNpmPackageName(trimmed);\n\t\treturn packageName ? path.join(baseDir, \"npm\", \"node_modules\", packageName) : undefined;\n\t}\n\tconst normalized = trimmed.startsWith(\"file:\") ? trimmed.slice(5) : trimmed;\n\tif (normalized === \"~\") return os.homedir();\n\tif (normalized.startsWith(\"~/\")) return path.join(os.homedir(), normalized.slice(2));\n\tif (path.isAbsolute(normalized)) return normalized;\n\tif (normalized === \".\" || normalized === \"..\" || normalized.startsWith(\"./\") || normalized.startsWith(\"../\")) {\n\t\treturn path.resolve(baseDir, normalized);\n\t}\n\treturn undefined;\n}\n\nfunction getGlobalNpmRoot(): string | null {\n\tif (cachedGlobalNpmRoot !== null) return cachedGlobalNpmRoot;\n\ttry {\n\t\tcachedGlobalNpmRoot = fs.realpathSync(execSync(\"npm root -g\", { encoding: \"utf-8\", timeout: 5000 }).trim());\n\t\treturn cachedGlobalNpmRoot;\n\t} catch {\n\t\tcachedGlobalNpmRoot = \"\";\n\t\treturn null;\n\t}\n}\n\nfunction stringArray(value: unknown): string[] {\n\tif (!Array.isArray(value)) return [];\n\treturn value.filter((entry): entry is string => typeof entry === \"string\" && entry.trim().length > 0);\n}\n\nfunction extractSubagentPathsFromPackageRoot(packageRoot: string): PackageSubagentPaths {\n\tconst packageJsonPath = path.join(packageRoot, \"package.json\");\n\tconst pkg = readJsonFileBestEffort(packageJsonPath);\n\tif (!pkg || typeof pkg !== \"object\" || Array.isArray(pkg)) return { agents: [], chains: [] };\n\n\tconst roots: Record<string, unknown>[] = [];\n\tconst piSubagents = (pkg as { \"pi-subagents\"?: unknown })[\"pi-subagents\"];\n\tif (piSubagents && typeof piSubagents === \"object\" && !Array.isArray(piSubagents)) {\n\t\troots.push(piSubagents as Record<string, unknown>);\n\t}\n\n\tconst pi = (pkg as { pi?: unknown }).pi;\n\tif (pi && typeof pi === \"object\" && !Array.isArray(pi)) {\n\t\tconst subagents = (pi as { subagents?: unknown }).subagents;\n\t\tif (subagents && typeof subagents === \"object\" && !Array.isArray(subagents)) {\n\t\t\troots.push(subagents as Record<string, unknown>);\n\t\t}\n\t}\n\n\tconst agents: string[] = [];\n\tconst chains: string[] = [];\n\tfor (const root of roots) {\n\t\tfor (const entry of stringArray(root.agents)) agents.push(path.resolve(packageRoot, entry));\n\t\tfor (const entry of stringArray(root.chains)) chains.push(path.resolve(packageRoot, entry));\n\t}\n\treturn { agents, chains };\n}\n\nfunction collectPackageRootsFromNodeModules(nodeModulesDir: string): string[] {\n\tconst roots: string[] = [];\n\tif (!fs.existsSync(nodeModulesDir)) return roots;\n\n\tlet entries: fs.Dirent[];\n\ttry {\n\t\tentries = fs.readdirSync(nodeModulesDir, { withFileTypes: true });\n\t} catch {\n\t\treturn roots;\n\t}\n\n\tfor (const entry of entries) {\n\t\tif (entry.name.startsWith(\".\")) continue;\n\t\tif (!entry.isDirectory() && !entry.isSymbolicLink()) continue;\n\n\t\tif (entry.name.startsWith(\"@\")) {\n\t\t\tconst scopeDir = path.join(nodeModulesDir, entry.name);\n\t\t\tlet scopeEntries: fs.Dirent[];\n\t\t\ttry {\n\t\t\t\tscopeEntries = fs.readdirSync(scopeDir, { withFileTypes: true });\n\t\t\t} catch {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfor (const scopeEntry of scopeEntries) {\n\t\t\t\tif (scopeEntry.name.startsWith(\".\")) continue;\n\t\t\t\tif (!scopeEntry.isDirectory() && !scopeEntry.isSymbolicLink()) continue;\n\t\t\t\troots.push(path.join(scopeDir, scopeEntry.name));\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\troots.push(path.join(nodeModulesDir, entry.name));\n\t}\n\treturn roots;\n}\n\nfunction collectSettingsPackageRoots(settingsFile: string, baseDir: string): string[] {\n\tconst settings = readOptionalJsonFile(settingsFile);\n\tif (!settings || typeof settings !== \"object\" || Array.isArray(settings)) return [];\n\tconst packages = (settings as { packages?: unknown }).packages;\n\tif (!Array.isArray(packages)) return [];\n\n\tconst roots: string[] = [];\n\tfor (const entry of packages) {\n\t\tconst packageSource = typeof entry === \"string\"\n\t\t\t? entry\n\t\t\t: typeof entry === \"object\" && entry !== null && typeof (entry as { source?: unknown }).source === \"string\"\n\t\t\t\t? (entry as { source: string }).source\n\t\t\t\t: undefined;\n\t\tif (!packageSource) continue;\n\t\tconst packageRoot = resolveSettingsPackageRoot(packageSource, baseDir);\n\t\tif (packageRoot) roots.push(packageRoot);\n\t}\n\treturn roots;\n}\n\nfunction collectPackageSubagentPaths(cwd: string, options: { includeUser: boolean; includeProject: boolean } = { includeUser: true, includeProject: true }): PackageSubagentPaths {\n\tconst agentDir = getAgentDir();\n\tconst projectRoot = findNearestProjectRoot(cwd) ?? cwd;\n\tconst packageRoots = [\n\t\tprojectRoot,\n\t];\n\n\tif (options.includeProject) {\n\t\tconst projectConfigDir = getProjectConfigDir(projectRoot);\n\t\tpackageRoots.push(\n\t\t\t...collectPackageRootsFromNodeModules(path.join(projectConfigDir, \"npm\", \"node_modules\")),\n\t\t\t...collectSettingsPackageRoots(path.join(projectConfigDir, \"settings.json\"), projectConfigDir),\n\t\t);\n\t}\n\n\tif (options.includeUser) {\n\t\tpackageRoots.push(\n\t\t\t...collectPackageRootsFromNodeModules(path.join(agentDir, \"npm\", \"node_modules\")),\n\t\t\t...collectSettingsPackageRoots(path.join(agentDir, \"settings.json\"), agentDir),\n\t\t);\n\t}\n\n\tif (options.includeUser) {\n\t\tconst globalRoot = getGlobalNpmRoot();\n\t\tif (globalRoot) packageRoots.push(...collectPackageRootsFromNodeModules(globalRoot));\n\t}\n\n\tconst seenRoots = new Set<string>();\n\tconst seenAgents = new Set<string>();\n\tconst seenChains = new Set<string>();\n\tconst agents: string[] = [];\n\tconst chains: string[] = [];\n\tfor (const packageRoot of packageRoots) {\n\t\tconst resolvedRoot = path.resolve(packageRoot);\n\t\tif (seenRoots.has(resolvedRoot)) continue;\n\t\tseenRoots.add(resolvedRoot);\n\t\tconst paths = extractSubagentPathsFromPackageRoot(resolvedRoot);\n\t\tfor (const agentDir of paths.agents) {\n\t\t\tif (seenAgents.has(agentDir)) continue;\n\t\t\tseenAgents.add(agentDir);\n\t\t\tagents.push(agentDir);\n\t\t}\n\t\tfor (const chainDir of paths.chains) {\n\t\t\tif (seenChains.has(chainDir)) continue;\n\t\t\tseenChains.add(chainDir);\n\t\t\tchains.push(chainDir);\n\t\t}\n\t}\n\treturn { agents, chains };\n}\n\nfunction splitToolList(rawTools: string[] | undefined): { tools?: string[]; mcpDirectTools?: string[] } {\n\tconst mcpDirectTools: string[] = [];\n\tconst tools: string[] = [];\n\tfor (const tool of rawTools ?? []) {\n\t\tif (tool.startsWith(\"mcp:\")) {\n\t\t\tmcpDirectTools.push(tool.slice(4));\n\t\t} else {\n\t\t\ttools.push(tool);\n\t\t}\n\t}\n\treturn {\n\t\t...(tools.length > 0 ? { tools } : {}),\n\t\t...(mcpDirectTools.length > 0 ? { mcpDirectTools } : {}),\n\t};\n}\n\nfunction joinToolList(config: Pick<AgentConfig, \"tools\" | \"mcpDirectTools\">): string[] | undefined {\n\tconst joined = [\n\t\t...(config.tools ?? []),\n\t\t...(config.mcpDirectTools ?? []).map((tool) => `mcp:${tool}`),\n\t];\n\treturn joined.length > 0 ? joined : undefined;\n}\n\nfunction arraysEqual(a: string[] | undefined, b: string[] | undefined): boolean {\n\tif (!a && !b) return true;\n\tif (!a || !b) return false;\n\tif (a.length !== b.length) return false;\n\tfor (let i = 0; i < a.length; i++) {\n\t\tif (a[i] !== b[i]) return false;\n\t}\n\treturn true;\n}\n\nfunction cloneOverrideBase(agent: AgentConfig): BuiltinAgentOverrideBase {\n\treturn {\n\t\tmodel: agent.model,\n\t\tfallbackModels: agent.fallbackModels ? [...agent.fallbackModels] : undefined,\n\t\tthinking: agent.thinking,\n\t\tsystemPromptMode: agent.systemPromptMode,\n\t\tinheritProjectContext: agent.inheritProjectContext,\n\t\tinheritSkills: agent.inheritSkills,\n\t\tdefaultContext: agent.defaultContext,\n\t\tacceptanceRole: agent.acceptanceRole,\n\t\tdisabled: agent.disabled,\n\t\tsystemPrompt: agent.systemPrompt,\n\t\tskills: agent.skills ? [...agent.skills] : undefined,\n\t\tskillPath: agent.skillPath ? [...agent.skillPath] : undefined,\n\t\ttools: agent.tools ? [...agent.tools] : undefined,\n\t\tmcpDirectTools: agent.mcpDirectTools ? [...agent.mcpDirectTools] : undefined,\n\t\tsubagentOnlyExtensions: agent.subagentOnlyExtensions ? [...agent.subagentOnlyExtensions] : undefined,\n\t\tcompletionGuard: agent.completionGuard,\n\t\ttoolBudget: agent.toolBudget,\n\t};\n}\n\nfunction cloneOverrideValue(override: BuiltinAgentOverrideConfig): BuiltinAgentOverrideConfig {\n\treturn {\n\t\t...(override.model !== undefined ? { model: override.model } : {}),\n\t\t...(override.fallbackModels !== undefined\n\t\t\t? { fallbackModels: override.fallbackModels === false ? false : [...override.fallbackModels] }\n\t\t\t: {}),\n\t\t...(override.thinking !== undefined ? { thinking: override.thinking } : {}),\n\t\t...(override.systemPromptMode !== undefined ? { systemPromptMode: override.systemPromptMode } : {}),\n\t\t...(override.inheritProjectContext !== undefined ? { inheritProjectContext: override.inheritProjectContext } : {}),\n\t\t...(override.inheritSkills !== undefined ? { inheritSkills: override.inheritSkills } : {}),\n\t\t...(override.defaultContext !== undefined ? { defaultContext: override.defaultContext } : {}),\n\t\t...(override.acceptanceRole !== undefined ? { acceptanceRole: override.acceptanceRole } : {}),\n\t\t...(override.disabled !== undefined ? { disabled: override.disabled } : {}),\n\t\t...(override.systemPrompt !== undefined ? { systemPrompt: override.systemPrompt } : {}),\n\t\t...(override.skills !== undefined ? { skills: override.skills === false ? false : [...override.skills] } : {}),\n\t\t...(override.tools !== undefined ? { tools: override.tools === false ? false : [...override.tools] } : {}),\n\t\t...(override.subagentOnlyExtensions !== undefined ? { subagentOnlyExtensions: override.subagentOnlyExtensions === false ? false : [...override.subagentOnlyExtensions] } : {}),\n\t\t...(override.completionGuard !== undefined ? { completionGuard: override.completionGuard } : {}),\n\t\t...(override.toolBudget !== undefined ? { toolBudget: override.toolBudget === false ? false : { ...override.toolBudget, ...(Array.isArray(override.toolBudget.block) ? { block: [...override.toolBudget.block] } : {}) } } : {}),\n\t};\n}\n\nexport function findNearestProjectRoot(cwd: string): string | null {\n\tlet currentDir = cwd;\n\twhile (true) {\n\t\tif (isDirectory(getProjectConfigDir(currentDir)) || isDirectory(path.join(currentDir, \".agents\"))) {\n\t\t\treturn currentDir;\n\t\t}\n\n\t\tconst parentDir = path.dirname(currentDir);\n\t\tif (parentDir === currentDir) return null;\n\t\tcurrentDir = parentDir;\n\t}\n}\n\nfunction getUserAgentSettingsPath(): string {\n\treturn path.join(getAgentDir(), \"settings.json\");\n}\n\nfunction getProjectAgentSettingsPath(cwd: string): string | null {\n\tconst projectRoot = findNearestProjectRoot(cwd);\n\treturn projectRoot ? path.join(getProjectConfigDir(projectRoot), \"settings.json\") : null;\n}\n\nfunction readSettingsFileStrict(filePath: string): Record<string, unknown> {\n\tif (!fs.existsSync(filePath)) return {};\n\tlet raw: string;\n\ttry {\n\t\traw = fs.readFileSync(filePath, \"utf-8\");\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tthrow new Error(`Failed to read settings file '${filePath}': ${message}`, { cause: error });\n\t}\n\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(raw);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tthrow new Error(`Failed to parse settings file '${filePath}': ${message}`, { cause: error });\n\t}\n\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n\t\tthrow new Error(`Settings file '${filePath}' must contain a JSON object.`);\n\t}\n\treturn parsed as Record<string, unknown>;\n}\n\nfunction writeSettingsFile(filePath: string, settings: Record<string, unknown>): void {\n\tfs.mkdirSync(path.dirname(filePath), { recursive: true });\n\tfs.writeFileSync(filePath, JSON.stringify(settings, null, 2) + \"\\n\", \"utf-8\");\n}\n\nfunction parseOverrideStringArrayOrFalse(\n\tvalue: unknown,\n\tmeta: { filePath: string; name: string; field: string },\n): string[] | false | undefined {\n\tif (value === undefined) return undefined;\n\tif (value === false) return false;\n\tif (!Array.isArray(value)) {\n\t\tthrow new Error(`Builtin override '${meta.name}' in '${meta.filePath}' has invalid '${meta.field}'; expected an array of strings or false.`);\n\t}\n\n\tconst items: string[] = [];\n\tfor (const item of value) {\n\t\tif (typeof item !== \"string\") {\n\t\t\tthrow new Error(`Builtin override '${meta.name}' in '${meta.filePath}' has invalid '${meta.field}'; expected an array of strings or false.`);\n\t\t}\n\t\tconst trimmed = item.trim();\n\t\tif (trimmed) items.push(trimmed);\n\t}\n\treturn items;\n}\n\nfunction parseBuiltinOverrideEntry(\n\tname: string,\n\tvalue: unknown,\n\tfilePath: string,\n): BuiltinAgentOverrideConfig | undefined {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) {\n\t\tthrow new Error(`Builtin override '${name}' in '${filePath}' must be an object.`);\n\t}\n\n\tconst input = value as Record<string, unknown>;\n\tconst override: BuiltinAgentOverrideConfig = {};\n\n\tif (\"model\" in input) {\n\t\tif (typeof input.model === \"string\" || input.model === false) override.model = input.model;\n\t\telse throw new Error(`Builtin override '${name}' in '${filePath}' has invalid 'model'; expected a string or false.`);\n\t}\n\n\tif (\"thinking\" in input) {\n\t\tif (typeof input.thinking === \"string\" || input.thinking === false) override.thinking = input.thinking;\n\t\telse throw new Error(`Builtin override '${name}' in '${filePath}' has invalid 'thinking'; expected a string or false.`);\n\t}\n\n\tif (\"systemPromptMode\" in input) {\n\t\tif (input.systemPromptMode === \"append\" || input.systemPromptMode === \"replace\") {\n\t\t\toverride.systemPromptMode = input.systemPromptMode;\n\t\t} else {\n\t\t\tthrow new Error(`Builtin override '${name}' in '${filePath}' has invalid 'systemPromptMode'; expected 'append' or 'replace'.`);\n\t\t}\n\t}\n\n\tif (\"inheritProjectContext\" in input) {\n\t\tif (typeof input.inheritProjectContext === \"boolean\") {\n\t\t\toverride.inheritProjectContext = input.inheritProjectContext;\n\t\t} else {\n\t\t\tthrow new Error(`Builtin override '${name}' in '${filePath}' has invalid 'inheritProjectContext'; expected a boolean.`);\n\t\t}\n\t}\n\n\tif (\"inheritSkills\" in input) {\n\t\tif (typeof input.inheritSkills === \"boolean\") {\n\t\t\toverride.inheritSkills = input.inheritSkills;\n\t\t} else {\n\t\t\tthrow new Error(`Builtin override '${name}' in '${filePath}' has invalid 'inheritSkills'; expected a boolean.`);\n\t\t}\n\t}\n\n\tif (\"defaultContext\" in input) {\n\t\tif (input.defaultContext === \"fresh\" || input.defaultContext === \"fork\" || input.defaultContext === false) {\n\t\t\toverride.defaultContext = input.defaultContext;\n\t\t} else {\n\t\t\tthrow new Error(`Builtin override '${name}' in '${filePath}' has invalid 'defaultContext'; expected 'fresh', 'fork', or false.`);\n\t\t}\n\t}\n\n\tif (\"acceptanceRole\" in input) {\n\t\tif (input.acceptanceRole === \"read-only\" || input.acceptanceRole === \"writer\" || input.acceptanceRole === false) {\n\t\t\toverride.acceptanceRole = input.acceptanceRole;\n\t\t} else {\n\t\t\tthrow new Error(`Builtin override '${name}' in '${filePath}' has invalid 'acceptanceRole'; expected 'read-only', 'writer', or false.`);\n\t\t}\n\t}\n\n\tif (\"disabled\" in input) {\n\t\tif (typeof input.disabled === \"boolean\") {\n\t\t\toverride.disabled = input.disabled;\n\t\t} else {\n\t\t\tthrow new Error(`Builtin override '${name}' in '${filePath}' has invalid 'disabled'; expected a boolean.`);\n\t\t}\n\t}\n\n\tif (\"completionGuard\" in input) {\n\t\tif (typeof input.completionGuard === \"boolean\") {\n\t\t\toverride.completionGuard = input.completionGuard;\n\t\t} else {\n\t\t\tthrow new Error(`Builtin override '${name}' in '${filePath}' has invalid 'completionGuard'; expected a boolean.`);\n\t\t}\n\t}\n\n\tif (\"toolBudget\" in input) {\n\t\tif (input.toolBudget === false) {\n\t\t\toverride.toolBudget = false;\n\t\t} else if (input.toolBudget && typeof input.toolBudget === \"object\" && !Array.isArray(input.toolBudget)) {\n\t\t\toverride.toolBudget = input.toolBudget as ToolBudgetConfig;\n\t\t} else {\n\t\t\tthrow new Error(`Builtin override '${name}' in '${filePath}' has invalid 'toolBudget'; expected an object or false.`);\n\t\t}\n\t}\n\n\tif (\"systemPrompt\" in input) {\n\t\tif (typeof input.systemPrompt === \"string\") override.systemPrompt = input.systemPrompt;\n\t\telse throw new Error(`Builtin override '${name}' in '${filePath}' has invalid 'systemPrompt'; expected a string.`);\n\t}\n\n\tconst fallbackModels = parseOverrideStringArrayOrFalse(input.fallbackModels, { filePath, name, field: \"fallbackModels\" });\n\tif (fallbackModels !== undefined) override.fallbackModels = fallbackModels;\n\n\tconst skills = parseOverrideStringArrayOrFalse(input.skills, { filePath, name, field: \"skills\" });\n\tif (skills !== undefined) override.skills = skills;\n\n\tconst tools = parseOverrideStringArrayOrFalse(input.tools, { filePath, name, field: \"tools\" });\n\tif (tools !== undefined) override.tools = tools;\n\n\tconst subagentOnlyExtensions = parseOverrideStringArrayOrFalse(input.subagentOnlyExtensions, { filePath, name, field: \"subagentOnlyExtensions\" });\n\tif (subagentOnlyExtensions !== undefined) override.subagentOnlyExtensions = subagentOnlyExtensions;\n\n\treturn Object.keys(override).length > 0 ? override : undefined;\n}\n\nfunction readSubagentSettings(filePath: string | null): SubagentSettings {\n\tif (!filePath) return EMPTY_SUBAGENT_SETTINGS;\n\tconst settings = readSettingsFileStrict(filePath);\n\tconst subagents = settings.subagents;\n\tif (!subagents || typeof subagents !== \"object\" || Array.isArray(subagents)) return EMPTY_SUBAGENT_SETTINGS;\n\n\tconst subagentsObject = subagents as Record<string, unknown>;\n\tlet disableBuiltins: boolean | undefined;\n\tif (\"disableBuiltins\" in subagentsObject) {\n\t\tif (typeof subagentsObject.disableBuiltins === \"boolean\") {\n\t\t\tdisableBuiltins = subagentsObject.disableBuiltins;\n\t\t} else {\n\t\t\tthrow new Error(`Subagent settings in '${filePath}' have invalid 'disableBuiltins'; expected a boolean.`);\n\t\t}\n\t}\n\tlet disableThinking: boolean | undefined;\n\tif (\"disableThinking\" in subagentsObject) {\n\t\tif (typeof subagentsObject.disableThinking === \"boolean\") {\n\t\t\tdisableThinking = subagentsObject.disableThinking;\n\t\t} else {\n\t\t\tthrow new Error(`Subagent settings in '${filePath}' have invalid 'disableThinking'; expected a boolean.`);\n\t\t}\n\t}\n\tlet defaultModel: string | undefined;\n\tif (\"defaultModel\" in subagentsObject) {\n\t\tif (typeof subagentsObject.defaultModel === \"string\" && subagentsObject.defaultModel.trim()) {\n\t\t\tdefaultModel = subagentsObject.defaultModel.trim();\n\t\t} else {\n\t\t\tthrow new Error(`Subagent settings in '${filePath}' have invalid 'defaultModel'; expected a non-empty string.`);\n\t\t}\n\t}\n\tconst modelScope = parseModelScopeConfig(subagentsObject.modelScope, { filePath });\n\n\tconst parsed: Record<string, BuiltinAgentOverrideConfig> = {};\n\tconst agentOverrides = subagentsObject.agentOverrides;\n\tif (!agentOverrides || typeof agentOverrides !== \"object\" || Array.isArray(agentOverrides)) {\n\t\treturn { overrides: parsed, defaultModel, disableBuiltins, disableThinking, modelScope };\n\t}\n\tfor (const [name, value] of Object.entries(agentOverrides)) {\n\t\tconst override = parseBuiltinOverrideEntry(name, value, filePath);\n\t\tif (override) parsed[name] = override;\n\t}\n\treturn { overrides: parsed, defaultModel, disableBuiltins, disableThinking, modelScope };\n}\n\nfunction resolveSubagentDefaultModel(\n\tuserSettings: SubagentSettings,\n\tprojectSettings: SubagentSettings,\n\tuserSettingsPath: string,\n\tprojectSettingsPath: string | null,\n): AgentModelSourceInfo | undefined {\n\tif (projectSettingsPath && projectSettings.defaultModel !== undefined) {\n\t\treturn { type: \"subagents.defaultModel\", scope: \"project\", path: projectSettingsPath, model: projectSettings.defaultModel };\n\t}\n\treturn userSettings.defaultModel !== undefined\n\t\t? { type: \"subagents.defaultModel\", scope: \"user\", path: userSettingsPath, model: userSettings.defaultModel }\n\t\t: undefined;\n}\n\nfunction applySubagentDefaultModel(agents: AgentConfig[], defaultModel: AgentModelSourceInfo | undefined): AgentConfig[] {\n\tif (!defaultModel) return agents;\n\treturn agents.map((agent) => {\n\t\tif (agent.model !== undefined) return agent;\n\t\tconst next = { ...agent, model: defaultModel.model, modelSource: defaultModel };\n\t\tconst frontmatterFields = agentFrontmatterFields.get(agent);\n\t\tif (frontmatterFields) agentFrontmatterFields.set(next, frontmatterFields);\n\t\treturn next;\n\t});\n}\n\nfunction applyBuiltinOverride(\n\tagent: AgentConfig,\n\toverride: BuiltinAgentOverrideConfig,\n\tmeta: { scope: \"user\" | \"project\"; path: string },\n): AgentConfig {\n\tconst next: AgentConfig = {\n\t\t...agent,\n\t\toverride: { ...meta, base: cloneOverrideBase(agent) },\n\t};\n\n\tif (override.model !== undefined) next.model = override.model === false ? undefined : override.model;\n\tif (override.fallbackModels !== undefined) {\n\t\tnext.fallbackModels = override.fallbackModels === false ? undefined : [...override.fallbackModels];\n\t}\n\tif (override.thinking !== undefined) next.thinking = override.thinking === false ? undefined : override.thinking;\n\tif (override.systemPromptMode !== undefined) next.systemPromptMode = override.systemPromptMode;\n\tif (override.inheritProjectContext !== undefined) next.inheritProjectContext = override.inheritProjectContext;\n\tif (override.inheritSkills !== undefined) next.inheritSkills = override.inheritSkills;\n\tif (override.defaultContext !== undefined) next.defaultContext = override.defaultContext === false ? undefined : override.defaultContext;\n\tif (override.acceptanceRole !== undefined) next.acceptanceRole = override.acceptanceRole === false ? undefined : override.acceptanceRole;\n\tif (override.disabled !== undefined) next.disabled = override.disabled;\n\tif (override.systemPrompt !== undefined) next.systemPrompt = override.systemPrompt;\n\tif (override.skills !== undefined) next.skills = override.skills === false ? undefined : [...override.skills];\n\tif (override.tools !== undefined) {\n\t\tconst { tools, mcpDirectTools } = splitToolList(override.tools === false ? [] : override.tools);\n\t\tnext.tools = tools;\n\t\tnext.mcpDirectTools = mcpDirectTools;\n\t}\n\tif (override.subagentOnlyExtensions !== undefined) {\n\t\tnext.subagentOnlyExtensions = override.subagentOnlyExtensions === false ? undefined : [...override.subagentOnlyExtensions];\n\t}\n\tif (override.completionGuard !== undefined) next.completionGuard = override.completionGuard;\n\tif (override.toolBudget !== undefined) next.toolBudget = override.toolBudget === false ? undefined : override.toolBudget;\n\n\treturn next;\n}\n\nfunction clearBuiltinThinking(agent: AgentConfig, meta: { scope: \"user\" | \"project\"; path: string }): AgentConfig {\n\tif (agent.thinking === undefined) return agent;\n\treturn {\n\t\t...agent,\n\t\tthinking: undefined,\n\t\toverride: agent.override ?? { ...meta, base: cloneOverrideBase(agent) },\n\t};\n}\n\nfunction applyBuiltinOverrides(\n\tbuiltinAgents: AgentConfig[],\n\tuserSettings: SubagentSettings,\n\tprojectSettings: SubagentSettings,\n\tuserSettingsPath: string,\n\tprojectSettingsPath: string | null,\n): AgentConfig[] {\n\tconst projectBulkDisabled = projectSettings.disableBuiltins === true && projectSettingsPath !== null;\n\tconst userBulkDisabled = projectSettings.disableBuiltins === undefined && userSettings.disableBuiltins === true;\n\tconst projectThinkingConfigured = projectSettings.disableThinking !== undefined && projectSettingsPath !== null;\n\tconst disableThinking = projectThinkingConfigured ? projectSettings.disableThinking === true : userSettings.disableThinking === true;\n\tconst disableThinkingMeta = projectThinkingConfigured\n\t\t? { scope: \"project\" as const, path: projectSettingsPath! }\n\t\t: { scope: \"user\" as const, path: userSettingsPath };\n\n\tconst applyGlobalThinking = (agent: AgentConfig, hasExplicitThinkingOverride: boolean): AgentConfig => {\n\t\tif (!disableThinking || hasExplicitThinkingOverride) return agent;\n\t\treturn clearBuiltinThinking(agent, disableThinkingMeta);\n\t};\n\n\treturn builtinAgents.map((agent) => {\n\t\tconst projectOverride = projectSettings.overrides[agent.name];\n\t\tif (projectOverride && projectSettingsPath) {\n\t\t\treturn applyGlobalThinking(\n\t\t\t\tapplyBuiltinOverride(agent, projectOverride, { scope: \"project\", path: projectSettingsPath }),\n\t\t\t\tprojectOverride.thinking !== undefined,\n\t\t\t);\n\t\t}\n\n\t\tif (projectBulkDisabled && projectSettingsPath) {\n\t\t\treturn applyGlobalThinking(\n\t\t\t\tapplyBuiltinOverride(agent, { disabled: true }, { scope: \"project\", path: projectSettingsPath }),\n\t\t\t\tfalse,\n\t\t\t);\n\t\t}\n\n\t\tconst userOverride = userSettings.overrides[agent.name];\n\t\tif (userOverride) {\n\t\t\treturn applyGlobalThinking(\n\t\t\t\tapplyBuiltinOverride(agent, userOverride, { scope: \"user\", path: userSettingsPath }),\n\t\t\t\t!projectThinkingConfigured && userOverride.thinking !== undefined,\n\t\t\t);\n\t\t}\n\n\t\tif (userBulkDisabled) {\n\t\t\treturn applyGlobalThinking(\n\t\t\t\tapplyBuiltinOverride(agent, { disabled: true }, { scope: \"user\", path: userSettingsPath }),\n\t\t\t\tfalse,\n\t\t\t);\n\t\t}\n\n\t\treturn applyGlobalThinking(agent, false);\n\t});\n}\n\nfunction customAgentHasFrontmatterField(agent: AgentConfig, ...fields: string[]): boolean {\n\tconst frontmatterFields = agentFrontmatterFields.get(agent);\n\treturn frontmatterFields ? fields.some((field) => frontmatterFields.has(field)) : false;\n}\n\nfunction applyCustomAgentOverride(\n\tagent: AgentConfig,\n\toverride: BuiltinAgentOverrideConfig,\n\tmeta: { scope: \"user\" | \"project\"; path: string },\n): AgentConfig {\n\tlet next: AgentConfig | undefined;\n\tlet anyFilled = false;\n\n\tconst mutable = (): AgentConfig => {\n\t\tnext ??= { ...agent };\n\t\treturn next;\n\t};\n\n\tconst fill = <K extends keyof AgentConfig>(\n\t\tfield: K,\n\t\tfrontmatterFields: string[],\n\t\tvalue: AgentConfig[K],\n\t): void => {\n\t\tif (customAgentHasFrontmatterField(agent, ...frontmatterFields)) return;\n\t\tmutable()[field] = value;\n\t\tanyFilled = true;\n\t};\n\n\tif (override.model !== undefined) {\n\t\tfill(\"model\", [\"model\"], override.model === false ? undefined : override.model);\n\t}\n\tif (override.fallbackModels !== undefined) {\n\t\tfill(\n\t\t\t\"fallbackModels\",\n\t\t\t[\"fallbackModels\"],\n\t\t\toverride.fallbackModels === false ? undefined : [...override.fallbackModels],\n\t\t);\n\t}\n\tif (override.thinking !== undefined) {\n\t\tfill(\"thinking\", [\"thinking\"], override.thinking === false ? undefined : override.thinking);\n\t}\n\tif (override.systemPromptMode !== undefined) {\n\t\tfill(\"systemPromptMode\", [\"systemPromptMode\"], override.systemPromptMode);\n\t}\n\tif (override.inheritProjectContext !== undefined) {\n\t\tfill(\"inheritProjectContext\", [\"inheritProjectContext\"], override.inheritProjectContext);\n\t}\n\tif (override.inheritSkills !== undefined) {\n\t\tfill(\"inheritSkills\", [\"inheritSkills\"], override.inheritSkills);\n\t}\n\tif (override.defaultContext !== undefined) {\n\t\tfill(\"defaultContext\", [\"defaultContext\"], override.defaultContext === false ? undefined : override.defaultContext);\n\t}\n\tif (override.acceptanceRole !== undefined) {\n\t\tfill(\"acceptanceRole\", [\"acceptanceRole\"], override.acceptanceRole === false ? undefined : override.acceptanceRole);\n\t}\n\tif (override.disabled !== undefined && agent.disabled === undefined) {\n\t\tmutable().disabled = override.disabled;\n\t\tanyFilled = true;\n\t}\n\tif (override.skills !== undefined) {\n\t\tfill(\"skills\", [\"skill\", \"skills\"], override.skills === false ? undefined : [...override.skills]);\n\t}\n\tif (override.tools !== undefined && !customAgentHasFrontmatterField(agent, \"tools\")) {\n\t\tconst { tools, mcpDirectTools } = splitToolList(override.tools === false ? [] : override.tools);\n\t\tconst target = mutable();\n\t\ttarget.tools = tools;\n\t\ttarget.mcpDirectTools = mcpDirectTools;\n\t\tanyFilled = true;\n\t}\n\tif (override.subagentOnlyExtensions !== undefined) {\n\t\tfill(\n\t\t\t\"subagentOnlyExtensions\",\n\t\t\t[\"subagentOnlyExtensions\"],\n\t\t\toverride.subagentOnlyExtensions === false ? undefined : [...override.subagentOnlyExtensions],\n\t\t);\n\t}\n\tif (override.completionGuard !== undefined) {\n\t\tfill(\"completionGuard\", [\"completionGuard\"], override.completionGuard);\n\t}\n\tif (override.toolBudget !== undefined) {\n\t\tfill(\"toolBudget\", [\"toolBudget\"], override.toolBudget === false ? undefined : override.toolBudget);\n\t}\n\n\tif (!anyFilled || !next) return agent;\n\tnext.override = { ...meta, base: cloneOverrideBase(agent) };\n\treturn next;\n}\n\nfunction applyCustomAgentOverrides(\n\tagents: AgentConfig[],\n\tuserSettings: SubagentSettings,\n\tprojectSettings: SubagentSettings,\n\tuserSettingsPath: string,\n\tprojectSettingsPath: string | null,\n): AgentConfig[] {\n\treturn agents.map((agent) => {\n\t\tconst projectOverride = projectSettings.overrides[agent.name];\n\t\tif (projectOverride && projectSettingsPath) {\n\t\t\treturn applyCustomAgentOverride(agent, projectOverride, { scope: \"project\", path: projectSettingsPath });\n\t\t}\n\n\t\tconst userOverride = userSettings.overrides[agent.name];\n\t\tif (userOverride) {\n\t\t\treturn applyCustomAgentOverride(agent, userOverride, { scope: \"user\", path: userSettingsPath });\n\t\t}\n\n\t\treturn agent;\n\t});\n}\n\nexport function buildBuiltinOverrideConfig(\n\tbase: BuiltinAgentOverrideBase,\n\tdraft: Pick<AgentConfig, \"model\" | \"fallbackModels\" | \"thinking\" | \"systemPromptMode\" | \"inheritProjectContext\" | \"inheritSkills\" | \"defaultContext\" | \"acceptanceRole\" | \"disabled\" | \"systemPrompt\" | \"skills\" | \"tools\" | \"mcpDirectTools\" | \"subagentOnlyExtensions\" | \"completionGuard\" | \"toolBudget\">,\n): BuiltinAgentOverrideConfig | undefined {\n\tconst override: BuiltinAgentOverrideConfig = {};\n\n\tif (draft.model !== base.model) override.model = draft.model ?? false;\n\tif (!arraysEqual(draft.fallbackModels, base.fallbackModels)) override.fallbackModels = draft.fallbackModels ? [...draft.fallbackModels] : false;\n\tif (draft.thinking !== base.thinking) override.thinking = draft.thinking ?? false;\n\tif (draft.systemPromptMode !== base.systemPromptMode) override.systemPromptMode = draft.systemPromptMode;\n\tif (draft.inheritProjectContext !== base.inheritProjectContext) override.inheritProjectContext = draft.inheritProjectContext;\n\tif (draft.inheritSkills !== base.inheritSkills) override.inheritSkills = draft.inheritSkills;\n\tif (draft.defaultContext !== base.defaultContext) override.defaultContext = draft.defaultContext ?? false;\n\tif (draft.acceptanceRole !== base.acceptanceRole) override.acceptanceRole = draft.acceptanceRole ?? false;\n\tif (draft.disabled !== base.disabled) override.disabled = draft.disabled ?? false;\n\tif (draft.systemPrompt !== base.systemPrompt) override.systemPrompt = draft.systemPrompt;\n\tif (!arraysEqual(draft.skills, base.skills)) override.skills = draft.skills ? [...draft.skills] : false;\n\n\tconst baseTools = joinToolList(base);\n\tconst draftTools = joinToolList(draft);\n\tif (!arraysEqual(draftTools, baseTools)) override.tools = draftTools ? [...draftTools] : false;\n\tif (!arraysEqual(draft.subagentOnlyExtensions, base.subagentOnlyExtensions)) {\n\t\toverride.subagentOnlyExtensions = draft.subagentOnlyExtensions ? [...draft.subagentOnlyExtensions] : false;\n\t}\n\tif ((draft.completionGuard !== false) !== (base.completionGuard !== false)) {\n\t\toverride.completionGuard = draft.completionGuard !== false;\n\t}\n\tif (JSON.stringify(draft.toolBudget) !== JSON.stringify(base.toolBudget)) override.toolBudget = draft.toolBudget ?? false;\n\n\treturn Object.keys(override).length > 0 ? override : undefined;\n}\n\nexport function saveBuiltinAgentOverride(\n\tcwd: string,\n\tname: string,\n\tscope: \"user\" | \"project\",\n\toverride: BuiltinAgentOverrideConfig,\n): string {\n\tconst filePath = scope === \"project\" ? getProjectAgentSettingsPath(cwd) : getUserAgentSettingsPath();\n\tif (!filePath) throw new Error(\"Project override is not available here. No project config root was found.\");\n\n\tconst settings = readSettingsFileStrict(filePath);\n\tconst subagents = settings.subagents && typeof settings.subagents === \"object\" && !Array.isArray(settings.subagents)\n\t\t? { ...(settings.subagents as Record<string, unknown>) }\n\t\t: {};\n\tconst agentOverrides = subagents.agentOverrides && typeof subagents.agentOverrides === \"object\" && !Array.isArray(subagents.agentOverrides)\n\t\t? { ...(subagents.agentOverrides as Record<string, unknown>) }\n\t\t: {};\n\n\tagentOverrides[name] = cloneOverrideValue(override);\n\tsubagents.agentOverrides = agentOverrides;\n\tsettings.subagents = subagents;\n\twriteSettingsFile(filePath, settings);\n\treturn filePath;\n}\n\nexport function removeBuiltinAgentOverride(cwd: string, name: string, scope: \"user\" | \"project\"): { path: string; removed: boolean } {\n\tconst filePath = scope === \"project\" ? getProjectAgentSettingsPath(cwd) : getUserAgentSettingsPath();\n\tif (!filePath) throw new Error(\"Project override is not available here. No project config root was found.\");\n\tif (!fs.existsSync(filePath)) return { path: filePath, removed: false };\n\n\tconst settings = readSettingsFileStrict(filePath);\n\tconst subagents = settings.subagents;\n\tif (!subagents || typeof subagents !== \"object\" || Array.isArray(subagents)) return { path: filePath, removed: false };\n\tconst nextSubagents = { ...(subagents as Record<string, unknown>) };\n\tconst agentOverrides = nextSubagents.agentOverrides;\n\tif (!agentOverrides || typeof agentOverrides !== \"object\" || Array.isArray(agentOverrides)) return { path: filePath, removed: false };\n\n\tconst nextOverrides = { ...(agentOverrides as Record<string, unknown>) };\n\tif (!Object.prototype.hasOwnProperty.call(nextOverrides, name)) return { path: filePath, removed: false };\n\tdelete nextOverrides[name];\n\tif (Object.keys(nextOverrides).length > 0) nextSubagents.agentOverrides = nextOverrides;\n\telse delete nextSubagents.agentOverrides;\n\n\tif (Object.keys(nextSubagents).length > 0) settings.subagents = nextSubagents;\n\telse delete settings.subagents;\n\n\twriteSettingsFile(filePath, settings);\n\treturn { path: filePath, removed: true };\n}\n\nexport function mergeBuiltinAgentOverride(\n\tcwd: string,\n\tname: string,\n\tscope: \"user\" | \"project\",\n\tfields: BuiltinAgentOverrideConfig,\n): string {\n\tconst filePath = scope === \"project\" ? getProjectAgentSettingsPath(cwd) : getUserAgentSettingsPath();\n\tif (!filePath) throw new Error(\"Project override is not available here. No project config root was found.\");\n\n\tconst settings = readSettingsFileStrict(filePath);\n\tconst subagents = settings.subagents && typeof settings.subagents === \"object\" && !Array.isArray(settings.subagents)\n\t\t? { ...(settings.subagents as Record<string, unknown>) }\n\t\t: {};\n\tconst agentOverrides = subagents.agentOverrides && typeof subagents.agentOverrides === \"object\" && !Array.isArray(subagents.agentOverrides)\n\t\t? { ...(subagents.agentOverrides as Record<string, unknown>) }\n\t\t: {};\n\n\tconst existing = agentOverrides[name];\n\tconst base = existing && typeof existing === \"object\" && !Array.isArray(existing)\n\t\t? existing as Record<string, unknown>\n\t\t: {};\n\tagentOverrides[name] = { ...base, ...cloneOverrideValue(fields) };\n\tsubagents.agentOverrides = agentOverrides;\n\tsettings.subagents = subagents;\n\twriteSettingsFile(filePath, settings);\n\treturn filePath;\n}\n\nexport function removeBuiltinAgentOverrideFields(\n\tcwd: string,\n\tname: string,\n\tscope: \"user\" | \"project\",\n\tfields: string[],\n): { path: string; removed: boolean } {\n\tconst filePath = scope === \"project\" ? getProjectAgentSettingsPath(cwd) : getUserAgentSettingsPath();\n\tif (!filePath) throw new Error(\"Project override is not available here. No project config root was found.\");\n\tif (!fs.existsSync(filePath)) return { path: filePath, removed: false };\n\n\tconst settings = readSettingsFileStrict(filePath);\n\tconst subagents = settings.subagents;\n\tif (!subagents || typeof subagents !== \"object\" || Array.isArray(subagents)) return { path: filePath, removed: false };\n\tconst agentOverrides = (subagents as Record<string, unknown>).agentOverrides;\n\tif (!agentOverrides || typeof agentOverrides !== \"object\" || Array.isArray(agentOverrides)) return { path: filePath, removed: false };\n\n\tconst entry = (agentOverrides as Record<string, unknown>)[name];\n\tif (!entry || typeof entry !== \"object\" || Array.isArray(entry)) return { path: filePath, removed: false };\n\n\tconst nextEntry: Record<string, unknown> = { ...(entry as Record<string, unknown>) };\n\tlet removed = false;\n\tfor (const field of fields) {\n\t\tif (Object.prototype.hasOwnProperty.call(nextEntry, field)) {\n\t\t\tdelete nextEntry[field];\n\t\t\tremoved = true;\n\t\t}\n\t}\n\tif (!removed) return { path: filePath, removed: false };\n\n\tconst nextSubagents = { ...(subagents as Record<string, unknown>) };\n\tif (Object.keys(nextEntry).length > 0) {\n\t\t(nextSubagents.agentOverrides as Record<string, unknown>)[name] = nextEntry;\n\t} else {\n\t\tconst nextOverrides = { ...(agentOverrides as Record<string, unknown>) };\n\t\tdelete nextOverrides[name];\n\t\tif (Object.keys(nextOverrides).length > 0) nextSubagents.agentOverrides = nextOverrides;\n\t\telse delete nextSubagents.agentOverrides;\n\t}\n\tif (Object.keys(nextSubagents).length > 0) settings.subagents = nextSubagents;\n\telse delete settings.subagents;\n\twriteSettingsFile(filePath, settings);\n\treturn { path: filePath, removed: true };\n}\n\nfunction listFilesRecursive(dir: string, predicate: (fileName: string) => boolean): string[] {\n\tconst files: string[] = [];\n\tif (!fs.existsSync(dir)) return files;\n\n\tlet entries: fs.Dirent[];\n\ttry {\n\t\tentries = fs.readdirSync(dir, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name));\n\t} catch {\n\t\treturn files;\n\t}\n\n\tfor (const entry of entries) {\n\t\tconst filePath = path.join(dir, entry.name);\n\t\tif (entry.isDirectory()) {\n\t\t\tfiles.push(...listFilesRecursive(filePath, predicate));\n\t\t\tcontinue;\n\t\t}\n\t\tif (!entry.isFile() && !entry.isSymbolicLink()) continue;\n\t\tif (!predicate(entry.name)) continue;\n\t\tfiles.push(filePath);\n\t}\n\treturn files;\n}\n\nfunction isLegacyAgentSkillPath(rootDir: string, filePath: string): boolean {\n\tconst relative = path.relative(rootDir, filePath);\n\tconst parts = relative.split(path.sep).map((part) => part.toLowerCase());\n\tif (path.basename(rootDir).toLowerCase() === \".agents\") {\n\t\tparts.unshift(\".agents\");\n\t}\n\treturn parts.some((part, index) => part === \".agents\" && parts[index + 1] === \"skills\");\n}\n\nfunction parseAgentAcceptanceFrontmatter(raw: string | undefined, agentName: string): AcceptanceInput | undefined {\n\tif (raw === undefined || !raw.trim()) return undefined;\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = parseYaml(raw);\n\t} catch (error) {\n\t\tthrow new Error(`Agent '${agentName}' has invalid acceptance frontmatter: ${error instanceof Error ? error.message : String(error)}`, { cause: error });\n\t}\n\tconst errors = validateAcceptanceInput(parsed, `Agent '${agentName}' acceptance frontmatter`);\n\tif (errors.length > 0) throw new Error(errors.join(\" \"));\n\treturn parsed as AcceptanceInput;\n}\n\nfunction loadAgentsFromDir(dir: string, source: AgentSource): AgentConfig[] {\n\tconst agents: AgentConfig[] = [];\n\n\tfor (const filePath of listFilesRecursive(dir, (fileName) => fileName.endsWith(\".md\") && !fileName.endsWith(\".chain.md\"))) {\n\t\tif (isLegacyAgentSkillPath(dir, filePath)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet content: string;\n\t\ttry {\n\t\t\tcontent = fs.readFileSync(filePath, \"utf-8\");\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst { frontmatter, body } = parseFrontmatter(content);\n\n\t\tif (!frontmatter.name || !frontmatter.description) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst localName = frontmatter.name;\n\t\tconst parsedPackage = parsePackageName(frontmatter.package, `Agent '${localName}' package`);\n\t\tif (parsedPackage.error) continue;\n\t\tconst packageName = parsedPackage.packageName;\n\t\tconst runtimeName = buildRuntimeName(localName, packageName);\n\n\t\tconst rawTools = frontmatter.tools\n\t\t\t?.split(\",\")\n\t\t\t.map((t) => t.trim())\n\t\t\t.filter(Boolean);\n\n\t\tconst mcpDirectTools: string[] = [];\n\t\tconst tools: string[] = [];\n\t\tif (rawTools) {\n\t\t\tfor (const tool of rawTools) {\n\t\t\t\tif (tool.startsWith(\"mcp:\")) {\n\t\t\t\t\tmcpDirectTools.push(tool.slice(4));\n\t\t\t\t} else {\n\t\t\t\t\ttools.push(tool);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst defaultReads = frontmatter.defaultReads\n\t\t\t?.split(\",\")\n\t\t\t.map((f) => f.trim())\n\t\t\t.filter(Boolean);\n\n\t\tconst skillStr = frontmatter.skill || frontmatter.skills;\n\t\tconst skills = skillStr\n\t\t\t?.split(\",\")\n\t\t\t.map((s) => s.trim())\n\t\t\t.filter(Boolean);\n\t\tconst skillPath = frontmatter.skillPath\n\t\t\t?.split(\",\")\n\t\t\t.map((entry) => entry.trim())\n\t\t\t.filter(Boolean);\n\t\tconst fallbackModels = frontmatter.fallbackModels\n\t\t\t?.split(\",\")\n\t\t\t.map((model) => model.trim())\n\t\t\t.filter(Boolean);\n\t\tconst systemPromptMode = frontmatter.systemPromptMode === \"replace\"\n\t\t\t? \"replace\"\n\t\t\t: frontmatter.systemPromptMode === \"append\"\n\t\t\t\t? \"append\"\n\t\t\t\t: defaultSystemPromptMode(localName);\n\t\tconst inheritProjectContext = frontmatter.inheritProjectContext === \"true\"\n\t\t\t? true\n\t\t\t: frontmatter.inheritProjectContext === \"false\"\n\t\t\t\t? false\n\t\t\t\t: defaultInheritProjectContext(localName);\n\t\tconst inheritSkills = frontmatter.inheritSkills === \"true\"\n\t\t\t? true\n\t\t\t: frontmatter.inheritSkills === \"false\"\n\t\t\t\t? false\n\t\t\t\t: defaultInheritSkills();\n\t\tconst defaultContext = frontmatter.defaultContext === \"fork\"\n\t\t\t? \"fork\" as const\n\t\t\t: frontmatter.defaultContext === \"fresh\"\n\t\t\t\t? \"fresh\" as const\n\t\t\t\t: undefined;\n\t\tlet defaultAsync: boolean | undefined;\n\t\tif (frontmatter.async !== undefined) {\n\t\t\tif (frontmatter.async === \"true\") defaultAsync = true;\n\t\t\telse if (frontmatter.async === \"false\") defaultAsync = false;\n\t\t\telse throw new Error(`Agent '${localName}' has invalid async frontmatter; expected true or false.`);\n\t\t}\n\t\tlet defaultTimeoutMs: number | undefined;\n\t\tif (frontmatter.timeoutMs !== undefined) {\n\t\t\tconst parsed = Number(frontmatter.timeoutMs);\n\t\t\tif (!Number.isInteger(parsed) || parsed <= 0) {\n\t\t\t\tthrow new Error(`Agent '${localName}' has invalid timeoutMs frontmatter; expected a positive integer.`);\n\t\t\t}\n\t\t\tdefaultTimeoutMs = parsed;\n\t\t}\n\t\tlet defaultTurnBudget: TurnBudgetConfig | undefined;\n\t\tif (frontmatter.turnBudget !== undefined && frontmatter.turnBudget.trim()) {\n\t\t\tconst parsed = JSON.parse(frontmatter.turnBudget) as unknown;\n\t\t\tconst resolved = resolveTurnBudgetConfig(parsed, `Agent '${localName}' turnBudget frontmatter`);\n\t\t\tif (resolved.error) throw new Error(resolved.error);\n\t\t\tdefaultTurnBudget = resolved.turnBudget;\n\t\t}\n\t\tconst defaultAcceptance = parseAgentAcceptanceFrontmatter(frontmatter.acceptance, localName);\n\t\tlet acceptanceRole: AcceptanceRole | undefined;\n\t\tif (frontmatter.acceptanceRole !== undefined && frontmatter.acceptanceRole.trim()) {\n\t\t\tif (frontmatter.acceptanceRole === \"read-only\" || frontmatter.acceptanceRole === \"writer\") acceptanceRole = frontmatter.acceptanceRole;\n\t\t\telse throw new Error(`Agent '${localName}' has invalid acceptanceRole frontmatter; expected 'read-only' or 'writer'.`);\n\t\t}\n\n\t\tlet extensions: string[] | undefined;\n\t\tif (frontmatter.extensions !== undefined) {\n\t\t\textensions = frontmatter.extensions\n\t\t\t\t.split(\",\")\n\t\t\t\t.map((e) => e.trim())\n\t\t\t\t.filter(Boolean);\n\t\t}\n\t\tlet subagentOnlyExtensions: string[] | undefined;\n\t\tif (frontmatter.subagentOnlyExtensions !== undefined) {\n\t\t\tsubagentOnlyExtensions = frontmatter.subagentOnlyExtensions\n\t\t\t\t.split(\",\")\n\t\t\t\t.map((e) => e.trim())\n\t\t\t\t.filter(Boolean);\n\t\t}\n\n\t\tconst extraFields: Record<string, string> = {};\n\t\tfor (const [key, value] of Object.entries(frontmatter)) {\n\t\t\tif (!KNOWN_FIELDS.has(key)) extraFields[key] = value;\n\t\t}\n\n\t\tconst parsedMaxSubagentDepth = Number(frontmatter.maxSubagentDepth);\n\t\tlet toolBudget: ToolBudgetConfig | undefined;\n\t\tif (frontmatter.toolBudget !== undefined && frontmatter.toolBudget.trim()) {\n\t\t\tconst parsed = JSON.parse(frontmatter.toolBudget) as unknown;\n\t\t\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n\t\t\t\tthrow new Error(`Agent '${localName}' has invalid toolBudget frontmatter; expected a JSON object.`);\n\t\t\t}\n\t\t\ttoolBudget = parsed as ToolBudgetConfig;\n\t\t}\n\t\tconst completionGuard = frontmatter.completionGuard === \"false\"\n\t\t\t? false\n\t\t\t: frontmatter.completionGuard === \"true\"\n\t\t\t\t? true\n\t\t\t\t: undefined;\n\n\t\tconst agent: AgentConfig = {\n\t\t\tname: runtimeName,\n\t\t\tlocalName,\n\t\t\tpackageName,\n\t\t\tdescription: frontmatter.description,\n\t\t\ttools: tools.length > 0 ? tools : undefined,\n\t\t\tmcpDirectTools: mcpDirectTools.length > 0 ? mcpDirectTools : undefined,\n\t\t\tmodel: frontmatter.model,\n\t\t\tfallbackModels: fallbackModels && fallbackModels.length > 0 ? fallbackModels : undefined,\n\t\t\tthinking: frontmatter.thinking === \"false\" ? false : frontmatter.thinking,\n\t\t\tsystemPromptMode,\n\t\t\tinheritProjectContext,\n\t\t\tinheritSkills,\n\t\t\tdefaultContext,\n\t\t\tdefaultAsync,\n\t\t\tdefaultTimeoutMs,\n\t\t\tdefaultTurnBudget,\n\t\t\tdefaultAcceptance,\n\t\t\tacceptanceRole,\n\t\t\tsystemPrompt: body,\n\t\t\tsource,\n\t\t\tfilePath,\n\t\t\tskills: skills && skills.length > 0 ? skills : undefined,\n\t\t\tskillPath: skillPath && skillPath.length > 0 ? skillPath : undefined,\n\t\t\textensions,\n\t\t\tsubagentOnlyExtensions,\n\t\t\toutput: frontmatter.output,\n\t\t\tdefaultReads: defaultReads && defaultReads.length > 0 ? defaultReads : undefined,\n\t\t\tdefaultProgress: frontmatter.defaultProgress === \"true\",\n\t\t\tinteractive: frontmatter.interactive === \"true\",\n\t\t\tmaxSubagentDepth:\n\t\t\t\tNumber.isInteger(parsedMaxSubagentDepth) && parsedMaxSubagentDepth >= 0\n\t\t\t\t\t? parsedMaxSubagentDepth\n\t\t\t\t\t: undefined,\n\t\t\tcompletionGuard,\n\t\t\ttoolBudget,\n\t\t\tmemory: parseMemoryFrontmatter(frontmatter.memory),\n\t\t\textraFields: Object.keys(extraFields).length > 0 ? extraFields : undefined,\n\t\t};\n\t\tagentFrontmatterFields.set(agent, new Set(Object.keys(frontmatter)));\n\t\tagents.push(agent);\n\t}\n\n\treturn agents;\n}\n\nfunction loadChainsFromDir(dir: string, source: AgentSource): { chains: ChainConfig[]; diagnostics: ChainDiscoveryDiagnostic[] } {\n\tconst chains = new Map<string, ChainConfig>();\n\tconst diagnostics: ChainDiscoveryDiagnostic[] = [];\n\n\tfor (const filePath of listFilesRecursive(dir, (fileName) => fileName.endsWith(\".chain.md\") || fileName.endsWith(\".chain.json\"))) {\n\t\tlet content: string;\n\t\ttry {\n\t\t\tcontent = fs.readFileSync(filePath, \"utf-8\");\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\n\t\ttry {\n\t\t\tconst chain = filePath.endsWith(\".chain.json\") ? parseJsonChain(content, source, filePath) : parseChain(content, source, filePath);\n\t\t\tconst existing = chains.get(chain.name);\n\t\t\tif (existing && existing.filePath.endsWith(\".chain.json\") && filePath.endsWith(\".chain.md\")) continue;\n\t\t\tchains.set(chain.name, chain);\n\t\t} catch (error) {\n\t\t\tdiagnostics.push({ source, filePath, error: error instanceof Error ? error.message : String(error) });\n\t\t\tcontinue;\n\t\t}\n\t}\n\n\treturn { chains: Array.from(chains.values()), diagnostics };\n}\n\nfunction isDirectory(p: string): boolean {\n\ttry {\n\t\treturn fs.statSync(p).isDirectory();\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction resolveNearestProjectAgentDirs(cwd: string): { readDirs: string[]; preferredDir: string | null } {\n\tconst projectRoot = findNearestProjectRoot(cwd);\n\tif (!projectRoot) return { readDirs: [], preferredDir: null };\n\n\tconst legacyDir = path.join(projectRoot, \".agents\");\n\tconst preferredDir = path.join(getProjectConfigDir(projectRoot), \"agents\");\n\tconst readDirs: string[] = [];\n\tif (isDirectory(legacyDir)) readDirs.push(legacyDir);\n\tif (isDirectory(preferredDir)) readDirs.push(preferredDir);\n\n\treturn {\n\t\treadDirs,\n\t\tpreferredDir,\n\t};\n}\n\nfunction resolveNearestProjectChainDirs(cwd: string): { readDirs: string[]; preferredDir: string | null } {\n\tconst projectRoot = findNearestProjectRoot(cwd);\n\tif (!projectRoot) return { readDirs: [], preferredDir: null };\n\n\tconst preferredDir = path.join(getProjectConfigDir(projectRoot), \"chains\");\n\treturn {\n\t\treadDirs: isDirectory(preferredDir) ? [preferredDir] : [],\n\t\tpreferredDir,\n\t};\n}\nconst BUILTIN_AGENTS_DIR = path.resolve(path.dirname(fileURLToPath(import.meta.url)), \"..\", \"..\", \"agents\");\n\nexport const EXTRA_AGENT_DIRS_ENV = \"PI_SUBAGENT_EXTRA_AGENT_DIRS\";\n\n// Additional read-only directories to scan for agent definitions, supplied by the\n// launcher via PI_SUBAGENT_EXTRA_AGENT_DIRS (PATH-style, split on os/path delimiter).\n// Lets a hermetic wrapper (e.g. a Nix-store install) expose bundled agents without\n// copying or symlinking them into the writable agent dir. Loaded as \"user\" source,\n// at lower precedence than agents the user placed in their own agent dir.\nfunction extraUserAgentDirs(): string[] {\n\tconst raw = process.env[EXTRA_AGENT_DIRS_ENV];\n\tif (!raw) return [];\n\treturn raw\n\t\t.split(path.delimiter)\n\t\t.map((dir) => dir.trim())\n\t\t.filter((dir) => dir.length > 0);\n}\n\nexport function discoverAgents(cwd: string, scope: AgentScope): AgentDiscoveryResult {\n\tconst userDirOld = path.join(getAgentDir(), \"agents\");\n\tconst userDirNew = path.join(os.homedir(), \".agents\");\n\tconst { readDirs: projectAgentDirs, preferredDir: projectAgentsDir } = resolveNearestProjectAgentDirs(cwd);\n\tconst userSettingsPath = getUserAgentSettingsPath();\n\tconst projectSettingsPath = getProjectAgentSettingsPath(cwd);\n\tconst userSettings = scope === \"project\" ? EMPTY_SUBAGENT_SETTINGS : readSubagentSettings(userSettingsPath);\n\tconst projectSettings = scope === \"user\" ? EMPTY_SUBAGENT_SETTINGS : readSubagentSettings(projectSettingsPath);\n\tconst defaultModel = resolveSubagentDefaultModel(userSettings, projectSettings, userSettingsPath, projectSettingsPath);\n\tconst modelScope = projectSettings.modelScope ?? userSettings.modelScope;\n\tconst packageSubagentPaths = collectPackageSubagentPaths(cwd, {\n\t\tincludeUser: scope !== \"project\",\n\t\tincludeProject: scope !== \"user\",\n\t});\n\n\tconst builtinAgents = applyBuiltinOverrides(\n\t\tapplySubagentDefaultModel(loadAgentsFromDir(BUILTIN_AGENTS_DIR, \"builtin\"), defaultModel),\n\t\tuserSettings,\n\t\tprojectSettings,\n\t\tuserSettingsPath,\n\t\tprojectSettingsPath,\n\t);\n\n\tconst userAgentsExtra = scope === \"project\" ? [] : extraUserAgentDirs().flatMap((dir) => loadAgentsFromDir(dir, \"user\"));\n\tconst userAgentsOld = scope === \"project\" ? [] : loadAgentsFromDir(userDirOld, \"user\");\n\tconst userAgentsNew = scope === \"project\" ? [] : loadAgentsFromDir(userDirNew, \"user\");\n\tconst userAgents = applyCustomAgentOverrides(\n\t\tapplySubagentDefaultModel([...userAgentsExtra, ...userAgentsOld, ...userAgentsNew], defaultModel),\n\t\tuserSettings,\n\t\tprojectSettings,\n\t\tuserSettingsPath,\n\t\tprojectSettingsPath,\n\t);\n\n\tconst projectAgents = applyCustomAgentOverrides(\n\t\tapplySubagentDefaultModel(scope === \"user\" ? [] : projectAgentDirs.flatMap((dir) => loadAgentsFromDir(dir, \"project\")), defaultModel),\n\t\tuserSettings,\n\t\tprojectSettings,\n\t\tuserSettingsPath,\n\t\tprojectSettingsPath,\n\t);\n\tconst packageAgents = applyCustomAgentOverrides(\n\t\tapplySubagentDefaultModel(packageSubagentPaths.agents.flatMap((dir) => loadAgentsFromDir(dir, \"package\")), defaultModel),\n\t\tuserSettings,\n\t\tprojectSettings,\n\t\tuserSettingsPath,\n\t\tprojectSettingsPath,\n\t);\n\tconst agents = mergeAgentsForScope(scope, userAgents, projectAgents, builtinAgents, packageAgents)\n\t\t.filter((agent) => agent.disabled !== true);\n\n\treturn { agents, projectAgentsDir, modelScope };\n}\n\nexport function discoverAgentsAll(cwd: string): {\n\tbuiltin: AgentConfig[];\n\tpackage: AgentConfig[];\n\tuser: AgentConfig[];\n\tproject: AgentConfig[];\n\tchains: ChainConfig[];\n\tchainDiagnostics: ChainDiscoveryDiagnostic[];\n\tuserDir: string;\n\tprojectDir: string | null;\n\tuserChainDir: string;\n\tprojectChainDir: string | null;\n\tuserSettingsPath: string;\n\tprojectSettingsPath: string | null;\n} {\n\tconst userDirOld = path.join(getAgentDir(), \"agents\");\n\tconst userDirNew = path.join(os.homedir(), \".agents\");\n\tconst userChainDir = getUserChainDir();\n\tconst { readDirs: projectDirs, preferredDir: projectDir } = resolveNearestProjectAgentDirs(cwd);\n\tconst { readDirs: projectChainDirs, preferredDir: projectChainDir } = resolveNearestProjectChainDirs(cwd);\n\tconst userSettingsPath = getUserAgentSettingsPath();\n\tconst projectSettingsPath = getProjectAgentSettingsPath(cwd);\n\tconst userSettings = readSubagentSettings(userSettingsPath);\n\tconst projectSettings = readSubagentSettings(projectSettingsPath);\n\tconst defaultModel = resolveSubagentDefaultModel(userSettings, projectSettings, userSettingsPath, projectSettingsPath);\n\tconst packageSubagentPaths = collectPackageSubagentPaths(cwd);\n\n\tconst builtin = applyBuiltinOverrides(\n\t\tapplySubagentDefaultModel(loadAgentsFromDir(BUILTIN_AGENTS_DIR, \"builtin\"), defaultModel),\n\t\tuserSettings,\n\t\tprojectSettings,\n\t\tuserSettingsPath,\n\t\tprojectSettingsPath,\n\t);\n\tconst user = applyCustomAgentOverrides(\n\t\tapplySubagentDefaultModel([\n\t\t\t...extraUserAgentDirs().flatMap((dir) => loadAgentsFromDir(dir, \"user\")),\n\t\t\t...loadAgentsFromDir(userDirOld, \"user\"),\n\t\t\t...loadAgentsFromDir(userDirNew, \"user\"),\n\t\t], defaultModel),\n\t\tuserSettings,\n\t\tprojectSettings,\n\t\tuserSettingsPath,\n\t\tprojectSettingsPath,\n\t);\n\tconst packageMap = new Map<string, AgentConfig>();\n\tfor (const dir of packageSubagentPaths.agents) {\n\t\tfor (const agent of loadAgentsFromDir(dir, \"package\")) {\n\t\t\tif (!packageMap.has(agent.name)) packageMap.set(agent.name, agent);\n\t\t}\n\t}\n\tconst packageAgents = applyCustomAgentOverrides(\n\t\tapplySubagentDefaultModel(Array.from(packageMap.values()), defaultModel),\n\t\tuserSettings,\n\t\tprojectSettings,\n\t\tuserSettingsPath,\n\t\tprojectSettingsPath,\n\t);\n\tconst projectMap = new Map<string, AgentConfig>();\n\tfor (const dir of projectDirs) {\n\t\tfor (const agent of loadAgentsFromDir(dir, \"project\")) {\n\t\t\tprojectMap.set(agent.name, agent);\n\t\t}\n\t}\n\tconst project = applyCustomAgentOverrides(\n\t\tapplySubagentDefaultModel(Array.from(projectMap.values()), defaultModel),\n\t\tuserSettings,\n\t\tprojectSettings,\n\t\tuserSettingsPath,\n\t\tprojectSettingsPath,\n\t);\n\n\tconst chainMap = new Map<string, ChainConfig>();\n\tconst packageChainDiagnostics: ChainDiscoveryDiagnostic[] = [];\n\tconst packageChainMap = new Map<string, ChainConfig>();\n\tfor (const dir of packageSubagentPaths.chains) {\n\t\tconst loaded = loadChainsFromDir(dir, \"package\");\n\t\tpackageChainDiagnostics.push(...loaded.diagnostics);\n\t\tfor (const chain of loaded.chains) {\n\t\t\tif (!packageChainMap.has(chain.name)) packageChainMap.set(chain.name, chain);\n\t\t}\n\t}\n\tconst projectChainDiagnostics: ChainDiscoveryDiagnostic[] = [];\n\tfor (const dir of projectChainDirs) {\n\t\tconst loaded = loadChainsFromDir(dir, \"project\");\n\t\tprojectChainDiagnostics.push(...loaded.diagnostics);\n\t\tfor (const chain of loaded.chains) {\n\t\t\tchainMap.set(chain.name, chain);\n\t\t}\n\t}\n\tconst userChains = loadChainsFromDir(userChainDir, \"user\");\n\tconst chains = [\n\t\t...Array.from(packageChainMap.values()),\n\t\t...userChains.chains,\n\t\t...Array.from(chainMap.values()),\n\t];\n\tconst chainDiagnostics = [\n\t\t...packageChainDiagnostics,\n\t\t...userChains.diagnostics,\n\t\t...projectChainDiagnostics,\n\t];\n\n\tconst userDir = process.env.PI_CODING_AGENT_DIR ? userDirOld : fs.existsSync(userDirNew) ? userDirNew : userDirOld;\n\n\treturn { builtin, package: packageAgents, user, project, chains, chainDiagnostics, userDir, projectDir, userChainDir, projectChainDir, userSettingsPath, projectSettingsPath };\n}\n"]}
|