@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":"thread-input-resource-resolution.test.js","sourceRoot":"","sources":["../../../src/providers/__tests__/thread-input-resource-resolution.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { act, renderHook } from \"@testing-library/react\";\nimport React from \"react\";\nimport type TamboAI from \"@tambo-ai/typescript-sdk\";\nimport { ServerType } from \"../../mcp/mcp-constants\";\nimport type { McpServer } from \"../../mcp/tambo-mcp-provider\";\nimport { TamboProvider } from \"../tambo-provider\";\nimport { useTamboThreadInput } from \"../tambo-thread-input-provider\";\n\n// Mock the Tambo client provider to avoid needing real API credentials\n\njest.mock(\"../tambo-client-provider\", () => {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const ReactModule = require(\"react\");\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { QueryClient: QC } = require(\"@tanstack/react-query\");\n const mockQueryClient = new QC();\n const MockContext = ReactModule.createContext({\n client: {},\n queryClient: mockQueryClient,\n isUpdatingToken: false,\n });\n return {\n TamboClientProvider: ({ children }: { children: React.ReactNode }) => (\n <MockContext.Provider\n value={{\n client: {},\n queryClient: mockQueryClient,\n isUpdatingToken: false,\n }}\n >\n {children}\n </MockContext.Provider>\n ),\n TamboClientContext: MockContext,\n useTamboClient: () => ({\n client: {},\n queryClient: mockQueryClient,\n isUpdatingToken: false,\n }),\n };\n});\n\n// Mock the thread provider to capture sendThreadMessage calls\nconst mockSendThreadMessage = jest.fn();\nconst mockContextKey = \"test-context-key\";\njest.mock(\"../tambo-thread-provider\", () => ({\n TamboThreadProvider: ({ children }: { children: React.ReactNode }) =>\n children,\n useTamboThread: () => ({\n thread: { id: \"test-thread-id\" },\n sendThreadMessage: mockSendThreadMessage,\n contextKey: mockContextKey,\n }),\n}));\n\n// Mock servers array - will be updated per test\nlet mockServers: McpServer[] = [];\n\n// Mock the MCP provider to avoid real MCP connections\njest.mock(\"../../mcp/tambo-mcp-provider\", () => ({\n TamboMcpProvider: ({ children }: { children: React.ReactNode }) => children,\n useTamboMcpServers: () => mockServers,\n}));\n\n// Mock the MCP token provider\njest.mock(\"../tambo-mcp-token-provider\", () => ({\n TamboMcpTokenProvider: ({ children }: { children: React.ReactNode }) =>\n children,\n useTamboMcpToken: () => ({\n mcpAccessToken: null,\n tamboBaseUrl: null,\n }),\n}));\n\n// Helper to create internal server\nconst createMockInternalServer = (serverKey: string): McpServer =>\n ({\n key: serverKey,\n serverKey,\n url: \"https://api.tambo.ai/mcp\",\n name: \"__tambo_internal_mcp_server__\",\n transport: \"http\",\n serverType: ServerType.TAMBO_INTERNAL,\n connectionError: undefined, // Internal servers resolved by backend\n }) as unknown as McpServer;\n\n// Mock the message images hook\njest.mock(\"../../hooks/use-message-images\", () => ({\n useMessageImages: () => ({\n images: [],\n addImage: jest.fn(),\n addImages: jest.fn(),\n removeImage: jest.fn(),\n clearImages: jest.fn(),\n }),\n}));\n\n// Mock the mutation hook to execute the mutation function directly\njest.mock(\"../../hooks/react-query-hooks\", () => ({\n useTamboMutation: ({ mutationFn }: { mutationFn: () => Promise<void> }) => ({\n mutateAsync: mutationFn,\n mutate: mutationFn,\n isLoading: false,\n isError: false,\n isSuccess: false,\n error: null,\n reset: jest.fn(),\n }),\n}));\n\ndescribe(\"TamboProvider - Resource Content Resolution Integration\", () => {\n let queryClient: QueryClient;\n\n beforeEach(() => {\n jest.clearAllMocks();\n mockSendThreadMessage.mockResolvedValue(undefined);\n // Default: no MCP servers (registry resources don't need a server entry)\n mockServers = [];\n queryClient = new QueryClient({\n defaultOptions: {\n queries: { retry: false },\n mutations: { retry: false },\n },\n });\n });\n\n afterEach(() => {\n queryClient.clear();\n mockServers = [];\n });\n\n const createWrapper = (options?: {\n listResources?: (\n search?: string,\n ) => Promise<{ uri: string; name: string; mimeType?: string }[]>;\n getResource?: (uri: string) => Promise<unknown>;\n resources?: { uri: string; name: string; mimeType?: string }[];\n }) => {\n function Wrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboProvider\n apiKey=\"test-api-key\"\n tamboUrl=\"https://api.tambo.ai\"\n listResources={options?.listResources}\n // Cast to any because test mocks return simplified types\n getResource={options?.getResource as any}\n resources={options?.resources}\n contextKey={mockContextKey}\n >\n {children}\n </TamboProvider>\n </QueryClientProvider>\n );\n }\n return Wrapper;\n };\n\n it(\"should resolve registry resource content when submitting a message\", async () => {\n const mockGetResource = jest.fn().mockResolvedValue({\n contents: [\n {\n uri: \"file:///my-document.txt\",\n mimeType: \"text/plain\",\n text: \"This is the document content from the registry\",\n },\n ],\n });\n\n const mockListResources = jest.fn().mockResolvedValue([\n {\n uri: \"file:///my-document.txt\",\n name: \"My Document\",\n mimeType: \"text/plain\",\n },\n ]);\n\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper({\n listResources: mockListResources,\n getResource: mockGetResource,\n }),\n });\n\n // Set the input value with a registry resource reference\n act(() => {\n result.current.setValue(\n \"Show me the contents of @registry:file:///my-document.txt in a table\",\n );\n });\n\n // Submit the message\n await act(async () => {\n await result.current.submit();\n });\n\n // Verify getResource was called with the correct URI (without the registry: prefix)\n expect(mockGetResource).toHaveBeenCalledWith(\"file:///my-document.txt\");\n\n // Verify sendThreadMessage was called with the resolved content\n expect(mockSendThreadMessage).toHaveBeenCalledTimes(1);\n const [, options] = mockSendThreadMessage.mock.calls[0];\n const content =\n options.content as TamboAI.Beta.Threads.ChatCompletionContentPart[];\n\n // Should have: text \"Show me the contents of \", resource with resolved content, text \" in a table\"\n expect(content).toMatchInlineSnapshot(`\n [\n {\n \"text\": \"Show me the contents of \",\n \"type\": \"text\",\n },\n {\n \"resource\": {\n \"mimeType\": \"text/plain\",\n \"text\": \"This is the document content from the registry\",\n \"uri\": \"file:///my-document.txt\",\n },\n \"type\": \"resource\",\n },\n {\n \"text\": \" in a table\",\n \"type\": \"text\",\n },\n ]\n `);\n });\n\n it(\"should resolve multiple registry resources in a single message\", async () => {\n const mockGetResource = jest\n .fn()\n .mockImplementation(async (uri: string) => {\n if (uri === \"file:///doc1.txt\") {\n return { contents: [{ uri, text: \"Content of doc1\" }] };\n }\n if (uri === \"file:///doc2.txt\") {\n return { contents: [{ uri, text: \"Content of doc2\" }] };\n }\n return null;\n });\n\n const mockListResources = jest.fn().mockResolvedValue([]);\n\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper({\n listResources: mockListResources,\n getResource: mockGetResource,\n }),\n });\n\n act(() => {\n result.current.setValue(\n \"Compare @registry:file:///doc1.txt with @registry:file:///doc2.txt\",\n );\n });\n\n await act(async () => {\n await result.current.submit();\n });\n\n // Both resources should have been fetched\n expect(mockGetResource).toHaveBeenCalledWith(\"file:///doc1.txt\");\n expect(mockGetResource).toHaveBeenCalledWith(\"file:///doc2.txt\");\n\n const [, options] = mockSendThreadMessage.mock.calls[0];\n const content =\n options.content as TamboAI.Beta.Threads.ChatCompletionContentPart[];\n\n expect(content).toMatchInlineSnapshot(`\n [\n {\n \"text\": \"Compare \",\n \"type\": \"text\",\n },\n {\n \"resource\": {\n \"text\": \"Content of doc1\",\n \"uri\": \"file:///doc1.txt\",\n },\n \"type\": \"resource\",\n },\n {\n \"text\": \" with \",\n \"type\": \"text\",\n },\n {\n \"resource\": {\n \"text\": \"Content of doc2\",\n \"uri\": \"file:///doc2.txt\",\n },\n \"type\": \"resource\",\n },\n ]\n `);\n });\n\n it(\"should resolve registry resource with blob content\", async () => {\n const mockGetResource = jest.fn().mockResolvedValue({\n contents: [\n {\n uri: \"file:///image.png\",\n mimeType: \"image/png\",\n blob: \"base64encodedimagedata\",\n },\n ],\n });\n\n const mockListResources = jest.fn().mockResolvedValue([]);\n\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper({\n listResources: mockListResources,\n getResource: mockGetResource,\n }),\n });\n\n act(() => {\n result.current.setValue(\"Analyze @registry:file:///image.png\");\n });\n\n await act(async () => {\n await result.current.submit();\n });\n\n const [, options] = mockSendThreadMessage.mock.calls[0];\n const content =\n options.content as TamboAI.Beta.Threads.ChatCompletionContentPart[];\n\n expect(content).toMatchInlineSnapshot(`\n [\n {\n \"text\": \"Analyze \",\n \"type\": \"text\",\n },\n {\n \"resource\": {\n \"blob\": \"base64encodedimagedata\",\n \"mimeType\": \"image/png\",\n \"uri\": \"file:///image.png\",\n },\n \"type\": \"resource\",\n },\n ]\n `);\n });\n\n it(\"should continue with submission even if resource fetch fails (graceful fallback)\", async () => {\n const consoleSpy = jest.spyOn(console, \"warn\").mockImplementation();\n const mockGetResource = jest\n .fn()\n .mockRejectedValue(new Error(\"Resource fetch failed\"));\n\n const mockListResources = jest.fn().mockResolvedValue([]);\n\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper({\n listResources: mockListResources,\n getResource: mockGetResource,\n }),\n });\n\n act(() => {\n result.current.setValue(\"Check @registry:file:///missing.txt\");\n });\n\n // Should not throw, should continue with submission\n await act(async () => {\n await result.current.submit();\n });\n\n // Resource fetch was attempted\n expect(mockGetResource).toHaveBeenCalledWith(\"file:///missing.txt\");\n\n // Warning should be logged\n expect(consoleSpy).toHaveBeenCalledWith(\n \"Failed to fetch resource content for registry:file:///missing.txt:\",\n expect.any(Error),\n );\n\n // Message should still be sent (without the resolved content)\n expect(mockSendThreadMessage).toHaveBeenCalledTimes(1);\n const [, options] = mockSendThreadMessage.mock.calls[0];\n const content =\n options.content as TamboAI.Beta.Threads.ChatCompletionContentPart[];\n\n // Resource should be present but without text/blob content\n expect(content).toMatchInlineSnapshot(`\n [\n {\n \"text\": \"Check \",\n \"type\": \"text\",\n },\n {\n \"resource\": {\n \"uri\": \"file:///missing.txt\",\n },\n \"type\": \"resource\",\n },\n ]\n `);\n\n consoleSpy.mockRestore();\n });\n\n it(\"should NOT resolve internal server resources (serverType: TAMBO_INTERNAL)\", async () => {\n // Add internal server to mock servers\n mockServers = [createMockInternalServer(\"tambo-abc123\")];\n\n const mockGetResource = jest.fn().mockResolvedValue({\n contents: [{ uri: \"tambo:test://resource/1\", text: \"Should not fetch\" }],\n });\n\n const mockListResources = jest.fn().mockResolvedValue([]);\n\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper({\n listResources: mockListResources,\n getResource: mockGetResource,\n }),\n });\n\n act(() => {\n result.current.setValue(\n \"Check @tambo-abc123:tambo:test://internal/resource/1\",\n );\n });\n\n await act(async () => {\n await result.current.submit();\n });\n\n // getResource should NOT be called for internal server resources\n expect(mockGetResource).not.toHaveBeenCalled();\n\n // Message should still be sent with resource (but without resolved content)\n expect(mockSendThreadMessage).toHaveBeenCalledTimes(1);\n const [, options] = mockSendThreadMessage.mock.calls[0];\n const content =\n options.content as TamboAI.Beta.Threads.ChatCompletionContentPart[];\n\n expect(content).toMatchInlineSnapshot(`\n [\n {\n \"text\": \"Check \",\n \"type\": \"text\",\n },\n {\n \"resource\": {\n \"uri\": \"tambo:test://internal/resource/1\",\n },\n \"type\": \"resource\",\n },\n ]\n `);\n });\n\n it(\"should handle mixed registry and internal server resources\", async () => {\n // Add internal server\n mockServers = [createMockInternalServer(\"tambo-xyz\")];\n\n const mockGetResource = jest.fn().mockResolvedValue({\n contents: [{ uri: \"file:///registry-doc.txt\", text: \"Registry content\" }],\n });\n\n const mockListResources = jest.fn().mockResolvedValue([]);\n\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper({\n listResources: mockListResources,\n getResource: mockGetResource,\n }),\n });\n\n act(() => {\n result.current.setValue(\n \"@registry:file:///registry-doc.txt and @tambo-xyz:tambo:test://internal\",\n );\n });\n\n await act(async () => {\n await result.current.submit();\n });\n\n // Only the registry resource should be fetched\n expect(mockGetResource).toHaveBeenCalledTimes(1);\n expect(mockGetResource).toHaveBeenCalledWith(\"file:///registry-doc.txt\");\n\n const [, options] = mockSendThreadMessage.mock.calls[0];\n const content =\n options.content as TamboAI.Beta.Threads.ChatCompletionContentPart[];\n\n expect(content).toMatchInlineSnapshot(`\n [\n {\n \"resource\": {\n \"text\": \"Registry content\",\n \"uri\": \"file:///registry-doc.txt\",\n },\n \"type\": \"resource\",\n },\n {\n \"text\": \" and \",\n \"type\": \"text\",\n },\n {\n \"resource\": {\n \"uri\": \"tambo:test://internal\",\n },\n \"type\": \"resource\",\n },\n ]\n `);\n });\n\n it(\"should include resource names when provided in submit options\", async () => {\n const mockGetResource = jest.fn().mockResolvedValue({\n contents: [\n {\n uri: \"file:///doc.txt\",\n text: \"Document content\",\n },\n ],\n });\n\n const mockListResources = jest.fn().mockResolvedValue([]);\n\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper({\n listResources: mockListResources,\n getResource: mockGetResource,\n }),\n });\n\n act(() => {\n result.current.setValue(\"Check @registry:file:///doc.txt\");\n });\n\n await act(async () => {\n await result.current.submit({\n resourceNames: {\n \"registry:file:///doc.txt\": \"Important Document.txt\",\n },\n });\n });\n\n const [, options] = mockSendThreadMessage.mock.calls[0];\n const content =\n options.content as TamboAI.Beta.Threads.ChatCompletionContentPart[];\n\n expect(content).toMatchInlineSnapshot(`\n [\n {\n \"text\": \"Check \",\n \"type\": \"text\",\n },\n {\n \"resource\": {\n \"name\": \"Important Document.txt\",\n \"text\": \"Document content\",\n \"uri\": \"file:///doc.txt\",\n },\n \"type\": \"resource\",\n },\n ]\n `);\n });\n\n it(\"should handle message without any resource references\", async () => {\n const mockGetResource = jest.fn();\n const mockListResources = jest.fn().mockResolvedValue([]);\n\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper({\n listResources: mockListResources,\n getResource: mockGetResource,\n }),\n });\n\n act(() => {\n result.current.setValue(\"Just a regular message without resources\");\n });\n\n await act(async () => {\n await result.current.submit();\n });\n\n // No resource fetch should happen\n expect(mockGetResource).not.toHaveBeenCalled();\n\n // Message should be sent as plain text\n const [, options] = mockSendThreadMessage.mock.calls[0];\n const content =\n options.content as TamboAI.Beta.Threads.ChatCompletionContentPart[];\n\n expect(content).toMatchInlineSnapshot(`\n [\n {\n \"text\": \"Just a regular message without resources\",\n \"type\": \"text\",\n },\n ]\n `);\n });\n\n it(\"should handle null returned from getResource\", async () => {\n const mockGetResource = jest.fn().mockResolvedValue(null);\n const mockListResources = jest.fn().mockResolvedValue([]);\n\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper({\n listResources: mockListResources,\n getResource: mockGetResource,\n }),\n });\n\n act(() => {\n result.current.setValue(\"Check @registry:file:///unknown.txt\");\n });\n\n await act(async () => {\n await result.current.submit();\n });\n\n expect(mockGetResource).toHaveBeenCalled();\n\n const [, options] = mockSendThreadMessage.mock.calls[0];\n const content =\n options.content as TamboAI.Beta.Threads.ChatCompletionContentPart[];\n\n // Resource should be present but without content\n expect(content).toMatchInlineSnapshot(`\n [\n {\n \"text\": \"Check \",\n \"type\": \"text\",\n },\n {\n \"resource\": {\n \"uri\": \"file:///unknown.txt\",\n },\n \"type\": \"resource\",\n },\n ]\n `);\n });\n\n it(\"should warn when no resourceSource is available for registry resource\", async () => {\n const consoleSpy = jest.spyOn(console, \"warn\").mockImplementation();\n\n // No listResources/getResource provided\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper(),\n });\n\n act(() => {\n result.current.setValue(\"Check @registry:file:///doc.txt\");\n });\n\n await act(async () => {\n await result.current.submit();\n });\n\n expect(consoleSpy).toHaveBeenCalledWith(\n \"No resource source available to resolve registry resource: registry:file:///doc.txt\",\n );\n\n consoleSpy.mockRestore();\n });\n\n it(\"should resolve static resources passed via resources prop\", async () => {\n // When using static resources, we need both listResources and getResource\n // to form the resourceSource, even though the resources are static\n const mockGetResource = jest.fn().mockResolvedValue({\n contents: [\n {\n uri: \"static://my-static-resource\",\n text: \"Static resource content\",\n mimeType: \"text/plain\",\n },\n ],\n });\n\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper({\n resources: [\n {\n uri: \"static://my-static-resource\",\n name: \"My Static Resource\",\n mimeType: \"text/plain\",\n },\n ],\n // Need getResource to actually fetch the content\n getResource: mockGetResource,\n listResources: async () => [],\n }),\n });\n\n act(() => {\n result.current.setValue(\n \"Show me @registry:static://my-static-resource please\",\n );\n });\n\n await act(async () => {\n await result.current.submit();\n });\n\n // getResource should be called to fetch the content\n expect(mockGetResource).toHaveBeenCalledWith(\"static://my-static-resource\");\n\n const [, options] = mockSendThreadMessage.mock.calls[0];\n const content =\n options.content as TamboAI.Beta.Threads.ChatCompletionContentPart[];\n\n expect(content).toMatchInlineSnapshot(`\n [\n {\n \"text\": \"Show me \",\n \"type\": \"text\",\n },\n {\n \"resource\": {\n \"mimeType\": \"text/plain\",\n \"text\": \"Static resource content\",\n \"uri\": \"static://my-static-resource\",\n },\n \"type\": \"resource\",\n },\n {\n \"text\": \" please\",\n \"type\": \"text\",\n },\n ]\n `);\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"thread-input-resource-resolution.test.js","sourceRoot":"","sources":["../../../src/providers/__tests__/thread-input-resource-resolution.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { act, renderHook } from \"@testing-library/react\";\nimport React from \"react\";\nimport type TamboAI from \"@tambo-ai/typescript-sdk\";\nimport { ServerType } from \"../../mcp/mcp-constants\";\nimport type { McpServer } from \"../../mcp/tambo-mcp-provider\";\nimport { TamboProvider } from \"../tambo-provider\";\nimport { useTamboThreadInput } from \"../tambo-thread-input-provider\";\n\n// Mock the Tambo client provider to avoid needing real API credentials\n\njest.mock(\"../tambo-client-provider\", () => {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const ReactModule = require(\"react\");\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { QueryClient: QC } = require(\"@tanstack/react-query\");\n const mockQueryClient = new QC();\n const MockContext = ReactModule.createContext({\n client: {},\n queryClient: mockQueryClient,\n isUpdatingToken: false,\n });\n return {\n TamboClientProvider: ({ children }: { children: React.ReactNode }) => (\n <MockContext.Provider\n value={{\n client: {},\n queryClient: mockQueryClient,\n isUpdatingToken: false,\n }}\n >\n {children}\n </MockContext.Provider>\n ),\n TamboClientContext: MockContext,\n useTamboClient: () => ({\n client: {},\n queryClient: mockQueryClient,\n isUpdatingToken: false,\n }),\n };\n});\n\n// Mock the thread provider to capture sendThreadMessage calls\nconst mockSendThreadMessage = jest.fn();\nconst mockContextKey = \"test-context-key\";\njest.mock(\"../tambo-thread-provider\", () => ({\n TamboThreadProvider: ({ children }: { children: React.ReactNode }) =>\n children,\n useTamboThread: () => ({\n thread: { id: \"test-thread-id\" },\n sendThreadMessage: mockSendThreadMessage,\n contextKey: mockContextKey,\n }),\n}));\n\n// Mock servers array - will be updated per test\nlet mockServers: McpServer[] = [];\n\n// Mock the MCP provider to avoid real MCP connections\njest.mock(\"../../mcp/tambo-mcp-provider\", () => ({\n TamboMcpProvider: ({ children }: { children: React.ReactNode }) => children,\n useTamboMcpServers: () => mockServers,\n}));\n\n// Mock the MCP token provider\njest.mock(\"../tambo-mcp-token-provider\", () => ({\n TamboMcpTokenProvider: ({ children }: { children: React.ReactNode }) =>\n children,\n useTamboMcpToken: () => ({\n mcpAccessToken: null,\n tamboBaseUrl: null,\n }),\n}));\n\n// Helper to create internal server\nconst createMockInternalServer = (serverKey: string): McpServer =>\n ({\n key: serverKey,\n serverKey,\n url: \"https://api.tambo.co/mcp\",\n name: \"__tambo_internal_mcp_server__\",\n transport: \"http\",\n serverType: ServerType.TAMBO_INTERNAL,\n connectionError: undefined, // Internal servers resolved by backend\n }) as unknown as McpServer;\n\n// Mock the message images hook\njest.mock(\"../../hooks/use-message-images\", () => ({\n useMessageImages: () => ({\n images: [],\n addImage: jest.fn(),\n addImages: jest.fn(),\n removeImage: jest.fn(),\n clearImages: jest.fn(),\n }),\n}));\n\n// Mock the mutation hook to execute the mutation function directly\njest.mock(\"../../hooks/react-query-hooks\", () => ({\n useTamboMutation: ({ mutationFn }: { mutationFn: () => Promise<void> }) => ({\n mutateAsync: mutationFn,\n mutate: mutationFn,\n isLoading: false,\n isError: false,\n isSuccess: false,\n error: null,\n reset: jest.fn(),\n }),\n}));\n\ndescribe(\"TamboProvider - Resource Content Resolution Integration\", () => {\n let queryClient: QueryClient;\n\n beforeEach(() => {\n jest.clearAllMocks();\n mockSendThreadMessage.mockResolvedValue(undefined);\n // Default: no MCP servers (registry resources don't need a server entry)\n mockServers = [];\n queryClient = new QueryClient({\n defaultOptions: {\n queries: { retry: false },\n mutations: { retry: false },\n },\n });\n });\n\n afterEach(() => {\n queryClient.clear();\n mockServers = [];\n });\n\n const createWrapper = (options?: {\n listResources?: (\n search?: string,\n ) => Promise<{ uri: string; name: string; mimeType?: string }[]>;\n getResource?: (uri: string) => Promise<unknown>;\n resources?: { uri: string; name: string; mimeType?: string }[];\n }) => {\n function Wrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboProvider\n apiKey=\"test-api-key\"\n tamboUrl=\"https://api.tambo.co\"\n listResources={options?.listResources}\n // Cast to any because test mocks return simplified types\n getResource={options?.getResource as any}\n resources={options?.resources}\n contextKey={mockContextKey}\n >\n {children}\n </TamboProvider>\n </QueryClientProvider>\n );\n }\n return Wrapper;\n };\n\n it(\"should resolve registry resource content when submitting a message\", async () => {\n const mockGetResource = jest.fn().mockResolvedValue({\n contents: [\n {\n uri: \"file:///my-document.txt\",\n mimeType: \"text/plain\",\n text: \"This is the document content from the registry\",\n },\n ],\n });\n\n const mockListResources = jest.fn().mockResolvedValue([\n {\n uri: \"file:///my-document.txt\",\n name: \"My Document\",\n mimeType: \"text/plain\",\n },\n ]);\n\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper({\n listResources: mockListResources,\n getResource: mockGetResource,\n }),\n });\n\n // Set the input value with a registry resource reference\n act(() => {\n result.current.setValue(\n \"Show me the contents of @registry:file:///my-document.txt in a table\",\n );\n });\n\n // Submit the message\n await act(async () => {\n await result.current.submit();\n });\n\n // Verify getResource was called with the correct URI (without the registry: prefix)\n expect(mockGetResource).toHaveBeenCalledWith(\"file:///my-document.txt\");\n\n // Verify sendThreadMessage was called with the resolved content\n expect(mockSendThreadMessage).toHaveBeenCalledTimes(1);\n const [, options] = mockSendThreadMessage.mock.calls[0];\n const content =\n options.content as TamboAI.Beta.Threads.ChatCompletionContentPart[];\n\n // Should have: text \"Show me the contents of \", resource with resolved content, text \" in a table\"\n expect(content).toMatchInlineSnapshot(`\n [\n {\n \"text\": \"Show me the contents of \",\n \"type\": \"text\",\n },\n {\n \"resource\": {\n \"mimeType\": \"text/plain\",\n \"text\": \"This is the document content from the registry\",\n \"uri\": \"file:///my-document.txt\",\n },\n \"type\": \"resource\",\n },\n {\n \"text\": \" in a table\",\n \"type\": \"text\",\n },\n ]\n `);\n });\n\n it(\"should resolve multiple registry resources in a single message\", async () => {\n const mockGetResource = jest\n .fn()\n .mockImplementation(async (uri: string) => {\n if (uri === \"file:///doc1.txt\") {\n return { contents: [{ uri, text: \"Content of doc1\" }] };\n }\n if (uri === \"file:///doc2.txt\") {\n return { contents: [{ uri, text: \"Content of doc2\" }] };\n }\n return null;\n });\n\n const mockListResources = jest.fn().mockResolvedValue([]);\n\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper({\n listResources: mockListResources,\n getResource: mockGetResource,\n }),\n });\n\n act(() => {\n result.current.setValue(\n \"Compare @registry:file:///doc1.txt with @registry:file:///doc2.txt\",\n );\n });\n\n await act(async () => {\n await result.current.submit();\n });\n\n // Both resources should have been fetched\n expect(mockGetResource).toHaveBeenCalledWith(\"file:///doc1.txt\");\n expect(mockGetResource).toHaveBeenCalledWith(\"file:///doc2.txt\");\n\n const [, options] = mockSendThreadMessage.mock.calls[0];\n const content =\n options.content as TamboAI.Beta.Threads.ChatCompletionContentPart[];\n\n expect(content).toMatchInlineSnapshot(`\n [\n {\n \"text\": \"Compare \",\n \"type\": \"text\",\n },\n {\n \"resource\": {\n \"text\": \"Content of doc1\",\n \"uri\": \"file:///doc1.txt\",\n },\n \"type\": \"resource\",\n },\n {\n \"text\": \" with \",\n \"type\": \"text\",\n },\n {\n \"resource\": {\n \"text\": \"Content of doc2\",\n \"uri\": \"file:///doc2.txt\",\n },\n \"type\": \"resource\",\n },\n ]\n `);\n });\n\n it(\"should resolve registry resource with blob content\", async () => {\n const mockGetResource = jest.fn().mockResolvedValue({\n contents: [\n {\n uri: \"file:///image.png\",\n mimeType: \"image/png\",\n blob: \"base64encodedimagedata\",\n },\n ],\n });\n\n const mockListResources = jest.fn().mockResolvedValue([]);\n\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper({\n listResources: mockListResources,\n getResource: mockGetResource,\n }),\n });\n\n act(() => {\n result.current.setValue(\"Analyze @registry:file:///image.png\");\n });\n\n await act(async () => {\n await result.current.submit();\n });\n\n const [, options] = mockSendThreadMessage.mock.calls[0];\n const content =\n options.content as TamboAI.Beta.Threads.ChatCompletionContentPart[];\n\n expect(content).toMatchInlineSnapshot(`\n [\n {\n \"text\": \"Analyze \",\n \"type\": \"text\",\n },\n {\n \"resource\": {\n \"blob\": \"base64encodedimagedata\",\n \"mimeType\": \"image/png\",\n \"uri\": \"file:///image.png\",\n },\n \"type\": \"resource\",\n },\n ]\n `);\n });\n\n it(\"should continue with submission even if resource fetch fails (graceful fallback)\", async () => {\n const consoleSpy = jest.spyOn(console, \"warn\").mockImplementation();\n const mockGetResource = jest\n .fn()\n .mockRejectedValue(new Error(\"Resource fetch failed\"));\n\n const mockListResources = jest.fn().mockResolvedValue([]);\n\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper({\n listResources: mockListResources,\n getResource: mockGetResource,\n }),\n });\n\n act(() => {\n result.current.setValue(\"Check @registry:file:///missing.txt\");\n });\n\n // Should not throw, should continue with submission\n await act(async () => {\n await result.current.submit();\n });\n\n // Resource fetch was attempted\n expect(mockGetResource).toHaveBeenCalledWith(\"file:///missing.txt\");\n\n // Warning should be logged\n expect(consoleSpy).toHaveBeenCalledWith(\n \"Failed to fetch resource content for registry:file:///missing.txt:\",\n expect.any(Error),\n );\n\n // Message should still be sent (without the resolved content)\n expect(mockSendThreadMessage).toHaveBeenCalledTimes(1);\n const [, options] = mockSendThreadMessage.mock.calls[0];\n const content =\n options.content as TamboAI.Beta.Threads.ChatCompletionContentPart[];\n\n // Resource should be present but without text/blob content\n expect(content).toMatchInlineSnapshot(`\n [\n {\n \"text\": \"Check \",\n \"type\": \"text\",\n },\n {\n \"resource\": {\n \"uri\": \"file:///missing.txt\",\n },\n \"type\": \"resource\",\n },\n ]\n `);\n\n consoleSpy.mockRestore();\n });\n\n it(\"should NOT resolve internal server resources (serverType: TAMBO_INTERNAL)\", async () => {\n // Add internal server to mock servers\n mockServers = [createMockInternalServer(\"tambo-abc123\")];\n\n const mockGetResource = jest.fn().mockResolvedValue({\n contents: [{ uri: \"tambo:test://resource/1\", text: \"Should not fetch\" }],\n });\n\n const mockListResources = jest.fn().mockResolvedValue([]);\n\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper({\n listResources: mockListResources,\n getResource: mockGetResource,\n }),\n });\n\n act(() => {\n result.current.setValue(\n \"Check @tambo-abc123:tambo:test://internal/resource/1\",\n );\n });\n\n await act(async () => {\n await result.current.submit();\n });\n\n // getResource should NOT be called for internal server resources\n expect(mockGetResource).not.toHaveBeenCalled();\n\n // Message should still be sent with resource (but without resolved content)\n expect(mockSendThreadMessage).toHaveBeenCalledTimes(1);\n const [, options] = mockSendThreadMessage.mock.calls[0];\n const content =\n options.content as TamboAI.Beta.Threads.ChatCompletionContentPart[];\n\n expect(content).toMatchInlineSnapshot(`\n [\n {\n \"text\": \"Check \",\n \"type\": \"text\",\n },\n {\n \"resource\": {\n \"uri\": \"tambo:test://internal/resource/1\",\n },\n \"type\": \"resource\",\n },\n ]\n `);\n });\n\n it(\"should handle mixed registry and internal server resources\", async () => {\n // Add internal server\n mockServers = [createMockInternalServer(\"tambo-xyz\")];\n\n const mockGetResource = jest.fn().mockResolvedValue({\n contents: [{ uri: \"file:///registry-doc.txt\", text: \"Registry content\" }],\n });\n\n const mockListResources = jest.fn().mockResolvedValue([]);\n\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper({\n listResources: mockListResources,\n getResource: mockGetResource,\n }),\n });\n\n act(() => {\n result.current.setValue(\n \"@registry:file:///registry-doc.txt and @tambo-xyz:tambo:test://internal\",\n );\n });\n\n await act(async () => {\n await result.current.submit();\n });\n\n // Only the registry resource should be fetched\n expect(mockGetResource).toHaveBeenCalledTimes(1);\n expect(mockGetResource).toHaveBeenCalledWith(\"file:///registry-doc.txt\");\n\n const [, options] = mockSendThreadMessage.mock.calls[0];\n const content =\n options.content as TamboAI.Beta.Threads.ChatCompletionContentPart[];\n\n expect(content).toMatchInlineSnapshot(`\n [\n {\n \"resource\": {\n \"text\": \"Registry content\",\n \"uri\": \"file:///registry-doc.txt\",\n },\n \"type\": \"resource\",\n },\n {\n \"text\": \" and \",\n \"type\": \"text\",\n },\n {\n \"resource\": {\n \"uri\": \"tambo:test://internal\",\n },\n \"type\": \"resource\",\n },\n ]\n `);\n });\n\n it(\"should include resource names when provided in submit options\", async () => {\n const mockGetResource = jest.fn().mockResolvedValue({\n contents: [\n {\n uri: \"file:///doc.txt\",\n text: \"Document content\",\n },\n ],\n });\n\n const mockListResources = jest.fn().mockResolvedValue([]);\n\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper({\n listResources: mockListResources,\n getResource: mockGetResource,\n }),\n });\n\n act(() => {\n result.current.setValue(\"Check @registry:file:///doc.txt\");\n });\n\n await act(async () => {\n await result.current.submit({\n resourceNames: {\n \"registry:file:///doc.txt\": \"Important Document.txt\",\n },\n });\n });\n\n const [, options] = mockSendThreadMessage.mock.calls[0];\n const content =\n options.content as TamboAI.Beta.Threads.ChatCompletionContentPart[];\n\n expect(content).toMatchInlineSnapshot(`\n [\n {\n \"text\": \"Check \",\n \"type\": \"text\",\n },\n {\n \"resource\": {\n \"name\": \"Important Document.txt\",\n \"text\": \"Document content\",\n \"uri\": \"file:///doc.txt\",\n },\n \"type\": \"resource\",\n },\n ]\n `);\n });\n\n it(\"should handle message without any resource references\", async () => {\n const mockGetResource = jest.fn();\n const mockListResources = jest.fn().mockResolvedValue([]);\n\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper({\n listResources: mockListResources,\n getResource: mockGetResource,\n }),\n });\n\n act(() => {\n result.current.setValue(\"Just a regular message without resources\");\n });\n\n await act(async () => {\n await result.current.submit();\n });\n\n // No resource fetch should happen\n expect(mockGetResource).not.toHaveBeenCalled();\n\n // Message should be sent as plain text\n const [, options] = mockSendThreadMessage.mock.calls[0];\n const content =\n options.content as TamboAI.Beta.Threads.ChatCompletionContentPart[];\n\n expect(content).toMatchInlineSnapshot(`\n [\n {\n \"text\": \"Just a regular message without resources\",\n \"type\": \"text\",\n },\n ]\n `);\n });\n\n it(\"should handle null returned from getResource\", async () => {\n const mockGetResource = jest.fn().mockResolvedValue(null);\n const mockListResources = jest.fn().mockResolvedValue([]);\n\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper({\n listResources: mockListResources,\n getResource: mockGetResource,\n }),\n });\n\n act(() => {\n result.current.setValue(\"Check @registry:file:///unknown.txt\");\n });\n\n await act(async () => {\n await result.current.submit();\n });\n\n expect(mockGetResource).toHaveBeenCalled();\n\n const [, options] = mockSendThreadMessage.mock.calls[0];\n const content =\n options.content as TamboAI.Beta.Threads.ChatCompletionContentPart[];\n\n // Resource should be present but without content\n expect(content).toMatchInlineSnapshot(`\n [\n {\n \"text\": \"Check \",\n \"type\": \"text\",\n },\n {\n \"resource\": {\n \"uri\": \"file:///unknown.txt\",\n },\n \"type\": \"resource\",\n },\n ]\n `);\n });\n\n it(\"should warn when no resourceSource is available for registry resource\", async () => {\n const consoleSpy = jest.spyOn(console, \"warn\").mockImplementation();\n\n // No listResources/getResource provided\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper(),\n });\n\n act(() => {\n result.current.setValue(\"Check @registry:file:///doc.txt\");\n });\n\n await act(async () => {\n await result.current.submit();\n });\n\n expect(consoleSpy).toHaveBeenCalledWith(\n \"No resource source available to resolve registry resource: registry:file:///doc.txt\",\n );\n\n consoleSpy.mockRestore();\n });\n\n it(\"should resolve static resources passed via resources prop\", async () => {\n // When using static resources, we need both listResources and getResource\n // to form the resourceSource, even though the resources are static\n const mockGetResource = jest.fn().mockResolvedValue({\n contents: [\n {\n uri: \"static://my-static-resource\",\n text: \"Static resource content\",\n mimeType: \"text/plain\",\n },\n ],\n });\n\n const { result } = renderHook(() => useTamboThreadInput(), {\n wrapper: createWrapper({\n resources: [\n {\n uri: \"static://my-static-resource\",\n name: \"My Static Resource\",\n mimeType: \"text/plain\",\n },\n ],\n // Need getResource to actually fetch the content\n getResource: mockGetResource,\n listResources: async () => [],\n }),\n });\n\n act(() => {\n result.current.setValue(\n \"Show me @registry:static://my-static-resource please\",\n );\n });\n\n await act(async () => {\n await result.current.submit();\n });\n\n // getResource should be called to fetch the content\n expect(mockGetResource).toHaveBeenCalledWith(\"static://my-static-resource\");\n\n const [, options] = mockSendThreadMessage.mock.calls[0];\n const content =\n options.content as TamboAI.Beta.Threads.ChatCompletionContentPart[];\n\n expect(content).toMatchInlineSnapshot(`\n [\n {\n \"text\": \"Show me \",\n \"type\": \"text\",\n },\n {\n \"resource\": {\n \"mimeType\": \"text/plain\",\n \"text\": \"Static resource content\",\n \"uri\": \"static://my-static-resource\",\n },\n \"type\": \"resource\",\n },\n {\n \"text\": \" please\",\n \"type\": \"text\",\n },\n ]\n `);\n });\n});\n"]}
|
|
@@ -37,6 +37,12 @@ export interface TamboClientContextProps {
|
|
|
37
37
|
isUpdatingToken: boolean;
|
|
38
38
|
/** Additional headers to include in all requests */
|
|
39
39
|
additionalHeaders?: Record<string, string>;
|
|
40
|
+
/** Error from token exchange, if any */
|
|
41
|
+
tokenExchangeError: Error | null;
|
|
42
|
+
/** The raw userToken value passed to the provider */
|
|
43
|
+
userToken: string | undefined;
|
|
44
|
+
/** Whether the token exchange succeeded */
|
|
45
|
+
hasValidToken: boolean;
|
|
40
46
|
}
|
|
41
47
|
export declare const TamboClientContext: React.Context<TamboClientContextProps | undefined>;
|
|
42
48
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tambo-client-provider.d.ts","sourceRoot":"","sources":["../../src/providers/tambo-client-provider.tsx"],"names":[],"mappings":"AACA,OAAO,OAA0B,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,EAAiB,iBAAiB,EAAW,MAAM,OAAO,CAAC;AAIzE,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,WAAW,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;IAEvC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,uBAAuB;IACtC,yBAAyB;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,sCAAsC;IACtC,WAAW,EAAE,WAAW,CAAC;IACzB,2DAA2D;IAC3D,eAAe,EAAE,OAAO,CAAC;IACzB,oDAAoD;IACpD,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"tambo-client-provider.d.ts","sourceRoot":"","sources":["../../src/providers/tambo-client-provider.tsx"],"names":[],"mappings":"AACA,OAAO,OAA0B,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,EAAiB,iBAAiB,EAAW,MAAM,OAAO,CAAC;AAIzE,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,WAAW,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;IAEvC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,uBAAuB;IACtC,yBAAyB;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,sCAAsC;IACtC,WAAW,EAAE,WAAW,CAAC;IACzB,2DAA2D;IAC3D,eAAe,EAAE,OAAO,CAAC;IACzB,oDAAoD;IACpD,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,wCAAwC;IACxC,kBAAkB,EAAE,KAAK,GAAG,IAAI,CAAC;IACjC,qDAAqD;IACrD,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,2CAA2C;IAC3C,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,eAAO,MAAM,kBAAkB,oDAEnB,CAAC;AAEb;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,EAAE,CACxC,iBAAiB,CAAC,wBAAwB,CAAC,CAgD5C,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,cAAc,eAM1B,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,mBAQ/B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,uBAAuB,eAQnC,CAAC"}
|
|
@@ -30,12 +30,15 @@ export const TamboClientProvider = ({ children, tamboUrl, apiKey, environment, u
|
|
|
30
30
|
const client = useMemo(() => new TamboAI(tamboConfig), [tamboConfig]);
|
|
31
31
|
const queryClient = useMemo(() => new QueryClient(), []);
|
|
32
32
|
// Keep the session token updated and get the updating state
|
|
33
|
-
const { isFetching: isUpdatingToken } = useTamboSessionToken(client, queryClient, userToken);
|
|
33
|
+
const { isFetching: isUpdatingToken, error: tokenExchangeError, data: tokenData, } = useTamboSessionToken(client, queryClient, userToken);
|
|
34
34
|
return (React.createElement(TamboClientContext.Provider, { value: {
|
|
35
35
|
client,
|
|
36
36
|
queryClient,
|
|
37
37
|
isUpdatingToken,
|
|
38
38
|
additionalHeaders: tamboConfig.defaultHeaders,
|
|
39
|
+
tokenExchangeError: tokenExchangeError ?? null,
|
|
40
|
+
userToken,
|
|
41
|
+
hasValidToken: !!tokenData?.access_token,
|
|
39
42
|
} }, children));
|
|
40
43
|
};
|
|
41
44
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tambo-client-provider.js","sourceRoot":"","sources":["../../src/providers/tambo-client-provider.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;AACb,OAAO,OAA0B,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,EAAE,aAAa,EAAqB,OAAO,EAAE,MAAM,OAAO,CAAC;AACzE,OAAO,WAAW,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"tambo-client-provider.js","sourceRoot":"","sources":["../../src/providers/tambo-client-provider.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\nimport TamboAI, { ClientOptions } from \"@tambo-ai/typescript-sdk\";\nimport { QueryClient } from \"@tanstack/react-query\";\nimport React, { createContext, PropsWithChildren, useMemo } from \"react\";\nimport packageJson from \"../../package.json\";\nimport { useTamboSessionToken } from \"./hooks/use-tambo-session-token\";\n\nexport interface TamboClientProviderProps {\n /**\n * The URL of the Tambo API (only used for local development and debugging)\n */\n tamboUrl?: string;\n /**\n * The API key for the Tambo API. This typically comes from a variable like\n * `process.env.NEXT_PUBLIC_TAMBO_API_KEY`\n */\n apiKey: string;\n /**\n * The environment to use for the Tambo API\n */\n environment?: \"production\" | \"staging\";\n\n /**\n * The user token to use to identify the user in the Tambo API. This token is\n * a 3rd party token like a Google or GitHub access token, exchanged with the\n * Tambo API to get a session token. This is used to securely identify the\n * user when calling the Tambo API.\n */\n userToken?: string;\n\n /**\n * Additional headers to include in all requests to the Tambo API.\n * These will be merged with the default headers.\n */\n additionalHeaders?: Record<string, string>;\n}\n\nexport interface TamboClientContextProps {\n /** The TamboAI client */\n client: TamboAI;\n /** The tambo-specific query client */\n queryClient: QueryClient;\n /** Whether the session token is currently being updated */\n isUpdatingToken: boolean;\n /** Additional headers to include in all requests */\n additionalHeaders?: Record<string, string>;\n /** Error from token exchange, if any */\n tokenExchangeError: Error | null;\n /** The raw userToken value passed to the provider */\n userToken: string | undefined;\n /** Whether the token exchange succeeded */\n hasValidToken: boolean;\n}\n\nexport const TamboClientContext = createContext<\n TamboClientContextProps | undefined\n>(undefined);\n\n/**\n * The TamboClientProvider is a React provider that provides a TamboAI client\n * and a query client to the descendants of the provider.\n * @param props - The props for the TamboClientProvider\n * @param props.children - The children to wrap\n * @param props.tamboUrl - The URL of the Tambo API\n * @param props.apiKey - The API key for the Tambo API\n * @param props.environment - The environment to use for the Tambo API\n * @param props.userToken - The oauth access token to use to identify the user in the Tambo API\n * @param props.additionalHeaders - Additional headers to include in all requests\n * @returns The TamboClientProvider component\n */\nexport const TamboClientProvider: React.FC<\n PropsWithChildren<TamboClientProviderProps>\n> = ({\n children,\n tamboUrl,\n apiKey,\n environment,\n userToken,\n additionalHeaders,\n}) => {\n const tamboConfig = useMemo(\n () =>\n ({\n apiKey,\n defaultHeaders: {\n \"X-Tambo-React-Version\": packageJson.version,\n ...additionalHeaders,\n },\n baseURL: tamboUrl ?? undefined,\n environment: environment ?? undefined,\n }) satisfies ClientOptions,\n [additionalHeaders, apiKey, tamboUrl, environment],\n );\n\n const client = useMemo(() => new TamboAI(tamboConfig), [tamboConfig]);\n const queryClient = useMemo(() => new QueryClient(), []);\n\n // Keep the session token updated and get the updating state\n const {\n isFetching: isUpdatingToken,\n error: tokenExchangeError,\n data: tokenData,\n } = useTamboSessionToken(client, queryClient, userToken);\n\n return (\n <TamboClientContext.Provider\n value={{\n client,\n queryClient,\n isUpdatingToken,\n additionalHeaders: tamboConfig.defaultHeaders,\n tokenExchangeError: tokenExchangeError ?? null,\n userToken,\n hasValidToken: !!tokenData?.access_token,\n }}\n >\n {children}\n </TamboClientContext.Provider>\n );\n};\n\n/**\n * The useTamboClient hook provides access to the TamboAI client\n * to the descendants of the TamboClientProvider.\n * @returns The TamboAI client\n */\nexport const useTamboClient = () => {\n const context = React.useContext(TamboClientContext);\n if (context === undefined) {\n throw new Error(\"useTamboClient must be used within a TamboClientProvider\");\n }\n return context.client;\n};\n\n/**\n * The useTamboQueryClient hook provides access to the tambo-specific query client\n * to the descendants of the TamboClientProvider.\n * @returns The tambo-specific query client\n * @private\n */\nexport const useTamboQueryClient = () => {\n const context = React.useContext(TamboClientContext);\n if (context === undefined) {\n throw new Error(\n \"useTamboQueryClient must be used within a TamboClientProvider\",\n );\n }\n return context.queryClient;\n};\n\n/**\n * Hook to check if the session token is currently being updated\n * @returns true if the token is being refreshed, false otherwise\n */\nexport const useIsTamboTokenUpdating = () => {\n const context = React.useContext(TamboClientContext);\n if (context === undefined) {\n throw new Error(\n \"useIsTamboTokenUpdating must be used within a TamboClientProvider\",\n );\n }\n return context.isUpdatingToken;\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tambo-interactable-provider.d.ts","sourceRoot":"","sources":["../../src/providers/tambo-interactable-provider.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,EAEZ,iBAAiB,EAMlB,MAAM,OAAO,CAAC;AAGf,OAAO,EAEL,KAAK,wBAAwB,EAC9B,MAAM,6BAA6B,CAAC;AAMrC,QAAA,MAAM,wBAAwB,yCAY5B,CAAC;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,yBAAyB,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,
|
|
1
|
+
{"version":3,"file":"tambo-interactable-provider.d.ts","sourceRoot":"","sources":["../../src/providers/tambo-interactable-provider.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,EAEZ,iBAAiB,EAMlB,MAAM,OAAO,CAAC;AAGf,OAAO,EAEL,KAAK,wBAAwB,EAC9B,MAAM,6BAA6B,CAAC;AAMrC,QAAA,MAAM,wBAAwB,yCAY5B,CAAC;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,yBAAyB,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CA8cjE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,gCAEhC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;GAS3C,CAAC"}
|
|
@@ -234,6 +234,10 @@ export const TamboInteractableProvider = ({ children, }) => {
|
|
|
234
234
|
},
|
|
235
235
|
inputSchema,
|
|
236
236
|
outputSchema: z.string(),
|
|
237
|
+
annotations: {
|
|
238
|
+
tamboStreamableHint: true,
|
|
239
|
+
...component.annotations,
|
|
240
|
+
},
|
|
237
241
|
});
|
|
238
242
|
}, [registerTool, updateInteractableComponentProps]);
|
|
239
243
|
const registerInteractableComponentStateUpdateTool = useCallback((component, maxNameLength = 60) => {
|
|
@@ -275,6 +279,10 @@ export const TamboInteractableProvider = ({ children, }) => {
|
|
|
275
279
|
},
|
|
276
280
|
inputSchema,
|
|
277
281
|
outputSchema: z.string(),
|
|
282
|
+
annotations: {
|
|
283
|
+
tamboStreamableHint: true,
|
|
284
|
+
...component.annotations,
|
|
285
|
+
},
|
|
278
286
|
});
|
|
279
287
|
}, [registerTool, updateInteractableComponentState]);
|
|
280
288
|
const addInteractableComponent = useCallback((component) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tambo-interactable-provider.js","sourceRoot":"","sources":["../../src/providers/tambo-interactable-provider.tsx"],"names":[],"mappings":"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","sourcesContent":["// react-sdk/src/providers/tambo-interactable-provider.tsx\n\"use client\";\nimport { deepEqual } from \"fast-equals\";\nimport { JSONSchema7 } from \"json-schema\";\nimport React, {\n createContext,\n PropsWithChildren,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { z } from \"zod/v3\";\nimport { createInteractablesContextHelper } from \"../context-helpers/current-interactables-context-helper\";\nimport {\n TamboInteractableComponent,\n type TamboInteractableContext,\n} from \"../model/tambo-interactable\";\nimport { makeJsonSchemaPartial, schemaToJsonSchema } from \"../schema\";\nimport { assertValidName } from \"../util/validate-component-name\";\nimport { useTamboRegistry } from \"./tambo-registry-provider\";\nimport { useTamboContextHelpers } from \"./tambo-context-helpers-provider\";\n\nconst TamboInteractableContext = createContext<TamboInteractableContext>({\n interactableComponents: [],\n addInteractableComponent: () => \"\",\n removeInteractableComponent: () => {},\n updateInteractableComponentProps: () => \"\",\n getInteractableComponent: () => undefined,\n getInteractableComponentsByName: () => [],\n clearAllInteractableComponents: () => {},\n setInteractableState: () => {},\n getInteractableComponentState: () => undefined,\n setInteractableSelected: () => {},\n clearInteractableSelections: () => {},\n});\n\n/**\n * The TamboInteractableProvider manages a list of components that are currently\n * interactable, allowing tambo to interact with them by updating their props. It also registers tools\n * for Tambo to perform CRUD operations on the components list.\n * @param props - The props for the TamboInteractableProvider\n * @param props.children - The children to wrap\n * @returns The TamboInteractableProvider component\n */\nexport const TamboInteractableProvider: React.FC<PropsWithChildren> = ({\n children,\n}) => {\n const [interactableComponents, setInteractableComponents] = useState<\n TamboInteractableComponent[]\n >([]);\n const { registerTool } = useTamboRegistry();\n const { addContextHelper, removeContextHelper } = useTamboContextHelpers();\n\n // Create a stable context helper function for interactable components\n const interactablesContextHelper = useMemo(\n () => createInteractablesContextHelper(interactableComponents),\n [interactableComponents],\n );\n\n // Register the interactables context helper\n useEffect(() => {\n addContextHelper(\"interactables\", interactablesContextHelper);\n\n return () => {\n removeContextHelper(\"interactables\");\n };\n }, [interactablesContextHelper, addContextHelper, removeContextHelper]);\n\n useEffect(() => {\n if (interactableComponents.length > 0) {\n registerTool({\n name: \"get_all_interactable_components\",\n description:\n \"Only use this tool if the user is asking about interactable components.Get all currently interactable components with their details including their current props. These are components that you can interact with on behalf of the user.\",\n tool: () => {\n return {\n components: interactableComponents,\n };\n },\n inputSchema: z.object({}),\n outputSchema: z.object({\n components: z.array(\n z.object({\n id: z.string(),\n name: z.string(),\n props: z.record(z.string(), z.any()),\n propsSchema: z.record(z.string(), z.any()).optional(),\n }),\n ),\n }),\n });\n\n registerTool({\n name: \"get_interactable_component_by_id\",\n description: \"Get a specific interactable component by its ID\",\n tool: ({ componentId }) => {\n const component = interactableComponents.find(\n (c) => c.id === componentId,\n );\n\n if (!component) {\n return {\n success: false,\n error: `Component with ID ${componentId} not found`,\n } as const;\n }\n\n return {\n success: true,\n component: {\n id: component.id,\n componentName: component.name,\n props: component.props,\n },\n } as const;\n },\n inputSchema: z.object({\n componentId: z.string().describe(\"The ID of the component\"),\n }),\n outputSchema: z.discriminatedUnion(\"success\", [\n z.object({\n success: z.literal(true),\n component: z\n .object({\n id: z.string(),\n componentName: z.string(),\n props: z.record(z.string(), z.any()),\n })\n .optional(),\n }),\n z.object({\n success: z.literal(false),\n error: z.string(),\n }),\n ]),\n });\n\n registerTool({\n name: \"remove_interactable_component\",\n description: \"Remove an interactable component from the system\",\n tool: ({ componentId }) => {\n const component = interactableComponents.find(\n (c) => c.id === componentId,\n );\n\n if (!component) {\n return {\n success: false,\n error: `Component with ID ${componentId} not found`,\n } as const;\n }\n\n setInteractableComponents((prev) =>\n prev.filter((c) => c.id !== componentId),\n );\n\n return {\n success: true,\n componentId,\n removedComponent: {\n id: component.id,\n componentName: component.name,\n props: component.props,\n },\n } as const;\n },\n inputSchema: z.object({\n componentId: z.string().describe(\"The ID of the component\"),\n }),\n outputSchema: z.discriminatedUnion(\"success\", [\n z.object({\n success: z.literal(true),\n componentId: z.string(),\n removedComponent: z.object({\n id: z.string(),\n componentName: z.string(),\n props: z.record(z.string(), z.any()),\n }),\n }),\n z.object({\n success: z.literal(false),\n error: z.string(),\n }),\n ]),\n });\n }\n }, [interactableComponents, registerTool]);\n\n const updateInteractableComponentProps = useCallback(\n (id: string, newProps: Record<string, any>): string => {\n if (!newProps || Object.keys(newProps).length === 0) {\n return `Warning: No props provided for component with ID ${id}.`;\n }\n\n setInteractableComponents((prev) => {\n const component = prev.find((c) => c.id === id);\n if (!component) {\n return prev;\n }\n\n // Compare props shallowly\n const propsChanged = Object.entries(newProps).some(([key, value]) => {\n return component.props[key] !== value;\n });\n\n if (!propsChanged) {\n return prev; // unchanged\n }\n\n // Apply partial update\n const updated = {\n ...component,\n props: { ...component.props, ...newProps },\n };\n\n const updatedComponents = [...prev];\n const idx = prev.findIndex((c) => c.id === id);\n updatedComponents[idx] = updated;\n\n return updatedComponents;\n });\n\n return \"Updated successfully\";\n },\n [],\n );\n\n const updateInteractableComponentState = useCallback(\n (componentId: string, newState: Record<string, unknown>): string => {\n if (!newState || Object.keys(newState).length === 0) {\n return `Warning: No state values provided for component with ID ${componentId}.`;\n }\n\n setInteractableComponents((components = []) => {\n const component = components.find((c) => c.id === componentId);\n if (!component) return components;\n\n const prevState = component.state ?? {};\n const updatedState = { ...prevState, ...newState };\n if (deepEqual(prevState, updatedState)) return components;\n\n // TODO(lachieh): validate state against schema?\n\n const updated = {\n ...component,\n state: updatedState,\n };\n\n return components.map((c) => (c.id === componentId ? updated : c));\n });\n\n return \"Updated successfully\";\n },\n [],\n );\n\n const registerInteractableComponentPropsUpdateTool = useCallback(\n (component: TamboInteractableComponent, maxNameLength = 60) => {\n const tamboToolNamePart = `update_component_props_`;\n const availableLength = maxNameLength - tamboToolNamePart.length;\n if (component.id.length > availableLength) {\n throw new Error(\n `Interactable component id ${component.id} is too long. It must be less than ${availableLength} characters.`,\n );\n }\n\n // Build newProps schema as JSON Schema\n let newPropsSchema: JSONSchema7;\n if (component.propsSchema) {\n // Convert any supported schema to JSON Schema, then make partial\n const fullSchema = schemaToJsonSchema(component.propsSchema);\n newPropsSchema = makeJsonSchemaPartial(fullSchema);\n } else {\n // No schema - allow any properties\n newPropsSchema = { type: \"object\", additionalProperties: true };\n }\n\n // Build the full input schema as JSON Schema\n const inputSchema: JSONSchema7 = {\n type: \"object\",\n properties: {\n componentId: {\n type: \"string\",\n description: \"The ID of the interactable component to update\",\n },\n newProps: {\n ...newPropsSchema,\n description:\n \"The props to update. Provide only the props you want to change.\",\n },\n },\n required: [\"componentId\", \"newProps\"],\n };\n\n registerTool({\n name: `${tamboToolNamePart}${component.id}`,\n description: `Update the props of interactable component ${component.id} (${component.name}). Provide partial props (only props to change).`,\n tool: ({ componentId, newProps }) => {\n return updateInteractableComponentProps(componentId, newProps);\n },\n inputSchema,\n outputSchema: z.string(),\n });\n },\n [registerTool, updateInteractableComponentProps],\n );\n\n const registerInteractableComponentStateUpdateTool = useCallback(\n (component: TamboInteractableComponent, maxNameLength = 60) => {\n const tamboToolNamePart = `update_component_state_`;\n const availableLength = maxNameLength - tamboToolNamePart.length;\n if (component.id.length > availableLength) {\n throw new Error(\n `Interactable component id ${component.id} is too long. It must be less than ${availableLength} characters.`,\n );\n }\n\n // Build newState schema as JSON Schema\n let newStateSchema: JSONSchema7 = {\n type: \"object\",\n additionalProperties: true,\n };\n if (component.stateSchema) {\n // Convert any supported schema to JSON Schema, then make partial\n const fullSchema = schemaToJsonSchema(component.stateSchema);\n newStateSchema = makeJsonSchemaPartial(fullSchema);\n }\n\n // Build the full input schema as JSON Schema\n const inputSchema: JSONSchema7 = {\n type: \"object\",\n properties: {\n componentId: {\n type: \"string\",\n description: \"The ID of the interactable component to update\",\n },\n newState: {\n ...newStateSchema,\n description:\n \"The state values to update. Provide only the keys you want to change.\",\n },\n },\n required: [\"componentId\", \"newState\"],\n };\n\n registerTool({\n name: `${tamboToolNamePart}${component.id}`,\n description: `Update the state of interactable component ${component.id} (${component.name}). You may provide partial state (only keys to change).`,\n tool: ({ componentId, newState }) => {\n return updateInteractableComponentState(componentId, newState);\n },\n inputSchema,\n outputSchema: z.string(),\n });\n },\n [registerTool, updateInteractableComponentState],\n );\n\n const addInteractableComponent = useCallback(\n (\n component: Omit<TamboInteractableComponent, \"id\" | \"createdAt\">,\n ): string => {\n // Validate component name\n assertValidName(component.name, \"component\");\n\n // Add a random part to the component name to make it unique when using multiple instances of the same component.\n const tamboGeneratedNamePart = `-${Math.random().toString(36).slice(2, 5)}`;\n const id = `${component.name}${tamboGeneratedNamePart}`;\n const newComponent: TamboInteractableComponent = {\n ...component,\n id,\n state: component.state ?? {},\n };\n\n registerInteractableComponentPropsUpdateTool(newComponent);\n registerInteractableComponentStateUpdateTool(newComponent);\n\n setInteractableComponents((prev) => {\n return [...prev, newComponent];\n });\n\n return id;\n },\n [\n registerInteractableComponentPropsUpdateTool,\n registerInteractableComponentStateUpdateTool,\n ],\n );\n\n const removeInteractableComponent = useCallback((id: string) => {\n setInteractableComponents((prev) => prev.filter((c) => c.id !== id));\n }, []);\n\n const getInteractableComponent = useCallback(\n <P, S>(id: string): TamboInteractableComponent<P, S> | undefined => {\n return interactableComponents.find((c) => c.id === id) as\n | TamboInteractableComponent<P, S>\n | undefined;\n },\n [interactableComponents],\n );\n\n const getInteractableComponentsByName = useCallback(\n (componentName: string) => {\n return interactableComponents.filter((c) => c.name === componentName);\n },\n [interactableComponents],\n );\n\n const clearAllInteractableComponents = useCallback(() => {\n setInteractableComponents([]);\n }, []);\n\n const setInteractableStateValue = useCallback(\n (componentId: string, key: string, value: unknown) => {\n setInteractableComponents((prev) => {\n const component = prev.find((c) => c.id === componentId);\n if (!component) {\n console.warn(\n `Tried to update state for component ${componentId} but it was not found.`,\n );\n return prev;\n }\n\n const updated = {\n ...component,\n state: {\n ...component.state,\n [key]: value,\n },\n };\n\n const updatedComponents = prev.map((component) => {\n if (component.id === componentId) {\n return updated;\n }\n return component;\n });\n\n return updatedComponents;\n });\n },\n [],\n );\n\n const getInteractableComponentState = useCallback(\n (componentId: string) => {\n const component = interactableComponents.find(\n (c) => c.id === componentId,\n );\n return component?.state;\n },\n [interactableComponents],\n );\n\n const setInteractableSelected = useCallback(\n (componentId: string, isSelected: boolean) => {\n setInteractableComponents((prev) => {\n let found = false;\n const next = prev.map((component) => {\n if (component.id !== componentId) return component;\n found = true;\n return component.isSelected === isSelected\n ? component\n : { ...component, isSelected: isSelected };\n });\n return found ? next : prev;\n });\n },\n [],\n );\n\n const clearInteractableSelections = useCallback(() => {\n setInteractableComponents((prev) => {\n if (!prev.some((c) => c.isSelected)) return prev;\n return prev.map((c) => (c.isSelected ? { ...c, isSelected: false } : c));\n });\n }, []);\n\n const value: TamboInteractableContext = {\n interactableComponents,\n addInteractableComponent,\n removeInteractableComponent,\n updateInteractableComponentProps,\n getInteractableComponent,\n getInteractableComponentsByName,\n clearAllInteractableComponents,\n setInteractableState: setInteractableStateValue,\n getInteractableComponentState,\n setInteractableSelected,\n clearInteractableSelections,\n };\n\n return (\n <TamboInteractableContext.Provider value={value}>\n {children}\n </TamboInteractableContext.Provider>\n );\n};\n\n/**\n * The useTamboInteractable hook provides access to the interactable component\n * management functions.\n * @returns The interactable component management functions\n */\nexport const useTamboInteractable = () => {\n return useContext(TamboInteractableContext);\n};\n\n/**\n * Hook to get a cloned snapshot of the current interactables.\n * Returns a shallow copy of the array with cloned items and props to prevent\n * external mutation from affecting internal state.\n * @returns The current interactables snapshot (cloned).\n */\nexport const useCurrentInteractablesSnapshot = () => {\n const { interactableComponents } = useTamboInteractable();\n // Clone the array and each item/props to prevent mutation\n const copy = interactableComponents.map((c) => ({\n ...c,\n props: { ...c.props },\n }));\n\n return copy;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"tambo-interactable-provider.js","sourceRoot":"","sources":["../../src/providers/tambo-interactable-provider.tsx"],"names":[],"mappings":"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","sourcesContent":["// react-sdk/src/providers/tambo-interactable-provider.tsx\n\"use client\";\nimport { deepEqual } from \"fast-equals\";\nimport { JSONSchema7 } from \"json-schema\";\nimport React, {\n createContext,\n PropsWithChildren,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { z } from \"zod/v3\";\nimport { createInteractablesContextHelper } from \"../context-helpers/current-interactables-context-helper\";\nimport {\n TamboInteractableComponent,\n type TamboInteractableContext,\n} from \"../model/tambo-interactable\";\nimport { makeJsonSchemaPartial, schemaToJsonSchema } from \"../schema\";\nimport { assertValidName } from \"../util/validate-component-name\";\nimport { useTamboRegistry } from \"./tambo-registry-provider\";\nimport { useTamboContextHelpers } from \"./tambo-context-helpers-provider\";\n\nconst TamboInteractableContext = createContext<TamboInteractableContext>({\n interactableComponents: [],\n addInteractableComponent: () => \"\",\n removeInteractableComponent: () => {},\n updateInteractableComponentProps: () => \"\",\n getInteractableComponent: () => undefined,\n getInteractableComponentsByName: () => [],\n clearAllInteractableComponents: () => {},\n setInteractableState: () => {},\n getInteractableComponentState: () => undefined,\n setInteractableSelected: () => {},\n clearInteractableSelections: () => {},\n});\n\n/**\n * The TamboInteractableProvider manages a list of components that are currently\n * interactable, allowing tambo to interact with them by updating their props. It also registers tools\n * for Tambo to perform CRUD operations on the components list.\n * @param props - The props for the TamboInteractableProvider\n * @param props.children - The children to wrap\n * @returns The TamboInteractableProvider component\n */\nexport const TamboInteractableProvider: React.FC<PropsWithChildren> = ({\n children,\n}) => {\n const [interactableComponents, setInteractableComponents] = useState<\n TamboInteractableComponent[]\n >([]);\n const { registerTool } = useTamboRegistry();\n const { addContextHelper, removeContextHelper } = useTamboContextHelpers();\n\n // Create a stable context helper function for interactable components\n const interactablesContextHelper = useMemo(\n () => createInteractablesContextHelper(interactableComponents),\n [interactableComponents],\n );\n\n // Register the interactables context helper\n useEffect(() => {\n addContextHelper(\"interactables\", interactablesContextHelper);\n\n return () => {\n removeContextHelper(\"interactables\");\n };\n }, [interactablesContextHelper, addContextHelper, removeContextHelper]);\n\n useEffect(() => {\n if (interactableComponents.length > 0) {\n registerTool({\n name: \"get_all_interactable_components\",\n description:\n \"Only use this tool if the user is asking about interactable components.Get all currently interactable components with their details including their current props. These are components that you can interact with on behalf of the user.\",\n tool: () => {\n return {\n components: interactableComponents,\n };\n },\n inputSchema: z.object({}),\n outputSchema: z.object({\n components: z.array(\n z.object({\n id: z.string(),\n name: z.string(),\n props: z.record(z.string(), z.any()),\n propsSchema: z.record(z.string(), z.any()).optional(),\n }),\n ),\n }),\n });\n\n registerTool({\n name: \"get_interactable_component_by_id\",\n description: \"Get a specific interactable component by its ID\",\n tool: ({ componentId }) => {\n const component = interactableComponents.find(\n (c) => c.id === componentId,\n );\n\n if (!component) {\n return {\n success: false,\n error: `Component with ID ${componentId} not found`,\n } as const;\n }\n\n return {\n success: true,\n component: {\n id: component.id,\n componentName: component.name,\n props: component.props,\n },\n } as const;\n },\n inputSchema: z.object({\n componentId: z.string().describe(\"The ID of the component\"),\n }),\n outputSchema: z.discriminatedUnion(\"success\", [\n z.object({\n success: z.literal(true),\n component: z\n .object({\n id: z.string(),\n componentName: z.string(),\n props: z.record(z.string(), z.any()),\n })\n .optional(),\n }),\n z.object({\n success: z.literal(false),\n error: z.string(),\n }),\n ]),\n });\n\n registerTool({\n name: \"remove_interactable_component\",\n description: \"Remove an interactable component from the system\",\n tool: ({ componentId }) => {\n const component = interactableComponents.find(\n (c) => c.id === componentId,\n );\n\n if (!component) {\n return {\n success: false,\n error: `Component with ID ${componentId} not found`,\n } as const;\n }\n\n setInteractableComponents((prev) =>\n prev.filter((c) => c.id !== componentId),\n );\n\n return {\n success: true,\n componentId,\n removedComponent: {\n id: component.id,\n componentName: component.name,\n props: component.props,\n },\n } as const;\n },\n inputSchema: z.object({\n componentId: z.string().describe(\"The ID of the component\"),\n }),\n outputSchema: z.discriminatedUnion(\"success\", [\n z.object({\n success: z.literal(true),\n componentId: z.string(),\n removedComponent: z.object({\n id: z.string(),\n componentName: z.string(),\n props: z.record(z.string(), z.any()),\n }),\n }),\n z.object({\n success: z.literal(false),\n error: z.string(),\n }),\n ]),\n });\n }\n }, [interactableComponents, registerTool]);\n\n const updateInteractableComponentProps = useCallback(\n (id: string, newProps: Record<string, any>): string => {\n if (!newProps || Object.keys(newProps).length === 0) {\n return `Warning: No props provided for component with ID ${id}.`;\n }\n\n setInteractableComponents((prev) => {\n const component = prev.find((c) => c.id === id);\n if (!component) {\n return prev;\n }\n\n // Compare props shallowly\n const propsChanged = Object.entries(newProps).some(([key, value]) => {\n return component.props[key] !== value;\n });\n\n if (!propsChanged) {\n return prev; // unchanged\n }\n\n // Apply partial update\n const updated = {\n ...component,\n props: { ...component.props, ...newProps },\n };\n\n const updatedComponents = [...prev];\n const idx = prev.findIndex((c) => c.id === id);\n updatedComponents[idx] = updated;\n\n return updatedComponents;\n });\n\n return \"Updated successfully\";\n },\n [],\n );\n\n const updateInteractableComponentState = useCallback(\n (componentId: string, newState: Record<string, unknown>): string => {\n if (!newState || Object.keys(newState).length === 0) {\n return `Warning: No state values provided for component with ID ${componentId}.`;\n }\n\n setInteractableComponents((components = []) => {\n const component = components.find((c) => c.id === componentId);\n if (!component) return components;\n\n const prevState = component.state ?? {};\n const updatedState = { ...prevState, ...newState };\n if (deepEqual(prevState, updatedState)) return components;\n\n // TODO(lachieh): validate state against schema?\n\n const updated = {\n ...component,\n state: updatedState,\n };\n\n return components.map((c) => (c.id === componentId ? updated : c));\n });\n\n return \"Updated successfully\";\n },\n [],\n );\n\n const registerInteractableComponentPropsUpdateTool = useCallback(\n (component: TamboInteractableComponent, maxNameLength = 60) => {\n const tamboToolNamePart = `update_component_props_`;\n const availableLength = maxNameLength - tamboToolNamePart.length;\n if (component.id.length > availableLength) {\n throw new Error(\n `Interactable component id ${component.id} is too long. It must be less than ${availableLength} characters.`,\n );\n }\n\n // Build newProps schema as JSON Schema\n let newPropsSchema: JSONSchema7;\n if (component.propsSchema) {\n // Convert any supported schema to JSON Schema, then make partial\n const fullSchema = schemaToJsonSchema(component.propsSchema);\n newPropsSchema = makeJsonSchemaPartial(fullSchema);\n } else {\n // No schema - allow any properties\n newPropsSchema = { type: \"object\", additionalProperties: true };\n }\n\n // Build the full input schema as JSON Schema\n const inputSchema: JSONSchema7 = {\n type: \"object\",\n properties: {\n componentId: {\n type: \"string\",\n description: \"The ID of the interactable component to update\",\n },\n newProps: {\n ...newPropsSchema,\n description:\n \"The props to update. Provide only the props you want to change.\",\n },\n },\n required: [\"componentId\", \"newProps\"],\n };\n\n registerTool({\n name: `${tamboToolNamePart}${component.id}`,\n description: `Update the props of interactable component ${component.id} (${component.name}). Provide partial props (only props to change).`,\n tool: ({ componentId, newProps }) => {\n return updateInteractableComponentProps(componentId, newProps);\n },\n inputSchema,\n outputSchema: z.string(),\n annotations: {\n tamboStreamableHint: true,\n ...component.annotations,\n },\n });\n },\n [registerTool, updateInteractableComponentProps],\n );\n\n const registerInteractableComponentStateUpdateTool = useCallback(\n (component: TamboInteractableComponent, maxNameLength = 60) => {\n const tamboToolNamePart = `update_component_state_`;\n const availableLength = maxNameLength - tamboToolNamePart.length;\n if (component.id.length > availableLength) {\n throw new Error(\n `Interactable component id ${component.id} is too long. It must be less than ${availableLength} characters.`,\n );\n }\n\n // Build newState schema as JSON Schema\n let newStateSchema: JSONSchema7 = {\n type: \"object\",\n additionalProperties: true,\n };\n if (component.stateSchema) {\n // Convert any supported schema to JSON Schema, then make partial\n const fullSchema = schemaToJsonSchema(component.stateSchema);\n newStateSchema = makeJsonSchemaPartial(fullSchema);\n }\n\n // Build the full input schema as JSON Schema\n const inputSchema: JSONSchema7 = {\n type: \"object\",\n properties: {\n componentId: {\n type: \"string\",\n description: \"The ID of the interactable component to update\",\n },\n newState: {\n ...newStateSchema,\n description:\n \"The state values to update. Provide only the keys you want to change.\",\n },\n },\n required: [\"componentId\", \"newState\"],\n };\n\n registerTool({\n name: `${tamboToolNamePart}${component.id}`,\n description: `Update the state of interactable component ${component.id} (${component.name}). You may provide partial state (only keys to change).`,\n tool: ({ componentId, newState }) => {\n return updateInteractableComponentState(componentId, newState);\n },\n inputSchema,\n outputSchema: z.string(),\n annotations: {\n tamboStreamableHint: true,\n ...component.annotations,\n },\n });\n },\n [registerTool, updateInteractableComponentState],\n );\n\n const addInteractableComponent = useCallback(\n (\n component: Omit<TamboInteractableComponent, \"id\" | \"createdAt\">,\n ): string => {\n // Validate component name\n assertValidName(component.name, \"component\");\n\n // Add a random part to the component name to make it unique when using multiple instances of the same component.\n const tamboGeneratedNamePart = `-${Math.random().toString(36).slice(2, 5)}`;\n const id = `${component.name}${tamboGeneratedNamePart}`;\n const newComponent: TamboInteractableComponent = {\n ...component,\n id,\n state: component.state ?? {},\n };\n\n registerInteractableComponentPropsUpdateTool(newComponent);\n registerInteractableComponentStateUpdateTool(newComponent);\n\n setInteractableComponents((prev) => {\n return [...prev, newComponent];\n });\n\n return id;\n },\n [\n registerInteractableComponentPropsUpdateTool,\n registerInteractableComponentStateUpdateTool,\n ],\n );\n\n const removeInteractableComponent = useCallback((id: string) => {\n setInteractableComponents((prev) => prev.filter((c) => c.id !== id));\n }, []);\n\n const getInteractableComponent = useCallback(\n <P, S>(id: string): TamboInteractableComponent<P, S> | undefined => {\n return interactableComponents.find((c) => c.id === id) as\n | TamboInteractableComponent<P, S>\n | undefined;\n },\n [interactableComponents],\n );\n\n const getInteractableComponentsByName = useCallback(\n (componentName: string) => {\n return interactableComponents.filter((c) => c.name === componentName);\n },\n [interactableComponents],\n );\n\n const clearAllInteractableComponents = useCallback(() => {\n setInteractableComponents([]);\n }, []);\n\n const setInteractableStateValue = useCallback(\n (componentId: string, key: string, value: unknown) => {\n setInteractableComponents((prev) => {\n const component = prev.find((c) => c.id === componentId);\n if (!component) {\n console.warn(\n `Tried to update state for component ${componentId} but it was not found.`,\n );\n return prev;\n }\n\n const updated = {\n ...component,\n state: {\n ...component.state,\n [key]: value,\n },\n };\n\n const updatedComponents = prev.map((component) => {\n if (component.id === componentId) {\n return updated;\n }\n return component;\n });\n\n return updatedComponents;\n });\n },\n [],\n );\n\n const getInteractableComponentState = useCallback(\n (componentId: string) => {\n const component = interactableComponents.find(\n (c) => c.id === componentId,\n );\n return component?.state;\n },\n [interactableComponents],\n );\n\n const setInteractableSelected = useCallback(\n (componentId: string, isSelected: boolean) => {\n setInteractableComponents((prev) => {\n let found = false;\n const next = prev.map((component) => {\n if (component.id !== componentId) return component;\n found = true;\n return component.isSelected === isSelected\n ? component\n : { ...component, isSelected: isSelected };\n });\n return found ? next : prev;\n });\n },\n [],\n );\n\n const clearInteractableSelections = useCallback(() => {\n setInteractableComponents((prev) => {\n if (!prev.some((c) => c.isSelected)) return prev;\n return prev.map((c) => (c.isSelected ? { ...c, isSelected: false } : c));\n });\n }, []);\n\n const value: TamboInteractableContext = {\n interactableComponents,\n addInteractableComponent,\n removeInteractableComponent,\n updateInteractableComponentProps,\n getInteractableComponent,\n getInteractableComponentsByName,\n clearAllInteractableComponents,\n setInteractableState: setInteractableStateValue,\n getInteractableComponentState,\n setInteractableSelected,\n clearInteractableSelections,\n };\n\n return (\n <TamboInteractableContext.Provider value={value}>\n {children}\n </TamboInteractableContext.Provider>\n );\n};\n\n/**\n * The useTamboInteractable hook provides access to the interactable component\n * management functions.\n * @returns The interactable component management functions\n */\nexport const useTamboInteractable = () => {\n return useContext(TamboInteractableContext);\n};\n\n/**\n * Hook to get a cloned snapshot of the current interactables.\n * Returns a shallow copy of the array with cloned items and props to prevent\n * external mutation from affecting internal state.\n * @returns The current interactables snapshot (cloned).\n */\nexport const useCurrentInteractablesSnapshot = () => {\n const { interactableComponents } = useTamboInteractable();\n // Clone the array and each item/props to prevent mutation\n const copy = interactableComponents.map((c) => ({\n ...c,\n props: { ...c.props },\n }));\n\n return copy;\n};\n"]}
|
|
@@ -275,6 +275,53 @@ describe("TamboInteractableProvider - State Update Tool Registration", () => {
|
|
|
275
275
|
// But it should have the properties from the schema
|
|
276
276
|
expect(inputSchema.properties.newProps.properties).toBeDefined();
|
|
277
277
|
});
|
|
278
|
+
it("should register props update tool with tamboStreamableHint true by default", () => {
|
|
279
|
+
const { result } = renderHook(() => useTamboInteractable(), { wrapper });
|
|
280
|
+
const component = {
|
|
281
|
+
name: "TestComponent",
|
|
282
|
+
description: "A test component",
|
|
283
|
+
component: () => React.createElement("div", null, "Test"),
|
|
284
|
+
props: { title: "test" },
|
|
285
|
+
};
|
|
286
|
+
act(() => {
|
|
287
|
+
result.current.addInteractableComponent(component);
|
|
288
|
+
});
|
|
289
|
+
const propsToolCall = mockRegisterTool.mock.calls.find((call) => call[0].name.startsWith("update_component_props_"));
|
|
290
|
+
expect(propsToolCall).toBeDefined();
|
|
291
|
+
expect(propsToolCall[0].annotations).toEqual(expect.objectContaining({ tamboStreamableHint: true }));
|
|
292
|
+
});
|
|
293
|
+
it("should register state update tool with tamboStreamableHint true by default", () => {
|
|
294
|
+
const { result } = renderHook(() => useTamboInteractable(), { wrapper });
|
|
295
|
+
const component = {
|
|
296
|
+
name: "TestComponent",
|
|
297
|
+
description: "A test component",
|
|
298
|
+
component: () => React.createElement("div", null, "Test"),
|
|
299
|
+
props: {},
|
|
300
|
+
};
|
|
301
|
+
act(() => {
|
|
302
|
+
result.current.addInteractableComponent(component);
|
|
303
|
+
});
|
|
304
|
+
const stateToolCall = mockRegisterTool.mock.calls.find((call) => call[0].name.startsWith("update_component_state_"));
|
|
305
|
+
expect(stateToolCall).toBeDefined();
|
|
306
|
+
expect(stateToolCall[0].annotations).toEqual(expect.objectContaining({ tamboStreamableHint: true }));
|
|
307
|
+
});
|
|
308
|
+
it("should allow overriding tamboStreamableHint via component annotations", () => {
|
|
309
|
+
const { result } = renderHook(() => useTamboInteractable(), { wrapper });
|
|
310
|
+
const component = {
|
|
311
|
+
name: "TestComponent",
|
|
312
|
+
description: "A test component",
|
|
313
|
+
component: () => React.createElement("div", null, "Test"),
|
|
314
|
+
props: {},
|
|
315
|
+
annotations: { tamboStreamableHint: false },
|
|
316
|
+
};
|
|
317
|
+
act(() => {
|
|
318
|
+
result.current.addInteractableComponent(component);
|
|
319
|
+
});
|
|
320
|
+
const propsToolCall = mockRegisterTool.mock.calls.find((call) => call[0].name.startsWith("update_component_props_"));
|
|
321
|
+
const stateToolCall = mockRegisterTool.mock.calls.find((call) => call[0].name.startsWith("update_component_state_"));
|
|
322
|
+
expect(propsToolCall[0].annotations).toEqual(expect.objectContaining({ tamboStreamableHint: false }));
|
|
323
|
+
expect(stateToolCall[0].annotations).toEqual(expect.objectContaining({ tamboStreamableHint: false }));
|
|
324
|
+
});
|
|
278
325
|
it("should use additionalProperties when no propsSchema provided", () => {
|
|
279
326
|
const { result } = renderHook(() => useTamboInteractable(), { wrapper });
|
|
280
327
|
const component = {
|