@od-oneapp/ai-platform 0.1.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/README.md +235 -0
- package/dist/agents-base.d.mts +12 -0
- package/dist/agents-base.d.mts.map +1 -0
- package/dist/agents-base.mjs +20 -0
- package/dist/agents-base.mjs.map +1 -0
- package/dist/agents-control-flow.d.mts +115 -0
- package/dist/agents-control-flow.d.mts.map +1 -0
- package/dist/agents-control-flow.mjs +514 -0
- package/dist/agents-control-flow.mjs.map +1 -0
- package/dist/agents-coordinator.d.mts +11 -0
- package/dist/agents-coordinator.d.mts.map +1 -0
- package/dist/agents-coordinator.mjs +12 -0
- package/dist/agents-coordinator.mjs.map +1 -0
- package/dist/agents-experimental.d.mts +153 -0
- package/dist/agents-experimental.d.mts.map +1 -0
- package/dist/agents-experimental.mjs +580 -0
- package/dist/agents-experimental.mjs.map +1 -0
- package/dist/agents-fallback.d.mts +10 -0
- package/dist/agents-fallback.d.mts.map +1 -0
- package/dist/agents-fallback.mjs +15 -0
- package/dist/agents-fallback.mjs.map +1 -0
- package/dist/agents-multi-swarm.d.mts +9 -0
- package/dist/agents-multi-swarm.d.mts.map +1 -0
- package/dist/agents-multi-swarm.mjs +44 -0
- package/dist/agents-multi-swarm.mjs.map +1 -0
- package/dist/agents-multi.d.mts +10 -0
- package/dist/agents-multi.d.mts.map +1 -0
- package/dist/agents-multi.mjs +44 -0
- package/dist/agents-multi.mjs.map +1 -0
- package/dist/agents-observability.d.mts +161 -0
- package/dist/agents-observability.d.mts.map +1 -0
- package/dist/agents-observability.mjs +550 -0
- package/dist/agents-observability.mjs.map +1 -0
- package/dist/agents-patterns.d.mts +9 -0
- package/dist/agents-patterns.d.mts.map +1 -0
- package/dist/agents-patterns.mjs +18 -0
- package/dist/agents-patterns.mjs.map +1 -0
- package/dist/agents-persistence.d.mts +234 -0
- package/dist/agents-persistence.d.mts.map +1 -0
- package/dist/agents-persistence.mjs +447 -0
- package/dist/agents-persistence.mjs.map +1 -0
- package/dist/agents-triage.d.mts +11 -0
- package/dist/agents-triage.d.mts.map +1 -0
- package/dist/agents-triage.mjs +13 -0
- package/dist/agents-triage.mjs.map +1 -0
- package/dist/agents-workflows.d.mts +9 -0
- package/dist/agents-workflows.d.mts.map +1 -0
- package/dist/agents-workflows.mjs +9 -0
- package/dist/agents-workflows.mjs.map +1 -0
- package/dist/agents.d.mts +30 -0
- package/dist/agents.d.mts.map +1 -0
- package/dist/agents.mjs +50 -0
- package/dist/agents.mjs.map +1 -0
- package/dist/aggregation-8KJF1uzp.d.mts +276 -0
- package/dist/aggregation-8KJF1uzp.d.mts.map +1 -0
- package/dist/aggregation-BDop87kL.mjs +1180 -0
- package/dist/aggregation-BDop87kL.mjs.map +1 -0
- package/dist/ai-runtime-CDzQztTt.mjs +85 -0
- package/dist/ai-runtime-CDzQztTt.mjs.map +1 -0
- package/dist/ai-runtime-DIwOEc6g.d.mts +56 -0
- package/dist/ai-runtime-DIwOEc6g.d.mts.map +1 -0
- package/dist/ai-sdk-error-integration-D0GDqrM0.d.mts +553 -0
- package/dist/ai-sdk-error-integration-D0GDqrM0.d.mts.map +1 -0
- package/dist/approval-queue-BcDDQ4oQ.mjs +104 -0
- package/dist/approval-queue-BcDDQ4oQ.mjs.map +1 -0
- package/dist/approval-queue-CiKiFT9z.d.mts +21 -0
- package/dist/approval-queue-CiKiFT9z.d.mts.map +1 -0
- package/dist/audio-BzvN7r10.d.mts +79 -0
- package/dist/audio-BzvN7r10.d.mts.map +1 -0
- package/dist/audio-vBG_62ME.mjs +226 -0
- package/dist/audio-vBG_62ME.mjs.map +1 -0
- package/dist/audit-logger-Bb2JIcIk.d.mts +12 -0
- package/dist/audit-logger-Bb2JIcIk.d.mts.map +1 -0
- package/dist/audit-logger-CHIP8bRO.mjs +596 -0
- package/dist/audit-logger-CHIP8bRO.mjs.map +1 -0
- package/dist/auto-resume-BpUNbPtp.d.mts +160 -0
- package/dist/auto-resume-BpUNbPtp.d.mts.map +1 -0
- package/dist/auto-resume-BuFRNvAX.mjs +638 -0
- package/dist/auto-resume-BuFRNvAX.mjs.map +1 -0
- package/dist/budget-guard-C83KCH9V.d.mts +52 -0
- package/dist/budget-guard-C83KCH9V.d.mts.map +1 -0
- package/dist/budget-guard-d_b5rq4u.mjs +158 -0
- package/dist/budget-guard-d_b5rq4u.mjs.map +1 -0
- package/dist/budget-guard-gyhJS00s.mjs +234 -0
- package/dist/budget-guard-gyhJS00s.mjs.map +1 -0
- package/dist/buffer-BC8mvXHE.d.mts +98 -0
- package/dist/buffer-BC8mvXHE.d.mts.map +1 -0
- package/dist/buffer-CefJGbRy.mjs +289 -0
- package/dist/buffer-CefJGbRy.mjs.map +1 -0
- package/dist/caching-adapters.d.mts +5 -0
- package/dist/caching-adapters.mjs +3 -0
- package/dist/caching-strategies.d.mts +52 -0
- package/dist/caching-strategies.d.mts.map +1 -0
- package/dist/caching-strategies.mjs +703 -0
- package/dist/caching-strategies.mjs.map +1 -0
- package/dist/caching.d.mts +14 -0
- package/dist/caching.d.mts.map +1 -0
- package/dist/caching.mjs +15 -0
- package/dist/caching.mjs.map +1 -0
- package/dist/catalog.d.mts +19 -0
- package/dist/catalog.d.mts.map +1 -0
- package/dist/catalog.mjs +1114 -0
- package/dist/catalog.mjs.map +1 -0
- package/dist/chunk-CkzbjWQW.mjs +20 -0
- package/dist/circuit-breaker-DoKWPORd.mjs +262 -0
- package/dist/circuit-breaker-DoKWPORd.mjs.map +1 -0
- package/dist/circuit-breaker-Mey3E7tW.d.mts +64 -0
- package/dist/circuit-breaker-Mey3E7tW.d.mts.map +1 -0
- package/dist/citation-generator-C-9RpbHq.mjs +103 -0
- package/dist/citation-generator-C-9RpbHq.mjs.map +1 -0
- package/dist/citation-generator-CDSymDs_.d.mts +18 -0
- package/dist/citation-generator-CDSymDs_.d.mts.map +1 -0
- package/dist/client-CpacYDIE.mjs +882 -0
- package/dist/client-CpacYDIE.mjs.map +1 -0
- package/dist/client.d.mts +103 -0
- package/dist/client.d.mts.map +1 -0
- package/dist/client.mjs +470 -0
- package/dist/client.mjs.map +1 -0
- package/dist/compliance-approval-queue-DQGLojAm.mjs +172 -0
- package/dist/compliance-approval-queue-DQGLojAm.mjs.map +1 -0
- package/dist/compliance-approval-queue-IrMxFfSJ.d.mts +99 -0
- package/dist/compliance-approval-queue-IrMxFfSJ.d.mts.map +1 -0
- package/dist/compliance-wrapper-CrOMHhHN.mjs +528 -0
- package/dist/compliance-wrapper-CrOMHhHN.mjs.map +1 -0
- package/dist/conditions-DmQ6Y1Wt.mjs +179 -0
- package/dist/conditions-DmQ6Y1Wt.mjs.map +1 -0
- package/dist/conditions-zDrKfrc3.d.mts +42 -0
- package/dist/conditions-zDrKfrc3.d.mts.map +1 -0
- package/dist/console-BGMxxPZN.mjs +181 -0
- package/dist/console-BGMxxPZN.mjs.map +1 -0
- package/dist/console-DqEqZd4A.d.mts +76 -0
- package/dist/console-DqEqZd4A.d.mts.map +1 -0
- package/dist/controller-BOy3-xbC.mjs +501 -0
- package/dist/controller-BOy3-xbC.mjs.map +1 -0
- package/dist/controller-Y0NGosbJ.d.mts +104 -0
- package/dist/controller-Y0NGosbJ.d.mts.map +1 -0
- package/dist/coordinator-agent-BglqZLwo.d.mts +54 -0
- package/dist/coordinator-agent-BglqZLwo.d.mts.map +1 -0
- package/dist/coordinator-agent-WFWBRL-G.mjs +236 -0
- package/dist/coordinator-agent-WFWBRL-G.mjs.map +1 -0
- package/dist/crypto-8ABhc3TD.mjs +40 -0
- package/dist/crypto-8ABhc3TD.mjs.map +1 -0
- package/dist/environment-CSoJb0SW.mjs +255 -0
- package/dist/environment-CSoJb0SW.mjs.map +1 -0
- package/dist/error-handling-DNVkm6RY.mjs +1334 -0
- package/dist/error-handling-DNVkm6RY.mjs.map +1 -0
- package/dist/errors-CQ8tF4dP.mjs +985 -0
- package/dist/errors-CQ8tF4dP.mjs.map +1 -0
- package/dist/errors-CfYdVeum.d.mts +212 -0
- package/dist/errors-CfYdVeum.d.mts.map +1 -0
- package/dist/errors-Dtn-UeRi.mjs +61 -0
- package/dist/errors-Dtn-UeRi.mjs.map +1 -0
- package/dist/evaluator-Cs84qkr8.mjs +91 -0
- package/dist/evaluator-Cs84qkr8.mjs.map +1 -0
- package/dist/evaluator-optimizer-De67_mJC.mjs +1086 -0
- package/dist/evaluator-optimizer-De67_mJC.mjs.map +1 -0
- package/dist/evaluator-optimizer-pattern-B5939s2Z.mjs +367 -0
- package/dist/evaluator-optimizer-pattern-B5939s2Z.mjs.map +1 -0
- package/dist/evaluator-optimizer-pattern-D1AJrzBD.d.mts +72 -0
- package/dist/evaluator-optimizer-pattern-D1AJrzBD.d.mts.map +1 -0
- package/dist/factory-DP6VSl8C.mjs +307 -0
- package/dist/factory-DP6VSl8C.mjs.map +1 -0
- package/dist/generative-ui-catalog.d.mts +8 -0
- package/dist/generative-ui-catalog.d.mts.map +1 -0
- package/dist/generative-ui-catalog.mjs +679 -0
- package/dist/generative-ui-catalog.mjs.map +1 -0
- package/dist/generative-ui-registry.d.mts +195 -0
- package/dist/generative-ui-registry.d.mts.map +1 -0
- package/dist/generative-ui-registry.mjs +250 -0
- package/dist/generative-ui-registry.mjs.map +1 -0
- package/dist/generative-ui-stream.d.mts +23 -0
- package/dist/generative-ui-stream.d.mts.map +1 -0
- package/dist/generative-ui-stream.mjs +219 -0
- package/dist/generative-ui-stream.mjs.map +1 -0
- package/dist/generative-ui-types.d.mts +123 -0
- package/dist/generative-ui-types.d.mts.map +1 -0
- package/dist/generative-ui-types.mjs +1 -0
- package/dist/generative-ui.d.mts +13 -0
- package/dist/generative-ui.d.mts.map +1 -0
- package/dist/generative-ui.mjs +21 -0
- package/dist/generative-ui.mjs.map +1 -0
- package/dist/governance-audit.d.mts +3 -0
- package/dist/governance-audit.mjs +3 -0
- package/dist/governance-compliance.d.mts +5 -0
- package/dist/governance-compliance.mjs +4 -0
- package/dist/governance-policies.d.mts +4 -0
- package/dist/governance-policies.mjs +4 -0
- package/dist/governance-tenancy.d.mts +3 -0
- package/dist/governance-tenancy.mjs +3 -0
- package/dist/governance.d.mts +88 -0
- package/dist/governance.d.mts.map +1 -0
- package/dist/governance.mjs +432 -0
- package/dist/governance.mjs.map +1 -0
- package/dist/grounding-attribution.d.mts +63 -0
- package/dist/grounding-attribution.d.mts.map +1 -0
- package/dist/grounding-attribution.mjs +259 -0
- package/dist/grounding-attribution.mjs.map +1 -0
- package/dist/grounding-citation.d.mts +2 -0
- package/dist/grounding-citation.mjs +3 -0
- package/dist/grounding-context.d.mts +9 -0
- package/dist/grounding-context.d.mts.map +1 -0
- package/dist/grounding-context.mjs +19 -0
- package/dist/grounding-context.mjs.map +1 -0
- package/dist/grounding-embed.d.mts +102 -0
- package/dist/grounding-embed.d.mts.map +1 -0
- package/dist/grounding-embed.mjs +417 -0
- package/dist/grounding-embed.mjs.map +1 -0
- package/dist/grounding-hallucination.d.mts +44 -0
- package/dist/grounding-hallucination.d.mts.map +1 -0
- package/dist/grounding-hallucination.mjs +115 -0
- package/dist/grounding-hallucination.mjs.map +1 -0
- package/dist/grounding-proof-map.d.mts +9 -0
- package/dist/grounding-proof-map.d.mts.map +1 -0
- package/dist/grounding-proof-map.mjs +26 -0
- package/dist/grounding-proof-map.mjs.map +1 -0
- package/dist/grounding-rag.d.mts +10 -0
- package/dist/grounding-rag.d.mts.map +1 -0
- package/dist/grounding-rag.mjs +27 -0
- package/dist/grounding-rag.mjs.map +1 -0
- package/dist/grounding-verification.d.mts +48 -0
- package/dist/grounding-verification.d.mts.map +1 -0
- package/dist/grounding-verification.mjs +224 -0
- package/dist/grounding-verification.mjs.map +1 -0
- package/dist/grounding.d.mts +24 -0
- package/dist/grounding.d.mts.map +1 -0
- package/dist/grounding.mjs +77 -0
- package/dist/grounding.mjs.map +1 -0
- package/dist/hitl-active-learning.d.mts +41 -0
- package/dist/hitl-active-learning.d.mts.map +1 -0
- package/dist/hitl-active-learning.mjs +178 -0
- package/dist/hitl-active-learning.mjs.map +1 -0
- package/dist/hitl-annotation.d.mts +74 -0
- package/dist/hitl-annotation.d.mts.map +1 -0
- package/dist/hitl-annotation.mjs +170 -0
- package/dist/hitl-annotation.mjs.map +1 -0
- package/dist/hitl-approval.d.mts +2 -0
- package/dist/hitl-approval.mjs +3 -0
- package/dist/hitl-feedback.d.mts +59 -0
- package/dist/hitl-feedback.d.mts.map +1 -0
- package/dist/hitl-feedback.mjs +137 -0
- package/dist/hitl-feedback.mjs.map +1 -0
- package/dist/hitl-review.d.mts +2 -0
- package/dist/hitl-review.mjs +3 -0
- package/dist/hitl.d.mts +14 -0
- package/dist/hitl.d.mts.map +1 -0
- package/dist/hitl.mjs +22 -0
- package/dist/hitl.mjs.map +1 -0
- package/dist/index-B17HT-VL.d.mts +285 -0
- package/dist/index-B17HT-VL.d.mts.map +1 -0
- package/dist/index-BDwgsK9B.d.mts +101 -0
- package/dist/index-BDwgsK9B.d.mts.map +1 -0
- package/dist/index-BGgMn_Ev.d.mts +2615 -0
- package/dist/index-BGgMn_Ev.d.mts.map +1 -0
- package/dist/index-DOqe5r9G.d.mts +318 -0
- package/dist/index-DOqe5r9G.d.mts.map +1 -0
- package/dist/index-DotINT7o.d.mts +1004 -0
- package/dist/index-DotINT7o.d.mts.map +1 -0
- package/dist/index-URlW7aD1.d.mts +67 -0
- package/dist/index-URlW7aD1.d.mts.map +1 -0
- package/dist/index.d.mts +64 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +46 -0
- package/dist/index.mjs.map +1 -0
- package/dist/integrations-blob-storage.d.mts +25 -0
- package/dist/integrations-blob-storage.d.mts.map +1 -0
- package/dist/integrations-blob-storage.mjs +3 -0
- package/dist/integrations-notifications.d.mts +2 -0
- package/dist/integrations-notifications.mjs +3 -0
- package/dist/integrations-rate-limit.d.mts +27 -0
- package/dist/integrations-rate-limit.d.mts.map +1 -0
- package/dist/integrations-rate-limit.mjs +30 -0
- package/dist/integrations-rate-limit.mjs.map +1 -0
- package/dist/integrations-redis.d.mts +3 -0
- package/dist/integrations-redis.mjs +3 -0
- package/dist/integrations-stream.d.mts +14 -0
- package/dist/integrations-stream.d.mts.map +1 -0
- package/dist/integrations-stream.mjs +3 -0
- package/dist/integrations.d.mts +7 -0
- package/dist/integrations.mjs +7 -0
- package/dist/log-adapter-BLegSZtz.d.mts +16 -0
- package/dist/log-adapter-BLegSZtz.d.mts.map +1 -0
- package/dist/log-adapter-PPe_2Pwv.mjs +28 -0
- package/dist/log-adapter-PPe_2Pwv.mjs.map +1 -0
- package/dist/loop-BOYEtr2g.mjs +520 -0
- package/dist/loop-BOYEtr2g.mjs.map +1 -0
- package/dist/loop-C-tBBOqi.d.mts +219 -0
- package/dist/loop-C-tBBOqi.d.mts.map +1 -0
- package/dist/middleware-5wQ9bANW.mjs +306 -0
- package/dist/middleware-5wQ9bANW.mjs.map +1 -0
- package/dist/middleware-C1apSrj0.mjs +613 -0
- package/dist/middleware-C1apSrj0.mjs.map +1 -0
- package/dist/middleware-C7k0uItW.d.mts +9 -0
- package/dist/middleware-C7k0uItW.d.mts.map +1 -0
- package/dist/middleware-CZQCTHfl.mjs +366 -0
- package/dist/middleware-CZQCTHfl.mjs.map +1 -0
- package/dist/models.d.mts +11 -0
- package/dist/models.d.mts.map +1 -0
- package/dist/models.mjs +32 -0
- package/dist/models.mjs.map +1 -0
- package/dist/observability-analytics.d.mts +107 -0
- package/dist/observability-analytics.d.mts.map +1 -0
- package/dist/observability-analytics.mjs +409 -0
- package/dist/observability-analytics.mjs.map +1 -0
- package/dist/observability-cost.d.mts +10 -0
- package/dist/observability-cost.d.mts.map +1 -0
- package/dist/observability-cost.mjs +15 -0
- package/dist/observability-cost.mjs.map +1 -0
- package/dist/observability-telemetry.d.mts +111 -0
- package/dist/observability-telemetry.d.mts.map +1 -0
- package/dist/observability-telemetry.mjs +343 -0
- package/dist/observability-telemetry.mjs.map +1 -0
- package/dist/observability-tracing.d.mts +10 -0
- package/dist/observability-tracing.d.mts.map +1 -0
- package/dist/observability-tracing.mjs +17 -0
- package/dist/observability-tracing.mjs.map +1 -0
- package/dist/observability.d.mts +15 -0
- package/dist/observability.d.mts.map +1 -0
- package/dist/observability.mjs +17 -0
- package/dist/observability.mjs.map +1 -0
- package/dist/optimizer-DhXXpci6.mjs +97 -0
- package/dist/optimizer-DhXXpci6.mjs.map +1 -0
- package/dist/output-multimodal.d.mts +9 -0
- package/dist/output-multimodal.d.mts.map +1 -0
- package/dist/output-multimodal.mjs +18 -0
- package/dist/output-multimodal.mjs.map +1 -0
- package/dist/output.d.mts +11 -0
- package/dist/output.d.mts.map +1 -0
- package/dist/output.mjs +40 -0
- package/dist/output.mjs.map +1 -0
- package/dist/pii-filter-3AxmYSiu.d.mts +23 -0
- package/dist/pii-filter-3AxmYSiu.d.mts.map +1 -0
- package/dist/pipelines.d.mts +448 -0
- package/dist/pipelines.d.mts.map +1 -0
- package/dist/pipelines.mjs +1534 -0
- package/dist/pipelines.mjs.map +1 -0
- package/dist/prompt-injection-DQXchzsV.d.mts +8 -0
- package/dist/prompt-injection-DQXchzsV.d.mts.map +1 -0
- package/dist/prompt-injection-RpoLPwSa.mjs +52 -0
- package/dist/prompt-injection-RpoLPwSa.mjs.map +1 -0
- package/dist/prompts.d.mts +192 -0
- package/dist/prompts.d.mts.map +1 -0
- package/dist/prompts.mjs +732 -0
- package/dist/prompts.mjs.map +1 -0
- package/dist/protocol-DfBiEsnl.d.mts +112 -0
- package/dist/protocol-DfBiEsnl.d.mts.map +1 -0
- package/dist/quota-manager-0iPMkQWN.d.mts +62 -0
- package/dist/quota-manager-0iPMkQWN.d.mts.map +1 -0
- package/dist/quota-manager-D_N7FuQ2.mjs +180 -0
- package/dist/quota-manager-D_N7FuQ2.mjs.map +1 -0
- package/dist/redaction-utils-DcQwsiNh.mjs +438 -0
- package/dist/redaction-utils-DcQwsiNh.mjs.map +1 -0
- package/dist/redis-CpsSrF8K.mjs +102 -0
- package/dist/redis-CpsSrF8K.mjs.map +1 -0
- package/dist/redis-CwguYFGh.d.mts +33 -0
- package/dist/redis-CwguYFGh.d.mts.map +1 -0
- package/dist/registry-CsD3iTIx.mjs +190 -0
- package/dist/registry-CsD3iTIx.mjs.map +1 -0
- package/dist/registry-DVPWzkXR.d.mts +36 -0
- package/dist/registry-DVPWzkXR.d.mts.map +1 -0
- package/dist/reranking-BpWYhYzl.d.mts +72 -0
- package/dist/reranking-BpWYhYzl.d.mts.map +1 -0
- package/dist/reranking-Ck8aKZW7.mjs +331 -0
- package/dist/reranking-Ck8aKZW7.mjs.map +1 -0
- package/dist/resumable-adapter-CO1HtsgJ.mjs +21 -0
- package/dist/resumable-adapter-CO1HtsgJ.mjs.map +1 -0
- package/dist/review-trigger-DmAsiQlM.d.mts +24 -0
- package/dist/review-trigger-DmAsiQlM.d.mts.map +1 -0
- package/dist/review-trigger-DwXfpww9.mjs +112 -0
- package/dist/review-trigger-DwXfpww9.mjs.map +1 -0
- package/dist/safe-context-BynhkTKR.d.mts +54 -0
- package/dist/safe-context-BynhkTKR.d.mts.map +1 -0
- package/dist/safe-context-C5A3Wv3b.mjs +143 -0
- package/dist/safe-context-C5A3Wv3b.mjs.map +1 -0
- package/dist/schema-Bu2noOZ4.mjs +27 -0
- package/dist/schema-Bu2noOZ4.mjs.map +1 -0
- package/dist/schema-CwFvuCnA.mjs +97 -0
- package/dist/schema-CwFvuCnA.mjs.map +1 -0
- package/dist/schema-Wz-1-ro9.d.mts +37 -0
- package/dist/schema-Wz-1-ro9.d.mts.map +1 -0
- package/dist/schemas-CxQtxIga.mjs +62 -0
- package/dist/schemas-CxQtxIga.mjs.map +1 -0
- package/dist/schemas-DBOhxgW7.d.mts +32 -0
- package/dist/schemas-DBOhxgW7.d.mts.map +1 -0
- package/dist/schemas-Dp_OCqBt.d.mts +63 -0
- package/dist/schemas-Dp_OCqBt.d.mts.map +1 -0
- package/dist/schemas-SwCsnT0z.mjs +83 -0
- package/dist/schemas-SwCsnT0z.mjs.map +1 -0
- package/dist/sdk-errors.d.mts +2 -0
- package/dist/sdk-errors.mjs +3 -0
- package/dist/sdk-experimental.d.mts +59 -0
- package/dist/sdk-experimental.d.mts.map +1 -0
- package/dist/sdk-experimental.mjs +193 -0
- package/dist/sdk-experimental.mjs.map +1 -0
- package/dist/sdk-stop-conditions.d.mts +3 -0
- package/dist/sdk-stop-conditions.mjs +3 -0
- package/dist/sdk.d.mts +15 -0
- package/dist/sdk.d.mts.map +1 -0
- package/dist/sdk.mjs +50 -0
- package/dist/sdk.mjs.map +1 -0
- package/dist/security-guardrails.d.mts +3 -0
- package/dist/security-guardrails.mjs +3 -0
- package/dist/security-injection.d.mts +2 -0
- package/dist/security-injection.mjs +3 -0
- package/dist/security.d.mts +12 -0
- package/dist/security.d.mts.map +1 -0
- package/dist/security.mjs +18 -0
- package/dist/security.mjs.map +1 -0
- package/dist/server.d.mts +420 -0
- package/dist/server.d.mts.map +1 -0
- package/dist/server.mjs +2225 -0
- package/dist/server.mjs.map +1 -0
- package/dist/shared.d.mts +2 -0
- package/dist/shared.mjs +3 -0
- package/dist/streaming-control.d.mts +2 -0
- package/dist/streaming-control.mjs +4 -0
- package/dist/streaming-core.d.mts +4 -0
- package/dist/streaming-core.mjs +3 -0
- package/dist/streaming-infra-resilience.d.mts +120 -0
- package/dist/streaming-infra-resilience.d.mts.map +1 -0
- package/dist/streaming-infra-resilience.mjs +358 -0
- package/dist/streaming-infra-resilience.mjs.map +1 -0
- package/dist/streaming-infra-transport.d.mts +57 -0
- package/dist/streaming-infra-transport.d.mts.map +1 -0
- package/dist/streaming-infra-transport.mjs +488 -0
- package/dist/streaming-infra-transport.mjs.map +1 -0
- package/dist/streaming-infra.d.mts +5 -0
- package/dist/streaming-infra.mjs +5 -0
- package/dist/streaming.d.mts +17 -0
- package/dist/streaming.d.mts.map +1 -0
- package/dist/streaming.mjs +71 -0
- package/dist/streaming.mjs.map +1 -0
- package/dist/telemetry-2eKMojIb.mjs +1046 -0
- package/dist/telemetry-2eKMojIb.mjs.map +1 -0
- package/dist/telemetry-C2t03dwD.d.mts +59 -0
- package/dist/telemetry-C2t03dwD.d.mts.map +1 -0
- package/dist/tool-Btbththq.d.mts +253 -0
- package/dist/tool-Btbththq.d.mts.map +1 -0
- package/dist/tool-JSf8JXZ8.mjs +1150 -0
- package/dist/tool-JSf8JXZ8.mjs.map +1 -0
- package/dist/tool-safety-CZO8a4D4.d.mts +60 -0
- package/dist/tool-safety-CZO8a4D4.d.mts.map +1 -0
- package/dist/tool-safety-DXtYDXod.mjs +319 -0
- package/dist/tool-safety-DXtYDXod.mjs.map +1 -0
- package/dist/tools-BuS2Uv0q.mjs +1708 -0
- package/dist/tools-BuS2Uv0q.mjs.map +1 -0
- package/dist/tools-approval.d.mts +99 -0
- package/dist/tools-approval.d.mts.map +1 -0
- package/dist/tools-approval.mjs +395 -0
- package/dist/tools-approval.mjs.map +1 -0
- package/dist/tools-compliance.d.mts +67 -0
- package/dist/tools-compliance.d.mts.map +1 -0
- package/dist/tools-compliance.mjs +330 -0
- package/dist/tools-compliance.mjs.map +1 -0
- package/dist/tools-computer.d.mts +25 -0
- package/dist/tools-computer.d.mts.map +1 -0
- package/dist/tools-computer.mjs +64 -0
- package/dist/tools-computer.mjs.map +1 -0
- package/dist/tools-core.d.mts +3 -0
- package/dist/tools-core.mjs +3 -0
- package/dist/tools-mcp.d.mts +3 -0
- package/dist/tools-mcp.mjs +5 -0
- package/dist/tools-superpowers.d.mts +2 -0
- package/dist/tools-superpowers.mjs +3 -0
- package/dist/tools.d.mts +401 -0
- package/dist/tools.d.mts.map +1 -0
- package/dist/tools.mjs +1921 -0
- package/dist/tools.mjs.map +1 -0
- package/dist/transport-selector-D-Ib05X1.mjs +1936 -0
- package/dist/transport-selector-D-Ib05X1.mjs.map +1 -0
- package/dist/triage-agent-BEsXg5sw.d.mts +63 -0
- package/dist/triage-agent-BEsXg5sw.d.mts.map +1 -0
- package/dist/triage-agent-CBsfX-HW.mjs +167 -0
- package/dist/triage-agent-CBsfX-HW.mjs.map +1 -0
- package/dist/types-BPnq3GQo.d.mts +23 -0
- package/dist/types-BPnq3GQo.d.mts.map +1 -0
- package/dist/types-BjWgimpY.d.mts +16 -0
- package/dist/types-BjWgimpY.d.mts.map +1 -0
- package/dist/types-BxD-5btB.d.mts +41 -0
- package/dist/types-BxD-5btB.d.mts.map +1 -0
- package/dist/types-By-r93bE.d.mts +36 -0
- package/dist/types-By-r93bE.d.mts.map +1 -0
- package/dist/types-CLBWFRZN.d.mts +69 -0
- package/dist/types-CLBWFRZN.d.mts.map +1 -0
- package/dist/types-CQ0HFd0u.d.mts +62 -0
- package/dist/types-CQ0HFd0u.d.mts.map +1 -0
- package/dist/types-D3zJb59_.d.mts +47 -0
- package/dist/types-D3zJb59_.d.mts.map +1 -0
- package/dist/types-DJnugQX0.d.mts +80 -0
- package/dist/types-DJnugQX0.d.mts.map +1 -0
- package/dist/types-DbUfMCnT.d.mts +70 -0
- package/dist/types-DbUfMCnT.d.mts.map +1 -0
- package/dist/upstash-adapter-D96Caq2O.mjs +22 -0
- package/dist/upstash-adapter-D96Caq2O.mjs.map +1 -0
- package/dist/upstash-adapter-DD4433dx.d.mts +8 -0
- package/dist/upstash-adapter-DD4433dx.d.mts.map +1 -0
- package/dist/utils-BlYhcD6M.mjs +319 -0
- package/dist/utils-BlYhcD6M.mjs.map +1 -0
- package/dist/utils-DpJGOb3y.d.mts +120 -0
- package/dist/utils-DpJGOb3y.d.mts.map +1 -0
- package/dist/vercel-blob-adapter-CkOXLT2D.mjs +25 -0
- package/dist/vercel-blob-adapter-CkOXLT2D.mjs.map +1 -0
- package/dist/xai-CbV_dCnP.mjs +1600 -0
- package/dist/xai-CbV_dCnP.mjs.map +1 -0
- package/package.json +479 -0
- package/src/agents/base/factory.ts +382 -0
- package/src/agents/base/index.ts +8 -0
- package/src/agents/base/schemas.ts +117 -0
- package/src/agents/base/types.ts +192 -0
- package/src/agents/control-flow/index.ts +683 -0
- package/src/agents/coordinator/coordinator-agent.ts +381 -0
- package/src/agents/coordinator/index.ts +6 -0
- package/src/agents/default-agent.ts +211 -0
- package/src/agents/evaluator-optimizer/README.md +612 -0
- package/src/agents/evaluator-optimizer/evaluator-optimizer.example.ts +437 -0
- package/src/agents/evaluator-optimizer/evaluator.ts +282 -0
- package/src/agents/evaluator-optimizer/index.test.ts +416 -0
- package/src/agents/evaluator-optimizer/index.ts +519 -0
- package/src/agents/evaluator-optimizer/optimizer.ts +322 -0
- package/src/agents/evaluator-optimizer/schema.ts +302 -0
- package/src/agents/evaluator-optimizer/utils.ts +42 -0
- package/src/agents/experimental/index.ts +1095 -0
- package/src/agents/experimental/types.ts +212 -0
- package/src/agents/fallback/index.ts +18 -0
- package/src/agents/fallback/recovery/circuit-breaker.ts +166 -0
- package/src/agents/fallback/strategies/model-fallback.ts +192 -0
- package/src/agents/fallback/types.ts +87 -0
- package/src/agents/governance-agent.ts +446 -0
- package/src/agents/index.ts +79 -0
- package/src/agents/multi/coordination/index.ts +6 -0
- package/src/agents/multi/coordination/message-bus.ts +144 -0
- package/src/agents/multi/index.ts +6 -0
- package/src/agents/multi/state/index.ts +162 -0
- package/src/agents/multi/supervisor/index.ts +7 -0
- package/src/agents/multi/supervisor/supervisor.ts +254 -0
- package/src/agents/multi/swarm/aggregation.ts +466 -0
- package/src/agents/multi/swarm/communication.ts +388 -0
- package/src/agents/multi/swarm/coordination.ts +380 -0
- package/src/agents/multi/swarm/index.ts +73 -0
- package/src/agents/multi/swarm/swarm-executor.ts +479 -0
- package/src/agents/multi/types.ts +181 -0
- package/src/agents/observability/index.ts +914 -0
- package/src/agents/orchestrator.ts +218 -0
- package/src/agents/patterns/README.md +512 -0
- package/src/agents/patterns/evaluator-optimizer-pattern.example.ts +455 -0
- package/src/agents/patterns/evaluator-optimizer-pattern.ts +653 -0
- package/src/agents/patterns/index.ts +26 -0
- package/src/agents/persistence/index.ts +726 -0
- package/src/agents/tools/index.ts +291 -0
- package/src/agents/tools/mcp.ts +188 -0
- package/src/agents/triage/index.ts +6 -0
- package/src/agents/triage/triage-agent.ts +280 -0
- package/src/agents/workflows/index.ts +6 -0
- package/src/agents/workflows/interfaces.ts +36 -0
- package/src/agents/workflows/schema.ts +20 -0
- package/src/caching/adapters/index.ts +7 -0
- package/src/caching/adapters/memory.ts +77 -0
- package/src/caching/adapters/redis.ts +60 -0
- package/src/caching/index.ts +17 -0
- package/src/caching/middleware.ts +452 -0
- package/src/caching/strategies/index.ts +1008 -0
- package/src/caching/types.ts +47 -0
- package/src/catalog.ts +921 -0
- package/src/client/chat-usage.ts +53 -0
- package/src/client/hooks.ts +343 -0
- package/src/client/index.ts +36 -0
- package/src/client/message-utils.ts +29 -0
- package/src/client/use-generative-ui.ts +174 -0
- package/src/client/utils.ts +66 -0
- package/src/generative-ui/catalog.ts +653 -0
- package/src/generative-ui/index.ts +82 -0
- package/src/generative-ui/registry.ts +273 -0
- package/src/generative-ui/stream.ts +324 -0
- package/src/generative-ui/types.ts +376 -0
- package/src/governance/audit/audit-logger.ts +239 -0
- package/src/governance/audit/audit-schema.ts +82 -0
- package/src/governance/audit/index.ts +6 -0
- package/src/governance/compliance/abac/policy-engine.ts +175 -0
- package/src/governance/compliance/abac/types.ts +40 -0
- package/src/governance/compliance/approval/compliance-approval-queue.ts +217 -0
- package/src/governance/compliance/index.ts +16 -0
- package/src/governance/compliance/schemas.ts +68 -0
- package/src/governance/compliance/types.ts +143 -0
- package/src/governance/compliance/validators/phi-detector.ts +145 -0
- package/src/governance/compliance/validators/redaction-utils.ts +176 -0
- package/src/governance/compliance/validators/safe-harbor.ts +135 -0
- package/src/governance/entitlements/index.ts +585 -0
- package/src/governance/entitlements/middleware.ts +651 -0
- package/src/governance/entitlements/rate-limiter.ts +711 -0
- package/src/governance/index.ts +32 -0
- package/src/governance/policies/guardrails.ts +1121 -0
- package/src/governance/policies/index.ts +42 -0
- package/src/governance/policies/loop-controls.ts +136 -0
- package/src/governance/policies/telemetry.ts +63 -0
- package/src/governance/tenancy/index.ts +30 -0
- package/src/governance/tenancy/isolation/context.ts +92 -0
- package/src/governance/tenancy/isolation/index.ts +13 -0
- package/src/governance/tenancy/quotas/index.ts +11 -0
- package/src/governance/tenancy/quotas/quota-manager.ts +180 -0
- package/src/governance/tenancy/types.ts +66 -0
- package/src/governance/types.ts +16 -0
- package/src/governance/versioning/index.ts +573 -0
- package/src/grounding/attribution/index.ts +424 -0
- package/src/grounding/citation/citation-generator.ts +174 -0
- package/src/grounding/citation/index.ts +12 -0
- package/src/grounding/context/index.ts +32 -0
- package/src/grounding/context/safe-context.ts +116 -0
- package/src/grounding/context/types.ts +62 -0
- package/src/grounding/context-engineering/error-handling.ts +359 -0
- package/src/grounding/context-engineering/index.ts +23 -0
- package/src/grounding/context-engineering/memory.ts +559 -0
- package/src/grounding/context-engineering/tool-masking.ts +338 -0
- package/src/grounding/embed/index.ts +704 -0
- package/src/grounding/embed/reranking.ts +604 -0
- package/src/grounding/hallucination/index.ts +223 -0
- package/src/grounding/index.ts +82 -0
- package/src/grounding/proof-map/applyPatch.ts +172 -0
- package/src/grounding/proof-map/index.ts +41 -0
- package/src/grounding/proof-map/loop.ts +275 -0
- package/src/grounding/proof-map/schema.ts +217 -0
- package/src/grounding/rag/__tests__/pipeline.test.ts +274 -0
- package/src/grounding/rag/__tests__/tool.test.ts +202 -0
- package/src/grounding/rag/__tests__/trace.test.ts +229 -0
- package/src/grounding/rag/circuit-breaker.ts +152 -0
- package/src/grounding/rag/index.ts +64 -0
- package/src/grounding/rag/pipeline.ts +602 -0
- package/src/grounding/rag/tool.ts +281 -0
- package/src/grounding/rag/trace.ts +503 -0
- package/src/grounding/rag/types.ts +284 -0
- package/src/grounding/retrieval/in-memory-store.ts +107 -0
- package/src/grounding/sources/index.ts +943 -0
- package/src/grounding/tests/applyPatch.test.ts +194 -0
- package/src/grounding/tests/loop.test.ts +141 -0
- package/src/grounding/tests/schema.test.ts +160 -0
- package/src/grounding/types.ts +100 -0
- package/src/grounding/verification/index.ts +419 -0
- package/src/hitl/active-learning/index.ts +332 -0
- package/src/hitl/annotation/index.ts +362 -0
- package/src/hitl/approval/approval-queue.ts +132 -0
- package/src/hitl/approval/index.ts +5 -0
- package/src/hitl/feedback/index.ts +284 -0
- package/src/hitl/index.ts +69 -0
- package/src/hitl/review/index.ts +6 -0
- package/src/hitl/review/review-trigger.ts +162 -0
- package/src/hitl/types.ts +126 -0
- package/src/index.ts +125 -0
- package/src/integrations/blob-storage/index.ts +7 -0
- package/src/integrations/blob-storage/types.ts +28 -0
- package/src/integrations/blob-storage/vercel-blob-adapter.ts +35 -0
- package/src/integrations/index.ts +15 -0
- package/src/integrations/notifications/index.ts +7 -0
- package/src/integrations/notifications/log-adapter.ts +30 -0
- package/src/integrations/notifications/types.ts +27 -0
- package/src/integrations/rate-limit/index.ts +7 -0
- package/src/integrations/rate-limit/types.ts +26 -0
- package/src/integrations/rate-limit/upstash-adapter.ts +45 -0
- package/src/integrations/redis/index.ts +7 -0
- package/src/integrations/redis/types.ts +67 -0
- package/src/integrations/redis/upstash-adapter.ts +18 -0
- package/src/integrations/stream/index.ts +7 -0
- package/src/integrations/stream/resumable-adapter.ts +20 -0
- package/src/integrations/stream/types.ts +21 -0
- package/src/internal/__tests__/hallucination.test.ts +162 -0
- package/src/internal/__tests__/models.test.ts +104 -0
- package/src/internal/__tests__/sdk-errors.test.ts +201 -0
- package/src/internal/__tests__/stop-conditions.test.ts +210 -0
- package/src/internal/shared/ai-types.ts +942 -0
- package/src/internal/testing/evaluators.ts +575 -0
- package/src/internal/testing/index.ts +960 -0
- package/src/internal/ui/data-parts.ts +511 -0
- package/src/internal/ui/type-guards.ts +344 -0
- package/src/internal/ui-factories/__tests__/ui-factories.test.ts +548 -0
- package/src/internal/ui-factories/artifact-factory.ts +667 -0
- package/src/internal/ui-factories/index.ts +82 -0
- package/src/internal/ui-factories/shimmer-manager.ts +220 -0
- package/src/internal/ui-factories/status-helpers.ts +149 -0
- package/src/internal/ui-factories/tool-renderer.ts +167 -0
- package/src/internal/ui-factories/types.ts +235 -0
- package/src/models/capabilities.ts +88 -0
- package/src/models/index.ts +16 -0
- package/src/models/provider-factory.ts +229 -0
- package/src/models/providers/anthropic.ts +539 -0
- package/src/models/providers/google.ts +354 -0
- package/src/models/providers/index.ts +21 -0
- package/src/models/providers/openai.ts +346 -0
- package/src/models/providers/perplexity.ts +276 -0
- package/src/models/providers/shared.ts +90 -0
- package/src/models/providers/xai.ts +269 -0
- package/src/models/registry.ts +208 -0
- package/src/models/routing/index.ts +45 -0
- package/src/models/routing/intent-router.ts +143 -0
- package/src/models/routing/model-router.ts +300 -0
- package/src/models/routing/types.ts +106 -0
- package/src/models/types.ts +23 -0
- package/src/observability/analytics/index.ts +593 -0
- package/src/observability/cost/index.ts +16 -0
- package/src/observability/cost/tracking/budget-guard.ts +110 -0
- package/src/observability/cost/tracking/usage-tracker.ts +120 -0
- package/src/observability/cost/types.ts +85 -0
- package/src/observability/index.ts +17 -0
- package/src/observability/telemetry/index.ts +508 -0
- package/src/observability/tracing/index.ts +30 -0
- package/src/observability/tracing/otel/ai-instrumentation.ts +193 -0
- package/src/observability/tracing/otel/exporters/console.ts +58 -0
- package/src/observability/tracing/otel/exporters/index.ts +6 -0
- package/src/observability/tracing/provenance.ts +769 -0
- package/src/observability/tracing/types.ts +92 -0
- package/src/output/__tests__/output.test.ts +737 -0
- package/src/output/element-stream.ts +678 -0
- package/src/output/errors.ts +108 -0
- package/src/output/factories.ts +392 -0
- package/src/output/index.ts +98 -0
- package/src/output/multimodal/EXPORTS.md +306 -0
- package/src/output/multimodal/IMPLEMENTATION_SUMMARY.md +421 -0
- package/src/output/multimodal/README.md +349 -0
- package/src/output/multimodal/SETUP_GUIDE.md +472 -0
- package/src/output/multimodal/audio.ts +650 -0
- package/src/output/multimodal/image.ts +22 -0
- package/src/output/multimodal/index.ts +32 -0
- package/src/output/multimodal/providers.example.ts +375 -0
- package/src/output/validator.ts +495 -0
- package/src/pipelines/adapters/trace-storage-blob.ts +458 -0
- package/src/pipelines/adapters/trace-storage-memory.ts +319 -0
- package/src/pipelines/defaults.ts +109 -0
- package/src/pipelines/index.ts +24 -0
- package/src/pipelines/message-transforms.ts +107 -0
- package/src/pipelines/multi-step-wrapper.ts +433 -0
- package/src/pipelines/pipeline-presets.ts +339 -0
- package/src/pipelines/step-executor.ts +257 -0
- package/src/pipelines/storage-factory.ts +85 -0
- package/src/pipelines/trace-storage-interface.ts +216 -0
- package/src/pipelines/types.ts +255 -0
- package/src/pipelines/validation.ts +323 -0
- package/src/prompts/index.ts +271 -0
- package/src/prompts/model-variants.ts +410 -0
- package/src/prompts/templates.ts +327 -0
- package/src/sdk/errors/base.ts +296 -0
- package/src/sdk/errors/index.ts +31 -0
- package/src/sdk/errors/utils.ts +148 -0
- package/src/sdk/experimental/index.ts +286 -0
- package/src/sdk/index.ts +25 -0
- package/src/sdk/middleware/ai-middleware.ts +95 -0
- package/src/sdk/middleware/cache.ts +154 -0
- package/src/sdk/middleware/circuit-breaker.ts +388 -0
- package/src/sdk/middleware/compose.ts +81 -0
- package/src/sdk/middleware/deduplication.ts +307 -0
- package/src/sdk/middleware/index.ts +660 -0
- package/src/sdk/middleware/model-middleware.ts +200 -0
- package/src/sdk/stop-conditions/conditions.ts +209 -0
- package/src/sdk/stop-conditions/index.ts +35 -0
- package/src/sdk/stop-conditions/types.ts +59 -0
- package/src/security/guardrails/index.ts +6 -0
- package/src/security/guardrails/middleware.ts +465 -0
- package/src/security/guardrails/pii-filter.ts +396 -0
- package/src/security/index.ts +33 -0
- package/src/security/injection/index.ts +5 -0
- package/src/security/injection/prompt-injection.ts +64 -0
- package/src/security/types.ts +85 -0
- package/src/server/cache/crypto.ts +47 -0
- package/src/server/cache/performance.ts +79 -0
- package/src/server/error-handler.ts +93 -0
- package/src/server/errors.ts +73 -0
- package/src/server/helpers.ts +944 -0
- package/src/server/http.ts +156 -0
- package/src/server/index.ts +12 -0
- package/src/server/messages/__tests__/messages.test.ts +720 -0
- package/src/server/messages/converter.ts +245 -0
- package/src/server/messages/data-parts.ts +338 -0
- package/src/server/messages/extraction.ts +328 -0
- package/src/server/messages/index.ts +126 -0
- package/src/server/messages/types.ts +355 -0
- package/src/server/messages/window.ts +450 -0
- package/src/server/rate-limit/env.ts +8 -0
- package/src/server/rate-limit/rate-limit.ts +165 -0
- package/src/server/routes/HEALTH_CHECK.md +502 -0
- package/src/server/routes/IMPLEMENTATION_SUMMARY.md +432 -0
- package/src/server/routes/QUICK_START.md +327 -0
- package/src/server/routes/README.md +357 -0
- package/src/server/routes/__tests__/routes.test.ts +628 -0
- package/src/server/routes/agent-route.ts +224 -0
- package/src/server/routes/agent-routes.ts +191 -0
- package/src/server/routes/embed-config.ts +181 -0
- package/src/server/routes/health-check.example.ts +507 -0
- package/src/server/routes/health-check.test.ts +533 -0
- package/src/server/routes/health-check.ts +639 -0
- package/src/server/routes/health-check.types.ts +217 -0
- package/src/server/routes/index.ts +32 -0
- package/src/server/routes/types.ts +274 -0
- package/src/shared/__tests__/schemas.test.ts +317 -0
- package/src/shared/ai-runtime.ts +139 -0
- package/src/shared/ai-types.ts +133 -0
- package/src/shared/index.ts +30 -0
- package/src/shared/sdk-runtime.ts +198 -0
- package/src/shared/sdk-types.ts +301 -0
- package/src/streaming/control/__tests__/streaming-control.test.ts +708 -0
- package/src/streaming/control/budget-guard.ts +264 -0
- package/src/streaming/control/controller.ts +255 -0
- package/src/streaming/control/index.ts +105 -0
- package/src/streaming/control/smoothing.ts +201 -0
- package/src/streaming/control/step-limit.ts +215 -0
- package/src/streaming/control/types.ts +234 -0
- package/src/streaming/core/auto-resume.ts +276 -0
- package/src/streaming/core/index.ts +85 -0
- package/src/streaming/core/multi-step.ts +471 -0
- package/src/streaming/core/protocol.ts +194 -0
- package/src/streaming/core/types.ts +182 -0
- package/src/streaming/index.ts +97 -0
- package/src/streaming/infra/backpressure/buffer.ts +210 -0
- package/src/streaming/infra/backpressure/index.ts +6 -0
- package/src/streaming/infra/index.ts +75 -0
- package/src/streaming/infra/multiplexing/index.ts +311 -0
- package/src/streaming/infra/resilience/index.ts +684 -0
- package/src/streaming/infra/transform/index.ts +15 -0
- package/src/streaming/infra/transform/stream-transforms.ts +166 -0
- package/src/streaming/infra/transport/index.ts +774 -0
- package/src/streaming/infra/types.ts +118 -0
- package/src/streaming/infra-extra/types.ts +118 -0
- package/src/tools/advanced/caching.ts +299 -0
- package/src/tools/advanced/generator.ts +267 -0
- package/src/tools/advanced/hitl.ts +251 -0
- package/src/tools/advanced/index.ts +9 -0
- package/src/tools/advanced/llm-tool.ts +208 -0
- package/src/tools/approval/FILES.md +449 -0
- package/src/tools/approval/IMPLEMENTATION_SUMMARY.md +567 -0
- package/src/tools/approval/QUICK_START.md +362 -0
- package/src/tools/approval/README.md +514 -0
- package/src/tools/approval/advanced-approval-queue.ts +7 -0
- package/src/tools/approval/approval.example.ts +571 -0
- package/src/tools/approval/in-memory-queue.ts +405 -0
- package/src/tools/approval/index.ts +737 -0
- package/src/tools/approval/middleware.ts +590 -0
- package/src/tools/approval/queue-factory.ts +162 -0
- package/src/tools/approval/redis-queue.ts +327 -0
- package/src/tools/approval/testing.ts +493 -0
- package/src/tools/approval/types.ts +221 -0
- package/src/tools/approval/with-approval.ts +366 -0
- package/src/tools/artifacts/artifact-tools.ts +273 -0
- package/src/tools/artifacts/index.ts +6 -0
- package/src/tools/compliance/compliance-wrapper.ts +789 -0
- package/src/tools/compliance/create-compliant-stream.ts +226 -0
- package/src/tools/compliance/index.ts +8 -0
- package/src/tools/compliance/phi-redaction.ts +406 -0
- package/src/tools/compliance/tool-wrapper.ts +306 -0
- package/src/tools/computer/index.ts +99 -0
- package/src/tools/computer/types.ts +41 -0
- package/src/tools/core/abort.ts +202 -0
- package/src/tools/core/factory.ts +197 -0
- package/src/tools/core/index.ts +8 -0
- package/src/tools/core/tool-safety.ts +112 -0
- package/src/tools/generic/index.ts +9 -0
- package/src/tools/generic/json-schema-tool.ts +301 -0
- package/src/tools/generic/tiptap-context.ts +619 -0
- package/src/tools/generic/web-search-tool.ts +82 -0
- package/src/tools/generic/web-search.ts +142 -0
- package/src/tools/index.ts +36 -0
- package/src/tools/mcp/ai-sdk-error-integration.ts +401 -0
- package/src/tools/mcp/client.ts +988 -0
- package/src/tools/mcp/connection-manager.ts +380 -0
- package/src/tools/mcp/connection-pool.ts +408 -0
- package/src/tools/mcp/edge-runtime.ts +318 -0
- package/src/tools/mcp/environment.ts +310 -0
- package/src/tools/mcp/index.ts +20 -0
- package/src/tools/mcp/next-pattern.ts +401 -0
- package/src/tools/mcp/stream-lifecycle-integration.ts +617 -0
- package/src/tools/mcp/tool-cache.ts +359 -0
- package/src/tools/mcp/transport-selector.ts +492 -0
- package/src/tools/mcp/transports.ts +99 -0
- package/src/tools/simple-factory.ts +55 -0
- package/src/tools/superpowers/index.ts +122 -0
- package/src/tools/superpowers/prompts/index.ts +533 -0
- package/src/tools/superpowers/schemas/index.ts +701 -0
- package/src/tools/superpowers/tools/index.ts +721 -0
- package/src/tools/validation-wrapper.ts +97 -0
|
@@ -0,0 +1,988 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview client.ts
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
createMCPClient,
|
|
7
|
+
type OAuthClientProvider,
|
|
8
|
+
type MCPClient as SDKMCPClient,
|
|
9
|
+
} from '@ai-sdk/mcp';
|
|
10
|
+
import { Experimental_StdioMCPTransport } from '@ai-sdk/mcp/mcp-stdio';
|
|
11
|
+
import { logError, logWarn } from '@repo/shared/logs';
|
|
12
|
+
|
|
13
|
+
import { getErrorCode } from '../../server/errors';
|
|
14
|
+
|
|
15
|
+
import {
|
|
16
|
+
AISDKCompatibleMCPError,
|
|
17
|
+
MCPErrorHandlerFactory,
|
|
18
|
+
MCPErrorUtils,
|
|
19
|
+
} from './ai-sdk-error-integration';
|
|
20
|
+
|
|
21
|
+
import type { SDKToolSet } from '../../shared';
|
|
22
|
+
import type { IOType } from 'node:child_process';
|
|
23
|
+
import type { Stream } from 'node:stream';
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
export interface MCPClientConfig {
|
|
28
|
+
name: string;
|
|
29
|
+
transport: MCPTransportConfig;
|
|
30
|
+
retry?: MCPRetryConfig;
|
|
31
|
+
timeoutMs?: number;
|
|
32
|
+
gracefulDegradation?: boolean;
|
|
33
|
+
healthCheck?: MCPHealthCheckConfig;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface MCPTransportConfig {
|
|
37
|
+
type: 'stdio' | 'sse' | 'http';
|
|
38
|
+
// For stdio transport
|
|
39
|
+
command?: string;
|
|
40
|
+
args?: string[];
|
|
41
|
+
env?: Record<string, string>;
|
|
42
|
+
cwd?: string;
|
|
43
|
+
stderr?: IOType | Stream | number;
|
|
44
|
+
// For SSE transport
|
|
45
|
+
url?: string;
|
|
46
|
+
headers?: Record<string, string>;
|
|
47
|
+
// For HTTP transport
|
|
48
|
+
httpUrl?: string;
|
|
49
|
+
sessionId?: string;
|
|
50
|
+
authProvider?: OAuthClientProvider;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* MCP Client wrapper with proper typing
|
|
55
|
+
* Uses AI SDK tool format instead of MCP SDK format
|
|
56
|
+
*/
|
|
57
|
+
export type MCPClient = SDKMCPClient;
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* MCP Transport union type for better type safety
|
|
61
|
+
*/
|
|
62
|
+
type MCPRemoteTransport = {
|
|
63
|
+
type: 'sse' | 'http';
|
|
64
|
+
url: string;
|
|
65
|
+
headers?: Record<string, string>;
|
|
66
|
+
authProvider?: OAuthClientProvider;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
export type MCPTransport = Experimental_StdioMCPTransport | MCPRemoteTransport;
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Retry configuration for MCP operations
|
|
73
|
+
*/
|
|
74
|
+
export interface MCPRetryConfig {
|
|
75
|
+
maxAttempts: number;
|
|
76
|
+
initialDelayMs: number;
|
|
77
|
+
maxDelayMs: number;
|
|
78
|
+
backoffMultiplier: number;
|
|
79
|
+
retryableErrors: string[];
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Default retry configuration
|
|
84
|
+
*/
|
|
85
|
+
export const DEFAULT_RETRY_CONFIG: MCPRetryConfig = {
|
|
86
|
+
maxAttempts: 3,
|
|
87
|
+
initialDelayMs: 1000,
|
|
88
|
+
maxDelayMs: 10000,
|
|
89
|
+
backoffMultiplier: 2,
|
|
90
|
+
retryableErrors: ['ECONNREFUSED', 'ENOTFOUND', 'TIMEOUT', 'NETWORK_ERROR', 'CONNECTION_LOST'],
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Health check configuration for MCP servers
|
|
95
|
+
*/
|
|
96
|
+
export interface MCPHealthCheckConfig {
|
|
97
|
+
enabled: boolean;
|
|
98
|
+
intervalMs: number;
|
|
99
|
+
timeoutMs: number;
|
|
100
|
+
failureThreshold: number;
|
|
101
|
+
recoveryThreshold: number;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Default health check configuration
|
|
106
|
+
*/
|
|
107
|
+
export const DEFAULT_HEALTH_CHECK_CONFIG: MCPHealthCheckConfig = {
|
|
108
|
+
enabled: true,
|
|
109
|
+
intervalMs: 60000, // 1 minute
|
|
110
|
+
timeoutMs: 5000, // 5 seconds
|
|
111
|
+
failureThreshold: 3,
|
|
112
|
+
recoveryThreshold: 2,
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Health status for MCP servers
|
|
117
|
+
*/
|
|
118
|
+
export enum MCPHealthStatus {
|
|
119
|
+
HEALTHY = 'healthy',
|
|
120
|
+
DEGRADED = 'degraded',
|
|
121
|
+
UNHEALTHY = 'unhealthy',
|
|
122
|
+
UNKNOWN = 'unknown',
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Health check result
|
|
127
|
+
*/
|
|
128
|
+
export interface MCPHealthCheckResult {
|
|
129
|
+
status: MCPHealthStatus;
|
|
130
|
+
lastCheck: Date;
|
|
131
|
+
consecutiveFailures: number;
|
|
132
|
+
consecutiveSuccesses: number;
|
|
133
|
+
responseTimeMs?: number;
|
|
134
|
+
error?: string;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Result type for MCP client creation
|
|
139
|
+
*/
|
|
140
|
+
export interface MCPClientResult {
|
|
141
|
+
client: MCPClient;
|
|
142
|
+
toolSet: SDKToolSet;
|
|
143
|
+
config: MCPClientConfig;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* MCP Error types for better error handling
|
|
148
|
+
*/
|
|
149
|
+
export class MCPConnectionError extends Error {
|
|
150
|
+
constructor(
|
|
151
|
+
message: string,
|
|
152
|
+
public readonly clientName: string,
|
|
153
|
+
public readonly transportType: string,
|
|
154
|
+
public readonly originalError?: Error,
|
|
155
|
+
) {
|
|
156
|
+
super(message);
|
|
157
|
+
this.name = 'MCPConnectionError';
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
export class MCPTransportError extends Error {
|
|
162
|
+
constructor(
|
|
163
|
+
message: string,
|
|
164
|
+
public readonly transportType: string,
|
|
165
|
+
public readonly originalError?: Error,
|
|
166
|
+
) {
|
|
167
|
+
super(message);
|
|
168
|
+
this.name = 'MCPTransportError';
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
export class MCPRetryableError extends Error {
|
|
173
|
+
constructor(
|
|
174
|
+
message: string,
|
|
175
|
+
public readonly attempt: number,
|
|
176
|
+
public readonly maxAttempts: number,
|
|
177
|
+
public readonly originalError?: Error,
|
|
178
|
+
) {
|
|
179
|
+
super(message);
|
|
180
|
+
this.name = 'MCPRetryableError';
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Utility function to check if an error is retryable
|
|
186
|
+
*/
|
|
187
|
+
function isRetryableError(error: Error, retryableErrors: string[]): boolean {
|
|
188
|
+
// Check error message for known patterns
|
|
189
|
+
const errorMessage = error.message.toUpperCase();
|
|
190
|
+
const errorCode = getErrorCode(error);
|
|
191
|
+
|
|
192
|
+
return retryableErrors.some(
|
|
193
|
+
pattern => errorMessage.includes(pattern.toUpperCase()) || errorCode === pattern,
|
|
194
|
+
);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Utility function to calculate exponential backoff delay
|
|
199
|
+
*/
|
|
200
|
+
function calculateDelay(attempt: number, config: MCPRetryConfig): number {
|
|
201
|
+
const delay = config.initialDelayMs * Math.pow(config.backoffMultiplier, attempt - 1);
|
|
202
|
+
return Math.min(delay, config.maxDelayMs);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Utility function to sleep for a given duration
|
|
207
|
+
*/
|
|
208
|
+
function sleep(ms: number): Promise<void> {
|
|
209
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Timeout wrapper that cancels operations after a specified duration
|
|
214
|
+
*/
|
|
215
|
+
async function withTimeout<T>(
|
|
216
|
+
operation: () => Promise<T>,
|
|
217
|
+
timeoutMs: number,
|
|
218
|
+
context: string = 'MCP operation',
|
|
219
|
+
): Promise<T> {
|
|
220
|
+
const timeoutPromise = new Promise<never>((resolve, reject) => {
|
|
221
|
+
void resolve;
|
|
222
|
+
setTimeout(() => {
|
|
223
|
+
reject(new Error(`${context} timed out after ${timeoutMs}ms`));
|
|
224
|
+
}, timeoutMs);
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
return Promise.race([operation(), timeoutPromise]);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Enhanced retry wrapper with exponential backoff
|
|
232
|
+
*/
|
|
233
|
+
async function withRetry<T>(
|
|
234
|
+
operation: () => Promise<T>,
|
|
235
|
+
config: MCPRetryConfig = DEFAULT_RETRY_CONFIG,
|
|
236
|
+
context: string = 'MCP operation',
|
|
237
|
+
): Promise<T> {
|
|
238
|
+
let lastError: Error | undefined;
|
|
239
|
+
|
|
240
|
+
for (let attempt = 1; attempt <= config.maxAttempts; attempt++) {
|
|
241
|
+
try {
|
|
242
|
+
return await operation();
|
|
243
|
+
} catch (error) {
|
|
244
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
245
|
+
|
|
246
|
+
// If this is the last attempt or error is not retryable, throw
|
|
247
|
+
if (attempt === config.maxAttempts || !isRetryableError(lastError, config.retryableErrors)) {
|
|
248
|
+
logError(`${context} failed after ${attempt} attempts`, {
|
|
249
|
+
operation: 'mcp_retry_exhausted',
|
|
250
|
+
metadata: {
|
|
251
|
+
context,
|
|
252
|
+
attempt,
|
|
253
|
+
maxAttempts: config.maxAttempts,
|
|
254
|
+
error: lastError.message,
|
|
255
|
+
},
|
|
256
|
+
error: lastError,
|
|
257
|
+
});
|
|
258
|
+
throw lastError;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// Calculate delay and wait before retry
|
|
262
|
+
const delay = calculateDelay(attempt, config);
|
|
263
|
+
logWarn(
|
|
264
|
+
`${context} failed, retrying in ${delay}ms (attempt ${attempt}/${config.maxAttempts})`,
|
|
265
|
+
{
|
|
266
|
+
operation: 'mcp_retry_attempt',
|
|
267
|
+
metadata: {
|
|
268
|
+
context,
|
|
269
|
+
attempt,
|
|
270
|
+
maxAttempts: config.maxAttempts,
|
|
271
|
+
delayMs: delay,
|
|
272
|
+
error: lastError.message,
|
|
273
|
+
},
|
|
274
|
+
},
|
|
275
|
+
);
|
|
276
|
+
|
|
277
|
+
await sleep(delay);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
// This should never be reached, but TypeScript needs this
|
|
282
|
+
throw lastError || new Error(`${context} failed after all retry attempts`);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* Combined retry and timeout wrapper
|
|
287
|
+
*/
|
|
288
|
+
export async function withRetryAndTimeout<T>(
|
|
289
|
+
operation: () => Promise<T>,
|
|
290
|
+
retryConfig: MCPRetryConfig = DEFAULT_RETRY_CONFIG,
|
|
291
|
+
timeoutMs?: number,
|
|
292
|
+
context: string = 'MCP operation',
|
|
293
|
+
): Promise<T> {
|
|
294
|
+
const wrappedOperation = timeoutMs ? () => withTimeout(operation, timeoutMs, context) : operation;
|
|
295
|
+
|
|
296
|
+
return withRetry(wrappedOperation, retryConfig, context);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
* MCP Server Health Monitor
|
|
301
|
+
* Tracks health status of MCP servers and provides graceful degradation
|
|
302
|
+
*/
|
|
303
|
+
export class MCPHealthMonitor {
|
|
304
|
+
private healthStatuses = new Map<string, MCPHealthCheckResult>();
|
|
305
|
+
private healthCheckIntervals = new Map<string, NodeJS.Timeout>();
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* Start health monitoring for a client configuration
|
|
309
|
+
*/
|
|
310
|
+
startMonitoring(config: MCPClientConfig): void {
|
|
311
|
+
const healthConfig = config.healthCheck ?? DEFAULT_HEALTH_CHECK_CONFIG;
|
|
312
|
+
if (!healthConfig.enabled) return;
|
|
313
|
+
|
|
314
|
+
// Initialize health status
|
|
315
|
+
this.healthStatuses.set(config.name, {
|
|
316
|
+
status: MCPHealthStatus.UNKNOWN,
|
|
317
|
+
lastCheck: new Date(),
|
|
318
|
+
consecutiveFailures: 0,
|
|
319
|
+
consecutiveSuccesses: 0,
|
|
320
|
+
});
|
|
321
|
+
|
|
322
|
+
// Set up periodic health checks
|
|
323
|
+
const intervalId = setInterval(() => {
|
|
324
|
+
void this.performHealthCheck(config);
|
|
325
|
+
}, healthConfig.intervalMs);
|
|
326
|
+
|
|
327
|
+
this.healthCheckIntervals.set(config.name, intervalId);
|
|
328
|
+
|
|
329
|
+
// Perform initial health check
|
|
330
|
+
void this.performHealthCheck(config);
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
/**
|
|
334
|
+
* Stop health monitoring for a client
|
|
335
|
+
*/
|
|
336
|
+
stopMonitoring(clientName: string): void {
|
|
337
|
+
const intervalId = this.healthCheckIntervals.get(clientName);
|
|
338
|
+
if (intervalId) {
|
|
339
|
+
clearInterval(intervalId);
|
|
340
|
+
this.healthCheckIntervals.delete(clientName);
|
|
341
|
+
}
|
|
342
|
+
this.healthStatuses.delete(clientName);
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/**
|
|
346
|
+
* Get current health status for a client
|
|
347
|
+
*/
|
|
348
|
+
getHealthStatus(clientName: string): MCPHealthCheckResult | undefined {
|
|
349
|
+
return this.healthStatuses.get(clientName);
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
/**
|
|
353
|
+
* Check if a client is currently healthy
|
|
354
|
+
*/
|
|
355
|
+
isHealthy(clientName: string): boolean {
|
|
356
|
+
const status = this.healthStatuses.get(clientName);
|
|
357
|
+
return status?.status === MCPHealthStatus.HEALTHY;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
/**
|
|
361
|
+
* Check if a client should be excluded due to poor health
|
|
362
|
+
*/
|
|
363
|
+
shouldExclude(clientName: string): boolean {
|
|
364
|
+
const status = this.healthStatuses.get(clientName);
|
|
365
|
+
return status?.status === MCPHealthStatus.UNHEALTHY;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
/**
|
|
369
|
+
* Perform a health check for a specific client
|
|
370
|
+
*/
|
|
371
|
+
private async performHealthCheck(config: MCPClientConfig): Promise<void> {
|
|
372
|
+
const healthConfig = config.healthCheck ?? DEFAULT_HEALTH_CHECK_CONFIG;
|
|
373
|
+
const startTime = Date.now();
|
|
374
|
+
let result: MCPHealthCheckResult;
|
|
375
|
+
|
|
376
|
+
try {
|
|
377
|
+
// Attempt to create a temporary client and get tools
|
|
378
|
+
await withTimeout(
|
|
379
|
+
async () => {
|
|
380
|
+
const transport = createTransportFromConfig(config.transport);
|
|
381
|
+
const tempClient = await createMCPClient({ transport });
|
|
382
|
+
|
|
383
|
+
try {
|
|
384
|
+
await tempClient.tools();
|
|
385
|
+
await tempClient.close();
|
|
386
|
+
} catch (toolError) {
|
|
387
|
+
await tempClient.close();
|
|
388
|
+
throw toolError;
|
|
389
|
+
}
|
|
390
|
+
},
|
|
391
|
+
healthConfig.timeoutMs,
|
|
392
|
+
`Health check for ${config.name}`,
|
|
393
|
+
);
|
|
394
|
+
|
|
395
|
+
// Health check succeeded
|
|
396
|
+
const responseTime = Date.now() - startTime;
|
|
397
|
+
const currentStatus = this.healthStatuses.get(config.name);
|
|
398
|
+
|
|
399
|
+
result = {
|
|
400
|
+
status: MCPHealthStatus.HEALTHY,
|
|
401
|
+
lastCheck: new Date(),
|
|
402
|
+
consecutiveFailures: 0,
|
|
403
|
+
consecutiveSuccesses: (currentStatus?.consecutiveSuccesses ?? 0) + 1,
|
|
404
|
+
responseTimeMs: responseTime,
|
|
405
|
+
};
|
|
406
|
+
} catch (error) {
|
|
407
|
+
// Health check failed
|
|
408
|
+
const currentStatus = this.healthStatuses.get(config.name);
|
|
409
|
+
const consecutiveFailures = (currentStatus?.consecutiveFailures ?? 0) + 1;
|
|
410
|
+
|
|
411
|
+
let newStatus: MCPHealthStatus;
|
|
412
|
+
if (consecutiveFailures >= healthConfig.failureThreshold) {
|
|
413
|
+
newStatus = MCPHealthStatus.UNHEALTHY;
|
|
414
|
+
} else if (consecutiveFailures > 1) {
|
|
415
|
+
newStatus = MCPHealthStatus.DEGRADED;
|
|
416
|
+
} else {
|
|
417
|
+
newStatus = MCPHealthStatus.DEGRADED;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
result = {
|
|
421
|
+
status: newStatus,
|
|
422
|
+
lastCheck: new Date(),
|
|
423
|
+
consecutiveFailures,
|
|
424
|
+
consecutiveSuccesses: 0,
|
|
425
|
+
error: error instanceof Error ? error.message : String(error),
|
|
426
|
+
};
|
|
427
|
+
|
|
428
|
+
logWarn(`Health check failed for MCP client '${config.name}'`, {
|
|
429
|
+
operation: 'mcp_health_check_failed',
|
|
430
|
+
metadata: {
|
|
431
|
+
clientName: config.name,
|
|
432
|
+
consecutiveFailures,
|
|
433
|
+
status: newStatus,
|
|
434
|
+
error: result.error,
|
|
435
|
+
},
|
|
436
|
+
});
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
// Log health status changes
|
|
440
|
+
const previousStatus = this.healthStatuses.get(config.name);
|
|
441
|
+
|
|
442
|
+
// Update health status
|
|
443
|
+
this.healthStatuses.set(config.name, result);
|
|
444
|
+
if (previousStatus && previousStatus.status !== result.status) {
|
|
445
|
+
logWarn(
|
|
446
|
+
`MCP client '${config.name}' health status changed: ${previousStatus.status} → ${result.status}`,
|
|
447
|
+
{
|
|
448
|
+
operation: 'mcp_health_status_change',
|
|
449
|
+
metadata: {
|
|
450
|
+
clientName: config.name,
|
|
451
|
+
previousStatus: previousStatus.status,
|
|
452
|
+
newStatus: result.status,
|
|
453
|
+
consecutiveFailures: result.consecutiveFailures,
|
|
454
|
+
consecutiveSuccesses: result.consecutiveSuccesses,
|
|
455
|
+
},
|
|
456
|
+
},
|
|
457
|
+
);
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
/**
|
|
462
|
+
* Get summary of all client health statuses
|
|
463
|
+
*/
|
|
464
|
+
getHealthSummary(): Record<string, MCPHealthCheckResult> {
|
|
465
|
+
return Object.fromEntries(this.healthStatuses);
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
/**
|
|
469
|
+
* Cleanup all monitoring
|
|
470
|
+
*/
|
|
471
|
+
cleanup(): void {
|
|
472
|
+
// Clear all intervals
|
|
473
|
+
for (const intervalId of this.healthCheckIntervals.values()) {
|
|
474
|
+
clearInterval(intervalId);
|
|
475
|
+
}
|
|
476
|
+
this.healthCheckIntervals.clear();
|
|
477
|
+
this.healthStatuses.clear();
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
/**
|
|
482
|
+
* Global health monitor instance
|
|
483
|
+
*/
|
|
484
|
+
export const globalMCPHealthMonitor = new MCPHealthMonitor();
|
|
485
|
+
|
|
486
|
+
/**
|
|
487
|
+
* Validate transport configuration at runtime
|
|
488
|
+
*/
|
|
489
|
+
function validateTransportConfig(transportConfig: MCPTransportConfig): void {
|
|
490
|
+
switch (transportConfig.type) {
|
|
491
|
+
case 'stdio':
|
|
492
|
+
if (!transportConfig.command) {
|
|
493
|
+
throw new MCPTransportError('Command is required for stdio transport', 'stdio');
|
|
494
|
+
}
|
|
495
|
+
break;
|
|
496
|
+
case 'sse': {
|
|
497
|
+
const url = resolveRemoteUrl(transportConfig);
|
|
498
|
+
if (!url) {
|
|
499
|
+
throw new MCPTransportError('URL is required for SSE transport', 'sse');
|
|
500
|
+
}
|
|
501
|
+
try {
|
|
502
|
+
new URL(url);
|
|
503
|
+
} catch {
|
|
504
|
+
throw new MCPTransportError('Invalid URL format for SSE transport', 'sse');
|
|
505
|
+
}
|
|
506
|
+
break;
|
|
507
|
+
}
|
|
508
|
+
case 'http': {
|
|
509
|
+
const url = resolveRemoteUrl(transportConfig);
|
|
510
|
+
if (!url) {
|
|
511
|
+
throw new MCPTransportError('HTTP URL is required for HTTP transport', 'http');
|
|
512
|
+
}
|
|
513
|
+
try {
|
|
514
|
+
new URL(url);
|
|
515
|
+
} catch {
|
|
516
|
+
throw new MCPTransportError('Invalid HTTP URL format for HTTP transport', 'http');
|
|
517
|
+
}
|
|
518
|
+
break;
|
|
519
|
+
}
|
|
520
|
+
default:
|
|
521
|
+
throw new MCPTransportError(
|
|
522
|
+
`Unsupported transport type: ${getTransportTypeLabel(transportConfig)}`,
|
|
523
|
+
'unknown',
|
|
524
|
+
);
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
/**
|
|
529
|
+
* Create transport instance from configuration with proper typing and validation
|
|
530
|
+
*/
|
|
531
|
+
export function createTransportFromConfig(transportConfig: MCPTransportConfig): MCPTransport {
|
|
532
|
+
// Validate configuration first
|
|
533
|
+
validateTransportConfig(transportConfig);
|
|
534
|
+
|
|
535
|
+
switch (transportConfig.type) {
|
|
536
|
+
case 'stdio':
|
|
537
|
+
const baseEnv = Object.entries(process.env).reduce<Record<string, string>>(
|
|
538
|
+
(acc, [key, value]) => {
|
|
539
|
+
if (typeof value === 'string') {
|
|
540
|
+
acc[key] = value;
|
|
541
|
+
}
|
|
542
|
+
return acc;
|
|
543
|
+
},
|
|
544
|
+
{},
|
|
545
|
+
);
|
|
546
|
+
|
|
547
|
+
return new Experimental_StdioMCPTransport({
|
|
548
|
+
command: transportConfig.command ?? 'node',
|
|
549
|
+
args: transportConfig.args ?? [],
|
|
550
|
+
cwd: transportConfig.cwd,
|
|
551
|
+
stderr: transportConfig.stderr,
|
|
552
|
+
env: {
|
|
553
|
+
...baseEnv,
|
|
554
|
+
// Ensure API keys are passed to child processes
|
|
555
|
+
...(process.env.PERPLEXITY_API_KEY && {
|
|
556
|
+
PERPLEXITY_API_KEY: process.env.PERPLEXITY_API_KEY,
|
|
557
|
+
}),
|
|
558
|
+
...(process.env.OPENAI_API_KEY && {
|
|
559
|
+
OPENAI_API_KEY: process.env.OPENAI_API_KEY,
|
|
560
|
+
}),
|
|
561
|
+
...(process.env.ANTHROPIC_API_KEY && {
|
|
562
|
+
ANTHROPIC_API_KEY: process.env.ANTHROPIC_API_KEY,
|
|
563
|
+
}),
|
|
564
|
+
...transportConfig.env,
|
|
565
|
+
},
|
|
566
|
+
});
|
|
567
|
+
|
|
568
|
+
case 'sse':
|
|
569
|
+
return buildRemoteTransport('sse', transportConfig);
|
|
570
|
+
|
|
571
|
+
case 'http':
|
|
572
|
+
return buildRemoteTransport('http', transportConfig);
|
|
573
|
+
|
|
574
|
+
default:
|
|
575
|
+
// TypeScript should catch this, but runtime safety
|
|
576
|
+
throw new MCPTransportError(
|
|
577
|
+
`Unsupported transport type: ${getTransportTypeLabel(transportConfig)}`,
|
|
578
|
+
'unknown',
|
|
579
|
+
);
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
function resolveRemoteUrl(transportConfig: MCPTransportConfig): string | undefined {
|
|
584
|
+
return transportConfig.url ?? transportConfig.httpUrl;
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
function getTransportTypeLabel(transportConfig: MCPTransportConfig): string {
|
|
588
|
+
return typeof transportConfig.type === 'string' ? transportConfig.type : 'unknown';
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
function buildRemoteTransport(
|
|
592
|
+
type: 'sse' | 'http',
|
|
593
|
+
transportConfig: MCPTransportConfig,
|
|
594
|
+
): MCPRemoteTransport {
|
|
595
|
+
const url = resolveRemoteUrl(transportConfig);
|
|
596
|
+
if (!url) {
|
|
597
|
+
throw new MCPTransportError(`URL is required for ${type} transport`, type);
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
const headers = { ...transportConfig.headers };
|
|
601
|
+
if (type === 'http' && transportConfig.sessionId) {
|
|
602
|
+
headers['x-mcp-session-id'] = transportConfig.sessionId;
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
return {
|
|
606
|
+
type,
|
|
607
|
+
url,
|
|
608
|
+
headers: Object.keys(headers).length > 0 ? headers : undefined,
|
|
609
|
+
authProvider: transportConfig.authProvider,
|
|
610
|
+
};
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
/**
|
|
614
|
+
* Per-request MCP client manager following Next.js documentation pattern with AI SDK v6 integration
|
|
615
|
+
* Creates clients per request and cleans them up automatically with proper error handling
|
|
616
|
+
*/
|
|
617
|
+
export class MCPRequestManager {
|
|
618
|
+
public clients: MCPClient[] = [];
|
|
619
|
+
private tools: SDKToolSet = {};
|
|
620
|
+
private errorHandlers: Map<string, MCPErrorHandlerFactory> = new Map();
|
|
621
|
+
|
|
622
|
+
async addClient(config: MCPClientConfig): Promise<void> {
|
|
623
|
+
const retryConfig = config.retry ?? DEFAULT_RETRY_CONFIG;
|
|
624
|
+
const timeoutMs = config.timeoutMs || 30000; // 30 second default timeout
|
|
625
|
+
const context = `MCP client creation (${config.name})`;
|
|
626
|
+
|
|
627
|
+
// Create AI SDK error handler for this client
|
|
628
|
+
const errorHandler = new MCPErrorHandlerFactory(config.name, context);
|
|
629
|
+
this.errorHandlers.set(config.name, errorHandler);
|
|
630
|
+
|
|
631
|
+
// Check health status if health monitoring is enabled
|
|
632
|
+
if (globalMCPHealthMonitor.shouldExclude(config.name)) {
|
|
633
|
+
if (config.gracefulDegradation) {
|
|
634
|
+
logWarn(`Skipping unhealthy MCP client '${config.name}'`, {
|
|
635
|
+
operation: 'mcp_skip_unhealthy',
|
|
636
|
+
metadata: {
|
|
637
|
+
clientName: config.name,
|
|
638
|
+
healthStatus: globalMCPHealthMonitor.getHealthStatus(config.name),
|
|
639
|
+
},
|
|
640
|
+
});
|
|
641
|
+
return;
|
|
642
|
+
} else {
|
|
643
|
+
throw new AISDKCompatibleMCPError(
|
|
644
|
+
`MCP client '${config.name}' is marked as unhealthy`,
|
|
645
|
+
'connection-error',
|
|
646
|
+
undefined,
|
|
647
|
+
{
|
|
648
|
+
clientName: config.name,
|
|
649
|
+
transportType: config.transport.type,
|
|
650
|
+
healthStatus: globalMCPHealthMonitor.getHealthStatus(config.name),
|
|
651
|
+
},
|
|
652
|
+
true, // This is recoverable - health might improve
|
|
653
|
+
);
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
try {
|
|
658
|
+
await withRetryAndTimeout(
|
|
659
|
+
async () => {
|
|
660
|
+
const transport = createTransportFromConfig(config.transport);
|
|
661
|
+
const client = await createMCPClient({ transport });
|
|
662
|
+
this.clients.push(client);
|
|
663
|
+
|
|
664
|
+
// Get tools from this client and merge them with retry
|
|
665
|
+
const clientTools = await withRetryAndTimeout<SDKToolSet>(
|
|
666
|
+
() => client.tools(),
|
|
667
|
+
retryConfig,
|
|
668
|
+
timeoutMs,
|
|
669
|
+
`MCP tools retrieval (${config.name})`,
|
|
670
|
+
);
|
|
671
|
+
|
|
672
|
+
// Merge tools directly (later tools override earlier ones with same name)
|
|
673
|
+
Object.assign(this.tools, clientTools);
|
|
674
|
+
|
|
675
|
+
// Start health monitoring for this client
|
|
676
|
+
globalMCPHealthMonitor.startMonitoring(config);
|
|
677
|
+
},
|
|
678
|
+
retryConfig,
|
|
679
|
+
timeoutMs,
|
|
680
|
+
context,
|
|
681
|
+
);
|
|
682
|
+
} catch (error) {
|
|
683
|
+
const originalError = error instanceof Error ? error : new Error(String(error));
|
|
684
|
+
const aiError = new AISDKCompatibleMCPError(
|
|
685
|
+
`Failed to create MCP client '${config.name}' after retries`,
|
|
686
|
+
'connection-error',
|
|
687
|
+
originalError,
|
|
688
|
+
{
|
|
689
|
+
clientName: config.name,
|
|
690
|
+
transportType: config.transport.type,
|
|
691
|
+
retryAttempts: retryConfig.maxAttempts,
|
|
692
|
+
timeoutMs,
|
|
693
|
+
},
|
|
694
|
+
MCPErrorUtils.isRecoverableError(originalError),
|
|
695
|
+
);
|
|
696
|
+
|
|
697
|
+
// If graceful degradation is enabled, log and continue
|
|
698
|
+
if (config.gracefulDegradation) {
|
|
699
|
+
logWarn(`MCP client '${config.name}' failed, continuing with degraded functionality`, {
|
|
700
|
+
operation: 'mcp_graceful_degradation',
|
|
701
|
+
metadata: {
|
|
702
|
+
clientName: config.name,
|
|
703
|
+
transportType: config.transport.type,
|
|
704
|
+
error: aiError.message,
|
|
705
|
+
errorType: aiError.errorType,
|
|
706
|
+
recoverable: aiError.recoverable,
|
|
707
|
+
...MCPErrorUtils.extractErrorMetadata(originalError),
|
|
708
|
+
},
|
|
709
|
+
});
|
|
710
|
+
return;
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
throw aiError;
|
|
714
|
+
}
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
getTools(): SDKToolSet {
|
|
718
|
+
return this.tools;
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
async close(): Promise<void> {
|
|
722
|
+
const closePromises = this.clients.map(async (client, index) => {
|
|
723
|
+
try {
|
|
724
|
+
await client.close();
|
|
725
|
+
} catch (error) {
|
|
726
|
+
logWarn(`Failed to close MCP client ${index}`, {
|
|
727
|
+
operation: 'mcp_client_close',
|
|
728
|
+
metadata: {
|
|
729
|
+
clientIndex: index,
|
|
730
|
+
error: error instanceof Error ? error.message : String(error),
|
|
731
|
+
},
|
|
732
|
+
});
|
|
733
|
+
}
|
|
734
|
+
});
|
|
735
|
+
|
|
736
|
+
await Promise.all(closePromises);
|
|
737
|
+
this.clients = [];
|
|
738
|
+
this.tools = {};
|
|
739
|
+
}
|
|
740
|
+
|
|
741
|
+
/**
|
|
742
|
+
* Get health summary for all managed clients
|
|
743
|
+
*/
|
|
744
|
+
getHealthSummary(): Record<string, MCPHealthCheckResult> {
|
|
745
|
+
return globalMCPHealthMonitor.getHealthSummary();
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
/**
|
|
749
|
+
* Create AI SDK v6 compatible error handlers for all managed clients
|
|
750
|
+
*/
|
|
751
|
+
createAISDKErrorHandlers(): {
|
|
752
|
+
onUncaughtError: (error: Error) => void;
|
|
753
|
+
onFinish: () => Promise<void>;
|
|
754
|
+
onStreamError: (error: Error) => void;
|
|
755
|
+
} {
|
|
756
|
+
const onUncaughtError = (error: Error) => {
|
|
757
|
+
// Create a composite error handler that handles all clients
|
|
758
|
+
for (const [, errorHandler] of this.errorHandlers.entries()) {
|
|
759
|
+
const handler = errorHandler.createUncaughtErrorHandler(() => this.close(), {
|
|
760
|
+
enableRecovery: true,
|
|
761
|
+
maxRecoveryAttempts: 1,
|
|
762
|
+
});
|
|
763
|
+
handler(error);
|
|
764
|
+
}
|
|
765
|
+
};
|
|
766
|
+
|
|
767
|
+
const onFinish = async () => {
|
|
768
|
+
try {
|
|
769
|
+
await this.close();
|
|
770
|
+
} catch (error) {
|
|
771
|
+
// Convert to AI SDK compatible error
|
|
772
|
+
const aiError = new AISDKCompatibleMCPError(
|
|
773
|
+
'Failed to close MCP clients on finish',
|
|
774
|
+
'resource-exhausted',
|
|
775
|
+
error instanceof Error ? error : new Error(String(error)),
|
|
776
|
+
{
|
|
777
|
+
clientCount: this.clients.length,
|
|
778
|
+
operation: 'finish_cleanup',
|
|
779
|
+
},
|
|
780
|
+
false,
|
|
781
|
+
);
|
|
782
|
+
throw aiError;
|
|
783
|
+
}
|
|
784
|
+
};
|
|
785
|
+
|
|
786
|
+
const onStreamError = (error: Error) => {
|
|
787
|
+
// Handle stream errors for all clients
|
|
788
|
+
for (const [, errorHandler] of this.errorHandlers.entries()) {
|
|
789
|
+
const handler = errorHandler.createStreamErrorHandler(() => this.close());
|
|
790
|
+
handler(error);
|
|
791
|
+
}
|
|
792
|
+
};
|
|
793
|
+
|
|
794
|
+
return {
|
|
795
|
+
onUncaughtError,
|
|
796
|
+
onFinish,
|
|
797
|
+
onStreamError,
|
|
798
|
+
};
|
|
799
|
+
}
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
/**
|
|
803
|
+
* Create MCP tools for a single request (following Next.js docs pattern)
|
|
804
|
+
* This creates clients per request and returns cleanup functions
|
|
805
|
+
*/
|
|
806
|
+
export async function createMCPToolsForRequest(configs: MCPClientConfig[]): Promise<{
|
|
807
|
+
tools: SDKToolSet;
|
|
808
|
+
clients: MCPClient[];
|
|
809
|
+
cleanup: () => Promise<void>;
|
|
810
|
+
}> {
|
|
811
|
+
const manager = new MCPRequestManager();
|
|
812
|
+
|
|
813
|
+
for (const config of configs) {
|
|
814
|
+
await manager.addClient(config);
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
return {
|
|
818
|
+
tools: manager.getTools(),
|
|
819
|
+
clients: manager.clients,
|
|
820
|
+
cleanup: () => manager.close(),
|
|
821
|
+
};
|
|
822
|
+
}
|
|
823
|
+
|
|
824
|
+
/**
|
|
825
|
+
* Create MCP tools following the exact Next.js documentation pattern
|
|
826
|
+
* This function matches the pattern shown in the official AI SDK docs:
|
|
827
|
+
* https://sdk.vercel.ai/docs/ai-sdk-ui/mcp-tools (Next.js usage)
|
|
828
|
+
* https://sdk.vercel.ai/docs/ai-sdk-core/mcp-tools (Node.js usage)
|
|
829
|
+
*
|
|
830
|
+
* Next.js streamText example from official docs:
|
|
831
|
+
* ```typescript
|
|
832
|
+
* const toolSetOne = await stdioClient.tools();
|
|
833
|
+
* const toolSetTwo = await sseClient.tools();
|
|
834
|
+
* const toolSetThree = await customClient.tools();
|
|
835
|
+
* const tools = {
|
|
836
|
+
* ...toolSetOne,
|
|
837
|
+
* ...toolSetTwo,
|
|
838
|
+
* ...toolSetThree, // note: this approach causes subsequent tool sets to override tools with the same name
|
|
839
|
+
* };
|
|
840
|
+
*
|
|
841
|
+
* const response = streamText({
|
|
842
|
+
* model: openai('gpt-4o'),
|
|
843
|
+
* tools,
|
|
844
|
+
* prompt,
|
|
845
|
+
* onFinish: async () => {
|
|
846
|
+
* await stdioClient.close();
|
|
847
|
+
* await sseClient.close();
|
|
848
|
+
* await customClient.close();
|
|
849
|
+
* },
|
|
850
|
+
* });
|
|
851
|
+
* ```
|
|
852
|
+
*/
|
|
853
|
+
export async function createMCPToolsFromConfigs(
|
|
854
|
+
configs: MCPClientConfig[],
|
|
855
|
+
options: { gracefulDegradation?: boolean } = {},
|
|
856
|
+
): Promise<{
|
|
857
|
+
tools: SDKToolSet;
|
|
858
|
+
clients: MCPClient[];
|
|
859
|
+
closeAllClients: () => Promise<void>;
|
|
860
|
+
}> {
|
|
861
|
+
const clients: MCPClient[] = [];
|
|
862
|
+
const toolSets: SDKToolSet[] = [];
|
|
863
|
+
|
|
864
|
+
// Create all clients in parallel for better performance
|
|
865
|
+
const clientPromises = configs.map(async (config): Promise<MCPClientResult | null> => {
|
|
866
|
+
const retryConfig = config.retry ?? DEFAULT_RETRY_CONFIG;
|
|
867
|
+
const timeoutMs = config.timeoutMs || 30000;
|
|
868
|
+
const enableGracefulDegradation =
|
|
869
|
+
config.gracefulDegradation ?? options.gracefulDegradation ?? false;
|
|
870
|
+
|
|
871
|
+
try {
|
|
872
|
+
const result = await withRetryAndTimeout(
|
|
873
|
+
async (): Promise<MCPClientResult> => {
|
|
874
|
+
const transport = createTransportFromConfig(config.transport);
|
|
875
|
+
|
|
876
|
+
// Create MCP client with transport (following official docs pattern)
|
|
877
|
+
const client = await createMCPClient({ transport });
|
|
878
|
+
|
|
879
|
+
try {
|
|
880
|
+
const toolSet = await withRetryAndTimeout<SDKToolSet>(
|
|
881
|
+
() => client.tools(),
|
|
882
|
+
retryConfig,
|
|
883
|
+
timeoutMs,
|
|
884
|
+
`MCP tools retrieval (${config.name})`,
|
|
885
|
+
);
|
|
886
|
+
|
|
887
|
+
return { client, toolSet, config };
|
|
888
|
+
} catch (error) {
|
|
889
|
+
try {
|
|
890
|
+
await client.close();
|
|
891
|
+
} catch (closeError) {
|
|
892
|
+
logError(`Failed to close failed client ${config.name}`, {
|
|
893
|
+
operation: 'mcp_client_cleanup',
|
|
894
|
+
metadata: { clientName: config.name },
|
|
895
|
+
error: closeError instanceof Error ? closeError : new Error(String(closeError)),
|
|
896
|
+
});
|
|
897
|
+
}
|
|
898
|
+
|
|
899
|
+
throw error;
|
|
900
|
+
}
|
|
901
|
+
},
|
|
902
|
+
retryConfig,
|
|
903
|
+
timeoutMs,
|
|
904
|
+
`MCP client creation (${config.name})`,
|
|
905
|
+
);
|
|
906
|
+
|
|
907
|
+
return result;
|
|
908
|
+
} catch (error) {
|
|
909
|
+
const mcpError = new MCPConnectionError(
|
|
910
|
+
`Failed to create MCP client '${config.name}' after retries`,
|
|
911
|
+
config.name,
|
|
912
|
+
config.transport.type,
|
|
913
|
+
error instanceof Error ? error : new Error(String(error)),
|
|
914
|
+
);
|
|
915
|
+
|
|
916
|
+
if (enableGracefulDegradation) {
|
|
917
|
+
logWarn(
|
|
918
|
+
`Failed to create MCP client ${config.name}, continuing with degraded functionality`,
|
|
919
|
+
{
|
|
920
|
+
operation: 'mcp_client_creation_degraded',
|
|
921
|
+
metadata: {
|
|
922
|
+
clientName: config.name,
|
|
923
|
+
transportType: config.transport.type,
|
|
924
|
+
retryAttempts: retryConfig.maxAttempts,
|
|
925
|
+
timeoutMs,
|
|
926
|
+
error: mcpError.message,
|
|
927
|
+
},
|
|
928
|
+
},
|
|
929
|
+
);
|
|
930
|
+
// Return null to filter out later
|
|
931
|
+
return null;
|
|
932
|
+
} else {
|
|
933
|
+
// Re-throw error if not using graceful degradation
|
|
934
|
+
throw mcpError;
|
|
935
|
+
}
|
|
936
|
+
}
|
|
937
|
+
});
|
|
938
|
+
|
|
939
|
+
// Wait for all clients to be created
|
|
940
|
+
const results = await Promise.all(clientPromises);
|
|
941
|
+
|
|
942
|
+
// Filter out failed clients and populate arrays
|
|
943
|
+
for (const result of results) {
|
|
944
|
+
if (result) {
|
|
945
|
+
clients.push(result.client);
|
|
946
|
+
toolSets.push(result.toolSet);
|
|
947
|
+
}
|
|
948
|
+
}
|
|
949
|
+
|
|
950
|
+
// Merge all tool sets using explicit spread operator (following Next.js docs pattern)
|
|
951
|
+
// Note: this approach causes subsequent tool sets to override tools with the same name
|
|
952
|
+
const tools = mergeToolSets(toolSets);
|
|
953
|
+
|
|
954
|
+
// Enhanced cleanup function with better error handling
|
|
955
|
+
const closeAllClients = async (): Promise<void> => {
|
|
956
|
+
const closePromises = clients.map(async (client, index) => {
|
|
957
|
+
try {
|
|
958
|
+
await client.close();
|
|
959
|
+
} catch (error) {
|
|
960
|
+
logWarn(`Failed to close MCP client ${index}`, {
|
|
961
|
+
operation: 'mcp_client_close',
|
|
962
|
+
metadata: {
|
|
963
|
+
clientIndex: index,
|
|
964
|
+
error: error instanceof Error ? error.message : String(error),
|
|
965
|
+
},
|
|
966
|
+
});
|
|
967
|
+
}
|
|
968
|
+
});
|
|
969
|
+
|
|
970
|
+
await Promise.all(closePromises);
|
|
971
|
+
};
|
|
972
|
+
|
|
973
|
+
return {
|
|
974
|
+
tools,
|
|
975
|
+
clients,
|
|
976
|
+
closeAllClients,
|
|
977
|
+
};
|
|
978
|
+
}
|
|
979
|
+
|
|
980
|
+
function mergeToolSets(toolSets: SDKToolSet[]): SDKToolSet {
|
|
981
|
+
const merged: SDKToolSet = {};
|
|
982
|
+
|
|
983
|
+
for (const toolSet of toolSets) {
|
|
984
|
+
Object.assign(merged, toolSet);
|
|
985
|
+
}
|
|
986
|
+
|
|
987
|
+
return merged;
|
|
988
|
+
}
|