@code-yeongyu/senpi 2026.7.20 → 2026.7.22
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 +41 -0
- package/README.md +1 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +1 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/core/agent-session.d.ts +32 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +409 -68
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage.js +1 -1
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts +2 -2
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +67 -16
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/compaction/stream-watchdog.d.ts +31 -0
- package/dist/core/compaction/stream-watchdog.d.ts.map +1 -0
- package/dist/core/compaction/stream-watchdog.js +78 -0
- package/dist/core/compaction/stream-watchdog.js.map +1 -0
- package/dist/core/extensions/builtin/btw/index.d.ts +3 -0
- package/dist/core/extensions/builtin/btw/index.d.ts.map +1 -0
- package/dist/core/extensions/builtin/btw/index.js +120 -0
- package/dist/core/extensions/builtin/btw/index.js.map +1 -0
- package/dist/core/extensions/builtin/btw/panel.d.ts +21 -0
- package/dist/core/extensions/builtin/btw/panel.d.ts.map +1 -0
- package/dist/core/extensions/builtin/btw/panel.js +61 -0
- package/dist/core/extensions/builtin/btw/panel.js.map +1 -0
- package/dist/core/extensions/builtin/btw/side-query.d.ts +31 -0
- package/dist/core/extensions/builtin/btw/side-query.d.ts.map +1 -0
- package/dist/core/extensions/builtin/btw/side-query.js +68 -0
- package/dist/core/extensions/builtin/btw/side-query.js.map +1 -0
- package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.js +47 -11
- package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/openai-remote.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/openai-remote.js +3 -1
- package/dist/core/extensions/builtin/compaction/openai-remote.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/speculative.d.ts +17 -0
- package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/speculative.js +93 -26
- package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
- package/dist/core/extensions/builtin/config-reload/index.d.ts +39 -0
- package/dist/core/extensions/builtin/config-reload/index.d.ts.map +1 -0
- package/dist/core/extensions/builtin/config-reload/index.js +659 -0
- package/dist/core/extensions/builtin/config-reload/index.js.map +1 -0
- package/dist/core/extensions/builtin/config-reload/log.d.ts +55 -0
- package/dist/core/extensions/builtin/config-reload/log.d.ts.map +1 -0
- package/dist/core/extensions/builtin/config-reload/log.js +128 -0
- package/dist/core/extensions/builtin/config-reload/log.js.map +1 -0
- package/dist/core/extensions/builtin/config-reload/protocol.d.ts +71 -0
- package/dist/core/extensions/builtin/config-reload/protocol.d.ts.map +1 -0
- package/dist/core/extensions/builtin/config-reload/protocol.js +83 -0
- package/dist/core/extensions/builtin/config-reload/protocol.js.map +1 -0
- package/dist/core/extensions/builtin/config-reload/watch-engine.d.ts +43 -0
- package/dist/core/extensions/builtin/config-reload/watch-engine.d.ts.map +1 -0
- package/dist/core/extensions/builtin/config-reload/watch-engine.js +298 -0
- package/dist/core/extensions/builtin/config-reload/watch-engine.js.map +1 -0
- package/dist/core/extensions/builtin/goal/command-registration.d.ts +2 -2
- package/dist/core/extensions/builtin/goal/command-registration.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/command-registration.js +3 -4
- package/dist/core/extensions/builtin/goal/command-registration.js.map +1 -1
- package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/index.js +11 -27
- package/dist/core/extensions/builtin/goal/index.js.map +1 -1
- package/dist/core/extensions/builtin/goal/tool-registration.d.ts +2 -2
- package/dist/core/extensions/builtin/goal/tool-registration.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/tool-registration.js +2 -3
- package/dist/core/extensions/builtin/goal/tool-registration.js.map +1 -1
- package/dist/core/extensions/builtin/goal/turn-usage.d.ts +20 -0
- package/dist/core/extensions/builtin/goal/turn-usage.d.ts.map +1 -0
- package/dist/core/extensions/builtin/goal/turn-usage.js +61 -0
- package/dist/core/extensions/builtin/goal/turn-usage.js.map +1 -0
- package/dist/core/extensions/builtin/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/index.js +9 -0
- package/dist/core/extensions/builtin/index.js.map +1 -1
- package/dist/core/extensions/builtin/look-at/arguments.d.ts +27 -0
- package/dist/core/extensions/builtin/look-at/arguments.d.ts.map +1 -0
- package/dist/core/extensions/builtin/look-at/arguments.js +109 -0
- package/dist/core/extensions/builtin/look-at/arguments.js.map +1 -0
- package/dist/core/extensions/builtin/look-at/commands.d.ts +9 -0
- package/dist/core/extensions/builtin/look-at/commands.d.ts.map +1 -0
- package/dist/core/extensions/builtin/look-at/commands.js +102 -0
- package/dist/core/extensions/builtin/look-at/commands.js.map +1 -0
- package/dist/core/extensions/builtin/look-at/image-input.d.ts +21 -0
- package/dist/core/extensions/builtin/look-at/image-input.d.ts.map +1 -0
- package/dist/core/extensions/builtin/look-at/image-input.js +151 -0
- package/dist/core/extensions/builtin/look-at/image-input.js.map +1 -0
- package/dist/core/extensions/builtin/look-at/index.d.ts +3 -0
- package/dist/core/extensions/builtin/look-at/index.d.ts.map +1 -0
- package/dist/core/extensions/builtin/look-at/index.js +58 -0
- package/dist/core/extensions/builtin/look-at/index.js.map +1 -0
- package/dist/core/extensions/builtin/look-at/model-selector.d.ts +9 -0
- package/dist/core/extensions/builtin/look-at/model-selector.d.ts.map +1 -0
- package/dist/core/extensions/builtin/look-at/model-selector.js +77 -0
- package/dist/core/extensions/builtin/look-at/model-selector.js.map +1 -0
- package/dist/core/extensions/builtin/look-at/prompts.d.ts +5 -0
- package/dist/core/extensions/builtin/look-at/prompts.d.ts.map +1 -0
- package/dist/core/extensions/builtin/look-at/prompts.js +19 -0
- package/dist/core/extensions/builtin/look-at/prompts.js.map +1 -0
- package/dist/core/extensions/builtin/look-at/render.d.ts +26 -0
- package/dist/core/extensions/builtin/look-at/render.d.ts.map +1 -0
- package/dist/core/extensions/builtin/look-at/render.js +70 -0
- package/dist/core/extensions/builtin/look-at/render.js.map +1 -0
- package/dist/core/extensions/builtin/look-at/runner.d.ts +16 -0
- package/dist/core/extensions/builtin/look-at/runner.d.ts.map +1 -0
- package/dist/core/extensions/builtin/look-at/runner.js +108 -0
- package/dist/core/extensions/builtin/look-at/runner.js.map +1 -0
- package/dist/core/extensions/builtin/look-at/settings.d.ts +13 -0
- package/dist/core/extensions/builtin/look-at/settings.d.ts.map +1 -0
- package/dist/core/extensions/builtin/look-at/settings.js +20 -0
- package/dist/core/extensions/builtin/look-at/settings.js.map +1 -0
- package/dist/core/extensions/builtin/mcp/commands.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/commands.js +2 -0
- package/dist/core/extensions/builtin/mcp/commands.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/config-schema.d.ts +6 -0
- package/dist/core/extensions/builtin/mcp/config-schema.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/config-schema.js +1 -0
- package/dist/core/extensions/builtin/mcp/config-schema.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/config.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/config.js +9 -1
- package/dist/core/extensions/builtin/mcp/config.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/service.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/service.js +22 -6
- package/dist/core/extensions/builtin/mcp/service.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/startup-race.d.ts +10 -0
- package/dist/core/extensions/builtin/mcp/startup-race.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/startup-race.js +18 -1
- package/dist/core/extensions/builtin/mcp/startup-race.js.map +1 -1
- package/dist/core/extensions/builtin/model-fallback/index.d.ts +4 -0
- package/dist/core/extensions/builtin/model-fallback/index.d.ts.map +1 -0
- package/dist/core/extensions/builtin/model-fallback/index.js +55 -0
- package/dist/core/extensions/builtin/model-fallback/index.js.map +1 -0
- package/dist/core/extensions/builtin/model-fallback/settings.d.ts +6 -0
- package/dist/core/extensions/builtin/model-fallback/settings.d.ts.map +1 -0
- package/dist/core/extensions/builtin/model-fallback/settings.js +11 -0
- package/dist/core/extensions/builtin/model-fallback/settings.js.map +1 -0
- package/dist/core/extensions/builtin/model-fallback/ui.d.ts +12 -0
- package/dist/core/extensions/builtin/model-fallback/ui.d.ts.map +1 -0
- package/dist/core/extensions/builtin/model-fallback/ui.js +72 -0
- package/dist/core/extensions/builtin/model-fallback/ui.js.map +1 -0
- package/dist/core/extensions/builtin/nested-agents-md/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/nested-agents-md/index.js +4 -1
- package/dist/core/extensions/builtin/nested-agents-md/index.js.map +1 -1
- package/dist/core/extensions/builtin/rules/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/rules/index.js +4 -1
- package/dist/core/extensions/builtin/rules/index.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/output-format.d.ts +28 -0
- package/dist/core/extensions/builtin/terminal/output-format.d.ts.map +1 -0
- package/dist/core/extensions/builtin/terminal/output-format.js +74 -0
- package/dist/core/extensions/builtin/terminal/output-format.js.map +1 -0
- package/dist/core/extensions/builtin/terminal/runtime-session.d.ts +3 -0
- package/dist/core/extensions/builtin/terminal/runtime-session.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/runtime-session.js +22 -2
- package/dist/core/extensions/builtin/terminal/runtime-session.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/shared.d.ts +7 -0
- package/dist/core/extensions/builtin/terminal/shared.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/shared.js +14 -0
- package/dist/core/extensions/builtin/terminal/shared.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/bash-output.d.ts +5 -1
- package/dist/core/extensions/builtin/terminal/tools/bash-output.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/bash-output.js +88 -6
- package/dist/core/extensions/builtin/terminal/tools/bash-output.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/bash.d.ts +12 -1
- package/dist/core/extensions/builtin/terminal/tools/bash.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/bash.js +82 -8
- package/dist/core/extensions/builtin/terminal/tools/bash.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/render.d.ts +16 -0
- package/dist/core/extensions/builtin/terminal/tools/render.d.ts.map +1 -0
- package/dist/core/extensions/builtin/terminal/tools/render.js +30 -0
- package/dist/core/extensions/builtin/terminal/tools/render.js.map +1 -0
- package/dist/core/extensions/builtin/terminal/tools/spawn.d.ts +2 -0
- package/dist/core/extensions/builtin/terminal/tools/spawn.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/spawn.js +1 -1
- package/dist/core/extensions/builtin/terminal/tools/spawn.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/tools/todo.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/tools/todo.js +22 -6
- package/dist/core/extensions/builtin/todotools/tools/todo.js.map +1 -1
- package/dist/core/extensions/builtin/webfetch/webfetch/fetcher.d.ts +1 -0
- package/dist/core/extensions/builtin/webfetch/webfetch/fetcher.d.ts.map +1 -1
- package/dist/core/extensions/builtin/webfetch/webfetch/fetcher.js +13 -4
- package/dist/core/extensions/builtin/webfetch/webfetch/fetcher.js.map +1 -1
- package/dist/core/extensions/builtin/webfetch/webfetch/renderers.d.ts.map +1 -1
- package/dist/core/extensions/builtin/webfetch/webfetch/renderers.js +17 -2
- package/dist/core/extensions/builtin/webfetch/webfetch/renderers.js.map +1 -1
- package/dist/core/extensions/builtin/webfetch/webfetch/tool.d.ts +8 -1
- package/dist/core/extensions/builtin/webfetch/webfetch/tool.d.ts.map +1 -1
- package/dist/core/extensions/builtin/webfetch/webfetch/tool.js +45 -3
- package/dist/core/extensions/builtin/webfetch/webfetch/tool.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/renderers.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/renderers.js +13 -4
- package/dist/core/extensions/builtin/websearch/websearch/renderers.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/search.d.ts +3 -2
- package/dist/core/extensions/builtin/websearch/websearch/search.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/search.js +2 -1
- package/dist/core/extensions/builtin/websearch/websearch/search.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/tool.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/tool.js +17 -1
- package/dist/core/extensions/builtin/websearch/websearch/tool.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/types.d.ts +2 -0
- package/dist/core/extensions/builtin/websearch/websearch/types.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/types.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +6 -0
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +71 -3
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +96 -10
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/model-config-schema.d.ts +1942 -0
- package/dist/core/model-config-schema.d.ts.map +1 -0
- package/dist/core/model-config-schema.js +197 -0
- package/dist/core/model-config-schema.js.map +1 -0
- package/dist/core/model-config.d.ts +2 -578
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +1 -194
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +1 -0
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +9 -3
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/provider-composer.d.ts +1 -0
- package/dist/core/provider-composer.d.ts.map +1 -1
- package/dist/core/provider-composer.js +3 -2
- package/dist/core/provider-composer.js.map +1 -1
- package/dist/core/provider-display-names.d.ts.map +1 -1
- package/dist/core/provider-display-names.js +1 -0
- package/dist/core/provider-display-names.js.map +1 -1
- package/dist/core/retry-fallback/chains.d.ts +29 -0
- package/dist/core/retry-fallback/chains.d.ts.map +1 -0
- package/dist/core/retry-fallback/chains.js +109 -0
- package/dist/core/retry-fallback/chains.js.map +1 -0
- package/dist/core/retry-fallback/controller.d.ts +77 -0
- package/dist/core/retry-fallback/controller.d.ts.map +1 -0
- package/dist/core/retry-fallback/controller.js +157 -0
- package/dist/core/retry-fallback/controller.js.map +1 -0
- package/dist/core/retry-fallback/cooldown.d.ts +21 -0
- package/dist/core/retry-fallback/cooldown.d.ts.map +1 -0
- package/dist/core/retry-fallback/cooldown.js +49 -0
- package/dist/core/retry-fallback/cooldown.js.map +1 -0
- package/dist/core/retry-fallback/log.d.ts +10 -0
- package/dist/core/retry-fallback/log.d.ts.map +1 -0
- package/dist/core/retry-fallback/log.js +128 -0
- package/dist/core/retry-fallback/log.js.map +1 -0
- package/dist/core/retry-fallback/validate.d.ts +8 -0
- package/dist/core/retry-fallback/validate.d.ts.map +1 -0
- package/dist/core/retry-fallback/validate.js +63 -0
- package/dist/core/retry-fallback/validate.js.map +1 -0
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +1 -0
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager.d.ts +39 -3
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +125 -16
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +33 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +153 -6
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts +2 -1
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +30 -20
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/todo-strike.d.ts +8 -0
- package/dist/modes/interactive/components/todo-strike.d.ts.map +1 -0
- package/dist/modes/interactive/components/todo-strike.js +35 -0
- package/dist/modes/interactive/components/todo-strike.js.map +1 -0
- package/dist/modes/interactive/components/tool-execution-renderer.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution-renderer.js +8 -1
- package/dist/modes/interactive/components/tool-execution-renderer.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts +4 -0
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +51 -2
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +6 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +124 -4
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/tool-progress.d.ts +8 -0
- package/dist/modes/interactive/tool-progress.d.ts.map +1 -0
- package/dist/modes/interactive/tool-progress.js +26 -0
- package/dist/modes/interactive/tool-progress.js.map +1 -0
- package/dist/modes/interactive/tool-result-reveal.d.ts +18 -0
- package/dist/modes/interactive/tool-result-reveal.d.ts.map +1 -0
- package/dist/modes/interactive/tool-result-reveal.js +155 -0
- package/dist/modes/interactive/tool-result-reveal.js.map +1 -0
- package/dist/utils/fs-watch.d.ts +2 -2
- package/dist/utils/fs-watch.d.ts.map +1 -1
- package/dist/utils/fs-watch.js +2 -2
- package/dist/utils/fs-watch.js.map +1 -1
- package/docs/extensions.md +79 -1
- package/docs/mcp.md +10 -1
- package/docs/models.md +102 -1
- package/docs/providers.md +3 -1
- package/docs/settings.md +35 -0
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +24 -0
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +3 -3
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-handler.ts +13 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +76 -8
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.js +26 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.js +24 -2
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts +5 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
- package/node_modules/@earendil-works/pi-ai/README.md +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +68 -25
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/lazy.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/lazy.js +33 -6
- package/node_modules/@earendil-works/pi-ai/dist/api/lazy.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js +6 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.js +62 -52
- package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api-registry.d.ts +19 -0
- package/node_modules/@earendil-works/pi-ai/dist/api-registry.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api-registry.js +50 -0
- package/node_modules/@earendil-works/pi-ai/dist/api-registry.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/compat.d.ts +2 -17
- package/node_modules/@earendil-works/pi-ai/dist/compat.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/compat.js +3 -52
- package/node_modules/@earendil-works/pi-ai/dist/compat.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts +45 -0
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js +45 -0
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +5 -0
- package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/index.js +5 -0
- package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/model.d.ts +27 -0
- package/node_modules/@earendil-works/pi-ai/dist/model.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/model.js +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/model.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +1178 -1072
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.js +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/alibaba-token-plan.d.ts +3 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/alibaba-token-plan.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/alibaba-token-plan.js +15 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/alibaba-token-plan.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/alibaba-token-plan.models.d.ts +64 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/alibaba-token-plan.models.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/alibaba-token-plan.models.js +5 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/alibaba-token-plan.models.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/all.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/all.js +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/all.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/alibaba-token-plan.json +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/google.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/kimi-coding.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/faux.d.ts +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/faux.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/faux.js +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/faux.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/google.models.d.ts +8 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/google.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/google.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.d.ts +0 -4
- package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.d.ts +12 -4
- package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.d.ts +20 -4
- package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.d.ts +16 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.d.ts +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.js +8 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-stream-helpers.d.ts +20 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-stream-helpers.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-stream-helpers.js +79 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-stream-helpers.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.d.ts +2 -18
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.js +4 -218
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-syntax.d.ts +38 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-syntax.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-syntax.js +210 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-syntax.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/recovery-stream.d.ts +9 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/recovery-stream.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/recovery-stream.js +231 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/recovery-stream.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/recovery-wrapper-state.d.ts +38 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/recovery-wrapper-state.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/recovery-wrapper-state.js +84 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/recovery-wrapper-state.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream-boundary.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream-boundary.js +20 -57
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream-boundary.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream.js +16 -99
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/index.d.ts +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/index.js +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/recovery-stream.d.ts +5 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/recovery-stream.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/recovery-stream.js +6 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/recovery-stream.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-code-mask.d.ts +19 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-code-mask.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-code-mask.js +185 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-code-mask.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-content-lifecycle.d.ts +11 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-content-lifecycle.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-content-lifecycle.js +24 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-content-lifecycle.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-diagnostics.d.ts +4 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-diagnostics.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-diagnostics.js +13 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-diagnostics.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-event-stream.d.ts +15 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-event-stream.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-event-stream.js +37 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-event-stream.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-message-snapshot.d.ts +4 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-message-snapshot.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-message-snapshot.js +61 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-message-snapshot.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-native-projection.d.ts +29 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-native-projection.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-native-projection.js +148 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-native-projection.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-failure.d.ts +5 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-failure.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-failure.js +36 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-failure.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-terminal.d.ts +15 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-terminal.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-terminal.js +88 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-terminal.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-wrapper.d.ts +3 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-wrapper.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-wrapper.js +233 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-wrapper.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-text-projection.d.ts +23 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-text-projection.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-text-projection.js +77 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-text-projection.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-message-metadata.d.ts +5 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-message-metadata.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-message-metadata.js +63 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-message-metadata.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-thinking-projection.d.ts +13 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-thinking-projection.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-thinking-projection.js +52 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-thinking-projection.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper-shared.d.ts +41 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper-shared.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper-shared.js +209 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper-shared.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper.js +70 -346
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +18 -23
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js +5 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.d.ts +4 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.js +6 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/package.json +1 -1
- package/node_modules/@earendil-works/pi-pty/package.json +1 -1
- package/node_modules/@earendil-works/pi-tui/package.json +1 -1
- package/package.json +6 -6
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { loadLookAtInputs } from "./image-input.js";
|
|
2
|
+
import { resolveVisionModel } from "./model-selector.js";
|
|
3
|
+
import { buildLookAtUserMessage, LOOK_AT_SYSTEM_PROMPT } from "./prompts.js";
|
|
4
|
+
import { loadLookAtChain } from "./settings.js";
|
|
5
|
+
const LOOK_AT_TIMEOUT_MS = 120_000;
|
|
6
|
+
export async function runLookAt(args, signal, ctx, store, dependencies = {}) {
|
|
7
|
+
throwIfAborted(signal);
|
|
8
|
+
const inputs = await loadLookAtInputs(ctx, inputPaths(args), inputData(args));
|
|
9
|
+
const resolved = resolveVisionModel(loadLookAtChain(ctx, store), ctx.modelRegistry.getAvailable());
|
|
10
|
+
if (!resolved) {
|
|
11
|
+
throw new Error("No image-capable model is available. Configure a vision-capable provider and try look_at again.");
|
|
12
|
+
}
|
|
13
|
+
const auth = await ctx.modelRegistry.getApiKeyAndHeaders(resolved.model);
|
|
14
|
+
if (!auth.ok) {
|
|
15
|
+
throw new Error(`look_at cannot use ${resolved.model.provider}/${resolved.model.id}: ${auth.error}. ` +
|
|
16
|
+
`Configure credentials with /login ${resolved.model.provider} and try again.`);
|
|
17
|
+
}
|
|
18
|
+
throwIfAborted(signal);
|
|
19
|
+
const request = createRequestSignal(signal);
|
|
20
|
+
try {
|
|
21
|
+
const userMessage = {
|
|
22
|
+
role: "user",
|
|
23
|
+
content: [
|
|
24
|
+
...inputs.map(toImageBlock),
|
|
25
|
+
{
|
|
26
|
+
type: "text",
|
|
27
|
+
text: buildLookAtUserMessage(args.goal, inputs.map((input) => input.label)),
|
|
28
|
+
},
|
|
29
|
+
],
|
|
30
|
+
timestamp: Date.now(),
|
|
31
|
+
};
|
|
32
|
+
const streamRunner = dependencies.streamRunner ??
|
|
33
|
+
((model, context, options) => ctx.modelRegistry.modelRuntime.streamSimple(model, context, options));
|
|
34
|
+
const reasoning = toStreamReasoning(resolved.thinkingLevel);
|
|
35
|
+
const response = await streamRunner(resolved.model, { systemPrompt: LOOK_AT_SYSTEM_PROMPT, messages: [userMessage] }, {
|
|
36
|
+
...(reasoning === undefined ? {} : { reasoning }),
|
|
37
|
+
maxTokens: 4096,
|
|
38
|
+
signal: request.signal,
|
|
39
|
+
}).result();
|
|
40
|
+
return {
|
|
41
|
+
model: `${resolved.model.provider}/${resolved.model.id}`,
|
|
42
|
+
sources: inputs.map((input) => input.label),
|
|
43
|
+
mimeTypes: inputs.map((input) => input.mimeType),
|
|
44
|
+
text: responseText(response, request.signal),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
if (request.signal.aborted)
|
|
49
|
+
throw new Error("look_at analysis was aborted.");
|
|
50
|
+
throw error;
|
|
51
|
+
}
|
|
52
|
+
finally {
|
|
53
|
+
request.dispose();
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function inputPaths(args) {
|
|
57
|
+
return args.file_paths ?? (args.file_path ? [args.file_path] : []);
|
|
58
|
+
}
|
|
59
|
+
function inputData(args) {
|
|
60
|
+
return args.image_data_list ?? (args.image_data ? [args.image_data] : []);
|
|
61
|
+
}
|
|
62
|
+
function toImageBlock(input) {
|
|
63
|
+
return { type: "image", data: input.data, mimeType: input.mimeType };
|
|
64
|
+
}
|
|
65
|
+
function responseText(response, signal) {
|
|
66
|
+
if (response.stopReason === "error") {
|
|
67
|
+
const providerMessage = response.errorMessage ?? "The vision provider returned an unspecified error.";
|
|
68
|
+
throw new Error(`Vision model failed to analyze the supplied media: ${providerMessage}`);
|
|
69
|
+
}
|
|
70
|
+
if (response.stopReason === "aborted" || signal.aborted) {
|
|
71
|
+
throw new Error("look_at analysis was aborted.");
|
|
72
|
+
}
|
|
73
|
+
const text = response.content
|
|
74
|
+
.filter((block) => block.type === "text")
|
|
75
|
+
.map((block) => block.text)
|
|
76
|
+
.join("\n")
|
|
77
|
+
.trim();
|
|
78
|
+
if (!text) {
|
|
79
|
+
throw new Error("Vision model returned no analysis text. Try a clearer goal or another image.");
|
|
80
|
+
}
|
|
81
|
+
return text;
|
|
82
|
+
}
|
|
83
|
+
function throwIfAborted(signal) {
|
|
84
|
+
if (signal?.aborted)
|
|
85
|
+
throw new Error("look_at analysis was aborted.");
|
|
86
|
+
}
|
|
87
|
+
function toStreamReasoning(level) {
|
|
88
|
+
if (level === undefined || level === "off")
|
|
89
|
+
return undefined;
|
|
90
|
+
return level;
|
|
91
|
+
}
|
|
92
|
+
function createRequestSignal(signal) {
|
|
93
|
+
const controller = new AbortController();
|
|
94
|
+
const abortFromTool = () => controller.abort(signal?.reason);
|
|
95
|
+
if (signal?.aborted)
|
|
96
|
+
abortFromTool();
|
|
97
|
+
else
|
|
98
|
+
signal?.addEventListener("abort", abortFromTool, { once: true });
|
|
99
|
+
const timeout = setTimeout(() => controller.abort(), LOOK_AT_TIMEOUT_MS);
|
|
100
|
+
return {
|
|
101
|
+
signal: controller.signal,
|
|
102
|
+
dispose: () => {
|
|
103
|
+
clearTimeout(timeout);
|
|
104
|
+
signal?.removeEventListener("abort", abortFromTool);
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/look-at/runner.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type {\n\tApi,\n\tAssistantMessage,\n\tAssistantMessageEventStream,\n\tContext,\n\tImageContent,\n\tModel,\n\tModelsSimpleStreamOptions,\n\tTextContent,\n\tUserMessage,\n} from \"@earendil-works/pi-ai\";\nimport type { ExtensionContext } from \"../../types.ts\";\nimport type { NormalizedLookAtArgs } from \"./arguments.ts\";\nimport { loadLookAtInputs } from \"./image-input.ts\";\nimport { resolveVisionModel } from \"./model-selector.ts\";\nimport { buildLookAtUserMessage, LOOK_AT_SYSTEM_PROMPT } from \"./prompts.ts\";\nimport { type LookAtStore, loadLookAtChain } from \"./settings.ts\";\n\nconst LOOK_AT_TIMEOUT_MS = 120_000;\n\nexport type LookAtStreamRunner = (\n\tmodel: Model<Api>,\n\tcontext: Context,\n\toptions: ModelsSimpleStreamOptions,\n) => AssistantMessageEventStream;\n\nexport interface LookAtRunnerDependencies {\n\tstreamRunner?: LookAtStreamRunner;\n}\n\nexport interface LookAtRunResult {\n\tmodel: string;\n\tsources: string[];\n\tmimeTypes: string[];\n\ttext: string;\n}\n\nexport async function runLookAt(\n\targs: NormalizedLookAtArgs,\n\tsignal: AbortSignal | undefined,\n\tctx: ExtensionContext,\n\tstore: LookAtStore,\n\tdependencies: LookAtRunnerDependencies = {},\n): Promise<LookAtRunResult> {\n\tthrowIfAborted(signal);\n\tconst inputs = await loadLookAtInputs(ctx, inputPaths(args), inputData(args));\n\tconst resolved = resolveVisionModel(loadLookAtChain(ctx, store), ctx.modelRegistry.getAvailable());\n\tif (!resolved) {\n\t\tthrow new Error(\n\t\t\t\"No image-capable model is available. Configure a vision-capable provider and try look_at again.\",\n\t\t);\n\t}\n\n\tconst auth = await ctx.modelRegistry.getApiKeyAndHeaders(resolved.model);\n\tif (!auth.ok) {\n\t\tthrow new Error(\n\t\t\t`look_at cannot use ${resolved.model.provider}/${resolved.model.id}: ${auth.error}. ` +\n\t\t\t\t`Configure credentials with /login ${resolved.model.provider} and try again.`,\n\t\t);\n\t}\n\tthrowIfAborted(signal);\n\n\tconst request = createRequestSignal(signal);\n\ttry {\n\t\tconst userMessage: UserMessage = {\n\t\t\trole: \"user\",\n\t\t\tcontent: [\n\t\t\t\t...inputs.map(toImageBlock),\n\t\t\t\t{\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\ttext: buildLookAtUserMessage(\n\t\t\t\t\t\targs.goal,\n\t\t\t\t\t\tinputs.map((input) => input.label),\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t],\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\t\tconst streamRunner =\n\t\t\tdependencies.streamRunner ??\n\t\t\t((model, context, options) => ctx.modelRegistry.modelRuntime.streamSimple(model, context, options));\n\t\tconst reasoning = toStreamReasoning(resolved.thinkingLevel);\n\t\tconst response = await streamRunner(\n\t\t\tresolved.model,\n\t\t\t{ systemPrompt: LOOK_AT_SYSTEM_PROMPT, messages: [userMessage] },\n\t\t\t{\n\t\t\t\t...(reasoning === undefined ? {} : { reasoning }),\n\t\t\t\tmaxTokens: 4096,\n\t\t\t\tsignal: request.signal,\n\t\t\t},\n\t\t).result();\n\n\t\treturn {\n\t\t\tmodel: `${resolved.model.provider}/${resolved.model.id}`,\n\t\t\tsources: inputs.map((input) => input.label),\n\t\t\tmimeTypes: inputs.map((input) => input.mimeType),\n\t\t\ttext: responseText(response, request.signal),\n\t\t};\n\t} catch (error) {\n\t\tif (request.signal.aborted) throw new Error(\"look_at analysis was aborted.\");\n\t\tthrow error;\n\t} finally {\n\t\trequest.dispose();\n\t}\n}\n\nfunction inputPaths(args: NormalizedLookAtArgs): string[] {\n\treturn args.file_paths ?? (args.file_path ? [args.file_path] : []);\n}\n\nfunction inputData(args: NormalizedLookAtArgs): string[] {\n\treturn args.image_data_list ?? (args.image_data ? [args.image_data] : []);\n}\n\nfunction toImageBlock(input: { data: string; mimeType: string }): ImageContent {\n\treturn { type: \"image\", data: input.data, mimeType: input.mimeType };\n}\n\nfunction responseText(response: AssistantMessage, signal: AbortSignal): string {\n\tif (response.stopReason === \"error\") {\n\t\tconst providerMessage = response.errorMessage ?? \"The vision provider returned an unspecified error.\";\n\t\tthrow new Error(`Vision model failed to analyze the supplied media: ${providerMessage}`);\n\t}\n\tif (response.stopReason === \"aborted\" || signal.aborted) {\n\t\tthrow new Error(\"look_at analysis was aborted.\");\n\t}\n\tconst text = response.content\n\t\t.filter((block): block is TextContent => block.type === \"text\")\n\t\t.map((block) => block.text)\n\t\t.join(\"\\n\")\n\t\t.trim();\n\tif (!text) {\n\t\tthrow new Error(\"Vision model returned no analysis text. Try a clearer goal or another image.\");\n\t}\n\treturn text;\n}\n\nfunction throwIfAborted(signal: AbortSignal | undefined): void {\n\tif (signal?.aborted) throw new Error(\"look_at analysis was aborted.\");\n}\n\nfunction toStreamReasoning(level: ThinkingLevel | undefined): ModelsSimpleStreamOptions[\"reasoning\"] {\n\tif (level === undefined || level === \"off\") return undefined;\n\treturn level as ModelsSimpleStreamOptions[\"reasoning\"];\n}\n\nfunction createRequestSignal(signal: AbortSignal | undefined): { signal: AbortSignal; dispose(): void } {\n\tconst controller = new AbortController();\n\tconst abortFromTool = () => controller.abort(signal?.reason);\n\tif (signal?.aborted) abortFromTool();\n\telse signal?.addEventListener(\"abort\", abortFromTool, { once: true });\n\tconst timeout = setTimeout(() => controller.abort(), LOOK_AT_TIMEOUT_MS);\n\n\treturn {\n\t\tsignal: controller.signal,\n\t\tdispose: () => {\n\t\t\tclearTimeout(timeout);\n\t\t\tsignal?.removeEventListener(\"abort\", abortFromTool);\n\t\t},\n\t};\n}\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ExtensionContext } from "../../types.ts";
|
|
2
|
+
export interface LookAtStore {
|
|
3
|
+
getOverride(): {
|
|
4
|
+
models?: string[];
|
|
5
|
+
enabled?: boolean;
|
|
6
|
+
};
|
|
7
|
+
setModels(models: string[] | undefined): void;
|
|
8
|
+
setEnabled(enabled: boolean | undefined): void;
|
|
9
|
+
}
|
|
10
|
+
export declare function createLookAtStore(): LookAtStore;
|
|
11
|
+
export declare function loadLookAtChain(ctx: Pick<ExtensionContext, "getLookAtSettings">, store: LookAtStore): string[];
|
|
12
|
+
export declare function loadLookAtEnabled(ctx: Pick<ExtensionContext, "getLookAtSettings">, store: LookAtStore): boolean;
|
|
13
|
+
//# sourceMappingURL=settings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/look-at/settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGvD,MAAM,WAAW,WAAW;IAC3B,WAAW,IAAI;QAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACxD,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI,CAAC;IAC9C,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC;CAC/C;AAED,wBAAgB,iBAAiB,IAAI,WAAW,CAY/C;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,EAAE,KAAK,EAAE,WAAW,GAAG,MAAM,EAAE,CAE9G;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,IAAI,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAE/G"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { DEFAULT_LOOK_AT_CHAIN } from "./model-selector.js";
|
|
2
|
+
export function createLookAtStore() {
|
|
3
|
+
let override = {};
|
|
4
|
+
return {
|
|
5
|
+
getOverride: () => override,
|
|
6
|
+
setModels: (models) => {
|
|
7
|
+
override = { ...override, models };
|
|
8
|
+
},
|
|
9
|
+
setEnabled: (enabled) => {
|
|
10
|
+
override = { ...override, enabled };
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export function loadLookAtChain(ctx, store) {
|
|
15
|
+
return store.getOverride().models ?? ctx.getLookAtSettings().models ?? [...DEFAULT_LOOK_AT_CHAIN];
|
|
16
|
+
}
|
|
17
|
+
export function loadLookAtEnabled(ctx, store) {
|
|
18
|
+
return store.getOverride().enabled ?? ctx.getLookAtSettings().enabled;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/look-at/settings.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAQ5D,MAAM,UAAU,iBAAiB;IAChC,IAAI,QAAQ,GAA6C,EAAE,CAAC;IAE5D,OAAO;QACN,WAAW,EAAE,GAAG,EAAE,CAAC,QAAQ;QAC3B,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE;YACrB,QAAQ,GAAG,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,CAAC;QACpC,CAAC;QACD,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE;YACvB,QAAQ,GAAG,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,CAAC;QACrC,CAAC;KACD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAgD,EAAE,KAAkB;IACnG,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC,MAAM,IAAI,GAAG,CAAC,iBAAiB,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,qBAAqB,CAAC,CAAC;AACnG,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAgD,EAAE,KAAkB;IACrG,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,IAAI,GAAG,CAAC,iBAAiB,EAAE,CAAC,OAAO,CAAC;AACvE,CAAC","sourcesContent":["import type { ExtensionContext } from \"../../types.ts\";\nimport { DEFAULT_LOOK_AT_CHAIN } from \"./model-selector.ts\";\n\nexport interface LookAtStore {\n\tgetOverride(): { models?: string[]; enabled?: boolean };\n\tsetModels(models: string[] | undefined): void;\n\tsetEnabled(enabled: boolean | undefined): void;\n}\n\nexport function createLookAtStore(): LookAtStore {\n\tlet override: { models?: string[]; enabled?: boolean } = {};\n\n\treturn {\n\t\tgetOverride: () => override,\n\t\tsetModels: (models) => {\n\t\t\toverride = { ...override, models };\n\t\t},\n\t\tsetEnabled: (enabled) => {\n\t\t\toverride = { ...override, enabled };\n\t\t},\n\t};\n}\n\nexport function loadLookAtChain(ctx: Pick<ExtensionContext, \"getLookAtSettings\">, store: LookAtStore): string[] {\n\treturn store.getOverride().models ?? ctx.getLookAtSettings().models ?? [...DEFAULT_LOOK_AT_CHAIN];\n}\n\nexport function loadLookAtEnabled(ctx: Pick<ExtensionContext, \"getLookAtSettings\">, store: LookAtStore): boolean {\n\treturn store.getOverride().enabled ?? ctx.getLookAtSettings().enabled;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/commands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAA2B,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/commands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAA2B,MAAM,gBAAgB,CAAC;AAwB5E,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAa1D"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { handleMcpAuthCommand } from "./auth/commands-auth-dispatch.js";
|
|
2
2
|
import { addGlobalMcpServer, setGlobalMcpServerEnabled } from "./config-edit.js";
|
|
3
3
|
import { getMcpService } from "./service.js";
|
|
4
|
+
import { MCP_STARTUP_RACE_MS } from "./startup-race.js";
|
|
4
5
|
import { buildMcpStatusRows, formatMcpStatus } from "./status.js";
|
|
5
6
|
const SUBCOMMANDS = [
|
|
6
7
|
"status",
|
|
@@ -187,6 +188,7 @@ function baseServer(endpoint) {
|
|
|
187
188
|
lifecycle: "lazy",
|
|
188
189
|
logLevel: "info",
|
|
189
190
|
requestTimeoutMs: 30_000,
|
|
191
|
+
startupTimeoutMs: MCP_STARTUP_RACE_MS,
|
|
190
192
|
...endpoint,
|
|
191
193
|
};
|
|
192
194
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/commands.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExtensionAPI, ExtensionCommandContext } from \"../../types.ts\";\nimport { handleMcpAuthCommand } from \"./auth/commands-auth-dispatch.ts\";\nimport { addGlobalMcpServer, setGlobalMcpServerEnabled } from \"./config-edit.ts\";\nimport type { McpServerConfig } from \"./config-schema.ts\";\nimport { getMcpService } from \"./service.ts\";\nimport { buildMcpStatusRows, formatMcpStatus } from \"./status.ts\";\n\nconst SUBCOMMANDS = [\n\t\"status\",\n\t\"add\",\n\t\"enable\",\n\t\"disable\",\n\t\"test\",\n\t\"logs\",\n\t\"reconnect\",\n\t\"auth\",\n\t\"auth-start\",\n\t\"auth-complete\",\n\t\"logout\",\n] as const;\n\nconst AUTH_SUBCOMMANDS = new Set([\"auth\", \"auth-start\", \"auth-complete\", \"logout\"]);\n\nexport function registerMcpCommands(pi: ExtensionAPI): void {\n\tpi.registerCommand(\"mcp\", {\n\t\tdescription: \"Inspect and manage MCP servers.\",\n\t\tgetArgumentCompletions: (prefix) =>\n\t\t\tSUBCOMMANDS.filter((item) => item.startsWith(prefix)).map((value) => ({ value, label: value })),\n\t\thandler: async (rawArgs, ctx) => {\n\t\t\ttry {\n\t\t\t\tawait handleMcpCommand(rawArgs, ctx, pi);\n\t\t\t} catch (error) {\n\t\t\t\tctx.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n\t\t\t}\n\t\t},\n\t});\n}\n\nasync function handleMcpCommand(rawArgs: string, ctx: ExtensionCommandContext, pi: ExtensionAPI): Promise<void> {\n\tconst args = splitCommandArgs(rawArgs);\n\tconst subcommand = args[0] ?? \"\";\n\tif (subcommand === \"\") {\n\t\tawait showPanel(ctx);\n\t\treturn;\n\t}\n\tif (AUTH_SUBCOMMANDS.has(subcommand)) {\n\t\tawait handleMcpAuthCommand(subcommand, args.slice(1), ctx, pi);\n\t\treturn;\n\t}\n\tif (subcommand === \"status\") {\n\t\tawait notifyStatus(ctx);\n\t\treturn;\n\t}\n\tif (subcommand === \"add\") {\n\t\tawait addServer(args.slice(1), ctx, pi);\n\t\treturn;\n\t}\n\tif (subcommand === \"enable\" || subcommand === \"disable\") {\n\t\tawait setServerEnabled(ctx, pi, args[1] ?? \"\", subcommand === \"enable\");\n\t\treturn;\n\t}\n\tif (subcommand === \"test\") {\n\t\tawait testServer(args[1] ?? \"\", ctx);\n\t\treturn;\n\t}\n\tif (subcommand === \"logs\") {\n\t\tshowLogs(args[1] ?? \"\", ctx);\n\t\treturn;\n\t}\n\tif (subcommand === \"reconnect\") {\n\t\tawait reconnectServer(args[1] ?? \"\", ctx, pi);\n\t\treturn;\n\t}\n\tctx.ui.notify(`Unknown /mcp subcommand: ${subcommand}`, \"error\");\n}\n\nasync function showPanel(ctx: ExtensionCommandContext): Promise<void> {\n\tconst text = await renderStatus(\"MCP servers\");\n\tif (!ctx.hasUI) {\n\t\tctx.ui.notify(text);\n\t\treturn;\n\t}\n\tconst choice = await ctx.ui.select(text, [\"status\", \"logs <server>\", \"test <server>\"]);\n\tif (choice === undefined) ctx.ui.notify(text);\n}\n\nasync function notifyStatus(ctx: ExtensionCommandContext): Promise<void> {\n\tctx.ui.notify(await renderStatus(\"MCP status\"));\n}\n\nasync function renderStatus(title: string): Promise<string> {\n\tconst service = getMcpService();\n\tconst rows = await buildMcpStatusRows(service.getServerSnapshots(), (name) => service.getServerExposureStatus(name));\n\treturn formatMcpStatus(title, rows);\n}\n\nasync function addServer(\n\targs: readonly string[],\n\tctx: ExtensionCommandContext,\n\tpi: Pick<ExtensionAPI, \"getActiveTools\" | \"setActiveTools\" | \"registerTool\">,\n): Promise<void> {\n\tconst [name, ...endpoint] = args;\n\tif (!name || endpoint.length === 0) {\n\t\tctx.ui.notify(\"Usage: /mcp add <name> <command...|url>\", \"error\");\n\t\treturn;\n\t}\n\tif (!ctx.hasUI) {\n\t\tctx.ui.notify(\"Cannot add MCP server without UI confirmation.\", \"error\");\n\t\treturn;\n\t}\n\tconst server = parseServerConfig(endpoint);\n\tconst confirmed = await ctx.ui.confirm(\"Add MCP server?\", `${name}: ${endpoint.join(\" \")}`);\n\tif (!confirmed) {\n\t\tctx.ui.notify(\"MCP add cancelled\", \"warning\");\n\t\treturn;\n\t}\n\taddGlobalMcpServer(name, server);\n\tawait getMcpService().attachSession({ type: \"session_start\", reason: \"reload\" }, ctx, pi);\n\tctx.ui.notify(`Added MCP server ${name}`);\n}\n\nasync function setServerEnabled(\n\tctx: ExtensionCommandContext,\n\tpi: Pick<ExtensionAPI, \"getActiveTools\" | \"setActiveTools\" | \"registerTool\">,\n\tname: string,\n\tenabled: boolean,\n): Promise<void> {\n\tif (!ensureKnown(name, ctx)) return;\n\tif (!setGlobalMcpServerEnabled(name, enabled)) {\n\t\tctx.ui.notify(`MCP server ${name} is not in the global config file`, \"error\");\n\t\treturn;\n\t}\n\tctx.ui.notify(`MCP server ${name} connecting`);\n\tawait getMcpService().attachSession({ type: \"session_start\", reason: \"reload\" }, ctx, pi);\n\tctx.ui.notify(`${enabled ? \"Enabled\" : \"Disabled\"} MCP server ${name}`);\n}\n\nasync function testServer(name: string, ctx: ExtensionCommandContext): Promise<void> {\n\tif (!ensureKnown(name, ctx)) return;\n\tconst connection = getMcpService().getConnection(name);\n\tif (connection === undefined) return;\n\tconst started = Date.now();\n\ttry {\n\t\tawait connection.connect();\n\t\tconst result = await connection.client.listTools({}, { timeout: 2000 });\n\t\tconst elapsedMs = Date.now() - started;\n\t\tgetMcpService().recordCall(name, elapsedMs, false);\n\t\tctx.ui.notify(`MCP test ${name} ok (${elapsedMs}ms): ${result.tools.length} tools`);\n\t} catch (error) {\n\t\tconst elapsedMs = Date.now() - started;\n\t\tgetMcpService().recordCall(name, elapsedMs, true);\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tctx.ui.notify(`MCP test ${name} failed (${elapsedMs}ms): ${message}`, \"error\");\n\t}\n}\n\nfunction showLogs(name: string, ctx: ExtensionCommandContext): void {\n\tif (!ensureKnown(name, ctx)) return;\n\tconst lines = getMcpService().getLogLines(name, 20);\n\tctx.ui.notify(lines.length === 0 ? `MCP logs for ${name}: (empty)` : lines.join(\"\\n\"));\n}\n\nasync function reconnectServer(\n\tname: string,\n\tctx: ExtensionCommandContext,\n\tpi: Pick<ExtensionAPI, \"getActiveTools\" | \"setActiveTools\" | \"registerTool\">,\n): Promise<void> {\n\tif (!ensureKnown(name, ctx)) return;\n\ttry {\n\t\tconst service = getMcpService();\n\t\tawait service.reconnectServer(name);\n\t\tawait service.attachSession({ type: \"session_start\", reason: \"reload\" }, ctx, pi);\n\t\tctx.ui.notify(`MCP reconnect ${name} connected`);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tctx.ui.notify(`MCP reconnect ${name} failed: ${message}`, \"error\");\n\t}\n}\n\nfunction ensureKnown(name: string, ctx: ExtensionCommandContext): boolean {\n\tif (\n\t\tname.length > 0 &&\n\t\tgetMcpService()\n\t\t\t.getServerSnapshots()\n\t\t\t.some((snapshot) => snapshot.name === name)\n\t)\n\t\treturn true;\n\tconst known = getMcpService()\n\t\t.getServerSnapshots()\n\t\t.map((snapshot) => snapshot.name)\n\t\t.join(\", \");\n\tctx.ui.notify(`Unknown MCP server: ${name || \"<missing>\"}\\nKnown MCP servers: ${known || \"(none)\"}`, \"error\");\n\treturn false;\n}\n\nfunction parseServerConfig(endpoint: readonly string[]): McpServerConfig {\n\tconst first = endpoint[0] ?? \"\";\n\tif (/^https?:\\/\\//.test(first)) {\n\t\treturn baseServer({ type: \"http\", url: first });\n\t}\n\treturn baseServer({ type: \"stdio\", command: first, args: endpoint.slice(1) });\n}\n\nfunction baseServer(endpoint: Pick<McpServerConfig, \"type\"> & Partial<McpServerConfig>): McpServerConfig {\n\treturn {\n\t\targs: [],\n\t\tconnectTimeoutMs: 15_000,\n\t\tenabled: true,\n\t\texposure: \"auto\",\n\t\tidleTimeoutMin: 10,\n\t\tlifecycle: \"lazy\",\n\t\tlogLevel: \"info\",\n\t\trequestTimeoutMs: 30_000,\n\t\t...endpoint,\n\t};\n}\n\nfunction splitCommandArgs(raw: string): string[] {\n\tconst matches = raw.match(/\"([^\"\\\\]*(?:\\\\.[^\"\\\\]*)*)\"|'([^'\\\\]*(?:\\\\.[^'\\\\]*)*)'|[^\\s]+/g) ?? [];\n\treturn matches.map((part) => part.replace(/^[\"']|[\"']$/g, \"\").replace(/\\\\([\"'])/g, \"$1\"));\n}\n"]}
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/commands.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExtensionAPI, ExtensionCommandContext } from \"../../types.ts\";\nimport { handleMcpAuthCommand } from \"./auth/commands-auth-dispatch.ts\";\nimport { addGlobalMcpServer, setGlobalMcpServerEnabled } from \"./config-edit.ts\";\nimport type { McpServerConfig } from \"./config-schema.ts\";\nimport { getMcpService } from \"./service.ts\";\nimport { MCP_STARTUP_RACE_MS } from \"./startup-race.ts\";\nimport { buildMcpStatusRows, formatMcpStatus } from \"./status.ts\";\n\nconst SUBCOMMANDS = [\n\t\"status\",\n\t\"add\",\n\t\"enable\",\n\t\"disable\",\n\t\"test\",\n\t\"logs\",\n\t\"reconnect\",\n\t\"auth\",\n\t\"auth-start\",\n\t\"auth-complete\",\n\t\"logout\",\n] as const;\n\nconst AUTH_SUBCOMMANDS = new Set([\"auth\", \"auth-start\", \"auth-complete\", \"logout\"]);\n\nexport function registerMcpCommands(pi: ExtensionAPI): void {\n\tpi.registerCommand(\"mcp\", {\n\t\tdescription: \"Inspect and manage MCP servers.\",\n\t\tgetArgumentCompletions: (prefix) =>\n\t\t\tSUBCOMMANDS.filter((item) => item.startsWith(prefix)).map((value) => ({ value, label: value })),\n\t\thandler: async (rawArgs, ctx) => {\n\t\t\ttry {\n\t\t\t\tawait handleMcpCommand(rawArgs, ctx, pi);\n\t\t\t} catch (error) {\n\t\t\t\tctx.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n\t\t\t}\n\t\t},\n\t});\n}\n\nasync function handleMcpCommand(rawArgs: string, ctx: ExtensionCommandContext, pi: ExtensionAPI): Promise<void> {\n\tconst args = splitCommandArgs(rawArgs);\n\tconst subcommand = args[0] ?? \"\";\n\tif (subcommand === \"\") {\n\t\tawait showPanel(ctx);\n\t\treturn;\n\t}\n\tif (AUTH_SUBCOMMANDS.has(subcommand)) {\n\t\tawait handleMcpAuthCommand(subcommand, args.slice(1), ctx, pi);\n\t\treturn;\n\t}\n\tif (subcommand === \"status\") {\n\t\tawait notifyStatus(ctx);\n\t\treturn;\n\t}\n\tif (subcommand === \"add\") {\n\t\tawait addServer(args.slice(1), ctx, pi);\n\t\treturn;\n\t}\n\tif (subcommand === \"enable\" || subcommand === \"disable\") {\n\t\tawait setServerEnabled(ctx, pi, args[1] ?? \"\", subcommand === \"enable\");\n\t\treturn;\n\t}\n\tif (subcommand === \"test\") {\n\t\tawait testServer(args[1] ?? \"\", ctx);\n\t\treturn;\n\t}\n\tif (subcommand === \"logs\") {\n\t\tshowLogs(args[1] ?? \"\", ctx);\n\t\treturn;\n\t}\n\tif (subcommand === \"reconnect\") {\n\t\tawait reconnectServer(args[1] ?? \"\", ctx, pi);\n\t\treturn;\n\t}\n\tctx.ui.notify(`Unknown /mcp subcommand: ${subcommand}`, \"error\");\n}\n\nasync function showPanel(ctx: ExtensionCommandContext): Promise<void> {\n\tconst text = await renderStatus(\"MCP servers\");\n\tif (!ctx.hasUI) {\n\t\tctx.ui.notify(text);\n\t\treturn;\n\t}\n\tconst choice = await ctx.ui.select(text, [\"status\", \"logs <server>\", \"test <server>\"]);\n\tif (choice === undefined) ctx.ui.notify(text);\n}\n\nasync function notifyStatus(ctx: ExtensionCommandContext): Promise<void> {\n\tctx.ui.notify(await renderStatus(\"MCP status\"));\n}\n\nasync function renderStatus(title: string): Promise<string> {\n\tconst service = getMcpService();\n\tconst rows = await buildMcpStatusRows(service.getServerSnapshots(), (name) => service.getServerExposureStatus(name));\n\treturn formatMcpStatus(title, rows);\n}\n\nasync function addServer(\n\targs: readonly string[],\n\tctx: ExtensionCommandContext,\n\tpi: Pick<ExtensionAPI, \"getActiveTools\" | \"setActiveTools\" | \"registerTool\">,\n): Promise<void> {\n\tconst [name, ...endpoint] = args;\n\tif (!name || endpoint.length === 0) {\n\t\tctx.ui.notify(\"Usage: /mcp add <name> <command...|url>\", \"error\");\n\t\treturn;\n\t}\n\tif (!ctx.hasUI) {\n\t\tctx.ui.notify(\"Cannot add MCP server without UI confirmation.\", \"error\");\n\t\treturn;\n\t}\n\tconst server = parseServerConfig(endpoint);\n\tconst confirmed = await ctx.ui.confirm(\"Add MCP server?\", `${name}: ${endpoint.join(\" \")}`);\n\tif (!confirmed) {\n\t\tctx.ui.notify(\"MCP add cancelled\", \"warning\");\n\t\treturn;\n\t}\n\taddGlobalMcpServer(name, server);\n\tawait getMcpService().attachSession({ type: \"session_start\", reason: \"reload\" }, ctx, pi);\n\tctx.ui.notify(`Added MCP server ${name}`);\n}\n\nasync function setServerEnabled(\n\tctx: ExtensionCommandContext,\n\tpi: Pick<ExtensionAPI, \"getActiveTools\" | \"setActiveTools\" | \"registerTool\">,\n\tname: string,\n\tenabled: boolean,\n): Promise<void> {\n\tif (!ensureKnown(name, ctx)) return;\n\tif (!setGlobalMcpServerEnabled(name, enabled)) {\n\t\tctx.ui.notify(`MCP server ${name} is not in the global config file`, \"error\");\n\t\treturn;\n\t}\n\tctx.ui.notify(`MCP server ${name} connecting`);\n\tawait getMcpService().attachSession({ type: \"session_start\", reason: \"reload\" }, ctx, pi);\n\tctx.ui.notify(`${enabled ? \"Enabled\" : \"Disabled\"} MCP server ${name}`);\n}\n\nasync function testServer(name: string, ctx: ExtensionCommandContext): Promise<void> {\n\tif (!ensureKnown(name, ctx)) return;\n\tconst connection = getMcpService().getConnection(name);\n\tif (connection === undefined) return;\n\tconst started = Date.now();\n\ttry {\n\t\tawait connection.connect();\n\t\tconst result = await connection.client.listTools({}, { timeout: 2000 });\n\t\tconst elapsedMs = Date.now() - started;\n\t\tgetMcpService().recordCall(name, elapsedMs, false);\n\t\tctx.ui.notify(`MCP test ${name} ok (${elapsedMs}ms): ${result.tools.length} tools`);\n\t} catch (error) {\n\t\tconst elapsedMs = Date.now() - started;\n\t\tgetMcpService().recordCall(name, elapsedMs, true);\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tctx.ui.notify(`MCP test ${name} failed (${elapsedMs}ms): ${message}`, \"error\");\n\t}\n}\n\nfunction showLogs(name: string, ctx: ExtensionCommandContext): void {\n\tif (!ensureKnown(name, ctx)) return;\n\tconst lines = getMcpService().getLogLines(name, 20);\n\tctx.ui.notify(lines.length === 0 ? `MCP logs for ${name}: (empty)` : lines.join(\"\\n\"));\n}\n\nasync function reconnectServer(\n\tname: string,\n\tctx: ExtensionCommandContext,\n\tpi: Pick<ExtensionAPI, \"getActiveTools\" | \"setActiveTools\" | \"registerTool\">,\n): Promise<void> {\n\tif (!ensureKnown(name, ctx)) return;\n\ttry {\n\t\tconst service = getMcpService();\n\t\tawait service.reconnectServer(name);\n\t\tawait service.attachSession({ type: \"session_start\", reason: \"reload\" }, ctx, pi);\n\t\tctx.ui.notify(`MCP reconnect ${name} connected`);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tctx.ui.notify(`MCP reconnect ${name} failed: ${message}`, \"error\");\n\t}\n}\n\nfunction ensureKnown(name: string, ctx: ExtensionCommandContext): boolean {\n\tif (\n\t\tname.length > 0 &&\n\t\tgetMcpService()\n\t\t\t.getServerSnapshots()\n\t\t\t.some((snapshot) => snapshot.name === name)\n\t)\n\t\treturn true;\n\tconst known = getMcpService()\n\t\t.getServerSnapshots()\n\t\t.map((snapshot) => snapshot.name)\n\t\t.join(\", \");\n\tctx.ui.notify(`Unknown MCP server: ${name || \"<missing>\"}\\nKnown MCP servers: ${known || \"(none)\"}`, \"error\");\n\treturn false;\n}\n\nfunction parseServerConfig(endpoint: readonly string[]): McpServerConfig {\n\tconst first = endpoint[0] ?? \"\";\n\tif (/^https?:\\/\\//.test(first)) {\n\t\treturn baseServer({ type: \"http\", url: first });\n\t}\n\treturn baseServer({ type: \"stdio\", command: first, args: endpoint.slice(1) });\n}\n\nfunction baseServer(endpoint: Pick<McpServerConfig, \"type\"> & Partial<McpServerConfig>): McpServerConfig {\n\treturn {\n\t\targs: [],\n\t\tconnectTimeoutMs: 15_000,\n\t\tenabled: true,\n\t\texposure: \"auto\",\n\t\tidleTimeoutMin: 10,\n\t\tlifecycle: \"lazy\",\n\t\tlogLevel: \"info\",\n\t\trequestTimeoutMs: 30_000,\n\t\tstartupTimeoutMs: MCP_STARTUP_RACE_MS,\n\t\t...endpoint,\n\t};\n}\n\nfunction splitCommandArgs(raw: string): string[] {\n\tconst matches = raw.match(/\"([^\"\\\\]*(?:\\\\.[^\"\\\\]*)*)\"|'([^'\\\\]*(?:\\\\.[^'\\\\]*)*)'|[^\\s]+/g) ?? [];\n\treturn matches.map((part) => part.replace(/^[\"']|[\"']$/g, \"\").replace(/\\\\([\"'])/g, \"$1\"));\n}\n"]}
|
|
@@ -22,6 +22,7 @@ export declare const ServerSchema: Type.TObject<{
|
|
|
22
22
|
idleTimeoutMin: Type.TOptional<Type.TNumber>;
|
|
23
23
|
requestTimeoutMs: Type.TOptional<Type.TNumber>;
|
|
24
24
|
connectTimeoutMs: Type.TOptional<Type.TNumber>;
|
|
25
|
+
startupTimeoutMs: Type.TOptional<Type.TNumber>;
|
|
25
26
|
includeTools: Type.TOptional<Type.TArray<Type.TString>>;
|
|
26
27
|
excludeTools: Type.TOptional<Type.TArray<Type.TString>>;
|
|
27
28
|
directTools: Type.TOptional<Type.TUnion<[Type.TBoolean, Type.TArray<Type.TString>]>>;
|
|
@@ -77,6 +78,7 @@ export declare const ConfigSchema: Type.TObject<{
|
|
|
77
78
|
idleTimeoutMin: Type.TOptional<Type.TNumber>;
|
|
78
79
|
requestTimeoutMs: Type.TOptional<Type.TNumber>;
|
|
79
80
|
connectTimeoutMs: Type.TOptional<Type.TNumber>;
|
|
81
|
+
startupTimeoutMs: Type.TOptional<Type.TNumber>;
|
|
80
82
|
includeTools: Type.TOptional<Type.TArray<Type.TString>>;
|
|
81
83
|
excludeTools: Type.TOptional<Type.TArray<Type.TString>>;
|
|
82
84
|
directTools: Type.TOptional<Type.TUnion<[Type.TBoolean, Type.TArray<Type.TString>]>>;
|
|
@@ -92,6 +94,7 @@ export type McpServerConfig = Static<typeof ServerSchema> & {
|
|
|
92
94
|
lifecycle: "lazy" | "eager" | "keep-alive";
|
|
93
95
|
connectTimeoutMs: number;
|
|
94
96
|
requestTimeoutMs: number;
|
|
97
|
+
startupTimeoutMs: number;
|
|
95
98
|
idleTimeoutMin: number;
|
|
96
99
|
exposure: "auto" | "direct" | "search" | "proxy";
|
|
97
100
|
logLevel: Static<typeof LogLevelSchema>;
|
|
@@ -158,6 +161,7 @@ export declare const validateConfig: import("typebox/compile").Validator<{}, Typ
|
|
|
158
161
|
idleTimeoutMin: Type.TOptional<Type.TNumber>;
|
|
159
162
|
requestTimeoutMs: Type.TOptional<Type.TNumber>;
|
|
160
163
|
connectTimeoutMs: Type.TOptional<Type.TNumber>;
|
|
164
|
+
startupTimeoutMs: Type.TOptional<Type.TNumber>;
|
|
161
165
|
includeTools: Type.TOptional<Type.TArray<Type.TString>>;
|
|
162
166
|
excludeTools: Type.TOptional<Type.TArray<Type.TString>>;
|
|
163
167
|
directTools: Type.TOptional<Type.TUnion<[Type.TBoolean, Type.TArray<Type.TString>]>>;
|
|
@@ -200,6 +204,7 @@ export declare const validateConfig: import("typebox/compile").Validator<{}, Typ
|
|
|
200
204
|
idleTimeoutMin?: number | undefined;
|
|
201
205
|
requestTimeoutMs?: number | undefined;
|
|
202
206
|
connectTimeoutMs?: number | undefined;
|
|
207
|
+
startupTimeoutMs?: number | undefined;
|
|
203
208
|
includeTools?: string[] | undefined;
|
|
204
209
|
excludeTools?: string[] | undefined;
|
|
205
210
|
directTools?: boolean | string[] | undefined;
|
|
@@ -242,6 +247,7 @@ export declare const validateConfig: import("typebox/compile").Validator<{}, Typ
|
|
|
242
247
|
idleTimeoutMin?: number | undefined;
|
|
243
248
|
requestTimeoutMs?: number | undefined;
|
|
244
249
|
connectTimeoutMs?: number | undefined;
|
|
250
|
+
startupTimeoutMs?: number | undefined;
|
|
245
251
|
includeTools?: string[] | undefined;
|
|
246
252
|
excludeTools?: string[] | undefined;
|
|
247
253
|
directTools?: boolean | string[] | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-schema.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/config-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAG5C,eAAO,MAAM,cAAc,wNASzB,CAAC;AAaH,eAAO,MAAM,YAAY
|
|
1
|
+
{"version":3,"file":"config-schema.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/config-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAG5C,eAAO,MAAM,cAAc,wNASzB,CAAC;AAaH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2BxB,CAAC;AAEF,QAAA,MAAM,cAAc;;;;;;;;;;;;EAoBnB,CAAC;AAEF,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAMxB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,YAAY,CAAC,GAAG;IAC3D,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,YAAY,CAAC;IAC3C,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;IACjD,QAAQ,EAAE,MAAM,CAAC,OAAO,cAAc,CAAC,CAAC;CACxC,CAAC;AACF,0DAA0D;AAC1D,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,OAAO,YAAY,CAAC,CAAC;AAC/D,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,cAAc,CAAC,EAAE,YAAY,CAAC,CAAC,GACpF,IAAI,CAAC,MAAM,CAAC,OAAO,cAAc,CAAC,EAAE,YAAY,CAAC,CAAC;AACnD,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,WAAW,CAAC;AACtF,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC;AAElE,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,eAAe,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,cAAc,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,eAAe,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IACjC,QAAQ,EAAE,WAAW,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC3C,WAAW,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,cAAc,EAAE,OAAO,CAAC;CACxB;AAED,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,CAYtF;AAED,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAwB,CAAC;AAGpD;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAkBtF;AAED,eAAO,MAAM,eAAe,EAAE,WAI7B,CAAC"}
|
|
@@ -33,6 +33,7 @@ export const ServerSchema = Type.Object({
|
|
|
33
33
|
idleTimeoutMin: Type.Optional(Type.Number()),
|
|
34
34
|
requestTimeoutMs: Type.Optional(Type.Number()),
|
|
35
35
|
connectTimeoutMs: Type.Optional(Type.Number()),
|
|
36
|
+
startupTimeoutMs: Type.Optional(Type.Number()),
|
|
36
37
|
includeTools: Type.Optional(Type.Array(Type.String())),
|
|
37
38
|
excludeTools: Type.Optional(Type.Array(Type.String())),
|
|
38
39
|
directTools: Type.Optional(Type.Union([Type.Boolean(), Type.Array(Type.String())])),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-schema.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/config-schema.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Static, Type } from \"typebox\";\nimport { Compile } from \"typebox/compile\";\n\nexport const LogLevelSchema = Type.Union([\n\tType.Literal(\"debug\"),\n\tType.Literal(\"info\"),\n\tType.Literal(\"notice\"),\n\tType.Literal(\"warning\"),\n\tType.Literal(\"error\"),\n\tType.Literal(\"critical\"),\n\tType.Literal(\"alert\"),\n\tType.Literal(\"emergency\"),\n]);\n\nconst OAuthSchema = Type.Object(\n\t{\n\t\tclientId: Type.Optional(Type.String()),\n\t\tcallbackPort: Type.Optional(Type.Integer({ minimum: 0, maximum: 65_535 })),\n\t\tscopes: Type.Optional(Type.Array(Type.String())),\n\t\tclientMetadataUrl: Type.Optional(Type.String()),\n\t\tflow: Type.Optional(Type.Union([Type.Literal(\"code\"), Type.Literal(\"client_credentials\")])),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport const ServerSchema = Type.Object(\n\t{\n\t\ttype: Type.Optional(Type.Union([Type.Literal(\"stdio\"), Type.Literal(\"http\")])),\n\t\turl: Type.Optional(Type.String()),\n\t\tcommand: Type.Optional(Type.String()),\n\t\targs: Type.Optional(Type.Array(Type.String())),\n\t\tenv: Type.Optional(Type.Record(Type.String(), Type.String())),\n\t\tcwd: Type.Optional(Type.String()),\n\t\theaders: Type.Optional(Type.Record(Type.String(), Type.String())),\n\t\tauth: Type.Optional(Type.Union([Type.Literal(\"bearer\"), Type.Literal(\"oauth\"), Type.Literal(false)])),\n\t\tbearerTokenEnv: Type.Optional(Type.String()),\n\t\toauth: Type.Optional(OAuthSchema),\n\t\tenabled: Type.Optional(Type.Boolean()),\n\t\tlifecycle: Type.Optional(Type.Union([Type.Literal(\"lazy\"), Type.Literal(\"eager\"), Type.Literal(\"keep-alive\")])),\n\t\tidleTimeoutMin: Type.Optional(Type.Number()),\n\t\trequestTimeoutMs: Type.Optional(Type.Number()),\n\t\tconnectTimeoutMs: Type.Optional(Type.Number()),\n\t\tincludeTools: Type.Optional(Type.Array(Type.String())),\n\t\texcludeTools: Type.Optional(Type.Array(Type.String())),\n\t\tdirectTools: Type.Optional(Type.Union([Type.Boolean(), Type.Array(Type.String())])),\n\t\texposure: Type.Optional(\n\t\t\tType.Union([Type.Literal(\"auto\"), Type.Literal(\"direct\"), Type.Literal(\"search\"), Type.Literal(\"proxy\")]),\n\t\t),\n\t\tlogLevel: Type.Optional(LogLevelSchema),\n\t},\n\t{ additionalProperties: false },\n);\n\nconst SettingsSchema = Type.Object(\n\t{\n\t\ttoolPrefix: Type.Optional(Type.String()),\n\t\tsearchThreshold: Type.Optional(Type.Number()),\n\t\toutputGuard: Type.Optional(\n\t\t\tType.Object(\n\t\t\t\t{\n\t\t\t\t\tmaxBytes: Type.Optional(Type.Number()),\n\t\t\t\t\tmaxLines: Type.Optional(Type.Number()),\n\t\t\t\t\tmaxTokens: Type.Optional(Type.Number()),\n\t\t\t\t},\n\t\t\t\t{ additionalProperties: false },\n\t\t\t),\n\t\t),\n\t\timportConfigs: Type.Optional(Type.Array(Type.Literal(\"claude\"))),\n\t\toauthCallbackUrl: Type.Optional(Type.String()),\n\t\tstubSwap: Type.Optional(Type.Boolean()),\n\t\tnativeToolSearch: Type.Optional(Type.Union([Type.Literal(\"auto\"), Type.Boolean()])),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport const ConfigSchema = Type.Object(\n\t{\n\t\tsettings: Type.Optional(SettingsSchema),\n\t\tmcpServers: Type.Optional(Type.Record(Type.String(), ServerSchema)),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport type RawConfig = Static<typeof ConfigSchema>;\nexport type McpServerConfig = Static<typeof ServerSchema> & {\n\ttype: \"stdio\" | \"http\";\n\targs: string[];\n\tenabled: boolean;\n\tlifecycle: \"lazy\" | \"eager\" | \"keep-alive\";\n\tconnectTimeoutMs: number;\n\trequestTimeoutMs: number;\n\tidleTimeoutMin: number;\n\texposure: \"auto\" | \"direct\" | \"search\" | \"proxy\";\n\tlogLevel: Static<typeof LogLevelSchema>;\n};\n/** Public raw type for extension-declared MCP servers. */\nexport type McpServerDeclaration = Static<typeof ServerSchema>;\nexport type McpSettings = Required<Pick<Static<typeof SettingsSchema>, \"toolPrefix\">> &\n\tOmit<Static<typeof SettingsSchema>, \"toolPrefix\">;\nexport type McpServerSource = \"global\" | \"claude\" | \"project\" | \"skill\" | \"extension\";\nexport type McpServerState = \"enabled\" | \"disabled\" | \"untrusted\";\n\nexport interface ResolvedMcpServer {\n\tname: string;\n\tsource: McpServerSource;\n\tsourcePath: string;\n\tstate: McpServerState;\n\ttransport?: \"stdio\" | \"http\";\n\tconfigHash?: string;\n\tconfig?: McpServerConfig;\n}\n\nexport interface ResolvedMcpConfig {\n\tsettings: McpSettings;\n\tservers: Record<string, ResolvedMcpServer>;\n\tdiagnostics: string[];\n}\n\nexport interface LoadMcpConfigOptions {\n\tcwd: string;\n\tagentDir?: string;\n\tenv?: Record<string, string | undefined>;\n\tprojectTrusted: boolean;\n}\n\nexport function getServerEndpointValidationError(config: RawConfig): string | undefined {\n\tfor (const [name, server] of Object.entries(config.mcpServers ?? {})) {\n\t\tif (server.enabled === false) continue;\n\t\tconst type = server.type ?? (server.url ? \"http\" : \"stdio\");\n\t\tif (type === \"stdio\" && (server.command === undefined || server.command.trim().length === 0)) {\n\t\t\treturn `mcpServers.${name}.command: Required for enabled stdio server`;\n\t\t}\n\t\tif (type === \"http\" && (server.url === undefined || server.url.trim().length === 0)) {\n\t\t\treturn `mcpServers.${name}.url: Required for enabled http server`;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nexport const validateConfig = Compile(ConfigSchema);\nconst validateServer = Compile(ServerSchema);\n\n/**\n * Validate a single extension-declared MCP server.\n * Returns a descriptive error string, or null when valid.\n */\nexport function validateMcpServerDeclaration(name: string, raw: unknown): string | null {\n\tif (!validateServer.Check(raw)) {\n\t\tconst error = Array.from(validateServer.Errors(raw))[0];\n\t\tconst path =\n\t\t\terror.instancePath\n\t\t\t\t.replace(/^\\//, \"\")\n\t\t\t\t.split(\"/\")\n\t\t\t\t.map((p) => p.replace(/~1/g, \"/\").replace(/~0/g, \"~\"))\n\t\t\t\t.join(\".\") || \"$\";\n\t\tconst message = error.message === \"must be array\" ? \"Expected array\" : error.message;\n\t\treturn `Invalid MCP server declaration \"${name}\": ${path}: ${message}`;\n\t}\n\tconst server = raw as McpServerDeclaration;\n\tconst endpointError = getServerEndpointValidationError({ mcpServers: { [name]: server } });\n\tif (endpointError) {\n\t\treturn `Invalid MCP server declaration \"${name}\": ${endpointError}`;\n\t}\n\treturn null;\n}\n\nexport const defaultSettings: McpSettings = {\n\toutputGuard: { maxBytes: 50 * 1024, maxLines: 2000 },\n\tsearchThreshold: 10,\n\ttoolPrefix: \"mcp\",\n};\n"]}
|
|
1
|
+
{"version":3,"file":"config-schema.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/config-schema.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Static, Type } from \"typebox\";\nimport { Compile } from \"typebox/compile\";\n\nexport const LogLevelSchema = Type.Union([\n\tType.Literal(\"debug\"),\n\tType.Literal(\"info\"),\n\tType.Literal(\"notice\"),\n\tType.Literal(\"warning\"),\n\tType.Literal(\"error\"),\n\tType.Literal(\"critical\"),\n\tType.Literal(\"alert\"),\n\tType.Literal(\"emergency\"),\n]);\n\nconst OAuthSchema = Type.Object(\n\t{\n\t\tclientId: Type.Optional(Type.String()),\n\t\tcallbackPort: Type.Optional(Type.Integer({ minimum: 0, maximum: 65_535 })),\n\t\tscopes: Type.Optional(Type.Array(Type.String())),\n\t\tclientMetadataUrl: Type.Optional(Type.String()),\n\t\tflow: Type.Optional(Type.Union([Type.Literal(\"code\"), Type.Literal(\"client_credentials\")])),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport const ServerSchema = Type.Object(\n\t{\n\t\ttype: Type.Optional(Type.Union([Type.Literal(\"stdio\"), Type.Literal(\"http\")])),\n\t\turl: Type.Optional(Type.String()),\n\t\tcommand: Type.Optional(Type.String()),\n\t\targs: Type.Optional(Type.Array(Type.String())),\n\t\tenv: Type.Optional(Type.Record(Type.String(), Type.String())),\n\t\tcwd: Type.Optional(Type.String()),\n\t\theaders: Type.Optional(Type.Record(Type.String(), Type.String())),\n\t\tauth: Type.Optional(Type.Union([Type.Literal(\"bearer\"), Type.Literal(\"oauth\"), Type.Literal(false)])),\n\t\tbearerTokenEnv: Type.Optional(Type.String()),\n\t\toauth: Type.Optional(OAuthSchema),\n\t\tenabled: Type.Optional(Type.Boolean()),\n\t\tlifecycle: Type.Optional(Type.Union([Type.Literal(\"lazy\"), Type.Literal(\"eager\"), Type.Literal(\"keep-alive\")])),\n\t\tidleTimeoutMin: Type.Optional(Type.Number()),\n\t\trequestTimeoutMs: Type.Optional(Type.Number()),\n\t\tconnectTimeoutMs: Type.Optional(Type.Number()),\n\t\tstartupTimeoutMs: Type.Optional(Type.Number()),\n\t\tincludeTools: Type.Optional(Type.Array(Type.String())),\n\t\texcludeTools: Type.Optional(Type.Array(Type.String())),\n\t\tdirectTools: Type.Optional(Type.Union([Type.Boolean(), Type.Array(Type.String())])),\n\t\texposure: Type.Optional(\n\t\t\tType.Union([Type.Literal(\"auto\"), Type.Literal(\"direct\"), Type.Literal(\"search\"), Type.Literal(\"proxy\")]),\n\t\t),\n\t\tlogLevel: Type.Optional(LogLevelSchema),\n\t},\n\t{ additionalProperties: false },\n);\n\nconst SettingsSchema = Type.Object(\n\t{\n\t\ttoolPrefix: Type.Optional(Type.String()),\n\t\tsearchThreshold: Type.Optional(Type.Number()),\n\t\toutputGuard: Type.Optional(\n\t\t\tType.Object(\n\t\t\t\t{\n\t\t\t\t\tmaxBytes: Type.Optional(Type.Number()),\n\t\t\t\t\tmaxLines: Type.Optional(Type.Number()),\n\t\t\t\t\tmaxTokens: Type.Optional(Type.Number()),\n\t\t\t\t},\n\t\t\t\t{ additionalProperties: false },\n\t\t\t),\n\t\t),\n\t\timportConfigs: Type.Optional(Type.Array(Type.Literal(\"claude\"))),\n\t\toauthCallbackUrl: Type.Optional(Type.String()),\n\t\tstubSwap: Type.Optional(Type.Boolean()),\n\t\tnativeToolSearch: Type.Optional(Type.Union([Type.Literal(\"auto\"), Type.Boolean()])),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport const ConfigSchema = Type.Object(\n\t{\n\t\tsettings: Type.Optional(SettingsSchema),\n\t\tmcpServers: Type.Optional(Type.Record(Type.String(), ServerSchema)),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport type RawConfig = Static<typeof ConfigSchema>;\nexport type McpServerConfig = Static<typeof ServerSchema> & {\n\ttype: \"stdio\" | \"http\";\n\targs: string[];\n\tenabled: boolean;\n\tlifecycle: \"lazy\" | \"eager\" | \"keep-alive\";\n\tconnectTimeoutMs: number;\n\trequestTimeoutMs: number;\n\tstartupTimeoutMs: number;\n\tidleTimeoutMin: number;\n\texposure: \"auto\" | \"direct\" | \"search\" | \"proxy\";\n\tlogLevel: Static<typeof LogLevelSchema>;\n};\n/** Public raw type for extension-declared MCP servers. */\nexport type McpServerDeclaration = Static<typeof ServerSchema>;\nexport type McpSettings = Required<Pick<Static<typeof SettingsSchema>, \"toolPrefix\">> &\n\tOmit<Static<typeof SettingsSchema>, \"toolPrefix\">;\nexport type McpServerSource = \"global\" | \"claude\" | \"project\" | \"skill\" | \"extension\";\nexport type McpServerState = \"enabled\" | \"disabled\" | \"untrusted\";\n\nexport interface ResolvedMcpServer {\n\tname: string;\n\tsource: McpServerSource;\n\tsourcePath: string;\n\tstate: McpServerState;\n\ttransport?: \"stdio\" | \"http\";\n\tconfigHash?: string;\n\tconfig?: McpServerConfig;\n}\n\nexport interface ResolvedMcpConfig {\n\tsettings: McpSettings;\n\tservers: Record<string, ResolvedMcpServer>;\n\tdiagnostics: string[];\n}\n\nexport interface LoadMcpConfigOptions {\n\tcwd: string;\n\tagentDir?: string;\n\tenv?: Record<string, string | undefined>;\n\tprojectTrusted: boolean;\n}\n\nexport function getServerEndpointValidationError(config: RawConfig): string | undefined {\n\tfor (const [name, server] of Object.entries(config.mcpServers ?? {})) {\n\t\tif (server.enabled === false) continue;\n\t\tconst type = server.type ?? (server.url ? \"http\" : \"stdio\");\n\t\tif (type === \"stdio\" && (server.command === undefined || server.command.trim().length === 0)) {\n\t\t\treturn `mcpServers.${name}.command: Required for enabled stdio server`;\n\t\t}\n\t\tif (type === \"http\" && (server.url === undefined || server.url.trim().length === 0)) {\n\t\t\treturn `mcpServers.${name}.url: Required for enabled http server`;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nexport const validateConfig = Compile(ConfigSchema);\nconst validateServer = Compile(ServerSchema);\n\n/**\n * Validate a single extension-declared MCP server.\n * Returns a descriptive error string, or null when valid.\n */\nexport function validateMcpServerDeclaration(name: string, raw: unknown): string | null {\n\tif (!validateServer.Check(raw)) {\n\t\tconst error = Array.from(validateServer.Errors(raw))[0];\n\t\tconst path =\n\t\t\terror.instancePath\n\t\t\t\t.replace(/^\\//, \"\")\n\t\t\t\t.split(\"/\")\n\t\t\t\t.map((p) => p.replace(/~1/g, \"/\").replace(/~0/g, \"~\"))\n\t\t\t\t.join(\".\") || \"$\";\n\t\tconst message = error.message === \"must be array\" ? \"Expected array\" : error.message;\n\t\treturn `Invalid MCP server declaration \"${name}\": ${path}: ${message}`;\n\t}\n\tconst server = raw as McpServerDeclaration;\n\tconst endpointError = getServerEndpointValidationError({ mcpServers: { [name]: server } });\n\tif (endpointError) {\n\t\treturn `Invalid MCP server declaration \"${name}\": ${endpointError}`;\n\t}\n\treturn null;\n}\n\nexport const defaultSettings: McpSettings = {\n\toutputGuard: { maxBytes: 50 * 1024, maxLines: 2000 },\n\tsearchThreshold: 10,\n\ttoolPrefix: \"mcp\",\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/config.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAGN,KAAK,oBAAoB,EAIzB,KAAK,SAAS,EACd,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EAEtB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/config.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAGN,KAAK,oBAAoB,EAIzB,KAAK,SAAS,EACd,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EAEtB,MAAM,oBAAoB,CAAC;AAG5B,qBAAa,wBAAyB,SAAQ,KAAK;IAClD,YAAY,OAAO,EAAE,MAAM,EAG1B;CACD;AASD,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,iBAAiB,CAqD9E;AAED,wBAAgB,wBAAwB,CACvC,MAAM,EAAE,iBAAiB,EACzB,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,KAAK,IAAI,GACtD,IAAI,CAMN;AA6GD;;;;GAIG;AACH,wBAAgB,yBAAyB,CACxC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,WAAW,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,EACjD,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,MAAM,GACrB,iBAAiB,CAYnB;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACvC,MAAM,EAAE,iBAAiB,EACzB,YAAY,EAAE,SAAS,8BAA8B,EAAE,GACrD,IAAI,CAqBN;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACpC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,WAAW,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,EACjD,UAAU,EAAE,MAAM,GAChB,iBAAiB,CAWnB"}
|
|
@@ -3,6 +3,7 @@ import { existsSync, readFileSync } from "node:fs";
|
|
|
3
3
|
import { join } from "node:path";
|
|
4
4
|
import { CONFIG_DIR_NAME, getAgentDir } from "../../../../config.js";
|
|
5
5
|
import { defaultSettings, getServerEndpointValidationError, validateConfig, } from "./config-schema.js";
|
|
6
|
+
import { MCP_STARTUP_RACE_MS } from "./startup-race.js";
|
|
6
7
|
export class McpConfigValidationError extends Error {
|
|
7
8
|
constructor(message) {
|
|
8
9
|
super(message);
|
|
@@ -216,6 +217,7 @@ function normalizeServer(server) {
|
|
|
216
217
|
lifecycle: server.lifecycle ?? "lazy",
|
|
217
218
|
logLevel: server.logLevel ?? "info",
|
|
218
219
|
requestTimeoutMs: server.requestTimeoutMs ?? 30_000,
|
|
220
|
+
startupTimeoutMs: server.startupTimeoutMs ?? MCP_STARTUP_RACE_MS,
|
|
219
221
|
type,
|
|
220
222
|
...server,
|
|
221
223
|
};
|
|
@@ -246,7 +248,13 @@ function interpolateString(value, path, env) {
|
|
|
246
248
|
});
|
|
247
249
|
}
|
|
248
250
|
function hashConfig(config) {
|
|
249
|
-
|
|
251
|
+
// startupTimeoutMs is a client-side startup-race policy, not a connection or
|
|
252
|
+
// catalog-shape input. Excluding it from the identity hash keeps the catalog
|
|
253
|
+
// cache valid across upgrades (configs written before the field existed hash
|
|
254
|
+
// identically) and avoids a needless reconnect when only the window changes.
|
|
255
|
+
const hashable = { ...config };
|
|
256
|
+
delete hashable.startupTimeoutMs;
|
|
257
|
+
return createHash("sha256").update(stableStringify(hashable)).digest("hex");
|
|
250
258
|
}
|
|
251
259
|
function stableStringify(value) {
|
|
252
260
|
if (Array.isArray(value))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/config.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { TLocalizedValidationError } from \"typebox/error\";\nimport { CONFIG_DIR_NAME, getAgentDir } from \"../../../../config.ts\";\nimport type { RegisteredMcpServerDeclaration } from \"../../types.ts\";\nimport {\n\tdefaultSettings,\n\tgetServerEndpointValidationError,\n\ttype LoadMcpConfigOptions,\n\ttype McpServerConfig,\n\ttype McpServerSource,\n\ttype McpSettings,\n\ttype RawConfig,\n\ttype ResolvedMcpConfig,\n\ttype ResolvedMcpServer,\n\tvalidateConfig,\n} from \"./config-schema.ts\";\n\nexport class McpConfigValidationError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"McpConfigValidationError\";\n\t}\n}\n\ninterface JsonReadResult {\n\traw: unknown;\n\tdiagnostic?: string;\n}\n\nconst trustedEnv = process.env as Record<string, string | undefined>;\n\nexport function loadMcpConfig(options: LoadMcpConfigOptions): ResolvedMcpConfig {\n\tconst agentDir = options.agentDir ?? getAgentDir();\n\tconst env = options.env ?? trustedEnv;\n\tconst globalPath = join(agentDir, \"mcp.json\");\n\tconst projectPath = join(options.cwd, CONFIG_DIR_NAME, \"mcp.json\");\n\tconst claudePath = join(options.cwd, \".mcp.json\");\n\tconst globalConfig = readTrustedConfig(globalPath, env);\n\tconst projectRead = readConfigJson(projectPath, options.projectTrusted);\n\tconst projectRaw = projectRead.raw;\n\tconst preliminary = mergeConfigs(\n\t\tglobalConfig,\n\t\toptions.projectTrusted ? validateRaw(projectRaw, projectPath) : undefined,\n\t);\n\tconst shouldImportClaude = preliminary.settings?.importConfigs?.includes(\"claude\") === true;\n\tconst claudeRead = shouldImportClaude ? readConfigJson(claudePath, options.projectTrusted) : { raw: undefined };\n\tconst claudeRaw = claudeRead.raw;\n\tconst sources = [\n\t\t{ config: globalConfig, path: globalPath, source: \"global\" as const, trusted: true },\n\t\t{\n\t\t\tconfig:\n\t\t\t\toptions.projectTrusted && shouldImportClaude ? readTrustedConfig(claudePath, env, claudeRaw) : undefined,\n\t\t\tpath: claudePath,\n\t\t\tsource: \"claude\" as const,\n\t\t\ttrusted: options.projectTrusted,\n\t\t},\n\t\t{\n\t\t\tconfig: options.projectTrusted ? readTrustedConfig(projectPath, env, projectRaw) : undefined,\n\t\t\tpath: projectPath,\n\t\t\tsource: \"project\" as const,\n\t\t\ttrusted: options.projectTrusted,\n\t\t},\n\t];\n\tconst merged = mergeConfigs(...sources.map((item) => item.config));\n\tconst result: ResolvedMcpConfig = { diagnostics: [], servers: {}, settings: normalizeSettings(merged.settings) };\n\tfor (const diagnostic of [projectRead.diagnostic, claudeRead.diagnostic]) {\n\t\tif (diagnostic) result.diagnostics.push(diagnostic);\n\t}\n\n\tfor (const item of sources) {\n\t\tif (item.trusted && item.config?.mcpServers) {\n\t\t\taddTrustedServers(result, item.config.mcpServers, item.source, item.path);\n\t\t\tcontinue;\n\t\t}\n\t\tif (!item.trusted) {\n\t\t\taddUntrustedServers(\n\t\t\t\tresult,\n\t\t\t\treadServerNames(item.source === \"claude\" ? claudeRaw : projectRaw),\n\t\t\t\titem.source,\n\t\t\t\titem.path,\n\t\t\t);\n\t\t}\n\t}\n\treturn result;\n}\n\nexport function visitSpawnableMcpServers(\n\tconfig: ResolvedMcpConfig,\n\tvisit: (name: string, server: ResolvedMcpServer) => void,\n): void {\n\tfor (const [name, server] of Object.entries(config.servers)) {\n\t\tif (server.state === \"enabled\") {\n\t\t\tvisit(name, server);\n\t\t}\n\t}\n}\n\nfunction readTrustedConfig(\n\tpath: string,\n\tenv: Record<string, string | undefined>,\n\traw = readConfigJson(path, true).raw,\n): RawConfig | undefined {\n\tconst config = interpolateConfig(validateRaw(raw, path), env);\n\tconst endpointError = config ? getServerEndpointValidationError(config) : undefined;\n\tif (endpointError) throw new McpConfigValidationError(`Invalid MCP config at ${endpointError}`);\n\treturn config;\n}\n\nfunction readConfigJson(path: string, trusted: boolean): JsonReadResult {\n\tif (!existsSync(path)) return { raw: undefined };\n\ttry {\n\t\tconst raw: unknown = JSON.parse(readFileSync(path, \"utf-8\"));\n\t\treturn { raw };\n\t} catch (error) {\n\t\tconst reason = error instanceof Error ? error.message : String(error);\n\t\tif (trusted) throw new McpConfigValidationError(`Invalid MCP config at ${path}: ${reason}`);\n\t\treturn { raw: undefined, diagnostic: `Blocked untrusted MCP config at ${path}: invalid JSON (${reason})` };\n\t}\n}\n\nfunction validateRaw(raw: unknown, _path: string): RawConfig | undefined {\n\tif (raw === undefined) return undefined;\n\tif (validateConfig.Check(raw)) {\n\t\tconst config = raw as RawConfig;\n\t\tconst endpointError = getServerEndpointValidationError(config);\n\t\tif (endpointError) throw new McpConfigValidationError(`Invalid MCP config at ${endpointError}`);\n\t\treturn config;\n\t}\n\tconst error = Array.from(validateConfig.Errors(raw))[0];\n\tthrow new McpConfigValidationError(`Invalid MCP config at ${formatErrorPath(error)}: ${formatErrorMessage(error)}`);\n}\n\nfunction formatErrorPath(error: TLocalizedValidationError): string {\n\tconst trimmed = error.instancePath.replace(/^\\//, \"\");\n\treturn trimmed.length === 0 ? \"$\" : trimmed.split(\"/\").map(decodePathPart).join(\".\");\n}\n\nfunction decodePathPart(part: string): string {\n\treturn part.replace(/~1/g, \"/\").replace(/~0/g, \"~\");\n}\n\nfunction formatErrorMessage(error: TLocalizedValidationError): string {\n\treturn error.message === \"must be array\" ? \"Expected array\" : error.message;\n}\n\nfunction mergeConfigs(...configs: (RawConfig | undefined)[]): RawConfig {\n\tconst merged: RawConfig = {};\n\tfor (const config of configs) {\n\t\tif (!config) continue;\n\t\tmerged.settings = { ...(merged.settings ?? {}), ...(config.settings ?? {}) };\n\t\tmerged.mcpServers = { ...(merged.mcpServers ?? {}), ...(config.mcpServers ?? {}) };\n\t}\n\treturn merged;\n}\n\nfunction normalizeSettings(settings: RawConfig[\"settings\"]): McpSettings {\n\treturn { ...defaultSettings, ...settings };\n}\n\nfunction addTrustedServers(\n\tresult: ResolvedMcpConfig,\n\tservers: NonNullable<RawConfig[\"mcpServers\"]>,\n\tsource: McpServerSource,\n\tsourcePath: string,\n): void {\n\tfor (const [name, server] of Object.entries(servers)) {\n\t\tconst config = normalizeServer(server);\n\t\tresult.servers[name] = {\n\t\t\tconfig,\n\t\t\tconfigHash: hashConfig(config),\n\t\t\tname,\n\t\t\tsource,\n\t\t\tsourcePath,\n\t\t\tstate: config.enabled ? \"enabled\" : \"disabled\",\n\t\t\ttransport: config.type,\n\t\t};\n\t}\n}\n\nfunction addUntrustedServers(\n\tresult: ResolvedMcpConfig,\n\tnames: readonly string[],\n\tsource: McpServerSource,\n\tsourcePath: string,\n): void {\n\tfor (const name of names) {\n\t\tconst existing = result.servers[name];\n\t\tif (existing && existing.state !== \"untrusted\") {\n\t\t\tresult.diagnostics.push(\n\t\t\t\t`Blocked untrusted ${source} MCP server '${name}' from shadowing trusted ${existing.source} server.`,\n\t\t\t);\n\t\t\tcontinue;\n\t\t}\n\t\tresult.servers[name] = { name, source, sourcePath, state: \"untrusted\" };\n\t}\n}\n\nfunction readServerNames(raw: unknown): string[] {\n\tif (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) return [];\n\tconst servers = (raw as { mcpServers?: unknown }).mcpServers;\n\tif (typeof servers !== \"object\" || servers === null || Array.isArray(servers)) return [];\n\treturn Object.keys(servers);\n}\n\n/**\n * Resolve an extension-declared MCP server. Preserves the declared exposure,\n * directTools, filters, lifecycle, and enabled state. A stdio declaration\n * without an explicit `cwd` defaults to the extension's registration cwd.\n */\nexport function resolveExtensionMcpServer(\n\tname: string,\n\traw: NonNullable<RawConfig[\"mcpServers\"]>[string],\n\tsourcePath: string,\n\tregistrationCwd: string,\n): ResolvedMcpServer {\n\tconst withCwd = { ...raw, cwd: raw.cwd ?? registrationCwd };\n\tconst config = normalizeServer(withCwd);\n\treturn {\n\t\tconfig,\n\t\tconfigHash: hashConfig(config),\n\t\tname,\n\t\tsource: \"extension\",\n\t\tsourcePath,\n\t\tstate: config.enabled ? \"enabled\" : \"disabled\",\n\t\ttransport: config.type,\n\t};\n}\n\n/**\n * Merge extension-declared MCP servers into a resolved config. Trusted file\n * sources (global/claude/project) win, including disabled entries. An\n * extension entry replaces an untrusted placeholder and records a diagnostic.\n */\nexport function mergeExtensionMcpServers(\n\tresult: ResolvedMcpConfig,\n\tdeclarations: readonly RegisteredMcpServerDeclaration[],\n): void {\n\tfor (const decl of declarations) {\n\t\tconst existing = result.servers[decl.name];\n\t\tif (existing !== undefined && existing.state !== \"untrusted\") {\n\t\t\tresult.diagnostics.push(\n\t\t\t\t`Extension MCP server '${decl.name}' from ${decl.extensionPath} skipped; ${existing.source} config at ${existing.sourcePath} wins.`,\n\t\t\t);\n\t\t\tcontinue;\n\t\t}\n\t\tif (existing !== undefined) {\n\t\t\tresult.diagnostics.push(\n\t\t\t\t`Extension MCP server '${decl.name}' from ${decl.extensionPath} replaces untrusted ${existing.source} placeholder from ${existing.sourcePath}.`,\n\t\t\t);\n\t\t}\n\t\tresult.servers[decl.name] = resolveExtensionMcpServer(\n\t\t\tdecl.name,\n\t\t\tdecl.config,\n\t\t\tdecl.extensionPath,\n\t\t\tdecl.registrationCwd,\n\t\t);\n\t}\n}\n\n/**\n * Resolve a skill-declared MCP server (mcp.json sidecar or SKILL.md\n * frontmatter). Exposure is forced to search with no directTools so the\n * catalog registers with ZERO active tools until the owning skill loads\n * (0 pre-load payload tokens); lifecycle stays lazy.\n */\nexport function resolveSkillMcpServer(\n\tname: string,\n\traw: NonNullable<RawConfig[\"mcpServers\"]>[string],\n\tsourcePath: string,\n): ResolvedMcpServer {\n\tconst config = { ...normalizeServer(raw), directTools: [], exposure: \"search\" as const };\n\treturn {\n\t\tconfig,\n\t\tconfigHash: hashConfig(config),\n\t\tname,\n\t\tsource: \"skill\",\n\t\tsourcePath,\n\t\tstate: config.enabled ? \"enabled\" : \"disabled\",\n\t\ttransport: config.type,\n\t};\n}\n\nfunction normalizeServer(server: NonNullable<RawConfig[\"mcpServers\"]>[string]): McpServerConfig {\n\tconst type = server.type ?? (server.url ? \"http\" : \"stdio\");\n\treturn {\n\t\targs: server.args ?? [],\n\t\tconnectTimeoutMs: server.connectTimeoutMs ?? 15_000,\n\t\tenabled: server.enabled ?? true,\n\t\texposure: server.exposure ?? \"auto\",\n\t\tidleTimeoutMin: server.idleTimeoutMin ?? 10,\n\t\tlifecycle: server.lifecycle ?? \"lazy\",\n\t\tlogLevel: server.logLevel ?? \"info\",\n\t\trequestTimeoutMs: server.requestTimeoutMs ?? 30_000,\n\t\ttype,\n\t\t...server,\n\t};\n}\n\nfunction interpolateConfig(\n\tconfig: RawConfig | undefined,\n\tenv: Record<string, string | undefined>,\n): RawConfig | undefined {\n\treturn interpolateValue(config, \"mcp\", env) as RawConfig | undefined;\n}\n\nfunction interpolateValue(value: unknown, path: string, env: Record<string, string | undefined>): unknown {\n\tif (typeof value === \"string\") return interpolateString(value, path, env);\n\tif (Array.isArray(value)) return value.map((item, index) => interpolateValue(item, `${path}.${index}`, env));\n\tif (typeof value === \"object\" && value !== null) {\n\t\tconst out: Record<string, unknown> = {};\n\t\tfor (const [key, item] of Object.entries(value)) out[key] = interpolateValue(item, `${path}.${key}`, env);\n\t\treturn out;\n\t}\n\treturn value;\n}\n\nfunction interpolateString(value: string, path: string, env: Record<string, string | undefined>): string {\n\tif (value.trimStart().startsWith(\"!\") || value.includes(\"$(\")) {\n\t\tconst displayPath = path.replace(/^mcp\\./, \"\");\n\t\tthrow new McpConfigValidationError(\n\t\t\t`MCP config interpolation rejected command substitution at ${displayPath}: config values may reference only environment variables for security; shell commands are never executed.`,\n\t\t);\n\t}\n\treturn value.replace(\n\t\t/\\$\\{([A-Za-z_][A-Za-z0-9_]*)(:-([^}]*))?\\}/g,\n\t\t(_match, name: string, _fallback: string, fallbackValue: string | undefined) => {\n\t\t\treturn env[name] ?? fallbackValue ?? \"\";\n\t\t},\n\t);\n}\n\nfunction hashConfig(config: McpServerConfig): string {\n\treturn createHash(\"sha256\").update(stableStringify(config)).digest(\"hex\");\n}\n\nfunction stableStringify(value: unknown): string {\n\tif (Array.isArray(value)) return `[${value.map(stableStringify).join(\",\")}]`;\n\tif (typeof value === \"object\" && value !== null) {\n\t\treturn `{${Object.keys(value)\n\t\t\t.sort()\n\t\t\t.map((key) => `${JSON.stringify(key)}:${stableStringify((value as Record<string, unknown>)[key])}`)\n\t\t\t.join(\",\")}}`;\n\t}\n\treturn JSON.stringify(value);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/config.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { TLocalizedValidationError } from \"typebox/error\";\nimport { CONFIG_DIR_NAME, getAgentDir } from \"../../../../config.ts\";\nimport type { RegisteredMcpServerDeclaration } from \"../../types.ts\";\nimport {\n\tdefaultSettings,\n\tgetServerEndpointValidationError,\n\ttype LoadMcpConfigOptions,\n\ttype McpServerConfig,\n\ttype McpServerSource,\n\ttype McpSettings,\n\ttype RawConfig,\n\ttype ResolvedMcpConfig,\n\ttype ResolvedMcpServer,\n\tvalidateConfig,\n} from \"./config-schema.ts\";\nimport { MCP_STARTUP_RACE_MS } from \"./startup-race.ts\";\n\nexport class McpConfigValidationError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"McpConfigValidationError\";\n\t}\n}\n\ninterface JsonReadResult {\n\traw: unknown;\n\tdiagnostic?: string;\n}\n\nconst trustedEnv = process.env as Record<string, string | undefined>;\n\nexport function loadMcpConfig(options: LoadMcpConfigOptions): ResolvedMcpConfig {\n\tconst agentDir = options.agentDir ?? getAgentDir();\n\tconst env = options.env ?? trustedEnv;\n\tconst globalPath = join(agentDir, \"mcp.json\");\n\tconst projectPath = join(options.cwd, CONFIG_DIR_NAME, \"mcp.json\");\n\tconst claudePath = join(options.cwd, \".mcp.json\");\n\tconst globalConfig = readTrustedConfig(globalPath, env);\n\tconst projectRead = readConfigJson(projectPath, options.projectTrusted);\n\tconst projectRaw = projectRead.raw;\n\tconst preliminary = mergeConfigs(\n\t\tglobalConfig,\n\t\toptions.projectTrusted ? validateRaw(projectRaw, projectPath) : undefined,\n\t);\n\tconst shouldImportClaude = preliminary.settings?.importConfigs?.includes(\"claude\") === true;\n\tconst claudeRead = shouldImportClaude ? readConfigJson(claudePath, options.projectTrusted) : { raw: undefined };\n\tconst claudeRaw = claudeRead.raw;\n\tconst sources = [\n\t\t{ config: globalConfig, path: globalPath, source: \"global\" as const, trusted: true },\n\t\t{\n\t\t\tconfig:\n\t\t\t\toptions.projectTrusted && shouldImportClaude ? readTrustedConfig(claudePath, env, claudeRaw) : undefined,\n\t\t\tpath: claudePath,\n\t\t\tsource: \"claude\" as const,\n\t\t\ttrusted: options.projectTrusted,\n\t\t},\n\t\t{\n\t\t\tconfig: options.projectTrusted ? readTrustedConfig(projectPath, env, projectRaw) : undefined,\n\t\t\tpath: projectPath,\n\t\t\tsource: \"project\" as const,\n\t\t\ttrusted: options.projectTrusted,\n\t\t},\n\t];\n\tconst merged = mergeConfigs(...sources.map((item) => item.config));\n\tconst result: ResolvedMcpConfig = { diagnostics: [], servers: {}, settings: normalizeSettings(merged.settings) };\n\tfor (const diagnostic of [projectRead.diagnostic, claudeRead.diagnostic]) {\n\t\tif (diagnostic) result.diagnostics.push(diagnostic);\n\t}\n\n\tfor (const item of sources) {\n\t\tif (item.trusted && item.config?.mcpServers) {\n\t\t\taddTrustedServers(result, item.config.mcpServers, item.source, item.path);\n\t\t\tcontinue;\n\t\t}\n\t\tif (!item.trusted) {\n\t\t\taddUntrustedServers(\n\t\t\t\tresult,\n\t\t\t\treadServerNames(item.source === \"claude\" ? claudeRaw : projectRaw),\n\t\t\t\titem.source,\n\t\t\t\titem.path,\n\t\t\t);\n\t\t}\n\t}\n\treturn result;\n}\n\nexport function visitSpawnableMcpServers(\n\tconfig: ResolvedMcpConfig,\n\tvisit: (name: string, server: ResolvedMcpServer) => void,\n): void {\n\tfor (const [name, server] of Object.entries(config.servers)) {\n\t\tif (server.state === \"enabled\") {\n\t\t\tvisit(name, server);\n\t\t}\n\t}\n}\n\nfunction readTrustedConfig(\n\tpath: string,\n\tenv: Record<string, string | undefined>,\n\traw = readConfigJson(path, true).raw,\n): RawConfig | undefined {\n\tconst config = interpolateConfig(validateRaw(raw, path), env);\n\tconst endpointError = config ? getServerEndpointValidationError(config) : undefined;\n\tif (endpointError) throw new McpConfigValidationError(`Invalid MCP config at ${endpointError}`);\n\treturn config;\n}\n\nfunction readConfigJson(path: string, trusted: boolean): JsonReadResult {\n\tif (!existsSync(path)) return { raw: undefined };\n\ttry {\n\t\tconst raw: unknown = JSON.parse(readFileSync(path, \"utf-8\"));\n\t\treturn { raw };\n\t} catch (error) {\n\t\tconst reason = error instanceof Error ? error.message : String(error);\n\t\tif (trusted) throw new McpConfigValidationError(`Invalid MCP config at ${path}: ${reason}`);\n\t\treturn { raw: undefined, diagnostic: `Blocked untrusted MCP config at ${path}: invalid JSON (${reason})` };\n\t}\n}\n\nfunction validateRaw(raw: unknown, _path: string): RawConfig | undefined {\n\tif (raw === undefined) return undefined;\n\tif (validateConfig.Check(raw)) {\n\t\tconst config = raw as RawConfig;\n\t\tconst endpointError = getServerEndpointValidationError(config);\n\t\tif (endpointError) throw new McpConfigValidationError(`Invalid MCP config at ${endpointError}`);\n\t\treturn config;\n\t}\n\tconst error = Array.from(validateConfig.Errors(raw))[0];\n\tthrow new McpConfigValidationError(`Invalid MCP config at ${formatErrorPath(error)}: ${formatErrorMessage(error)}`);\n}\n\nfunction formatErrorPath(error: TLocalizedValidationError): string {\n\tconst trimmed = error.instancePath.replace(/^\\//, \"\");\n\treturn trimmed.length === 0 ? \"$\" : trimmed.split(\"/\").map(decodePathPart).join(\".\");\n}\n\nfunction decodePathPart(part: string): string {\n\treturn part.replace(/~1/g, \"/\").replace(/~0/g, \"~\");\n}\n\nfunction formatErrorMessage(error: TLocalizedValidationError): string {\n\treturn error.message === \"must be array\" ? \"Expected array\" : error.message;\n}\n\nfunction mergeConfigs(...configs: (RawConfig | undefined)[]): RawConfig {\n\tconst merged: RawConfig = {};\n\tfor (const config of configs) {\n\t\tif (!config) continue;\n\t\tmerged.settings = { ...(merged.settings ?? {}), ...(config.settings ?? {}) };\n\t\tmerged.mcpServers = { ...(merged.mcpServers ?? {}), ...(config.mcpServers ?? {}) };\n\t}\n\treturn merged;\n}\n\nfunction normalizeSettings(settings: RawConfig[\"settings\"]): McpSettings {\n\treturn { ...defaultSettings, ...settings };\n}\n\nfunction addTrustedServers(\n\tresult: ResolvedMcpConfig,\n\tservers: NonNullable<RawConfig[\"mcpServers\"]>,\n\tsource: McpServerSource,\n\tsourcePath: string,\n): void {\n\tfor (const [name, server] of Object.entries(servers)) {\n\t\tconst config = normalizeServer(server);\n\t\tresult.servers[name] = {\n\t\t\tconfig,\n\t\t\tconfigHash: hashConfig(config),\n\t\t\tname,\n\t\t\tsource,\n\t\t\tsourcePath,\n\t\t\tstate: config.enabled ? \"enabled\" : \"disabled\",\n\t\t\ttransport: config.type,\n\t\t};\n\t}\n}\n\nfunction addUntrustedServers(\n\tresult: ResolvedMcpConfig,\n\tnames: readonly string[],\n\tsource: McpServerSource,\n\tsourcePath: string,\n): void {\n\tfor (const name of names) {\n\t\tconst existing = result.servers[name];\n\t\tif (existing && existing.state !== \"untrusted\") {\n\t\t\tresult.diagnostics.push(\n\t\t\t\t`Blocked untrusted ${source} MCP server '${name}' from shadowing trusted ${existing.source} server.`,\n\t\t\t);\n\t\t\tcontinue;\n\t\t}\n\t\tresult.servers[name] = { name, source, sourcePath, state: \"untrusted\" };\n\t}\n}\n\nfunction readServerNames(raw: unknown): string[] {\n\tif (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) return [];\n\tconst servers = (raw as { mcpServers?: unknown }).mcpServers;\n\tif (typeof servers !== \"object\" || servers === null || Array.isArray(servers)) return [];\n\treturn Object.keys(servers);\n}\n\n/**\n * Resolve an extension-declared MCP server. Preserves the declared exposure,\n * directTools, filters, lifecycle, and enabled state. A stdio declaration\n * without an explicit `cwd` defaults to the extension's registration cwd.\n */\nexport function resolveExtensionMcpServer(\n\tname: string,\n\traw: NonNullable<RawConfig[\"mcpServers\"]>[string],\n\tsourcePath: string,\n\tregistrationCwd: string,\n): ResolvedMcpServer {\n\tconst withCwd = { ...raw, cwd: raw.cwd ?? registrationCwd };\n\tconst config = normalizeServer(withCwd);\n\treturn {\n\t\tconfig,\n\t\tconfigHash: hashConfig(config),\n\t\tname,\n\t\tsource: \"extension\",\n\t\tsourcePath,\n\t\tstate: config.enabled ? \"enabled\" : \"disabled\",\n\t\ttransport: config.type,\n\t};\n}\n\n/**\n * Merge extension-declared MCP servers into a resolved config. Trusted file\n * sources (global/claude/project) win, including disabled entries. An\n * extension entry replaces an untrusted placeholder and records a diagnostic.\n */\nexport function mergeExtensionMcpServers(\n\tresult: ResolvedMcpConfig,\n\tdeclarations: readonly RegisteredMcpServerDeclaration[],\n): void {\n\tfor (const decl of declarations) {\n\t\tconst existing = result.servers[decl.name];\n\t\tif (existing !== undefined && existing.state !== \"untrusted\") {\n\t\t\tresult.diagnostics.push(\n\t\t\t\t`Extension MCP server '${decl.name}' from ${decl.extensionPath} skipped; ${existing.source} config at ${existing.sourcePath} wins.`,\n\t\t\t);\n\t\t\tcontinue;\n\t\t}\n\t\tif (existing !== undefined) {\n\t\t\tresult.diagnostics.push(\n\t\t\t\t`Extension MCP server '${decl.name}' from ${decl.extensionPath} replaces untrusted ${existing.source} placeholder from ${existing.sourcePath}.`,\n\t\t\t);\n\t\t}\n\t\tresult.servers[decl.name] = resolveExtensionMcpServer(\n\t\t\tdecl.name,\n\t\t\tdecl.config,\n\t\t\tdecl.extensionPath,\n\t\t\tdecl.registrationCwd,\n\t\t);\n\t}\n}\n\n/**\n * Resolve a skill-declared MCP server (mcp.json sidecar or SKILL.md\n * frontmatter). Exposure is forced to search with no directTools so the\n * catalog registers with ZERO active tools until the owning skill loads\n * (0 pre-load payload tokens); lifecycle stays lazy.\n */\nexport function resolveSkillMcpServer(\n\tname: string,\n\traw: NonNullable<RawConfig[\"mcpServers\"]>[string],\n\tsourcePath: string,\n): ResolvedMcpServer {\n\tconst config = { ...normalizeServer(raw), directTools: [], exposure: \"search\" as const };\n\treturn {\n\t\tconfig,\n\t\tconfigHash: hashConfig(config),\n\t\tname,\n\t\tsource: \"skill\",\n\t\tsourcePath,\n\t\tstate: config.enabled ? \"enabled\" : \"disabled\",\n\t\ttransport: config.type,\n\t};\n}\n\nfunction normalizeServer(server: NonNullable<RawConfig[\"mcpServers\"]>[string]): McpServerConfig {\n\tconst type = server.type ?? (server.url ? \"http\" : \"stdio\");\n\treturn {\n\t\targs: server.args ?? [],\n\t\tconnectTimeoutMs: server.connectTimeoutMs ?? 15_000,\n\t\tenabled: server.enabled ?? true,\n\t\texposure: server.exposure ?? \"auto\",\n\t\tidleTimeoutMin: server.idleTimeoutMin ?? 10,\n\t\tlifecycle: server.lifecycle ?? \"lazy\",\n\t\tlogLevel: server.logLevel ?? \"info\",\n\t\trequestTimeoutMs: server.requestTimeoutMs ?? 30_000,\n\t\tstartupTimeoutMs: server.startupTimeoutMs ?? MCP_STARTUP_RACE_MS,\n\t\ttype,\n\t\t...server,\n\t};\n}\n\nfunction interpolateConfig(\n\tconfig: RawConfig | undefined,\n\tenv: Record<string, string | undefined>,\n): RawConfig | undefined {\n\treturn interpolateValue(config, \"mcp\", env) as RawConfig | undefined;\n}\n\nfunction interpolateValue(value: unknown, path: string, env: Record<string, string | undefined>): unknown {\n\tif (typeof value === \"string\") return interpolateString(value, path, env);\n\tif (Array.isArray(value)) return value.map((item, index) => interpolateValue(item, `${path}.${index}`, env));\n\tif (typeof value === \"object\" && value !== null) {\n\t\tconst out: Record<string, unknown> = {};\n\t\tfor (const [key, item] of Object.entries(value)) out[key] = interpolateValue(item, `${path}.${key}`, env);\n\t\treturn out;\n\t}\n\treturn value;\n}\n\nfunction interpolateString(value: string, path: string, env: Record<string, string | undefined>): string {\n\tif (value.trimStart().startsWith(\"!\") || value.includes(\"$(\")) {\n\t\tconst displayPath = path.replace(/^mcp\\./, \"\");\n\t\tthrow new McpConfigValidationError(\n\t\t\t`MCP config interpolation rejected command substitution at ${displayPath}: config values may reference only environment variables for security; shell commands are never executed.`,\n\t\t);\n\t}\n\treturn value.replace(\n\t\t/\\$\\{([A-Za-z_][A-Za-z0-9_]*)(:-([^}]*))?\\}/g,\n\t\t(_match, name: string, _fallback: string, fallbackValue: string | undefined) => {\n\t\t\treturn env[name] ?? fallbackValue ?? \"\";\n\t\t},\n\t);\n}\n\nfunction hashConfig(config: McpServerConfig): string {\n\t// startupTimeoutMs is a client-side startup-race policy, not a connection or\n\t// catalog-shape input. Excluding it from the identity hash keeps the catalog\n\t// cache valid across upgrades (configs written before the field existed hash\n\t// identically) and avoids a needless reconnect when only the window changes.\n\tconst hashable: Record<string, unknown> = { ...config };\n\tdelete hashable.startupTimeoutMs;\n\treturn createHash(\"sha256\").update(stableStringify(hashable)).digest(\"hex\");\n}\n\nfunction stableStringify(value: unknown): string {\n\tif (Array.isArray(value)) return `[${value.map(stableStringify).join(\",\")}]`;\n\tif (typeof value === \"object\" && value !== null) {\n\t\treturn `{${Object.keys(value)\n\t\t\t.sort()\n\t\t\t.map((key) => `${JSON.stringify(key)}:${stableStringify((value as Record<string, unknown>)[key])}`)\n\t\t\t.join(\",\")}}`;\n\t}\n\treturn JSON.stringify(value);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAI5F,OAAO,EAA2C,qBAAqB,EAA4B,MAAM,aAAa,CAAC;AACvH,OAAO,KAAK,EAAE,eAAe,EAAwC,MAAM,oBAAoB,CAAC;AAChG,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGnD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/service.ts"],"names":[],"mappings":"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"}
|