@qodo/sdk 0.13.3 → 2.0.0-next.0
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/LICENSE +31 -118
- package/README.md +133 -121
- package/bin/qodo-skills.mjs +13 -0
- package/bundled-skills/code-review/SKILL.md +41 -0
- package/bundled-skills/pr-summary/SKILL.md +59 -0
- package/bundled-skills/test-gen/SKILL.md +47 -0
- package/dist/auth/index.browser.d.ts +38 -0
- package/dist/auth/index.browser.d.ts.map +1 -0
- package/dist/auth/index.browser.js +62 -0
- package/dist/auth/index.browser.js.map +1 -0
- package/dist/auth/index.d.ts +44 -30
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +57 -110
- package/dist/auth/index.js.map +1 -1
- package/dist/client/AgentsClient.d.ts +33 -0
- package/dist/client/AgentsClient.d.ts.map +1 -0
- package/dist/client/AgentsClient.js +40 -0
- package/dist/client/AgentsClient.js.map +1 -0
- package/dist/client/ArtifactsClient.d.ts +43 -0
- package/dist/client/ArtifactsClient.d.ts.map +1 -0
- package/dist/client/ArtifactsClient.js +54 -0
- package/dist/client/ArtifactsClient.js.map +1 -0
- package/dist/client/BulletinClient.d.ts +45 -0
- package/dist/client/BulletinClient.d.ts.map +1 -0
- package/dist/client/BulletinClient.js +51 -0
- package/dist/client/BulletinClient.js.map +1 -0
- package/dist/client/InfoClient.d.ts +58 -0
- package/dist/client/InfoClient.d.ts.map +1 -0
- package/dist/client/InfoClient.js +135 -0
- package/dist/client/InfoClient.js.map +1 -0
- package/dist/client/PipelineClient.d.ts +162 -0
- package/dist/client/PipelineClient.d.ts.map +1 -0
- package/dist/client/PipelineClient.js +340 -0
- package/dist/client/PipelineClient.js.map +1 -0
- package/dist/client/QarRegistryClient.d.ts +396 -0
- package/dist/client/QarRegistryClient.d.ts.map +1 -0
- package/dist/client/QarRegistryClient.js +536 -0
- package/dist/client/QarRegistryClient.js.map +1 -0
- package/dist/client/QodoClient.d.ts +296 -0
- package/dist/client/QodoClient.d.ts.map +1 -0
- package/dist/client/QodoClient.js +803 -0
- package/dist/client/QodoClient.js.map +1 -0
- package/dist/client/SpecsClient.d.ts +121 -0
- package/dist/client/SpecsClient.d.ts.map +1 -0
- package/dist/client/SpecsClient.js +252 -0
- package/dist/client/SpecsClient.js.map +1 -0
- package/dist/client/StateClient.d.ts +35 -0
- package/dist/client/StateClient.d.ts.map +1 -0
- package/dist/client/StateClient.js +36 -0
- package/dist/client/StateClient.js.map +1 -0
- package/dist/client/TaskClient.d.ts +706 -0
- package/dist/client/TaskClient.d.ts.map +1 -0
- package/dist/client/TaskClient.js +2522 -0
- package/dist/client/TaskClient.js.map +1 -0
- package/dist/client/ToolClient.d.ts +278 -0
- package/dist/client/ToolClient.d.ts.map +1 -0
- package/dist/client/ToolClient.js +1115 -0
- package/dist/client/ToolClient.js.map +1 -0
- package/dist/client/a2a/index.d.ts +10 -0
- package/dist/client/a2a/index.d.ts.map +1 -0
- package/dist/client/a2a/index.js +9 -0
- package/dist/client/a2a/index.js.map +1 -0
- package/dist/client/a2a/registerA2A.d.ts +170 -0
- package/dist/client/a2a/registerA2A.d.ts.map +1 -0
- package/dist/client/a2a/registerA2A.js +85 -0
- package/dist/client/a2a/registerA2A.js.map +1 -0
- package/dist/client/connection.d.ts +800 -0
- package/dist/client/connection.d.ts.map +1 -0
- package/dist/client/connection.js +2020 -0
- package/dist/client/connection.js.map +1 -0
- package/dist/client/errors.d.ts +735 -0
- package/dist/client/errors.d.ts.map +1 -0
- package/dist/client/errors.js +921 -0
- package/dist/client/errors.js.map +1 -0
- package/dist/client/index.d.ts +26 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +20 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/inlineGraph.d.ts +66 -0
- package/dist/client/inlineGraph.d.ts.map +1 -0
- package/dist/client/inlineGraph.js +500 -0
- package/dist/client/inlineGraph.js.map +1 -0
- package/dist/client/internal/thenable.d.ts +27 -0
- package/dist/client/internal/thenable.d.ts.map +1 -0
- package/dist/client/internal/thenable.js +31 -0
- package/dist/client/internal/thenable.js.map +1 -0
- package/dist/client/iterator.d.ts +32 -0
- package/dist/client/iterator.d.ts.map +1 -0
- package/dist/client/iterator.js +73 -0
- package/dist/client/iterator.js.map +1 -0
- package/dist/client/mcp/McpClientPool.browser.d.ts +76 -0
- package/dist/client/mcp/McpClientPool.browser.d.ts.map +1 -0
- package/dist/client/mcp/McpClientPool.browser.js +78 -0
- package/dist/client/mcp/McpClientPool.browser.js.map +1 -0
- package/dist/client/mcp/McpClientPool.d.ts +236 -0
- package/dist/client/mcp/McpClientPool.d.ts.map +1 -0
- package/dist/client/mcp/McpClientPool.js +585 -0
- package/dist/client/mcp/McpClientPool.js.map +1 -0
- package/dist/client/mcp/projection.d.ts +109 -0
- package/dist/client/mcp/projection.d.ts.map +1 -0
- package/dist/client/mcp/projection.js +446 -0
- package/dist/client/mcp/projection.js.map +1 -0
- package/dist/client/mcp/substituteEnv.browser.d.ts +18 -0
- package/dist/client/mcp/substituteEnv.browser.d.ts.map +1 -0
- package/dist/client/mcp/substituteEnv.browser.js +20 -0
- package/dist/client/mcp/substituteEnv.browser.js.map +1 -0
- package/dist/client/mcp/substituteEnv.d.ts +45 -0
- package/dist/client/mcp/substituteEnv.d.ts.map +1 -0
- package/dist/client/mcp/substituteEnv.js +63 -0
- package/dist/client/mcp/substituteEnv.js.map +1 -0
- package/dist/client/observers.d.ts +57 -0
- package/dist/client/observers.d.ts.map +1 -0
- package/dist/client/observers.js +203 -0
- package/dist/client/observers.js.map +1 -0
- package/dist/client/options.d.ts +269 -0
- package/dist/client/options.d.ts.map +1 -0
- package/dist/client/options.js +9 -0
- package/dist/client/options.js.map +1 -0
- package/dist/client/tools/_readlineApprovalPrompt.browser.d.ts +17 -0
- package/dist/client/tools/_readlineApprovalPrompt.browser.d.ts.map +1 -0
- package/dist/client/tools/_readlineApprovalPrompt.browser.js +24 -0
- package/dist/client/tools/_readlineApprovalPrompt.browser.js.map +1 -0
- package/dist/client/tools/_readlineApprovalPrompt.d.ts +33 -0
- package/dist/client/tools/_readlineApprovalPrompt.d.ts.map +1 -0
- package/dist/client/tools/_readlineApprovalPrompt.js +90 -0
- package/dist/client/tools/_readlineApprovalPrompt.js.map +1 -0
- package/dist/client/tools/approval.d.ts +280 -0
- package/dist/client/tools/approval.d.ts.map +1 -0
- package/dist/client/tools/approval.js +229 -0
- package/dist/client/tools/approval.js.map +1 -0
- package/dist/client/tools/bindFunctionToolDefs.d.ts +156 -0
- package/dist/client/tools/bindFunctionToolDefs.d.ts.map +1 -0
- package/dist/client/tools/bindFunctionToolDefs.js +360 -0
- package/dist/client/tools/bindFunctionToolDefs.js.map +1 -0
- package/dist/client/tools/defineFunctionTool.d.ts +277 -0
- package/dist/client/tools/defineFunctionTool.d.ts.map +1 -0
- package/dist/client/tools/defineFunctionTool.js +190 -0
- package/dist/client/tools/defineFunctionTool.js.map +1 -0
- package/dist/client/transport.browser.d.ts +20 -0
- package/dist/client/transport.browser.d.ts.map +1 -0
- package/dist/client/transport.browser.js +29 -0
- package/dist/client/transport.browser.js.map +1 -0
- package/dist/client/transport.d.ts +47 -0
- package/dist/client/transport.d.ts.map +1 -0
- package/dist/client/transport.js +102 -0
- package/dist/client/transport.js.map +1 -0
- package/dist/client/transport.shared.d.ts +30 -0
- package/dist/client/transport.shared.d.ts.map +1 -0
- package/dist/client/transport.shared.js +40 -0
- package/dist/client/transport.shared.js.map +1 -0
- package/dist/client/uuid.d.ts +32 -0
- package/dist/client/uuid.d.ts.map +1 -0
- package/dist/client/uuid.js +65 -0
- package/dist/client/uuid.js.map +1 -0
- package/dist/index.d.ts +88 -39
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +166 -43
- package/dist/index.js.map +1 -1
- package/dist/observability/attributes.d.ts +136 -0
- package/dist/observability/attributes.d.ts.map +1 -0
- package/dist/observability/attributes.js +184 -0
- package/dist/observability/attributes.js.map +1 -0
- package/dist/observability/index.d.ts +14 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +11 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/resolveOTel.browser.d.ts +13 -0
- package/dist/observability/resolveOTel.browser.d.ts.map +1 -0
- package/dist/observability/resolveOTel.browser.js +14 -0
- package/dist/observability/resolveOTel.browser.js.map +1 -0
- package/dist/observability/resolveOTel.d.ts +28 -0
- package/dist/observability/resolveOTel.d.ts.map +1 -0
- package/dist/observability/resolveOTel.js +74 -0
- package/dist/observability/resolveOTel.js.map +1 -0
- package/dist/observability/spans.d.ts +198 -0
- package/dist/observability/spans.d.ts.map +1 -0
- package/dist/observability/spans.js +300 -0
- package/dist/observability/spans.js.map +1 -0
- package/dist/observability/traceContext.d.ts +51 -0
- package/dist/observability/traceContext.d.ts.map +1 -0
- package/dist/observability/traceContext.js +151 -0
- package/dist/observability/traceContext.js.map +1 -0
- package/dist/observability/transportMetrics.d.ts +58 -0
- package/dist/observability/transportMetrics.d.ts.map +1 -0
- package/dist/observability/transportMetrics.js +55 -0
- package/dist/observability/transportMetrics.js.map +1 -0
- package/dist/qar/agentSpec.d.ts +93 -0
- package/dist/qar/agentSpec.d.ts.map +1 -0
- package/dist/qar/agentSpec.js +184 -0
- package/dist/qar/agentSpec.js.map +1 -0
- package/dist/qar/clientEvents.d.ts +86 -0
- package/dist/qar/clientEvents.d.ts.map +1 -0
- package/dist/qar/clientEvents.js +36 -0
- package/dist/qar/clientEvents.js.map +1 -0
- package/dist/qar/envelopes.d.ts +227 -0
- package/dist/qar/envelopes.d.ts.map +1 -0
- package/dist/qar/envelopes.js +67 -0
- package/dist/qar/envelopes.js.map +1 -0
- package/dist/qar/generated/envelope.d.ts +332 -0
- package/dist/qar/generated/envelope.d.ts.map +1 -0
- package/dist/qar/generated/envelope.js +15 -0
- package/dist/qar/generated/envelope.js.map +1 -0
- package/dist/qar/generated/qar-info.d.ts +76 -0
- package/dist/qar/generated/qar-info.d.ts.map +1 -0
- package/dist/qar/generated/qar-info.js +15 -0
- package/dist/qar/generated/qar-info.js.map +1 -0
- package/dist/qar/generated/qodo-task-start-payload.d.ts +54 -0
- package/dist/qar/generated/qodo-task-start-payload.d.ts.map +1 -0
- package/dist/qar/generated/qodo-task-start-payload.js +15 -0
- package/dist/qar/generated/qodo-task-start-payload.js.map +1 -0
- package/dist/qar/ids.d.ts +19 -0
- package/dist/qar/ids.d.ts.map +1 -0
- package/dist/qar/ids.js +11 -0
- package/dist/qar/ids.js.map +1 -0
- package/dist/qar/index.d.ts +24 -0
- package/dist/qar/index.d.ts.map +1 -0
- package/dist/qar/index.js +16 -0
- package/dist/qar/index.js.map +1 -0
- package/dist/qar/info.d.ts +37 -0
- package/dist/qar/info.d.ts.map +1 -0
- package/dist/qar/info.js +17 -0
- package/dist/qar/info.js.map +1 -0
- package/dist/qar/json.d.ts +14 -0
- package/dist/qar/json.d.ts.map +1 -0
- package/dist/qar/json.js +9 -0
- package/dist/qar/json.js.map +1 -0
- package/dist/qar/payloads.d.ts +480 -0
- package/dist/qar/payloads.d.ts.map +1 -0
- package/dist/qar/payloads.js +37 -0
- package/dist/qar/payloads.js.map +1 -0
- package/dist/qar/specs.d.ts +604 -0
- package/dist/qar/specs.d.ts.map +1 -0
- package/dist/qar/specs.js +29 -0
- package/dist/qar/specs.js.map +1 -0
- package/dist/qar/taskEvents.d.ts +25 -0
- package/dist/qar/taskEvents.d.ts.map +1 -0
- package/dist/qar/taskEvents.js +22 -0
- package/dist/qar/taskEvents.js.map +1 -0
- package/dist/qar/trace.d.ts +12 -0
- package/dist/qar/trace.d.ts.map +1 -0
- package/dist/qar/trace.js +12 -0
- package/dist/qar/trace.js.map +1 -0
- package/dist/skills/activation.d.ts +177 -0
- package/dist/skills/activation.d.ts.map +1 -0
- package/dist/skills/activation.js +428 -0
- package/dist/skills/activation.js.map +1 -0
- package/dist/skills/cli/index.browser.d.ts +18 -0
- package/dist/skills/cli/index.browser.d.ts.map +1 -0
- package/dist/skills/cli/index.browser.js +27 -0
- package/dist/skills/cli/index.browser.js.map +1 -0
- package/dist/skills/cli/index.d.ts +37 -0
- package/dist/skills/cli/index.d.ts.map +1 -0
- package/dist/skills/cli/index.js +494 -0
- package/dist/skills/cli/index.js.map +1 -0
- package/dist/skills/events.d.ts +255 -0
- package/dist/skills/events.d.ts.map +1 -0
- package/dist/skills/events.js +224 -0
- package/dist/skills/events.js.map +1 -0
- package/dist/skills/index.d.ts +45 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +34 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/inject.d.ts +57 -0
- package/dist/skills/inject.d.ts.map +1 -0
- package/dist/skills/inject.js +162 -0
- package/dist/skills/inject.js.map +1 -0
- package/dist/skills/lockfile.browser.d.ts +56 -0
- package/dist/skills/lockfile.browser.d.ts.map +1 -0
- package/dist/skills/lockfile.browser.js +55 -0
- package/dist/skills/lockfile.browser.js.map +1 -0
- package/dist/skills/lockfile.d.ts +137 -0
- package/dist/skills/lockfile.d.ts.map +1 -0
- package/dist/skills/lockfile.js +423 -0
- package/dist/skills/lockfile.js.map +1 -0
- package/dist/skills/manager.browser.d.ts +94 -0
- package/dist/skills/manager.browser.d.ts.map +1 -0
- package/dist/skills/manager.browser.js +159 -0
- package/dist/skills/manager.browser.js.map +1 -0
- package/dist/skills/manager.d.ts +362 -0
- package/dist/skills/manager.d.ts.map +1 -0
- package/dist/skills/manager.js +1386 -0
- package/dist/skills/manager.js.map +1 -0
- package/dist/skills/mcp/index.d.ts +15 -0
- package/dist/skills/mcp/index.d.ts.map +1 -0
- package/dist/skills/mcp/index.js +12 -0
- package/dist/skills/mcp/index.js.map +1 -0
- package/dist/skills/mcp/path.browser.d.ts +27 -0
- package/dist/skills/mcp/path.browser.d.ts.map +1 -0
- package/dist/skills/mcp/path.browser.js +33 -0
- package/dist/skills/mcp/path.browser.js.map +1 -0
- package/dist/skills/mcp/path.d.ts +57 -0
- package/dist/skills/mcp/path.d.ts.map +1 -0
- package/dist/skills/mcp/path.js +150 -0
- package/dist/skills/mcp/path.js.map +1 -0
- package/dist/skills/mcp/server.browser.d.ts +32 -0
- package/dist/skills/mcp/server.browser.d.ts.map +1 -0
- package/dist/skills/mcp/server.browser.js +53 -0
- package/dist/skills/mcp/server.browser.js.map +1 -0
- package/dist/skills/mcp/server.d.ts +144 -0
- package/dist/skills/mcp/server.d.ts.map +1 -0
- package/dist/skills/mcp/server.js +841 -0
- package/dist/skills/mcp/server.js.map +1 -0
- package/dist/skills/mcp/types.d.ts +72 -0
- package/dist/skills/mcp/types.d.ts.map +1 -0
- package/dist/skills/mcp/types.js +20 -0
- package/dist/skills/mcp/types.js.map +1 -0
- package/dist/skills/mcp/wireDefs.d.ts +58 -0
- package/dist/skills/mcp/wireDefs.d.ts.map +1 -0
- package/dist/skills/mcp/wireDefs.js +141 -0
- package/dist/skills/mcp/wireDefs.js.map +1 -0
- package/dist/skills/parser.d.ts +63 -0
- package/dist/skills/parser.d.ts.map +1 -0
- package/dist/skills/parser.js +755 -0
- package/dist/skills/parser.js.map +1 -0
- package/dist/skills/prefilter.d.ts +104 -0
- package/dist/skills/prefilter.d.ts.map +1 -0
- package/dist/skills/prefilter.js +398 -0
- package/dist/skills/prefilter.js.map +1 -0
- package/dist/skills/preprocess.d.ts +169 -0
- package/dist/skills/preprocess.d.ts.map +1 -0
- package/dist/skills/preprocess.js +535 -0
- package/dist/skills/preprocess.js.map +1 -0
- package/dist/skills/render.d.ts +83 -0
- package/dist/skills/render.d.ts.map +1 -0
- package/dist/skills/render.js +397 -0
- package/dist/skills/render.js.map +1 -0
- package/dist/skills/sources/index.browser.d.ts +29 -0
- package/dist/skills/sources/index.browser.d.ts.map +1 -0
- package/dist/skills/sources/index.browser.js +16 -0
- package/dist/skills/sources/index.browser.js.map +1 -0
- package/dist/skills/sources/index.d.ts +59 -0
- package/dist/skills/sources/index.d.ts.map +1 -0
- package/dist/skills/sources/index.js +471 -0
- package/dist/skills/sources/index.js.map +1 -0
- package/dist/skills/sources/walk.browser.d.ts +17 -0
- package/dist/skills/sources/walk.browser.d.ts.map +1 -0
- package/dist/skills/sources/walk.browser.js +19 -0
- package/dist/skills/sources/walk.browser.js.map +1 -0
- package/dist/skills/sources/walk.d.ts +68 -0
- package/dist/skills/sources/walk.d.ts.map +1 -0
- package/dist/skills/sources/walk.js +264 -0
- package/dist/skills/sources/walk.js.map +1 -0
- package/dist/skills/substitute.d.ts +87 -0
- package/dist/skills/substitute.d.ts.map +1 -0
- package/dist/skills/substitute.js +322 -0
- package/dist/skills/substitute.js.map +1 -0
- package/dist/skills/testing/SkillKit.browser.d.ts +62 -0
- package/dist/skills/testing/SkillKit.browser.d.ts.map +1 -0
- package/dist/skills/testing/SkillKit.browser.js +41 -0
- package/dist/skills/testing/SkillKit.browser.js.map +1 -0
- package/dist/skills/testing/SkillKit.d.ts +130 -0
- package/dist/skills/testing/SkillKit.d.ts.map +1 -0
- package/dist/skills/testing/SkillKit.js +316 -0
- package/dist/skills/testing/SkillKit.js.map +1 -0
- package/dist/skills/testing/index.d.ts +9 -0
- package/dist/skills/testing/index.d.ts.map +1 -0
- package/dist/skills/testing/index.js +8 -0
- package/dist/skills/testing/index.js.map +1 -0
- package/dist/skills/trust.d.ts +72 -0
- package/dist/skills/trust.d.ts.map +1 -0
- package/dist/skills/trust.js +183 -0
- package/dist/skills/trust.js.map +1 -0
- package/dist/skills/types.d.ts +627 -0
- package/dist/skills/types.d.ts.map +1 -0
- package/dist/skills/types.js +85 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/skills/validator.d.ts +95 -0
- package/dist/skills/validator.d.ts.map +1 -0
- package/dist/skills/validator.js +486 -0
- package/dist/skills/validator.js.map +1 -0
- package/dist/tracing/PipelineTracer.d.ts +35 -22
- package/dist/tracing/PipelineTracer.d.ts.map +1 -1
- package/dist/tracing/PipelineTracer.js +106 -61
- package/dist/tracing/PipelineTracer.js.map +1 -1
- package/dist/tracing/SdkTracer.d.ts +63 -61
- package/dist/tracing/SdkTracer.d.ts.map +1 -1
- package/dist/tracing/SdkTracer.js +185 -177
- package/dist/tracing/SdkTracer.js.map +1 -1
- package/dist/tracing/index.d.ts +10 -1
- package/dist/tracing/index.d.ts.map +1 -1
- package/dist/tracing/index.js +9 -0
- package/dist/tracing/index.js.map +1 -1
- package/dist/tracing/types.d.ts +89 -16
- package/dist/tracing/types.d.ts.map +1 -1
- package/dist/tracing/types.js +17 -4
- package/dist/tracing/types.js.map +1 -1
- package/dist/types.d.ts +6 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +10 -20
- package/dist/version.js.map +1 -1
- package/package.json +53 -39
- package/.claude/skills/qodo-agent/SKILL.md +0 -974
- package/.claude/skills/qodo-agent/assets/programmatic-agent.ts +0 -407
- package/.claude/skills/qodo-agent/references/builtin-tools.md +0 -342
- package/.claude/skills/qodo-agent/references/common-issues.md +0 -537
- package/bin/rg +0 -0
- package/dist/api/agent.d.ts +0 -104
- package/dist/api/agent.d.ts.map +0 -1
- package/dist/api/agent.js +0 -939
- package/dist/api/agent.js.map +0 -1
- package/dist/api/analytics.d.ts +0 -43
- package/dist/api/analytics.d.ts.map +0 -1
- package/dist/api/analytics.js +0 -163
- package/dist/api/analytics.js.map +0 -1
- package/dist/api/http.d.ts +0 -5
- package/dist/api/http.d.ts.map +0 -1
- package/dist/api/http.js +0 -62
- package/dist/api/http.js.map +0 -1
- package/dist/api/index.d.ts +0 -12
- package/dist/api/index.d.ts.map +0 -1
- package/dist/api/index.js +0 -17
- package/dist/api/index.js.map +0 -1
- package/dist/api/taskTracking.d.ts +0 -54
- package/dist/api/taskTracking.d.ts.map +0 -1
- package/dist/api/taskTracking.js +0 -208
- package/dist/api/taskTracking.js.map +0 -1
- package/dist/api/types.d.ts +0 -93
- package/dist/api/types.d.ts.map +0 -1
- package/dist/api/types.js +0 -2
- package/dist/api/types.js.map +0 -1
- package/dist/api/utils.d.ts +0 -8
- package/dist/api/utils.d.ts.map +0 -1
- package/dist/api/utils.js +0 -63
- package/dist/api/utils.js.map +0 -1
- package/dist/api/websocket.d.ts +0 -203
- package/dist/api/websocket.d.ts.map +0 -1
- package/dist/api/websocket.js +0 -1166
- package/dist/api/websocket.js.map +0 -1
- package/dist/bin/install-skill.d.ts +0 -14
- package/dist/bin/install-skill.d.ts.map +0 -1
- package/dist/bin/install-skill.js +0 -125
- package/dist/bin/install-skill.js.map +0 -1
- package/dist/bin/run-helpers.d.ts +0 -34
- package/dist/bin/run-helpers.d.ts.map +0 -1
- package/dist/bin/run-helpers.js +0 -186
- package/dist/bin/run-helpers.js.map +0 -1
- package/dist/bin/run.d.ts +0 -13
- package/dist/bin/run.d.ts.map +0 -1
- package/dist/bin/run.js +0 -57
- package/dist/bin/run.js.map +0 -1
- package/dist/clients/index.d.ts +0 -10
- package/dist/clients/index.d.ts.map +0 -1
- package/dist/clients/index.js +0 -8
- package/dist/clients/index.js.map +0 -1
- package/dist/clients/info/InfoClient.d.ts +0 -37
- package/dist/clients/info/InfoClient.d.ts.map +0 -1
- package/dist/clients/info/InfoClient.js +0 -69
- package/dist/clients/info/InfoClient.js.map +0 -1
- package/dist/clients/info/index.d.ts +0 -4
- package/dist/clients/info/index.d.ts.map +0 -1
- package/dist/clients/info/index.js +0 -2
- package/dist/clients/info/index.js.map +0 -1
- package/dist/clients/info/types.d.ts +0 -21
- package/dist/clients/info/types.d.ts.map +0 -1
- package/dist/clients/info/types.js +0 -2
- package/dist/clients/info/types.js.map +0 -1
- package/dist/clients/sessions/SessionsClient.d.ts +0 -34
- package/dist/clients/sessions/SessionsClient.d.ts.map +0 -1
- package/dist/clients/sessions/SessionsClient.js +0 -71
- package/dist/clients/sessions/SessionsClient.js.map +0 -1
- package/dist/clients/sessions/index.d.ts +0 -4
- package/dist/clients/sessions/index.d.ts.map +0 -1
- package/dist/clients/sessions/index.js +0 -2
- package/dist/clients/sessions/index.js.map +0 -1
- package/dist/clients/sessions/types.d.ts +0 -20
- package/dist/clients/sessions/types.d.ts.map +0 -1
- package/dist/clients/sessions/types.js +0 -2
- package/dist/clients/sessions/types.js.map +0 -1
- package/dist/clients/tools/ToolsClient.d.ts +0 -39
- package/dist/clients/tools/ToolsClient.d.ts.map +0 -1
- package/dist/clients/tools/ToolsClient.js +0 -95
- package/dist/clients/tools/ToolsClient.js.map +0 -1
- package/dist/clients/tools/index.d.ts +0 -4
- package/dist/clients/tools/index.d.ts.map +0 -1
- package/dist/clients/tools/index.js +0 -2
- package/dist/clients/tools/index.js.map +0 -1
- package/dist/clients/tools/types.d.ts +0 -14
- package/dist/clients/tools/types.d.ts.map +0 -1
- package/dist/clients/tools/types.js +0 -2
- package/dist/clients/tools/types.js.map +0 -1
- package/dist/config/ConfigManager.d.ts +0 -43
- package/dist/config/ConfigManager.d.ts.map +0 -1
- package/dist/config/ConfigManager.js +0 -472
- package/dist/config/ConfigManager.js.map +0 -1
- package/dist/config/index.d.ts +0 -6
- package/dist/config/index.d.ts.map +0 -1
- package/dist/config/index.js +0 -7
- package/dist/config/index.js.map +0 -1
- package/dist/config/urlConfig.d.ts +0 -15
- package/dist/config/urlConfig.d.ts.map +0 -1
- package/dist/config/urlConfig.js +0 -75
- package/dist/config/urlConfig.js.map +0 -1
- package/dist/constants/errors.d.ts +0 -2
- package/dist/constants/errors.d.ts.map +0 -1
- package/dist/constants/errors.js +0 -2
- package/dist/constants/errors.js.map +0 -1
- package/dist/constants/index.d.ts +0 -7
- package/dist/constants/index.d.ts.map +0 -1
- package/dist/constants/index.js +0 -11
- package/dist/constants/index.js.map +0 -1
- package/dist/constants/tools.d.ts +0 -4
- package/dist/constants/tools.d.ts.map +0 -1
- package/dist/constants/tools.js +0 -4
- package/dist/constants/tools.js.map +0 -1
- package/dist/constants/versions.d.ts +0 -2
- package/dist/constants/versions.d.ts.map +0 -1
- package/dist/constants/versions.js +0 -2
- package/dist/constants/versions.js.map +0 -1
- package/dist/context/buildUserContext.d.ts +0 -18
- package/dist/context/buildUserContext.d.ts.map +0 -1
- package/dist/context/buildUserContext.js +0 -34
- package/dist/context/buildUserContext.js.map +0 -1
- package/dist/context/index.d.ts +0 -9
- package/dist/context/index.d.ts.map +0 -1
- package/dist/context/index.js +0 -9
- package/dist/context/index.js.map +0 -1
- package/dist/context/messageManager.d.ts +0 -42
- package/dist/context/messageManager.d.ts.map +0 -1
- package/dist/context/messageManager.js +0 -322
- package/dist/context/messageManager.js.map +0 -1
- package/dist/context/taskFocus.d.ts +0 -2
- package/dist/context/taskFocus.d.ts.map +0 -1
- package/dist/context/taskFocus.js +0 -26
- package/dist/context/taskFocus.js.map +0 -1
- package/dist/context/userInput.d.ts +0 -3
- package/dist/context/userInput.d.ts.map +0 -1
- package/dist/context/userInput.js +0 -20
- package/dist/context/userInput.js.map +0 -1
- package/dist/mcp/MCPManager.d.ts +0 -109
- package/dist/mcp/MCPManager.d.ts.map +0 -1
- package/dist/mcp/MCPManager.js +0 -592
- package/dist/mcp/MCPManager.js.map +0 -1
- package/dist/mcp/approvedTools.d.ts +0 -4
- package/dist/mcp/approvedTools.d.ts.map +0 -1
- package/dist/mcp/approvedTools.js +0 -19
- package/dist/mcp/approvedTools.js.map +0 -1
- package/dist/mcp/baseServer.d.ts +0 -75
- package/dist/mcp/baseServer.d.ts.map +0 -1
- package/dist/mcp/baseServer.js +0 -107
- package/dist/mcp/baseServer.js.map +0 -1
- package/dist/mcp/builtinServers.d.ts +0 -15
- package/dist/mcp/builtinServers.d.ts.map +0 -1
- package/dist/mcp/builtinServers.js +0 -141
- package/dist/mcp/builtinServers.js.map +0 -1
- package/dist/mcp/dynamicBEServer.d.ts +0 -20
- package/dist/mcp/dynamicBEServer.d.ts.map +0 -1
- package/dist/mcp/dynamicBEServer.js +0 -52
- package/dist/mcp/dynamicBEServer.js.map +0 -1
- package/dist/mcp/index.d.ts +0 -18
- package/dist/mcp/index.d.ts.map +0 -1
- package/dist/mcp/index.js +0 -23
- package/dist/mcp/index.js.map +0 -1
- package/dist/mcp/mcpInitialization.d.ts +0 -2
- package/dist/mcp/mcpInitialization.d.ts.map +0 -1
- package/dist/mcp/mcpInitialization.js +0 -56
- package/dist/mcp/mcpInitialization.js.map +0 -1
- package/dist/mcp/servers/filesystem.d.ts +0 -44
- package/dist/mcp/servers/filesystem.d.ts.map +0 -1
- package/dist/mcp/servers/filesystem.js +0 -776
- package/dist/mcp/servers/filesystem.js.map +0 -1
- package/dist/mcp/servers/git.d.ts +0 -18
- package/dist/mcp/servers/git.d.ts.map +0 -1
- package/dist/mcp/servers/git.js +0 -441
- package/dist/mcp/servers/git.js.map +0 -1
- package/dist/mcp/servers/ripgrep.d.ts +0 -39
- package/dist/mcp/servers/ripgrep.d.ts.map +0 -1
- package/dist/mcp/servers/ripgrep.js +0 -550
- package/dist/mcp/servers/ripgrep.js.map +0 -1
- package/dist/mcp/servers/shell.d.ts +0 -20
- package/dist/mcp/servers/shell.d.ts.map +0 -1
- package/dist/mcp/servers/shell.js +0 -519
- package/dist/mcp/servers/shell.js.map +0 -1
- package/dist/mcp/serversRegistry.d.ts +0 -55
- package/dist/mcp/serversRegistry.d.ts.map +0 -1
- package/dist/mcp/serversRegistry.js +0 -416
- package/dist/mcp/serversRegistry.js.map +0 -1
- package/dist/mcp/toolProcessor.d.ts +0 -82
- package/dist/mcp/toolProcessor.d.ts.map +0 -1
- package/dist/mcp/toolProcessor.js +0 -392
- package/dist/mcp/toolProcessor.js.map +0 -1
- package/dist/mcp/types.d.ts +0 -29
- package/dist/mcp/types.d.ts.map +0 -1
- package/dist/mcp/types.js +0 -2
- package/dist/mcp/types.js.map +0 -1
- package/dist/messages/index.d.ts +0 -8
- package/dist/messages/index.d.ts.map +0 -1
- package/dist/messages/index.js +0 -7
- package/dist/messages/index.js.map +0 -1
- package/dist/messages/openai.d.ts +0 -26
- package/dist/messages/openai.d.ts.map +0 -1
- package/dist/messages/openai.js +0 -55
- package/dist/messages/openai.js.map +0 -1
- package/dist/messages/types.d.ts +0 -73
- package/dist/messages/types.d.ts.map +0 -1
- package/dist/messages/types.js +0 -78
- package/dist/messages/types.js.map +0 -1
- package/dist/parser/index.d.ts +0 -72
- package/dist/parser/index.d.ts.map +0 -1
- package/dist/parser/index.js +0 -967
- package/dist/parser/index.js.map +0 -1
- package/dist/parser/types.d.ts +0 -153
- package/dist/parser/types.d.ts.map +0 -1
- package/dist/parser/types.js +0 -6
- package/dist/parser/types.js.map +0 -1
- package/dist/parser/utils.d.ts +0 -18
- package/dist/parser/utils.d.ts.map +0 -1
- package/dist/parser/utils.js +0 -64
- package/dist/parser/utils.js.map +0 -1
- package/dist/sdk/QodoSDK.d.ts +0 -218
- package/dist/sdk/QodoSDK.d.ts.map +0 -1
- package/dist/sdk/QodoSDK.js +0 -1115
- package/dist/sdk/QodoSDK.js.map +0 -1
- package/dist/sdk/artifacts.d.ts +0 -156
- package/dist/sdk/artifacts.d.ts.map +0 -1
- package/dist/sdk/artifacts.js +0 -166
- package/dist/sdk/artifacts.js.map +0 -1
- package/dist/sdk/bootstrap.d.ts +0 -16
- package/dist/sdk/bootstrap.d.ts.map +0 -1
- package/dist/sdk/bootstrap.js +0 -28
- package/dist/sdk/bootstrap.js.map +0 -1
- package/dist/sdk/builders.d.ts +0 -54
- package/dist/sdk/builders.d.ts.map +0 -1
- package/dist/sdk/builders.js +0 -117
- package/dist/sdk/builders.js.map +0 -1
- package/dist/sdk/defaults.d.ts +0 -11
- package/dist/sdk/defaults.d.ts.map +0 -1
- package/dist/sdk/defaults.js +0 -39
- package/dist/sdk/defaults.js.map +0 -1
- package/dist/sdk/discovery.d.ts +0 -2
- package/dist/sdk/discovery.d.ts.map +0 -1
- package/dist/sdk/discovery.js +0 -25
- package/dist/sdk/discovery.js.map +0 -1
- package/dist/sdk/events.d.ts +0 -269
- package/dist/sdk/events.d.ts.map +0 -1
- package/dist/sdk/events.js +0 -69
- package/dist/sdk/events.js.map +0 -1
- package/dist/sdk/exit-expression.d.ts +0 -13
- package/dist/sdk/exit-expression.d.ts.map +0 -1
- package/dist/sdk/exit-expression.js +0 -35
- package/dist/sdk/exit-expression.js.map +0 -1
- package/dist/sdk/index.d.ts +0 -17
- package/dist/sdk/index.d.ts.map +0 -1
- package/dist/sdk/index.js +0 -17
- package/dist/sdk/index.js.map +0 -1
- package/dist/sdk/middleware.d.ts +0 -59
- package/dist/sdk/middleware.d.ts.map +0 -1
- package/dist/sdk/middleware.js +0 -69
- package/dist/sdk/middleware.js.map +0 -1
- package/dist/sdk/pipeline/PipelineBuilder.d.ts +0 -79
- package/dist/sdk/pipeline/PipelineBuilder.d.ts.map +0 -1
- package/dist/sdk/pipeline/PipelineBuilder.js +0 -129
- package/dist/sdk/pipeline/PipelineBuilder.js.map +0 -1
- package/dist/sdk/pipeline/PipelineRunner.d.ts +0 -28
- package/dist/sdk/pipeline/PipelineRunner.d.ts.map +0 -1
- package/dist/sdk/pipeline/PipelineRunner.js +0 -326
- package/dist/sdk/pipeline/PipelineRunner.js.map +0 -1
- package/dist/sdk/pipeline/compiler.d.ts +0 -24
- package/dist/sdk/pipeline/compiler.d.ts.map +0 -1
- package/dist/sdk/pipeline/compiler.js +0 -199
- package/dist/sdk/pipeline/compiler.js.map +0 -1
- package/dist/sdk/pipeline/declarative.d.ts +0 -34
- package/dist/sdk/pipeline/declarative.d.ts.map +0 -1
- package/dist/sdk/pipeline/declarative.js +0 -9
- package/dist/sdk/pipeline/declarative.js.map +0 -1
- package/dist/sdk/pipeline/index.d.ts +0 -20
- package/dist/sdk/pipeline/index.d.ts.map +0 -1
- package/dist/sdk/pipeline/index.js +0 -19
- package/dist/sdk/pipeline/index.js.map +0 -1
- package/dist/sdk/pipeline/types.d.ts +0 -93
- package/dist/sdk/pipeline/types.d.ts.map +0 -1
- package/dist/sdk/pipeline/types.js +0 -10
- package/dist/sdk/pipeline/types.js.map +0 -1
- package/dist/sdk/policies.d.ts +0 -163
- package/dist/sdk/policies.d.ts.map +0 -1
- package/dist/sdk/policies.js +0 -243
- package/dist/sdk/policies.js.map +0 -1
- package/dist/sdk/runner/AgentRunner.d.ts +0 -22
- package/dist/sdk/runner/AgentRunner.d.ts.map +0 -1
- package/dist/sdk/runner/AgentRunner.js +0 -222
- package/dist/sdk/runner/AgentRunner.js.map +0 -1
- package/dist/sdk/runner/finalize.d.ts +0 -56
- package/dist/sdk/runner/finalize.d.ts.map +0 -1
- package/dist/sdk/runner/finalize.js +0 -155
- package/dist/sdk/runner/finalize.js.map +0 -1
- package/dist/sdk/runner/formats.d.ts +0 -7
- package/dist/sdk/runner/formats.d.ts.map +0 -1
- package/dist/sdk/runner/formats.js +0 -76
- package/dist/sdk/runner/formats.js.map +0 -1
- package/dist/sdk/runner/index.d.ts +0 -9
- package/dist/sdk/runner/index.d.ts.map +0 -1
- package/dist/sdk/runner/index.js +0 -9
- package/dist/sdk/runner/index.js.map +0 -1
- package/dist/sdk/runner/progress.d.ts +0 -3
- package/dist/sdk/runner/progress.d.ts.map +0 -1
- package/dist/sdk/runner/progress.js +0 -16
- package/dist/sdk/runner/progress.js.map +0 -1
- package/dist/sdk/schemas.d.ts +0 -72
- package/dist/sdk/schemas.d.ts.map +0 -1
- package/dist/sdk/schemas.js +0 -282
- package/dist/sdk/schemas.js.map +0 -1
- package/dist/sdk/trigger-context.d.ts +0 -24
- package/dist/sdk/trigger-context.d.ts.map +0 -1
- package/dist/sdk/trigger-context.js +0 -136
- package/dist/sdk/trigger-context.js.map +0 -1
- package/dist/session/SessionContext.d.ts +0 -89
- package/dist/session/SessionContext.d.ts.map +0 -1
- package/dist/session/SessionContext.js +0 -410
- package/dist/session/SessionContext.js.map +0 -1
- package/dist/session/environment.d.ts +0 -52
- package/dist/session/environment.d.ts.map +0 -1
- package/dist/session/environment.js +0 -27
- package/dist/session/environment.js.map +0 -1
- package/dist/session/history.d.ts +0 -18
- package/dist/session/history.d.ts.map +0 -1
- package/dist/session/history.js +0 -68
- package/dist/session/history.js.map +0 -1
- package/dist/session/index.d.ts +0 -10
- package/dist/session/index.d.ts.map +0 -1
- package/dist/session/index.js +0 -9
- package/dist/session/index.js.map +0 -1
- package/dist/session/serverData.d.ts +0 -38
- package/dist/session/serverData.d.ts.map +0 -1
- package/dist/session/serverData.js +0 -261
- package/dist/session/serverData.js.map +0 -1
- package/dist/tracing/pipelineHelpers.d.ts +0 -29
- package/dist/tracing/pipelineHelpers.d.ts.map +0 -1
- package/dist/tracing/pipelineHelpers.js +0 -224
- package/dist/tracing/pipelineHelpers.js.map +0 -1
- package/dist/tracking/Tracker.d.ts +0 -55
- package/dist/tracking/Tracker.d.ts.map +0 -1
- package/dist/tracking/Tracker.js +0 -217
- package/dist/tracking/Tracker.js.map +0 -1
- package/dist/tracking/index.d.ts +0 -8
- package/dist/tracking/index.d.ts.map +0 -1
- package/dist/tracking/index.js +0 -8
- package/dist/tracking/index.js.map +0 -1
- package/dist/tracking/schemas.d.ts +0 -292
- package/dist/tracking/schemas.d.ts.map +0 -1
- package/dist/tracking/schemas.js +0 -91
- package/dist/tracking/schemas.js.map +0 -1
- package/dist/utils/extractSetFlags.d.ts +0 -6
- package/dist/utils/extractSetFlags.d.ts.map +0 -1
- package/dist/utils/extractSetFlags.js +0 -16
- package/dist/utils/extractSetFlags.js.map +0 -1
- package/dist/utils/formatTimeAgo.d.ts +0 -2
- package/dist/utils/formatTimeAgo.d.ts.map +0 -1
- package/dist/utils/formatTimeAgo.js +0 -20
- package/dist/utils/formatTimeAgo.js.map +0 -1
- package/dist/utils/index.d.ts +0 -12
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -12
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/machineId.d.ts +0 -14
- package/dist/utils/machineId.d.ts.map +0 -1
- package/dist/utils/machineId.js +0 -66
- package/dist/utils/machineId.js.map +0 -1
- package/dist/utils/pathUtils.d.ts +0 -22
- package/dist/utils/pathUtils.d.ts.map +0 -1
- package/dist/utils/pathUtils.js +0 -54
- package/dist/utils/pathUtils.js.map +0 -1
- package/scripts/download-ripgrep.js +0 -269
|
@@ -0,0 +1,585 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `McpClientPool` — owns the connected `@modelcontextprotocol/sdk` `Client`
|
|
3
|
+
* instances for remote (Streamable HTTP / SSE) and stdio MCPs registered via
|
|
4
|
+
* `client.qar.registerMcp`. The SDK does not invent a wheel here — every
|
|
5
|
+
* piece of MCP protocol mechanics (JSON-RPC framing, initialize handshake,
|
|
6
|
+
* capability negotiation, tool listing, tool invocation) is owned by the
|
|
7
|
+
* canonical MCP TypeScript SDK; this pool is the thin facade that maps the
|
|
8
|
+
* SDK's `McpConfig` discriminator onto the right `Transport` constructor,
|
|
9
|
+
* holds the live `Client`, and dispatches `callTool` round-trips.
|
|
10
|
+
*
|
|
11
|
+
* **Lifecycle.**
|
|
12
|
+
* - `register(name, config)` is sync — it instantiates the right transport
|
|
13
|
+
* + `Client`, kicks off `client.connect(transport)` in the background,
|
|
14
|
+
* and stores the in-flight `Promise<void>` so `ready(name)` /
|
|
15
|
+
* `callTool(...)` can await it. Errors during connect surface as a
|
|
16
|
+
* typed {@link QodoMcpClientError} on the first awaited call.
|
|
17
|
+
* - `removeAndClose(name)` is fire-and-forget — closes the underlying
|
|
18
|
+
* `Client` if connected, awaits the in-flight connect if any, and
|
|
19
|
+
* drops the entry. Idempotent.
|
|
20
|
+
* - `dispose()` closes every entry in parallel. Called from
|
|
21
|
+
* `QodoClient.disconnect()`.
|
|
22
|
+
*
|
|
23
|
+
* **Tool catalog.** Each entry caches the result of `Client.listTools()`
|
|
24
|
+
* during connect. `resolveMcpForTool(name)` lets the SDK's generic
|
|
25
|
+
* `tool.request` bridge map a `ToolCall.name` string onto the owning MCP
|
|
26
|
+
* — accepting both bare names (`'search_qodo_documentation'`) and
|
|
27
|
+
* server-prefixed forms (`'qodo-docs.search_qodo_documentation'`,
|
|
28
|
+
* `'qodo-docs:search_qodo_documentation'`, `'qodo-docs/...'`). The
|
|
29
|
+
* prefix form is verified against the registered MCP set, but the suffix
|
|
30
|
+
* is not validated against the cached catalog — `callTool` round-trips
|
|
31
|
+
* the canonical "unknown tool" surface from the MCP itself.
|
|
32
|
+
*
|
|
33
|
+
* **Header substitution.** `${ENV_VAR}` references inside header values
|
|
34
|
+
* (and stdio `env` map values) are resolved against `process.env` at
|
|
35
|
+
* connect time. Preserved verbatim from SDK1's `mcpServers` ergonomic.
|
|
36
|
+
*
|
|
37
|
+
* **No backwards-compat shims.** This is the 2.x clean-slate path —
|
|
38
|
+
* the SDK does not adapt SDK1 configs at runtime. Consumers wiring
|
|
39
|
+
* SDK1 configs map them onto the new transport names at the call
|
|
40
|
+
* site.
|
|
41
|
+
*/
|
|
42
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
43
|
+
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
44
|
+
import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';
|
|
45
|
+
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
|
|
46
|
+
import { ToolListChangedNotificationSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
47
|
+
import { QodoMcpClientError, QodoMcpToolError } from '../errors.js';
|
|
48
|
+
import { substituteEnvInHeaders, substituteEnvInString } from './substituteEnv.js';
|
|
49
|
+
import { getCurrentVersion } from '../../version.js';
|
|
50
|
+
/** Bracketed prefix separators tried in `resolveMcpForTool` (registration order). */
|
|
51
|
+
const PREFIX_SEPARATORS = ['.', ':', '/'];
|
|
52
|
+
export class McpClientPool {
|
|
53
|
+
entries = new Map();
|
|
54
|
+
/**
|
|
55
|
+
* Register a remote / stdio MCP. Sync — the actual `Client.connect` runs
|
|
56
|
+
* in the background; the `entry.connect` promise is the seam every
|
|
57
|
+
* dependent surface (`ready`, `callTool`, `listTools`) awaits.
|
|
58
|
+
*
|
|
59
|
+
* **Atomic register.** {@link prepareEntry} constructs the `Client` +
|
|
60
|
+
* `Transport` (throws synchronously on bad URL) and stores no state;
|
|
61
|
+
* {@link commitEntry} installs the prepared entry into the pool and
|
|
62
|
+
* fires the background connect. Callers needing to sequence the
|
|
63
|
+
* prepare-then-commit cycle around their own state mutations should use
|
|
64
|
+
* the two-phase form (`QarRegistryClient.registerMcp` does this so a
|
|
65
|
+
* synchronous prepare throw never leaves the registry / pool / count
|
|
66
|
+
* out of sync). The single-call form is kept for ad-hoc callers
|
|
67
|
+
* (tests, future direct-pool consumers) — it just runs prepare +
|
|
68
|
+
* commit in sequence.
|
|
69
|
+
*
|
|
70
|
+
* Throws synchronously on the supported discriminators only (the
|
|
71
|
+
* `transport: 'sdk'` case never reaches here — `QarRegistryClient` routes
|
|
72
|
+
* those through the in-process handler). On any other discriminator the
|
|
73
|
+
* caller already passed a typescript-impossible shape; surface a runtime
|
|
74
|
+
* error rather than silently storing a never-callable entry.
|
|
75
|
+
*/
|
|
76
|
+
register(name, config) {
|
|
77
|
+
const prepared = this.prepareEntry(name, config);
|
|
78
|
+
this.commitEntry(name, prepared);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Two-phase commit, phase 1 — construct `Client` + `Transport` without
|
|
82
|
+
* mutating pool state. Throws synchronously on bad URL / unsupported
|
|
83
|
+
* transport. Cheap to discard if the caller's surrounding validation
|
|
84
|
+
* fails after this returns: nothing is fired up yet.
|
|
85
|
+
*/
|
|
86
|
+
prepareEntry(name, config) {
|
|
87
|
+
const client = new Client({ name: '@qodo/sdk', version: getCurrentVersion() }, { capabilities: {} });
|
|
88
|
+
let transport;
|
|
89
|
+
try {
|
|
90
|
+
transport = this.buildTransport(name, config);
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
const transportLabel = config.transport;
|
|
94
|
+
throw new QodoMcpClientError(name, transportLabel, `Failed to construct ${transportLabel} transport for MCP '${name}': ${errorMessage(err)}`, err);
|
|
95
|
+
}
|
|
96
|
+
return { client, transport, transportLabel: config.transport };
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Two-phase commit, phase 2 — install the prepared entry into the pool
|
|
100
|
+
* and fire the background connect. Never throws (the only failure mode
|
|
101
|
+
* was synchronous and already surfaced from {@link prepareEntry}).
|
|
102
|
+
* Overwrites any same-named entry without closing it; callers wanting
|
|
103
|
+
* close-then-replace semantics should call {@link removeAndClose}
|
|
104
|
+
* before this.
|
|
105
|
+
*/
|
|
106
|
+
commitEntry(name, prepared) {
|
|
107
|
+
// Mint an opaque identity token before firing `startConnect` so the
|
|
108
|
+
// async `listTools()` resolve path can detect that the entry it was
|
|
109
|
+
// filling has since been replaced (fast `removeAndClose → register`
|
|
110
|
+
// cycle on the same name).
|
|
111
|
+
const identity = Symbol(`mcp-pool-entry:${name}`);
|
|
112
|
+
const connect = this.startConnect(name, identity, prepared.transportLabel, prepared.client, prepared.transport);
|
|
113
|
+
// Suppress unobserved-rejection warnings — `connect` is the awaitable
|
|
114
|
+
// seam every dependent surface (`ready`, `callTool`, `listTools`) opts
|
|
115
|
+
// into. A consumer who never calls any of those (registered the MCP
|
|
116
|
+
// and dropped the client) would surface "UnhandledPromiseRejection"
|
|
117
|
+
// on connection failure without this guard; the extra `.catch(() => {})`
|
|
118
|
+
// doesn't suppress the rejection itself — waiters still see it via
|
|
119
|
+
// their own await/then handlers.
|
|
120
|
+
void connect.catch(() => {
|
|
121
|
+
/* unobserved-rejection guard; see comment above */
|
|
122
|
+
});
|
|
123
|
+
const entry = {
|
|
124
|
+
identity,
|
|
125
|
+
transport: prepared.transportLabel,
|
|
126
|
+
client: prepared.client,
|
|
127
|
+
connect,
|
|
128
|
+
tools: undefined,
|
|
129
|
+
closed: false,
|
|
130
|
+
};
|
|
131
|
+
this.entries.set(name, entry);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Resolve when the MCP's connect + tool-catalog pre-fetch have finished.
|
|
135
|
+
* Resolves immediately for unknown names (mirrors the idempotency posture
|
|
136
|
+
* of `removeAndClose`); rejects with `QodoMcpClientError` if connect
|
|
137
|
+
* failed.
|
|
138
|
+
*/
|
|
139
|
+
async ready(name) {
|
|
140
|
+
const entry = this.entries.get(name);
|
|
141
|
+
if (entry === undefined)
|
|
142
|
+
return;
|
|
143
|
+
await entry.connect;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Return the cached tool catalog. Awaits any in-flight connect.
|
|
147
|
+
* `undefined` for unknown names; throws `QodoMcpClientError` when the
|
|
148
|
+
* pool entry was closed before catalog resolution.
|
|
149
|
+
*/
|
|
150
|
+
async listTools(name) {
|
|
151
|
+
const entry = this.entries.get(name);
|
|
152
|
+
if (entry === undefined)
|
|
153
|
+
return undefined;
|
|
154
|
+
await entry.connect;
|
|
155
|
+
if (entry.closed) {
|
|
156
|
+
throw new QodoMcpClientError(name, entry.transport, `MCP '${name}' was closed before listTools resolved`);
|
|
157
|
+
}
|
|
158
|
+
return entry.tools;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Invoke `Client.callTool` against the named MCP. Awaits any in-flight
|
|
162
|
+
* connect. Errors:
|
|
163
|
+
* - Unknown MCP name → `QodoMcpClientError` (consumer registered the
|
|
164
|
+
* name with `transport: 'sdk'`, then asked the pool to dispatch —
|
|
165
|
+
* shouldn't happen via the SDK's own bridge, but defensive).
|
|
166
|
+
* - Connect failure → `QodoMcpClientError` (propagated from the
|
|
167
|
+
* stored `entry.connect` Promise).
|
|
168
|
+
* - `callTool` transport failure → `QodoMcpToolError` with the
|
|
169
|
+
* underlying error on `.cause`.
|
|
170
|
+
* - MCP envelope `isError: true` → `QodoMcpToolError` with `mcpResult`
|
|
171
|
+
* populated so callers can read the per-content array.
|
|
172
|
+
*/
|
|
173
|
+
async callTool(name, toolName, args) {
|
|
174
|
+
const entry = this.entries.get(name);
|
|
175
|
+
if (entry === undefined) {
|
|
176
|
+
throw new QodoMcpClientError(name, '(unregistered)', `MCP '${name}' is not registered in the remote/stdio pool`);
|
|
177
|
+
}
|
|
178
|
+
// Propagate connect failures verbatim — already a `QodoMcpClientError`.
|
|
179
|
+
await entry.connect;
|
|
180
|
+
if (entry.closed) {
|
|
181
|
+
throw new QodoMcpClientError(name, entry.transport, `MCP '${name}' was closed before callTool('${toolName}') dispatched`);
|
|
182
|
+
}
|
|
183
|
+
let result;
|
|
184
|
+
try {
|
|
185
|
+
// Pass `arguments` as a fresh shallow-clone — the MCP SDK consumes the
|
|
186
|
+
// params object directly, and consumers may pass frozen / Object.create
|
|
187
|
+
// shapes that the SDK's internal JSON serialization tolerates but we'd
|
|
188
|
+
// rather not couple to.
|
|
189
|
+
result = (await entry.client.callTool({
|
|
190
|
+
name: toolName,
|
|
191
|
+
arguments: { ...args },
|
|
192
|
+
}));
|
|
193
|
+
}
|
|
194
|
+
catch (err) {
|
|
195
|
+
throw new QodoMcpToolError(name, toolName, `MCP '${name}' tool '${toolName}' transport error: ${errorMessage(err)}`, { cause: err });
|
|
196
|
+
}
|
|
197
|
+
if (result.isError === true) {
|
|
198
|
+
// `content` is an MCP `Content[]`; the first text content (if any) is
|
|
199
|
+
// the conventional human-readable error. Preserve the full envelope
|
|
200
|
+
// on the typed error so consumers can introspect.
|
|
201
|
+
const firstText = result.content.find((c) => typeof c === 'object' && c !== null && c.type === 'text' &&
|
|
202
|
+
typeof c.text === 'string');
|
|
203
|
+
const message = firstText?.text ?? 'tool returned isError: true';
|
|
204
|
+
throw new QodoMcpToolError(name, toolName, `MCP '${name}' tool '${toolName}' returned an error: ${message}`, { mcpResult: { content: result.content, isError: true } });
|
|
205
|
+
}
|
|
206
|
+
return result;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Resolve a `ToolCall.name` string to the owning MCP + bare tool name.
|
|
210
|
+
* Prefix forms (`mcp.tool`, `mcp:tool`, `mcp/tool`) win over bare-name
|
|
211
|
+
* scanning when the prefix matches a registered MCP — disambiguates
|
|
212
|
+
* collisions when two MCPs advertise the same tool. Bare matching
|
|
213
|
+
* scans in registration order.
|
|
214
|
+
*/
|
|
215
|
+
resolveMcpForTool(toolNameOrPrefixed) {
|
|
216
|
+
// 1. Prefix forms first.
|
|
217
|
+
for (const sep of PREFIX_SEPARATORS) {
|
|
218
|
+
const idx = toolNameOrPrefixed.indexOf(sep);
|
|
219
|
+
if (idx <= 0)
|
|
220
|
+
continue;
|
|
221
|
+
const candidateMcp = toolNameOrPrefixed.slice(0, idx);
|
|
222
|
+
const candidateTool = toolNameOrPrefixed.slice(idx + sep.length);
|
|
223
|
+
if (candidateTool.length === 0)
|
|
224
|
+
continue;
|
|
225
|
+
if (this.entries.has(candidateMcp)) {
|
|
226
|
+
return { mcpName: candidateMcp, toolName: candidateTool };
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
// 2. Bare-name scan across cached catalogs.
|
|
230
|
+
for (const [mcpName, entry] of this.entries) {
|
|
231
|
+
if (entry.closed)
|
|
232
|
+
continue;
|
|
233
|
+
const catalog = entry.tools;
|
|
234
|
+
if (catalog === undefined)
|
|
235
|
+
continue;
|
|
236
|
+
for (const tool of catalog) {
|
|
237
|
+
if (tool.name === toolNameOrPrefixed) {
|
|
238
|
+
return { mcpName, toolName: toolNameOrPrefixed };
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return undefined;
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Close + drop the named entry. Idempotent on unknown names. Awaits the
|
|
246
|
+
* in-flight connect (best-effort — a still-connecting client must be
|
|
247
|
+
* given the chance to land before its `close()` works correctly) but
|
|
248
|
+
* never rethrows: close errors are logged via `console.error` with the
|
|
249
|
+
* `[@qodo/sdk]` breadcrumb prefix so structured-logging consumers see
|
|
250
|
+
* them, but the calling surface (`unregisterMcp`, `replace: true` flow,
|
|
251
|
+
* `dispose`) keeps its sync-ish contract.
|
|
252
|
+
*/
|
|
253
|
+
removeAndClose(name) {
|
|
254
|
+
const entry = this.entries.get(name);
|
|
255
|
+
if (entry === undefined)
|
|
256
|
+
return;
|
|
257
|
+
entry.closed = true;
|
|
258
|
+
this.entries.delete(name);
|
|
259
|
+
// Wait for connect to settle so close() runs against a fully-initialised
|
|
260
|
+
// client (or against a known-failed one — either way doesn't leak a
|
|
261
|
+
// half-open transport).
|
|
262
|
+
entry.connect
|
|
263
|
+
.catch(() => {
|
|
264
|
+
// Connect already failed — nothing to close.
|
|
265
|
+
return undefined;
|
|
266
|
+
})
|
|
267
|
+
.then(() => {
|
|
268
|
+
// After connect settles (resolved or swallowed), close the underlying
|
|
269
|
+
// protocol. `Client.close()` cleanly drives the transport close
|
|
270
|
+
// handler too.
|
|
271
|
+
return entry.client.close().catch((err) => {
|
|
272
|
+
// eslint-disable-next-line no-console
|
|
273
|
+
console.error(`[@qodo/sdk] failed to close MCP client '${name}' (transport=${entry.transport}): ${errorMessage(err)}`);
|
|
274
|
+
});
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Close every entry. Awaitable so `QodoClient.disconnect()` can sequence
|
|
279
|
+
* MCP teardown ahead of the WS close span's completion (the connect
|
|
280
|
+
* promises are awaited; close calls run in parallel).
|
|
281
|
+
*/
|
|
282
|
+
async dispose() {
|
|
283
|
+
const snapshot = [...this.entries.entries()];
|
|
284
|
+
this.entries.clear();
|
|
285
|
+
await Promise.all(snapshot.map(async ([name, entry]) => {
|
|
286
|
+
entry.closed = true;
|
|
287
|
+
// Do NOT bail on connect-rejection. The MCP SDK's `Client.connect()`
|
|
288
|
+
// may have already spawned a stdio child (or opened a fetch
|
|
289
|
+
// keep-alive) before the protocol-level initialize handshake
|
|
290
|
+
// failed; close() needs to run to reap those resources. Mirror
|
|
291
|
+
// `removeAndClose()`'s posture — swallow the connect failure,
|
|
292
|
+
// still call close.
|
|
293
|
+
try {
|
|
294
|
+
await entry.connect;
|
|
295
|
+
}
|
|
296
|
+
catch {
|
|
297
|
+
/* connect failed — fall through and close anyway */
|
|
298
|
+
}
|
|
299
|
+
try {
|
|
300
|
+
await entry.client.close();
|
|
301
|
+
}
|
|
302
|
+
catch (err) {
|
|
303
|
+
// eslint-disable-next-line no-console
|
|
304
|
+
console.error(`[@qodo/sdk] failed to close MCP client '${name}' during dispose (transport=${entry.transport}): ${errorMessage(err)}`);
|
|
305
|
+
}
|
|
306
|
+
}));
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Await every pending MCP's `connect + listTools` cycle. Used by the
|
|
310
|
+
* `tool.request` bridge before falling back to "unresolved" so a tool
|
|
311
|
+
* call arriving immediately after `registerMcp` (before the background
|
|
312
|
+
* connect populates the cached catalog) doesn't race-lose against a
|
|
313
|
+
* legitimate bare-name lookup.
|
|
314
|
+
*
|
|
315
|
+
* Failures on a per-MCP `connect` are swallowed (the resolver only
|
|
316
|
+
* needs the catalog to populate or fail definitively; it doesn't care
|
|
317
|
+
* about the failure mode — the next dispatch will surface the typed
|
|
318
|
+
* error via {@link callTool}). Resolves quickly when every entry
|
|
319
|
+
* already has a populated `tools` field.
|
|
320
|
+
*
|
|
321
|
+
* `timeoutMs` bounds the wait so a slow / unreachable MCP doesn't
|
|
322
|
+
* strand the dispatch hot path. If catalog population doesn't complete
|
|
323
|
+
* within the budget the resolver proceeds with whatever it currently
|
|
324
|
+
* has (typically: marks the call unresolved → bridge emits a
|
|
325
|
+
* deterministic error response). Default 250ms — short enough to keep
|
|
326
|
+
* the dispatch latency contract, long enough that a fast LAN MCP
|
|
327
|
+
* populates well inside the window.
|
|
328
|
+
*/
|
|
329
|
+
async waitForCatalogsToSettle(timeoutMs = 250) {
|
|
330
|
+
const pending = [];
|
|
331
|
+
for (const entry of this.entries.values()) {
|
|
332
|
+
if (entry.closed)
|
|
333
|
+
continue;
|
|
334
|
+
if (entry.tools !== undefined)
|
|
335
|
+
continue;
|
|
336
|
+
pending.push(entry.connect.catch(() => undefined));
|
|
337
|
+
}
|
|
338
|
+
if (pending.length === 0)
|
|
339
|
+
return;
|
|
340
|
+
let timer;
|
|
341
|
+
const timeout = new Promise((resolve) => {
|
|
342
|
+
timer = setTimeout(resolve, timeoutMs);
|
|
343
|
+
});
|
|
344
|
+
try {
|
|
345
|
+
await Promise.race([Promise.all(pending).then(() => undefined), timeout]);
|
|
346
|
+
}
|
|
347
|
+
finally {
|
|
348
|
+
if (timer !== undefined)
|
|
349
|
+
clearTimeout(timer);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
/** @internal — exposed for tests that need to inspect pool state. */
|
|
353
|
+
_hasEntry(name) {
|
|
354
|
+
return this.entries.has(name);
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* @internal — MCP projection layer sync accessor. Returns a snapshot
|
|
358
|
+
* `Map<mcpName, catalog>` where `catalog === undefined` means the MCP
|
|
359
|
+
* is registered but its `tools/list` pre-fetch hasn't populated (cold
|
|
360
|
+
* start or in-flight). Callers should `await waitForCatalogsToSettle()`
|
|
361
|
+
* first so `undefined` reliably means "unreachable", not "still loading".
|
|
362
|
+
*
|
|
363
|
+
* The returned map is detached from the pool — mutations don't write
|
|
364
|
+
* back; new pool entries after the snapshot don't appear.
|
|
365
|
+
*/
|
|
366
|
+
getCatalogSnapshot() {
|
|
367
|
+
const snapshot = new Map();
|
|
368
|
+
for (const [name, entry] of this.entries) {
|
|
369
|
+
if (entry.closed)
|
|
370
|
+
continue;
|
|
371
|
+
snapshot.set(name, entry.tools);
|
|
372
|
+
}
|
|
373
|
+
return snapshot;
|
|
374
|
+
}
|
|
375
|
+
/** @internal — list of every registered MCP name (closed entries excluded). */
|
|
376
|
+
listRegisteredNames() {
|
|
377
|
+
const names = [];
|
|
378
|
+
for (const [name, entry] of this.entries) {
|
|
379
|
+
if (entry.closed)
|
|
380
|
+
continue;
|
|
381
|
+
names.push(name);
|
|
382
|
+
}
|
|
383
|
+
return names;
|
|
384
|
+
}
|
|
385
|
+
// -------------------------------------------------------------------------
|
|
386
|
+
// Internals
|
|
387
|
+
// -------------------------------------------------------------------------
|
|
388
|
+
buildTransport(name, config) {
|
|
389
|
+
switch (config.transport) {
|
|
390
|
+
case 'remote-streamable-http':
|
|
391
|
+
return this.buildStreamableHttpTransport(config);
|
|
392
|
+
case 'remote-sse':
|
|
393
|
+
return this.buildSseTransport(config);
|
|
394
|
+
case 'stdio':
|
|
395
|
+
return this.buildStdioTransport(config);
|
|
396
|
+
default: {
|
|
397
|
+
// TS-exhaustive on McpConfig variants; the runtime branch exists so a
|
|
398
|
+
// JS caller (or a future un-narrowed discriminant) gets a typed error
|
|
399
|
+
// rather than `transport.start is not a function` later in the pipe.
|
|
400
|
+
const unknown = config;
|
|
401
|
+
throw new QodoMcpClientError(name, unknown.transport, `unsupported MCP transport '${unknown.transport}' for '${name}'`);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
buildStreamableHttpTransport(config) {
|
|
406
|
+
const url = new URL(config.url);
|
|
407
|
+
const resolvedHeaders = substituteEnvInHeaders(config.headers);
|
|
408
|
+
const baseInit = config.requestInit !== undefined ? { ...config.requestInit } : {};
|
|
409
|
+
if (resolvedHeaders !== undefined && Object.keys(resolvedHeaders).length > 0) {
|
|
410
|
+
// Use the fetch `Headers` API for the merge so case-insensitive
|
|
411
|
+
// replacement works correctly. Spread-merging plain records is
|
|
412
|
+
// case-SENSITIVE (`authorization` and `Authorization` are distinct
|
|
413
|
+
// keys); fetch then normalizes headers case-insensitively at request
|
|
414
|
+
// time and combines duplicate-by-name keys into a single
|
|
415
|
+
// comma-separated value — turning `{authorization: 'old',
|
|
416
|
+
// Authorization: 'Bearer new'}` into the invalid wire header
|
|
417
|
+
// `old, Bearer new`. The Headers API does case-insensitive set, so
|
|
418
|
+
// a same-name (case-insensitively) consumer-side header wins cleanly.
|
|
419
|
+
baseInit.headers = mergeHeadersCaseInsensitively(baseInit.headers, resolvedHeaders);
|
|
420
|
+
}
|
|
421
|
+
return new StreamableHTTPClientTransport(url, { requestInit: baseInit });
|
|
422
|
+
}
|
|
423
|
+
buildSseTransport(config) {
|
|
424
|
+
const url = new URL(config.url);
|
|
425
|
+
const resolvedHeaders = substituteEnvInHeaders(config.headers);
|
|
426
|
+
const init = resolvedHeaders !== undefined && Object.keys(resolvedHeaders).length > 0
|
|
427
|
+
? { headers: resolvedHeaders }
|
|
428
|
+
: undefined;
|
|
429
|
+
return new SSEClientTransport(url, init !== undefined ? { requestInit: init } : undefined);
|
|
430
|
+
}
|
|
431
|
+
buildStdioTransport(config) {
|
|
432
|
+
const resolvedEnv = config.env !== undefined
|
|
433
|
+
? Object.fromEntries(Object.entries(config.env).map(([k, v]) => [k, substituteEnvInString(v)]))
|
|
434
|
+
: undefined;
|
|
435
|
+
return new StdioClientTransport({
|
|
436
|
+
command: config.command,
|
|
437
|
+
args: config.args !== undefined ? [...config.args] : undefined,
|
|
438
|
+
env: resolvedEnv,
|
|
439
|
+
cwd: config.cwd,
|
|
440
|
+
});
|
|
441
|
+
}
|
|
442
|
+
startConnect(name, identity, transportLabel, client, transport) {
|
|
443
|
+
return (async () => {
|
|
444
|
+
try {
|
|
445
|
+
await client.connect(transport);
|
|
446
|
+
}
|
|
447
|
+
catch (err) {
|
|
448
|
+
throw new QodoMcpClientError(name, transportLabel, `Failed to connect to MCP '${name}' over ${transportLabel}: ${errorMessage(err)}`, err);
|
|
449
|
+
}
|
|
450
|
+
// Install the `tools/list_changed` notification handler
|
|
451
|
+
// IMMEDIATELY post-connect, BEFORE the initial `listTools`
|
|
452
|
+
// round-trip. An MCP that emits `list_changed` between the
|
|
453
|
+
// handshake and our first list call would otherwise have its
|
|
454
|
+
// notification land before any handler is wired and get dropped;
|
|
455
|
+
// the upstream MCP SDK queues notifications until a handler
|
|
456
|
+
// registers, but installing eagerly is the safe contract regardless.
|
|
457
|
+
//
|
|
458
|
+
// The handler is best-effort: it fires `client.listTools()` in
|
|
459
|
+
// the background, identity-checks the entry, and replaces the
|
|
460
|
+
// cached catalog. Failures (transport blip, MCP refusing the
|
|
461
|
+
// re-list) are logged but never thrown — the next task.start will
|
|
462
|
+
// see the previous catalog rather than the task hanging.
|
|
463
|
+
//
|
|
464
|
+
// Defensive `typeof` guard: every real
|
|
465
|
+
// `@modelcontextprotocol/sdk` `Client` has `setNotificationHandler`,
|
|
466
|
+
// but hand-rolled test fakes that bypass `prepareEntry` may not.
|
|
467
|
+
// Skipping the handler install on a non-conforming client keeps the
|
|
468
|
+
// pool usable in tests without coupling them to the real protocol.
|
|
469
|
+
if (typeof client.setNotificationHandler === 'function') {
|
|
470
|
+
client.setNotificationHandler(ToolListChangedNotificationSchema, () => {
|
|
471
|
+
// Don't await — fire-and-forget so the MCP SDK's notification
|
|
472
|
+
// pump keeps draining other notifications. The race against a
|
|
473
|
+
// concurrent in-flight refresh is handled by the identity
|
|
474
|
+
// check + last-write-wins semantics on `entry.tools`.
|
|
475
|
+
void this.refreshToolsForEntry(name, identity).catch((err) => {
|
|
476
|
+
// eslint-disable-next-line no-console
|
|
477
|
+
console.error(`[@qodo/sdk] tool catalog refresh failed to re-list tools for MCP '${name}' (transport=${transportLabel}): ${errorMessage(err)}`);
|
|
478
|
+
});
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
// Pre-fetch the tool catalog so bare-name resolution works on the
|
|
482
|
+
// first dispatch. A consumer who only needs `callTool` against a
|
|
483
|
+
// prefix-form name (`mcp.tool`) doesn't actually depend on this — the
|
|
484
|
+
// prefix path is keyed off the registered MCP set — but the cost is
|
|
485
|
+
// a single round-trip per MCP at connect time and the bare-name
|
|
486
|
+
// ergonomic (AgentSpec.tools[]) needs it.
|
|
487
|
+
try {
|
|
488
|
+
const result = await client.listTools();
|
|
489
|
+
// Re-check that the entry under this name is still the one we
|
|
490
|
+
// were filling. A fast `removeAndClose(name) → register(name, ...)`
|
|
491
|
+
// cycle while `listTools()` is in flight would otherwise let this
|
|
492
|
+
// resolution corrupt the new entry's catalog with the old client's
|
|
493
|
+
// tool list.
|
|
494
|
+
const entry = this.entries.get(name);
|
|
495
|
+
if (entry !== undefined && entry.identity === identity) {
|
|
496
|
+
entry.tools = result.tools ?? [];
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
catch (err) {
|
|
500
|
+
throw new QodoMcpClientError(name, transportLabel, `Failed to list tools from MCP '${name}' over ${transportLabel}: ${errorMessage(err)}`, err);
|
|
501
|
+
}
|
|
502
|
+
})();
|
|
503
|
+
}
|
|
504
|
+
/**
|
|
505
|
+
* Tool-catalog refresh helper. Re-fires `client.listTools()` against
|
|
506
|
+
* the same pool entry and replaces the cached catalog if the entry
|
|
507
|
+
* is still the one we're filling (identity check). Used by the
|
|
508
|
+
* `notifications/tools/list_changed` handler installed in
|
|
509
|
+
* {@link startConnect}.
|
|
510
|
+
*
|
|
511
|
+
* Identity-checked twice: once to find the entry before the round-
|
|
512
|
+
* trip (so a fast `removeAndClose` between notification and refresh
|
|
513
|
+
* skips the call entirely), and once after to avoid corrupting a
|
|
514
|
+
* post-replace entry with the prior client's results. Same pattern
|
|
515
|
+
* as the initial connect-time pre-fetch.
|
|
516
|
+
*/
|
|
517
|
+
async refreshToolsForEntry(name, identity) {
|
|
518
|
+
const entryBefore = this.entries.get(name);
|
|
519
|
+
if (entryBefore === undefined || entryBefore.identity !== identity)
|
|
520
|
+
return;
|
|
521
|
+
if (entryBefore.closed)
|
|
522
|
+
return;
|
|
523
|
+
const result = await entryBefore.client.listTools();
|
|
524
|
+
const entryAfter = this.entries.get(name);
|
|
525
|
+
if (entryAfter !== undefined && entryAfter.identity === identity && !entryAfter.closed) {
|
|
526
|
+
entryAfter.tools = result.tools ?? [];
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
function errorMessage(err) {
|
|
531
|
+
if (err instanceof Error)
|
|
532
|
+
return err.message;
|
|
533
|
+
return String(err);
|
|
534
|
+
}
|
|
535
|
+
/**
|
|
536
|
+
* Normalize any valid `RequestInit['headers']` shape (record, `Headers`
|
|
537
|
+
* instance, or `[string, string][]` tuple array) into a plain record so
|
|
538
|
+
* `{...existing, ...resolved}` merging works uniformly. Returns an empty
|
|
539
|
+
* record for the absent / unknown-shape cases — callers concat with
|
|
540
|
+
* resolved headers immediately after, so an empty base is correct.
|
|
541
|
+
*
|
|
542
|
+
* @deprecated Use {@link mergeHeadersCaseInsensitively} instead.
|
|
543
|
+
* Spread-merging is case-SENSITIVE which produces invalid duplicates
|
|
544
|
+
* that fetch then combines as `value-a, value-b`. Kept for parity with
|
|
545
|
+
* the pre-fix call sites (none remain in source).
|
|
546
|
+
*/
|
|
547
|
+
function headersInitAsRecord(headers) {
|
|
548
|
+
if (headers === undefined || headers === null)
|
|
549
|
+
return {};
|
|
550
|
+
if (typeof Headers !== 'undefined' && headers instanceof Headers) {
|
|
551
|
+
return Object.fromEntries(headers.entries());
|
|
552
|
+
}
|
|
553
|
+
if (Array.isArray(headers)) {
|
|
554
|
+
// Tuple array — each entry is `[name, value]`.
|
|
555
|
+
return Object.fromEntries(headers);
|
|
556
|
+
}
|
|
557
|
+
// Plain record (the typical case). Spread to a fresh object so the
|
|
558
|
+
// caller's merge doesn't mutate the consumer's input.
|
|
559
|
+
return { ...headers };
|
|
560
|
+
}
|
|
561
|
+
/**
|
|
562
|
+
* Case-insensitive header merge using the fetch `Headers` API.
|
|
563
|
+
* `Headers.set(name, value)` performs case-insensitive replacement, so a
|
|
564
|
+
* consumer-side `{ Authorization: '...' }` cleanly overwrites a
|
|
565
|
+
* `{ authorization: '...' }` that came in on `RequestInit.headers`
|
|
566
|
+
* (the typical case after an `${ENV_VAR}` substitution carried through
|
|
567
|
+
* a custom `requestInit`). Returns a fresh `Headers` instance so the
|
|
568
|
+
* consumer's input is not mutated.
|
|
569
|
+
*
|
|
570
|
+
* Exported for test access — tests must assert on the actual merged
|
|
571
|
+
* value, not just no-throw of the build step. Marked `@internal` so the
|
|
572
|
+
* documented public surface stays narrow.
|
|
573
|
+
*
|
|
574
|
+
* @internal
|
|
575
|
+
*/
|
|
576
|
+
export function mergeHeadersCaseInsensitively(base, overrides) {
|
|
577
|
+
// `new Headers(undefined)` is valid and produces an empty Headers.
|
|
578
|
+
// For arrays / records, the constructor accepts both shapes natively.
|
|
579
|
+
const h = new Headers(base === null ? undefined : base);
|
|
580
|
+
for (const [name, value] of Object.entries(overrides)) {
|
|
581
|
+
h.set(name, value);
|
|
582
|
+
}
|
|
583
|
+
return h;
|
|
584
|
+
}
|
|
585
|
+
//# sourceMappingURL=McpClientPool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"McpClientPool.js","sourceRoot":"","sources":["../../../src/client/mcp/McpClientPool.ts"],"names":[],"mappings":"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"}
|