@code-yeongyu/senpi 2026.8.11 → 2026.8.12
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 +185 -0
- package/dist/brand-dir-migration.d.ts +28 -0
- package/dist/brand-dir-migration.d.ts.map +1 -0
- package/dist/brand-dir-migration.js +77 -0
- package/dist/brand-dir-migration.js.map +1 -0
- package/dist/cli/grok-neo-gate.d.ts +0 -8
- package/dist/cli/grok-neo-gate.d.ts.map +1 -1
- package/dist/cli/grok-neo-gate.js +4 -2
- package/dist/cli/grok-neo-gate.js.map +1 -1
- package/dist/cli-main.d.ts +1 -1
- package/dist/cli-main.d.ts.map +1 -1
- package/dist/cli-main.js +4 -0
- package/dist/cli-main.js.map +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +3 -2
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +27 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +41 -9
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session.d.ts +8 -2
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +73 -11
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/brand.d.ts +79 -0
- package/dist/core/brand.d.ts.map +1 -0
- package/dist/core/brand.js +141 -0
- package/dist/core/brand.js.map +1 -0
- package/dist/core/dynamic-prompt/identity.d.ts.map +1 -1
- package/dist/core/dynamic-prompt/identity.js +2 -1
- package/dist/core/dynamic-prompt/identity.js.map +1 -1
- package/dist/core/event-bus.d.ts +5 -0
- package/dist/core/event-bus.d.ts.map +1 -1
- package/dist/core/event-bus.js +1 -0
- package/dist/core/event-bus.js.map +1 -1
- package/dist/core/experimental.d.ts.map +1 -1
- package/dist/core/experimental.js +2 -1
- package/dist/core/experimental.js.map +1 -1
- package/dist/core/extensions/builtin/btw/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/btw/index.js +7 -2
- package/dist/core/extensions/builtin/btw/index.js.map +1 -1
- package/dist/core/extensions/builtin/btw/side-query.d.ts +2 -0
- package/dist/core/extensions/builtin/btw/side-query.d.ts.map +1 -1
- package/dist/core/extensions/builtin/btw/side-query.js +39 -2
- package/dist/core/extensions/builtin/btw/side-query.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/availability.d.ts +2 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/availability.d.ts.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/availability.js +24 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/availability.js.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/index.d.ts +4 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/index.js +5 -2
- package/dist/core/extensions/builtin/claude-sdk-oauth/index.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.d.ts +6 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.js +16 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-commit-boundary.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-commit-boundary.js +10 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-commit-boundary.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.d.ts +1 -0
- package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.js +1 -1
- package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/log.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/log.js +2 -1
- package/dist/core/extensions/builtin/compaction/log.js.map +1 -1
- package/dist/core/extensions/builtin/config-reload/generated-shim-filter.d.ts.map +1 -1
- package/dist/core/extensions/builtin/config-reload/generated-shim-filter.js +4 -4
- package/dist/core/extensions/builtin/config-reload/generated-shim-filter.js.map +1 -1
- package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/index.js +5 -0
- package/dist/core/extensions/builtin/goal/index.js.map +1 -1
- package/dist/core/extensions/builtin/goal/lifecycle-helpers.d.ts +2 -2
- package/dist/core/extensions/builtin/goal/lifecycle-helpers.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/lifecycle-helpers.js +3 -3
- package/dist/core/extensions/builtin/goal/lifecycle-helpers.js.map +1 -1
- package/dist/core/extensions/builtin/goal/monitor-continuation.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/monitor-continuation.js +6 -0
- package/dist/core/extensions/builtin/goal/monitor-continuation.js.map +1 -1
- package/dist/core/extensions/builtin/goal/store.d.ts +3 -2
- package/dist/core/extensions/builtin/goal/store.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/store.js +128 -101
- package/dist/core/extensions/builtin/goal/store.js.map +1 -1
- package/dist/core/extensions/builtin/goal/transitions.js +2 -1
- package/dist/core/extensions/builtin/goal/transitions.js.map +1 -1
- package/dist/core/extensions/builtin/help/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/help/index.js +3 -2
- package/dist/core/extensions/builtin/help/index.js.map +1 -1
- package/dist/core/extensions/builtin/imagegen/auth.d.ts +45 -0
- package/dist/core/extensions/builtin/imagegen/auth.d.ts.map +1 -0
- package/dist/core/extensions/builtin/imagegen/auth.js +137 -0
- package/dist/core/extensions/builtin/imagegen/auth.js.map +1 -0
- package/dist/core/extensions/builtin/imagegen/index.d.ts +5 -0
- package/dist/core/extensions/builtin/imagegen/index.d.ts.map +1 -0
- package/dist/core/extensions/builtin/imagegen/index.js +46 -0
- package/dist/core/extensions/builtin/imagegen/index.js.map +1 -0
- package/dist/core/extensions/builtin/imagegen/paths.d.ts +26 -0
- package/dist/core/extensions/builtin/imagegen/paths.d.ts.map +1 -0
- package/dist/core/extensions/builtin/imagegen/paths.js +52 -0
- package/dist/core/extensions/builtin/imagegen/paths.js.map +1 -0
- package/dist/core/extensions/builtin/imagegen/skill/SKILL.md +67 -0
- package/dist/core/extensions/builtin/imagegen/state.d.ts +26 -0
- package/dist/core/extensions/builtin/imagegen/state.d.ts.map +1 -0
- package/dist/core/extensions/builtin/imagegen/state.js +35 -0
- package/dist/core/extensions/builtin/imagegen/state.js.map +1 -0
- package/dist/core/extensions/builtin/imagegen/tool.d.ts +31 -0
- package/dist/core/extensions/builtin/imagegen/tool.d.ts.map +1 -0
- package/dist/core/extensions/builtin/imagegen/tool.js +174 -0
- package/dist/core/extensions/builtin/imagegen/tool.js.map +1 -0
- package/dist/core/extensions/builtin/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/index.js +9 -1
- package/dist/core/extensions/builtin/index.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/control-inventory.d.ts +14 -0
- package/dist/core/extensions/builtin/mcp/control-inventory.d.ts.map +1 -0
- package/dist/core/extensions/builtin/mcp/control-inventory.js +22 -0
- package/dist/core/extensions/builtin/mcp/control-inventory.js.map +1 -0
- package/dist/core/extensions/builtin/mcp/expose/native-search.d.ts +2 -44
- package/dist/core/extensions/builtin/mcp/expose/native-search.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/expose/native-search.js +3 -97
- package/dist/core/extensions/builtin/mcp/expose/native-search.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/expose/proxy.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/expose/proxy.js +15 -4
- package/dist/core/extensions/builtin/mcp/expose/proxy.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/expose/session.d.ts +2 -1
- package/dist/core/extensions/builtin/mcp/expose/session.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/expose/session.js +2 -2
- package/dist/core/extensions/builtin/mcp/expose/session.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/expose/tier-b.d.ts +13 -11
- package/dist/core/extensions/builtin/mcp/expose/tier-b.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/expose/tier-b.js +58 -59
- package/dist/core/extensions/builtin/mcp/expose/tier-b.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/index.js +28 -36
- package/dist/core/extensions/builtin/mcp/index.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/service-register.d.ts +2 -1
- package/dist/core/extensions/builtin/mcp/service-register.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/service-register.js +2 -2
- package/dist/core/extensions/builtin/mcp/service-register.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/service-types.d.ts +4 -0
- package/dist/core/extensions/builtin/mcp/service-types.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/service-types.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/service.d.ts +6 -11
- package/dist/core/extensions/builtin/mcp/service.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/service.js +79 -41
- package/dist/core/extensions/builtin/mcp/service.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/wrap.d.ts +2 -0
- package/dist/core/extensions/builtin/mcp/wrap.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/wrap.js +3 -0
- package/dist/core/extensions/builtin/mcp/wrap.js.map +1 -1
- package/dist/core/extensions/builtin/openai-image-gen/externalize.d.ts +27 -0
- package/dist/core/extensions/builtin/openai-image-gen/externalize.d.ts.map +1 -0
- package/dist/core/extensions/builtin/openai-image-gen/externalize.js +133 -0
- package/dist/core/extensions/builtin/openai-image-gen/externalize.js.map +1 -0
- package/dist/core/extensions/builtin/openai-image-gen/gate.d.ts +21 -0
- package/dist/core/extensions/builtin/openai-image-gen/gate.d.ts.map +1 -0
- package/dist/core/extensions/builtin/openai-image-gen/gate.js +63 -0
- package/dist/core/extensions/builtin/openai-image-gen/gate.js.map +1 -0
- package/dist/core/extensions/builtin/openai-image-gen/index.d.ts +14 -0
- package/dist/core/extensions/builtin/openai-image-gen/index.d.ts.map +1 -0
- package/dist/core/extensions/builtin/openai-image-gen/index.js +77 -0
- package/dist/core/extensions/builtin/openai-image-gen/index.js.map +1 -0
- package/dist/core/extensions/builtin/openai-image-gen/inject.d.ts +15 -0
- package/dist/core/extensions/builtin/openai-image-gen/inject.d.ts.map +1 -0
- package/dist/core/extensions/builtin/openai-image-gen/inject.js +42 -0
- package/dist/core/extensions/builtin/openai-image-gen/inject.js.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.js +2 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-5.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-5.js +2 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-5.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.5.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.5.js +2 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.5.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js +2 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/grok-4.5.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/grok-4.5.js +6 -5
- package/dist/core/extensions/builtin/prompt-preset/grok-4.5.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/kimi-k3.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/kimi-k3.js +2 -1
- package/dist/core/extensions/builtin/prompt-preset/kimi-k3.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/monitor-notify.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/monitor-notify.js +8 -1
- package/dist/core/extensions/builtin/terminal/monitor-notify.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/notify.d.ts +3 -1
- package/dist/core/extensions/builtin/terminal/notify.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/notify.js +4 -1
- package/dist/core/extensions/builtin/terminal/notify.js.map +1 -1
- package/dist/core/extensions/builtin/tool-search/engine/bm25.d.ts +22 -0
- package/dist/core/extensions/builtin/tool-search/engine/bm25.d.ts.map +1 -0
- package/dist/core/extensions/builtin/{mcp/expose → tool-search/engine}/bm25.js +16 -31
- package/dist/core/extensions/builtin/tool-search/engine/bm25.js.map +1 -0
- package/dist/core/extensions/builtin/tool-search/engine/document.d.ts +14 -0
- package/dist/core/extensions/builtin/tool-search/engine/document.d.ts.map +1 -0
- package/dist/core/extensions/builtin/tool-search/engine/document.js +2 -0
- package/dist/core/extensions/builtin/tool-search/engine/document.js.map +1 -0
- package/dist/core/extensions/builtin/tool-search/engine/marker.d.ts +55 -0
- package/dist/core/extensions/builtin/tool-search/engine/marker.d.ts.map +1 -0
- package/dist/core/extensions/builtin/tool-search/engine/marker.js +189 -0
- package/dist/core/extensions/builtin/tool-search/engine/marker.js.map +1 -0
- package/dist/core/extensions/builtin/tool-search/index.d.ts +7 -0
- package/dist/core/extensions/builtin/tool-search/index.d.ts.map +1 -0
- package/dist/core/extensions/builtin/tool-search/index.js +71 -0
- package/dist/core/extensions/builtin/tool-search/index.js.map +1 -0
- package/dist/core/extensions/builtin/tool-search/native-search.d.ts +52 -0
- package/dist/core/extensions/builtin/tool-search/native-search.d.ts.map +1 -0
- package/dist/core/extensions/builtin/tool-search/native-search.js +116 -0
- package/dist/core/extensions/builtin/tool-search/native-search.js.map +1 -0
- package/dist/core/extensions/builtin/tool-search/service.d.ts +38 -0
- package/dist/core/extensions/builtin/tool-search/service.d.ts.map +1 -0
- package/dist/core/extensions/builtin/tool-search/service.js +200 -0
- package/dist/core/extensions/builtin/tool-search/service.js.map +1 -0
- package/dist/core/extensions/builtin/tool-search/tool.d.ts +21 -0
- package/dist/core/extensions/builtin/tool-search/tool.d.ts.map +1 -0
- package/dist/core/extensions/builtin/tool-search/tool.js +95 -0
- package/dist/core/extensions/builtin/tool-search/tool.js.map +1 -0
- package/dist/core/extensions/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +31 -1
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +5 -1
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +28 -1
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +61 -4
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js +11 -0
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/generated-shim-banner.d.ts +15 -0
- package/dist/core/generated-shim-banner.d.ts.map +1 -0
- package/dist/core/generated-shim-banner.js +26 -0
- package/dist/core/generated-shim-banner.js.map +1 -0
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +7 -3
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +2 -1
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/provider-composer.d.ts +10 -1
- package/dist/core/provider-composer.d.ts.map +1 -1
- package/dist/core/provider-composer.js +9 -0
- package/dist/core/provider-composer.js.map +1 -1
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +21 -10
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/session-log.d.ts.map +1 -1
- package/dist/core/session-log.js +4 -2
- package/dist/core/session-log.js.map +1 -1
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +3 -2
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/telemetry.d.ts.map +1 -1
- package/dist/core/telemetry.js +2 -1
- package/dist/core/telemetry.js.map +1 -1
- package/dist/core/timings.d.ts +0 -4
- package/dist/core/timings.d.ts.map +1 -1
- package/dist/core/timings.js +2 -1
- package/dist/core/timings.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/inspector-policy.d.ts.map +1 -1
- package/dist/inspector-policy.js +2 -1
- package/dist/inspector-policy.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +5 -4
- package/dist/main.js.map +1 -1
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +4 -0
- package/dist/migrations.js.map +1 -1
- package/dist/modes/index.d.ts +2 -2
- package/dist/modes/index.d.ts.map +1 -1
- package/dist/modes/index.js +1 -1
- package/dist/modes/index.js.map +1 -1
- package/dist/modes/interactive/external-editor.d.ts +2 -0
- package/dist/modes/interactive/external-editor.d.ts.map +1 -1
- package/dist/modes/interactive/external-editor.js +10 -4
- package/dist/modes/interactive/external-editor.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +6 -5
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/tips/catalog/cli-tips.d.ts.map +1 -1
- package/dist/modes/interactive/tips/catalog/cli-tips.js +2 -1
- package/dist/modes/interactive/tips/catalog/cli-tips.js.map +1 -1
- package/dist/modes/interactive/tips/catalog/ethos-tips.d.ts.map +1 -1
- package/dist/modes/interactive/tips/catalog/ethos-tips.js +4 -3
- package/dist/modes/interactive/tips/catalog/ethos-tips.js.map +1 -1
- package/dist/modes/interactive/tips/catalog/model-tips.d.ts.map +1 -1
- package/dist/modes/interactive/tips/catalog/model-tips.js +2 -1
- package/dist/modes/interactive/tips/catalog/model-tips.js.map +1 -1
- package/dist/modes/interactive/tips/catalog/session-tips.d.ts.map +1 -1
- package/dist/modes/interactive/tips/catalog/session-tips.js +2 -1
- package/dist/modes/interactive/tips/catalog/session-tips.js.map +1 -1
- package/dist/modes/interactive/tips/catalog/settings-tips.d.ts.map +1 -1
- package/dist/modes/interactive/tips/catalog/settings-tips.js +3 -2
- package/dist/modes/interactive/tips/catalog/settings-tips.js.map +1 -1
- package/dist/modes/interactive/tips/catalog/workspace-tips.d.ts.map +1 -1
- package/dist/modes/interactive/tips/catalog/workspace-tips.js +4 -3
- package/dist/modes/interactive/tips/catalog/workspace-tips.js.map +1 -1
- package/dist/modes/provider-native-rendering.d.ts.map +1 -1
- package/dist/modes/provider-native-rendering.js +33 -0
- package/dist/modes/provider-native-rendering.js.map +1 -1
- package/dist/modes/rpc/connection-handler.d.ts.map +1 -1
- package/dist/modes/rpc/connection-handler.js +148 -5
- package/dist/modes/rpc/connection-handler.js.map +1 -1
- package/dist/modes/rpc/custom-capability.d.ts +1 -0
- package/dist/modes/rpc/custom-capability.d.ts.map +1 -1
- package/dist/modes/rpc/custom-capability.js +1 -0
- package/dist/modes/rpc/custom-capability.js.map +1 -1
- package/dist/modes/rpc/multi-session-host.d.ts.map +1 -1
- package/dist/modes/rpc/multi-session-host.js +4 -1
- package/dist/modes/rpc/multi-session-host.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +5 -2
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +10 -1
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +2 -1
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +47 -0
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/modes/rpc/session-binding.d.ts +2 -1
- package/dist/modes/rpc/session-binding.d.ts.map +1 -1
- package/dist/modes/rpc/session-binding.js +3 -2
- package/dist/modes/rpc/session-binding.js.map +1 -1
- package/dist/modes/rpc/session-command-router.d.ts +2 -1
- package/dist/modes/rpc/session-command-router.d.ts.map +1 -1
- package/dist/modes/rpc/session-command-router.js +3 -2
- package/dist/modes/rpc/session-command-router.js.map +1 -1
- package/dist/nearest-parent-config.d.ts +6 -1
- package/dist/nearest-parent-config.d.ts.map +1 -1
- package/dist/nearest-parent-config.js +18 -2
- package/dist/nearest-parent-config.js.map +1 -1
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js +13 -1
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/rpc-entry.js +2 -0
- package/dist/rpc-entry.js.map +1 -1
- package/dist/self-update-bootstrap.d.ts.map +1 -1
- package/dist/self-update-bootstrap.js +6 -0
- package/dist/self-update-bootstrap.js.map +1 -1
- package/dist/senpi +3 -2
- package/dist/utils/pi-user-agent.d.ts +1 -1
- package/dist/utils/pi-user-agent.d.ts.map +1 -1
- package/dist/utils/pi-user-agent.js +4 -3
- package/dist/utils/pi-user-agent.js.map +1 -1
- package/dist/utils/tools-manager.d.ts.map +1 -1
- package/dist/utils/tools-manager.js +2 -1
- package/dist/utils/tools-manager.js.map +1 -1
- package/dist/utils/version-check.d.ts +3 -0
- package/dist/utils/version-check.d.ts.map +1 -1
- package/dist/utils/version-check.js +37 -6
- package/dist/utils/version-check.js.map +1 -1
- package/dist/valid-cwd.d.ts +2 -0
- package/dist/valid-cwd.d.ts.map +1 -0
- package/dist/valid-cwd.js +14 -0
- package/dist/valid-cwd.js.map +1 -0
- package/docs/environment-variables.md +8 -1
- package/docs/extensions.md +93 -13
- package/docs/mcp.md +2 -0
- package/docs/providers.md +2 -2
- package/docs/rpc.md +126 -0
- package/docs/skills.md +8 -0
- package/examples/extensions/searchable-tools.ts +49 -0
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +77 -0
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/jl/kernel.ts +14 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/rb/kernel.ts +14 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/runtime-asset.ts +31 -0
- 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 +5 -1
- 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 +4 -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 +2 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts +9 -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/dist/api/anthropic-messages.js +2 -2
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js +4 -2
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +7 -3
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.d.ts +8 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.js +222 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.lazy.d.ts +3 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.lazy.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.lazy.js +10 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.lazy.js.map +1 -0
- 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 +113 -4
- 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/openai-responses.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.d.ts +5 -0
- 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 +2 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/openai-codex.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/openai-codex.js +2 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/openai-codex.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/types.d.ts +10 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts +47 -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 +47 -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 +1 -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 +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.js +36 -13
- package/node_modules/@earendil-works/pi-ai/dist/models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/openai-responses-compat.d.ts +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/openai-responses-compat.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/openai-responses-compat.js.map +1 -1
- 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 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/all.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-workers-ai.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/google.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/nvidia.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/images/register-builtins.d.ts +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/images/register-builtins.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/images/register-builtins.js +18 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/images/register-builtins.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-images.d.ts +3 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-images.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-images.js +16 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-images.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +1 -1
- 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/prompt-cache-ttl.js +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/prompt-cache-ttl.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 +7 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/wire-identity.d.ts +14 -0
- package/node_modules/@earendil-works/pi-ai/dist/wire-identity.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/wire-identity.js +24 -0
- package/node_modules/@earendil-works/pi-ai/dist/wire-identity.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/package.json +1 -1
- package/node_modules/@earendil-works/pi-pty/dist/pipe-fallback.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-pty/dist/pipe-fallback.js +11 -3
- package/node_modules/@earendil-works/pi-pty/dist/pipe-fallback.js.map +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 +9 -9
- package/dist/core/extensions/builtin/mcp/expose/bm25.d.ts +0 -30
- package/dist/core/extensions/builtin/mcp/expose/bm25.d.ts.map +0 -1
- package/dist/core/extensions/builtin/mcp/expose/bm25.js.map +0 -1
- package/dist/core/extensions/builtin/mcp/expose/lazy-activate.d.ts +0 -15
- package/dist/core/extensions/builtin/mcp/expose/lazy-activate.d.ts.map +0 -1
- package/dist/core/extensions/builtin/mcp/expose/lazy-activate.js +0 -33
- package/dist/core/extensions/builtin/mcp/expose/lazy-activate.js.map +0 -1
- package/dist/core/extensions/builtin/mcp/expose/tool-search.d.ts +0 -43
- package/dist/core/extensions/builtin/mcp/expose/tool-search.d.ts.map +0 -1
- package/dist/core/extensions/builtin/mcp/expose/tool-search.js +0 -125
- package/dist/core/extensions/builtin/mcp/expose/tool-search.js.map +0 -1
|
@@ -2,20 +2,17 @@
|
|
|
2
2
|
//
|
|
3
3
|
// Completes exposure:"auto": a server whose filtered tool count exceeds
|
|
4
4
|
// searchThreshold enters SEARCH mode — the full catalog is registered but only
|
|
5
|
-
// directTools stay active
|
|
6
|
-
//
|
|
7
|
-
// activation turns accept a cache miss (documented); opt-in settings.stubSwap
|
|
8
|
-
// registers 30-70-token stubs so the tools array stays length-stable and only
|
|
9
|
-
// the activated entry's bytes change (stub -> full) on promotion.
|
|
5
|
+
// directTools stay active. The shared tool-search builtin owns tool_search and
|
|
6
|
+
// MCP feeds its searchable documents and activation hook into that service.
|
|
10
7
|
import { Text } from "@earendil-works/pi-tui";
|
|
11
8
|
import { Type } from "typebox";
|
|
9
|
+
import { deriveMcpRegistrationId } from "../../tool-search/engine/marker.js";
|
|
12
10
|
import { registerToolsPreservingActiveSet } from "../active-set.js";
|
|
13
11
|
import { createMcpProxyTool } from "./proxy.js";
|
|
14
12
|
import { buildMcpToolDefinitions, mapMcpCatalogNames, } from "./register.js";
|
|
15
|
-
|
|
16
|
-
const NOOP_REHYDRATE = () => [];
|
|
13
|
+
const managedNamesByRegistrar = new WeakMap();
|
|
17
14
|
/** Register MCP tools honouring Tier-B search mode + prompt-cache mitigations. */
|
|
18
|
-
export function registerMcpTierBTools(pi, input, warn) {
|
|
15
|
+
export function registerMcpTierBTools(pi, input, toolSearchService, warn) {
|
|
19
16
|
const named = mapMcpCatalogNames(input.registeredEntries, warn);
|
|
20
17
|
const searchable = named.map(({ entry, name }) => ({
|
|
21
18
|
name,
|
|
@@ -23,6 +20,17 @@ export function registerMcpTierBTools(pi, input, warn) {
|
|
|
23
20
|
description: entry.description,
|
|
24
21
|
server: entry.server,
|
|
25
22
|
}));
|
|
23
|
+
const documents = named.map(({ entry, name }) => ({
|
|
24
|
+
name,
|
|
25
|
+
label: entry.tool,
|
|
26
|
+
aliases: [entry.tool],
|
|
27
|
+
description: entry.description,
|
|
28
|
+
keywords: [],
|
|
29
|
+
source: "mcp",
|
|
30
|
+
group: entry.server,
|
|
31
|
+
ownerLabel: entry.server,
|
|
32
|
+
registrationId: deriveMcpRegistrationId(entry.server, entry.tool),
|
|
33
|
+
}));
|
|
26
34
|
const fullDefs = buildMcpToolDefinitions(input.registeredEntries, warn);
|
|
27
35
|
const fullByName = new Map(fullDefs.map((def) => [def.name, def]));
|
|
28
36
|
const gatewayNames = [];
|
|
@@ -36,56 +44,40 @@ export function registerMcpTierBTools(pi, input, warn) {
|
|
|
36
44
|
gatewayNames.push(tool.name);
|
|
37
45
|
}
|
|
38
46
|
const activeMcpNames = [...mapMcpCatalogNames(input.activeEntries).map(({ name }) => name), ...gatewayNames];
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
const
|
|
43
|
-
if (!input.searchMode) {
|
|
44
|
-
registerToolsPreservingActiveSet(pi, fullDefs, orderActiveSet([...currentBase, ...activeMcpNames], reference));
|
|
45
|
-
// Direct mode: everything registerable is already active, nothing to replay.
|
|
46
|
-
const activateDirect = (names) => {
|
|
47
|
-
pi.setActiveTools(orderActiveSet(unionStable(pi.getActiveTools(), names), pi.getActiveTools()));
|
|
48
|
-
};
|
|
49
|
-
return { activate: activateDirect, searchable, rehydrateFromHistory: NOOP_REHYDRATE };
|
|
50
|
-
}
|
|
51
|
-
const stubSwap = input.settings.stubSwap === true;
|
|
47
|
+
const managedNames = new Set([...fullDefs.map((def) => def.name), ...gatewayNames]);
|
|
48
|
+
const previousManagedNames = managedNamesByRegistrar.get(pi) ?? new Set();
|
|
49
|
+
managedNamesByRegistrar.set(pi, managedNames);
|
|
50
|
+
const stubSwap = input.searchMode && input.settings.stubSwap === true;
|
|
52
51
|
const stubbed = new Set();
|
|
53
|
-
const activateMcpTools = (names) => {
|
|
54
|
-
if (stubSwap)
|
|
55
|
-
swapStubsToFull(pi, names, stubbed, fullByName);
|
|
56
|
-
pi.setActiveTools(orderActiveSet(names, pi.getActiveTools()));
|
|
57
|
-
};
|
|
58
|
-
const searchTool = createMcpSearchTool({
|
|
59
|
-
getSearchableTools: () => searchable,
|
|
60
|
-
getActiveTools: () => pi.getActiveTools(),
|
|
61
|
-
setActiveTools: activateMcpTools,
|
|
62
|
-
});
|
|
63
52
|
const registeredNames = new Set(fullDefs.map((def) => def.name));
|
|
53
|
+
const catalogNames = new Set(toolSearchService.getCatalog().map((doc) => doc.name));
|
|
64
54
|
const activate = (names) => {
|
|
65
|
-
const known = names.filter((name) => registeredNames.has(name));
|
|
55
|
+
const known = [...new Set(names.filter((name) => registeredNames.has(name)))];
|
|
66
56
|
if (known.length === 0)
|
|
67
57
|
return;
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
const rehydrateFromHistory = (messages) => {
|
|
71
|
-
const restored = rehydrateActiveToolsFromHistory(messages, registeredNames);
|
|
58
|
+
if (stubSwap)
|
|
59
|
+
swapStubsToFull(pi, known, stubbed, fullByName);
|
|
72
60
|
const current = pi.getActiveTools();
|
|
73
|
-
|
|
74
|
-
if (fresh.length === 0)
|
|
75
|
-
return [];
|
|
76
|
-
activateMcpTools(unionStable(current, fresh));
|
|
77
|
-
return fresh;
|
|
61
|
+
pi.setActiveTools(orderActiveSet(unionStable(current, known), current, catalogNames));
|
|
78
62
|
};
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
63
|
+
toolSearchService.feed("mcp", input.searchMode ? documents : [], { activate });
|
|
64
|
+
for (const doc of toolSearchService.getCatalog())
|
|
65
|
+
catalogNames.add(doc.name);
|
|
66
|
+
const reference = pi.getActiveTools();
|
|
67
|
+
// MCP owns only names from its previous/current registration generation.
|
|
68
|
+
// Everything else is a base tool, regardless of naming convention.
|
|
69
|
+
const currentBase = reference.filter((name) => !isLegacyMcpRegistrationName(name) && !previousManagedNames.has(name) && !managedNames.has(name));
|
|
70
|
+
if (!input.searchMode) {
|
|
71
|
+
registerToolsPreservingActiveSet(pi, fullDefs, orderActiveSet([...currentBase, ...activeMcpNames], reference, catalogNames));
|
|
72
|
+
return { activate, searchable };
|
|
73
|
+
}
|
|
82
74
|
if (!stubSwap) {
|
|
83
|
-
// Default search mode: full defs registered, only directTools
|
|
84
|
-
//
|
|
85
|
-
// (an accepted cache miss).
|
|
86
|
-
const active = orderActiveSet([...currentBase,
|
|
75
|
+
// Default search mode: full defs registered, only directTools plus the
|
|
76
|
+
// shared service-managed tool_search are active. Promotions append on the
|
|
77
|
+
// activation turn (an accepted cache miss).
|
|
78
|
+
const active = orderActiveSet([...currentBase, ...activeMcpNames], reference, catalogNames);
|
|
87
79
|
registerToolsPreservingActiveSet(pi, fullDefs, active);
|
|
88
|
-
return { activate, searchable
|
|
80
|
+
return { activate, searchable };
|
|
89
81
|
}
|
|
90
82
|
// stubSwap: every search-mode tool is registered as a tiny stub and kept
|
|
91
83
|
// active so the tools array is length-stable; direct tools stay full.
|
|
@@ -96,9 +88,9 @@ export function registerMcpTierBTools(pi, input, warn) {
|
|
|
96
88
|
stubbed.add(def.name);
|
|
97
89
|
return buildMcpStubDefinition(def.name);
|
|
98
90
|
});
|
|
99
|
-
const active = orderActiveSet([...currentBase,
|
|
91
|
+
const active = orderActiveSet([...currentBase, ...fullDefs.map((def) => def.name)], reference, catalogNames);
|
|
100
92
|
registerToolsPreservingActiveSet(pi, toRegister, active);
|
|
101
|
-
return { activate, searchable
|
|
93
|
+
return { activate, searchable };
|
|
102
94
|
}
|
|
103
95
|
function swapStubsToFull(pi, names, stubbed, fullByName) {
|
|
104
96
|
for (const name of names) {
|
|
@@ -111,18 +103,25 @@ function swapStubsToFull(pi, names, stubbed, fullByName) {
|
|
|
111
103
|
stubbed.delete(name);
|
|
112
104
|
}
|
|
113
105
|
}
|
|
114
|
-
/** Order the active set deterministically
|
|
115
|
-
* tools
|
|
116
|
-
*
|
|
117
|
-
|
|
118
|
-
function orderActiveSet(names, reference) {
|
|
106
|
+
/** Order the active set deterministically without disturbing base tools.
|
|
107
|
+
* Base tools retain reference order; every shared-catalog member sorts by
|
|
108
|
+
* canonical name so consecutive promotions remain byte-stable. */
|
|
109
|
+
export function orderActiveSet(names, reference, catalogNames) {
|
|
119
110
|
const unique = [...new Set(names)];
|
|
120
111
|
const rank = new Map(reference.map((name, index) => [name, index]));
|
|
121
112
|
const base = unique
|
|
122
|
-
.filter((name) => !
|
|
113
|
+
.filter((name) => !catalogNames.has(name))
|
|
123
114
|
.sort((a, b) => (rank.get(a) ?? Number.MAX_SAFE_INTEGER) - (rank.get(b) ?? Number.MAX_SAFE_INTEGER));
|
|
124
|
-
const
|
|
125
|
-
return [...base, ...
|
|
115
|
+
const catalog = unique.filter((name) => catalogNames.has(name)).sort();
|
|
116
|
+
return [...base, ...catalog];
|
|
117
|
+
}
|
|
118
|
+
function unionStable(current, added) {
|
|
119
|
+
return [...new Set([...current, ...added])];
|
|
120
|
+
}
|
|
121
|
+
/** Preserve the existing stale-generation cleanup for active sets created
|
|
122
|
+
* before MCP catalog ownership was tracked. Ordering itself is catalog-based. */
|
|
123
|
+
function isLegacyMcpRegistrationName(name) {
|
|
124
|
+
return name.startsWith("mcp_");
|
|
126
125
|
}
|
|
127
126
|
/** A 30-70 token placeholder for an inactive search-mode tool. Keeps the tools
|
|
128
127
|
* array length-stable under stubSwap; guides the model to tool_search. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tier-b.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/mcp/expose/tier-b.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,EAAE;AACF,wEAAwE;AACxE,+EAA+E;AAC/E,iFAAiF;AACjF,2EAA2E;AAC3E,8EAA8E;AAC9E,8EAA8E;AAC9E,kEAAkE;AAGlE,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE/B,OAAO,EAAE,gCAAgC,EAAE,MAAM,kBAAkB,CAAC;AAGpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EACN,uBAAuB,EAGvB,kBAAkB,GAClB,MAAM,eAAe,CAAC;AACvB,OAAO,EACN,mBAAmB,EACnB,+BAA+B,EAE/B,qBAAqB,EACrB,WAAW,GACX,MAAM,kBAAkB,CAAC;AAkC1B,MAAM,cAAc,GAAG,GAAa,EAAE,CAAC,EAAE,CAAC;AAE1C,kFAAkF;AAClF,MAAM,UAAU,qBAAqB,CACpC,EAAoB,EACpB,KAAgC,EAChC,IAAa;IAEb,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;IAChE,MAAM,UAAU,GAAwB,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACvE,IAAI;QACJ,QAAQ,EAAE,KAAK,CAAC,IAAI;QACpB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,MAAM,EAAE,KAAK,CAAC,MAAM;KACpB,CAAC,CAAC,CAAC;IACJ,MAAM,QAAQ,GAAG,uBAAuB,CAAC,KAAK,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;IACxE,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAU,CAAC,CAAC,CAAC;IAC5E,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,aAAa,IAAI,EAAE,EAAE,CAAC;QACjD,MAAM,IAAI,GAAG,kBAAkB,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QACjE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACtB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,YAAY,IAAI,EAAE,EAAE,CAAC;QAC7C,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACtB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IACD,MAAM,cAAc,GAAG,CAAC,GAAG,kBAAkB,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,YAAY,CAAC,CAAC;IAC7G,MAAM,SAAS,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC;IACtC,2EAA2E;IAC3E,6EAA6E;IAC7E,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IAEzE,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QACvB,gCAAgC,CAAC,EAAE,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC,GAAG,WAAW,EAAE,GAAG,cAAc,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;QAC/G,6EAA6E;QAC7E,MAAM,cAAc,GAAG,CAAC,KAAwB,EAAQ,EAAE;YACzD,EAAE,CAAC,cAAc,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,CAAC,cAAc,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;QACjG,CAAC,CAAC;QACF,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,oBAAoB,EAAE,cAAc,EAAE,CAAC;IACvF,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,QAAQ,KAAK,IAAI,CAAC;IAClD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,gBAAgB,GAAG,CAAC,KAAwB,EAAQ,EAAE;QAC3D,IAAI,QAAQ;YAAE,eAAe,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QAC9D,EAAE,CAAC,cAAc,CAAC,cAAc,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;IAC/D,CAAC,CAAC;IACF,MAAM,UAAU,GAAG,mBAAmB,CAAC;QACtC,kBAAkB,EAAE,GAAG,EAAE,CAAC,UAAU;QACpC,cAAc,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,cAAc,EAAE;QACzC,cAAc,EAAE,gBAAgB;KAChC,CAAC,CAAC;IACH,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,CAAC,KAAwB,EAAQ,EAAE;QACnD,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QAChE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAC/B,gBAAgB,CAAC,WAAW,CAAC,EAAE,CAAC,cAAc,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;IAC3D,CAAC,CAAC;IACF,MAAM,oBAAoB,GAAG,CAAC,QAA4B,EAAY,EAAE;QACvE,MAAM,QAAQ,GAAG,+BAA+B,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;QAC5E,MAAM,OAAO,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QACjE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAClC,gBAAgB,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;QAC9C,OAAO,KAAK,CAAC;IACd,CAAC,CAAC;IAEF,yEAAyE;IACzE,kEAAkE;IAClE,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;IAE5B,IAAI,CAAC,QAAQ,EAAE,CAAC;QACf,4EAA4E;QAC5E,wEAAwE;QACxE,4BAA4B;QAC5B,MAAM,MAAM,GAAG,cAAc,CAAC,CAAC,GAAG,WAAW,EAAE,qBAAqB,EAAE,GAAG,cAAc,CAAC,EAAE,SAAS,CAAC,CAAC;QACrG,gCAAgC,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QACvD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,oBAAoB,EAAE,CAAC;IACvD,CAAC;IAED,yEAAyE;IACzE,sEAAsE;IACtE,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAwB,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QAC5D,IAAI,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO,GAAG,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtB,OAAO,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,cAAc,CAC5B,CAAC,GAAG,WAAW,EAAE,qBAAqB,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAC3E,SAAS,CACT,CAAC;IACF,gCAAgC,CAAC,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IACzD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,oBAAoB,EAAE,CAAC;AACvD,CAAC;AAED,SAAS,eAAe,CACvB,EAAoB,EACpB,KAAwB,EACxB,OAAoB,EACpB,UAAkD;IAElD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QACjC,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,IAAI,KAAK,SAAS;YAAE,SAAS;QACjC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACtB,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;AACF,CAAC;AAED;;;+EAG+E;AAC/E,SAAS,cAAc,CAAC,KAAwB,EAAE,SAA4B;IAC7E,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,CAAU,CAAC,CAAC,CAAC;IAC7E,MAAM,IAAI,GAAG,MAAM;SACjB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;SAC1C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACtG,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACpE,OAAO,CAAC,GAAG,IAAI,EAAE,GAAG,GAAG,CAAC,CAAC;AAC1B,CAAC;AAED;0EAC0E;AAC1E,MAAM,UAAU,sBAAsB,CAAC,IAAY;IAClD,OAAO;QACN,IAAI;QACJ,KAAK,EAAE,IAAI;QACX,WAAW,EAAE,kDAAkD,IAAI,mCAAmC;QACtG,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,aAAa,EAAE,UAAU;QACzB,KAAK,CAAC,OAAO;YACZ,OAAO;gBACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,+DAA+D,EAAE,CAAC;gBACzG,OAAO,EAAE,SAAS;aAClB,CAAC;QACH,CAAC;QACD,UAAU,CAAC,KAAK,EAAE,KAAK;YACtB,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,EAAE,GAAG,IAAI,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1E,CAAC;KACD,CAAC;AACH,CAAC","sourcesContent":["// Tier-B adaptive exposure wiring (todo 32).\n//\n// Completes exposure:\"auto\": a server whose filtered tool count exceeds\n// searchThreshold enters SEARCH mode — the full catalog is registered but only\n// directTools stay active, and an always-active tool_search promotes the rest on\n// demand. Prompt-cache mitigations (SPEC §5): stable name sort everywhere;\n// activation turns accept a cache miss (documented); opt-in settings.stubSwap\n// registers 30-70-token stubs so the tools array stays length-stable and only\n// the activated entry's bytes change (stub -> full) on promotion.\n\nimport type { AgentToolResult } from \"@earendil-works/pi-agent-core\";\nimport { Text } from \"@earendil-works/pi-tui\";\nimport { Type } from \"typebox\";\nimport type { ExtensionAPI } from \"../../../types.ts\";\nimport { registerToolsPreservingActiveSet } from \"../active-set.ts\";\nimport type { McpToolCatalogEntry } from \"../catalog.ts\";\nimport type { McpSettings } from \"../config-schema.ts\";\nimport { createMcpProxyTool } from \"./proxy.ts\";\nimport {\n\tbuildMcpToolDefinitions,\n\ttype McpToolDefinition,\n\ttype McpToolDetails,\n\tmapMcpCatalogNames,\n} from \"./register.ts\";\nimport {\n\tcreateMcpSearchTool,\n\trehydrateActiveToolsFromHistory,\n\ttype SearchableMcpTool,\n\tTOOL_SEARCH_TOOL_NAME,\n\tunionStable,\n} from \"./tool-search.ts\";\n\ntype McpToolRegistrar = Pick<ExtensionAPI, \"getActiveTools\" | \"setActiveTools\" | \"registerTool\">;\ntype WarnFn = (message: string) => void;\n\nexport interface McpTierBRegistrationInput {\n\t/** Full catalog to register (all filtered tools across all servers). */\n\treadonly registeredEntries: readonly McpToolCatalogEntry[];\n\t/** Subset kept active immediately (direct-mode servers + directTools). */\n\treadonly activeEntries: readonly McpToolCatalogEntry[];\n\t/** True when at least one server resolved to search mode. */\n\treadonly searchMode: boolean;\n\t/** Tier-C proxy servers (todo 38): one always-active gateway tool each. */\n\treadonly proxyGateways?: readonly { server: string; entries: readonly McpToolCatalogEntry[] }[];\n\t/** Always-active utility tools (todo 39: mcp_list_resources/mcp_read_resource). */\n\treadonly utilityTools?: readonly McpToolDefinition[];\n\treadonly settings: McpSettings;\n}\n\nexport interface McpTierBRegistration {\n\t/** Searchable catalog (for reuse by /mcp status and list_changed). */\n\treadonly searchable: SearchableMcpTool[];\n\t/**\n\t * Replay activation markers found in session history through the SAME\n\t * activation path tool_search uses (stub swap + stable ordering), so a\n\t * resumed/compacted session restores its promoted tools without\n\t * re-searching. Returns the newly activated names (empty when nothing new).\n\t */\n\trehydrateFromHistory(messages: readonly unknown[]): string[];\n\t/** Activate registered tools by name through the same stable path\n\t * tool_search uses (skill lazy-reveal, todo 37). Unknown names ignored. */\n\tactivate(names: readonly string[]): void;\n}\n\nconst NOOP_REHYDRATE = (): string[] => [];\n\n/** Register MCP tools honouring Tier-B search mode + prompt-cache mitigations. */\nexport function registerMcpTierBTools(\n\tpi: McpToolRegistrar,\n\tinput: McpTierBRegistrationInput,\n\twarn?: WarnFn,\n): McpTierBRegistration {\n\tconst named = mapMcpCatalogNames(input.registeredEntries, warn);\n\tconst searchable: SearchableMcpTool[] = named.map(({ entry, name }) => ({\n\t\tname,\n\t\ttoolName: entry.tool,\n\t\tdescription: entry.description,\n\t\tserver: entry.server,\n\t}));\n\tconst fullDefs = buildMcpToolDefinitions(input.registeredEntries, warn);\n\tconst fullByName = new Map(fullDefs.map((def) => [def.name, def] as const));\n\tconst gatewayNames: string[] = [];\n\tfor (const gateway of input.proxyGateways ?? []) {\n\t\tconst tool = createMcpProxyTool(gateway.server, gateway.entries);\n\t\tpi.registerTool(tool);\n\t\tgatewayNames.push(tool.name);\n\t}\n\tfor (const tool of input.utilityTools ?? []) {\n\t\tpi.registerTool(tool);\n\t\tgatewayNames.push(tool.name);\n\t}\n\tconst activeMcpNames = [...mapMcpCatalogNames(input.activeEntries).map(({ name }) => name), ...gatewayNames];\n\tconst reference = pi.getActiveTools();\n\t// Base tools carry over; any stale mcp_* names from a prior generation are\n\t// dropped (membership = base + the intended mcp set; reference orders only).\n\tconst currentBase = reference.filter((name) => !name.startsWith(\"mcp_\"));\n\n\tif (!input.searchMode) {\n\t\tregisterToolsPreservingActiveSet(pi, fullDefs, orderActiveSet([...currentBase, ...activeMcpNames], reference));\n\t\t// Direct mode: everything registerable is already active, nothing to replay.\n\t\tconst activateDirect = (names: readonly string[]): void => {\n\t\t\tpi.setActiveTools(orderActiveSet(unionStable(pi.getActiveTools(), names), pi.getActiveTools()));\n\t\t};\n\t\treturn { activate: activateDirect, searchable, rehydrateFromHistory: NOOP_REHYDRATE };\n\t}\n\n\tconst stubSwap = input.settings.stubSwap === true;\n\tconst stubbed = new Set<string>();\n\tconst activateMcpTools = (names: readonly string[]): void => {\n\t\tif (stubSwap) swapStubsToFull(pi, names, stubbed, fullByName);\n\t\tpi.setActiveTools(orderActiveSet(names, pi.getActiveTools()));\n\t};\n\tconst searchTool = createMcpSearchTool({\n\t\tgetSearchableTools: () => searchable,\n\t\tgetActiveTools: () => pi.getActiveTools(),\n\t\tsetActiveTools: activateMcpTools,\n\t});\n\tconst registeredNames = new Set(fullDefs.map((def) => def.name));\n\tconst activate = (names: readonly string[]): void => {\n\t\tconst known = names.filter((name) => registeredNames.has(name));\n\t\tif (known.length === 0) return;\n\t\tactivateMcpTools(unionStable(pi.getActiveTools(), known));\n\t};\n\tconst rehydrateFromHistory = (messages: readonly unknown[]): string[] => {\n\t\tconst restored = rehydrateActiveToolsFromHistory(messages, registeredNames);\n\t\tconst current = pi.getActiveTools();\n\t\tconst fresh = restored.filter((name) => !current.includes(name));\n\t\tif (fresh.length === 0) return [];\n\t\tactivateMcpTools(unionStable(current, fresh));\n\t\treturn fresh;\n\t};\n\n\t// tool_search carries a distinct param schema, so register it on its own\n\t// rather than mixing it into the broadly-typed catalog def array.\n\tpi.registerTool(searchTool);\n\n\tif (!stubSwap) {\n\t\t// Default search mode: full defs registered, only directTools + tool_search\n\t\t// active. Newly promoted tools enter the array on their activation turn\n\t\t// (an accepted cache miss).\n\t\tconst active = orderActiveSet([...currentBase, TOOL_SEARCH_TOOL_NAME, ...activeMcpNames], reference);\n\t\tregisterToolsPreservingActiveSet(pi, fullDefs, active);\n\t\treturn { activate, searchable, rehydrateFromHistory };\n\t}\n\n\t// stubSwap: every search-mode tool is registered as a tiny stub and kept\n\t// active so the tools array is length-stable; direct tools stay full.\n\tconst directActive = new Set(activeMcpNames);\n\tconst toRegister: McpToolDefinition[] = fullDefs.map((def) => {\n\t\tif (directActive.has(def.name)) return def;\n\t\tstubbed.add(def.name);\n\t\treturn buildMcpStubDefinition(def.name);\n\t});\n\tconst active = orderActiveSet(\n\t\t[...currentBase, TOOL_SEARCH_TOOL_NAME, ...fullDefs.map((def) => def.name)],\n\t\treference,\n\t);\n\tregisterToolsPreservingActiveSet(pi, toRegister, active);\n\treturn { activate, searchable, rehydrateFromHistory };\n}\n\nfunction swapStubsToFull(\n\tpi: McpToolRegistrar,\n\tnames: readonly string[],\n\tstubbed: Set<string>,\n\tfullByName: ReadonlyMap<string, McpToolDefinition>,\n): void {\n\tfor (const name of names) {\n\t\tif (!stubbed.has(name)) continue;\n\t\tconst full = fullByName.get(name);\n\t\tif (full === undefined) continue;\n\t\tpi.registerTool(full);\n\t\tstubbed.delete(name);\n\t}\n}\n\n/** Order the active set deterministically WITHOUT disturbing non-MCP (base)\n * tools: base tools keep their existing relative order (by `reference` index,\n * new ones appended), MCP tools (incl. tool_search) are sorted for cache\n * stability. Sorting base tools would churn the system-prompt tool listing. */\nfunction orderActiveSet(names: readonly string[], reference: readonly string[]): string[] {\n\tconst unique = [...new Set(names)];\n\tconst rank = new Map(reference.map((name, index) => [name, index] as const));\n\tconst base = unique\n\t\t.filter((name) => !name.startsWith(\"mcp_\"))\n\t\t.sort((a, b) => (rank.get(a) ?? Number.MAX_SAFE_INTEGER) - (rank.get(b) ?? Number.MAX_SAFE_INTEGER));\n\tconst mcp = unique.filter((name) => name.startsWith(\"mcp_\")).sort();\n\treturn [...base, ...mcp];\n}\n\n/** A 30-70 token placeholder for an inactive search-mode tool. Keeps the tools\n * array length-stable under stubSwap; guides the model to tool_search. */\nexport function buildMcpStubDefinition(name: string): McpToolDefinition {\n\treturn {\n\t\tname,\n\t\tlabel: name,\n\t\tdescription: `Inactive MCP tool. Run tool_search to activate ${name}, then call it on your next turn.`,\n\t\tparameters: Type.Object({}),\n\t\texecutionMode: \"parallel\",\n\t\tasync execute(): Promise<AgentToolResult<McpToolDetails | undefined>> {\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: `${name} is not active. Use tool_search to activate it, then call it.` }],\n\t\t\t\tdetails: undefined,\n\t\t\t};\n\t\t},\n\t\trenderCall(_args, theme) {\n\t\t\treturn new Text(theme.fg(\"toolOutput\", `${name} (inactive stub)`), 0, 0);\n\t\t},\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tier-b.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/mcp/expose/tier-b.ts"],"names":[],"mappings":"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","sourcesContent":["// Tier-B adaptive exposure wiring (todo 32).\n//\n// Completes exposure:\"auto\": a server whose filtered tool count exceeds\n// searchThreshold enters SEARCH mode — the full catalog is registered but only\n// directTools stay active. The shared tool-search builtin owns tool_search and\n// MCP feeds its searchable documents and activation hook into that service.\n\nimport type { AgentToolResult } from \"@earendil-works/pi-agent-core\";\nimport { Text } from \"@earendil-works/pi-tui\";\nimport { Type } from \"typebox\";\nimport type { ExtensionAPI } from \"../../../types.ts\";\nimport type { ToolSearchDocument } from \"../../tool-search/engine/document.ts\";\nimport { deriveMcpRegistrationId } from \"../../tool-search/engine/marker.ts\";\nimport type { ToolSearchService } from \"../../tool-search/service.ts\";\nimport { registerToolsPreservingActiveSet } from \"../active-set.ts\";\nimport type { McpToolCatalogEntry } from \"../catalog.ts\";\nimport type { McpSettings } from \"../config-schema.ts\";\nimport { createMcpProxyTool } from \"./proxy.ts\";\nimport {\n\tbuildMcpToolDefinitions,\n\ttype McpToolDefinition,\n\ttype McpToolDetails,\n\tmapMcpCatalogNames,\n} from \"./register.ts\";\n\ntype McpToolRegistrar = Pick<ExtensionAPI, \"getActiveTools\" | \"setActiveTools\" | \"registerTool\">;\ntype WarnFn = (message: string) => void;\n\nexport interface McpTierBRegistrationInput {\n\t/** Full catalog to register (all filtered tools across all servers). */\n\treadonly registeredEntries: readonly McpToolCatalogEntry[];\n\t/** Subset kept active immediately (direct-mode servers + directTools). */\n\treadonly activeEntries: readonly McpToolCatalogEntry[];\n\t/** True when at least one server resolved to search mode. */\n\treadonly searchMode: boolean;\n\t/** Tier-C proxy servers (todo 38): one always-active gateway tool each. */\n\treadonly proxyGateways?: readonly { server: string; entries: readonly McpToolCatalogEntry[] }[];\n\t/** Always-active utility tools (todo 39: mcp_list_resources/mcp_read_resource). */\n\treadonly utilityTools?: readonly McpToolDefinition[];\n\treadonly settings: McpSettings;\n}\n\nexport interface SearchableMcpTool {\n\treadonly name: string;\n\treadonly toolName: string;\n\treadonly description?: string;\n\treadonly server: string;\n}\n\nexport interface McpTierBRegistration {\n\t/** Searchable catalog (for reuse by /mcp status and list_changed). */\n\treadonly searchable: SearchableMcpTool[];\n\t/** Activate registered tools through the shared feeder hook. */\n\tactivate(names: readonly string[]): void;\n}\n\nconst managedNamesByRegistrar = new WeakMap<object, ReadonlySet<string>>();\n\n/** Register MCP tools honouring Tier-B search mode + prompt-cache mitigations. */\nexport function registerMcpTierBTools(\n\tpi: McpToolRegistrar,\n\tinput: McpTierBRegistrationInput,\n\ttoolSearchService: ToolSearchService,\n\twarn?: WarnFn,\n): McpTierBRegistration {\n\tconst named = mapMcpCatalogNames(input.registeredEntries, warn);\n\tconst searchable: SearchableMcpTool[] = named.map(({ entry, name }) => ({\n\t\tname,\n\t\ttoolName: entry.tool,\n\t\tdescription: entry.description,\n\t\tserver: entry.server,\n\t}));\n\tconst documents: ToolSearchDocument[] = named.map(({ entry, name }) => ({\n\t\tname,\n\t\tlabel: entry.tool,\n\t\taliases: [entry.tool],\n\t\tdescription: entry.description,\n\t\tkeywords: [],\n\t\tsource: \"mcp\",\n\t\tgroup: entry.server,\n\t\townerLabel: entry.server,\n\t\tregistrationId: deriveMcpRegistrationId(entry.server, entry.tool),\n\t}));\n\tconst fullDefs = buildMcpToolDefinitions(input.registeredEntries, warn);\n\tconst fullByName = new Map(fullDefs.map((def) => [def.name, def] as const));\n\tconst gatewayNames: string[] = [];\n\tfor (const gateway of input.proxyGateways ?? []) {\n\t\tconst tool = createMcpProxyTool(gateway.server, gateway.entries);\n\t\tpi.registerTool(tool);\n\t\tgatewayNames.push(tool.name);\n\t}\n\tfor (const tool of input.utilityTools ?? []) {\n\t\tpi.registerTool(tool);\n\t\tgatewayNames.push(tool.name);\n\t}\n\n\tconst activeMcpNames = [...mapMcpCatalogNames(input.activeEntries).map(({ name }) => name), ...gatewayNames];\n\tconst managedNames = new Set([...fullDefs.map((def) => def.name), ...gatewayNames]);\n\tconst previousManagedNames = managedNamesByRegistrar.get(pi as object) ?? new Set<string>();\n\tmanagedNamesByRegistrar.set(pi as object, managedNames);\n\n\tconst stubSwap = input.searchMode && input.settings.stubSwap === true;\n\tconst stubbed = new Set<string>();\n\tconst registeredNames = new Set(fullDefs.map((def) => def.name));\n\tconst catalogNames = new Set(toolSearchService.getCatalog().map((doc) => doc.name));\n\n\tconst activate = (names: readonly string[]): void => {\n\t\tconst known = [...new Set(names.filter((name) => registeredNames.has(name)))];\n\t\tif (known.length === 0) return;\n\t\tif (stubSwap) swapStubsToFull(pi, known, stubbed, fullByName);\n\t\tconst current = pi.getActiveTools();\n\t\tpi.setActiveTools(orderActiveSet(unionStable(current, known), current, catalogNames));\n\t};\n\n\ttoolSearchService.feed(\"mcp\", input.searchMode ? documents : [], { activate });\n\tfor (const doc of toolSearchService.getCatalog()) catalogNames.add(doc.name);\n\n\tconst reference = pi.getActiveTools();\n\t// MCP owns only names from its previous/current registration generation.\n\t// Everything else is a base tool, regardless of naming convention.\n\tconst currentBase = reference.filter(\n\t\t(name) => !isLegacyMcpRegistrationName(name) && !previousManagedNames.has(name) && !managedNames.has(name),\n\t);\n\n\tif (!input.searchMode) {\n\t\tregisterToolsPreservingActiveSet(\n\t\t\tpi,\n\t\t\tfullDefs,\n\t\t\torderActiveSet([...currentBase, ...activeMcpNames], reference, catalogNames),\n\t\t);\n\t\treturn { activate, searchable };\n\t}\n\n\tif (!stubSwap) {\n\t\t// Default search mode: full defs registered, only directTools plus the\n\t\t// shared service-managed tool_search are active. Promotions append on the\n\t\t// activation turn (an accepted cache miss).\n\t\tconst active = orderActiveSet([...currentBase, ...activeMcpNames], reference, catalogNames);\n\t\tregisterToolsPreservingActiveSet(pi, fullDefs, active);\n\t\treturn { activate, searchable };\n\t}\n\n\t// stubSwap: every search-mode tool is registered as a tiny stub and kept\n\t// active so the tools array is length-stable; direct tools stay full.\n\tconst directActive = new Set(activeMcpNames);\n\tconst toRegister: McpToolDefinition[] = fullDefs.map((def) => {\n\t\tif (directActive.has(def.name)) return def;\n\t\tstubbed.add(def.name);\n\t\treturn buildMcpStubDefinition(def.name);\n\t});\n\tconst active = orderActiveSet([...currentBase, ...fullDefs.map((def) => def.name)], reference, catalogNames);\n\tregisterToolsPreservingActiveSet(pi, toRegister, active);\n\treturn { activate, searchable };\n}\n\nfunction swapStubsToFull(\n\tpi: McpToolRegistrar,\n\tnames: readonly string[],\n\tstubbed: Set<string>,\n\tfullByName: ReadonlyMap<string, McpToolDefinition>,\n): void {\n\tfor (const name of names) {\n\t\tif (!stubbed.has(name)) continue;\n\t\tconst full = fullByName.get(name);\n\t\tif (full === undefined) continue;\n\t\tpi.registerTool(full);\n\t\tstubbed.delete(name);\n\t}\n}\n\n/** Order the active set deterministically without disturbing base tools.\n * Base tools retain reference order; every shared-catalog member sorts by\n * canonical name so consecutive promotions remain byte-stable. */\nexport function orderActiveSet(\n\tnames: readonly string[],\n\treference: readonly string[],\n\tcatalogNames: ReadonlySet<string>,\n): string[] {\n\tconst unique = [...new Set(names)];\n\tconst rank = new Map(reference.map((name, index) => [name, index] as const));\n\tconst base = unique\n\t\t.filter((name) => !catalogNames.has(name))\n\t\t.sort((a, b) => (rank.get(a) ?? Number.MAX_SAFE_INTEGER) - (rank.get(b) ?? Number.MAX_SAFE_INTEGER));\n\tconst catalog = unique.filter((name) => catalogNames.has(name)).sort();\n\treturn [...base, ...catalog];\n}\n\nfunction unionStable(current: readonly string[], added: readonly string[]): string[] {\n\treturn [...new Set([...current, ...added])];\n}\n\n/** Preserve the existing stale-generation cleanup for active sets created\n * before MCP catalog ownership was tracked. Ordering itself is catalog-based. */\nfunction isLegacyMcpRegistrationName(name: string): boolean {\n\treturn name.startsWith(\"mcp_\");\n}\n\n/** A 30-70 token placeholder for an inactive search-mode tool. Keeps the tools\n * array length-stable under stubSwap; guides the model to tool_search. */\nexport function buildMcpStubDefinition(name: string): McpToolDefinition {\n\treturn {\n\t\tname,\n\t\tlabel: name,\n\t\tdescription: `Inactive MCP tool. Run tool_search to activate ${name}, then call it on your next turn.`,\n\t\tparameters: Type.Object({}),\n\t\texecutionMode: \"parallel\",\n\t\tasync execute(): Promise<AgentToolResult<McpToolDetails | undefined>> {\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: `${name} is not active. Use tool_search to activate it, then call it.` }],\n\t\t\t\tdetails: undefined,\n\t\t\t};\n\t\t},\n\t\trenderCall(_args, theme) {\n\t\t\treturn new Text(theme.fg(\"toolOutput\", `${name} (inactive stub)`), 0, 0);\n\t\t},\n\t};\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAoB,gBAAgB,EAAqB,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAoB,gBAAgB,EAAqB,MAAM,gBAAgB,CAAC;AAY1G,OAAO,EAAiB,UAAU,EAAE,MAAM,cAAc,CAAC;AAWzD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,UAAU,EAAE,YAAY,UAAO,GAAG,gBAAgB,CA0J7F;AAWD,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAG3E"}
|
|
@@ -1,19 +1,37 @@
|
|
|
1
1
|
import { bindToProviderScope } from "@earendil-works/pi-ai/node/provider-scope";
|
|
2
|
+
import { installMcpNativeToolSearchGate } from "../tool-search/native-search.js";
|
|
2
3
|
import { registerMcpCommands } from "./commands.js";
|
|
3
|
-
import {
|
|
4
|
-
import { AnthropicNativeToolSearchAdapter } from "./expose/native-search.js";
|
|
5
|
-
import { TOOL_SEARCH_TOOL_NAME } from "./expose/tool-search.js";
|
|
4
|
+
import { isMcpControlInventoryRequest, MCP_CONTROL_INVENTORY_CHANGED_EVENT, MCP_CONTROL_INVENTORY_REQUEST_EVENT, } from "./control-inventory.js";
|
|
6
5
|
import { injectMcpInstructions, refreshMcpInstructionsForSession } from "./instructions.js";
|
|
7
6
|
import { createMcpLogger } from "./log.js";
|
|
8
7
|
import { registerMcpPromptCommands } from "./prompts.js";
|
|
9
8
|
import { expandMcpResourceMentions } from "./resources.js";
|
|
10
9
|
import { getMcpService, McpService } from "./service.js";
|
|
11
10
|
import { parseSkillMcpDeclarations, skillActivationTargets, } from "./skills.js";
|
|
12
|
-
import { reportMcpAsyncError, wrapAsync } from "./wrap.js";
|
|
11
|
+
import { reportMcpAsyncError, safeEventBusOn, wrapAsync } from "./wrap.js";
|
|
13
12
|
const MCP_BUILTIN_EXTENSION_PATH = "<builtin:mcp>";
|
|
14
13
|
export function createMcpExtension(service, sessionOwned = true) {
|
|
15
14
|
return (pi) => {
|
|
16
15
|
let attachPromise;
|
|
16
|
+
let attachedSessionId;
|
|
17
|
+
let controlInventoryDisposed = false;
|
|
18
|
+
const unsubscribeControlInventoryRequest = safeEventBusOn(pi.events, MCP_CONTROL_INVENTORY_REQUEST_EVENT, (data) => {
|
|
19
|
+
if (!isMcpControlInventoryRequest(data) || data.sessionId !== attachedSessionId)
|
|
20
|
+
return;
|
|
21
|
+
data.respond(service.refreshWireStatusSnapshot(data.sessionId));
|
|
22
|
+
});
|
|
23
|
+
const unsubscribeWireStatus = service.onWireStatusChanged((sessionId, snapshot) => {
|
|
24
|
+
if (sessionId === undefined || sessionId !== attachedSessionId)
|
|
25
|
+
return;
|
|
26
|
+
pi.events.emit(MCP_CONTROL_INVENTORY_CHANGED_EVENT, { sessionId, snapshot });
|
|
27
|
+
});
|
|
28
|
+
const disposeControlInventory = () => {
|
|
29
|
+
if (controlInventoryDisposed)
|
|
30
|
+
return;
|
|
31
|
+
controlInventoryDisposed = true;
|
|
32
|
+
unsubscribeControlInventoryRequest();
|
|
33
|
+
unsubscribeWireStatus();
|
|
34
|
+
};
|
|
17
35
|
const sink = {
|
|
18
36
|
logger: {
|
|
19
37
|
error(message, data) {
|
|
@@ -22,39 +40,10 @@ export function createMcpExtension(service, sessionOwned = true) {
|
|
|
22
40
|
},
|
|
23
41
|
};
|
|
24
42
|
registerMcpCommands(pi, service);
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
// session and falls back to the always-registered local tool_search.
|
|
29
|
-
const nativeAdapter = new AnthropicNativeToolSearchAdapter({
|
|
30
|
-
enabled: () => {
|
|
31
|
-
const setting = service.getNativeToolSearchSetting();
|
|
32
|
-
return setting === true || setting === "auto";
|
|
33
|
-
},
|
|
34
|
-
isDeferrable: (name) => name.startsWith("mcp_") && name !== TOOL_SEARCH_TOOL_NAME,
|
|
35
|
-
onFallback: (reason) => createMcpLogger("service").warn(reason),
|
|
36
|
-
searchToolName: TOOL_SEARCH_TOOL_NAME,
|
|
37
|
-
});
|
|
38
|
-
pi.on("before_provider_request", (event, ctx) => nativeAdapter.applyBeforeRequest(ctx.model?.api, event.payload));
|
|
39
|
-
pi.on("after_provider_response", (event) => nativeAdapter.noteResponseStatus(event.status));
|
|
40
|
-
// Resumed/compacted sessions carry tool_search activation markers in their
|
|
41
|
-
// history but re-enter search mode with only directTools active. The context
|
|
42
|
-
// event (fired before each LLM call, with the full message history) replays
|
|
43
|
-
// the markers as a safety net; the primary replay happens at attach time so
|
|
44
|
-
// the FIRST turn's payload already carries previously promoted tools. Scans
|
|
45
|
-
// once per registration (see McpService.maybeRehydrateFromHistory).
|
|
46
|
-
pi.on("context", (event) => {
|
|
47
|
-
service.maybeRehydrateFromHistory(event.messages);
|
|
43
|
+
installMcpNativeToolSearchGate(() => {
|
|
44
|
+
const setting = service.getNativeToolSearchSetting();
|
|
45
|
+
return setting === true || setting === "auto";
|
|
48
46
|
});
|
|
49
|
-
// A code-mode (eval) cell may name a search-mode tool that tool_search would
|
|
50
|
-
// promote but that is not active yet. Activating it here keeps the catalog the
|
|
51
|
-
// only eligible set, so permission-denied, tombstoned, and capability-gated
|
|
52
|
-
// tools stay inactive, and routes through tier-B activate() for stub swapping.
|
|
53
|
-
pi.registerLazyToolActivator(createLazyToolActivator({
|
|
54
|
-
getSearchable: () => service.getTierBSearchable(),
|
|
55
|
-
getActiveTools: () => pi.getActiveTools(),
|
|
56
|
-
activate: (names) => service.activateSkillMcpTools(names),
|
|
57
|
-
}));
|
|
58
47
|
// skills-carry-MCP (todo 37): skills declaring MCP servers (mcp.json
|
|
59
48
|
// sidecar or SKILL.md frontmatter) register lazily with tools hidden;
|
|
60
49
|
// loading a skill — /skill:<name> input or the model reading its SKILL.md —
|
|
@@ -113,6 +102,7 @@ export function createMcpExtension(service, sessionOwned = true) {
|
|
|
113
102
|
// the first turn's payload deterministically carries the MCP tool set.
|
|
114
103
|
// session_start always starts a fresh attach (reloads must re-sync config).
|
|
115
104
|
const attach = (event, ctx) => {
|
|
105
|
+
attachedSessionId = ctx.sessionManager?.getSessionId?.();
|
|
116
106
|
attachPromise = (async () => {
|
|
117
107
|
await service.attachSession(event, ctx, pi);
|
|
118
108
|
refreshMcpInstructionsForSession(service);
|
|
@@ -154,10 +144,12 @@ export function createMcpExtension(service, sessionOwned = true) {
|
|
|
154
144
|
pi.on("session_shutdown", wrapAsync("mcp.session_shutdown", async (event) => {
|
|
155
145
|
if (event.reason === "reload" && !sessionOwned)
|
|
156
146
|
return;
|
|
147
|
+
disposeControlInventory();
|
|
157
148
|
await service.handleSessionShutdown(event);
|
|
158
149
|
}, sink));
|
|
159
150
|
pi.on("session_extensions_removed", wrapAsync("mcp.session_extensions_removed", async (event) => {
|
|
160
151
|
if (event.removed.some((extension) => extension.path === MCP_BUILTIN_EXTENSION_PATH)) {
|
|
152
|
+
disposeControlInventory();
|
|
161
153
|
await service.dispose("reload");
|
|
162
154
|
}
|
|
163
155
|
}, sink));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { bindToProviderScope } from \"@earendil-works/pi-ai/node/provider-scope\";\nimport type { ExtensionAPI, ExtensionContext, ExtensionFactory, SessionStartEvent } from \"../../types.ts\";\nimport { registerMcpCommands } from \"./commands.ts\";\nimport { createLazyToolActivator } from \"./expose/lazy-activate.ts\";\nimport { AnthropicNativeToolSearchAdapter } from \"./expose/native-search.ts\";\nimport { TOOL_SEARCH_TOOL_NAME } from \"./expose/tool-search.ts\";\nimport { injectMcpInstructions, refreshMcpInstructionsForSession } from \"./instructions.ts\";\nimport { createMcpLogger } from \"./log.ts\";\nimport { registerMcpPromptCommands } from \"./prompts.ts\";\nimport { expandMcpResourceMentions } from \"./resources.ts\";\nimport { getMcpService, McpService } from \"./service.ts\";\nimport {\n\tparseSkillMcpDeclarations,\n\ttype SkillLike,\n\ttype SkillMcpDeclarations,\n\tskillActivationTargets,\n} from \"./skills.ts\";\nimport { reportMcpAsyncError, wrapAsync } from \"./wrap.ts\";\n\nconst MCP_BUILTIN_EXTENSION_PATH = \"<builtin:mcp>\";\n\nexport function createMcpExtension(service: McpService, sessionOwned = true): ExtensionFactory {\n\treturn (pi: ExtensionAPI): void => {\n\t\tlet attachPromise: Promise<void> | undefined;\n\t\tconst sink = {\n\t\t\tlogger: {\n\t\t\t\terror(message: string, data?: unknown): void {\n\t\t\t\t\tcreateMcpLogger(\"service\").error(message, data);\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\n\t\tregisterMcpCommands(pi, service);\n\n\t\t// Native provider tool-search adapter (todo 33 — Anthropic, spike = GO).\n\t\t// Runs on every request but is a no-op unless settings.nativeToolSearch is\n\t\t// auto|true and the model is anthropic-messages; a 400 disables it for the\n\t\t// session and falls back to the always-registered local tool_search.\n\t\tconst nativeAdapter = new AnthropicNativeToolSearchAdapter({\n\t\t\tenabled: () => {\n\t\t\t\tconst setting = service.getNativeToolSearchSetting();\n\t\t\t\treturn setting === true || setting === \"auto\";\n\t\t\t},\n\t\t\tisDeferrable: (name) => name.startsWith(\"mcp_\") && name !== TOOL_SEARCH_TOOL_NAME,\n\t\t\tonFallback: (reason) => createMcpLogger(\"service\").warn(reason),\n\t\t\tsearchToolName: TOOL_SEARCH_TOOL_NAME,\n\t\t});\n\t\tpi.on(\"before_provider_request\", (event, ctx) => nativeAdapter.applyBeforeRequest(ctx.model?.api, event.payload));\n\t\tpi.on(\"after_provider_response\", (event) => nativeAdapter.noteResponseStatus(event.status));\n\t\t// Resumed/compacted sessions carry tool_search activation markers in their\n\t\t// history but re-enter search mode with only directTools active. The context\n\t\t// event (fired before each LLM call, with the full message history) replays\n\t\t// the markers as a safety net; the primary replay happens at attach time so\n\t\t// the FIRST turn's payload already carries previously promoted tools. Scans\n\t\t// once per registration (see McpService.maybeRehydrateFromHistory).\n\t\tpi.on(\"context\", (event) => {\n\t\t\tservice.maybeRehydrateFromHistory(event.messages);\n\t\t});\n\n\t\t// A code-mode (eval) cell may name a search-mode tool that tool_search would\n\t\t// promote but that is not active yet. Activating it here keeps the catalog the\n\t\t// only eligible set, so permission-denied, tombstoned, and capability-gated\n\t\t// tools stay inactive, and routes through tier-B activate() for stub swapping.\n\t\tpi.registerLazyToolActivator(\n\t\t\tcreateLazyToolActivator({\n\t\t\t\tgetSearchable: () => service.getTierBSearchable(),\n\t\t\t\tgetActiveTools: () => pi.getActiveTools(),\n\t\t\t\tactivate: (names) => service.activateSkillMcpTools(names),\n\t\t\t}),\n\t\t);\n\n\t\t// skills-carry-MCP (todo 37): skills declaring MCP servers (mcp.json\n\t\t// sidecar or SKILL.md frontmatter) register lazily with tools hidden;\n\t\t// loading a skill — /skill:<name> input or the model reading its SKILL.md —\n\t\t// reveals that skill's includeTools matches for the rest of the session.\n\t\tlet skillDecls: SkillMcpDeclarations = { servers: new Map(), warnings: [] };\n\t\tlet skillsByName = new Map<string, SkillLike>();\n\t\tconst loadedSkills = new Set<string>();\n\t\tconst revealSkill = (skillName: string): void => {\n\t\t\tif (loadedSkills.has(skillName) || !skillsByName.has(skillName)) return;\n\t\t\tloadedSkills.add(skillName);\n\t\t\tconst registered = service.getTierBSearchable();\n\t\t\tconst targets = skillActivationTargets(skillDecls, skillName, registered);\n\t\t\tif (targets.length > 0) service.activateSkillMcpTools(targets);\n\t\t};\n\t\tpi.on(\"input\", async (event, ctx) => {\n\t\t\tconst match = /^\\s*\\/skill:([A-Za-z0-9._-]+)/.exec(event.text);\n\t\t\tif (match) revealSkill(match[1]);\n\t\t\t// @mcp:<server>/<uri> mention expansion (todo 39): recognized mentions are\n\t\t\t// inlined via the sanctioned input transform; failures pass through\n\t\t\t// untouched with a one-line notice so submission is never blocked.\n\t\t\tif (event.text.includes(\"@mcp:\")) {\n\t\t\t\tconst expansion = await expandMcpResourceMentions(event.text, () => service.getMcpResourceServers());\n\t\t\t\tfor (const notice of expansion.notices) {\n\t\t\t\t\tcreateMcpLogger(\"resources\").warn(notice);\n\t\t\t\t\tvoid ctx.ui?.notify?.(notice, \"warning\");\n\t\t\t\t}\n\t\t\t\tif (expansion.changed) return { action: \"transform\", text: expansion.text };\n\t\t\t}\n\t\t\treturn undefined;\n\t\t});\n\t\tpi.on(\"tool_call\", (event) => {\n\t\t\tif (event.toolName !== \"read\") return undefined;\n\t\t\tconst path = (event.input as { path?: string }).path;\n\t\t\tif (path === undefined) return undefined;\n\t\t\tfor (const [name, skill] of skillsByName) {\n\t\t\t\tif (path === skill.filePath || path.endsWith(skill.filePath)) revealSkill(name);\n\t\t\t}\n\t\t\treturn undefined;\n\t\t});\n\n\t\t// Attach is SINGLE-FLIGHT. session_start handlers are dispatched\n\t\t// fire-and-forget, so a slow attach (a cold MCP server's boot + catalog\n\t\t// collection is awaited inside attachSession) can still be in flight when\n\t\t// before_agent_start fires. The old `attached` boolean was only set on\n\t\t// completion, so before_agent_start would start a SECOND concurrent attach —\n\t\t// which found the connection entries already created (still \"connecting\"),\n\t\t// collected an empty catalog, and registered no MCP tools for turn 1; the\n\t\t// first attach then landed the real registration turns later. Memoizing the\n\t\t// in-flight promise makes before_agent_start await the ORIGINAL attach, so\n\t\t// the first turn's payload deterministically carries the MCP tool set.\n\t\t// session_start always starts a fresh attach (reloads must re-sync config).\n\t\tconst attach = (event: SessionStartEvent, ctx: ExtensionContext): Promise<void> => {\n\t\t\tattachPromise = (async () => {\n\t\t\t\tawait service.attachSession(event, ctx, pi);\n\t\t\t\trefreshMcpInstructionsForSession(service);\n\t\t\t\tif (sessionOwned) registerMcpPromptCommands(service, pi, service.getMcpPromptServers());\n\t\t\t\telse registerMcpPromptCommands(pi, service.getMcpPromptServers());\n\t\t\t})();\n\t\t\treturn attachPromise;\n\t\t};\n\t\tpi.on(\n\t\t\t\"session_start\",\n\t\t\twrapAsync(\"mcp.session_start\", (event, ctx) => attach(event, ctx), sink),\n\t\t);\n\t\tpi.on(\"before_agent_start\", async (event, ctx) => {\n\t\t\ttry {\n\t\t\t\t// Elicitation (todo 41): point mid-call forms at this session's UI.\n\t\t\t\tservice.setMcpElicitationUiProvider(() => ctx.ui);\n\t\t\t\tawait (attachPromise ?? attach({ type: \"session_start\", reason: \"startup\" }, ctx));\n\t\t\t\tconst skills = (event.systemPromptOptions.skills ?? []) as readonly SkillLike[];\n\t\t\t\tif (skills.length > 0) {\n\t\t\t\t\tskillsByName = new Map(skills.map((skill) => [skill.name, skill]));\n\t\t\t\t\tskillDecls = parseSkillMcpDeclarations(skills);\n\t\t\t\t\tconst declared = new Map(\n\t\t\t\t\t\t[...skillDecls.servers].map(([name, decl]) => [name, { raw: decl.raw, sourcePath: decl.sourcePath }]),\n\t\t\t\t\t);\n\t\t\t\t\tconst warnings = [\n\t\t\t\t\t\t...skillDecls.warnings,\n\t\t\t\t\t\t...(declared.size > 0 ? await service.attachSkillMcpServers(declared) : []),\n\t\t\t\t\t];\n\t\t\t\t\tfor (const warning of warnings) createMcpLogger(\"skills\").warn(warning);\n\t\t\t\t}\n\t\t\t\tconst systemPrompt = injectMcpInstructions(service, event.systemPrompt);\n\t\t\t\treturn systemPrompt === undefined ? undefined : { systemPrompt };\n\t\t\t} catch (error) {\n\t\t\t\tif (!(error instanceof Error)) throw error;\n\t\t\t\tawait reportMcpAsyncError(\"mcp.before_agent_start\", error, sink);\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t});\n\t\tpi.on(\n\t\t\t\"session_shutdown\",\n\t\t\twrapAsync(\n\t\t\t\t\"mcp.session_shutdown\",\n\t\t\t\tasync (event) => {\n\t\t\t\t\tif (event.reason === \"reload\" && !sessionOwned) return;\n\t\t\t\t\tawait service.handleSessionShutdown(event);\n\t\t\t\t},\n\t\t\t\tsink,\n\t\t\t),\n\t\t);\n\t\tpi.on(\n\t\t\t\"session_extensions_removed\",\n\t\t\twrapAsync(\n\t\t\t\t\"mcp.session_extensions_removed\",\n\t\t\t\tasync (event) => {\n\t\t\t\t\tif (event.removed.some((extension) => extension.path === MCP_BUILTIN_EXTENSION_PATH)) {\n\t\t\t\t\t\tawait service.dispose(\"reload\");\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tsink,\n\t\t\t),\n\t\t);\n\t};\n}\n\nfunction hasProviderScope(): boolean {\n\ttry {\n\t\tbindToProviderScope(() => undefined);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport default function mcpExtension(pi: ExtensionAPI): void | Promise<void> {\n\tconst sessionOwned = hasProviderScope();\n\treturn createMcpExtension(sessionOwned ? new McpService() : getMcpService(), sessionOwned)(pi);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { bindToProviderScope } from \"@earendil-works/pi-ai/node/provider-scope\";\nimport type { ExtensionAPI, ExtensionContext, ExtensionFactory, SessionStartEvent } from \"../../types.ts\";\nimport { installMcpNativeToolSearchGate } from \"../tool-search/native-search.ts\";\nimport { registerMcpCommands } from \"./commands.ts\";\nimport {\n\tisMcpControlInventoryRequest,\n\tMCP_CONTROL_INVENTORY_CHANGED_EVENT,\n\tMCP_CONTROL_INVENTORY_REQUEST_EVENT,\n} from \"./control-inventory.ts\";\nimport { injectMcpInstructions, refreshMcpInstructionsForSession } from \"./instructions.ts\";\nimport { createMcpLogger } from \"./log.ts\";\nimport { registerMcpPromptCommands } from \"./prompts.ts\";\nimport { expandMcpResourceMentions } from \"./resources.ts\";\nimport { getMcpService, McpService } from \"./service.ts\";\nimport {\n\tparseSkillMcpDeclarations,\n\ttype SkillLike,\n\ttype SkillMcpDeclarations,\n\tskillActivationTargets,\n} from \"./skills.ts\";\nimport { reportMcpAsyncError, safeEventBusOn, wrapAsync } from \"./wrap.ts\";\n\nconst MCP_BUILTIN_EXTENSION_PATH = \"<builtin:mcp>\";\n\nexport function createMcpExtension(service: McpService, sessionOwned = true): ExtensionFactory {\n\treturn (pi: ExtensionAPI): void => {\n\t\tlet attachPromise: Promise<void> | undefined;\n\t\tlet attachedSessionId: string | undefined;\n\t\tlet controlInventoryDisposed = false;\n\t\tconst unsubscribeControlInventoryRequest = safeEventBusOn(\n\t\t\tpi.events,\n\t\t\tMCP_CONTROL_INVENTORY_REQUEST_EVENT,\n\t\t\t(data) => {\n\t\t\t\tif (!isMcpControlInventoryRequest(data) || data.sessionId !== attachedSessionId) return;\n\t\t\t\tdata.respond(service.refreshWireStatusSnapshot(data.sessionId));\n\t\t\t},\n\t\t);\n\t\tconst unsubscribeWireStatus = service.onWireStatusChanged((sessionId, snapshot) => {\n\t\t\tif (sessionId === undefined || sessionId !== attachedSessionId) return;\n\t\t\tpi.events.emit(MCP_CONTROL_INVENTORY_CHANGED_EVENT, { sessionId, snapshot });\n\t\t});\n\t\tconst disposeControlInventory = (): void => {\n\t\t\tif (controlInventoryDisposed) return;\n\t\t\tcontrolInventoryDisposed = true;\n\t\t\tunsubscribeControlInventoryRequest();\n\t\t\tunsubscribeWireStatus();\n\t\t};\n\t\tconst sink = {\n\t\t\tlogger: {\n\t\t\t\terror(message: string, data?: unknown): void {\n\t\t\t\t\tcreateMcpLogger(\"service\").error(message, data);\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\n\t\tregisterMcpCommands(pi, service);\n\n\t\tinstallMcpNativeToolSearchGate(() => {\n\t\t\tconst setting = service.getNativeToolSearchSetting();\n\t\t\treturn setting === true || setting === \"auto\";\n\t\t});\n\t\t// skills-carry-MCP (todo 37): skills declaring MCP servers (mcp.json\n\t\t// sidecar or SKILL.md frontmatter) register lazily with tools hidden;\n\t\t// loading a skill — /skill:<name> input or the model reading its SKILL.md —\n\t\t// reveals that skill's includeTools matches for the rest of the session.\n\t\tlet skillDecls: SkillMcpDeclarations = { servers: new Map(), warnings: [] };\n\t\tlet skillsByName = new Map<string, SkillLike>();\n\t\tconst loadedSkills = new Set<string>();\n\t\tconst revealSkill = (skillName: string): void => {\n\t\t\tif (loadedSkills.has(skillName) || !skillsByName.has(skillName)) return;\n\t\t\tloadedSkills.add(skillName);\n\t\t\tconst registered = service.getTierBSearchable();\n\t\t\tconst targets = skillActivationTargets(skillDecls, skillName, registered);\n\t\t\tif (targets.length > 0) service.activateSkillMcpTools(targets);\n\t\t};\n\t\tpi.on(\"input\", async (event, ctx) => {\n\t\t\tconst match = /^\\s*\\/skill:([A-Za-z0-9._-]+)/.exec(event.text);\n\t\t\tif (match) revealSkill(match[1]);\n\t\t\t// @mcp:<server>/<uri> mention expansion (todo 39): recognized mentions are\n\t\t\t// inlined via the sanctioned input transform; failures pass through\n\t\t\t// untouched with a one-line notice so submission is never blocked.\n\t\t\tif (event.text.includes(\"@mcp:\")) {\n\t\t\t\tconst expansion = await expandMcpResourceMentions(event.text, () => service.getMcpResourceServers());\n\t\t\t\tfor (const notice of expansion.notices) {\n\t\t\t\t\tcreateMcpLogger(\"resources\").warn(notice);\n\t\t\t\t\tvoid ctx.ui?.notify?.(notice, \"warning\");\n\t\t\t\t}\n\t\t\t\tif (expansion.changed) return { action: \"transform\", text: expansion.text };\n\t\t\t}\n\t\t\treturn undefined;\n\t\t});\n\t\tpi.on(\"tool_call\", (event) => {\n\t\t\tif (event.toolName !== \"read\") return undefined;\n\t\t\tconst path = (event.input as { path?: string }).path;\n\t\t\tif (path === undefined) return undefined;\n\t\t\tfor (const [name, skill] of skillsByName) {\n\t\t\t\tif (path === skill.filePath || path.endsWith(skill.filePath)) revealSkill(name);\n\t\t\t}\n\t\t\treturn undefined;\n\t\t});\n\n\t\t// Attach is SINGLE-FLIGHT. session_start handlers are dispatched\n\t\t// fire-and-forget, so a slow attach (a cold MCP server's boot + catalog\n\t\t// collection is awaited inside attachSession) can still be in flight when\n\t\t// before_agent_start fires. The old `attached` boolean was only set on\n\t\t// completion, so before_agent_start would start a SECOND concurrent attach —\n\t\t// which found the connection entries already created (still \"connecting\"),\n\t\t// collected an empty catalog, and registered no MCP tools for turn 1; the\n\t\t// first attach then landed the real registration turns later. Memoizing the\n\t\t// in-flight promise makes before_agent_start await the ORIGINAL attach, so\n\t\t// the first turn's payload deterministically carries the MCP tool set.\n\t\t// session_start always starts a fresh attach (reloads must re-sync config).\n\t\tconst attach = (event: SessionStartEvent, ctx: ExtensionContext): Promise<void> => {\n\t\t\tattachedSessionId = ctx.sessionManager?.getSessionId?.();\n\t\t\tattachPromise = (async () => {\n\t\t\t\tawait service.attachSession(event, ctx, pi);\n\t\t\t\trefreshMcpInstructionsForSession(service);\n\t\t\t\tif (sessionOwned) registerMcpPromptCommands(service, pi, service.getMcpPromptServers());\n\t\t\t\telse registerMcpPromptCommands(pi, service.getMcpPromptServers());\n\t\t\t})();\n\t\t\treturn attachPromise;\n\t\t};\n\t\tpi.on(\n\t\t\t\"session_start\",\n\t\t\twrapAsync(\"mcp.session_start\", (event, ctx) => attach(event, ctx), sink),\n\t\t);\n\t\tpi.on(\"before_agent_start\", async (event, ctx) => {\n\t\t\ttry {\n\t\t\t\t// Elicitation (todo 41): point mid-call forms at this session's UI.\n\t\t\t\tservice.setMcpElicitationUiProvider(() => ctx.ui);\n\t\t\t\tawait (attachPromise ?? attach({ type: \"session_start\", reason: \"startup\" }, ctx));\n\t\t\t\tconst skills = (event.systemPromptOptions.skills ?? []) as readonly SkillLike[];\n\t\t\t\tif (skills.length > 0) {\n\t\t\t\t\tskillsByName = new Map(skills.map((skill) => [skill.name, skill]));\n\t\t\t\t\tskillDecls = parseSkillMcpDeclarations(skills);\n\t\t\t\t\tconst declared = new Map(\n\t\t\t\t\t\t[...skillDecls.servers].map(([name, decl]) => [name, { raw: decl.raw, sourcePath: decl.sourcePath }]),\n\t\t\t\t\t);\n\t\t\t\t\tconst warnings = [\n\t\t\t\t\t\t...skillDecls.warnings,\n\t\t\t\t\t\t...(declared.size > 0 ? await service.attachSkillMcpServers(declared) : []),\n\t\t\t\t\t];\n\t\t\t\t\tfor (const warning of warnings) createMcpLogger(\"skills\").warn(warning);\n\t\t\t\t}\n\t\t\t\tconst systemPrompt = injectMcpInstructions(service, event.systemPrompt);\n\t\t\t\treturn systemPrompt === undefined ? undefined : { systemPrompt };\n\t\t\t} catch (error) {\n\t\t\t\tif (!(error instanceof Error)) throw error;\n\t\t\t\tawait reportMcpAsyncError(\"mcp.before_agent_start\", error, sink);\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t});\n\t\tpi.on(\n\t\t\t\"session_shutdown\",\n\t\t\twrapAsync(\n\t\t\t\t\"mcp.session_shutdown\",\n\t\t\t\tasync (event) => {\n\t\t\t\t\tif (event.reason === \"reload\" && !sessionOwned) return;\n\t\t\t\t\tdisposeControlInventory();\n\t\t\t\t\tawait service.handleSessionShutdown(event);\n\t\t\t\t},\n\t\t\t\tsink,\n\t\t\t),\n\t\t);\n\t\tpi.on(\n\t\t\t\"session_extensions_removed\",\n\t\t\twrapAsync(\n\t\t\t\t\"mcp.session_extensions_removed\",\n\t\t\t\tasync (event) => {\n\t\t\t\t\tif (event.removed.some((extension) => extension.path === MCP_BUILTIN_EXTENSION_PATH)) {\n\t\t\t\t\t\tdisposeControlInventory();\n\t\t\t\t\t\tawait service.dispose(\"reload\");\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tsink,\n\t\t\t),\n\t\t);\n\t};\n}\n\nfunction hasProviderScope(): boolean {\n\ttry {\n\t\tbindToProviderScope(() => undefined);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport default function mcpExtension(pi: ExtensionAPI): void | Promise<void> {\n\tconst sessionOwned = hasProviderScope();\n\treturn createMcpExtension(sessionOwned ? new McpService() : getMcpService(), sessionOwned)(pi);\n}\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ExtensionAPI } from "../../types.ts";
|
|
2
|
+
import type { ToolSearchService } from "../tool-search/service.ts";
|
|
2
3
|
import type { ResolvedMcpConfig } from "./config-schema.ts";
|
|
3
4
|
import type { McpSessionRegistration } from "./expose/session.ts";
|
|
4
5
|
import type { McpConnectionEntry } from "./service-types.ts";
|
|
@@ -6,6 +7,6 @@ type McpToolRegistrar = Pick<ExtensionAPI, "getActiveTools" | "setActiveTools" |
|
|
|
6
7
|
export interface McpServiceDirectToolRegistrationOptions {
|
|
7
8
|
readonly refreshActiveSetWhenEmpty?: boolean;
|
|
8
9
|
}
|
|
9
|
-
export declare function registerMcpServiceDirectTools(pi: McpToolRegistrar, config: ResolvedMcpConfig, entries: Iterable<McpConnectionEntry>, options?: McpServiceDirectToolRegistrationOptions): Promise<McpSessionRegistration | undefined>;
|
|
10
|
+
export declare function registerMcpServiceDirectTools(pi: McpToolRegistrar, config: ResolvedMcpConfig, entries: Iterable<McpConnectionEntry>, toolSearchService: ToolSearchService, options?: McpServiceDirectToolRegistrationOptions): Promise<McpSessionRegistration | undefined>;
|
|
10
11
|
export {};
|
|
11
12
|
//# sourceMappingURL=service-register.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-register.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/service-register.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAElE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAG7D,KAAK,gBAAgB,GAAG,IAAI,CAAC,YAAY,EAAE,gBAAgB,GAAG,gBAAgB,GAAG,cAAc,CAAC,CAAC;AAEjG,MAAM,WAAW,uCAAuC;IACvD,QAAQ,CAAC,yBAAyB,CAAC,EAAE,OAAO,CAAC;CAC7C;AAED,wBAAsB,6BAA6B,CAClD,EAAE,EAAE,gBAAgB,EACpB,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EACrC,OAAO,GAAE,uCAA4C,GACnD,OAAO,CAAC,sBAAsB,GAAG,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"service-register.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/service-register.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAElE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAG7D,KAAK,gBAAgB,GAAG,IAAI,CAAC,YAAY,EAAE,gBAAgB,GAAG,gBAAgB,GAAG,cAAc,CAAC,CAAC;AAEjG,MAAM,WAAW,uCAAuC;IACvD,QAAQ,CAAC,yBAAyB,CAAC,EAAE,OAAO,CAAC;CAC7C;AAED,wBAAsB,6BAA6B,CAClD,EAAE,EAAE,gBAAgB,EACpB,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EACrC,iBAAiB,EAAE,iBAAiB,EACpC,OAAO,GAAE,uCAA4C,GACnD,OAAO,CAAC,sBAAsB,GAAG,SAAS,CAAC,CAoB7C"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { registerDirectMcpTools } from "./expose/session.js";
|
|
2
2
|
import { connectAndRefreshMcpCatalog } from "./startup-race.js";
|
|
3
|
-
export async function registerMcpServiceDirectTools(pi, config, entries, options = {}) {
|
|
3
|
+
export async function registerMcpServiceDirectTools(pi, config, entries, toolSearchService, options = {}) {
|
|
4
4
|
return await registerDirectMcpTools(pi, config, [...entries].map((entry) => {
|
|
5
5
|
const serverConfig = config.servers[entry.name]?.config;
|
|
6
6
|
return {
|
|
@@ -13,6 +13,6 @@ export async function registerMcpServiceDirectTools(pi, config, entries, options
|
|
|
13
13
|
logger: entry.logger,
|
|
14
14
|
name: entry.name,
|
|
15
15
|
};
|
|
16
|
-
}), options);
|
|
16
|
+
}), toolSearchService, options);
|
|
17
17
|
}
|
|
18
18
|
//# sourceMappingURL=service-register.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-register.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/service-register.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"service-register.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/service-register.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAQhE,MAAM,CAAC,KAAK,UAAU,6BAA6B,CAClD,EAAoB,EACpB,MAAyB,EACzB,OAAqC,EACrC,iBAAoC,EACpC,OAAO,GAA4C,EAAE;IAErD,OAAO,MAAM,sBAAsB,CAClC,EAAE,EACF,MAAM,EACN,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC1B,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QACxD,OAAO;YACN,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,WAAW,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE;YACpG,yBAAyB,EAAE,GAAG,EAAE,CAAC,2BAA2B,CAAC,KAAK,EAAE,YAAY,CAAC;YACjF,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,IAAI,EAAE,KAAK,CAAC,IAAI;SAChB,CAAC;IACH,CAAC,CAAC,EACF,iBAAiB,EACjB,OAAO,CACP,CAAC;AACH,CAAC","sourcesContent":["import type { ExtensionAPI } from \"../../types.ts\";\nimport type { ToolSearchService } from \"../tool-search/service.ts\";\nimport type { ResolvedMcpConfig } from \"./config-schema.ts\";\nimport type { McpSessionRegistration } from \"./expose/session.ts\";\nimport { registerDirectMcpTools } from \"./expose/session.ts\";\nimport type { McpConnectionEntry } from \"./service-types.ts\";\nimport { connectAndRefreshMcpCatalog } from \"./startup-race.ts\";\n\ntype McpToolRegistrar = Pick<ExtensionAPI, \"getActiveTools\" | \"setActiveTools\" | \"registerTool\">;\n\nexport interface McpServiceDirectToolRegistrationOptions {\n\treadonly refreshActiveSetWhenEmpty?: boolean;\n}\n\nexport async function registerMcpServiceDirectTools(\n\tpi: McpToolRegistrar,\n\tconfig: ResolvedMcpConfig,\n\tentries: Iterable<McpConnectionEntry>,\n\ttoolSearchService: ToolSearchService,\n\toptions: McpServiceDirectToolRegistrationOptions = {},\n): Promise<McpSessionRegistration | undefined> {\n\treturn await registerDirectMcpTools(\n\t\tpi,\n\t\tconfig,\n\t\t[...entries].map((entry) => {\n\t\t\tconst serverConfig = config.servers[entry.name]?.config;\n\t\t\treturn {\n\t\t\t\tagentDir: entry.agentDir,\n\t\t\t\tartifacts: entry.artifacts,\n\t\t\t\tcachedCatalog: entry.cachedCatalog,\n\t\t\t\tconnection: entry.connection,\n\t\t\t\tensureFresh: () => entry.authPlan?.refresh?.ensureFresh().then(() => undefined) ?? Promise.resolve(),\n\t\t\t\tensureCachedToolConnected: () => connectAndRefreshMcpCatalog(entry, serverConfig),\n\t\t\t\tlogger: entry.logger,\n\t\t\t\tname: entry.name,\n\t\t\t};\n\t\t}),\n\t\ttoolSearchService,\n\t\toptions,\n\t);\n}\n"]}
|
|
@@ -10,6 +10,7 @@ export type McpWireJsonValue = null | boolean | number | string | readonly McpWi
|
|
|
10
10
|
readonly [key: string]: McpWireJsonValue | undefined;
|
|
11
11
|
};
|
|
12
12
|
export type McpWireAuthStatus = "unsupported" | "notLoggedIn" | "bearerToken" | "oAuth";
|
|
13
|
+
export type McpWireServerStatus = ServerConnectionState | ResolvedMcpServer["state"];
|
|
13
14
|
export type McpWireServerInfo = {
|
|
14
15
|
readonly name: string;
|
|
15
16
|
readonly title: string | null;
|
|
@@ -56,6 +57,7 @@ export type McpWireStatusServer = {
|
|
|
56
57
|
readonly resources: readonly McpWireResource[];
|
|
57
58
|
readonly resourceTemplates: readonly McpWireResourceTemplate[];
|
|
58
59
|
readonly authStatus: McpWireAuthStatus;
|
|
60
|
+
readonly status?: McpWireServerStatus;
|
|
59
61
|
};
|
|
60
62
|
export type McpWireStatusSnapshot = {
|
|
61
63
|
readonly servers: readonly McpWireStatusServer[];
|
|
@@ -133,5 +135,7 @@ export interface McpConnectionEntry {
|
|
|
133
135
|
lastListChangedDelta?: string;
|
|
134
136
|
/** Teardown for the list_changed coalescer + subscription. */
|
|
135
137
|
disposeListChanged?: () => void;
|
|
138
|
+
/** Teardown for the control-inventory connection-state subscription. */
|
|
139
|
+
disposeWireStatus?: () => void;
|
|
136
140
|
}
|
|
137
141
|
//# sourceMappingURL=service-types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-types.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/service-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAChG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAC/E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE1C,MAAM,MAAM,gBAAgB,GAAG,OAAO,CAAC,oBAAoB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC;AAE1F,MAAM,MAAM,gBAAgB,GACzB,IAAI,GACJ,OAAO,GACP,MAAM,GACN,MAAM,GACN,SAAS,gBAAgB,EAAE,GAC3B;IAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAAA;CAAE,CAAC;AAE5D,MAAM,MAAM,iBAAiB,GAAG,aAAa,GAAG,aAAa,GAAG,aAAa,GAAG,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"service-types.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/service-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-types.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/service-types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ExtensionContext, SessionShutdownEvent, SessionStartEvent } from \"../../types.ts\";\nimport type { ServerAuthPlan } from \"./auth/context.ts\";\nimport type { McpCachedServerCatalog } from \"./catalog-cache.ts\";\nimport type { ResolvedMcpServer } from \"./config-schema.ts\";\nimport type { ServerConnection, ServerConnectionState } from \"./connection.ts\";\nimport type { McpOutputArtifacts } from \"./guard/output-guard.ts\";\nimport type { McpLogger } from \"./log.ts\";\n\nexport type McpDisposeReason = Extract<SessionShutdownEvent[\"reason\"], \"quit\" | \"reload\">;\n\nexport type McpWireJsonValue =\n\t| null\n\t| boolean\n\t| number\n\t| string\n\t| readonly McpWireJsonValue[]\n\t| { readonly [key: string]: McpWireJsonValue | undefined };\n\nexport type McpWireAuthStatus = \"unsupported\" | \"notLoggedIn\" | \"bearerToken\" | \"oAuth\";\n\nexport type McpWireServerInfo = {\n\treadonly name: string;\n\treadonly title: string | null;\n\treadonly version: string;\n\treadonly description: string | null;\n\treadonly icons: readonly McpWireJsonValue[] | null;\n\treadonly websiteUrl: string | null;\n};\n\nexport type McpWireTool = {\n\treadonly name: string;\n\treadonly title?: string;\n\treadonly description?: string;\n\treadonly inputSchema: McpWireJsonValue;\n\treadonly outputSchema?: McpWireJsonValue;\n\treadonly annotations?: McpWireJsonValue;\n\treadonly icons?: readonly McpWireJsonValue[];\n\treadonly _meta?: McpWireJsonValue;\n};\n\nexport type McpWireResource = {\n\treadonly annotations?: McpWireJsonValue;\n\treadonly description?: string;\n\treadonly mimeType?: string;\n\treadonly name: string;\n\treadonly size?: number;\n\treadonly title?: string;\n\treadonly uri: string;\n\treadonly icons?: readonly McpWireJsonValue[];\n\treadonly _meta?: McpWireJsonValue;\n};\n\nexport type McpWireResourceTemplate = {\n\treadonly annotations?: McpWireJsonValue;\n\treadonly uriTemplate: string;\n\treadonly name: string;\n\treadonly title?: string;\n\treadonly description?: string;\n\treadonly mimeType?: string;\n\treadonly icons?: readonly McpWireJsonValue[];\n\treadonly _meta?: McpWireJsonValue;\n};\n\nexport type McpWireStatusServer = {\n\treadonly name: string;\n\treadonly serverInfo: McpWireServerInfo | null;\n\treadonly tools: readonly McpWireTool[];\n\treadonly resources: readonly McpWireResource[];\n\treadonly resourceTemplates: readonly McpWireResourceTemplate[];\n\treadonly authStatus: McpWireAuthStatus;\n};\n\nexport type McpWireStatusSnapshot = {\n\treadonly servers: readonly McpWireStatusServer[];\n};\n\nexport type McpSessionContext = Pick<ExtensionContext, \"cwd\" | \"isProjectTrusted\"> & {\n\tmode?: ExtensionContext[\"mode\"];\n\t/**\n\t * Session history access, present on the real ExtensionContext. Only\n\t * getEntries is needed (attach-time promotion rehydration); keeping the\n\t * requirement narrow lets tests pass a two-line fake.\n\t */\n\tsessionManager?: Pick<ExtensionContext[\"sessionManager\"], \"getEntries\"> &\n\t\tPartial<Pick<ExtensionContext[\"sessionManager\"], \"getSessionId\">>;\n\t/**\n\t * Extension-declared MCP servers. Read on every attach so reattach/reload\n\t * paths pick up the current declarations without caching them in the MCP\n\t * builtin.\n\t */\n\tgetRegisteredMcpServers?: () => readonly {\n\t\tname: string;\n\t\tconfig: Record<string, unknown>;\n\t\textensionPath: string;\n\t\tregistrationCwd: string;\n\t}[];\n};\n\nexport interface McpSessionOptions {\n\treadonly agentDir?: string;\n\treadonly env?: Record<string, string | undefined>;\n\treadonly logDir?: string;\n\treadonly projectTrusted?: boolean;\n}\n\nexport interface McpServiceSnapshot {\n\tdisposed: boolean;\n\tdisposeCount: number;\n\tlastDisposeReason: McpDisposeReason | null;\n\tsessionStartCount: number;\n\tlastSessionStartReason: SessionStartEvent[\"reason\"] | null;\n\thasSessionContext: boolean;\n\tconnectionCount: number;\n}\n\nexport interface McpServerSnapshot {\n\tname: string;\n\tconfigState: ResolvedMcpServer[\"state\"] | \"removed\";\n\tconfigHash: string | null;\n\tsource: ResolvedMcpServer[\"source\"] | null;\n\tsourcePath: string | null;\n\tlifecycleState: ServerConnectionState | \"cached\" | \"not_spawned\";\n\tgeneration: number | null;\n\tpid: number | null;\n\tlastError: string | null;\n\tuptimeMs: number | null;\n\tcounters: McpServerCounters;\n}\n\nexport interface McpServerCounters {\n\tcallCount: number;\n\terrorCount: number;\n\ttotalLatencyMs: number;\n\treconnectCount: number;\n}\n\nexport interface McpConnectionEntry {\n\treadonly key: string;\n\treadonly name: string;\n\treadonly configHash: string;\n\treadonly connection: ServerConnection;\n\treadonly logger: McpLogger;\n\treadonly createdAtMs: number;\n\treadonly counters: McpServerCounters;\n\treadonly agentDir?: string;\n\treadonly artifacts?: McpOutputArtifacts;\n\treadonly authPlan?: ServerAuthPlan;\n\tcachedCatalog?: McpCachedServerCatalog;\n\tcacheRefreshedAfterConnect: boolean;\n\t/** Full mcp tool names last registered for this server (list_changed diffing). */\n\tknownToolNames?: string[];\n\t/** Latest `/mcp status` list_changed delta line, e.g. \"2 added (inactive), 1 removed\". */\n\tlastListChangedDelta?: string;\n\t/** Teardown for the list_changed coalescer + subscription. */\n\tdisposeListChanged?: () => void;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"service-types.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/service-types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ExtensionContext, SessionShutdownEvent, SessionStartEvent } from \"../../types.ts\";\nimport type { ServerAuthPlan } from \"./auth/context.ts\";\nimport type { McpCachedServerCatalog } from \"./catalog-cache.ts\";\nimport type { ResolvedMcpServer } from \"./config-schema.ts\";\nimport type { ServerConnection, ServerConnectionState } from \"./connection.ts\";\nimport type { McpOutputArtifacts } from \"./guard/output-guard.ts\";\nimport type { McpLogger } from \"./log.ts\";\n\nexport type McpDisposeReason = Extract<SessionShutdownEvent[\"reason\"], \"quit\" | \"reload\">;\n\nexport type McpWireJsonValue =\n\t| null\n\t| boolean\n\t| number\n\t| string\n\t| readonly McpWireJsonValue[]\n\t| { readonly [key: string]: McpWireJsonValue | undefined };\n\nexport type McpWireAuthStatus = \"unsupported\" | \"notLoggedIn\" | \"bearerToken\" | \"oAuth\";\nexport type McpWireServerStatus = ServerConnectionState | ResolvedMcpServer[\"state\"];\n\nexport type McpWireServerInfo = {\n\treadonly name: string;\n\treadonly title: string | null;\n\treadonly version: string;\n\treadonly description: string | null;\n\treadonly icons: readonly McpWireJsonValue[] | null;\n\treadonly websiteUrl: string | null;\n};\n\nexport type McpWireTool = {\n\treadonly name: string;\n\treadonly title?: string;\n\treadonly description?: string;\n\treadonly inputSchema: McpWireJsonValue;\n\treadonly outputSchema?: McpWireJsonValue;\n\treadonly annotations?: McpWireJsonValue;\n\treadonly icons?: readonly McpWireJsonValue[];\n\treadonly _meta?: McpWireJsonValue;\n};\n\nexport type McpWireResource = {\n\treadonly annotations?: McpWireJsonValue;\n\treadonly description?: string;\n\treadonly mimeType?: string;\n\treadonly name: string;\n\treadonly size?: number;\n\treadonly title?: string;\n\treadonly uri: string;\n\treadonly icons?: readonly McpWireJsonValue[];\n\treadonly _meta?: McpWireJsonValue;\n};\n\nexport type McpWireResourceTemplate = {\n\treadonly annotations?: McpWireJsonValue;\n\treadonly uriTemplate: string;\n\treadonly name: string;\n\treadonly title?: string;\n\treadonly description?: string;\n\treadonly mimeType?: string;\n\treadonly icons?: readonly McpWireJsonValue[];\n\treadonly _meta?: McpWireJsonValue;\n};\n\nexport type McpWireStatusServer = {\n\treadonly name: string;\n\treadonly serverInfo: McpWireServerInfo | null;\n\treadonly tools: readonly McpWireTool[];\n\treadonly resources: readonly McpWireResource[];\n\treadonly resourceTemplates: readonly McpWireResourceTemplate[];\n\treadonly authStatus: McpWireAuthStatus;\n\treadonly status?: McpWireServerStatus;\n};\n\nexport type McpWireStatusSnapshot = {\n\treadonly servers: readonly McpWireStatusServer[];\n};\n\nexport type McpSessionContext = Pick<ExtensionContext, \"cwd\" | \"isProjectTrusted\"> & {\n\tmode?: ExtensionContext[\"mode\"];\n\t/**\n\t * Session history access, present on the real ExtensionContext. Only\n\t * getEntries is needed (attach-time promotion rehydration); keeping the\n\t * requirement narrow lets tests pass a two-line fake.\n\t */\n\tsessionManager?: Pick<ExtensionContext[\"sessionManager\"], \"getEntries\"> &\n\t\tPartial<Pick<ExtensionContext[\"sessionManager\"], \"getSessionId\">>;\n\t/**\n\t * Extension-declared MCP servers. Read on every attach so reattach/reload\n\t * paths pick up the current declarations without caching them in the MCP\n\t * builtin.\n\t */\n\tgetRegisteredMcpServers?: () => readonly {\n\t\tname: string;\n\t\tconfig: Record<string, unknown>;\n\t\textensionPath: string;\n\t\tregistrationCwd: string;\n\t}[];\n};\n\nexport interface McpSessionOptions {\n\treadonly agentDir?: string;\n\treadonly env?: Record<string, string | undefined>;\n\treadonly logDir?: string;\n\treadonly projectTrusted?: boolean;\n}\n\nexport interface McpServiceSnapshot {\n\tdisposed: boolean;\n\tdisposeCount: number;\n\tlastDisposeReason: McpDisposeReason | null;\n\tsessionStartCount: number;\n\tlastSessionStartReason: SessionStartEvent[\"reason\"] | null;\n\thasSessionContext: boolean;\n\tconnectionCount: number;\n}\n\nexport interface McpServerSnapshot {\n\tname: string;\n\tconfigState: ResolvedMcpServer[\"state\"] | \"removed\";\n\tconfigHash: string | null;\n\tsource: ResolvedMcpServer[\"source\"] | null;\n\tsourcePath: string | null;\n\tlifecycleState: ServerConnectionState | \"cached\" | \"not_spawned\";\n\tgeneration: number | null;\n\tpid: number | null;\n\tlastError: string | null;\n\tuptimeMs: number | null;\n\tcounters: McpServerCounters;\n}\n\nexport interface McpServerCounters {\n\tcallCount: number;\n\terrorCount: number;\n\ttotalLatencyMs: number;\n\treconnectCount: number;\n}\n\nexport interface McpConnectionEntry {\n\treadonly key: string;\n\treadonly name: string;\n\treadonly configHash: string;\n\treadonly connection: ServerConnection;\n\treadonly logger: McpLogger;\n\treadonly createdAtMs: number;\n\treadonly counters: McpServerCounters;\n\treadonly agentDir?: string;\n\treadonly artifacts?: McpOutputArtifacts;\n\treadonly authPlan?: ServerAuthPlan;\n\tcachedCatalog?: McpCachedServerCatalog;\n\tcacheRefreshedAfterConnect: boolean;\n\t/** Full mcp tool names last registered for this server (list_changed diffing). */\n\tknownToolNames?: string[];\n\t/** Latest `/mcp status` list_changed delta line, e.g. \"2 added (inactive), 1 removed\". */\n\tlastListChangedDelta?: string;\n\t/** Teardown for the list_changed coalescer + subscription. */\n\tdisposeListChanged?: () => void;\n\t/** Teardown for the control-inventory connection-state subscription. */\n\tdisposeWireStatus?: () => void;\n}\n"]}
|