@tambo-ai/react 0.74.0 → 0.75.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 +46 -449
- package/dist/hoc/with-tambo-interactable.d.ts +8 -0
- package/dist/hoc/with-tambo-interactable.d.ts.map +1 -1
- package/dist/hoc/with-tambo-interactable.js +5 -2
- package/dist/hoc/with-tambo-interactable.js.map +1 -1
- package/dist/hoc/with-tambo-interactable.test.js +12 -0
- package/dist/hoc/with-tambo-interactable.test.js.map +1 -1
- package/dist/hooks/use-tambo-voice.test.js +3 -0
- package/dist/hooks/use-tambo-voice.test.js.map +1 -1
- package/dist/mcp/mcp-hooks.d.ts.map +1 -1
- package/dist/mcp/mcp-hooks.js +70 -16
- package/dist/mcp/mcp-hooks.js.map +1 -1
- package/dist/mcp/mcp-hooks.test.js +69 -0
- package/dist/mcp/mcp-hooks.test.js.map +1 -1
- package/dist/mcp/tambo-mcp-provider.test.js +24 -0
- package/dist/mcp/tambo-mcp-provider.test.js.map +1 -1
- package/dist/mcp/use-mcp-servers.test.js +9 -0
- package/dist/mcp/use-mcp-servers.test.js.map +1 -1
- package/dist/model/component-metadata.d.ts +4 -4
- package/dist/model/component-metadata.js.map +1 -1
- package/dist/providers/__tests__/thread-input-resource-resolution.test.js +2 -2
- package/dist/providers/__tests__/thread-input-resource-resolution.test.js.map +1 -1
- package/dist/providers/tambo-client-provider.d.ts +6 -0
- package/dist/providers/tambo-client-provider.d.ts.map +1 -1
- package/dist/providers/tambo-client-provider.js +4 -1
- package/dist/providers/tambo-client-provider.js.map +1 -1
- package/dist/providers/tambo-interactable-provider.d.ts.map +1 -1
- package/dist/providers/tambo-interactable-provider.js +8 -0
- package/dist/providers/tambo-interactable-provider.js.map +1 -1
- package/dist/providers/tambo-interactable-provider.test.js +47 -0
- package/dist/providers/tambo-interactable-provider.test.js.map +1 -1
- package/dist/providers/tambo-provider.d.ts.map +1 -1
- package/dist/providers/tambo-provider.js +4 -1
- package/dist/providers/tambo-provider.js.map +1 -1
- package/dist/providers/tambo-stubs.d.ts.map +1 -1
- package/dist/providers/tambo-stubs.js +3 -0
- package/dist/providers/tambo-stubs.js.map +1 -1
- package/dist/providers/tambo-thread-provider-initial-messages.test.js +3 -0
- package/dist/providers/tambo-thread-provider-initial-messages.test.js.map +1 -1
- package/dist/providers/tambo-thread-provider.test.js +3 -0
- package/dist/providers/tambo-thread-provider.test.js.map +1 -1
- package/dist/util/registry-validators.js +1 -1
- package/dist/util/registry-validators.js.map +1 -1
- package/dist/util/resource-content-resolver.test.js +1 -1
- package/dist/util/resource-content-resolver.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-auth-state.d.ts +11 -0
- package/dist/v1/hooks/use-tambo-v1-auth-state.d.ts.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-auth-state.js +48 -0
- package/dist/v1/hooks/use-tambo-v1-auth-state.js.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-auth-state.test.d.ts +2 -0
- package/dist/v1/hooks/use-tambo-v1-auth-state.test.d.ts.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-auth-state.test.js +105 -0
- package/dist/v1/hooks/use-tambo-v1-auth-state.test.js.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-component-state.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-component-state.js +68 -21
- package/dist/v1/hooks/use-tambo-v1-component-state.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-component-state.test.js +100 -0
- package/dist/v1/hooks/use-tambo-v1-component-state.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-messages.test.js +8 -0
- package/dist/v1/hooks/use-tambo-v1-messages.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-send-message.d.ts +19 -1
- package/dist/v1/hooks/use-tambo-v1-send-message.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-send-message.js +86 -9
- package/dist/v1/hooks/use-tambo-v1-send-message.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-send-message.test.js +273 -0
- package/dist/v1/hooks/use-tambo-v1-send-message.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-stream-status.d.ts +2 -2
- package/dist/v1/hooks/use-tambo-v1-stream-status.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-stream-status.js +2 -2
- package/dist/v1/hooks/use-tambo-v1-stream-status.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-stream-status.test.js +11 -11
- package/dist/v1/hooks/use-tambo-v1-stream-status.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread-input.test.js +13 -0
- package/dist/v1/hooks/use-tambo-v1-thread-input.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread-list.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread-list.js +4 -0
- package/dist/v1/hooks/use-tambo-v1-thread-list.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread-list.test.js +6 -0
- package/dist/v1/hooks/use-tambo-v1-thread-list.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread.js +4 -0
- package/dist/v1/hooks/use-tambo-v1-thread.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread.test.js +6 -0
- package/dist/v1/hooks/use-tambo-v1-thread.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1.d.ts +11 -0
- package/dist/v1/hooks/use-tambo-v1.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1.js +5 -0
- package/dist/v1/hooks/use-tambo-v1.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1.test.js +13 -0
- package/dist/v1/hooks/use-tambo-v1.test.js.map +1 -1
- package/dist/v1/index.d.ts +4 -1
- package/dist/v1/index.d.ts.map +1 -1
- package/dist/v1/index.js +5 -2
- package/dist/v1/index.js.map +1 -1
- package/dist/v1/providers/tambo-v1-provider.d.ts +16 -1
- package/dist/v1/providers/tambo-v1-provider.d.ts.map +1 -1
- package/dist/v1/providers/tambo-v1-provider.js +42 -5
- package/dist/v1/providers/tambo-v1-provider.js.map +1 -1
- package/dist/v1/providers/tambo-v1-provider.test.js +19 -2
- package/dist/v1/providers/tambo-v1-provider.test.js.map +1 -1
- package/dist/v1/providers/tambo-v1-stream-context.d.ts +6 -0
- package/dist/v1/providers/tambo-v1-stream-context.d.ts.map +1 -1
- package/dist/v1/providers/tambo-v1-stream-context.js +50 -11
- package/dist/v1/providers/tambo-v1-stream-context.js.map +1 -1
- package/dist/v1/providers/tambo-v1-stream-context.test.js +9 -0
- package/dist/v1/providers/tambo-v1-stream-context.test.js.map +1 -1
- package/dist/v1/providers/tambo-v1-stub-provider.d.ts.map +1 -1
- package/dist/v1/providers/tambo-v1-stub-provider.js +4 -0
- package/dist/v1/providers/tambo-v1-stub-provider.js.map +1 -1
- package/dist/v1/providers/tambo-v1-thread-input-provider.d.ts +11 -0
- package/dist/v1/providers/tambo-v1-thread-input-provider.d.ts.map +1 -1
- package/dist/v1/providers/tambo-v1-thread-input-provider.js +10 -1
- package/dist/v1/providers/tambo-v1-thread-input-provider.js.map +1 -1
- package/dist/v1/types/auth.d.ts +24 -0
- package/dist/v1/types/auth.d.ts.map +1 -0
- package/dist/v1/types/auth.js +3 -0
- package/dist/v1/types/auth.js.map +1 -0
- package/dist/v1/types/message.d.ts +12 -0
- package/dist/v1/types/message.d.ts.map +1 -1
- package/dist/v1/types/message.js.map +1 -1
- package/dist/v1/types/tool-choice.d.ts +8 -0
- package/dist/v1/types/tool-choice.d.ts.map +1 -0
- package/dist/v1/types/tool-choice.js +3 -0
- package/dist/v1/types/tool-choice.js.map +1 -0
- package/dist/v1/utils/event-accumulator.d.ts +28 -2
- package/dist/v1/utils/event-accumulator.d.ts.map +1 -1
- package/dist/v1/utils/event-accumulator.js +67 -15
- package/dist/v1/utils/event-accumulator.js.map +1 -1
- package/dist/v1/utils/event-accumulator.test.js +106 -0
- package/dist/v1/utils/event-accumulator.test.js.map +1 -1
- package/dist/v1/utils/keyed-throttle.d.ts +42 -0
- package/dist/v1/utils/keyed-throttle.d.ts.map +1 -0
- package/dist/v1/utils/keyed-throttle.js +86 -0
- package/dist/v1/utils/keyed-throttle.js.map +1 -0
- package/dist/v1/utils/keyed-throttle.test.d.ts +2 -0
- package/dist/v1/utils/keyed-throttle.test.d.ts.map +1 -0
- package/dist/v1/utils/keyed-throttle.test.js +147 -0
- package/dist/v1/utils/keyed-throttle.test.js.map +1 -0
- package/dist/v1/utils/registry-conversion.d.ts.map +1 -1
- package/dist/v1/utils/registry-conversion.js +2 -0
- package/dist/v1/utils/registry-conversion.js.map +1 -1
- package/dist/v1/utils/registry-conversion.test.js +23 -0
- package/dist/v1/utils/registry-conversion.test.js.map +1 -1
- package/dist/v1/utils/tool-call-tracker.d.ts +10 -0
- package/dist/v1/utils/tool-call-tracker.d.ts.map +1 -1
- package/dist/v1/utils/tool-call-tracker.js +13 -0
- package/dist/v1/utils/tool-call-tracker.js.map +1 -1
- package/dist/v1/utils/tool-call-tracker.test.d.ts +2 -0
- package/dist/v1/utils/tool-call-tracker.test.d.ts.map +1 -0
- package/dist/v1/utils/tool-call-tracker.test.js +67 -0
- package/dist/v1/utils/tool-call-tracker.test.js.map +1 -0
- package/dist/v1/utils/tool-executor.d.ts +34 -0
- package/dist/v1/utils/tool-executor.d.ts.map +1 -1
- package/dist/v1/utils/tool-executor.js +55 -0
- package/dist/v1/utils/tool-executor.js.map +1 -1
- package/dist/v1/utils/tool-executor.test.js +211 -0
- package/dist/v1/utils/tool-executor.test.js.map +1 -1
- package/esm/hoc/with-tambo-interactable.d.ts +8 -0
- package/esm/hoc/with-tambo-interactable.d.ts.map +1 -1
- package/esm/hoc/with-tambo-interactable.js +5 -2
- package/esm/hoc/with-tambo-interactable.js.map +1 -1
- package/esm/hoc/with-tambo-interactable.test.js +12 -0
- package/esm/hoc/with-tambo-interactable.test.js.map +1 -1
- package/esm/hooks/use-tambo-voice.test.js +3 -0
- package/esm/hooks/use-tambo-voice.test.js.map +1 -1
- package/esm/mcp/mcp-hooks.d.ts.map +1 -1
- package/esm/mcp/mcp-hooks.js +70 -16
- package/esm/mcp/mcp-hooks.js.map +1 -1
- package/esm/mcp/mcp-hooks.test.js +69 -0
- package/esm/mcp/mcp-hooks.test.js.map +1 -1
- package/esm/mcp/tambo-mcp-provider.test.js +24 -0
- package/esm/mcp/tambo-mcp-provider.test.js.map +1 -1
- package/esm/mcp/use-mcp-servers.test.js +9 -0
- package/esm/mcp/use-mcp-servers.test.js.map +1 -1
- package/esm/model/component-metadata.d.ts +4 -4
- package/esm/model/component-metadata.js.map +1 -1
- package/esm/providers/__tests__/thread-input-resource-resolution.test.js +2 -2
- package/esm/providers/__tests__/thread-input-resource-resolution.test.js.map +1 -1
- package/esm/providers/tambo-client-provider.d.ts +6 -0
- package/esm/providers/tambo-client-provider.d.ts.map +1 -1
- package/esm/providers/tambo-client-provider.js +4 -1
- package/esm/providers/tambo-client-provider.js.map +1 -1
- package/esm/providers/tambo-interactable-provider.d.ts.map +1 -1
- package/esm/providers/tambo-interactable-provider.js +8 -0
- package/esm/providers/tambo-interactable-provider.js.map +1 -1
- package/esm/providers/tambo-interactable-provider.test.js +47 -0
- package/esm/providers/tambo-interactable-provider.test.js.map +1 -1
- package/esm/providers/tambo-provider.d.ts.map +1 -1
- package/esm/providers/tambo-provider.js +4 -1
- package/esm/providers/tambo-provider.js.map +1 -1
- package/esm/providers/tambo-stubs.d.ts.map +1 -1
- package/esm/providers/tambo-stubs.js +3 -0
- package/esm/providers/tambo-stubs.js.map +1 -1
- package/esm/providers/tambo-thread-provider-initial-messages.test.js +3 -0
- package/esm/providers/tambo-thread-provider-initial-messages.test.js.map +1 -1
- package/esm/providers/tambo-thread-provider.test.js +3 -0
- package/esm/providers/tambo-thread-provider.test.js.map +1 -1
- package/esm/util/registry-validators.js +1 -1
- package/esm/util/registry-validators.js.map +1 -1
- package/esm/util/resource-content-resolver.test.js +1 -1
- package/esm/util/resource-content-resolver.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-auth-state.d.ts +11 -0
- package/esm/v1/hooks/use-tambo-v1-auth-state.d.ts.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-auth-state.js +45 -0
- package/esm/v1/hooks/use-tambo-v1-auth-state.js.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-auth-state.test.d.ts +2 -0
- package/esm/v1/hooks/use-tambo-v1-auth-state.test.d.ts.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-auth-state.test.js +100 -0
- package/esm/v1/hooks/use-tambo-v1-auth-state.test.js.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-component-state.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-component-state.js +68 -21
- package/esm/v1/hooks/use-tambo-v1-component-state.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-component-state.test.js +100 -0
- package/esm/v1/hooks/use-tambo-v1-component-state.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-messages.test.js +8 -0
- package/esm/v1/hooks/use-tambo-v1-messages.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-send-message.d.ts +19 -1
- package/esm/v1/hooks/use-tambo-v1-send-message.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-send-message.js +87 -10
- package/esm/v1/hooks/use-tambo-v1-send-message.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-send-message.test.js +273 -0
- package/esm/v1/hooks/use-tambo-v1-send-message.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-stream-status.d.ts +2 -2
- package/esm/v1/hooks/use-tambo-v1-stream-status.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-stream-status.js +2 -2
- package/esm/v1/hooks/use-tambo-v1-stream-status.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-stream-status.test.js +11 -11
- package/esm/v1/hooks/use-tambo-v1-stream-status.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-input.test.js +13 -0
- package/esm/v1/hooks/use-tambo-v1-thread-input.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-list.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-list.js +4 -0
- package/esm/v1/hooks/use-tambo-v1-thread-list.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-list.test.js +6 -0
- package/esm/v1/hooks/use-tambo-v1-thread-list.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread.js +4 -0
- package/esm/v1/hooks/use-tambo-v1-thread.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread.test.js +6 -0
- package/esm/v1/hooks/use-tambo-v1-thread.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1.d.ts +11 -0
- package/esm/v1/hooks/use-tambo-v1.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1.js +5 -0
- package/esm/v1/hooks/use-tambo-v1.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1.test.js +13 -0
- package/esm/v1/hooks/use-tambo-v1.test.js.map +1 -1
- package/esm/v1/index.d.ts +4 -1
- package/esm/v1/index.d.ts.map +1 -1
- package/esm/v1/index.js +3 -1
- package/esm/v1/index.js.map +1 -1
- package/esm/v1/providers/tambo-v1-provider.d.ts +16 -1
- package/esm/v1/providers/tambo-v1-provider.d.ts.map +1 -1
- package/esm/v1/providers/tambo-v1-provider.js +43 -6
- package/esm/v1/providers/tambo-v1-provider.js.map +1 -1
- package/esm/v1/providers/tambo-v1-provider.test.js +19 -2
- package/esm/v1/providers/tambo-v1-provider.test.js.map +1 -1
- package/esm/v1/providers/tambo-v1-stream-context.d.ts +6 -0
- package/esm/v1/providers/tambo-v1-stream-context.d.ts.map +1 -1
- package/esm/v1/providers/tambo-v1-stream-context.js +51 -12
- package/esm/v1/providers/tambo-v1-stream-context.js.map +1 -1
- package/esm/v1/providers/tambo-v1-stream-context.test.js +9 -0
- package/esm/v1/providers/tambo-v1-stream-context.test.js.map +1 -1
- package/esm/v1/providers/tambo-v1-stub-provider.d.ts.map +1 -1
- package/esm/v1/providers/tambo-v1-stub-provider.js +4 -0
- package/esm/v1/providers/tambo-v1-stub-provider.js.map +1 -1
- package/esm/v1/providers/tambo-v1-thread-input-provider.d.ts +11 -0
- package/esm/v1/providers/tambo-v1-thread-input-provider.d.ts.map +1 -1
- package/esm/v1/providers/tambo-v1-thread-input-provider.js +10 -1
- package/esm/v1/providers/tambo-v1-thread-input-provider.js.map +1 -1
- package/esm/v1/types/auth.d.ts +24 -0
- package/esm/v1/types/auth.d.ts.map +1 -0
- package/esm/v1/types/auth.js +2 -0
- package/esm/v1/types/auth.js.map +1 -0
- package/esm/v1/types/message.d.ts +12 -0
- package/esm/v1/types/message.d.ts.map +1 -1
- package/esm/v1/types/message.js.map +1 -1
- package/esm/v1/types/tool-choice.d.ts +8 -0
- package/esm/v1/types/tool-choice.d.ts.map +1 -0
- package/esm/v1/types/tool-choice.js +2 -0
- package/esm/v1/types/tool-choice.js.map +1 -0
- package/esm/v1/utils/event-accumulator.d.ts +28 -2
- package/esm/v1/utils/event-accumulator.d.ts.map +1 -1
- package/esm/v1/utils/event-accumulator.js +66 -15
- package/esm/v1/utils/event-accumulator.js.map +1 -1
- package/esm/v1/utils/event-accumulator.test.js +106 -0
- package/esm/v1/utils/event-accumulator.test.js.map +1 -1
- package/esm/v1/utils/keyed-throttle.d.ts +42 -0
- package/esm/v1/utils/keyed-throttle.d.ts.map +1 -0
- package/esm/v1/utils/keyed-throttle.js +83 -0
- package/esm/v1/utils/keyed-throttle.js.map +1 -0
- package/esm/v1/utils/keyed-throttle.test.d.ts +2 -0
- package/esm/v1/utils/keyed-throttle.test.d.ts.map +1 -0
- package/esm/v1/utils/keyed-throttle.test.js +145 -0
- package/esm/v1/utils/keyed-throttle.test.js.map +1 -0
- package/esm/v1/utils/registry-conversion.d.ts.map +1 -1
- package/esm/v1/utils/registry-conversion.js +2 -0
- package/esm/v1/utils/registry-conversion.js.map +1 -1
- package/esm/v1/utils/registry-conversion.test.js +23 -0
- package/esm/v1/utils/registry-conversion.test.js.map +1 -1
- package/esm/v1/utils/tool-call-tracker.d.ts +10 -0
- package/esm/v1/utils/tool-call-tracker.d.ts.map +1 -1
- package/esm/v1/utils/tool-call-tracker.js +13 -0
- package/esm/v1/utils/tool-call-tracker.js.map +1 -1
- package/esm/v1/utils/tool-call-tracker.test.d.ts +2 -0
- package/esm/v1/utils/tool-call-tracker.test.d.ts.map +1 -0
- package/esm/v1/utils/tool-call-tracker.test.js +65 -0
- package/esm/v1/utils/tool-call-tracker.test.js.map +1 -0
- package/esm/v1/utils/tool-executor.d.ts +34 -0
- package/esm/v1/utils/tool-executor.d.ts.map +1 -1
- package/esm/v1/utils/tool-executor.js +53 -0
- package/esm/v1/utils/tool-executor.js.map +1 -1
- package/esm/v1/utils/tool-executor.test.js +212 -1
- package/esm/v1/utils/tool-executor.test.js.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tambo-mcp-provider.test.js","sourceRoot":"","sources":["../../src/mcp/tambo-mcp-provider.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import type { RequestHandlerExtra } from \"@modelcontextprotocol/sdk/shared/protocol.js\";\nimport type {\n ClientNotification,\n ClientRequest,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { render, waitFor } from \"@testing-library/react\";\nimport React, { useEffect } from \"react\";\nimport {\n TamboClientContext,\n useTamboClient,\n} from \"../providers/tambo-client-provider\";\nimport { TamboMcpTokenProvider } from \"../providers/tambo-mcp-token-provider\";\nimport {\n TamboRegistryProvider,\n useTamboRegistry,\n} from \"../providers/tambo-registry-provider\";\nimport { MCPClient, MCPTransport } from \"./mcp-client\";\nimport {\n extractErrorMessage,\n TamboMcpProvider,\n useTamboMcpServers,\n type McpServer,\n type ProviderMCPHandlers,\n} from \"./tambo-mcp-provider\";\n\n// Import the private function for testing by re-exporting it for tests only\n// We'll need to export it temporarily or test it through public API\n\n// Helper to create mock RequestHandlerExtra for testing\nfunction createMockExtra(): RequestHandlerExtra<\n ClientRequest,\n ClientNotification\n> {\n return {\n signal: new AbortController().signal,\n requestId: \"test-request-id\",\n sendNotification: (async () => {}) as any,\n sendRequest: (async () => ({ _meta: {} })) as any,\n };\n}\n\n// Mock the MCP client to avoid ES module issues\njest.mock(\"./mcp-client\", () => ({\n MCPClient: jest.fn(),\n MCPTransport: {\n SSE: \"sse\",\n HTTP: \"http\",\n },\n}));\n\n// Mock the registry provider to avoid dependency issues\njest.mock(\"../providers/tambo-registry-provider\", () => {\n const actual = jest.requireActual(\"../providers/tambo-registry-provider\");\n return {\n ...actual,\n useTamboRegistry: jest.fn(),\n };\n});\n\n// Mock the client provider to avoid dependency issues\njest.mock(\"../providers/tambo-client-provider\", () => {\n return {\n useTamboClient: jest.fn(),\n TamboClientContext: React.createContext(undefined),\n };\n});\n\n// Helper to wrap tests with all required providers (used across multiple describe blocks)\nconst TestWrapper: React.FC<{\n mcpServers: any;\n handlers?: ProviderMCPHandlers;\n children: React.ReactNode;\n}> = ({ mcpServers, handlers, children }) => {\n const client = useTamboClient();\n return (\n <TamboClientContext.Provider\n value={{\n client,\n queryClient: {} as any,\n isUpdatingToken: false,\n }}\n >\n <TamboRegistryProvider mcpServers={mcpServers}>\n <TamboMcpTokenProvider>\n <TamboMcpProvider handlers={handlers}>{children}</TamboMcpProvider>\n </TamboMcpTokenProvider>\n </TamboRegistryProvider>\n </TamboClientContext.Provider>\n );\n};\n\ndescribe(\"extractErrorMessage\", () => {\n describe(\"Array content handling\", () => {\n it(\"should extract text from array content with multiple text items\", () => {\n const content = [\n { type: \"text\", text: \"Error:\" },\n { type: \"text\", text: \"Tool execution failed\" },\n { type: \"image\", url: \"http://example.com/error.png\" }, // Should be filtered out\n ];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Error: Tool execution failed\");\n });\n\n it(\"should extract text from array content with single text item\", () => {\n const content = [{ type: \"text\", text: \"Simple error message\" }];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Simple error message\");\n });\n\n it(\"should return fallback message for array content with no text items\", () => {\n const content = [\n { type: \"image\", url: \"http://example.com/error.png\" },\n { type: \"resource\", uri: \"file://error.log\" },\n ];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Error occurred but no details provided\");\n });\n\n it(\"should return fallback message for empty array content\", () => {\n const content: any[] = [];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Error occurred but no details provided\");\n });\n\n it(\"should handle array content with mixed types correctly\", () => {\n const content = [\n { type: \"resource\", uri: \"file://log.txt\" },\n { type: \"text\", text: \"First error\" },\n { type: \"image\", url: \"http://example.com/img.png\" },\n { type: \"text\", text: \"Second error\" },\n { type: \"unknown\", data: \"something\" },\n ];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"First error Second error\");\n });\n\n it(\"should handle array content with malformed items\", () => {\n const content = [\n null,\n { type: \"text\", text: \"Valid error\" },\n { type: \"text\" }, // Missing text property\n { type: \"text\", text: null }, // Invalid text type\n { type: \"text\", text: \"Another valid error\" },\n ];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Valid error Another valid error\");\n });\n });\n\n describe(\"Non-array content handling\", () => {\n it(\"should return string content as-is\", () => {\n const content = \"Direct error message\";\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Direct error message\");\n });\n\n it(\"should handle null content\", () => {\n const content = null;\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Unknown error occurred\");\n });\n\n it(\"should handle undefined content\", () => {\n const content = undefined;\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Unknown error occurred\");\n });\n\n it(\"should handle number content\", () => {\n const content = 42;\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"42\");\n });\n\n it(\"should handle boolean content\", () => {\n const content = false;\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"false\");\n });\n\n it(\"should handle object content\", () => {\n const content = { error: \"Something went wrong\" };\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe('{\"error\":\"Something went wrong\"}');\n });\n\n it(\"should handle complex object content\", () => {\n const content = {\n error: \"Something went wrong\",\n code: 500,\n details: { message: \"Internal server error\" },\n };\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\n '{\"error\":\"Something went wrong\",\"code\":500,\"details\":{\"message\":\"Internal server error\"}}',\n );\n });\n\n it(\"should handle empty object content\", () => {\n const content = {};\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"{}\");\n });\n });\n});\n\ndescribe(\"TamboMcpProvider server list changes\", () => {\n beforeEach(() => {\n // Mock registry so tool registration is a no-op\n (useTamboRegistry as unknown as jest.Mock).mockReturnValue({\n registerTool: jest.fn(),\n });\n\n // Mock client with baseURL\n (useTamboClient as unknown as jest.Mock).mockReturnValue({\n baseURL: \"https://api.tambo.co\",\n });\n\n // Ensure MCPClient.create exists and returns a fake client with listTools and close\n (MCPClient as unknown as any).create = jest.fn().mockResolvedValue({\n listTools: jest.fn().mockResolvedValue([]),\n close: jest.fn(),\n });\n });\n\n const Capture: React.FC<{ onUpdate: (servers: McpServer[]) => void }> = ({\n onUpdate,\n }) => {\n const servers = useTamboMcpServers();\n useEffect(() => {\n onUpdate(servers);\n }, [servers, onUpdate]);\n return <div data-testid=\"urls\">{servers.map((s) => s.url).join(\",\")}</div>;\n };\n\n it(\"adds a new server when the list grows\", async () => {\n let latest: McpServer[] = [];\n const { rerender, getByTestId } = render(\n <TamboClientContext.Provider\n value={{\n client: useTamboClient(),\n queryClient: {} as any,\n isUpdatingToken: false,\n }}\n >\n <TamboRegistryProvider mcpServers={[\"https://a.example\"]}>\n <TamboMcpTokenProvider>\n <TamboMcpProvider>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>\n </TamboRegistryProvider>\n </TamboClientContext.Provider>,\n );\n\n // Wait for initial connection\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // Add new server\n rerender(\n <TamboClientContext.Provider\n value={{\n client: useTamboClient(),\n queryClient: {} as any,\n isUpdatingToken: false,\n }}\n >\n <TamboRegistryProvider\n mcpServers={[\"https://a.example\", \"https://b.example\"]}\n >\n <TamboMcpTokenProvider>\n <TamboMcpProvider>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>\n </TamboRegistryProvider>\n </TamboClientContext.Provider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n const urls = getByTestId(\"urls\").textContent || \"\";\n expect(urls).toContain(\"https://a.example\");\n expect(urls).toContain(\"https://b.example\");\n });\n });\n\n it(\"removes a server when the list shrinks\", async () => {\n let latest: McpServer[] = [];\n const { rerender, getByTestId } = render(\n <TamboClientContext.Provider\n value={{\n client: useTamboClient(),\n queryClient: {} as any,\n isUpdatingToken: false,\n }}\n >\n <TamboRegistryProvider\n mcpServers={[\"https://a.example\", \"https://b.example\"]}\n >\n <TamboMcpTokenProvider>\n <TamboMcpProvider>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>\n </TamboRegistryProvider>\n </TamboClientContext.Provider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n });\n\n // Remove one server\n rerender(\n <TamboClientContext.Provider\n value={{\n client: useTamboClient(),\n queryClient: {} as any,\n isUpdatingToken: false,\n }}\n >\n <TamboRegistryProvider mcpServers={[\"https://a.example\"]}>\n <TamboMcpTokenProvider>\n <TamboMcpProvider>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>\n </TamboRegistryProvider>\n </TamboClientContext.Provider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n const urls = getByTestId(\"urls\").textContent || \"\";\n expect(urls).toContain(\"https://a.example\");\n expect(urls).not.toContain(\"https://b.example\");\n });\n });\n\n it(\"does not duplicate when a new copy of the same list is passed\", async () => {\n let latest: McpServer[] = [];\n const initial = [\n { url: \"https://a.example\", transport: MCPTransport.SSE },\n { url: \"https://b.example\", transport: MCPTransport.SSE },\n ];\n\n const { rerender } = render(\n <TestWrapper mcpServers={initial}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n });\n\n // Pass a new array instance with the same logical servers\n const same = [\n { url: \"https://a.example\", transport: MCPTransport.SSE },\n { url: \"https://b.example\", transport: MCPTransport.SSE },\n ];\n rerender(\n <TestWrapper mcpServers={same}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n const urls = latest.map((s) => s.url).sort();\n expect(urls).toEqual([\"https://a.example\", \"https://b.example\"].sort());\n });\n });\n\n it(\"forwards maxCalls from MCP listTools to registry.registerTool\", async () => {\n const registerToolMock = jest.fn();\n\n // Mock registry to capture registerTool calls\n (useTamboRegistry as unknown as jest.Mock).mockReturnValue({\n registerTool: registerToolMock,\n });\n\n // Mock client\n (useTamboClient as unknown as jest.Mock).mockReturnValue({\n baseURL: \"https://api.tambo.co\",\n });\n\n // Prepare MCP client to return a tool with maxCalls in its metadata\n (MCPClient as unknown as any).create = jest.fn().mockResolvedValue({\n listTools: jest.fn().mockResolvedValue([\n {\n name: \"mcp-tool\",\n description: \"Tool from MCP\",\n inputSchema: {},\n outputSchema: {},\n // MCP may include maxCalls in the tool metadata\n maxCalls: 7,\n },\n ]),\n close: jest.fn(),\n });\n\n // Render provider to trigger MCP sync\n render(\n <TestWrapper mcpServers={[\"https://mcp.example\"]}>\n <div />\n </TestWrapper>,\n );\n\n // Wait for registerTool to be called\n await waitFor(() => {\n expect(registerToolMock).toHaveBeenCalled();\n });\n\n // Inspect the first registered tool\n const registered = registerToolMock.mock.calls[0][0];\n expect(registered).toBeDefined();\n expect(registered.name).toBe(\"mcp-tool\");\n expect(registered.maxCalls).toBe(7);\n });\n\n it(\"reuses client when same server is passed with new array instance\", async () => {\n const createSpy = jest.fn().mockResolvedValue({\n listTools: jest.fn().mockResolvedValue([]),\n close: jest.fn(),\n });\n (MCPClient as unknown as any).create = createSpy;\n\n let latest: McpServer[] = [];\n const initial = [{ url: \"https://a.example\", transport: MCPTransport.SSE }];\n\n const { rerender } = render(\n <TestWrapper mcpServers={initial}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // Verify client was created once\n expect(createSpy).toHaveBeenCalledTimes(1);\n const firstClient = latest[0].client;\n\n // Pass a new array with same server\n const same = [{ url: \"https://a.example\", transport: MCPTransport.SSE }];\n rerender(\n <TestWrapper mcpServers={same}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // Client should NOT have been created again\n expect(createSpy).toHaveBeenCalledTimes(1);\n // Should be the exact same client instance\n expect(latest[0].client).toBe(firstClient);\n });\n\n it(\"calls close() on removed server clients\", async () => {\n const closeSpy = jest.fn();\n const createSpy = jest.fn().mockResolvedValue({\n listTools: jest.fn().mockResolvedValue([]),\n close: closeSpy,\n });\n (MCPClient as unknown as any).create = createSpy;\n\n let latest: McpServer[] = [];\n const { rerender } = render(\n <TamboClientContext.Provider\n value={{\n client: useTamboClient(),\n queryClient: {} as any,\n isUpdatingToken: false,\n }}\n >\n <TamboRegistryProvider\n mcpServers={[\"https://a.example\", \"https://b.example\"]}\n >\n <TamboMcpTokenProvider>\n <TamboMcpProvider>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>\n </TamboRegistryProvider>\n </TamboClientContext.Provider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n });\n\n expect(closeSpy).not.toHaveBeenCalled();\n\n // Remove one server\n rerender(\n <TamboClientContext.Provider\n value={{\n client: useTamboClient(),\n queryClient: {} as any,\n isUpdatingToken: false,\n }}\n >\n <TamboRegistryProvider mcpServers={[\"https://a.example\"]}>\n <TamboMcpTokenProvider>\n <TamboMcpProvider>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>\n </TamboRegistryProvider>\n </TamboClientContext.Provider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // close() should have been called once for the removed server\n expect(closeSpy).toHaveBeenCalledTimes(1);\n });\n\n it(\"calls close() on all clients when provider unmounts\", async () => {\n const closeSpy = jest.fn();\n const createSpy = jest.fn().mockResolvedValue({\n listTools: jest.fn().mockResolvedValue([]),\n close: closeSpy,\n });\n (MCPClient as unknown as any).create = createSpy;\n\n let latest: McpServer[] = [];\n const { unmount } = render(\n <TamboClientContext.Provider\n value={{\n client: useTamboClient(),\n queryClient: {} as any,\n isUpdatingToken: false,\n }}\n >\n <TamboRegistryProvider\n mcpServers={[\"https://a.example\", \"https://b.example\"]}\n >\n <TamboMcpTokenProvider>\n <TamboMcpProvider>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>\n </TamboRegistryProvider>\n </TamboClientContext.Provider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n });\n\n expect(closeSpy).not.toHaveBeenCalled();\n\n // Unmount the provider\n unmount();\n\n // close() should have been called for both clients\n expect(closeSpy).toHaveBeenCalledTimes(2);\n });\n\n it(\"creates new client when customHeaders change\", async () => {\n const closeSpy = jest.fn();\n let clientIdCounter = 0;\n const createSpy = jest.fn().mockImplementation(async () => {\n const id = ++clientIdCounter;\n return {\n id, // Add an ID so we can track which client is which\n listTools: jest.fn().mockResolvedValue([]),\n close: closeSpy,\n };\n });\n (MCPClient as unknown as any).create = createSpy;\n\n let latest: McpServer[] = [];\n const { rerender } = render(\n <TestWrapper\n mcpServers={[\n {\n url: \"https://a.example\",\n transport: MCPTransport.SSE,\n customHeaders: { Authorization: \"Bearer token1\" },\n },\n ]}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n expect(createSpy).toHaveBeenCalledTimes(1);\n });\n\n const firstClientId = (latest[0].client as any)?.id;\n expect(firstClientId).toBe(1);\n\n // Change the customHeaders\n rerender(\n <TestWrapper\n mcpServers={[\n {\n url: \"https://a.example\",\n transport: MCPTransport.SSE,\n customHeaders: { Authorization: \"Bearer token2\" },\n },\n ]}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n // Wait for old client to be closed and new client to be created\n await waitFor(\n () => {\n expect(closeSpy).toHaveBeenCalledTimes(1);\n expect(createSpy).toHaveBeenCalledTimes(2);\n expect(latest.length).toBe(1);\n const newClientId = (latest[0].client as any)?.id;\n expect(newClientId).toBe(2); // Should be the new client\n },\n { timeout: 3000 },\n );\n });\n\n // Note: Token changes for the internal Tambo server are covered by the\n // \"creates new client when customHeaders change\" test above, since token\n // changes result in different Authorization headers, which trigger client recreation.\n});\n\ndescribe(\"TamboMcpProvider handler support\", () => {\n let mockClient: any;\n let createSpy: jest.Mock;\n\n beforeEach(() => {\n // Mock registry so tool registration is a no-op\n (useTamboRegistry as unknown as jest.Mock).mockReturnValue({\n registerTool: jest.fn(),\n });\n\n // Mock client with baseURL\n (useTamboClient as unknown as jest.Mock).mockReturnValue({\n baseURL: \"https://api.tambo.co\",\n });\n\n // Create a mock client with update methods\n mockClient = {\n listTools: jest.fn().mockResolvedValue([]),\n updateElicitationHandler: jest.fn(),\n updateSamplingHandler: jest.fn(),\n close: jest.fn(),\n };\n\n // Mock MCPClient.create to return our mock client\n createSpy = jest.fn().mockResolvedValue(mockClient);\n (MCPClient as unknown as any).create = createSpy;\n });\n\n const Capture: React.FC<{ onUpdate: (servers: McpServer[]) => void }> = ({\n onUpdate,\n }) => {\n const servers = useTamboMcpServers();\n useEffect(() => {\n onUpdate(servers);\n }, [servers, onUpdate]);\n return null;\n };\n\n it(\"should pass provider-level elicitation handler to MCPClient.create\", async () => {\n const mockElicitationHandler = jest.fn().mockResolvedValue({\n content: [{ type: \"text\", text: \"test\" }],\n });\n\n const handlers: ProviderMCPHandlers = {\n elicitation: mockElicitationHandler,\n };\n\n let latest: McpServer[] = [];\n render(\n <TestWrapper mcpServers={[\"https://test.example\"]} handlers={handlers}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // Verify MCPClient.create was called with an HTTP transport and wrapped handler\n expect(createSpy).toHaveBeenCalledWith(\n \"https://test.example\",\n MCPTransport.HTTP,\n undefined,\n undefined,\n undefined,\n expect.objectContaining({\n elicitation: expect.any(Function),\n }),\n );\n\n // Get the actual handler that was passed\n const passedHandlers = createSpy.mock.calls[0][5];\n expect(passedHandlers.elicitation).toBeDefined();\n\n // Call the wrapped handler and verify it receives serverInfo\n const mockRequest = {\n method: \"sampling/createMessage\" as const,\n params: {},\n };\n const mockExtra = createMockExtra();\n await passedHandlers.elicitation(mockRequest, mockExtra);\n\n expect(mockElicitationHandler).toHaveBeenCalledWith(\n mockRequest,\n mockExtra,\n expect.objectContaining({\n url: \"https://test.example\",\n serverKey: \"test\",\n }),\n );\n });\n\n it(\"should pass provider-level sampling handler to MCPClient.create\", async () => {\n const mockSamplingHandler = jest.fn().mockResolvedValue({\n model: \"test-model\",\n stopReason: \"endTurn\",\n role: \"assistant\",\n content: { type: \"text\", text: \"response\" },\n });\n\n const handlers: ProviderMCPHandlers = {\n sampling: mockSamplingHandler,\n };\n\n let latest: McpServer[] = [];\n render(\n <TestWrapper mcpServers={[\"https://test.example\"]} handlers={handlers}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // Verify MCPClient.create was called with HTTP transport and sampling handler\n expect(createSpy).toHaveBeenCalledWith(\n \"https://test.example\",\n MCPTransport.HTTP,\n undefined,\n undefined,\n undefined,\n expect.objectContaining({\n sampling: expect.any(Function),\n }),\n );\n\n // Get the actual handler and verify it receives serverInfo\n const passedHandlers = createSpy.mock.calls[0][5];\n const mockRequest = {\n method: \"sampling/createMessage\" as const,\n params: {\n messages: [],\n modelPreferences: {},\n },\n };\n const mockExtra = createMockExtra();\n await passedHandlers.sampling(mockRequest, mockExtra);\n\n expect(mockSamplingHandler).toHaveBeenCalledWith(\n mockRequest,\n mockExtra,\n expect.objectContaining({\n url: \"https://test.example\",\n serverKey: \"test\",\n }),\n );\n });\n\n it(\"should allow per-server handlers to override provider-level handlers\", async () => {\n const providerElicitationHandler = jest.fn().mockResolvedValue({\n content: [{ type: \"text\", text: \"provider\" }],\n });\n\n const serverElicitationHandler = jest.fn().mockResolvedValue({\n content: [{ type: \"text\", text: \"server\" }],\n });\n\n const handlers: ProviderMCPHandlers = {\n elicitation: providerElicitationHandler,\n };\n\n let latest: McpServer[] = [];\n render(\n <TestWrapper\n mcpServers={[\n {\n url: \"https://test.example\",\n handlers: {\n elicitation: serverElicitationHandler,\n },\n },\n ]}\n handlers={handlers}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // Verify the per-server handler was used, not the provider handler\n const passedHandlers = createSpy.mock.calls[0][5];\n expect(passedHandlers.elicitation).toBe(serverElicitationHandler);\n });\n\n it(\"should pass different serverInfo to handlers for different servers\", async () => {\n const mockElicitationHandler = jest.fn().mockResolvedValue({\n content: [{ type: \"text\", text: \"test\" }],\n });\n\n const handlers: ProviderMCPHandlers = {\n elicitation: mockElicitationHandler,\n };\n\n let latest: McpServer[] = [];\n render(\n <TestWrapper\n mcpServers={[\n { url: \"https://server-a.example\", name: \"Server A\" },\n { url: \"https://server-b.example\", name: \"Server B\" },\n ]}\n handlers={handlers}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n });\n\n // Verify both servers got handlers\n expect(createSpy).toHaveBeenCalledTimes(2);\n\n // Get handlers for both servers\n const serverAHandlers = createSpy.mock.calls[0][5];\n const serverBHandlers = createSpy.mock.calls[1][5];\n\n const mockRequest = {\n method: \"sampling/createMessage\" as const,\n params: {},\n };\n const mockExtra = createMockExtra();\n\n // Call handler for server A\n await serverAHandlers.elicitation(mockRequest, mockExtra);\n expect(mockElicitationHandler).toHaveBeenCalledWith(\n mockRequest,\n mockExtra,\n expect.objectContaining({\n url: \"https://server-a.example\",\n name: \"Server A\",\n }),\n );\n\n mockElicitationHandler.mockClear();\n\n // Call handler for server B\n await serverBHandlers.elicitation(mockRequest, mockExtra);\n expect(mockElicitationHandler).toHaveBeenCalledWith(\n mockRequest,\n mockExtra,\n expect.objectContaining({\n url: \"https://server-b.example\",\n name: \"Server B\",\n }),\n );\n });\n\n it(\"should update handlers when provider handlers change\", async () => {\n const initialHandler = jest.fn().mockResolvedValue({\n content: [{ type: \"text\", text: \"initial\" }],\n });\n\n const updatedHandler = jest.fn().mockResolvedValue({\n content: [{ type: \"text\", text: \"updated\" }],\n });\n\n let latest: McpServer[] = [];\n const { rerender } = render(\n <TestWrapper\n mcpServers={[\"https://test.example\"]}\n handlers={{ elicitation: initialHandler }}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // Update the handlers\n rerender(\n <TestWrapper\n mcpServers={[\"https://test.example\"]}\n handlers={{ elicitation: updatedHandler }}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(mockClient.updateElicitationHandler).toHaveBeenCalled();\n });\n\n // Verify the handler was updated\n expect(mockClient.updateElicitationHandler).toHaveBeenCalledWith(\n expect.any(Function),\n );\n });\n});\n\ndescribe(\"TamboMcpProvider serverKey derivation and tool prefixing\", () => {\n let mockRegisterTool: jest.Mock;\n\n beforeEach(() => {\n mockRegisterTool = jest.fn();\n\n (useTamboRegistry as unknown as jest.Mock).mockReturnValue({\n registerTool: mockRegisterTool,\n });\n\n (useTamboClient as unknown as jest.Mock).mockReturnValue({\n baseURL: \"https://api.tambo.co\",\n });\n });\n\n const Capture: React.FC<{ onUpdate: (servers: McpServer[]) => void }> = ({\n onUpdate,\n }) => {\n const servers = useTamboMcpServers();\n useEffect(() => {\n onUpdate(servers);\n }, [servers, onUpdate]);\n return null;\n };\n\n describe(\"serverKey derivation\", () => {\n it(\"should derive serverKey from URL when not provided\", async () => {\n (MCPClient as unknown as any).create = jest.fn().mockResolvedValue({\n listTools: jest.fn().mockResolvedValue([]),\n close: jest.fn(),\n });\n\n let latest: McpServer[] = [];\n render(\n <TestWrapper mcpServers={[\"https://mcp.linear.app/mcp\"]}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n expect(latest[0].serverKey).toBe(\"linear\");\n });\n });\n\n it(\"should use provided serverKey when specified\", async () => {\n (MCPClient as unknown as any).create = jest.fn().mockResolvedValue({\n listTools: jest.fn().mockResolvedValue([]),\n close: jest.fn(),\n });\n\n let latest: McpServer[] = [];\n render(\n <TestWrapper\n mcpServers={[\n {\n url: \"https://mcp.linear.app/mcp\",\n serverKey: \"custom-key\",\n },\n ]}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n expect(latest[0].serverKey).toBe(\"custom-key\");\n });\n });\n\n it(\"should derive serverKey correctly for various URL patterns\", async () => {\n (MCPClient as unknown as any).create = jest.fn().mockResolvedValue({\n listTools: jest.fn().mockResolvedValue([]),\n close: jest.fn(),\n });\n\n const testCases = [\n { url: \"https://api.github.com\", expected: \"github\" },\n { url: \"https://google.com\", expected: \"google\" },\n { url: \"https://google.co.uk\", expected: \"google\" },\n { url: \"https://mcp.company.co.uk\", expected: \"company\" },\n { url: \"https://www.example.com\", expected: \"example\" },\n ];\n\n for (const { url, expected } of testCases) {\n let latest: McpServer[] = [];\n const { unmount } = render(\n <TestWrapper mcpServers={[url]}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n expect(latest[0].serverKey).toBe(expected);\n });\n\n unmount();\n }\n });\n });\n\n describe(\"tool name prefixing\", () => {\n it(\"should NOT prefix tool names when only one server is present\", async () => {\n (MCPClient as unknown as any).create = jest.fn().mockResolvedValue({\n listTools: jest\n .fn()\n .mockResolvedValue([\n { name: \"test-tool\", description: \"A test tool\" },\n ]),\n close: jest.fn(),\n });\n\n let latest: McpServer[] = [];\n render(\n <TestWrapper mcpServers={[\"https://mcp.linear.app/mcp\"]}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n expect(mockRegisterTool).toHaveBeenCalledWith(\n expect.objectContaining({\n name: \"test-tool\", // NOT prefixed\n }),\n );\n });\n });\n\n it(\"should prefix tool names when multiple servers are present\", async () => {\n (MCPClient as unknown as any).create = jest.fn().mockResolvedValue({\n listTools: jest\n .fn()\n .mockResolvedValue([\n { name: \"test-tool\", description: \"A test tool\" },\n ]),\n close: jest.fn(),\n });\n\n let latest: McpServer[] = [];\n render(\n <TestWrapper\n mcpServers={[\"https://mcp.linear.app/mcp\", \"https://api.github.com\"]}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(\n () => {\n expect(latest.length).toBe(2);\n // Check that tools are registered with prefixed names\n const calls = mockRegisterTool.mock.calls;\n const toolNames = calls.map((call) => call[0].name);\n\n // Debug: log the actual tool names registered\n if (toolNames.length < 2) {\n throw new Error(\n `Only ${toolNames.length} tools registered: ${toolNames.join(\", \")}`,\n );\n }\n\n expect(\n calls.some((call) => call[0].name === \"linear__test-tool\"),\n ).toBe(true);\n expect(\n calls.some((call) => call[0].name === \"github__test-tool\"),\n ).toBe(true);\n },\n { timeout: 5000 },\n );\n });\n\n it(\"should use custom serverKey in prefix when provided\", async () => {\n (MCPClient as unknown as any).create = jest.fn().mockResolvedValue({\n listTools: jest\n .fn()\n .mockResolvedValue([\n { name: \"test-tool\", description: \"A test tool\" },\n ]),\n close: jest.fn(),\n });\n\n let latest: McpServer[] = [];\n render(\n <TestWrapper\n mcpServers={[\n {\n url: \"https://mcp.linear.app/mcp\",\n serverKey: \"my-server\",\n },\n \"https://api.github.com\",\n ]}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n const calls = mockRegisterTool.mock.calls;\n expect(\n calls.some((call) => call[0].name === \"my-server__test-tool\"),\n ).toBe(true);\n });\n });\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"tambo-mcp-provider.test.js","sourceRoot":"","sources":["../../src/mcp/tambo-mcp-provider.test.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,kDAAyD;AACzD,+CAAyC;AACzC,8EAG4C;AAC5C,oFAA8E;AAC9E,kFAG8C;AAC9C,6CAAuD;AACvD,6DAM8B;AAE9B,4EAA4E;AAC5E,oEAAoE;AAEpE,wDAAwD;AACxD,SAAS,eAAe;IAItB,OAAO;QACL,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC,MAAM;QACpC,SAAS,EAAE,iBAAiB;QAC5B,gBAAgB,EAAE,CAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAQ;QACzC,WAAW,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAQ;KAClD,CAAC;AACJ,CAAC;AAED,gDAAgD;AAChD,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC;IAC/B,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE;IACpB,YAAY,EAAE;QACZ,GAAG,EAAE,KAAK;QACV,IAAI,EAAE,MAAM;KACb;CACF,CAAC,CAAC,CAAC;AAEJ,wDAAwD;AACxD,IAAI,CAAC,IAAI,CAAC,sCAAsC,EAAE,GAAG,EAAE;IACrD,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,sCAAsC,CAAC,CAAC;IAC1E,OAAO;QACL,GAAG,MAAM;QACT,gBAAgB,EAAE,IAAI,CAAC,EAAE,EAAE;KAC5B,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,sDAAsD;AACtD,IAAI,CAAC,IAAI,CAAC,oCAAoC,EAAE,GAAG,EAAE;IACnD,OAAO;QACL,cAAc,EAAE,IAAI,CAAC,EAAE,EAAE;QACzB,kBAAkB,EAAE,eAAK,CAAC,aAAa,CAAC,SAAS,CAAC;KACnD,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,0FAA0F;AAC1F,MAAM,WAAW,GAIZ,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE;IAC1C,MAAM,MAAM,GAAG,IAAA,sCAAc,GAAE,CAAC;IAChC,OAAO,CACL,8BAAC,0CAAkB,CAAC,QAAQ,IAC1B,KAAK,EAAE;YACL,MAAM;YACN,WAAW,EAAE,EAAS;YACtB,eAAe,EAAE,KAAK;YACtB,kBAAkB,EAAE,IAAI;YACxB,SAAS,EAAE,SAAS;YACpB,aAAa,EAAE,KAAK;SACrB;QAED,8BAAC,+CAAqB,IAAC,UAAU,EAAE,UAAU;YAC3C,8BAAC,gDAAqB;gBACpB,8BAAC,qCAAgB,IAAC,QAAQ,EAAE,QAAQ,IAAG,QAAQ,CAAoB,CAC7C,CACF,CACI,CAC/B,CAAC;AACJ,CAAC,CAAC;AAEF,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;QACtC,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;YACzE,MAAM,OAAO,GAAG;gBACd,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAChC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,uBAAuB,EAAE;gBAC/C,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,8BAA8B,EAAE,EAAE,yBAAyB;aAClF,CAAC;YAEF,MAAM,MAAM,GAAG,IAAA,wCAAmB,EAAC,OAAO,CAAC,CAAC;YAE5C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;YACtE,MAAM,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,sBAAsB,EAAE,CAAC,CAAC;YAEjE,MAAM,MAAM,GAAG,IAAA,wCAAmB,EAAC,OAAO,CAAC,CAAC;YAE5C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;YAC7E,MAAM,OAAO,GAAG;gBACd,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,8BAA8B,EAAE;gBACtD,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,kBAAkB,EAAE;aAC9C,CAAC;YAEF,MAAM,MAAM,GAAG,IAAA,wCAAmB,EAAC,OAAO,CAAC,CAAC;YAE5C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;YAChE,MAAM,OAAO,GAAU,EAAE,CAAC;YAE1B,MAAM,MAAM,GAAG,IAAA,wCAAmB,EAAC,OAAO,CAAC,CAAC;YAE5C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;YAChE,MAAM,OAAO,GAAG;gBACd,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,gBAAgB,EAAE;gBAC3C,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE;gBACrC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,4BAA4B,EAAE;gBACpD,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE;gBACtC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE;aACvC,CAAC;YAEF,MAAM,MAAM,GAAG,IAAA,wCAAmB,EAAC,OAAO,CAAC,CAAC;YAE5C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,MAAM,OAAO,GAAG;gBACd,IAAI;gBACJ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE;gBACrC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,wBAAwB;gBAC1C,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,oBAAoB;gBAClD,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,EAAE;aAC9C,CAAC;YAEF,MAAM,MAAM,GAAG,IAAA,wCAAmB,EAAC,OAAO,CAAC,CAAC;YAE5C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;QAC1C,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,OAAO,GAAG,sBAAsB,CAAC;YAEvC,MAAM,MAAM,GAAG,IAAA,wCAAmB,EAAC,OAAO,CAAC,CAAC;YAE5C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,MAAM,OAAO,GAAG,IAAI,CAAC;YAErB,MAAM,MAAM,GAAG,IAAA,wCAAmB,EAAC,OAAO,CAAC,CAAC;YAE5C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,OAAO,GAAG,SAAS,CAAC;YAE1B,MAAM,MAAM,GAAG,IAAA,wCAAmB,EAAC,OAAO,CAAC,CAAC;YAE5C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,OAAO,GAAG,EAAE,CAAC;YAEnB,MAAM,MAAM,GAAG,IAAA,wCAAmB,EAAC,OAAO,CAAC,CAAC;YAE5C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,OAAO,GAAG,KAAK,CAAC;YAEtB,MAAM,MAAM,GAAG,IAAA,wCAAmB,EAAC,OAAO,CAAC,CAAC;YAE5C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC;YAElD,MAAM,MAAM,GAAG,IAAA,wCAAmB,EAAC,OAAO,CAAC,CAAC;YAE5C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,OAAO,GAAG;gBACd,KAAK,EAAE,sBAAsB;gBAC7B,IAAI,EAAE,GAAG;gBACT,OAAO,EAAE,EAAE,OAAO,EAAE,uBAAuB,EAAE;aAC9C,CAAC;YAEF,MAAM,MAAM,GAAG,IAAA,wCAAmB,EAAC,OAAO,CAAC,CAAC;YAE5C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CACjB,2FAA2F,CAC5F,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,OAAO,GAAG,EAAE,CAAC;YAEnB,MAAM,MAAM,GAAG,IAAA,wCAAmB,EAAC,OAAO,CAAC,CAAC;YAE5C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,sCAAsC,EAAE,GAAG,EAAE;IACpD,UAAU,CAAC,GAAG,EAAE;QACd,gDAAgD;QAC/C,0CAAyC,CAAC,eAAe,CAAC;YACzD,YAAY,EAAE,IAAI,CAAC,EAAE,EAAE;SACxB,CAAC,CAAC;QAEH,2BAA2B;QAC1B,sCAAuC,CAAC,eAAe,CAAC;YACvD,OAAO,EAAE,sBAAsB;SAChC,CAAC,CAAC;QAEH,oFAAoF;QACnF,sBAA4B,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YACjE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC1C,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;SACjB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAA2D,CAAC,EACvE,QAAQ,GACT,EAAE,EAAE;QACH,MAAM,OAAO,GAAG,IAAA,uCAAkB,GAAE,CAAC;QACrC,IAAA,iBAAS,EAAC,GAAG,EAAE;YACb,QAAQ,CAAC,OAAO,CAAC,CAAC;QACpB,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;QACxB,OAAO,sDAAiB,MAAM,IAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAO,CAAC;IAC7E,CAAC,CAAC;IAEF,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,IAAI,MAAM,GAAgB,EAAE,CAAC;QAC7B,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAA,cAAM,EACtC,8BAAC,0CAAkB,CAAC,QAAQ,IAC1B,KAAK,EAAE;gBACL,MAAM,EAAE,IAAA,sCAAc,GAAE;gBACxB,WAAW,EAAE,EAAS;gBACtB,eAAe,EAAE,KAAK;gBACtB,kBAAkB,EAAE,IAAI;gBACxB,SAAS,EAAE,SAAS;gBACpB,aAAa,EAAE,KAAK;aACrB;YAED,8BAAC,+CAAqB,IAAC,UAAU,EAAE,CAAC,mBAAmB,CAAC;gBACtD,8BAAC,gDAAqB;oBACpB,8BAAC,qCAAgB;wBACf,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CACzB,CACG,CACF,CACI,CAC/B,CAAC;QAEF,8BAA8B;QAC9B,MAAM,IAAA,eAAO,EAAC,GAAG,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,iBAAiB;QACjB,QAAQ,CACN,8BAAC,0CAAkB,CAAC,QAAQ,IAC1B,KAAK,EAAE;gBACL,MAAM,EAAE,IAAA,sCAAc,GAAE;gBACxB,WAAW,EAAE,EAAS;gBACtB,eAAe,EAAE,KAAK;gBACtB,kBAAkB,EAAE,IAAI;gBACxB,SAAS,EAAE,SAAS;gBACpB,aAAa,EAAE,KAAK;aACrB;YAED,8BAAC,+CAAqB,IACpB,UAAU,EAAE,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;gBAEtD,8BAAC,gDAAqB;oBACpB,8BAAC,qCAAgB;wBACf,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CACzB,CACG,CACF,CACI,CAC/B,CAAC;QAEF,MAAM,IAAA,eAAO,EAAC,GAAG,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC;YACnD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;YAC5C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,IAAI,MAAM,GAAgB,EAAE,CAAC;QAC7B,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAA,cAAM,EACtC,8BAAC,0CAAkB,CAAC,QAAQ,IAC1B,KAAK,EAAE;gBACL,MAAM,EAAE,IAAA,sCAAc,GAAE;gBACxB,WAAW,EAAE,EAAS;gBACtB,eAAe,EAAE,KAAK;gBACtB,kBAAkB,EAAE,IAAI;gBACxB,SAAS,EAAE,SAAS;gBACpB,aAAa,EAAE,KAAK;aACrB;YAED,8BAAC,+CAAqB,IACpB,UAAU,EAAE,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;gBAEtD,8BAAC,gDAAqB;oBACpB,8BAAC,qCAAgB;wBACf,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CACzB,CACG,CACF,CACI,CAC/B,CAAC;QAEF,MAAM,IAAA,eAAO,EAAC,GAAG,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,oBAAoB;QACpB,QAAQ,CACN,8BAAC,0CAAkB,CAAC,QAAQ,IAC1B,KAAK,EAAE;gBACL,MAAM,EAAE,IAAA,sCAAc,GAAE;gBACxB,WAAW,EAAE,EAAS;gBACtB,eAAe,EAAE,KAAK;gBACtB,kBAAkB,EAAE,IAAI;gBACxB,SAAS,EAAE,SAAS;gBACpB,aAAa,EAAE,KAAK;aACrB;YAED,8BAAC,+CAAqB,IAAC,UAAU,EAAE,CAAC,mBAAmB,CAAC;gBACtD,8BAAC,gDAAqB;oBACpB,8BAAC,qCAAgB;wBACf,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CACzB,CACG,CACF,CACI,CAC/B,CAAC;QAEF,MAAM,IAAA,eAAO,EAAC,GAAG,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC;YACnD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;YAC5C,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,IAAI,MAAM,GAAgB,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG;YACd,EAAE,GAAG,EAAE,mBAAmB,EAAE,SAAS,EAAE,yBAAY,CAAC,GAAG,EAAE;YACzD,EAAE,GAAG,EAAE,mBAAmB,EAAE,SAAS,EAAE,yBAAY,CAAC,GAAG,EAAE;SAC1D,CAAC;QAEF,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAA,cAAM,EACzB,8BAAC,WAAW,IAAC,UAAU,EAAE,OAAO;YAC9B,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CAC9B,CACf,CAAC;QAEF,MAAM,IAAA,eAAO,EAAC,GAAG,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,0DAA0D;QAC1D,MAAM,IAAI,GAAG;YACX,EAAE,GAAG,EAAE,mBAAmB,EAAE,SAAS,EAAE,yBAAY,CAAC,GAAG,EAAE;YACzD,EAAE,GAAG,EAAE,mBAAmB,EAAE,SAAS,EAAE,yBAAY,CAAC,GAAG,EAAE;SAC1D,CAAC;QACF,QAAQ,CACN,8BAAC,WAAW,IAAC,UAAU,EAAE,IAAI;YAC3B,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CAC9B,CACf,CAAC;QAEF,MAAM,IAAA,eAAO,EAAC,GAAG,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YAC7C,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,mBAAmB,EAAE,mBAAmB,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,gBAAgB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAEnC,8CAA8C;QAC7C,0CAAyC,CAAC,eAAe,CAAC;YACzD,YAAY,EAAE,gBAAgB;SAC/B,CAAC,CAAC;QAEH,cAAc;QACb,sCAAuC,CAAC,eAAe,CAAC;YACvD,OAAO,EAAE,sBAAsB;SAChC,CAAC,CAAC;QAEH,oEAAoE;QACnE,sBAA4B,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YACjE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;gBACrC;oBACE,IAAI,EAAE,UAAU;oBAChB,WAAW,EAAE,eAAe;oBAC5B,WAAW,EAAE,EAAE;oBACf,YAAY,EAAE,EAAE;oBAChB,gDAAgD;oBAChD,QAAQ,EAAE,CAAC;iBACZ;aACF,CAAC;YACF,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;SACjB,CAAC,CAAC;QAEH,sCAAsC;QACtC,IAAA,cAAM,EACJ,8BAAC,WAAW,IAAC,UAAU,EAAE,CAAC,qBAAqB,CAAC;YAC9C,0CAAO,CACK,CACf,CAAC;QAEF,qCAAqC;QACrC,MAAM,IAAA,eAAO,EAAC,GAAG,EAAE;YACjB,MAAM,CAAC,gBAAgB,CAAC,CAAC,gBAAgB,EAAE,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,oCAAoC;QACpC,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;QACjC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACzC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YAC5C,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC1C,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;SACjB,CAAC,CAAC;QACF,sBAA4B,CAAC,MAAM,GAAG,SAAS,CAAC;QAEjD,IAAI,MAAM,GAAgB,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,CAAC,EAAE,GAAG,EAAE,mBAAmB,EAAE,SAAS,EAAE,yBAAY,CAAC,GAAG,EAAE,CAAC,CAAC;QAE5E,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAA,cAAM,EACzB,8BAAC,WAAW,IAAC,UAAU,EAAE,OAAO;YAC9B,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CAC9B,CACf,CAAC;QAEF,MAAM,IAAA,eAAO,EAAC,GAAG,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,iCAAiC;QACjC,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAErC,oCAAoC;QACpC,MAAM,IAAI,GAAG,CAAC,EAAE,GAAG,EAAE,mBAAmB,EAAE,SAAS,EAAE,yBAAY,CAAC,GAAG,EAAE,CAAC,CAAC;QACzE,QAAQ,CACN,8BAAC,WAAW,IAAC,UAAU,EAAE,IAAI;YAC3B,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CAC9B,CACf,CAAC;QAEF,MAAM,IAAA,eAAO,EAAC,GAAG,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,4CAA4C;QAC5C,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC3C,2CAA2C;QAC3C,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YAC5C,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC1C,KAAK,EAAE,QAAQ;SAChB,CAAC,CAAC;QACF,sBAA4B,CAAC,MAAM,GAAG,SAAS,CAAC;QAEjD,IAAI,MAAM,GAAgB,EAAE,CAAC;QAC7B,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAA,cAAM,EACzB,8BAAC,0CAAkB,CAAC,QAAQ,IAC1B,KAAK,EAAE;gBACL,MAAM,EAAE,IAAA,sCAAc,GAAE;gBACxB,WAAW,EAAE,EAAS;gBACtB,eAAe,EAAE,KAAK;gBACtB,kBAAkB,EAAE,IAAI;gBACxB,SAAS,EAAE,SAAS;gBACpB,aAAa,EAAE,KAAK;aACrB;YAED,8BAAC,+CAAqB,IACpB,UAAU,EAAE,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;gBAEtD,8BAAC,gDAAqB;oBACpB,8BAAC,qCAAgB;wBACf,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CACzB,CACG,CACF,CACI,CAC/B,CAAC;QAEF,MAAM,IAAA,eAAO,EAAC,GAAG,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAExC,oBAAoB;QACpB,QAAQ,CACN,8BAAC,0CAAkB,CAAC,QAAQ,IAC1B,KAAK,EAAE;gBACL,MAAM,EAAE,IAAA,sCAAc,GAAE;gBACxB,WAAW,EAAE,EAAS;gBACtB,eAAe,EAAE,KAAK;gBACtB,kBAAkB,EAAE,IAAI;gBACxB,SAAS,EAAE,SAAS;gBACpB,aAAa,EAAE,KAAK;aACrB;YAED,8BAAC,+CAAqB,IAAC,UAAU,EAAE,CAAC,mBAAmB,CAAC;gBACtD,8BAAC,gDAAqB;oBACpB,8BAAC,qCAAgB;wBACf,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CACzB,CACG,CACF,CACI,CAC/B,CAAC;QAEF,MAAM,IAAA,eAAO,EAAC,GAAG,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,8DAA8D;QAC9D,MAAM,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YAC5C,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC1C,KAAK,EAAE,QAAQ;SAChB,CAAC,CAAC;QACF,sBAA4B,CAAC,MAAM,GAAG,SAAS,CAAC;QAEjD,IAAI,MAAM,GAAgB,EAAE,CAAC;QAC7B,MAAM,EAAE,OAAO,EAAE,GAAG,IAAA,cAAM,EACxB,8BAAC,0CAAkB,CAAC,QAAQ,IAC1B,KAAK,EAAE;gBACL,MAAM,EAAE,IAAA,sCAAc,GAAE;gBACxB,WAAW,EAAE,EAAS;gBACtB,eAAe,EAAE,KAAK;gBACtB,kBAAkB,EAAE,IAAI;gBACxB,SAAS,EAAE,SAAS;gBACpB,aAAa,EAAE,KAAK;aACrB;YAED,8BAAC,+CAAqB,IACpB,UAAU,EAAE,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;gBAEtD,8BAAC,gDAAqB;oBACpB,8BAAC,qCAAgB;wBACf,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CACzB,CACG,CACF,CACI,CAC/B,CAAC;QAEF,MAAM,IAAA,eAAO,EAAC,GAAG,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAExC,uBAAuB;QACvB,OAAO,EAAE,CAAC;QAEV,mDAAmD;QACnD,MAAM,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAC3B,IAAI,eAAe,GAAG,CAAC,CAAC;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE;YACxD,MAAM,EAAE,GAAG,EAAE,eAAe,CAAC;YAC7B,OAAO;gBACL,EAAE,EAAE,kDAAkD;gBACtD,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBAC1C,KAAK,EAAE,QAAQ;aAChB,CAAC;QACJ,CAAC,CAAC,CAAC;QACF,sBAA4B,CAAC,MAAM,GAAG,SAAS,CAAC;QAEjD,IAAI,MAAM,GAAgB,EAAE,CAAC;QAC7B,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAA,cAAM,EACzB,8BAAC,WAAW,IACV,UAAU,EAAE;gBACV;oBACE,GAAG,EAAE,mBAAmB;oBACxB,SAAS,EAAE,yBAAY,CAAC,GAAG;oBAC3B,aAAa,EAAE,EAAE,aAAa,EAAE,eAAe,EAAE;iBAClD;aACF;YAED,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CAC9B,CACf,CAAC;QAEF,MAAM,IAAA,eAAO,EAAC,GAAG,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,MAAM,aAAa,GAAI,MAAM,CAAC,CAAC,CAAC,CAAC,MAAc,EAAE,EAAE,CAAC;QACpD,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAE9B,2BAA2B;QAC3B,QAAQ,CACN,8BAAC,WAAW,IACV,UAAU,EAAE;gBACV;oBACE,GAAG,EAAE,mBAAmB;oBACxB,SAAS,EAAE,yBAAY,CAAC,GAAG;oBAC3B,aAAa,EAAE,EAAE,aAAa,EAAE,eAAe,EAAE;iBAClD;aACF;YAED,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CAC9B,CACf,CAAC;QAEF,gEAAgE;QAChE,MAAM,IAAA,eAAO,EACX,GAAG,EAAE;YACH,MAAM,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAC1C,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAC3C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,WAAW,GAAI,MAAM,CAAC,CAAC,CAAC,CAAC,MAAc,EAAE,EAAE,CAAC;YAClD,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,2BAA2B;QAC1D,CAAC,EACD,EAAE,OAAO,EAAE,IAAI,EAAE,CAClB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,uEAAuE;IACvE,yEAAyE;IACzE,sFAAsF;AACxF,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IAChD,IAAI,UAAe,CAAC;IACpB,IAAI,SAAoB,CAAC;IAEzB,UAAU,CAAC,GAAG,EAAE;QACd,gDAAgD;QAC/C,0CAAyC,CAAC,eAAe,CAAC;YACzD,YAAY,EAAE,IAAI,CAAC,EAAE,EAAE;SACxB,CAAC,CAAC;QAEH,2BAA2B;QAC1B,sCAAuC,CAAC,eAAe,CAAC;YACvD,OAAO,EAAE,sBAAsB;SAChC,CAAC,CAAC;QAEH,2CAA2C;QAC3C,UAAU,GAAG;YACX,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC1C,wBAAwB,EAAE,IAAI,CAAC,EAAE,EAAE;YACnC,qBAAqB,EAAE,IAAI,CAAC,EAAE,EAAE;YAChC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;SACjB,CAAC;QAEF,kDAAkD;QAClD,SAAS,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QACnD,sBAA4B,CAAC,MAAM,GAAG,SAAS,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAA2D,CAAC,EACvE,QAAQ,GACT,EAAE,EAAE;QACH,MAAM,OAAO,GAAG,IAAA,uCAAkB,GAAE,CAAC;QACrC,IAAA,iBAAS,EAAC,GAAG,EAAE;YACb,QAAQ,CAAC,OAAO,CAAC,CAAC;QACpB,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QAClF,MAAM,sBAAsB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YACzD,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;SAC1C,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAwB;YACpC,WAAW,EAAE,sBAAsB;SACpC,CAAC;QAEF,IAAI,MAAM,GAAgB,EAAE,CAAC;QAC7B,IAAA,cAAM,EACJ,8BAAC,WAAW,IAAC,UAAU,EAAE,CAAC,sBAAsB,CAAC,EAAE,QAAQ,EAAE,QAAQ;YACnE,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CAC9B,CACf,CAAC;QAEF,MAAM,IAAA,eAAO,EAAC,GAAG,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,gFAAgF;QAChF,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CACpC,sBAAsB,EACtB,yBAAY,CAAC,IAAI,EACjB,SAAS,EACT,SAAS,EACT,SAAS,EACT,MAAM,CAAC,gBAAgB,CAAC;YACtB,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;SAClC,CAAC,CACH,CAAC;QAEF,yCAAyC;QACzC,MAAM,cAAc,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC;QAEjD,6DAA6D;QAC7D,MAAM,WAAW,GAAG;YAClB,MAAM,EAAE,wBAAiC;YACzC,MAAM,EAAE,EAAE;SACX,CAAC;QACF,MAAM,SAAS,GAAG,eAAe,EAAE,CAAC;QACpC,MAAM,cAAc,CAAC,WAAW,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAEzD,MAAM,CAAC,sBAAsB,CAAC,CAAC,oBAAoB,CACjD,WAAW,EACX,SAAS,EACT,MAAM,CAAC,gBAAgB,CAAC;YACtB,GAAG,EAAE,sBAAsB;YAC3B,SAAS,EAAE,MAAM;SAClB,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,mBAAmB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YACtD,KAAK,EAAE,YAAY;YACnB,UAAU,EAAE,SAAS;YACrB,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE;SAC5C,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAwB;YACpC,QAAQ,EAAE,mBAAmB;SAC9B,CAAC;QAEF,IAAI,MAAM,GAAgB,EAAE,CAAC;QAC7B,IAAA,cAAM,EACJ,8BAAC,WAAW,IAAC,UAAU,EAAE,CAAC,sBAAsB,CAAC,EAAE,QAAQ,EAAE,QAAQ;YACnE,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CAC9B,CACf,CAAC;QAEF,MAAM,IAAA,eAAO,EAAC,GAAG,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,8EAA8E;QAC9E,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CACpC,sBAAsB,EACtB,yBAAY,CAAC,IAAI,EACjB,SAAS,EACT,SAAS,EACT,SAAS,EACT,MAAM,CAAC,gBAAgB,CAAC;YACtB,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;SAC/B,CAAC,CACH,CAAC;QAEF,2DAA2D;QAC3D,MAAM,cAAc,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,WAAW,GAAG;YAClB,MAAM,EAAE,wBAAiC;YACzC,MAAM,EAAE;gBACN,QAAQ,EAAE,EAAE;gBACZ,gBAAgB,EAAE,EAAE;aACrB;SACF,CAAC;QACF,MAAM,SAAS,GAAG,eAAe,EAAE,CAAC;QACpC,MAAM,cAAc,CAAC,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAEtD,MAAM,CAAC,mBAAmB,CAAC,CAAC,oBAAoB,CAC9C,WAAW,EACX,SAAS,EACT,MAAM,CAAC,gBAAgB,CAAC;YACtB,GAAG,EAAE,sBAAsB;YAC3B,SAAS,EAAE,MAAM;SAClB,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACpF,MAAM,0BAA0B,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YAC7D,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;SAC9C,CAAC,CAAC;QAEH,MAAM,wBAAwB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YAC3D,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;SAC5C,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAwB;YACpC,WAAW,EAAE,0BAA0B;SACxC,CAAC;QAEF,IAAI,MAAM,GAAgB,EAAE,CAAC;QAC7B,IAAA,cAAM,EACJ,8BAAC,WAAW,IACV,UAAU,EAAE;gBACV;oBACE,GAAG,EAAE,sBAAsB;oBAC3B,QAAQ,EAAE;wBACR,WAAW,EAAE,wBAAwB;qBACtC;iBACF;aACF,EACD,QAAQ,EAAE,QAAQ;YAElB,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CAC9B,CACf,CAAC;QAEF,MAAM,IAAA,eAAO,EAAC,GAAG,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,mEAAmE;QACnE,MAAM,cAAc,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QAClF,MAAM,sBAAsB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YACzD,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;SAC1C,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAwB;YACpC,WAAW,EAAE,sBAAsB;SACpC,CAAC;QAEF,IAAI,MAAM,GAAgB,EAAE,CAAC;QAC7B,IAAA,cAAM,EACJ,8BAAC,WAAW,IACV,UAAU,EAAE;gBACV,EAAE,GAAG,EAAE,0BAA0B,EAAE,IAAI,EAAE,UAAU,EAAE;gBACrD,EAAE,GAAG,EAAE,0BAA0B,EAAE,IAAI,EAAE,UAAU,EAAE;aACtD,EACD,QAAQ,EAAE,QAAQ;YAElB,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CAC9B,CACf,CAAC;QAEF,MAAM,IAAA,eAAO,EAAC,GAAG,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,mCAAmC;QACnC,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAE3C,gCAAgC;QAChC,MAAM,eAAe,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,MAAM,eAAe,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEnD,MAAM,WAAW,GAAG;YAClB,MAAM,EAAE,wBAAiC;YACzC,MAAM,EAAE,EAAE;SACX,CAAC;QACF,MAAM,SAAS,GAAG,eAAe,EAAE,CAAC;QAEpC,4BAA4B;QAC5B,MAAM,eAAe,CAAC,WAAW,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAC1D,MAAM,CAAC,sBAAsB,CAAC,CAAC,oBAAoB,CACjD,WAAW,EACX,SAAS,EACT,MAAM,CAAC,gBAAgB,CAAC;YACtB,GAAG,EAAE,0BAA0B;YAC/B,IAAI,EAAE,UAAU;SACjB,CAAC,CACH,CAAC;QAEF,sBAAsB,CAAC,SAAS,EAAE,CAAC;QAEnC,4BAA4B;QAC5B,MAAM,eAAe,CAAC,WAAW,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAC1D,MAAM,CAAC,sBAAsB,CAAC,CAAC,oBAAoB,CACjD,WAAW,EACX,SAAS,EACT,MAAM,CAAC,gBAAgB,CAAC;YACtB,GAAG,EAAE,0BAA0B;YAC/B,IAAI,EAAE,UAAU;SACjB,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,cAAc,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YACjD,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;SAC7C,CAAC,CAAC;QAEH,MAAM,cAAc,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YACjD,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;SAC7C,CAAC,CAAC;QAEH,IAAI,MAAM,GAAgB,EAAE,CAAC;QAC7B,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAA,cAAM,EACzB,8BAAC,WAAW,IACV,UAAU,EAAE,CAAC,sBAAsB,CAAC,EACpC,QAAQ,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE;YAEzC,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CAC9B,CACf,CAAC;QAEF,MAAM,IAAA,eAAO,EAAC,GAAG,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,sBAAsB;QACtB,QAAQ,CACN,8BAAC,WAAW,IACV,UAAU,EAAE,CAAC,sBAAsB,CAAC,EACpC,QAAQ,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE;YAEzC,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CAC9B,CACf,CAAC;QAEF,MAAM,IAAA,eAAO,EAAC,GAAG,EAAE;YACjB,MAAM,CAAC,UAAU,CAAC,wBAAwB,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACjE,CAAC,CAAC,CAAC;QAEH,iCAAiC;QACjC,MAAM,CAAC,UAAU,CAAC,wBAAwB,CAAC,CAAC,oBAAoB,CAC9D,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CACrB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,0DAA0D,EAAE,GAAG,EAAE;IACxE,IAAI,gBAA2B,CAAC;IAEhC,UAAU,CAAC,GAAG,EAAE;QACd,gBAAgB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAE5B,0CAAyC,CAAC,eAAe,CAAC;YACzD,YAAY,EAAE,gBAAgB;SAC/B,CAAC,CAAC;QAEF,sCAAuC,CAAC,eAAe,CAAC;YACvD,OAAO,EAAE,sBAAsB;SAChC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAA2D,CAAC,EACvE,QAAQ,GACT,EAAE,EAAE;QACH,MAAM,OAAO,GAAG,IAAA,uCAAkB,GAAE,CAAC;QACrC,IAAA,iBAAS,EAAC,GAAG,EAAE;YACb,QAAQ,CAAC,OAAO,CAAC,CAAC;QACpB,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;YACjE,sBAA4B,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;gBACjE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBAC1C,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;aACjB,CAAC,CAAC;YAEH,IAAI,MAAM,GAAgB,EAAE,CAAC;YAC7B,IAAA,cAAM,EACJ,8BAAC,WAAW,IAAC,UAAU,EAAE,CAAC,4BAA4B,CAAC;gBACrD,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CAC9B,CACf,CAAC;YAEF,MAAM,IAAA,eAAO,EAAC,GAAG,EAAE;gBACjB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC9B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC7C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC3D,sBAA4B,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;gBACjE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBAC1C,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;aACjB,CAAC,CAAC;YAEH,IAAI,MAAM,GAAgB,EAAE,CAAC;YAC7B,IAAA,cAAM,EACJ,8BAAC,WAAW,IACV,UAAU,EAAE;oBACV;wBACE,GAAG,EAAE,4BAA4B;wBACjC,SAAS,EAAE,YAAY;qBACxB;iBACF;gBAED,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CAC9B,CACf,CAAC;YAEF,MAAM,IAAA,eAAO,EAAC,GAAG,EAAE;gBACjB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC9B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACjD,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;YACzE,sBAA4B,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;gBACjE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBAC1C,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;aACjB,CAAC,CAAC;YAEH,MAAM,SAAS,GAAG;gBAChB,EAAE,GAAG,EAAE,wBAAwB,EAAE,QAAQ,EAAE,QAAQ,EAAE;gBACrD,EAAE,GAAG,EAAE,oBAAoB,EAAE,QAAQ,EAAE,QAAQ,EAAE;gBACjD,EAAE,GAAG,EAAE,sBAAsB,EAAE,QAAQ,EAAE,QAAQ,EAAE;gBACnD,EAAE,GAAG,EAAE,2BAA2B,EAAE,QAAQ,EAAE,SAAS,EAAE;gBACzD,EAAE,GAAG,EAAE,yBAAyB,EAAE,QAAQ,EAAE,SAAS,EAAE;aACxD,CAAC;YAEF,KAAK,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,SAAS,EAAE,CAAC;gBAC1C,IAAI,MAAM,GAAgB,EAAE,CAAC;gBAC7B,MAAM,EAAE,OAAO,EAAE,GAAG,IAAA,cAAM,EACxB,8BAAC,WAAW,IAAC,UAAU,EAAE,CAAC,GAAG,CAAC;oBAC5B,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CAC9B,CACf,CAAC;gBAEF,MAAM,IAAA,eAAO,EAAC,GAAG,EAAE;oBACjB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAC9B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC7C,CAAC,CAAC,CAAC;gBAEH,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;YAC3E,sBAA4B,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;gBACjE,SAAS,EAAE,IAAI;qBACZ,EAAE,EAAE;qBACJ,iBAAiB,CAAC;oBACjB,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE;iBAClD,CAAC;gBACJ,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;aACjB,CAAC,CAAC;YAEH,IAAI,MAAM,GAAgB,EAAE,CAAC;YAC7B,IAAA,cAAM,EACJ,8BAAC,WAAW,IAAC,UAAU,EAAE,CAAC,4BAA4B,CAAC;gBACrD,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CAC9B,CACf,CAAC;YAEF,MAAM,IAAA,eAAO,EAAC,GAAG,EAAE;gBACjB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC9B,MAAM,CAAC,gBAAgB,CAAC,CAAC,oBAAoB,CAC3C,MAAM,CAAC,gBAAgB,CAAC;oBACtB,IAAI,EAAE,WAAW,EAAE,eAAe;iBACnC,CAAC,CACH,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;YACzE,sBAA4B,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;gBACjE,SAAS,EAAE,IAAI;qBACZ,EAAE,EAAE;qBACJ,iBAAiB,CAAC;oBACjB,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE;iBAClD,CAAC;gBACJ,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;aACjB,CAAC,CAAC;YAEH,IAAI,MAAM,GAAgB,EAAE,CAAC;YAC7B,IAAA,cAAM,EACJ,8BAAC,WAAW,IACV,UAAU,EAAE,CAAC,4BAA4B,EAAE,wBAAwB,CAAC;gBAEpE,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CAC9B,CACf,CAAC;YAEF,MAAM,IAAA,eAAO,EACX,GAAG,EAAE;gBACH,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC9B,sDAAsD;gBACtD,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;gBAC1C,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAEpD,8CAA8C;gBAC9C,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACzB,MAAM,IAAI,KAAK,CACb,QAAQ,SAAS,CAAC,MAAM,sBAAsB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACrE,CAAC;gBACJ,CAAC;gBAED,MAAM,CACJ,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,mBAAmB,CAAC,CAC3D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACb,MAAM,CACJ,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,mBAAmB,CAAC,CAC3D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACf,CAAC,EACD,EAAE,OAAO,EAAE,IAAI,EAAE,CAClB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;YAClE,sBAA4B,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;gBACjE,SAAS,EAAE,IAAI;qBACZ,EAAE,EAAE;qBACJ,iBAAiB,CAAC;oBACjB,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE;iBAClD,CAAC;gBACJ,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;aACjB,CAAC,CAAC;YAEH,IAAI,MAAM,GAAgB,EAAE,CAAC;YAC7B,IAAA,cAAM,EACJ,8BAAC,WAAW,IACV,UAAU,EAAE;oBACV;wBACE,GAAG,EAAE,4BAA4B;wBACjC,SAAS,EAAE,WAAW;qBACvB;oBACD,wBAAwB;iBACzB;gBAED,8BAAC,OAAO,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAI,CAC9B,CACf,CAAC;YAEF,MAAM,IAAA,eAAO,EAAC,GAAG,EAAE;gBACjB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC9B,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;gBAC1C,MAAM,CACJ,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,sBAAsB,CAAC,CAC9D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACf,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import type { RequestHandlerExtra } from \"@modelcontextprotocol/sdk/shared/protocol.js\";\nimport type {\n ClientNotification,\n ClientRequest,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { render, waitFor } from \"@testing-library/react\";\nimport React, { useEffect } from \"react\";\nimport {\n TamboClientContext,\n useTamboClient,\n} from \"../providers/tambo-client-provider\";\nimport { TamboMcpTokenProvider } from \"../providers/tambo-mcp-token-provider\";\nimport {\n TamboRegistryProvider,\n useTamboRegistry,\n} from \"../providers/tambo-registry-provider\";\nimport { MCPClient, MCPTransport } from \"./mcp-client\";\nimport {\n extractErrorMessage,\n TamboMcpProvider,\n useTamboMcpServers,\n type McpServer,\n type ProviderMCPHandlers,\n} from \"./tambo-mcp-provider\";\n\n// Import the private function for testing by re-exporting it for tests only\n// We'll need to export it temporarily or test it through public API\n\n// Helper to create mock RequestHandlerExtra for testing\nfunction createMockExtra(): RequestHandlerExtra<\n ClientRequest,\n ClientNotification\n> {\n return {\n signal: new AbortController().signal,\n requestId: \"test-request-id\",\n sendNotification: (async () => {}) as any,\n sendRequest: (async () => ({ _meta: {} })) as any,\n };\n}\n\n// Mock the MCP client to avoid ES module issues\njest.mock(\"./mcp-client\", () => ({\n MCPClient: jest.fn(),\n MCPTransport: {\n SSE: \"sse\",\n HTTP: \"http\",\n },\n}));\n\n// Mock the registry provider to avoid dependency issues\njest.mock(\"../providers/tambo-registry-provider\", () => {\n const actual = jest.requireActual(\"../providers/tambo-registry-provider\");\n return {\n ...actual,\n useTamboRegistry: jest.fn(),\n };\n});\n\n// Mock the client provider to avoid dependency issues\njest.mock(\"../providers/tambo-client-provider\", () => {\n return {\n useTamboClient: jest.fn(),\n TamboClientContext: React.createContext(undefined),\n };\n});\n\n// Helper to wrap tests with all required providers (used across multiple describe blocks)\nconst TestWrapper: React.FC<{\n mcpServers: any;\n handlers?: ProviderMCPHandlers;\n children: React.ReactNode;\n}> = ({ mcpServers, handlers, children }) => {\n const client = useTamboClient();\n return (\n <TamboClientContext.Provider\n value={{\n client,\n queryClient: {} as any,\n isUpdatingToken: false,\n tokenExchangeError: null,\n userToken: undefined,\n hasValidToken: false,\n }}\n >\n <TamboRegistryProvider mcpServers={mcpServers}>\n <TamboMcpTokenProvider>\n <TamboMcpProvider handlers={handlers}>{children}</TamboMcpProvider>\n </TamboMcpTokenProvider>\n </TamboRegistryProvider>\n </TamboClientContext.Provider>\n );\n};\n\ndescribe(\"extractErrorMessage\", () => {\n describe(\"Array content handling\", () => {\n it(\"should extract text from array content with multiple text items\", () => {\n const content = [\n { type: \"text\", text: \"Error:\" },\n { type: \"text\", text: \"Tool execution failed\" },\n { type: \"image\", url: \"http://example.com/error.png\" }, // Should be filtered out\n ];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Error: Tool execution failed\");\n });\n\n it(\"should extract text from array content with single text item\", () => {\n const content = [{ type: \"text\", text: \"Simple error message\" }];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Simple error message\");\n });\n\n it(\"should return fallback message for array content with no text items\", () => {\n const content = [\n { type: \"image\", url: \"http://example.com/error.png\" },\n { type: \"resource\", uri: \"file://error.log\" },\n ];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Error occurred but no details provided\");\n });\n\n it(\"should return fallback message for empty array content\", () => {\n const content: any[] = [];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Error occurred but no details provided\");\n });\n\n it(\"should handle array content with mixed types correctly\", () => {\n const content = [\n { type: \"resource\", uri: \"file://log.txt\" },\n { type: \"text\", text: \"First error\" },\n { type: \"image\", url: \"http://example.com/img.png\" },\n { type: \"text\", text: \"Second error\" },\n { type: \"unknown\", data: \"something\" },\n ];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"First error Second error\");\n });\n\n it(\"should handle array content with malformed items\", () => {\n const content = [\n null,\n { type: \"text\", text: \"Valid error\" },\n { type: \"text\" }, // Missing text property\n { type: \"text\", text: null }, // Invalid text type\n { type: \"text\", text: \"Another valid error\" },\n ];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Valid error Another valid error\");\n });\n });\n\n describe(\"Non-array content handling\", () => {\n it(\"should return string content as-is\", () => {\n const content = \"Direct error message\";\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Direct error message\");\n });\n\n it(\"should handle null content\", () => {\n const content = null;\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Unknown error occurred\");\n });\n\n it(\"should handle undefined content\", () => {\n const content = undefined;\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Unknown error occurred\");\n });\n\n it(\"should handle number content\", () => {\n const content = 42;\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"42\");\n });\n\n it(\"should handle boolean content\", () => {\n const content = false;\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"false\");\n });\n\n it(\"should handle object content\", () => {\n const content = { error: \"Something went wrong\" };\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe('{\"error\":\"Something went wrong\"}');\n });\n\n it(\"should handle complex object content\", () => {\n const content = {\n error: \"Something went wrong\",\n code: 500,\n details: { message: \"Internal server error\" },\n };\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\n '{\"error\":\"Something went wrong\",\"code\":500,\"details\":{\"message\":\"Internal server error\"}}',\n );\n });\n\n it(\"should handle empty object content\", () => {\n const content = {};\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"{}\");\n });\n });\n});\n\ndescribe(\"TamboMcpProvider server list changes\", () => {\n beforeEach(() => {\n // Mock registry so tool registration is a no-op\n (useTamboRegistry as unknown as jest.Mock).mockReturnValue({\n registerTool: jest.fn(),\n });\n\n // Mock client with baseURL\n (useTamboClient as unknown as jest.Mock).mockReturnValue({\n baseURL: \"https://api.tambo.co\",\n });\n\n // Ensure MCPClient.create exists and returns a fake client with listTools and close\n (MCPClient as unknown as any).create = jest.fn().mockResolvedValue({\n listTools: jest.fn().mockResolvedValue([]),\n close: jest.fn(),\n });\n });\n\n const Capture: React.FC<{ onUpdate: (servers: McpServer[]) => void }> = ({\n onUpdate,\n }) => {\n const servers = useTamboMcpServers();\n useEffect(() => {\n onUpdate(servers);\n }, [servers, onUpdate]);\n return <div data-testid=\"urls\">{servers.map((s) => s.url).join(\",\")}</div>;\n };\n\n it(\"adds a new server when the list grows\", async () => {\n let latest: McpServer[] = [];\n const { rerender, getByTestId } = render(\n <TamboClientContext.Provider\n value={{\n client: useTamboClient(),\n queryClient: {} as any,\n isUpdatingToken: false,\n tokenExchangeError: null,\n userToken: undefined,\n hasValidToken: false,\n }}\n >\n <TamboRegistryProvider mcpServers={[\"https://a.example\"]}>\n <TamboMcpTokenProvider>\n <TamboMcpProvider>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>\n </TamboRegistryProvider>\n </TamboClientContext.Provider>,\n );\n\n // Wait for initial connection\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // Add new server\n rerender(\n <TamboClientContext.Provider\n value={{\n client: useTamboClient(),\n queryClient: {} as any,\n isUpdatingToken: false,\n tokenExchangeError: null,\n userToken: undefined,\n hasValidToken: false,\n }}\n >\n <TamboRegistryProvider\n mcpServers={[\"https://a.example\", \"https://b.example\"]}\n >\n <TamboMcpTokenProvider>\n <TamboMcpProvider>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>\n </TamboRegistryProvider>\n </TamboClientContext.Provider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n const urls = getByTestId(\"urls\").textContent || \"\";\n expect(urls).toContain(\"https://a.example\");\n expect(urls).toContain(\"https://b.example\");\n });\n });\n\n it(\"removes a server when the list shrinks\", async () => {\n let latest: McpServer[] = [];\n const { rerender, getByTestId } = render(\n <TamboClientContext.Provider\n value={{\n client: useTamboClient(),\n queryClient: {} as any,\n isUpdatingToken: false,\n tokenExchangeError: null,\n userToken: undefined,\n hasValidToken: false,\n }}\n >\n <TamboRegistryProvider\n mcpServers={[\"https://a.example\", \"https://b.example\"]}\n >\n <TamboMcpTokenProvider>\n <TamboMcpProvider>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>\n </TamboRegistryProvider>\n </TamboClientContext.Provider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n });\n\n // Remove one server\n rerender(\n <TamboClientContext.Provider\n value={{\n client: useTamboClient(),\n queryClient: {} as any,\n isUpdatingToken: false,\n tokenExchangeError: null,\n userToken: undefined,\n hasValidToken: false,\n }}\n >\n <TamboRegistryProvider mcpServers={[\"https://a.example\"]}>\n <TamboMcpTokenProvider>\n <TamboMcpProvider>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>\n </TamboRegistryProvider>\n </TamboClientContext.Provider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n const urls = getByTestId(\"urls\").textContent || \"\";\n expect(urls).toContain(\"https://a.example\");\n expect(urls).not.toContain(\"https://b.example\");\n });\n });\n\n it(\"does not duplicate when a new copy of the same list is passed\", async () => {\n let latest: McpServer[] = [];\n const initial = [\n { url: \"https://a.example\", transport: MCPTransport.SSE },\n { url: \"https://b.example\", transport: MCPTransport.SSE },\n ];\n\n const { rerender } = render(\n <TestWrapper mcpServers={initial}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n });\n\n // Pass a new array instance with the same logical servers\n const same = [\n { url: \"https://a.example\", transport: MCPTransport.SSE },\n { url: \"https://b.example\", transport: MCPTransport.SSE },\n ];\n rerender(\n <TestWrapper mcpServers={same}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n const urls = latest.map((s) => s.url).sort();\n expect(urls).toEqual([\"https://a.example\", \"https://b.example\"].sort());\n });\n });\n\n it(\"forwards maxCalls from MCP listTools to registry.registerTool\", async () => {\n const registerToolMock = jest.fn();\n\n // Mock registry to capture registerTool calls\n (useTamboRegistry as unknown as jest.Mock).mockReturnValue({\n registerTool: registerToolMock,\n });\n\n // Mock client\n (useTamboClient as unknown as jest.Mock).mockReturnValue({\n baseURL: \"https://api.tambo.co\",\n });\n\n // Prepare MCP client to return a tool with maxCalls in its metadata\n (MCPClient as unknown as any).create = jest.fn().mockResolvedValue({\n listTools: jest.fn().mockResolvedValue([\n {\n name: \"mcp-tool\",\n description: \"Tool from MCP\",\n inputSchema: {},\n outputSchema: {},\n // MCP may include maxCalls in the tool metadata\n maxCalls: 7,\n },\n ]),\n close: jest.fn(),\n });\n\n // Render provider to trigger MCP sync\n render(\n <TestWrapper mcpServers={[\"https://mcp.example\"]}>\n <div />\n </TestWrapper>,\n );\n\n // Wait for registerTool to be called\n await waitFor(() => {\n expect(registerToolMock).toHaveBeenCalled();\n });\n\n // Inspect the first registered tool\n const registered = registerToolMock.mock.calls[0][0];\n expect(registered).toBeDefined();\n expect(registered.name).toBe(\"mcp-tool\");\n expect(registered.maxCalls).toBe(7);\n });\n\n it(\"reuses client when same server is passed with new array instance\", async () => {\n const createSpy = jest.fn().mockResolvedValue({\n listTools: jest.fn().mockResolvedValue([]),\n close: jest.fn(),\n });\n (MCPClient as unknown as any).create = createSpy;\n\n let latest: McpServer[] = [];\n const initial = [{ url: \"https://a.example\", transport: MCPTransport.SSE }];\n\n const { rerender } = render(\n <TestWrapper mcpServers={initial}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // Verify client was created once\n expect(createSpy).toHaveBeenCalledTimes(1);\n const firstClient = latest[0].client;\n\n // Pass a new array with same server\n const same = [{ url: \"https://a.example\", transport: MCPTransport.SSE }];\n rerender(\n <TestWrapper mcpServers={same}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // Client should NOT have been created again\n expect(createSpy).toHaveBeenCalledTimes(1);\n // Should be the exact same client instance\n expect(latest[0].client).toBe(firstClient);\n });\n\n it(\"calls close() on removed server clients\", async () => {\n const closeSpy = jest.fn();\n const createSpy = jest.fn().mockResolvedValue({\n listTools: jest.fn().mockResolvedValue([]),\n close: closeSpy,\n });\n (MCPClient as unknown as any).create = createSpy;\n\n let latest: McpServer[] = [];\n const { rerender } = render(\n <TamboClientContext.Provider\n value={{\n client: useTamboClient(),\n queryClient: {} as any,\n isUpdatingToken: false,\n tokenExchangeError: null,\n userToken: undefined,\n hasValidToken: false,\n }}\n >\n <TamboRegistryProvider\n mcpServers={[\"https://a.example\", \"https://b.example\"]}\n >\n <TamboMcpTokenProvider>\n <TamboMcpProvider>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>\n </TamboRegistryProvider>\n </TamboClientContext.Provider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n });\n\n expect(closeSpy).not.toHaveBeenCalled();\n\n // Remove one server\n rerender(\n <TamboClientContext.Provider\n value={{\n client: useTamboClient(),\n queryClient: {} as any,\n isUpdatingToken: false,\n tokenExchangeError: null,\n userToken: undefined,\n hasValidToken: false,\n }}\n >\n <TamboRegistryProvider mcpServers={[\"https://a.example\"]}>\n <TamboMcpTokenProvider>\n <TamboMcpProvider>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>\n </TamboRegistryProvider>\n </TamboClientContext.Provider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // close() should have been called once for the removed server\n expect(closeSpy).toHaveBeenCalledTimes(1);\n });\n\n it(\"calls close() on all clients when provider unmounts\", async () => {\n const closeSpy = jest.fn();\n const createSpy = jest.fn().mockResolvedValue({\n listTools: jest.fn().mockResolvedValue([]),\n close: closeSpy,\n });\n (MCPClient as unknown as any).create = createSpy;\n\n let latest: McpServer[] = [];\n const { unmount } = render(\n <TamboClientContext.Provider\n value={{\n client: useTamboClient(),\n queryClient: {} as any,\n isUpdatingToken: false,\n tokenExchangeError: null,\n userToken: undefined,\n hasValidToken: false,\n }}\n >\n <TamboRegistryProvider\n mcpServers={[\"https://a.example\", \"https://b.example\"]}\n >\n <TamboMcpTokenProvider>\n <TamboMcpProvider>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>\n </TamboRegistryProvider>\n </TamboClientContext.Provider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n });\n\n expect(closeSpy).not.toHaveBeenCalled();\n\n // Unmount the provider\n unmount();\n\n // close() should have been called for both clients\n expect(closeSpy).toHaveBeenCalledTimes(2);\n });\n\n it(\"creates new client when customHeaders change\", async () => {\n const closeSpy = jest.fn();\n let clientIdCounter = 0;\n const createSpy = jest.fn().mockImplementation(async () => {\n const id = ++clientIdCounter;\n return {\n id, // Add an ID so we can track which client is which\n listTools: jest.fn().mockResolvedValue([]),\n close: closeSpy,\n };\n });\n (MCPClient as unknown as any).create = createSpy;\n\n let latest: McpServer[] = [];\n const { rerender } = render(\n <TestWrapper\n mcpServers={[\n {\n url: \"https://a.example\",\n transport: MCPTransport.SSE,\n customHeaders: { Authorization: \"Bearer token1\" },\n },\n ]}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n expect(createSpy).toHaveBeenCalledTimes(1);\n });\n\n const firstClientId = (latest[0].client as any)?.id;\n expect(firstClientId).toBe(1);\n\n // Change the customHeaders\n rerender(\n <TestWrapper\n mcpServers={[\n {\n url: \"https://a.example\",\n transport: MCPTransport.SSE,\n customHeaders: { Authorization: \"Bearer token2\" },\n },\n ]}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n // Wait for old client to be closed and new client to be created\n await waitFor(\n () => {\n expect(closeSpy).toHaveBeenCalledTimes(1);\n expect(createSpy).toHaveBeenCalledTimes(2);\n expect(latest.length).toBe(1);\n const newClientId = (latest[0].client as any)?.id;\n expect(newClientId).toBe(2); // Should be the new client\n },\n { timeout: 3000 },\n );\n });\n\n // Note: Token changes for the internal Tambo server are covered by the\n // \"creates new client when customHeaders change\" test above, since token\n // changes result in different Authorization headers, which trigger client recreation.\n});\n\ndescribe(\"TamboMcpProvider handler support\", () => {\n let mockClient: any;\n let createSpy: jest.Mock;\n\n beforeEach(() => {\n // Mock registry so tool registration is a no-op\n (useTamboRegistry as unknown as jest.Mock).mockReturnValue({\n registerTool: jest.fn(),\n });\n\n // Mock client with baseURL\n (useTamboClient as unknown as jest.Mock).mockReturnValue({\n baseURL: \"https://api.tambo.co\",\n });\n\n // Create a mock client with update methods\n mockClient = {\n listTools: jest.fn().mockResolvedValue([]),\n updateElicitationHandler: jest.fn(),\n updateSamplingHandler: jest.fn(),\n close: jest.fn(),\n };\n\n // Mock MCPClient.create to return our mock client\n createSpy = jest.fn().mockResolvedValue(mockClient);\n (MCPClient as unknown as any).create = createSpy;\n });\n\n const Capture: React.FC<{ onUpdate: (servers: McpServer[]) => void }> = ({\n onUpdate,\n }) => {\n const servers = useTamboMcpServers();\n useEffect(() => {\n onUpdate(servers);\n }, [servers, onUpdate]);\n return null;\n };\n\n it(\"should pass provider-level elicitation handler to MCPClient.create\", async () => {\n const mockElicitationHandler = jest.fn().mockResolvedValue({\n content: [{ type: \"text\", text: \"test\" }],\n });\n\n const handlers: ProviderMCPHandlers = {\n elicitation: mockElicitationHandler,\n };\n\n let latest: McpServer[] = [];\n render(\n <TestWrapper mcpServers={[\"https://test.example\"]} handlers={handlers}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // Verify MCPClient.create was called with an HTTP transport and wrapped handler\n expect(createSpy).toHaveBeenCalledWith(\n \"https://test.example\",\n MCPTransport.HTTP,\n undefined,\n undefined,\n undefined,\n expect.objectContaining({\n elicitation: expect.any(Function),\n }),\n );\n\n // Get the actual handler that was passed\n const passedHandlers = createSpy.mock.calls[0][5];\n expect(passedHandlers.elicitation).toBeDefined();\n\n // Call the wrapped handler and verify it receives serverInfo\n const mockRequest = {\n method: \"sampling/createMessage\" as const,\n params: {},\n };\n const mockExtra = createMockExtra();\n await passedHandlers.elicitation(mockRequest, mockExtra);\n\n expect(mockElicitationHandler).toHaveBeenCalledWith(\n mockRequest,\n mockExtra,\n expect.objectContaining({\n url: \"https://test.example\",\n serverKey: \"test\",\n }),\n );\n });\n\n it(\"should pass provider-level sampling handler to MCPClient.create\", async () => {\n const mockSamplingHandler = jest.fn().mockResolvedValue({\n model: \"test-model\",\n stopReason: \"endTurn\",\n role: \"assistant\",\n content: { type: \"text\", text: \"response\" },\n });\n\n const handlers: ProviderMCPHandlers = {\n sampling: mockSamplingHandler,\n };\n\n let latest: McpServer[] = [];\n render(\n <TestWrapper mcpServers={[\"https://test.example\"]} handlers={handlers}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // Verify MCPClient.create was called with HTTP transport and sampling handler\n expect(createSpy).toHaveBeenCalledWith(\n \"https://test.example\",\n MCPTransport.HTTP,\n undefined,\n undefined,\n undefined,\n expect.objectContaining({\n sampling: expect.any(Function),\n }),\n );\n\n // Get the actual handler and verify it receives serverInfo\n const passedHandlers = createSpy.mock.calls[0][5];\n const mockRequest = {\n method: \"sampling/createMessage\" as const,\n params: {\n messages: [],\n modelPreferences: {},\n },\n };\n const mockExtra = createMockExtra();\n await passedHandlers.sampling(mockRequest, mockExtra);\n\n expect(mockSamplingHandler).toHaveBeenCalledWith(\n mockRequest,\n mockExtra,\n expect.objectContaining({\n url: \"https://test.example\",\n serverKey: \"test\",\n }),\n );\n });\n\n it(\"should allow per-server handlers to override provider-level handlers\", async () => {\n const providerElicitationHandler = jest.fn().mockResolvedValue({\n content: [{ type: \"text\", text: \"provider\" }],\n });\n\n const serverElicitationHandler = jest.fn().mockResolvedValue({\n content: [{ type: \"text\", text: \"server\" }],\n });\n\n const handlers: ProviderMCPHandlers = {\n elicitation: providerElicitationHandler,\n };\n\n let latest: McpServer[] = [];\n render(\n <TestWrapper\n mcpServers={[\n {\n url: \"https://test.example\",\n handlers: {\n elicitation: serverElicitationHandler,\n },\n },\n ]}\n handlers={handlers}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // Verify the per-server handler was used, not the provider handler\n const passedHandlers = createSpy.mock.calls[0][5];\n expect(passedHandlers.elicitation).toBe(serverElicitationHandler);\n });\n\n it(\"should pass different serverInfo to handlers for different servers\", async () => {\n const mockElicitationHandler = jest.fn().mockResolvedValue({\n content: [{ type: \"text\", text: \"test\" }],\n });\n\n const handlers: ProviderMCPHandlers = {\n elicitation: mockElicitationHandler,\n };\n\n let latest: McpServer[] = [];\n render(\n <TestWrapper\n mcpServers={[\n { url: \"https://server-a.example\", name: \"Server A\" },\n { url: \"https://server-b.example\", name: \"Server B\" },\n ]}\n handlers={handlers}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n });\n\n // Verify both servers got handlers\n expect(createSpy).toHaveBeenCalledTimes(2);\n\n // Get handlers for both servers\n const serverAHandlers = createSpy.mock.calls[0][5];\n const serverBHandlers = createSpy.mock.calls[1][5];\n\n const mockRequest = {\n method: \"sampling/createMessage\" as const,\n params: {},\n };\n const mockExtra = createMockExtra();\n\n // Call handler for server A\n await serverAHandlers.elicitation(mockRequest, mockExtra);\n expect(mockElicitationHandler).toHaveBeenCalledWith(\n mockRequest,\n mockExtra,\n expect.objectContaining({\n url: \"https://server-a.example\",\n name: \"Server A\",\n }),\n );\n\n mockElicitationHandler.mockClear();\n\n // Call handler for server B\n await serverBHandlers.elicitation(mockRequest, mockExtra);\n expect(mockElicitationHandler).toHaveBeenCalledWith(\n mockRequest,\n mockExtra,\n expect.objectContaining({\n url: \"https://server-b.example\",\n name: \"Server B\",\n }),\n );\n });\n\n it(\"should update handlers when provider handlers change\", async () => {\n const initialHandler = jest.fn().mockResolvedValue({\n content: [{ type: \"text\", text: \"initial\" }],\n });\n\n const updatedHandler = jest.fn().mockResolvedValue({\n content: [{ type: \"text\", text: \"updated\" }],\n });\n\n let latest: McpServer[] = [];\n const { rerender } = render(\n <TestWrapper\n mcpServers={[\"https://test.example\"]}\n handlers={{ elicitation: initialHandler }}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // Update the handlers\n rerender(\n <TestWrapper\n mcpServers={[\"https://test.example\"]}\n handlers={{ elicitation: updatedHandler }}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(mockClient.updateElicitationHandler).toHaveBeenCalled();\n });\n\n // Verify the handler was updated\n expect(mockClient.updateElicitationHandler).toHaveBeenCalledWith(\n expect.any(Function),\n );\n });\n});\n\ndescribe(\"TamboMcpProvider serverKey derivation and tool prefixing\", () => {\n let mockRegisterTool: jest.Mock;\n\n beforeEach(() => {\n mockRegisterTool = jest.fn();\n\n (useTamboRegistry as unknown as jest.Mock).mockReturnValue({\n registerTool: mockRegisterTool,\n });\n\n (useTamboClient as unknown as jest.Mock).mockReturnValue({\n baseURL: \"https://api.tambo.co\",\n });\n });\n\n const Capture: React.FC<{ onUpdate: (servers: McpServer[]) => void }> = ({\n onUpdate,\n }) => {\n const servers = useTamboMcpServers();\n useEffect(() => {\n onUpdate(servers);\n }, [servers, onUpdate]);\n return null;\n };\n\n describe(\"serverKey derivation\", () => {\n it(\"should derive serverKey from URL when not provided\", async () => {\n (MCPClient as unknown as any).create = jest.fn().mockResolvedValue({\n listTools: jest.fn().mockResolvedValue([]),\n close: jest.fn(),\n });\n\n let latest: McpServer[] = [];\n render(\n <TestWrapper mcpServers={[\"https://mcp.linear.app/mcp\"]}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n expect(latest[0].serverKey).toBe(\"linear\");\n });\n });\n\n it(\"should use provided serverKey when specified\", async () => {\n (MCPClient as unknown as any).create = jest.fn().mockResolvedValue({\n listTools: jest.fn().mockResolvedValue([]),\n close: jest.fn(),\n });\n\n let latest: McpServer[] = [];\n render(\n <TestWrapper\n mcpServers={[\n {\n url: \"https://mcp.linear.app/mcp\",\n serverKey: \"custom-key\",\n },\n ]}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n expect(latest[0].serverKey).toBe(\"custom-key\");\n });\n });\n\n it(\"should derive serverKey correctly for various URL patterns\", async () => {\n (MCPClient as unknown as any).create = jest.fn().mockResolvedValue({\n listTools: jest.fn().mockResolvedValue([]),\n close: jest.fn(),\n });\n\n const testCases = [\n { url: \"https://api.github.com\", expected: \"github\" },\n { url: \"https://google.com\", expected: \"google\" },\n { url: \"https://google.co.uk\", expected: \"google\" },\n { url: \"https://mcp.company.co.uk\", expected: \"company\" },\n { url: \"https://www.example.com\", expected: \"example\" },\n ];\n\n for (const { url, expected } of testCases) {\n let latest: McpServer[] = [];\n const { unmount } = render(\n <TestWrapper mcpServers={[url]}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n expect(latest[0].serverKey).toBe(expected);\n });\n\n unmount();\n }\n });\n });\n\n describe(\"tool name prefixing\", () => {\n it(\"should NOT prefix tool names when only one server is present\", async () => {\n (MCPClient as unknown as any).create = jest.fn().mockResolvedValue({\n listTools: jest\n .fn()\n .mockResolvedValue([\n { name: \"test-tool\", description: \"A test tool\" },\n ]),\n close: jest.fn(),\n });\n\n let latest: McpServer[] = [];\n render(\n <TestWrapper mcpServers={[\"https://mcp.linear.app/mcp\"]}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n expect(mockRegisterTool).toHaveBeenCalledWith(\n expect.objectContaining({\n name: \"test-tool\", // NOT prefixed\n }),\n );\n });\n });\n\n it(\"should prefix tool names when multiple servers are present\", async () => {\n (MCPClient as unknown as any).create = jest.fn().mockResolvedValue({\n listTools: jest\n .fn()\n .mockResolvedValue([\n { name: \"test-tool\", description: \"A test tool\" },\n ]),\n close: jest.fn(),\n });\n\n let latest: McpServer[] = [];\n render(\n <TestWrapper\n mcpServers={[\"https://mcp.linear.app/mcp\", \"https://api.github.com\"]}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(\n () => {\n expect(latest.length).toBe(2);\n // Check that tools are registered with prefixed names\n const calls = mockRegisterTool.mock.calls;\n const toolNames = calls.map((call) => call[0].name);\n\n // Debug: log the actual tool names registered\n if (toolNames.length < 2) {\n throw new Error(\n `Only ${toolNames.length} tools registered: ${toolNames.join(\", \")}`,\n );\n }\n\n expect(\n calls.some((call) => call[0].name === \"linear__test-tool\"),\n ).toBe(true);\n expect(\n calls.some((call) => call[0].name === \"github__test-tool\"),\n ).toBe(true);\n },\n { timeout: 5000 },\n );\n });\n\n it(\"should use custom serverKey in prefix when provided\", async () => {\n (MCPClient as unknown as any).create = jest.fn().mockResolvedValue({\n listTools: jest\n .fn()\n .mockResolvedValue([\n { name: \"test-tool\", description: \"A test tool\" },\n ]),\n close: jest.fn(),\n });\n\n let latest: McpServer[] = [];\n render(\n <TestWrapper\n mcpServers={[\n {\n url: \"https://mcp.linear.app/mcp\",\n serverKey: \"my-server\",\n },\n \"https://api.github.com\",\n ]}\n >\n <Capture onUpdate={(s) => (latest = s)} />\n </TestWrapper>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n const calls = mockRegisterTool.mock.calls;\n expect(\n calls.some((call) => call[0].name === \"my-server__test-tool\"),\n ).toBe(true);\n });\n });\n });\n});\n"]}
|
|
@@ -67,6 +67,9 @@ describe("useTamboMcpServers + TamboMcpProvider", () => {
|
|
|
67
67
|
client: { baseURL: "https://api.tambo.co" },
|
|
68
68
|
queryClient: new react_query_1.QueryClient(),
|
|
69
69
|
isUpdatingToken: false,
|
|
70
|
+
tokenExchangeError: null,
|
|
71
|
+
userToken: undefined,
|
|
72
|
+
hasValidToken: false,
|
|
70
73
|
} },
|
|
71
74
|
react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { mcpServers: [{ url: "https://one.example" }, "https://two.example"] },
|
|
72
75
|
react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
|
|
@@ -94,6 +97,9 @@ describe("useTamboMcpServers + TamboMcpProvider", () => {
|
|
|
94
97
|
client: { baseURL: "https://api.tambo.co" },
|
|
95
98
|
queryClient: new react_query_1.QueryClient(),
|
|
96
99
|
isUpdatingToken: false,
|
|
100
|
+
tokenExchangeError: null,
|
|
101
|
+
userToken: undefined,
|
|
102
|
+
hasValidToken: false,
|
|
97
103
|
} },
|
|
98
104
|
react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { mcpServers: [{ url: "https://ok.example" }] },
|
|
99
105
|
react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
|
|
@@ -122,6 +128,9 @@ describe("useTamboMcpServers + TamboMcpProvider", () => {
|
|
|
122
128
|
client: { baseURL: "https://api.tambo.co" },
|
|
123
129
|
queryClient: new react_query_1.QueryClient(),
|
|
124
130
|
isUpdatingToken: false,
|
|
131
|
+
tokenExchangeError: null,
|
|
132
|
+
userToken: undefined,
|
|
133
|
+
hasValidToken: false,
|
|
125
134
|
} },
|
|
126
135
|
react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { mcpServers: [{ url: "https://fail.example" }] },
|
|
127
136
|
react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-mcp-servers.test.js","sourceRoot":"","sources":["../../src/mcp/use-mcp-servers.test.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kDAAyD;AACzD,+CAAyC;AACzC,oFAA8E;AAC9E,kFAA6E;AAC7E,8EAAwE;AACxE,uDAAoD;AACpD,6DAI8B;AAE9B,oDAAoD;AACpD,4DAA4D;AAE5D,+DAA+D;AAE/D,wEAAwE;AACxE,IAAI,UAAU,GAAc,IAAI,CAAC,EAAE,EAAE,CAAC;AACtC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC;IAC/B,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,GAAG,IAAW,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,EAAE;IAC9D,YAAY,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE;CAC3C,CAAC,CAAC,CAAC;AAEJ,qFAAqF;AAErF,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;IACrD,UAAU,CAAC,GAAG,EAAE;QACd,UAAU,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,UAAU,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,EAAS,CAAC;QACzE,UAAU,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAEzC,MAAM,KAAK,GAAa,GAAG,EAAE;YAC3B,MAAM,OAAO,GAAG,IAAA,uCAAkB,GAAE,CAAC;YACrC,OAAO,CACL;gBACE,sDAAiB,OAAO,IAAE,OAAO,CAAC,MAAM,CAAO;gBAC/C,sDAAiB,MAAM,IAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAO,CAC/D,CACP,CAAC;QACJ,CAAC,CAAC;QAEF,MAAM,EAAE,WAAW,EAAE,GAAG,IAAA,cAAM,EAC5B,8BAAC,0CAAkB,CAAC,QAAQ,IAC1B,KAAK,EAAE;gBACL,MAAM,EAAE,EAAE,OAAO,EAAE,sBAAsB,EAAS;gBAClD,WAAW,EAAE,IAAI,yBAAW,EAAE;gBAC9B,eAAe,EAAE,KAAK;
|
|
1
|
+
{"version":3,"file":"use-mcp-servers.test.js","sourceRoot":"","sources":["../../src/mcp/use-mcp-servers.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import { render, waitFor } from \"@testing-library/react\";\nimport React, { useEffect } from \"react\";\nimport { TamboMcpTokenProvider } from \"../providers/tambo-mcp-token-provider\";\nimport { TamboRegistryProvider } from \"../providers/tambo-registry-provider\";\nimport { TamboClientContext } from \"../providers/tambo-client-provider\";\nimport { QueryClient } from \"@tanstack/react-query\";\nimport {\n TamboMcpProvider,\n useTamboMcpServers,\n type McpServer,\n} from \"./tambo-mcp-provider\";\n\n// Mock the registry to provide a no-op registerTool\n// Do not mock the registry; use the real provider in render\n\n// Provide a minimal client context instead of mocking the hook\n\n// Mock the MCP client; use a mutable implementation to avoid TDZ issues\nlet createImpl: jest.Mock = jest.fn();\njest.mock(\"./mcp-client\", () => ({\n MCPClient: { create: (...args: any[]) => createImpl(...args) },\n MCPTransport: { SSE: \"sse\", HTTP: \"http\" },\n}));\n\n// Import after mocks note: jest.mock calls are hoisted, so standard imports are fine\n\ndescribe(\"useTamboMcpServers + TamboMcpProvider\", () => {\n beforeEach(() => {\n createImpl = jest.fn();\n });\n\n it(\"provides normalized MCP server entries to inner components\", async () => {\n const fakeClient = { listTools: jest.fn().mockResolvedValue([]) } as any;\n createImpl.mockResolvedValue(fakeClient);\n\n const Inner: React.FC = () => {\n const servers = useTamboMcpServers();\n return (\n <div>\n <div data-testid=\"count\">{servers.length}</div>\n <div data-testid=\"urls\">{servers.map((s) => s.url).join(\",\")}</div>\n </div>\n );\n };\n\n const { getByTestId } = render(\n <TamboClientContext.Provider\n value={{\n client: { baseURL: \"https://api.tambo.co\" } as any,\n queryClient: new QueryClient(),\n isUpdatingToken: false,\n tokenExchangeError: null,\n userToken: undefined,\n hasValidToken: false,\n }}\n >\n <TamboRegistryProvider\n mcpServers={[{ url: \"https://one.example\" }, \"https://two.example\"]}\n >\n <TamboMcpTokenProvider>\n <TamboMcpProvider>\n <Inner />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>\n </TamboRegistryProvider>\n </TamboClientContext.Provider>,\n );\n\n await waitFor(() => {\n expect(getByTestId(\"count\").textContent).toBe(\"2\");\n const urls = getByTestId(\"urls\").textContent || \"\";\n expect(urls).toContain(\"https://one.example\");\n expect(urls).toContain(\"https://two.example\");\n });\n });\n\n it(\"marks a successfully connected server with a client instance\", async () => {\n const fakeClient = { listTools: jest.fn().mockResolvedValue([]) } as any;\n createImpl.mockResolvedValue(fakeClient);\n\n let latest: McpServer[] = [];\n const Capture: React.FC = () => {\n const servers = useTamboMcpServers();\n useEffect(() => {\n latest = servers;\n }, [servers]);\n return null;\n };\n\n render(\n <TamboClientContext.Provider\n value={{\n client: { baseURL: \"https://api.tambo.co\" } as any,\n queryClient: new QueryClient(),\n isUpdatingToken: false,\n tokenExchangeError: null,\n userToken: undefined,\n hasValidToken: false,\n }}\n >\n <TamboRegistryProvider mcpServers={[{ url: \"https://ok.example\" }]}>\n <TamboMcpTokenProvider>\n <TamboMcpProvider>\n <Capture />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>\n </TamboRegistryProvider>\n </TamboClientContext.Provider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n expect(\"client\" in latest[0]).toBe(true);\n expect((latest[0] as any).client).toBe(fakeClient);\n // no connectionError on connected server\n expect((latest[0] as any).connectionError).toBeUndefined();\n });\n });\n\n it(\"marks a failed server with a connectionError and no client\", async () => {\n const boom = new Error(\"boom\");\n createImpl.mockRejectedValue(boom);\n\n let latest: McpServer[] = [];\n const Capture: React.FC = () => {\n const servers = useTamboMcpServers();\n useEffect(() => {\n latest = servers;\n }, [servers]);\n return null;\n };\n\n render(\n <TamboClientContext.Provider\n value={{\n client: { baseURL: \"https://api.tambo.co\" } as any,\n queryClient: new QueryClient(),\n isUpdatingToken: false,\n tokenExchangeError: null,\n userToken: undefined,\n hasValidToken: false,\n }}\n >\n <TamboRegistryProvider mcpServers={[{ url: \"https://fail.example\" }]}>\n <TamboMcpTokenProvider>\n <TamboMcpProvider>\n <Capture />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>\n </TamboRegistryProvider>\n </TamboClientContext.Provider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n expect(\"client\" in latest[0]).toBe(false);\n // @ts-expect-error narrowing at runtime\n expect(latest[0].connectionError).toBeInstanceOf(Error);\n // @ts-expect-error narrowing at runtime\n expect(latest[0].connectionError?.message).toBe(\"boom\");\n });\n });\n});\n"]}
|
|
@@ -207,7 +207,7 @@ export type TamboToolStandardSchema<Input extends StandardSchemaV1 = StandardSch
|
|
|
207
207
|
* inputSchema and outputSchema with either Standard Schema compliant validators
|
|
208
208
|
* (like Zod 3.25.76, Zod 4.x) or raw JSON Schema objects.
|
|
209
209
|
* @deprecated replace `toolSchema` with `inputSchema` and `outputSchema` instead.
|
|
210
|
-
* @see {@link https://docs.tambo.
|
|
210
|
+
* @see {@link https://docs.tambo.co/reference/react-sdk/migration/toolschema}
|
|
211
211
|
*/
|
|
212
212
|
export type UnsupportedSchemaTamboTool = Omit<TamboTool, "tool" | "inputSchema" | "outputSchema"> & {
|
|
213
213
|
/**
|
|
@@ -297,7 +297,7 @@ type OptionalSchemaProps<T> = Omit<T, "inputSchema" | "outputSchema"> & {
|
|
|
297
297
|
*/
|
|
298
298
|
export interface RegisterToolsFn {
|
|
299
299
|
/**
|
|
300
|
-
* @deprecated Follow the {@link https://docs.tambo.
|
|
300
|
+
* @deprecated Follow the {@link https://docs.tambo.co/reference/react-sdk/migration/toolschema | Migration Guide} to update
|
|
301
301
|
* your tool definitions to use `inputSchema` and `outputSchema` instead.
|
|
302
302
|
*/
|
|
303
303
|
(tools: UnsupportedSchemaTamboTool[], warnOnOverwrite?: boolean): void;
|
|
@@ -328,7 +328,7 @@ export interface RegisterToolFn {
|
|
|
328
328
|
(tool: TamboToolUnknown, warnOnOverwrite?: boolean): void;
|
|
329
329
|
(tool: TamboTool, warnOnOverwrite?: boolean): void;
|
|
330
330
|
/**
|
|
331
|
-
* @deprecated Follow the {@link https://docs.tambo.
|
|
331
|
+
* @deprecated Follow the {@link https://docs.tambo.co/reference/react-sdk/migration/toolschema | Migration Guide} to update
|
|
332
332
|
* your tool definitions to use `inputSchema` and `outputSchema` instead.
|
|
333
333
|
* @param tool - The unsupported schema Tambo tool to register
|
|
334
334
|
* @param warnOnOverwrite - Whether to warn if the tool is being overwritten
|
|
@@ -341,7 +341,7 @@ export interface RegisterToolFn {
|
|
|
341
341
|
*/
|
|
342
342
|
export interface DefineToolFn {
|
|
343
343
|
/**
|
|
344
|
-
* @deprecated Follow the {@link https://docs.tambo.
|
|
344
|
+
* @deprecated Follow the {@link https://docs.tambo.co/reference/react-sdk/migration/toolschema | Migration Guide} to update
|
|
345
345
|
* your tool definitions to use `inputSchema` and `outputSchema` instead.
|
|
346
346
|
* @param tool The tool definition to register
|
|
347
347
|
* @returns The registered tool definition
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-metadata.js","sourceRoot":"","sources":["../../src/model/component-metadata.ts"],"names":[],"mappings":"","sourcesContent":["import type { ToolAnnotations as MCPToolAnnotations } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport TamboAI from \"@tambo-ai/typescript-sdk\";\nimport { JSONSchema7 } from \"json-schema\";\nimport { ComponentType } from \"react\";\n\n/**\n * A schema type that accepts either a Standard Schema compliant validator\n * (e.g., Zod, Valibot, ArkType) or a raw JSON Schema object.\n *\n * Standard Schema is a specification that provides a unified interface for\n * TypeScript validation libraries. Libraries like Zod implement this spec,\n * allowing us to accept any compliant validator without depending on a specific library.\n * @see https://standardschema.dev/\n */\nexport type SupportedSchema<Input = unknown, Output = Input> =\n | StandardSchemaV1<Input, Output>\n | JSONSchema7;\n\n/**\n * Annotations describing a tool's behavior, aligned with the MCP (Model Context Protocol)\n * specification. These hints help clients understand how tools behave and can be used\n * to optimize tool execution strategies.\n * @see https://modelcontextprotocol.io/specification/2025-06-18/schema#toolannotations\n */\nexport type ToolAnnotations = MCPToolAnnotations & {\n /**\n * Indicates that the tool is safe to be called repeatedly while a response is\n * being streamed. This is typically used for read-only tools that do not\n * cause side effects.\n */\n tamboStreamableHint?: boolean;\n};\n\n/** Extension of the ToolParameters interface from Tambo AI to include JSONSchema definition */\nexport type ParameterSpec = TamboAI.ToolParameters & {\n schema?: JSONSchema7;\n};\n\n/**\n * Extends the base ContextTool interface from Tambo AI to include schema information\n * for parameter validation.\n */\nexport interface ComponentContextToolMetadata\n extends TamboAI.ComponentContextToolMetadata {\n parameters: ParameterSpec[];\n /**\n * Optional per-tool call limit. When set, this overrides the project's\n * global tool call limit for this specific tool.\n *\n * This is useful for tools that should only be called once or twice\n * regardless of the project's global limit.\n */\n maxCalls?: number;\n /**\n * Annotations describing the tool's behavior. See {@link ToolAnnotations}.\n */\n annotations?: ToolAnnotations;\n}\n\nexport interface ComponentContextTool {\n getComponentContext: (...args: any[]) => Promise<any>;\n definition: ComponentContextToolMetadata;\n}\n\nexport interface RegisteredComponent extends TamboAI.AvailableComponent {\n component: ComponentType<any>;\n loadingComponent?: ComponentType<any>;\n}\n\nexport type ComponentRegistry = Record<string, RegisteredComponent>;\n\nexport type TamboToolRegistry = Record<string, TamboTool>;\n\n/**\n * A JSON Schema that is compatible with the MCP.\n * This is a simplified JSON Schema that is compatible with the MCPClient and the tool's inputSchema.\n *\n * Do not export this type from the SDK.\n */\nexport type JSONSchemaLite = JSONSchema7 & {\n description?: string;\n};\n\ntype MaybeAsync<T> = T | Promise<T>;\n\n/**\n * TamboTool is a type that represents a tool that can be registered with Tambo.\n *\n * It is preferable to use the `defineTool` helper function to create tools, as\n * it provides better type inference and safety.\n * @example\n * ```ts\n * import { TamboTool, defineTool } from \"@tambo-ai/react\";\n * import { z } from \"zod\";\n *\n * const locationToLatLon = defineTool({\n * name: \"location_to_latlon\",\n * description:\n * \"Fetch latitude and longitude from a location string. Returns an object with 'lat' and 'lon' properties.\",\n * tool: async ({ location }) => getLatLonFromLocation(location),\n * inputSchema: z.object({\n * location: z.string(),\n * }),\n * outputSchema: z.object({\n * lat: z.number(),\n * lon: z.number(),\n * }),\n * });\n * ```\n */\nexport interface TamboTool<\n Params = any,\n Returns = any,\n Rest extends any[] = [],\n> {\n /**\n * Unique identifier for the tool\n */\n name: string;\n /**\n * Description of what the tool does - used by AI to determine when to use it\n */\n description: string;\n /**\n * Optional human-readable name of the tool for display purposes.\n */\n title?: string;\n /**\n * Optional limit for how many times this tool may be called while\n * generating a single response. If present, this value overrides the\n * project's global `maxToolCallLimit` for this tool.\n * @example 1\n */\n maxCalls?: number;\n /**\n * Annotations describing the tool's behavior, aligned with the MCP specification.\n * Use `tamboStreamableHint: true` to enable streaming execution of partial tool calls.\n * @see {@link ToolAnnotations}\n * @example\n * ```ts\n * const setTextTool: TamboTool<{ text: string }> = {\n * name: \"set_text\",\n * description: \"Set the displayed text\",\n * annotations: {\n * tamboStreamableHint: true, // tool is safe for streaming calls\n * },\n * tool: ({ text }) => setText(text),\n * inputSchema: z.object({ text: z.string() }),\n * outputSchema: z.void(),\n * };\n * ```\n */\n annotations?: ToolAnnotations;\n\n /**\n * The function that implements the tool's logic. This function will be called\n * by Tambo when the model decides to invoke the tool.\n * @param params - The input parameters for the tool. These are validated\n * against the inputSchema before being passed so are guaranteed to be correct\n * when called by the model.\n * @returns The result of the tool execution, which can be a value or a\n * Promise resolving to a value\n */\n tool: (params: Params, ...rest: Rest) => MaybeAsync<Returns>;\n\n /**\n * The schema for the tool's input parameters. This can be a validator from\n * any Standard Schema compliant library (Zod 3.24+, Zod 4.x) or a\n * raw JSON Schema object.\n *\n * This schema is used to validate and parse the parameters before passing\n * them to the tool function.\n */\n inputSchema: SupportedSchema<Params>;\n\n /**\n * The schema for the tool's output/return value. This can be any Standard Schema\n * compliant validator (Zod 3.24+, Zod 4.x) or a raw JSON Schema object.\n *\n * This is used to inform the model about the structure of the tool's return value\n * and is not used for runtime validation at this stage.\n */\n outputSchema: SupportedSchema<Returns>;\n\n /**\n * Optional function to transform the tool's return value into an array of content parts.\n * If not provided, the return value will be converted to a string and wrapped in a text content part.\n * @param result - The result returned by the tool function\n * @returns An array of content parts to be sent back to the AI\n */\n transformToContent?: (\n result: any,\n ) =>\n | Promise<TamboAI.Beta.Threads.ChatCompletionContentPart[]>\n | TamboAI.Beta.Threads.ChatCompletionContentPart[];\n}\n\n/**\n * A tool that uses JSON Schema compliant input and output schemas.\n * This does not provide type safety for the tool's parameters and return value.\n * @internal\n */\nexport type TamboToolJSONSchema<\n Args extends unknown[] = unknown[],\n Returns = unknown,\n> = Omit<TamboTool<Args, Returns>, \"tool\" | \"inputSchema\" | \"outputSchema\"> & {\n tool: (...args: Args) => MaybeAsync<Returns>;\n inputSchema: JSONSchemaLite;\n outputSchema: JSONSchemaLite;\n};\n\n/**\n * A tool that could not be matched to any known schema types.\n * This means type safety cannot be guaranteed.\n * @internal\n */\nexport type TamboToolUnknown = Omit<\n TamboTool,\n \"tool\" | \"inputSchema\" | \"outputSchema\"\n> & {\n tool: (...args: unknown[]) => MaybeAsync<unknown>;\n inputSchema: SupportedSchema;\n outputSchema: SupportedSchema;\n};\n\n/**\n * A tool that uses Standard Schema compliant input and output schemas.\n * This provides full type safety for the tool's parameters and return value.\n * @internal\n */\nexport type TamboToolStandardSchema<\n Input extends StandardSchemaV1 = StandardSchemaV1,\n Output extends StandardSchemaV1 = StandardSchemaV1,\n> = Omit<\n TamboTool<\n StandardSchemaV1.InferOutput<Input>,\n StandardSchemaV1.InferOutput<Output>\n >,\n \"tool\" | \"inputSchema\" | \"outputSchema\"\n> & {\n tool: (\n ...args: [StandardSchemaV1.InferOutput<Input>]\n ) => MaybeAsync<StandardSchemaV1.InferOutput<Output>>;\n inputSchema: Input;\n outputSchema: Output;\n};\n\n/**\n * If you're seeing this type, it means that you are using a deprecated and now\n * unsupported schema type for defining Tambo tools.\n *\n * Follow the migration guide to update your tool definitions to use\n * inputSchema and outputSchema with either Standard Schema compliant validators\n * (like Zod 3.25.76, Zod 4.x) or raw JSON Schema objects.\n * @deprecated replace `toolSchema` with `inputSchema` and `outputSchema` instead.\n * @see {@link https://docs.tambo.ai/api-reference/migration/toolschema}\n */\nexport type UnsupportedSchemaTamboTool = Omit<\n TamboTool,\n \"tool\" | \"inputSchema\" | \"outputSchema\"\n> & {\n /**\n * @deprecated replace `toolSchema` with `inputSchema` and `outputSchema` instead.\n */\n toolSchema: any;\n tool: (...args: any[]) => MaybeAsync<any>;\n inputSchema?: never;\n outputSchema?: never;\n};\n\nexport type TamboToolAssociations = Record<string, string[]>;\n/**\n * A component that can be registered with the TamboRegistryProvider.\n */\n\nexport interface TamboComponent {\n /** The name of the component */\n name: string;\n /** The description of the component */\n description: string;\n /**\n * The React component to render.\n *\n * Make sure to pass the Component itself, not an instance of the component. For example,\n * if you have a component like this:\n *\n * ```tsx\n * const MyComponent = () => {\n * return <div>My Component</div>;\n * };\n * ```\n *\n * You should pass the `Component`:\n *\n * ```tsx\n * const components = [MyComponent];\n * <TamboRegistryProvider components={components} />\n * ```\n */\n component: ComponentType<any>;\n\n /**\n * Schema describing the component's props. Accepts any Standard Schema\n * compliant validator (Zod, Valibot, ArkType, etc.) or a raw JSON Schema\n * object.\n *\n * Either this or propsDefinition must be provided, but not both.\n * @example\n * ```typescript\n * import { z } from \"zod/v4\";\n *\n * const component: TamboComponent = {\n * name: \"MyComponent\",\n * description: \"A sample component\",\n * component: MyComponent,\n * propsSchema: z.object({\n * title: z.string(),\n * count: z.number().optional()\n * })\n * };\n * ```\n */\n propsSchema?: SupportedSchema;\n /**\n * The props definition of the component as a JSON object.\n * Either this or propsSchema must be provided, but not both.\n * @deprecated Use propsSchema instead.\n */\n propsDefinition?: any;\n /** The loading component to render while the component is loading */\n loadingComponent?: ComponentType<any>;\n /** The tools that are associated with the component */\n associatedTools?: TamboTool[];\n /** Annotations describing the component's behavior. */\n annotations?: ToolAnnotations;\n}\n\ntype OptionalSchemaProps<T> = Omit<T, \"inputSchema\" | \"outputSchema\"> & {\n inputSchema?: T extends { inputSchema: infer I } ? I : never;\n outputSchema?: T extends { outputSchema: infer O } ? O : never;\n};\n\n/**\n * Registers one or more Tambo tools.\n * @param tools - An array of Tambo tools to register\n * @param warnOnOverwrite - Whether to warn if any tool is being overwritten\n */\nexport interface RegisterToolsFn {\n /**\n * @deprecated Follow the {@link https://docs.tambo.ai/api-reference/migration/toolschema | Migration Guide} to update\n * your tool definitions to use `inputSchema` and `outputSchema` instead.\n */\n (tools: UnsupportedSchemaTamboTool[], warnOnOverwrite?: boolean): void;\n /**\n * Register one or more Tambo tools. For better type inference, consider registering tools individually using the\n * `registerTool` function or use the `defineTool` helper when defining your tools.\n * @example\n * ```typescript\n * import { defineTool } from \"@tambo-ai/react\";\n * const tools = [\n * defineTool({...});\n * defineTool({...});\n * ];\n * registerTools(tools);\n * @param tools - An array of Tambo tools to register\n * @param warnOnOverwrite - Whether to warn if any tool is being overwritten\n */\n (tools: TamboTool[], warnOnOverwrite?: boolean): void;\n}\n\n/**\n * Function interface for registering a Tambo tool with full type inference.\n * This function has multiple overloads to handle different schema types. This\n * is a utility function and does not perform any runtime logic.\n */\nexport interface RegisterToolFn {\n <Args extends StandardSchemaV1, Returns extends StandardSchemaV1>(\n tool: TamboToolStandardSchema<Args, Returns>,\n warnOnOverwrite?: boolean,\n ): void;\n <Args extends any[], Returns = any>(\n tool: TamboToolJSONSchema<Args, Returns>,\n warnOnOverwrite?: boolean,\n ): void;\n (tool: TamboToolUnknown, warnOnOverwrite?: boolean): void;\n (tool: TamboTool, warnOnOverwrite?: boolean): void;\n /**\n * @deprecated Follow the {@link https://docs.tambo.ai/api-reference/migration/toolschema | Migration Guide} to update\n * your tool definitions to use `inputSchema` and `outputSchema` instead.\n * @param tool - The unsupported schema Tambo tool to register\n * @param warnOnOverwrite - Whether to warn if the tool is being overwritten\n */\n (tool: UnsupportedSchemaTamboTool, warnOnOverwrite?: boolean): void;\n}\n\n/**\n * Function interface for defining a Tambo tool with full type inference. This function has multiple overloads to handle\n * different schema types. This is a utility function and does not perform any runtime logic.\n */\nexport interface DefineToolFn {\n /**\n * @deprecated Follow the {@link https://docs.tambo.ai/api-reference/migration/toolschema | Migration Guide} to update\n * your tool definitions to use `inputSchema` and `outputSchema` instead.\n * @param tool The tool definition to register\n * @returns The registered tool definition\n */\n (tool: UnsupportedSchemaTamboTool): typeof tool;\n /**\n * Provides type safety for defining a Tambo Tool.\n *\n * Tambo uses the [standard-schema.dev](https://standard-schema.dev) spec which means you can use any Standard Schema\n * compliant validator (Zod 3.24+, Zod 4.x). This definition ensures the input and output types are correctly\n * inferred from the provided schemas.\n * @example\n * ```typescript\n * import { z } from \"zod/v4\";\n *\n * const myTool = defineTool({\n * name: \"myTool\",\n * description: \"An example tool\",\n * inputSchema: z.object({\n * input: z.string().describe(\"Input description\")\n * }),\n * outputSchema: z.number().describe(\"Result description\"),\n * tool: ({ input }) => input.length,\n * });\n * ```\n * @see {@link https://standard-schema.dev/}\n * @param tool The tool definition to register\n * @returns The registered tool definition\n */\n <Input extends StandardSchemaV1, Output extends StandardSchemaV1>(\n tool: OptionalSchemaProps<TamboToolStandardSchema<Input, Output>>,\n ): TamboToolStandardSchema<Input, Output>;\n /**\n * Provides type safety for defining a Tambo Tool with JSON Schema input and output.\n *\n * This overload is used when providing raw JSON Schema objects instead of StandardSchema validators.\n * Type inference is limited when using raw JSON Schema.\n * @see {@link https://standard-schema.dev/}\n * @param tool The tool definition to register\n * @returns The registered tool definition\n */\n <I extends any[], O = any>(\n tool: OptionalSchemaProps<TamboToolJSONSchema<I, O>>,\n ): TamboToolJSONSchema<I, O>;\n /**\n * Provides type safety for defining a Tambo Tool.\n *\n * This overload is used when the schema types could not be matched to known types.\n * Type safety cannot be guaranteed.\n * @param tool The tool definition to register\n * @returns The registered tool definition\n */\n (tool: OptionalSchemaProps<TamboToolUnknown>): TamboToolUnknown;\n /**\n * Provides type safety for defining a Tambo Tool.\n *\n * This overload is used when providing a fully defined TamboTool.\n * @param tool The tool definition to register\n * @returns The registered tool definition\n */\n (tool: OptionalSchemaProps<TamboTool>): TamboTool;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"component-metadata.js","sourceRoot":"","sources":["../../src/model/component-metadata.ts"],"names":[],"mappings":"","sourcesContent":["import type { ToolAnnotations as MCPToolAnnotations } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport TamboAI from \"@tambo-ai/typescript-sdk\";\nimport { JSONSchema7 } from \"json-schema\";\nimport { ComponentType } from \"react\";\n\n/**\n * A schema type that accepts either a Standard Schema compliant validator\n * (e.g., Zod, Valibot, ArkType) or a raw JSON Schema object.\n *\n * Standard Schema is a specification that provides a unified interface for\n * TypeScript validation libraries. Libraries like Zod implement this spec,\n * allowing us to accept any compliant validator without depending on a specific library.\n * @see https://standardschema.dev/\n */\nexport type SupportedSchema<Input = unknown, Output = Input> =\n | StandardSchemaV1<Input, Output>\n | JSONSchema7;\n\n/**\n * Annotations describing a tool's behavior, aligned with the MCP (Model Context Protocol)\n * specification. These hints help clients understand how tools behave and can be used\n * to optimize tool execution strategies.\n * @see https://modelcontextprotocol.io/specification/2025-06-18/schema#toolannotations\n */\nexport type ToolAnnotations = MCPToolAnnotations & {\n /**\n * Indicates that the tool is safe to be called repeatedly while a response is\n * being streamed. This is typically used for read-only tools that do not\n * cause side effects.\n */\n tamboStreamableHint?: boolean;\n};\n\n/** Extension of the ToolParameters interface from Tambo AI to include JSONSchema definition */\nexport type ParameterSpec = TamboAI.ToolParameters & {\n schema?: JSONSchema7;\n};\n\n/**\n * Extends the base ContextTool interface from Tambo AI to include schema information\n * for parameter validation.\n */\nexport interface ComponentContextToolMetadata\n extends TamboAI.ComponentContextToolMetadata {\n parameters: ParameterSpec[];\n /**\n * Optional per-tool call limit. When set, this overrides the project's\n * global tool call limit for this specific tool.\n *\n * This is useful for tools that should only be called once or twice\n * regardless of the project's global limit.\n */\n maxCalls?: number;\n /**\n * Annotations describing the tool's behavior. See {@link ToolAnnotations}.\n */\n annotations?: ToolAnnotations;\n}\n\nexport interface ComponentContextTool {\n getComponentContext: (...args: any[]) => Promise<any>;\n definition: ComponentContextToolMetadata;\n}\n\nexport interface RegisteredComponent extends TamboAI.AvailableComponent {\n component: ComponentType<any>;\n loadingComponent?: ComponentType<any>;\n}\n\nexport type ComponentRegistry = Record<string, RegisteredComponent>;\n\nexport type TamboToolRegistry = Record<string, TamboTool>;\n\n/**\n * A JSON Schema that is compatible with the MCP.\n * This is a simplified JSON Schema that is compatible with the MCPClient and the tool's inputSchema.\n *\n * Do not export this type from the SDK.\n */\nexport type JSONSchemaLite = JSONSchema7 & {\n description?: string;\n};\n\ntype MaybeAsync<T> = T | Promise<T>;\n\n/**\n * TamboTool is a type that represents a tool that can be registered with Tambo.\n *\n * It is preferable to use the `defineTool` helper function to create tools, as\n * it provides better type inference and safety.\n * @example\n * ```ts\n * import { TamboTool, defineTool } from \"@tambo-ai/react\";\n * import { z } from \"zod\";\n *\n * const locationToLatLon = defineTool({\n * name: \"location_to_latlon\",\n * description:\n * \"Fetch latitude and longitude from a location string. Returns an object with 'lat' and 'lon' properties.\",\n * tool: async ({ location }) => getLatLonFromLocation(location),\n * inputSchema: z.object({\n * location: z.string(),\n * }),\n * outputSchema: z.object({\n * lat: z.number(),\n * lon: z.number(),\n * }),\n * });\n * ```\n */\nexport interface TamboTool<\n Params = any,\n Returns = any,\n Rest extends any[] = [],\n> {\n /**\n * Unique identifier for the tool\n */\n name: string;\n /**\n * Description of what the tool does - used by AI to determine when to use it\n */\n description: string;\n /**\n * Optional human-readable name of the tool for display purposes.\n */\n title?: string;\n /**\n * Optional limit for how many times this tool may be called while\n * generating a single response. If present, this value overrides the\n * project's global `maxToolCallLimit` for this tool.\n * @example 1\n */\n maxCalls?: number;\n /**\n * Annotations describing the tool's behavior, aligned with the MCP specification.\n * Use `tamboStreamableHint: true` to enable streaming execution of partial tool calls.\n * @see {@link ToolAnnotations}\n * @example\n * ```ts\n * const setTextTool: TamboTool<{ text: string }> = {\n * name: \"set_text\",\n * description: \"Set the displayed text\",\n * annotations: {\n * tamboStreamableHint: true, // tool is safe for streaming calls\n * },\n * tool: ({ text }) => setText(text),\n * inputSchema: z.object({ text: z.string() }),\n * outputSchema: z.void(),\n * };\n * ```\n */\n annotations?: ToolAnnotations;\n\n /**\n * The function that implements the tool's logic. This function will be called\n * by Tambo when the model decides to invoke the tool.\n * @param params - The input parameters for the tool. These are validated\n * against the inputSchema before being passed so are guaranteed to be correct\n * when called by the model.\n * @returns The result of the tool execution, which can be a value or a\n * Promise resolving to a value\n */\n tool: (params: Params, ...rest: Rest) => MaybeAsync<Returns>;\n\n /**\n * The schema for the tool's input parameters. This can be a validator from\n * any Standard Schema compliant library (Zod 3.24+, Zod 4.x) or a\n * raw JSON Schema object.\n *\n * This schema is used to validate and parse the parameters before passing\n * them to the tool function.\n */\n inputSchema: SupportedSchema<Params>;\n\n /**\n * The schema for the tool's output/return value. This can be any Standard Schema\n * compliant validator (Zod 3.24+, Zod 4.x) or a raw JSON Schema object.\n *\n * This is used to inform the model about the structure of the tool's return value\n * and is not used for runtime validation at this stage.\n */\n outputSchema: SupportedSchema<Returns>;\n\n /**\n * Optional function to transform the tool's return value into an array of content parts.\n * If not provided, the return value will be converted to a string and wrapped in a text content part.\n * @param result - The result returned by the tool function\n * @returns An array of content parts to be sent back to the AI\n */\n transformToContent?: (\n result: any,\n ) =>\n | Promise<TamboAI.Beta.Threads.ChatCompletionContentPart[]>\n | TamboAI.Beta.Threads.ChatCompletionContentPart[];\n}\n\n/**\n * A tool that uses JSON Schema compliant input and output schemas.\n * This does not provide type safety for the tool's parameters and return value.\n * @internal\n */\nexport type TamboToolJSONSchema<\n Args extends unknown[] = unknown[],\n Returns = unknown,\n> = Omit<TamboTool<Args, Returns>, \"tool\" | \"inputSchema\" | \"outputSchema\"> & {\n tool: (...args: Args) => MaybeAsync<Returns>;\n inputSchema: JSONSchemaLite;\n outputSchema: JSONSchemaLite;\n};\n\n/**\n * A tool that could not be matched to any known schema types.\n * This means type safety cannot be guaranteed.\n * @internal\n */\nexport type TamboToolUnknown = Omit<\n TamboTool,\n \"tool\" | \"inputSchema\" | \"outputSchema\"\n> & {\n tool: (...args: unknown[]) => MaybeAsync<unknown>;\n inputSchema: SupportedSchema;\n outputSchema: SupportedSchema;\n};\n\n/**\n * A tool that uses Standard Schema compliant input and output schemas.\n * This provides full type safety for the tool's parameters and return value.\n * @internal\n */\nexport type TamboToolStandardSchema<\n Input extends StandardSchemaV1 = StandardSchemaV1,\n Output extends StandardSchemaV1 = StandardSchemaV1,\n> = Omit<\n TamboTool<\n StandardSchemaV1.InferOutput<Input>,\n StandardSchemaV1.InferOutput<Output>\n >,\n \"tool\" | \"inputSchema\" | \"outputSchema\"\n> & {\n tool: (\n ...args: [StandardSchemaV1.InferOutput<Input>]\n ) => MaybeAsync<StandardSchemaV1.InferOutput<Output>>;\n inputSchema: Input;\n outputSchema: Output;\n};\n\n/**\n * If you're seeing this type, it means that you are using a deprecated and now\n * unsupported schema type for defining Tambo tools.\n *\n * Follow the migration guide to update your tool definitions to use\n * inputSchema and outputSchema with either Standard Schema compliant validators\n * (like Zod 3.25.76, Zod 4.x) or raw JSON Schema objects.\n * @deprecated replace `toolSchema` with `inputSchema` and `outputSchema` instead.\n * @see {@link https://docs.tambo.co/reference/react-sdk/migration/toolschema}\n */\nexport type UnsupportedSchemaTamboTool = Omit<\n TamboTool,\n \"tool\" | \"inputSchema\" | \"outputSchema\"\n> & {\n /**\n * @deprecated replace `toolSchema` with `inputSchema` and `outputSchema` instead.\n */\n toolSchema: any;\n tool: (...args: any[]) => MaybeAsync<any>;\n inputSchema?: never;\n outputSchema?: never;\n};\n\nexport type TamboToolAssociations = Record<string, string[]>;\n/**\n * A component that can be registered with the TamboRegistryProvider.\n */\n\nexport interface TamboComponent {\n /** The name of the component */\n name: string;\n /** The description of the component */\n description: string;\n /**\n * The React component to render.\n *\n * Make sure to pass the Component itself, not an instance of the component. For example,\n * if you have a component like this:\n *\n * ```tsx\n * const MyComponent = () => {\n * return <div>My Component</div>;\n * };\n * ```\n *\n * You should pass the `Component`:\n *\n * ```tsx\n * const components = [MyComponent];\n * <TamboRegistryProvider components={components} />\n * ```\n */\n component: ComponentType<any>;\n\n /**\n * Schema describing the component's props. Accepts any Standard Schema\n * compliant validator (Zod, Valibot, ArkType, etc.) or a raw JSON Schema\n * object.\n *\n * Either this or propsDefinition must be provided, but not both.\n * @example\n * ```typescript\n * import { z } from \"zod/v4\";\n *\n * const component: TamboComponent = {\n * name: \"MyComponent\",\n * description: \"A sample component\",\n * component: MyComponent,\n * propsSchema: z.object({\n * title: z.string(),\n * count: z.number().optional()\n * })\n * };\n * ```\n */\n propsSchema?: SupportedSchema;\n /**\n * The props definition of the component as a JSON object.\n * Either this or propsSchema must be provided, but not both.\n * @deprecated Use propsSchema instead.\n */\n propsDefinition?: any;\n /** The loading component to render while the component is loading */\n loadingComponent?: ComponentType<any>;\n /** The tools that are associated with the component */\n associatedTools?: TamboTool[];\n /** Annotations describing the component's behavior. */\n annotations?: ToolAnnotations;\n}\n\ntype OptionalSchemaProps<T> = Omit<T, \"inputSchema\" | \"outputSchema\"> & {\n inputSchema?: T extends { inputSchema: infer I } ? I : never;\n outputSchema?: T extends { outputSchema: infer O } ? O : never;\n};\n\n/**\n * Registers one or more Tambo tools.\n * @param tools - An array of Tambo tools to register\n * @param warnOnOverwrite - Whether to warn if any tool is being overwritten\n */\nexport interface RegisterToolsFn {\n /**\n * @deprecated Follow the {@link https://docs.tambo.co/reference/react-sdk/migration/toolschema | Migration Guide} to update\n * your tool definitions to use `inputSchema` and `outputSchema` instead.\n */\n (tools: UnsupportedSchemaTamboTool[], warnOnOverwrite?: boolean): void;\n /**\n * Register one or more Tambo tools. For better type inference, consider registering tools individually using the\n * `registerTool` function or use the `defineTool` helper when defining your tools.\n * @example\n * ```typescript\n * import { defineTool } from \"@tambo-ai/react\";\n * const tools = [\n * defineTool({...});\n * defineTool({...});\n * ];\n * registerTools(tools);\n * @param tools - An array of Tambo tools to register\n * @param warnOnOverwrite - Whether to warn if any tool is being overwritten\n */\n (tools: TamboTool[], warnOnOverwrite?: boolean): void;\n}\n\n/**\n * Function interface for registering a Tambo tool with full type inference.\n * This function has multiple overloads to handle different schema types. This\n * is a utility function and does not perform any runtime logic.\n */\nexport interface RegisterToolFn {\n <Args extends StandardSchemaV1, Returns extends StandardSchemaV1>(\n tool: TamboToolStandardSchema<Args, Returns>,\n warnOnOverwrite?: boolean,\n ): void;\n <Args extends any[], Returns = any>(\n tool: TamboToolJSONSchema<Args, Returns>,\n warnOnOverwrite?: boolean,\n ): void;\n (tool: TamboToolUnknown, warnOnOverwrite?: boolean): void;\n (tool: TamboTool, warnOnOverwrite?: boolean): void;\n /**\n * @deprecated Follow the {@link https://docs.tambo.co/reference/react-sdk/migration/toolschema | Migration Guide} to update\n * your tool definitions to use `inputSchema` and `outputSchema` instead.\n * @param tool - The unsupported schema Tambo tool to register\n * @param warnOnOverwrite - Whether to warn if the tool is being overwritten\n */\n (tool: UnsupportedSchemaTamboTool, warnOnOverwrite?: boolean): void;\n}\n\n/**\n * Function interface for defining a Tambo tool with full type inference. This function has multiple overloads to handle\n * different schema types. This is a utility function and does not perform any runtime logic.\n */\nexport interface DefineToolFn {\n /**\n * @deprecated Follow the {@link https://docs.tambo.co/reference/react-sdk/migration/toolschema | Migration Guide} to update\n * your tool definitions to use `inputSchema` and `outputSchema` instead.\n * @param tool The tool definition to register\n * @returns The registered tool definition\n */\n (tool: UnsupportedSchemaTamboTool): typeof tool;\n /**\n * Provides type safety for defining a Tambo Tool.\n *\n * Tambo uses the [standard-schema.dev](https://standard-schema.dev) spec which means you can use any Standard Schema\n * compliant validator (Zod 3.24+, Zod 4.x). This definition ensures the input and output types are correctly\n * inferred from the provided schemas.\n * @example\n * ```typescript\n * import { z } from \"zod/v4\";\n *\n * const myTool = defineTool({\n * name: \"myTool\",\n * description: \"An example tool\",\n * inputSchema: z.object({\n * input: z.string().describe(\"Input description\")\n * }),\n * outputSchema: z.number().describe(\"Result description\"),\n * tool: ({ input }) => input.length,\n * });\n * ```\n * @see {@link https://standard-schema.dev/}\n * @param tool The tool definition to register\n * @returns The registered tool definition\n */\n <Input extends StandardSchemaV1, Output extends StandardSchemaV1>(\n tool: OptionalSchemaProps<TamboToolStandardSchema<Input, Output>>,\n ): TamboToolStandardSchema<Input, Output>;\n /**\n * Provides type safety for defining a Tambo Tool with JSON Schema input and output.\n *\n * This overload is used when providing raw JSON Schema objects instead of StandardSchema validators.\n * Type inference is limited when using raw JSON Schema.\n * @see {@link https://standard-schema.dev/}\n * @param tool The tool definition to register\n * @returns The registered tool definition\n */\n <I extends any[], O = any>(\n tool: OptionalSchemaProps<TamboToolJSONSchema<I, O>>,\n ): TamboToolJSONSchema<I, O>;\n /**\n * Provides type safety for defining a Tambo Tool.\n *\n * This overload is used when the schema types could not be matched to known types.\n * Type safety cannot be guaranteed.\n * @param tool The tool definition to register\n * @returns The registered tool definition\n */\n (tool: OptionalSchemaProps<TamboToolUnknown>): TamboToolUnknown;\n /**\n * Provides type safety for defining a Tambo Tool.\n *\n * This overload is used when providing a fully defined TamboTool.\n * @param tool The tool definition to register\n * @returns The registered tool definition\n */\n (tool: OptionalSchemaProps<TamboTool>): TamboTool;\n}\n"]}
|
|
@@ -65,7 +65,7 @@ jest.mock("../tambo-mcp-token-provider", () => ({
|
|
|
65
65
|
const createMockInternalServer = (serverKey) => ({
|
|
66
66
|
key: serverKey,
|
|
67
67
|
serverKey,
|
|
68
|
-
url: "https://api.tambo.
|
|
68
|
+
url: "https://api.tambo.co/mcp",
|
|
69
69
|
name: "__tambo_internal_mcp_server__",
|
|
70
70
|
transport: "http",
|
|
71
71
|
serverType: mcp_constants_1.ServerType.TAMBO_INTERNAL,
|
|
@@ -114,7 +114,7 @@ describe("TamboProvider - Resource Content Resolution Integration", () => {
|
|
|
114
114
|
const createWrapper = (options) => {
|
|
115
115
|
function Wrapper({ children }) {
|
|
116
116
|
return (react_2.default.createElement(react_query_1.QueryClientProvider, { client: queryClient },
|
|
117
|
-
react_2.default.createElement(tambo_provider_1.TamboProvider, { apiKey: "test-api-key", tamboUrl: "https://api.tambo.
|
|
117
|
+
react_2.default.createElement(tambo_provider_1.TamboProvider, { apiKey: "test-api-key", tamboUrl: "https://api.tambo.co", listResources: options?.listResources,
|
|
118
118
|
// Cast to any because test mocks return simplified types
|
|
119
119
|
getResource: options?.getResource, resources: options?.resources, contextKey: mockContextKey }, children)));
|
|
120
120
|
}
|