@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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"proactive-skills.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/agents/proactive-skills.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport type { AgentConfig, ChainConfig, ChainStepConfig } from \"./agents.ts\";\nimport type { ProactiveSkillSubagentsConfig } from \"../shared/types.ts\";\n\nconst SUBAGENT_ORCHESTRATION_SKILL = \"pi-subagents\";\nconst DEFAULT_MIN_REFERENCES = 2;\nconst DEFAULT_MAX_RECOMMENDATIONS = 3;\nconst DEFAULT_PREFERRED_AGENT = \"reviewer\";\nconst FALLBACK_AGENT_ORDER = [\"reviewer\", \"context-builder\", \"delegate\"];\nconst MAX_RECOMMENDATION_CAP = 5;\n\nexport interface ResolvedProactiveSkillSubagentsConfig {\n\tenabled: boolean;\n\tminReferences: number;\n\tmaxRecommendations: number;\n\tpreferredAgent: string;\n}\n\nexport interface ProactiveSkillSubagentRecommendation {\n\tskill: string;\n\tagent: string;\n\treferences: number;\n\tsources: string[];\n\tdescription?: string;\n\treason: string;\n}\n\nexport interface AvailableSkill {\n\tname: string;\n\tdescription?: string;\n}\n\nfunction positiveInteger(value: unknown): number | undefined {\n\tif (typeof value !== \"number\") return undefined;\n\tif (!Number.isInteger(value) || !Number.isFinite(value) || value < 1) return undefined;\n\treturn value;\n}\n\nexport function resolveProactiveSkillSubagentsConfig(\n\tconfig?: ProactiveSkillSubagentsConfig | false,\n): ResolvedProactiveSkillSubagentsConfig {\n\tif (config === false) {\n\t\treturn {\n\t\t\tenabled: false,\n\t\t\tminReferences: DEFAULT_MIN_REFERENCES,\n\t\t\tmaxRecommendations: DEFAULT_MAX_RECOMMENDATIONS,\n\t\t\tpreferredAgent: DEFAULT_PREFERRED_AGENT,\n\t\t};\n\t}\n\n\tconst maxRecommendations = positiveInteger(config?.maxRecommendations) ?? DEFAULT_MAX_RECOMMENDATIONS;\n\treturn {\n\t\tenabled: config?.enabled ?? true,\n\t\tminReferences: positiveInteger(config?.minReferences) ?? DEFAULT_MIN_REFERENCES,\n\t\tmaxRecommendations: Math.min(maxRecommendations, MAX_RECOMMENDATION_CAP),\n\t\tpreferredAgent: typeof config?.preferredAgent === \"string\" && config.preferredAgent.trim()\n\t\t\t? config.preferredAgent.trim()\n\t\t\t: DEFAULT_PREFERRED_AGENT,\n\t};\n}\n\nfunction normalizeSkillNames(value: unknown): string[] {\n\tif (value === false || value === true || value === undefined || value === null) return [];\n\tif (Array.isArray(value)) {\n\t\treturn [...new Set(value.filter((entry): entry is string => typeof entry === \"string\").map((entry) => entry.trim()).filter(Boolean))];\n\t}\n\tif (typeof value === \"string\") {\n\t\treturn [...new Set(value.split(\",\").map((entry) => entry.trim()).filter(Boolean))];\n\t}\n\treturn [];\n}\n\nfunction collectStepSkills(step: ChainStepConfig, out: Set<string>): void {\n\tfor (const skill of normalizeSkillNames(step.skills ?? (step as { skill?: unknown }).skill)) {\n\t\tout.add(skill);\n\t}\n\n\tconst parallel = step.parallel;\n\tif (!parallel) return;\n\tif (Array.isArray(parallel)) {\n\t\tfor (const child of parallel) {\n\t\t\tif (child && typeof child === \"object\" && !Array.isArray(child)) {\n\t\t\t\tcollectStepSkills(child as ChainStepConfig, out);\n\t\t\t}\n\t\t}\n\t\treturn;\n\t}\n\tif (typeof parallel === \"object\") {\n\t\tcollectStepSkills(parallel as ChainStepConfig, out);\n\t}\n}\n\nfunction chooseRecommendationAgent(agents: AgentConfig[], preferredAgent: string): string | undefined {\n\tconst enabled = agents.filter((agent) => !agent.disabled);\n\tif (enabled.some((agent) => agent.name === preferredAgent)) return preferredAgent;\n\tfor (const name of FALLBACK_AGENT_ORDER) {\n\t\tif (enabled.some((agent) => agent.name === name)) return name;\n\t}\n\treturn enabled[0]?.name;\n}\n\nfunction addSource(counts: Map<string, Set<string>>, skill: string, source: string): void {\n\tif (skill === SUBAGENT_ORCHESTRATION_SKILL) return;\n\tconst sources = counts.get(skill) ?? new Set<string>();\n\tsources.add(source);\n\tcounts.set(skill, sources);\n}\n\nexport function recommendProactiveSkillSubagents(input: {\n\tagents: AgentConfig[];\n\tchains?: ChainConfig[];\n\tavailableSkills?: AvailableSkill[];\n\tconfig?: ProactiveSkillSubagentsConfig | false;\n}): ProactiveSkillSubagentRecommendation[] {\n\tconst config = resolveProactiveSkillSubagentsConfig(input.config);\n\tif (!config.enabled) return [];\n\n\tconst agent = chooseRecommendationAgent(input.agents, config.preferredAgent);\n\tif (!agent) return [];\n\n\tconst availableByName = input.availableSkills\n\t\t? new Map(input.availableSkills.map((skill) => [skill.name, skill]))\n\t\t: undefined;\n\tconst counts = new Map<string, Set<string>>();\n\n\tfor (const candidate of input.agents) {\n\t\tif (candidate.disabled) continue;\n\t\tfor (const skill of candidate.skills ?? []) {\n\t\t\taddSource(counts, skill, `agent:${candidate.name}`);\n\t\t}\n\t}\n\n\tfor (const chain of input.chains ?? []) {\n\t\tconst chainSkills = new Set<string>();\n\t\tfor (const step of chain.steps) {\n\t\t\tcollectStepSkills(step, chainSkills);\n\t\t}\n\t\tfor (const skill of chainSkills) {\n\t\t\taddSource(counts, skill, `chain:${chain.name}`);\n\t\t}\n\t}\n\n\treturn [...counts.entries()]\n\t\t.filter(([skill, sources]) => sources.size >= config.minReferences && (!availableByName || availableByName.has(skill)))\n\t\t.map(([skill, sources]) => ({\n\t\t\tskill,\n\t\t\tagent,\n\t\t\treferences: sources.size,\n\t\t\tsources: [...sources].sort((a, b) => a.localeCompare(b)),\n\t\t\tdescription: availableByName?.get(skill)?.description,\n\t\t\treason: `referenced by ${sources.size} configured agents/chains`,\n\t\t}))\n\t\t.sort((a, b) => b.references - a.references || a.skill.localeCompare(b.skill))\n\t\t.slice(0, config.maxRecommendations);\n}\n\nexport function formatProactiveSkillSubagentRecommendations(\n\trecommendations: ProactiveSkillSubagentRecommendation[],\n): string[] {\n\tif (recommendations.length === 0) return [];\n\treturn [\n\t\t\"Proactive skill subagent suggestions:\",\n\t\t...recommendations.map((recommendation) => {\n\t\t\tconst sampleSources = recommendation.sources.slice(0, 3).join(\", \");\n\t\t\tconst extra = recommendation.sources.length > 3 ? `, +${recommendation.sources.length - 3} more` : \"\";\n\t\t\tconst description = recommendation.description ? ` - ${recommendation.description}` : \"\";\n\t\t\treturn `- ${recommendation.skill} via ${recommendation.agent} (${recommendation.reason}; ${sampleSources}${extra})${description}`;\n\t\t}),\n\t\t\"Guardrails: use these for broad tasks where a skill-specialist pass is useful; keep fanout small, use fresh context unless private/session context is explicitly needed, and skip when the user asks for a direct answer.\",\n\t];\n}\n\nexport function buildProactiveSkillSubagentRecommendationLines(input: {\n\tagents: AgentConfig[];\n\tchains?: ChainConfig[];\n\tconfig?: ProactiveSkillSubagentsConfig | false;\n\tdiscoverAvailableSkills: () => AvailableSkill[];\n}): string[] {\n\tif (!resolveProactiveSkillSubagentsConfig(input.config).enabled) return [];\n\tlet availableSkills: AvailableSkill[];\n\ttry {\n\t\tavailableSkills = input.discoverAvailableSkills();\n\t} catch {\n\t\tavailableSkills = [];\n\t}\n\treturn formatProactiveSkillSubagentRecommendations(recommendProactiveSkillSubagents({\n\t\tagents: input.agents,\n\t\tchains: input.chains,\n\t\tavailableSkills,\n\t\tconfig: input.config,\n\t}));\n}\n"]}
|
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
import type { ExtensionAPI, ExtensionContext } from "@ashx-j/lunr";
|
|
2
|
-
import { BUILTIN_AGENT_NAMES } from "../agents/agents.ts";
|
|
3
|
-
export declare const DEFAULT_PROVIDER_MODELS_MAX_AGE_DAYS = 7;
|
|
4
|
-
type BuiltinAgentName = typeof BUILTIN_AGENT_NAMES[number];
|
|
5
|
-
export type ProfileKind = "quota" | "quality";
|
|
6
|
-
export type ProbeStatus = "ok" | "unavailable" | "auth" | "timeout" | "error" | "skipped";
|
|
7
|
-
export type CostTier = "cheap" | "medium" | "expensive";
|
|
8
|
-
export type QualityTier = "weak" | "medium" | "strong";
|
|
9
|
-
export type LatencyTier = "fast" | "medium" | "slow";
|
|
10
|
-
export type RecommendedRoleTier = "cheap" | "medium" | "strong";
|
|
11
|
-
interface ProfileAgentOverride {
|
|
12
|
-
model?: string;
|
|
13
|
-
}
|
|
14
|
-
export interface SubagentProfileFile {
|
|
15
|
-
subagents: {
|
|
16
|
-
agentOverrides: Record<string, ProfileAgentOverride>;
|
|
17
|
-
};
|
|
18
|
-
}
|
|
19
|
-
export type ClassificationSource = "official-metadata" | "heuristic-name";
|
|
20
|
-
export interface ProviderModelCatalogModel {
|
|
21
|
-
id: string;
|
|
22
|
-
fullId: string;
|
|
23
|
-
observed: {
|
|
24
|
-
availableInRegistry: boolean;
|
|
25
|
-
name?: string;
|
|
26
|
-
reasoning?: boolean;
|
|
27
|
-
thinkingLevels: string[];
|
|
28
|
-
contextWindow?: number;
|
|
29
|
-
maxTokens?: number;
|
|
30
|
-
cost?: {
|
|
31
|
-
input?: number;
|
|
32
|
-
output?: number;
|
|
33
|
-
cacheRead?: number;
|
|
34
|
-
cacheWrite?: number;
|
|
35
|
-
};
|
|
36
|
-
probe: {
|
|
37
|
-
status: ProbeStatus;
|
|
38
|
-
checkedAt: string;
|
|
39
|
-
message?: string;
|
|
40
|
-
};
|
|
41
|
-
};
|
|
42
|
-
derived: {
|
|
43
|
-
profileRank: number;
|
|
44
|
-
costTier: CostTier;
|
|
45
|
-
qualityTier: QualityTier;
|
|
46
|
-
latencyTier: LatencyTier;
|
|
47
|
-
recommendedRoleTier: RecommendedRoleTier;
|
|
48
|
-
recommendedAgents: BuiltinAgentName[];
|
|
49
|
-
classificationSources: ClassificationSource[];
|
|
50
|
-
};
|
|
51
|
-
warnings: string[];
|
|
52
|
-
notes: string[];
|
|
53
|
-
}
|
|
54
|
-
export interface ProviderModelCatalogFile {
|
|
55
|
-
provider: string;
|
|
56
|
-
refreshedAt: string;
|
|
57
|
-
maxAgeDays: number;
|
|
58
|
-
sources: string[];
|
|
59
|
-
models: ProviderModelCatalogModel[];
|
|
60
|
-
}
|
|
61
|
-
export interface ProfileCheckResult {
|
|
62
|
-
profileName: string;
|
|
63
|
-
filePath: string;
|
|
64
|
-
results: Array<{
|
|
65
|
-
agent: string;
|
|
66
|
-
model: string;
|
|
67
|
-
inRegistry: boolean;
|
|
68
|
-
probe: {
|
|
69
|
-
status: ProbeStatus;
|
|
70
|
-
message?: string;
|
|
71
|
-
};
|
|
72
|
-
}>;
|
|
73
|
-
}
|
|
74
|
-
export declare function countHeuristicFallbackModels(catalog: ProviderModelCatalogFile): number;
|
|
75
|
-
export declare function getSubagentProfilesRootDir(): string;
|
|
76
|
-
export declare function getSubagentProfilesDir(): string;
|
|
77
|
-
export declare function ensureSubagentProfilesDir(): string;
|
|
78
|
-
export declare function getProviderModelsDir(): string;
|
|
79
|
-
export declare function ensureProviderModelsDir(): string;
|
|
80
|
-
export declare function getProviderModelsPath(provider: string): string;
|
|
81
|
-
export declare function listSubagentProfiles(): string[];
|
|
82
|
-
export declare function readSubagentProfile(name: string): {
|
|
83
|
-
filePath: string;
|
|
84
|
-
profile: SubagentProfileFile;
|
|
85
|
-
};
|
|
86
|
-
export declare function applySubagentProfile(name: string): {
|
|
87
|
-
filePath: string;
|
|
88
|
-
settingsPath: string;
|
|
89
|
-
};
|
|
90
|
-
export declare function readProviderModelCatalog(provider: string): ProviderModelCatalogFile | null;
|
|
91
|
-
export declare function isProviderModelCatalogStale(catalog: ProviderModelCatalogFile, maxAgeDays?: number): boolean;
|
|
92
|
-
export declare function refreshProviderModelCatalog(pi: Pick<ExtensionAPI, "exec"> | {
|
|
93
|
-
exec?: ExtensionAPI["exec"];
|
|
94
|
-
}, ctx: Pick<ExtensionContext, "cwd" | "modelRegistry">, provider: string, options?: {
|
|
95
|
-
force?: boolean;
|
|
96
|
-
maxAgeDays?: number;
|
|
97
|
-
probe?: boolean;
|
|
98
|
-
}): Promise<{
|
|
99
|
-
filePath: string;
|
|
100
|
-
catalog: ProviderModelCatalogFile;
|
|
101
|
-
reused: boolean;
|
|
102
|
-
heuristicFallbackCount: number;
|
|
103
|
-
}>;
|
|
104
|
-
export declare function generateProfilesForProvider(pi: Pick<ExtensionAPI, "exec"> | {
|
|
105
|
-
exec?: ExtensionAPI["exec"];
|
|
106
|
-
}, ctx: Pick<ExtensionContext, "cwd" | "modelRegistry">, provider: string, options?: {
|
|
107
|
-
maxAgeDays?: number;
|
|
108
|
-
forceRefresh?: boolean;
|
|
109
|
-
probe?: boolean;
|
|
110
|
-
}): Promise<{
|
|
111
|
-
quotaPath: string;
|
|
112
|
-
qualityPath: string;
|
|
113
|
-
catalogPath: string;
|
|
114
|
-
quotaModels: {
|
|
115
|
-
cheap: string;
|
|
116
|
-
medium: string;
|
|
117
|
-
strong: string;
|
|
118
|
-
};
|
|
119
|
-
qualityModels: {
|
|
120
|
-
cheap: string;
|
|
121
|
-
medium: string;
|
|
122
|
-
strong: string;
|
|
123
|
-
};
|
|
124
|
-
heuristicFallbackCount: number;
|
|
125
|
-
selectedHeuristicFallbackCount: number;
|
|
126
|
-
}>;
|
|
127
|
-
export declare function checkSubagentProfile(pi: Pick<ExtensionAPI, "exec"> | {
|
|
128
|
-
exec?: ExtensionAPI["exec"];
|
|
129
|
-
}, ctx: Pick<ExtensionContext, "cwd" | "modelRegistry">, name: string): Promise<ProfileCheckResult>;
|
|
130
|
-
export {};
|
|
131
|
-
//# sourceMappingURL=profiles.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/profiles/profiles.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { ExtensionAPI, ExtensionContext } from \"@ashx-j/lunr\";\nimport { BUILTIN_AGENT_NAMES } from \"../agents/agents.ts\";\nimport { findModelInfo, getSupportedThinkingLevels, splitKnownThinkingSuffix, toModelInfo } from \"../shared/model-info.ts\";\nimport { getAgentDir } from \"../shared/utils.ts\";\n\nexport const DEFAULT_PROVIDER_MODELS_MAX_AGE_DAYS = 7;\n\ntype BuiltinAgentName = typeof BUILTIN_AGENT_NAMES[number];\nexport type ProfileKind = \"quota\" | \"quality\";\nexport type ProbeStatus = \"ok\" | \"unavailable\" | \"auth\" | \"timeout\" | \"error\" | \"skipped\";\nexport type CostTier = \"cheap\" | \"medium\" | \"expensive\";\nexport type QualityTier = \"weak\" | \"medium\" | \"strong\";\nexport type LatencyTier = \"fast\" | \"medium\" | \"slow\";\nexport type RecommendedRoleTier = \"cheap\" | \"medium\" | \"strong\";\n\ninterface ProfileAgentOverride {\n\tmodel?: string;\n}\n\nexport interface SubagentProfileFile {\n\tsubagents: {\n\t\tagentOverrides: Record<string, ProfileAgentOverride>;\n\t};\n}\n\nexport type ClassificationSource = \"official-metadata\" | \"heuristic-name\";\n\nexport interface ProviderModelCatalogModel {\n\tid: string;\n\tfullId: string;\n\tobserved: {\n\t\tavailableInRegistry: boolean;\n\t\tname?: string;\n\t\treasoning?: boolean;\n\t\tthinkingLevels: string[];\n\t\tcontextWindow?: number;\n\t\tmaxTokens?: number;\n\t\tcost?: {\n\t\t\tinput?: number;\n\t\t\toutput?: number;\n\t\t\tcacheRead?: number;\n\t\t\tcacheWrite?: number;\n\t\t};\n\t\tprobe: {\n\t\t\tstatus: ProbeStatus;\n\t\t\tcheckedAt: string;\n\t\t\tmessage?: string;\n\t\t};\n\t};\n\tderived: {\n\t\tprofileRank: number;\n\t\tcostTier: CostTier;\n\t\tqualityTier: QualityTier;\n\t\tlatencyTier: LatencyTier;\n\t\trecommendedRoleTier: RecommendedRoleTier;\n\t\trecommendedAgents: BuiltinAgentName[];\n\t\tclassificationSources: ClassificationSource[];\n\t};\n\twarnings: string[];\n\tnotes: string[];\n}\n\nexport interface ProviderModelCatalogFile {\n\tprovider: string;\n\trefreshedAt: string;\n\tmaxAgeDays: number;\n\tsources: string[];\n\tmodels: ProviderModelCatalogModel[];\n}\n\nexport interface ProfileCheckResult {\n\tprofileName: string;\n\tfilePath: string;\n\tresults: Array<{\n\t\tagent: string;\n\t\tmodel: string;\n\t\tinRegistry: boolean;\n\t\tprobe: { status: ProbeStatus; message?: string };\n\t}>;\n}\n\nfunction readJsonObjectFile(filePath: string): Record<string, unknown> {\n\tconst raw = fs.readFileSync(filePath, \"utf-8\");\n\tconst parsed = JSON.parse(raw) as unknown;\n\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n\t\tthrow new Error(`File '${filePath}' must contain a JSON object.`);\n\t}\n\treturn parsed as Record<string, unknown>;\n}\n\nfunction writeJsonFile(filePath: string, value: unknown): void {\n\tfs.mkdirSync(path.dirname(filePath), { recursive: true });\n\tfs.writeFileSync(filePath, `${JSON.stringify(value, null, 2)}\\n`, \"utf-8\");\n}\n\nconst SAFE_PATH_TOKEN = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;\n\nfunction normalizePathToken(value: string, label: string): string {\n\tconst trimmed = value.trim();\n\tif (!trimmed) throw new Error(`${label} is required.`);\n\tif (!SAFE_PATH_TOKEN.test(trimmed) || trimmed === \".\" || trimmed === \"..\" || trimmed.includes(\"/\") || trimmed.includes(\"\\\\\")) {\n\t\tthrow new Error(`${label} must be a safe file name using only letters, numbers, dots, underscores, and hyphens.`);\n\t}\n\treturn trimmed;\n}\n\nfunction normalizeProfileName(name: string): string {\n\tconst trimmed = name.trim();\n\tconst stem = trimmed.endsWith(\".json\") ? trimmed.slice(0, -5) : trimmed;\n\treturn normalizePathToken(stem, \"Profile name\");\n}\n\nfunction normalizeProviderName(provider: string): string {\n\treturn normalizePathToken(provider, \"Provider\");\n}\n\nfunction validateSubagentProfile(filePath: string, parsed: Record<string, unknown>): SubagentProfileFile {\n\tconst subagents = parsed.subagents;\n\tif (!subagents || typeof subagents !== \"object\" || Array.isArray(subagents)) {\n\t\tthrow new Error(`Profile '${filePath}' must contain a 'subagents' object.`);\n\t}\n\tconst agentOverrides = (subagents as Record<string, unknown>).agentOverrides;\n\tif (!agentOverrides || typeof agentOverrides !== \"object\" || Array.isArray(agentOverrides)) {\n\t\tthrow new Error(`Profile '${filePath}' must contain 'subagents.agentOverrides' as an object.`);\n\t}\n\tfor (const [name, value] of Object.entries(agentOverrides)) {\n\t\tif (!value || typeof value !== \"object\" || Array.isArray(value)) {\n\t\t\tthrow new Error(`Profile '${filePath}' has invalid override '${name}'; expected an object.`);\n\t\t}\n\t\tconst model = (value as Record<string, unknown>).model;\n\t\tif (model !== undefined && typeof model !== \"string\") {\n\t\t\tthrow new Error(`Profile '${filePath}' has invalid model for '${name}'; expected a string.`);\n\t\t}\n\t}\n\treturn parsed as unknown as SubagentProfileFile;\n}\n\nfunction getUserSettingsPath(): string {\n\treturn path.join(getAgentDir(), \"settings.json\");\n}\n\nfunction readSettingsFile(filePath: string): Record<string, unknown> {\n\tif (!fs.existsSync(filePath)) return {};\n\treturn readJsonObjectFile(filePath);\n}\n\nfunction extractVersionScore(id: string): number {\n\tconst match = id.match(/(\\d+(?:\\.\\d+)?)/g);\n\tif (!match || match.length === 0) return 0;\n\treturn Math.max(...match.map((value) => Number.parseFloat(value)).filter((value) => Number.isFinite(value)));\n}\n\nfunction modelNameTokens(modelName: string): string[] {\n\treturn modelName\n\t\t.toLowerCase()\n\t\t.replace(/([a-z])([0-9])/g, \"$1 $2\")\n\t\t.replace(/([0-9])([a-z])/g, \"$1 $2\")\n\t\t.split(/[^a-z0-9.]+/)\n\t\t.filter(Boolean);\n}\n\nfunction inferProfileBand(modelName: string): 0 | 1 | 2 | 3 | 4 {\n\tconst tokens = new Set(modelNameTokens(modelName));\n\tif ([\"spark\", \"flash\", \"nano\", \"tiny\", \"instant\"].some((token) => tokens.has(token))) return 0;\n\tif ([\"mini\", \"haiku\", \"small\"].some((token) => tokens.has(token))) return 1;\n\tif ([\"opus\", \"max\", \"ultra\", \"pro\"].some((token) => tokens.has(token))) return 4;\n\tif ([\"sonnet\", \"turbo\", \"plus\"].some((token) => tokens.has(token))) return 3;\n\treturn 2;\n}\n\ninterface ModelClassificationInput {\n\tid: string;\n\tname?: string;\n\treasoning?: boolean;\n\tcontextWindow?: number;\n\tmaxTokens?: number;\n\tcost?: {\n\t\tinput?: number;\n\t\toutput?: number;\n\t\tcacheRead?: number;\n\t\tcacheWrite?: number;\n\t};\n}\n\ninterface NumericStats {\n\tmin: number;\n\tmax: number;\n}\n\ninterface ClassificationContext {\n\tcost?: NumericStats;\n\tcontextWindow?: NumericStats;\n\tmaxTokens?: NumericStats;\n}\n\nfunction combinedCost(cost: ModelClassificationInput[\"cost\"]): number | undefined {\n\tif (!cost) return undefined;\n\tconst values = [cost.input, cost.output, cost.cacheRead, cost.cacheWrite].filter((value): value is number => typeof value === \"number\" && Number.isFinite(value));\n\tif (values.length === 0) return undefined;\n\treturn values.reduce((sum, value) => sum + value, 0);\n}\n\nfunction collectStats(values: Array<number | undefined>): NumericStats | undefined {\n\tconst filtered = values.filter((value): value is number => typeof value === \"number\" && Number.isFinite(value));\n\tif (filtered.length === 0) return undefined;\n\treturn { min: Math.min(...filtered), max: Math.max(...filtered) };\n}\n\nfunction normalize(value: number | undefined, stats: NumericStats | undefined): number | undefined {\n\tif (value === undefined || !stats) return undefined;\n\tif (stats.max <= stats.min) return 0.5;\n\treturn (value - stats.min) / (stats.max - stats.min);\n}\n\nfunction buildClassificationContext(models: ModelClassificationInput[]): ClassificationContext {\n\treturn {\n\t\tcost: collectStats(models.map((model) => combinedCost(model.cost))),\n\t\tcontextWindow: collectStats(models.map((model) => model.contextWindow)),\n\t\tmaxTokens: collectStats(models.map((model) => model.maxTokens)),\n\t};\n}\n\nfunction rankToCostTier(rank: number): CostTier {\n\tif (rank <= 0.33) return \"cheap\";\n\tif (rank <= 0.66) return \"medium\";\n\treturn \"expensive\";\n}\n\nfunction scoreToQualityTier(score: number): QualityTier {\n\tif (score <= 0.33) return \"weak\";\n\tif (score <= 0.66) return \"medium\";\n\treturn \"strong\";\n}\n\nfunction qualityTierToRoleTier(quality: QualityTier, cost: CostTier): RecommendedRoleTier {\n\tif (quality === \"strong\") return \"strong\";\n\tif (quality === \"medium\") return cost === \"cheap\" ? \"cheap\" : \"medium\";\n\treturn \"cheap\";\n}\n\nfunction agentsForRoleTier(roleTier: RecommendedRoleTier): BuiltinAgentName[] {\n\tif (roleTier === \"cheap\") return [\"scout\", \"delegate\"];\n\tif (roleTier === \"medium\") return [\"planner\", \"context-builder\", \"researcher\"];\n\treturn [\"worker\", \"reviewer\", \"oracle\"];\n}\n\nfunction classifyModel(input: ModelClassificationInput, context: ClassificationContext): {\n\tprofileRank: number;\n\tcostTier: CostTier;\n\tqualityTier: QualityTier;\n\tlatencyTier: LatencyTier;\n\trecommendedRoleTier: RecommendedRoleTier;\n\trecommendedAgents: BuiltinAgentName[];\n\tclassificationSources: ClassificationSource[];\n} {\n\tconst modelName = input.name?.trim() || input.id;\n\tconst tokens = new Set(modelNameTokens(modelName));\n\tconst band = inferProfileBand(modelName);\n\tconst versionScore = extractVersionScore(input.id);\n\tconst costNorm = normalize(combinedCost(input.cost), context.cost);\n\tconst contextNorm = normalize(input.contextWindow, context.contextWindow);\n\tconst maxTokensNorm = normalize(input.maxTokens, context.maxTokens);\n\tconst hasOfficialMetadata = costNorm !== undefined || contextNorm !== undefined || maxTokensNorm !== undefined;\n\tconst classificationSources: ClassificationSource[] = hasOfficialMetadata\n\t\t? [\"official-metadata\", \"heuristic-name\"]\n\t\t: [\"heuristic-name\"];\n\tconst heuristicBase = band / 4;\n\tconst qualitySignals = [\n\t\theuristicBase,\n\t\t...(contextNorm !== undefined ? [contextNorm] : []),\n\t\t...(maxTokensNorm !== undefined ? [maxTokensNorm] : []),\n\t\t...(input.reasoning === true ? [1] : []),\n\t\t...(input.reasoning === false ? [0] : []),\n\t];\n\tconst latencyHintsFast = tokens.has(\"highspeed\") || tokens.has(\"flash\") || tokens.has(\"instant\") || tokens.has(\"turbo\");\n\tconst latencyHintsSlow = tokens.has(\"pro\") || tokens.has(\"ultra\") || tokens.has(\"opus\") || tokens.has(\"max\");\n\tlet qualityScore = qualitySignals.reduce((sum, value) => sum + value, 0) / qualitySignals.length;\n\tif (latencyHintsFast) {\n\t\tqualityScore -= 0.2;\n\t}\n\tqualityScore = Math.max(0, Math.min(1, qualityScore));\n\tconst costTier = costNorm !== undefined\n\t\t? rankToCostTier(costNorm)\n\t\t: band === 0 ? \"cheap\" : band >= 3 ? \"expensive\" : \"medium\";\n\tconst qualityTier = scoreToQualityTier(qualityScore);\n\tconst latencyTier: LatencyTier = latencyHintsFast\n\t\t? \"fast\"\n\t\t: latencyHintsSlow\n\t\t\t? \"slow\"\n\t\t\t: costNorm !== undefined\n\t\t\t\t? (costNorm <= 0.33 ? \"fast\" : costNorm <= 0.66 ? \"medium\" : \"slow\")\n\t\t\t\t: (band <= 1 ? \"fast\" : band >= 3 ? \"slow\" : \"medium\");\n\tconst recommendedRoleTier = qualityTierToRoleTier(qualityTier, costTier);\n\tconst latencyPenalty = latencyHintsFast ? 125 : 0;\n\tconst profileRank = Math.round((qualityScore * 100) * 10) + Math.round(versionScore * 25) - latencyPenalty;\n\treturn {\n\t\tprofileRank,\n\t\tcostTier,\n\t\tqualityTier,\n\t\tlatencyTier,\n\t\trecommendedRoleTier,\n\t\trecommendedAgents: agentsForRoleTier(recommendedRoleTier),\n\t\tclassificationSources,\n\t};\n}\n\nfunction resolveProbeStatus(text: string, timedOut: boolean): ProbeStatus {\n\tif (timedOut) return \"timeout\";\n\tif (!text) return \"error\";\n\tif (/(unauthori[sz]ed|forbidden|api key|auth|billing|credit|quota)/i.test(text)) return \"auth\";\n\tif (/(not found|unknown model|model unavailable|model disabled|unsupported model|unavailable)/i.test(text)) return \"unavailable\";\n\treturn \"error\";\n}\n\nasync function probeModel(\n\tpi: Pick<ExtensionAPI, \"exec\"> | { exec?: ExtensionAPI[\"exec\"] },\n\tctx: Pick<ExtensionContext, \"cwd\">,\n\tfullId: string,\n): Promise<{ status: ProbeStatus; message?: string }> {\n\tif (typeof pi.exec !== \"function\") {\n\t\treturn { status: \"skipped\", message: \"pi.exec is unavailable in this runtime.\" };\n\t}\n\tconst result = await pi.exec(\"pi\", [\"-p\", \"--model\", fullId, \"--no-tools\", 'Reply with exactly \"OK\".'], {\n\t\tcwd: os.tmpdir(),\n\t\ttimeout: 45_000,\n\t} as Record<string, unknown>);\n\tconst stdout = typeof result.stdout === \"string\" ? result.stdout.trim() : \"\";\n\tconst stderr = typeof result.stderr === \"string\" ? result.stderr.trim() : \"\";\n\tconst combined = [stderr, stdout].filter(Boolean).join(\"\\n\").trim();\n\tif (result.code === 0) return { status: \"ok\", message: stdout || \"Probe succeeded.\" };\n\treturn { status: resolveProbeStatus(combined, result.killed === true), message: combined || `Probe exited with code ${result.code ?? \"unknown\"}.` };\n}\n\nfunction roundIndex(count: number, position: number): number {\n\tif (count <= 1) return 0;\n\treturn Math.max(0, Math.min(count - 1, Math.round((count - 1) * position)));\n}\n\nfunction profilePositions(kind: ProfileKind): { cheap: number; medium: number; strong: number } {\n\treturn kind === \"quota\"\n\t\t? { cheap: 0, medium: 1 / 3, strong: 2 / 3 }\n\t\t: { cheap: 1 / 3, medium: 2 / 3, strong: 1 };\n}\n\nfunction pickTierModels(models: ProviderModelCatalogModel[], kind: ProfileKind): { cheap: string; medium: string; strong: string } {\n\tif (models.length === 0) throw new Error(\"No provider models are available for profile generation.\");\n\tconst selectionPool = kind === \"quota\" && models.length > 1\n\t\t? models.slice(0, -1)\n\t\t: models;\n\tconst positions = profilePositions(kind);\n\treturn {\n\t\tcheap: selectionPool[roundIndex(selectionPool.length, positions.cheap)]!.fullId,\n\t\tmedium: selectionPool[roundIndex(selectionPool.length, positions.medium)]!.fullId,\n\t\tstrong: selectionPool[roundIndex(selectionPool.length, positions.strong)]!.fullId,\n\t};\n}\n\nfunction observedCombinedCost(model: ProviderModelCatalogModel): number | undefined {\n\treturn combinedCost(model.observed.cost);\n}\n\nfunction dominatesModel(a: ProviderModelCatalogModel, b: ProviderModelCatalogModel): boolean {\n\tconst costA = observedCombinedCost(a);\n\tconst costB = observedCombinedCost(b);\n\tif (costA === undefined || costB === undefined) return false;\n\tif (costA > costB) return false;\n\tif (a.derived.profileRank < b.derived.profileRank) return false;\n\tif ((a.observed.reasoning === true ? 1 : 0) < (b.observed.reasoning === true ? 1 : 0)) return false;\n\tif ((a.observed.contextWindow ?? 0) < (b.observed.contextWindow ?? 0)) return false;\n\tif ((a.observed.maxTokens ?? 0) < (b.observed.maxTokens ?? 0)) return false;\n\treturn costA < costB\n\t\t|| a.derived.profileRank > b.derived.profileRank\n\t\t|| (a.observed.reasoning === true && b.observed.reasoning !== true)\n\t\t|| (a.observed.contextWindow ?? 0) > (b.observed.contextWindow ?? 0)\n\t\t|| (a.observed.maxTokens ?? 0) > (b.observed.maxTokens ?? 0);\n}\n\nfunction filterDominatedModels(models: ProviderModelCatalogModel[]): ProviderModelCatalogModel[] {\n\treturn models.filter((candidate, index) => !models.some((other, otherIndex) => otherIndex !== index && dominatesModel(other, candidate)));\n}\n\nfunction buildProfileFile(kind: ProfileKind, models: { cheap: string; medium: string; strong: string }): SubagentProfileFile {\n\treturn {\n\t\tsubagents: {\n\t\t\tagentOverrides: {\n\t\t\t\tscout: { model: models.cheap },\n\t\t\t\tdelegate: { model: models.cheap },\n\t\t\t\tplanner: { model: models.medium },\n\t\t\t\t\"context-builder\": { model: models.medium },\n\t\t\t\tresearcher: { model: models.medium },\n\t\t\t\tworker: { model: models.strong },\n\t\t\t\treviewer: { model: models.strong },\n\t\t\t\toracle: { model: models.strong },\n\t\t\t},\n\t\t},\n\t};\n}\n\nfunction catalogModelIsUsable(model: ProviderModelCatalogModel): boolean {\n\treturn model.observed.availableInRegistry && model.observed.probe.status !== \"unavailable\" && model.observed.probe.status !== \"auth\" && model.observed.probe.status !== \"timeout\" && model.observed.probe.status !== \"error\";\n}\n\nfunction modelUsesHeuristicClassification(model: ProviderModelCatalogModel): boolean {\n\treturn model.derived.classificationSources.includes(\"heuristic-name\")\n\t\t&& !model.derived.classificationSources.includes(\"official-metadata\");\n}\n\nfunction warningLineForHeuristicFallback(): string {\n\treturn \"Classification fell back to name heuristics.\";\n}\n\nexport function countHeuristicFallbackModels(catalog: ProviderModelCatalogFile): number {\n\treturn catalog.models.filter(modelUsesHeuristicClassification).length;\n}\n\nfunction resolveProfilePath(name: string): string {\n\tconst dir = ensureSubagentProfilesDir();\n\treturn path.join(dir, `${normalizeProfileName(name)}.json`);\n}\n\nexport function getSubagentProfilesRootDir(): string {\n\treturn path.join(getAgentDir(), \"profiles\", \"pi-subagents\");\n}\n\nexport function getSubagentProfilesDir(): string {\n\treturn getSubagentProfilesRootDir();\n}\n\nexport function ensureSubagentProfilesDir(): string {\n\tconst dir = getSubagentProfilesDir();\n\tfs.mkdirSync(dir, { recursive: true });\n\treturn dir;\n}\n\nexport function getProviderModelsDir(): string {\n\treturn path.join(getSubagentProfilesRootDir(), \"providers\");\n}\n\nexport function ensureProviderModelsDir(): string {\n\tconst dir = getProviderModelsDir();\n\tfs.mkdirSync(dir, { recursive: true });\n\treturn dir;\n}\n\nexport function getProviderModelsPath(provider: string): string {\n\treturn path.join(ensureProviderModelsDir(), `${normalizeProviderName(provider)}.models.json`);\n}\n\nexport function listSubagentProfiles(): string[] {\n\tconst dir = ensureSubagentProfilesDir();\n\treturn fs.readdirSync(dir, { withFileTypes: true })\n\t\t.filter((entry) => entry.isFile() && entry.name.endsWith(\".json\"))\n\t\t.map((entry) => entry.name.slice(0, -5))\n\t\t.sort((a, b) => a.localeCompare(b));\n}\n\nexport function readSubagentProfile(name: string): { filePath: string; profile: SubagentProfileFile } {\n\tconst filePath = resolveProfilePath(name);\n\tif (!fs.existsSync(filePath)) throw new Error(`Profile not found: ${name}`);\n\tconst parsed = readJsonObjectFile(filePath);\n\treturn { filePath, profile: validateSubagentProfile(filePath, parsed) };\n}\n\nexport function applySubagentProfile(name: string): { filePath: string; settingsPath: string } {\n\tconst { filePath, profile } = readSubagentProfile(name);\n\tconst settingsPath = getUserSettingsPath();\n\tconst settings = readSettingsFile(settingsPath);\n\tsettings.subagents = profile.subagents;\n\twriteJsonFile(settingsPath, settings);\n\treturn { filePath, settingsPath };\n}\n\nexport function readProviderModelCatalog(provider: string): ProviderModelCatalogFile | null {\n\tconst filePath = getProviderModelsPath(provider);\n\tif (!fs.existsSync(filePath)) return null;\n\treturn readJsonObjectFile(filePath) as unknown as ProviderModelCatalogFile;\n}\n\nexport function isProviderModelCatalogStale(catalog: ProviderModelCatalogFile, maxAgeDays = DEFAULT_PROVIDER_MODELS_MAX_AGE_DAYS): boolean {\n\tconst refreshedAt = Date.parse(catalog.refreshedAt);\n\tif (!Number.isFinite(refreshedAt)) return true;\n\tconst maxAgeMs = maxAgeDays * 24 * 60 * 60 * 1000;\n\treturn Date.now() - refreshedAt > maxAgeMs;\n}\n\nexport async function refreshProviderModelCatalog(\n\tpi: Pick<ExtensionAPI, \"exec\"> | { exec?: ExtensionAPI[\"exec\"] },\n\tctx: Pick<ExtensionContext, \"cwd\" | \"modelRegistry\">,\n\tprovider: string,\n\toptions: { force?: boolean; maxAgeDays?: number; probe?: boolean } = {},\n): Promise<{ filePath: string; catalog: ProviderModelCatalogFile; reused: boolean; heuristicFallbackCount: number }> {\n\tconst normalizedProvider = normalizeProviderName(provider);\n\tconst maxAgeDays = options.maxAgeDays ?? DEFAULT_PROVIDER_MODELS_MAX_AGE_DAYS;\n\tconst filePath = getProviderModelsPath(normalizedProvider);\n\tif (!options.force) {\n\t\tconst existing = readProviderModelCatalog(normalizedProvider);\n\t\tif (existing && !isProviderModelCatalogStale(existing, maxAgeDays)) {\n\t\t\treturn { filePath, catalog: existing, reused: true, heuristicFallbackCount: countHeuristicFallbackModels(existing) };\n\t\t}\n\t}\n\n\tconst availableModels = ctx.modelRegistry.getAvailable().filter((model) => model.provider === normalizedProvider);\n\tif (availableModels.length === 0) {\n\t\tthrow new Error(`No models found in the current registry for provider '${normalizedProvider}'.`);\n\t}\n\n\tconst observedModels = [] as Array<{\n\t\trawModel: typeof availableModels[number];\n\t\tmodelRecord: Record<string, unknown> & { provider: string; id: string; name?: string };\n\t\tfullId: string;\n\t\tprobe: { status: ProbeStatus; message?: string };\n\t}>;\n\tfor (const rawModel of availableModels) {\n\t\tconst modelRecord = rawModel as Record<string, unknown> & { provider: string; id: string; name?: string };\n\t\tconst fullId = `${modelRecord.provider}/${modelRecord.id}`;\n\t\tconst probe = options.probe === false\n\t\t\t? { status: \"skipped\" as const, message: \"Live probing disabled.\" }\n\t\t\t: await probeModel(pi, ctx, fullId);\n\t\tobservedModels.push({ rawModel, modelRecord, fullId, probe });\n\t}\n\tconst classificationContext = buildClassificationContext(observedModels.map(({ modelRecord }) => ({\n\t\tid: modelRecord.id,\n\t\t...(typeof modelRecord.name === \"string\" ? { name: modelRecord.name } : {}),\n\t\t...(typeof modelRecord.reasoning === \"boolean\" ? { reasoning: modelRecord.reasoning } : {}),\n\t\t...(typeof modelRecord.contextWindow === \"number\" ? { contextWindow: modelRecord.contextWindow } : {}),\n\t\t...(typeof modelRecord.maxTokens === \"number\" ? { maxTokens: modelRecord.maxTokens } : {}),\n\t\t...(modelRecord.cost && typeof modelRecord.cost === \"object\" ? { cost: modelRecord.cost as ProviderModelCatalogModel[\"observed\"][\"cost\"] } : {}),\n\t})));\n\tconst models: ProviderModelCatalogModel[] = [];\n\tfor (const { rawModel, modelRecord, fullId, probe } of observedModels) {\n\t\tconst classification = classifyModel({\n\t\t\tid: modelRecord.id,\n\t\t\t...(typeof modelRecord.name === \"string\" ? { name: modelRecord.name } : {}),\n\t\t\t...(typeof modelRecord.reasoning === \"boolean\" ? { reasoning: modelRecord.reasoning } : {}),\n\t\t\t...(typeof modelRecord.contextWindow === \"number\" ? { contextWindow: modelRecord.contextWindow } : {}),\n\t\t\t...(typeof modelRecord.maxTokens === \"number\" ? { maxTokens: modelRecord.maxTokens } : {}),\n\t\t\t...(modelRecord.cost && typeof modelRecord.cost === \"object\" ? { cost: modelRecord.cost as ProviderModelCatalogModel[\"observed\"][\"cost\"] } : {}),\n\t\t}, classificationContext);\n\t\tconst warnings = classification.classificationSources.includes(\"heuristic-name\") && !classification.classificationSources.includes(\"official-metadata\")\n\t\t\t? [warningLineForHeuristicFallback()]\n\t\t\t: [];\n\t\tmodels.push({\n\t\t\tid: modelRecord.id,\n\t\t\tfullId,\n\t\t\tobserved: {\n\t\t\t\tavailableInRegistry: true,\n\t\t\t\t...(typeof modelRecord.name === \"string\" ? { name: modelRecord.name } : {}),\n\t\t\t\t...(typeof modelRecord.reasoning === \"boolean\" ? { reasoning: modelRecord.reasoning } : {}),\n\t\t\t\tthinkingLevels: getSupportedThinkingLevels(toModelInfo(rawModel)).map((level) => level),\n\t\t\t\t...(typeof modelRecord.contextWindow === \"number\" ? { contextWindow: modelRecord.contextWindow } : {}),\n\t\t\t\t...(typeof modelRecord.maxTokens === \"number\" ? { maxTokens: modelRecord.maxTokens } : {}),\n\t\t\t\t...(modelRecord.cost && typeof modelRecord.cost === \"object\" ? { cost: modelRecord.cost as ProviderModelCatalogModel[\"observed\"][\"cost\"] } : {}),\n\t\t\t\tprobe: {\n\t\t\t\t\tstatus: probe.status,\n\t\t\t\t\tcheckedAt: new Date().toISOString(),\n\t\t\t\t\t...(probe.message ? { message: probe.message } : {}),\n\t\t\t\t},\n\t\t\t},\n\t\t\tderived: classification,\n\t\t\twarnings,\n\t\t\tnotes: [],\n\t\t});\n\t}\n\tmodels.sort((a, b) => a.derived.profileRank - b.derived.profileRank || a.fullId.localeCompare(b.fullId));\n\tconst catalog: ProviderModelCatalogFile = {\n\t\tprovider: normalizedProvider,\n\t\trefreshedAt: new Date().toISOString(),\n\t\tmaxAgeDays,\n\t\tsources: [\"runtime-registry\", ...(options.probe === false ? [] : [\"live-probe\"]), \"heuristic-classifier\"],\n\t\tmodels,\n\t};\n\twriteJsonFile(filePath, catalog);\n\treturn { filePath, catalog, reused: false, heuristicFallbackCount: countHeuristicFallbackModels(catalog) };\n}\n\nexport async function generateProfilesForProvider(\n\tpi: Pick<ExtensionAPI, \"exec\"> | { exec?: ExtensionAPI[\"exec\"] },\n\tctx: Pick<ExtensionContext, \"cwd\" | \"modelRegistry\">,\n\tprovider: string,\n\toptions: { maxAgeDays?: number; forceRefresh?: boolean; probe?: boolean } = {},\n): Promise<{ quotaPath: string; qualityPath: string; catalogPath: string; quotaModels: { cheap: string; medium: string; strong: string }; qualityModels: { cheap: string; medium: string; strong: string }; heuristicFallbackCount: number; selectedHeuristicFallbackCount: number }> {\n\tconst normalizedProvider = normalizeProviderName(provider);\n\tconst { filePath: catalogPath, catalog, heuristicFallbackCount } = await refreshProviderModelCatalog(pi, ctx, normalizedProvider, {\n\t\tmaxAgeDays: options.maxAgeDays,\n\t\tforce: options.forceRefresh,\n\t\tprobe: options.probe,\n\t});\n\tconst usableModels = catalog.models.filter(catalogModelIsUsable);\n\tconst profileModels = filterDominatedModels(usableModels);\n\tif (profileModels.length === 0) {\n\t\tthrow new Error(`Provider '${normalizedProvider}' has no usable models after filtering.`);\n\t}\n\tconst quotaModels = pickTierModels(profileModels, \"quota\");\n\tconst qualityModels = pickTierModels(profileModels, \"quality\");\n\tconst dir = ensureSubagentProfilesDir();\n\tconst quotaPath = path.join(dir, `${normalizedProvider}.quota.json`);\n\tconst qualityPath = path.join(dir, `${normalizedProvider}.quality.json`);\n\twriteJsonFile(quotaPath, buildProfileFile(\"quota\", quotaModels));\n\twriteJsonFile(qualityPath, buildProfileFile(\"quality\", qualityModels));\n\tconst selectedModels = new Set([...Object.values(quotaModels), ...Object.values(qualityModels)]);\n\tconst selectedHeuristicFallbackCount = profileModels.filter((model) => selectedModels.has(model.fullId) && modelUsesHeuristicClassification(model)).length;\n\treturn { quotaPath, qualityPath, catalogPath, quotaModels, qualityModels, heuristicFallbackCount, selectedHeuristicFallbackCount };\n}\n\nexport async function checkSubagentProfile(\n\tpi: Pick<ExtensionAPI, \"exec\"> | { exec?: ExtensionAPI[\"exec\"] },\n\tctx: Pick<ExtensionContext, \"cwd\" | \"modelRegistry\">,\n\tname: string,\n): Promise<ProfileCheckResult> {\n\tconst { filePath, profile } = readSubagentProfile(name);\n\tconst availableModels = ctx.modelRegistry.getAvailable().map(toModelInfo);\n\tconst entries = Object.entries(profile.subagents.agentOverrides)\n\t\t.filter(([, value]) => typeof value?.model === \"string\" && value.model.trim())\n\t\t.map(([agent, value]) => ({ agent, model: value.model!.trim() }));\n\tconst probeCache = new Map<string, { status: ProbeStatus; message?: string }>();\n\tconst results: ProfileCheckResult[\"results\"] = [];\n\tfor (const entry of entries) {\n\t\tconst modelInfo = findModelInfo(entry.model, availableModels);\n\t\tconst { thinkingSuffix } = splitKnownThinkingSuffix(entry.model);\n\t\tconst probeModelId = modelInfo ? `${modelInfo.fullId}${thinkingSuffix}` : entry.model;\n\t\tlet probe = probeCache.get(probeModelId);\n\t\tif (!probe) {\n\t\t\tprobe = await probeModel(pi, ctx, probeModelId);\n\t\t\tprobeCache.set(probeModelId, probe);\n\t\t}\n\t\tresults.push({\n\t\t\tagent: entry.agent,\n\t\t\tmodel: entry.model,\n\t\t\tinRegistry: modelInfo !== undefined,\n\t\t\tprobe,\n\t\t});\n\t}\n\treturn { profileName: name, filePath, results };\n}\n"]}
|