@tambo-ai/react 0.75.0 → 1.0.0-rc.4
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/dist/hoc/with-tambo-interactable.d.ts.map +1 -1
- package/dist/hoc/with-tambo-interactable.js +13 -13
- package/dist/hoc/with-tambo-interactable.js.map +1 -1
- package/dist/hoc/with-tambo-interactable.test.js +3 -3
- package/dist/hoc/with-tambo-interactable.test.js.map +1 -1
- package/dist/index.d.ts +7 -25
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -59
- package/dist/index.js.map +1 -1
- package/dist/mcp/mcp-hooks.js +5 -5
- package/dist/mcp/mcp-hooks.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/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 -2
- package/dist/providers/tambo-client-provider.js.map +1 -1
- package/dist/providers/tambo-interactable-provider.d.ts +1 -1
- package/dist/providers/tambo-interactables-additional-context-edge-cases.test.js +2 -10
- package/dist/providers/tambo-interactables-additional-context-edge-cases.test.js.map +1 -1
- package/dist/providers/tambo-interactables-additional-context.test.js +3 -19
- package/dist/providers/tambo-interactables-additional-context.test.js.map +1 -1
- package/dist/providers/tambo-mcp-token-provider.d.ts +8 -17
- package/dist/providers/tambo-mcp-token-provider.d.ts.map +1 -1
- package/dist/providers/tambo-mcp-token-provider.js +20 -97
- package/dist/providers/tambo-mcp-token-provider.js.map +1 -1
- package/dist/testing/tools.d.ts +3 -3
- package/dist/testing/tools.d.ts.map +1 -1
- package/dist/testing/tools.js.map +1 -1
- package/dist/util/registry-validators.js +1 -1
- package/dist/util/registry-validators.js.map +1 -1
- package/dist/v1/__tests__/v1-interactables.test.js +1 -1
- package/dist/v1/__tests__/v1-interactables.test.js.map +1 -1
- package/dist/v1/components/v1-component-renderer.d.ts +9 -9
- package/dist/v1/components/v1-component-renderer.d.ts.map +1 -1
- package/dist/v1/components/v1-component-renderer.js +13 -13
- package/dist/v1/components/v1-component-renderer.js.map +1 -1
- package/dist/v1/components/v1-component-renderer.test.js +15 -15
- package/dist/v1/components/v1-component-renderer.test.js.map +1 -1
- package/{esm/hooks/use-current-message.d.ts → dist/v1/hooks/use-tambo-current-message.d.ts} +30 -9
- package/dist/v1/hooks/use-tambo-current-message.d.ts.map +1 -0
- package/dist/{hooks/use-current-message.js → v1/hooks/use-tambo-current-message.js} +13 -8
- package/dist/v1/hooks/use-tambo-current-message.js.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-auth-state.d.ts +5 -5
- package/dist/v1/hooks/use-tambo-v1-auth-state.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-auth-state.js +8 -8
- package/dist/v1/hooks/use-tambo-v1-auth-state.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-auth-state.test.js +12 -12
- package/dist/v1/hooks/use-tambo-v1-auth-state.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-component-state.d.ts +7 -6
- package/dist/v1/hooks/use-tambo-v1-component-state.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-component-state.js +50 -24
- package/dist/v1/hooks/use-tambo-v1-component-state.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-component-state.test.js +60 -35
- package/dist/v1/hooks/use-tambo-v1-component-state.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-messages.d.ts +9 -9
- package/dist/v1/hooks/use-tambo-v1-messages.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-messages.js +4 -4
- package/dist/v1/hooks/use-tambo-v1-messages.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-messages.test.js +7 -7
- package/dist/v1/hooks/use-tambo-v1-messages.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-send-message.d.ts +3 -3
- package/dist/v1/hooks/use-tambo-v1-send-message.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-send-message.js +20 -22
- package/dist/v1/hooks/use-tambo-v1-send-message.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-send-message.test.js +51 -51
- 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 +5 -5
- package/dist/v1/hooks/use-tambo-v1-stream-status.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-stream-status.js +12 -14
- package/dist/v1/hooks/use-tambo-v1-stream-status.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-stream-status.test.js +19 -19
- package/dist/v1/hooks/use-tambo-v1-stream-status.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-suggestions.d.ts +7 -7
- package/dist/v1/hooks/use-tambo-v1-suggestions.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-suggestions.js +9 -9
- package/dist/v1/hooks/use-tambo-v1-suggestions.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-suggestions.test.js +44 -44
- package/dist/v1/hooks/use-tambo-v1-suggestions.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread-input.d.ts +3 -3
- package/dist/v1/hooks/use-tambo-v1-thread-input.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread-input.js +4 -4
- package/dist/v1/hooks/use-tambo-v1-thread-input.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread-input.test.js +29 -29
- 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 +4 -4
- package/dist/v1/hooks/use-tambo-v1-thread-list.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread-list.js +5 -5
- package/dist/v1/hooks/use-tambo-v1-thread-list.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread-list.test.js +13 -17
- package/dist/v1/hooks/use-tambo-v1-thread-list.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread.d.ts +3 -3
- package/dist/v1/hooks/use-tambo-v1-thread.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread.js +4 -4
- package/dist/v1/hooks/use-tambo-v1-thread.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread.test.js +5 -5
- package/dist/v1/hooks/use-tambo-v1-thread.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1.d.ts +16 -7
- package/dist/v1/hooks/use-tambo-v1.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1.js +41 -10
- package/dist/v1/hooks/use-tambo-v1.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1.test.js +176 -48
- package/dist/v1/hooks/use-tambo-v1.test.js.map +1 -1
- package/dist/v1/index.d.ts +31 -27
- package/dist/v1/index.d.ts.map +1 -1
- package/dist/v1/index.js +45 -35
- package/dist/v1/index.js.map +1 -1
- package/dist/v1/providers/tambo-v1-provider.d.ts +20 -20
- package/dist/v1/providers/tambo-v1-provider.d.ts.map +1 -1
- package/dist/v1/providers/tambo-v1-provider.js +32 -32
- package/dist/v1/providers/tambo-v1-provider.js.map +1 -1
- package/dist/v1/providers/tambo-v1-provider.test.js +22 -22
- package/dist/v1/providers/tambo-v1-provider.test.js.map +1 -1
- package/dist/v1/providers/tambo-v1-stream-context.d.ts +15 -15
- package/dist/v1/providers/tambo-v1-stream-context.d.ts.map +1 -1
- package/dist/v1/providers/tambo-v1-stream-context.js +17 -17
- package/dist/v1/providers/tambo-v1-stream-context.js.map +1 -1
- package/dist/v1/providers/tambo-v1-stream-context.test.js +9 -9
- package/dist/v1/providers/tambo-v1-stream-context.test.js.map +1 -1
- package/dist/v1/providers/tambo-v1-stub-provider.d.ts +9 -9
- package/dist/v1/providers/tambo-v1-stub-provider.d.ts.map +1 -1
- package/dist/v1/providers/tambo-v1-stub-provider.js +7 -7
- package/dist/v1/providers/tambo-v1-stub-provider.js.map +1 -1
- package/dist/v1/providers/tambo-v1-stub-provider.test.js +25 -25
- package/dist/v1/providers/tambo-v1-stub-provider.test.js.map +1 -1
- package/dist/v1/providers/tambo-v1-thread-input-provider.d.ts +9 -9
- package/dist/v1/providers/tambo-v1-thread-input-provider.d.ts.map +1 -1
- package/dist/v1/providers/tambo-v1-thread-input-provider.js +16 -16
- package/dist/v1/providers/tambo-v1-thread-input-provider.js.map +1 -1
- package/dist/v1/types/auth.d.ts +2 -2
- package/dist/v1/types/auth.d.ts.map +1 -1
- package/dist/v1/types/auth.js.map +1 -1
- package/dist/v1/types/component.d.ts +3 -3
- package/dist/v1/types/component.d.ts.map +1 -1
- package/dist/v1/types/component.js +2 -2
- package/dist/v1/types/component.js.map +1 -1
- package/dist/v1/types/event.d.ts +1 -1
- package/dist/v1/types/event.js +1 -1
- package/dist/v1/types/event.js.map +1 -1
- package/dist/v1/types/message.d.ts +17 -24
- package/dist/v1/types/message.d.ts.map +1 -1
- package/dist/v1/types/message.js +1 -1
- package/dist/v1/types/message.js.map +1 -1
- package/dist/v1/types/thread.d.ts +10 -8
- package/dist/v1/types/thread.d.ts.map +1 -1
- package/dist/v1/types/thread.js +1 -1
- package/dist/v1/types/thread.js.map +1 -1
- package/dist/v1/types/tool-choice.d.ts +1 -1
- package/dist/v1/types/tool-choice.js.map +1 -1
- package/dist/v1/utils/component-renderer.d.ts +11 -5
- package/dist/v1/utils/component-renderer.d.ts.map +1 -1
- package/dist/v1/utils/component-renderer.js +16 -7
- package/dist/v1/utils/component-renderer.js.map +1 -1
- package/dist/v1/utils/component-renderer.test.js +7 -7
- package/dist/v1/utils/component-renderer.test.js.map +1 -1
- package/dist/v1/utils/event-accumulator.d.ts +13 -13
- package/dist/v1/utils/event-accumulator.d.ts.map +1 -1
- package/dist/v1/utils/event-accumulator.js +26 -15
- package/dist/v1/utils/event-accumulator.js.map +1 -1
- package/dist/v1/utils/event-accumulator.test.js +54 -19
- package/dist/v1/utils/event-accumulator.test.js.map +1 -1
- package/dist/v1/utils/registry-conversion.d.ts +18 -18
- package/dist/v1/utils/registry-conversion.js +23 -23
- package/dist/v1/utils/registry-conversion.js.map +1 -1
- package/dist/v1/utils/stream-handler.d.ts +1 -1
- package/dist/v1/utils/stream-handler.js +1 -1
- package/dist/v1/utils/stream-handler.js.map +1 -1
- package/dist/v1/utils/thread-utils.d.ts +2 -2
- package/dist/v1/utils/thread-utils.d.ts.map +1 -1
- package/dist/v1/utils/thread-utils.js.map +1 -1
- package/dist/v1/utils/tool-call-tracker.d.ts +1 -1
- package/dist/v1/utils/tool-call-tracker.js +1 -1
- package/dist/v1/utils/tool-call-tracker.js.map +1 -1
- package/dist/v1/utils/tool-executor.d.ts +1 -1
- package/dist/v1/utils/tool-executor.js +2 -2
- package/dist/v1/utils/tool-executor.js.map +1 -1
- package/esm/hoc/with-tambo-interactable.d.ts.map +1 -1
- package/esm/hoc/with-tambo-interactable.js +13 -13
- package/esm/hoc/with-tambo-interactable.js.map +1 -1
- package/esm/hoc/with-tambo-interactable.test.js +1 -1
- package/esm/hoc/with-tambo-interactable.test.js.map +1 -1
- package/esm/index.d.ts +7 -25
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +7 -21
- package/esm/index.js.map +1 -1
- package/esm/mcp/mcp-hooks.js +1 -1
- package/esm/mcp/mcp-hooks.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/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 -2
- package/esm/providers/tambo-client-provider.js.map +1 -1
- package/esm/providers/tambo-interactable-provider.d.ts +1 -1
- package/esm/providers/tambo-interactables-additional-context-edge-cases.test.js +2 -10
- package/esm/providers/tambo-interactables-additional-context-edge-cases.test.js.map +1 -1
- package/esm/providers/tambo-interactables-additional-context.test.js +3 -19
- package/esm/providers/tambo-interactables-additional-context.test.js.map +1 -1
- package/esm/providers/tambo-mcp-token-provider.d.ts +8 -17
- package/esm/providers/tambo-mcp-token-provider.d.ts.map +1 -1
- package/esm/providers/tambo-mcp-token-provider.js +20 -97
- package/esm/providers/tambo-mcp-token-provider.js.map +1 -1
- package/esm/testing/tools.d.ts +3 -3
- package/esm/testing/tools.d.ts.map +1 -1
- package/esm/testing/tools.js.map +1 -1
- package/esm/util/registry-validators.js +1 -1
- package/esm/util/registry-validators.js.map +1 -1
- package/esm/v1/__tests__/v1-interactables.test.js +1 -1
- package/esm/v1/__tests__/v1-interactables.test.js.map +1 -1
- package/esm/v1/components/v1-component-renderer.d.ts +9 -9
- package/esm/v1/components/v1-component-renderer.d.ts.map +1 -1
- package/esm/v1/components/v1-component-renderer.js +12 -12
- package/esm/v1/components/v1-component-renderer.js.map +1 -1
- package/esm/v1/components/v1-component-renderer.test.js +16 -16
- package/esm/v1/components/v1-component-renderer.test.js.map +1 -1
- package/{dist/hooks/use-current-message.d.ts → esm/v1/hooks/use-tambo-current-message.d.ts} +30 -9
- package/esm/v1/hooks/use-tambo-current-message.d.ts.map +1 -0
- package/esm/{hooks/use-current-message.js → v1/hooks/use-tambo-current-message.js} +13 -8
- package/esm/v1/hooks/use-tambo-current-message.js.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-auth-state.d.ts +5 -5
- package/esm/v1/hooks/use-tambo-v1-auth-state.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-auth-state.js +8 -8
- package/esm/v1/hooks/use-tambo-v1-auth-state.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-auth-state.test.js +14 -14
- package/esm/v1/hooks/use-tambo-v1-auth-state.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-component-state.d.ts +7 -6
- package/esm/v1/hooks/use-tambo-v1-component-state.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-component-state.js +50 -24
- package/esm/v1/hooks/use-tambo-v1-component-state.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-component-state.test.js +62 -37
- package/esm/v1/hooks/use-tambo-v1-component-state.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-messages.d.ts +9 -9
- package/esm/v1/hooks/use-tambo-v1-messages.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-messages.js +3 -3
- package/esm/v1/hooks/use-tambo-v1-messages.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-messages.test.js +9 -9
- package/esm/v1/hooks/use-tambo-v1-messages.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-send-message.d.ts +3 -3
- package/esm/v1/hooks/use-tambo-v1-send-message.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-send-message.js +21 -23
- package/esm/v1/hooks/use-tambo-v1-send-message.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-send-message.test.js +54 -54
- 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 +5 -5
- package/esm/v1/hooks/use-tambo-v1-stream-status.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-stream-status.js +12 -14
- package/esm/v1/hooks/use-tambo-v1-stream-status.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-stream-status.test.js +21 -21
- package/esm/v1/hooks/use-tambo-v1-stream-status.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-suggestions.d.ts +7 -7
- package/esm/v1/hooks/use-tambo-v1-suggestions.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-suggestions.js +11 -11
- package/esm/v1/hooks/use-tambo-v1-suggestions.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-suggestions.test.js +48 -48
- package/esm/v1/hooks/use-tambo-v1-suggestions.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-input.d.ts +3 -3
- package/esm/v1/hooks/use-tambo-v1-thread-input.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-input.js +3 -3
- package/esm/v1/hooks/use-tambo-v1-thread-input.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-input.test.js +32 -32
- 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 +4 -4
- package/esm/v1/hooks/use-tambo-v1-thread-list.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-list.js +6 -6
- package/esm/v1/hooks/use-tambo-v1-thread-list.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-list.test.js +15 -19
- package/esm/v1/hooks/use-tambo-v1-thread-list.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread.d.ts +3 -3
- package/esm/v1/hooks/use-tambo-v1-thread.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread.js +4 -4
- package/esm/v1/hooks/use-tambo-v1-thread.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread.test.js +6 -6
- package/esm/v1/hooks/use-tambo-v1-thread.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1.d.ts +16 -7
- package/esm/v1/hooks/use-tambo-v1.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1.js +43 -12
- package/esm/v1/hooks/use-tambo-v1.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1.test.js +178 -50
- package/esm/v1/hooks/use-tambo-v1.test.js.map +1 -1
- package/esm/v1/index.d.ts +31 -27
- package/esm/v1/index.d.ts.map +1 -1
- package/esm/v1/index.js +38 -33
- package/esm/v1/index.js.map +1 -1
- package/esm/v1/providers/tambo-v1-provider.d.ts +20 -20
- package/esm/v1/providers/tambo-v1-provider.d.ts.map +1 -1
- package/esm/v1/providers/tambo-v1-provider.js +32 -32
- package/esm/v1/providers/tambo-v1-provider.js.map +1 -1
- package/esm/v1/providers/tambo-v1-provider.test.js +23 -23
- package/esm/v1/providers/tambo-v1-provider.test.js.map +1 -1
- package/esm/v1/providers/tambo-v1-stream-context.d.ts +15 -15
- package/esm/v1/providers/tambo-v1-stream-context.d.ts.map +1 -1
- package/esm/v1/providers/tambo-v1-stream-context.js +17 -17
- package/esm/v1/providers/tambo-v1-stream-context.js.map +1 -1
- package/esm/v1/providers/tambo-v1-stream-context.test.js +10 -10
- package/esm/v1/providers/tambo-v1-stream-context.test.js.map +1 -1
- package/esm/v1/providers/tambo-v1-stub-provider.d.ts +9 -9
- package/esm/v1/providers/tambo-v1-stub-provider.d.ts.map +1 -1
- package/esm/v1/providers/tambo-v1-stub-provider.js +9 -9
- package/esm/v1/providers/tambo-v1-stub-provider.js.map +1 -1
- package/esm/v1/providers/tambo-v1-stub-provider.test.js +28 -28
- package/esm/v1/providers/tambo-v1-stub-provider.test.js.map +1 -1
- package/esm/v1/providers/tambo-v1-thread-input-provider.d.ts +9 -9
- package/esm/v1/providers/tambo-v1-thread-input-provider.d.ts.map +1 -1
- package/esm/v1/providers/tambo-v1-thread-input-provider.js +15 -15
- package/esm/v1/providers/tambo-v1-thread-input-provider.js.map +1 -1
- package/esm/v1/types/auth.d.ts +2 -2
- package/esm/v1/types/auth.d.ts.map +1 -1
- package/esm/v1/types/auth.js.map +1 -1
- package/esm/v1/types/component.d.ts +3 -3
- package/esm/v1/types/component.d.ts.map +1 -1
- package/esm/v1/types/component.js +2 -2
- package/esm/v1/types/component.js.map +1 -1
- package/esm/v1/types/event.d.ts +1 -1
- package/esm/v1/types/event.js +1 -1
- package/esm/v1/types/event.js.map +1 -1
- package/esm/v1/types/message.d.ts +17 -24
- package/esm/v1/types/message.d.ts.map +1 -1
- package/esm/v1/types/message.js +1 -1
- package/esm/v1/types/message.js.map +1 -1
- package/esm/v1/types/thread.d.ts +10 -8
- package/esm/v1/types/thread.d.ts.map +1 -1
- package/esm/v1/types/thread.js +1 -1
- package/esm/v1/types/thread.js.map +1 -1
- package/esm/v1/types/tool-choice.d.ts +1 -1
- package/esm/v1/types/tool-choice.js.map +1 -1
- package/esm/v1/utils/component-renderer.d.ts +11 -5
- package/esm/v1/utils/component-renderer.d.ts.map +1 -1
- package/esm/v1/utils/component-renderer.js +13 -5
- package/esm/v1/utils/component-renderer.js.map +1 -1
- package/esm/v1/utils/component-renderer.test.js +8 -8
- package/esm/v1/utils/component-renderer.test.js.map +1 -1
- package/esm/v1/utils/event-accumulator.d.ts +13 -13
- package/esm/v1/utils/event-accumulator.d.ts.map +1 -1
- package/esm/v1/utils/event-accumulator.js +26 -15
- package/esm/v1/utils/event-accumulator.js.map +1 -1
- package/esm/v1/utils/event-accumulator.test.js +54 -19
- package/esm/v1/utils/event-accumulator.test.js.map +1 -1
- package/esm/v1/utils/registry-conversion.d.ts +18 -18
- package/esm/v1/utils/registry-conversion.js +23 -23
- package/esm/v1/utils/registry-conversion.js.map +1 -1
- package/esm/v1/utils/stream-handler.d.ts +1 -1
- package/esm/v1/utils/stream-handler.js +1 -1
- package/esm/v1/utils/stream-handler.js.map +1 -1
- package/esm/v1/utils/thread-utils.d.ts +2 -2
- package/esm/v1/utils/thread-utils.d.ts.map +1 -1
- package/esm/v1/utils/thread-utils.js.map +1 -1
- package/esm/v1/utils/tool-call-tracker.d.ts +1 -1
- package/esm/v1/utils/tool-call-tracker.js +1 -1
- package/esm/v1/utils/tool-call-tracker.js.map +1 -1
- package/esm/v1/utils/tool-executor.d.ts +1 -1
- package/esm/v1/utils/tool-executor.js +2 -2
- package/esm/v1/utils/tool-executor.js.map +1 -1
- package/package.json +4 -9
- package/dist/hooks/index.d.ts +0 -9
- package/dist/hooks/index.d.ts.map +0 -1
- package/dist/hooks/index.js +0 -34
- package/dist/hooks/index.js.map +0 -1
- package/dist/hooks/use-component-state.d.ts +0 -30
- package/dist/hooks/use-component-state.d.ts.map +0 -1
- package/dist/hooks/use-component-state.js +0 -139
- package/dist/hooks/use-component-state.js.map +0 -1
- package/dist/hooks/use-component-state.test.d.ts +0 -2
- package/dist/hooks/use-component-state.test.d.ts.map +0 -1
- package/dist/hooks/use-component-state.test.js +0 -406
- package/dist/hooks/use-component-state.test.js.map +0 -1
- package/dist/hooks/use-current-message.d.ts.map +0 -1
- package/dist/hooks/use-current-message.js.map +0 -1
- package/dist/hooks/use-current-message.test.d.ts +0 -2
- package/dist/hooks/use-current-message.test.d.ts.map +0 -1
- package/dist/hooks/use-current-message.test.js +0 -269
- package/dist/hooks/use-current-message.test.js.map +0 -1
- package/dist/hooks/use-streaming-props.d.ts +0 -11
- package/dist/hooks/use-streaming-props.d.ts.map +0 -1
- package/dist/hooks/use-streaming-props.js +0 -37
- package/dist/hooks/use-streaming-props.js.map +0 -1
- package/dist/hooks/use-suggestions.d.ts +0 -46
- package/dist/hooks/use-suggestions.d.ts.map +0 -1
- package/dist/hooks/use-suggestions.js +0 -118
- package/dist/hooks/use-suggestions.js.map +0 -1
- package/dist/hooks/use-suggestions.test.d.ts +0 -2
- package/dist/hooks/use-suggestions.test.d.ts.map +0 -1
- package/dist/hooks/use-suggestions.test.js +0 -247
- package/dist/hooks/use-suggestions.test.js.map +0 -1
- package/dist/hooks/use-tambo-stream-status.d.ts +0 -90
- package/dist/hooks/use-tambo-stream-status.d.ts.map +0 -1
- package/dist/hooks/use-tambo-stream-status.js +0 -213
- package/dist/hooks/use-tambo-stream-status.js.map +0 -1
- package/dist/hooks/use-tambo-stream-status.test.d.ts +0 -2
- package/dist/hooks/use-tambo-stream-status.test.d.ts.map +0 -1
- package/dist/hooks/use-tambo-stream-status.test.js +0 -378
- package/dist/hooks/use-tambo-stream-status.test.js.map +0 -1
- package/dist/hooks/use-tambo-threads.d.ts +0 -158
- package/dist/hooks/use-tambo-threads.d.ts.map +0 -1
- package/dist/hooks/use-tambo-threads.js +0 -45
- package/dist/hooks/use-tambo-threads.js.map +0 -1
- package/dist/hooks/use-tambo-threads.test.d.ts +0 -2
- package/dist/hooks/use-tambo-threads.test.d.ts.map +0 -1
- package/dist/hooks/use-tambo-threads.test.js +0 -214
- package/dist/hooks/use-tambo-threads.test.js.map +0 -1
- package/dist/model/generate-component-response.d.ts +0 -37
- package/dist/model/generate-component-response.d.ts.map +0 -1
- package/dist/model/generate-component-response.js +0 -29
- package/dist/model/generate-component-response.js.map +0 -1
- package/dist/model/tambo-thread.d.ts +0 -15
- package/dist/model/tambo-thread.d.ts.map +0 -1
- package/dist/model/tambo-thread.js +0 -3
- package/dist/model/tambo-thread.js.map +0 -1
- package/dist/providers/__tests__/thread-input-resource-resolution.test.d.ts +0 -2
- package/dist/providers/__tests__/thread-input-resource-resolution.test.d.ts.map +0 -1
- package/dist/providers/__tests__/thread-input-resource-resolution.test.js +0 -592
- package/dist/providers/__tests__/thread-input-resource-resolution.test.js.map +0 -1
- package/dist/providers/index.d.ts +0 -13
- package/dist/providers/index.d.ts.map +0 -1
- package/dist/providers/index.js +0 -41
- package/dist/providers/index.js.map +0 -1
- package/dist/providers/tambo-component-provider.d.ts +0 -23
- package/dist/providers/tambo-component-provider.d.ts.map +0 -1
- package/dist/providers/tambo-component-provider.js +0 -88
- package/dist/providers/tambo-component-provider.js.map +0 -1
- package/dist/providers/tambo-prop-stream-provider/index.d.ts +0 -19
- package/dist/providers/tambo-prop-stream-provider/index.d.ts.map +0 -1
- package/dist/providers/tambo-prop-stream-provider/index.js +0 -43
- package/dist/providers/tambo-prop-stream-provider/index.js.map +0 -1
- package/dist/providers/tambo-prop-stream-provider/pending.d.ts +0 -12
- package/dist/providers/tambo-prop-stream-provider/pending.d.ts.map +0 -1
- package/dist/providers/tambo-prop-stream-provider/pending.js +0 -31
- package/dist/providers/tambo-prop-stream-provider/pending.js.map +0 -1
- package/dist/providers/tambo-prop-stream-provider/provider.d.ts +0 -17
- package/dist/providers/tambo-prop-stream-provider/provider.d.ts.map +0 -1
- package/dist/providers/tambo-prop-stream-provider/provider.js +0 -107
- package/dist/providers/tambo-prop-stream-provider/provider.js.map +0 -1
- package/dist/providers/tambo-prop-stream-provider/streaming.d.ts +0 -12
- package/dist/providers/tambo-prop-stream-provider/streaming.d.ts.map +0 -1
- package/dist/providers/tambo-prop-stream-provider/streaming.js +0 -28
- package/dist/providers/tambo-prop-stream-provider/streaming.js.map +0 -1
- package/dist/providers/tambo-prop-stream-provider/success.d.ts +0 -12
- package/dist/providers/tambo-prop-stream-provider/success.d.ts.map +0 -1
- package/dist/providers/tambo-prop-stream-provider/success.js +0 -28
- package/dist/providers/tambo-prop-stream-provider/success.js.map +0 -1
- package/dist/providers/tambo-prop-stream-provider/types.d.ts +0 -25
- package/dist/providers/tambo-prop-stream-provider/types.d.ts.map +0 -1
- package/dist/providers/tambo-prop-stream-provider/types.js +0 -6
- package/dist/providers/tambo-prop-stream-provider/types.js.map +0 -1
- package/dist/providers/tambo-prop-stream-provider.test.d.ts +0 -2
- package/dist/providers/tambo-prop-stream-provider.test.d.ts.map +0 -1
- package/dist/providers/tambo-prop-stream-provider.test.js +0 -275
- package/dist/providers/tambo-prop-stream-provider.test.js.map +0 -1
- package/dist/providers/tambo-provider.d.ts +0 -53
- package/dist/providers/tambo-provider.d.ts.map +0 -1
- package/dist/providers/tambo-provider.js +0 -133
- package/dist/providers/tambo-provider.js.map +0 -1
- package/dist/providers/tambo-stubs.d.ts +0 -89
- package/dist/providers/tambo-stubs.d.ts.map +0 -1
- package/dist/providers/tambo-stubs.js +0 -279
- package/dist/providers/tambo-stubs.js.map +0 -1
- package/dist/providers/tambo-stubs.test.d.ts +0 -2
- package/dist/providers/tambo-stubs.test.d.ts.map +0 -1
- package/dist/providers/tambo-stubs.test.js +0 -97
- package/dist/providers/tambo-stubs.test.js.map +0 -1
- package/dist/providers/tambo-thread-input-provider.d.ts +0 -65
- package/dist/providers/tambo-thread-input-provider.d.ts.map +0 -1
- package/dist/providers/tambo-thread-input-provider.js +0 -179
- package/dist/providers/tambo-thread-input-provider.js.map +0 -1
- package/dist/providers/tambo-thread-provider-initial-messages.test.d.ts +0 -2
- package/dist/providers/tambo-thread-provider-initial-messages.test.d.ts.map +0 -1
- package/dist/providers/tambo-thread-provider-initial-messages.test.js +0 -278
- package/dist/providers/tambo-thread-provider-initial-messages.test.js.map +0 -1
- package/dist/providers/tambo-thread-provider.d.ts +0 -126
- package/dist/providers/tambo-thread-provider.d.ts.map +0 -1
- package/dist/providers/tambo-thread-provider.js +0 -931
- package/dist/providers/tambo-thread-provider.js.map +0 -1
- package/dist/providers/tambo-thread-provider.test.d.ts +0 -2
- package/dist/providers/tambo-thread-provider.test.d.ts.map +0 -1
- package/dist/providers/tambo-thread-provider.test.js +0 -1591
- package/dist/providers/tambo-thread-provider.test.js.map +0 -1
- package/dist/util/generate-component.d.ts +0 -12
- package/dist/util/generate-component.d.ts.map +0 -1
- package/dist/util/generate-component.js +0 -58
- package/dist/util/generate-component.js.map +0 -1
- package/dist/util/generate-component.test.d.ts +0 -2
- package/dist/util/generate-component.test.d.ts.map +0 -1
- package/dist/util/generate-component.test.js +0 -340
- package/dist/util/generate-component.test.js.map +0 -1
- package/esm/hooks/index.d.ts +0 -9
- package/esm/hooks/index.d.ts.map +0 -1
- package/esm/hooks/index.js +0 -10
- package/esm/hooks/index.js.map +0 -1
- package/esm/hooks/use-component-state.d.ts +0 -30
- package/esm/hooks/use-component-state.d.ts.map +0 -1
- package/esm/hooks/use-component-state.js +0 -136
- package/esm/hooks/use-component-state.js.map +0 -1
- package/esm/hooks/use-component-state.test.d.ts +0 -2
- package/esm/hooks/use-component-state.test.d.ts.map +0 -1
- package/esm/hooks/use-component-state.test.js +0 -401
- package/esm/hooks/use-component-state.test.js.map +0 -1
- package/esm/hooks/use-current-message.d.ts.map +0 -1
- package/esm/hooks/use-current-message.js.map +0 -1
- package/esm/hooks/use-current-message.test.d.ts +0 -2
- package/esm/hooks/use-current-message.test.d.ts.map +0 -1
- package/esm/hooks/use-current-message.test.js +0 -264
- package/esm/hooks/use-current-message.test.js.map +0 -1
- package/esm/hooks/use-streaming-props.d.ts +0 -11
- package/esm/hooks/use-streaming-props.d.ts.map +0 -1
- package/esm/hooks/use-streaming-props.js +0 -34
- package/esm/hooks/use-streaming-props.js.map +0 -1
- package/esm/hooks/use-suggestions.d.ts +0 -46
- package/esm/hooks/use-suggestions.d.ts.map +0 -1
- package/esm/hooks/use-suggestions.js +0 -115
- package/esm/hooks/use-suggestions.js.map +0 -1
- package/esm/hooks/use-suggestions.test.d.ts +0 -2
- package/esm/hooks/use-suggestions.test.d.ts.map +0 -1
- package/esm/hooks/use-suggestions.test.js +0 -245
- package/esm/hooks/use-suggestions.test.js.map +0 -1
- package/esm/hooks/use-tambo-stream-status.d.ts +0 -90
- package/esm/hooks/use-tambo-stream-status.d.ts.map +0 -1
- package/esm/hooks/use-tambo-stream-status.js +0 -210
- package/esm/hooks/use-tambo-stream-status.js.map +0 -1
- package/esm/hooks/use-tambo-stream-status.test.d.ts +0 -2
- package/esm/hooks/use-tambo-stream-status.test.d.ts.map +0 -1
- package/esm/hooks/use-tambo-stream-status.test.js +0 -376
- package/esm/hooks/use-tambo-stream-status.test.js.map +0 -1
- package/esm/hooks/use-tambo-threads.d.ts +0 -158
- package/esm/hooks/use-tambo-threads.d.ts.map +0 -1
- package/esm/hooks/use-tambo-threads.js +0 -42
- package/esm/hooks/use-tambo-threads.js.map +0 -1
- package/esm/hooks/use-tambo-threads.test.d.ts +0 -2
- package/esm/hooks/use-tambo-threads.test.d.ts.map +0 -1
- package/esm/hooks/use-tambo-threads.test.js +0 -212
- package/esm/hooks/use-tambo-threads.test.js.map +0 -1
- package/esm/model/generate-component-response.d.ts +0 -37
- package/esm/model/generate-component-response.d.ts.map +0 -1
- package/esm/model/generate-component-response.js +0 -25
- package/esm/model/generate-component-response.js.map +0 -1
- package/esm/model/tambo-thread.d.ts +0 -15
- package/esm/model/tambo-thread.d.ts.map +0 -1
- package/esm/model/tambo-thread.js +0 -2
- package/esm/model/tambo-thread.js.map +0 -1
- package/esm/providers/__tests__/thread-input-resource-resolution.test.d.ts +0 -2
- package/esm/providers/__tests__/thread-input-resource-resolution.test.d.ts.map +0 -1
- package/esm/providers/__tests__/thread-input-resource-resolution.test.js +0 -587
- package/esm/providers/__tests__/thread-input-resource-resolution.test.js.map +0 -1
- package/esm/providers/index.d.ts +0 -13
- package/esm/providers/index.d.ts.map +0 -1
- package/esm/providers/index.js +0 -11
- package/esm/providers/index.js.map +0 -1
- package/esm/providers/tambo-component-provider.d.ts +0 -23
- package/esm/providers/tambo-component-provider.d.ts.map +0 -1
- package/esm/providers/tambo-component-provider.js +0 -50
- package/esm/providers/tambo-component-provider.js.map +0 -1
- package/esm/providers/tambo-prop-stream-provider/index.d.ts +0 -19
- package/esm/providers/tambo-prop-stream-provider/index.d.ts.map +0 -1
- package/esm/providers/tambo-prop-stream-provider/index.js +0 -22
- package/esm/providers/tambo-prop-stream-provider/index.js.map +0 -1
- package/esm/providers/tambo-prop-stream-provider/pending.d.ts +0 -12
- package/esm/providers/tambo-prop-stream-provider/pending.d.ts.map +0 -1
- package/esm/providers/tambo-prop-stream-provider/pending.js +0 -24
- package/esm/providers/tambo-prop-stream-provider/pending.js.map +0 -1
- package/esm/providers/tambo-prop-stream-provider/provider.d.ts +0 -17
- package/esm/providers/tambo-prop-stream-provider/provider.d.ts.map +0 -1
- package/esm/providers/tambo-prop-stream-provider/provider.js +0 -70
- package/esm/providers/tambo-prop-stream-provider/provider.js.map +0 -1
- package/esm/providers/tambo-prop-stream-provider/streaming.d.ts +0 -12
- package/esm/providers/tambo-prop-stream-provider/streaming.d.ts.map +0 -1
- package/esm/providers/tambo-prop-stream-provider/streaming.js +0 -21
- package/esm/providers/tambo-prop-stream-provider/streaming.js.map +0 -1
- package/esm/providers/tambo-prop-stream-provider/success.d.ts +0 -12
- package/esm/providers/tambo-prop-stream-provider/success.d.ts.map +0 -1
- package/esm/providers/tambo-prop-stream-provider/success.js +0 -21
- package/esm/providers/tambo-prop-stream-provider/success.js.map +0 -1
- package/esm/providers/tambo-prop-stream-provider/types.d.ts +0 -25
- package/esm/providers/tambo-prop-stream-provider/types.d.ts.map +0 -1
- package/esm/providers/tambo-prop-stream-provider/types.js +0 -3
- package/esm/providers/tambo-prop-stream-provider/types.js.map +0 -1
- package/esm/providers/tambo-prop-stream-provider.test.d.ts +0 -2
- package/esm/providers/tambo-prop-stream-provider.test.d.ts.map +0 -1
- package/esm/providers/tambo-prop-stream-provider.test.js +0 -270
- package/esm/providers/tambo-prop-stream-provider.test.js.map +0 -1
- package/esm/providers/tambo-provider.d.ts +0 -53
- package/esm/providers/tambo-provider.d.ts.map +0 -1
- package/esm/providers/tambo-provider.js +0 -94
- package/esm/providers/tambo-provider.js.map +0 -1
- package/esm/providers/tambo-stubs.d.ts +0 -89
- package/esm/providers/tambo-stubs.d.ts.map +0 -1
- package/esm/providers/tambo-stubs.js +0 -242
- package/esm/providers/tambo-stubs.js.map +0 -1
- package/esm/providers/tambo-stubs.test.d.ts +0 -2
- package/esm/providers/tambo-stubs.test.d.ts.map +0 -1
- package/esm/providers/tambo-stubs.test.js +0 -62
- package/esm/providers/tambo-stubs.test.js.map +0 -1
- package/esm/providers/tambo-thread-input-provider.d.ts +0 -65
- package/esm/providers/tambo-thread-input-provider.d.ts.map +0 -1
- package/esm/providers/tambo-thread-input-provider.js +0 -141
- package/esm/providers/tambo-thread-input-provider.js.map +0 -1
- package/esm/providers/tambo-thread-provider-initial-messages.test.d.ts +0 -2
- package/esm/providers/tambo-thread-provider-initial-messages.test.d.ts.map +0 -1
- package/esm/providers/tambo-thread-provider-initial-messages.test.js +0 -273
- package/esm/providers/tambo-thread-provider-initial-messages.test.js.map +0 -1
- package/esm/providers/tambo-thread-provider.d.ts +0 -126
- package/esm/providers/tambo-thread-provider.d.ts.map +0 -1
- package/esm/providers/tambo-thread-provider.js +0 -891
- package/esm/providers/tambo-thread-provider.js.map +0 -1
- package/esm/providers/tambo-thread-provider.test.d.ts +0 -2
- package/esm/providers/tambo-thread-provider.test.d.ts.map +0 -1
- package/esm/providers/tambo-thread-provider.test.js +0 -1553
- package/esm/providers/tambo-thread-provider.test.js.map +0 -1
- package/esm/util/generate-component.d.ts +0 -12
- package/esm/util/generate-component.d.ts.map +0 -1
- package/esm/util/generate-component.js +0 -52
- package/esm/util/generate-component.js.map +0 -1
- package/esm/util/generate-component.test.d.ts +0 -2
- package/esm/util/generate-component.test.d.ts.map +0 -1
- package/esm/util/generate-component.test.js +0 -302
- package/esm/util/generate-component.test.js.map +0 -1
|
@@ -40,7 +40,7 @@ function createMockRegistry(componentList = {}) {
|
|
|
40
40
|
registerResourceSource: jest.fn(),
|
|
41
41
|
};
|
|
42
42
|
}
|
|
43
|
-
describe("
|
|
43
|
+
describe("ComponentRenderer", () => {
|
|
44
44
|
function withMockedConsoleError(fn) {
|
|
45
45
|
const consoleErrorSpy = jest.spyOn(console, "error").mockImplementation();
|
|
46
46
|
try {
|
|
@@ -68,7 +68,7 @@ describe("V1ComponentRenderer", () => {
|
|
|
68
68
|
},
|
|
69
69
|
});
|
|
70
70
|
(0, react_2.render)(react_1.default.createElement(tambo_registry_provider_1.TamboRegistryContext.Provider, { value: registry },
|
|
71
|
-
react_1.default.createElement(v1_component_renderer_1.
|
|
71
|
+
react_1.default.createElement(v1_component_renderer_1.ComponentRenderer, { content: baseContent, threadId: "thread_123", messageId: "msg_456" })));
|
|
72
72
|
expect(react_2.screen.getByTestId("test-component")).toBeInTheDocument();
|
|
73
73
|
expect(react_2.screen.getByTestId("title")).toHaveTextContent("Hello World");
|
|
74
74
|
});
|
|
@@ -76,10 +76,10 @@ describe("V1ComponentRenderer", () => {
|
|
|
76
76
|
const registry = createMockRegistry({});
|
|
77
77
|
withMockedConsoleError((consoleErrorSpy) => {
|
|
78
78
|
(0, react_2.render)(react_1.default.createElement(tambo_registry_provider_1.TamboRegistryContext.Provider, { value: registry },
|
|
79
|
-
react_1.default.createElement(v1_component_renderer_1.
|
|
79
|
+
react_1.default.createElement(v1_component_renderer_1.ComponentRenderer, { content: baseContent, threadId: "thread_123", messageId: "msg_456", fallback: react_1.default.createElement("div", { "data-testid": "fallback" }, "Not found") })));
|
|
80
80
|
expect(react_2.screen.getByTestId("fallback")).toBeInTheDocument();
|
|
81
81
|
expect(react_2.screen.queryByTestId("test-component")).not.toBeInTheDocument();
|
|
82
|
-
expect(consoleErrorSpy).toHaveBeenCalledWith("[
|
|
82
|
+
expect(consoleErrorSpy).toHaveBeenCalledWith("[ComponentRenderer] Failed to render component", expect.objectContaining({
|
|
83
83
|
componentId: baseContent.id,
|
|
84
84
|
componentName: baseContent.name,
|
|
85
85
|
}));
|
|
@@ -89,9 +89,9 @@ describe("V1ComponentRenderer", () => {
|
|
|
89
89
|
const registry = createMockRegistry({});
|
|
90
90
|
withMockedConsoleError((consoleErrorSpy) => {
|
|
91
91
|
const { container } = (0, react_2.render)(react_1.default.createElement(tambo_registry_provider_1.TamboRegistryContext.Provider, { value: registry },
|
|
92
|
-
react_1.default.createElement(v1_component_renderer_1.
|
|
92
|
+
react_1.default.createElement(v1_component_renderer_1.ComponentRenderer, { content: baseContent, threadId: "thread_123", messageId: "msg_456" })));
|
|
93
93
|
expect(container.firstChild).toBeNull();
|
|
94
|
-
expect(consoleErrorSpy).toHaveBeenCalledWith("[
|
|
94
|
+
expect(consoleErrorSpy).toHaveBeenCalledWith("[ComponentRenderer] Failed to render component", expect.objectContaining({
|
|
95
95
|
componentId: baseContent.id,
|
|
96
96
|
componentName: baseContent.name,
|
|
97
97
|
}));
|
|
@@ -115,7 +115,7 @@ describe("V1ComponentRenderer", () => {
|
|
|
115
115
|
streamingState: "done",
|
|
116
116
|
};
|
|
117
117
|
(0, react_2.render)(react_1.default.createElement(tambo_registry_provider_1.TamboRegistryContext.Provider, { value: registry },
|
|
118
|
-
react_1.default.createElement(v1_component_renderer_1.
|
|
118
|
+
react_1.default.createElement(v1_component_renderer_1.ComponentRenderer, { content: content, threadId: "thread_123", messageId: "msg_456" })));
|
|
119
119
|
expect(react_2.screen.getByTestId("title")).toHaveTextContent("Test");
|
|
120
120
|
expect(react_2.screen.queryByTestId("count")).not.toBeInTheDocument();
|
|
121
121
|
});
|
|
@@ -137,7 +137,7 @@ describe("V1ComponentRenderer", () => {
|
|
|
137
137
|
streamingState: "done",
|
|
138
138
|
};
|
|
139
139
|
(0, react_2.render)(react_1.default.createElement(tambo_registry_provider_1.TamboRegistryContext.Provider, { value: registry },
|
|
140
|
-
react_1.default.createElement(v1_component_renderer_1.
|
|
140
|
+
react_1.default.createElement(v1_component_renderer_1.ComponentRenderer, { content: content, threadId: "thread_123", messageId: "msg_456" })));
|
|
141
141
|
// Component should render with empty props
|
|
142
142
|
expect(react_2.screen.getByTestId("test-component")).toBeInTheDocument();
|
|
143
143
|
});
|
|
@@ -160,7 +160,7 @@ describe("V1ComponentRenderer", () => {
|
|
|
160
160
|
streamingState: "done",
|
|
161
161
|
};
|
|
162
162
|
(0, react_2.render)(react_1.default.createElement(tambo_registry_provider_1.TamboRegistryContext.Provider, { value: registry },
|
|
163
|
-
react_1.default.createElement(v1_component_renderer_1.
|
|
163
|
+
react_1.default.createElement(v1_component_renderer_1.ComponentRenderer, { content: content, threadId: "thread_123", messageId: "msg_456" })));
|
|
164
164
|
expect(react_2.screen.getByTestId("name")).toHaveTextContent("Alice");
|
|
165
165
|
expect(react_2.screen.getByTestId("age")).toHaveTextContent("30");
|
|
166
166
|
});
|
|
@@ -184,7 +184,7 @@ describe("V1ComponentRenderer", () => {
|
|
|
184
184
|
streamingState: "done",
|
|
185
185
|
};
|
|
186
186
|
(0, react_2.render)(react_1.default.createElement(tambo_registry_provider_1.TamboRegistryContext.Provider, { value: registry },
|
|
187
|
-
react_1.default.createElement(v1_component_renderer_1.
|
|
187
|
+
react_1.default.createElement(v1_component_renderer_1.ComponentRenderer, { content: content, threadId: "thread_123", messageId: "msg_456" })));
|
|
188
188
|
// Should still render with raw props
|
|
189
189
|
expect(react_2.screen.getByTestId("name")).toHaveTextContent("Bob");
|
|
190
190
|
expect(react_2.screen.getByTestId("age")).toHaveTextContent("not a number");
|
|
@@ -213,7 +213,7 @@ describe("V1ComponentRenderer", () => {
|
|
|
213
213
|
},
|
|
214
214
|
});
|
|
215
215
|
(0, react_2.render)(react_1.default.createElement(tambo_registry_provider_1.TamboRegistryContext.Provider, { value: registry },
|
|
216
|
-
react_1.default.createElement(v1_component_renderer_1.
|
|
216
|
+
react_1.default.createElement(v1_component_renderer_1.ComponentRenderer, { content: baseContent, threadId: "thread_123", messageId: "msg_456" })));
|
|
217
217
|
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining("Async schema validation not supported"));
|
|
218
218
|
consoleSpy.mockRestore();
|
|
219
219
|
});
|
|
@@ -236,13 +236,13 @@ describe("V1ComponentRenderer", () => {
|
|
|
236
236
|
streamingState: "streaming",
|
|
237
237
|
};
|
|
238
238
|
(0, react_2.render)(react_1.default.createElement(tambo_registry_provider_1.TamboRegistryContext.Provider, { value: registry },
|
|
239
|
-
react_1.default.createElement(v1_component_renderer_1.
|
|
239
|
+
react_1.default.createElement(v1_component_renderer_1.ComponentRenderer, { content: content, threadId: "thread_123", messageId: "msg_456" })));
|
|
240
240
|
expect(react_2.screen.getByTestId("title")).toHaveTextContent("Partial");
|
|
241
241
|
});
|
|
242
|
-
it("provides component context to rendered components via
|
|
242
|
+
it("provides component context to rendered components via TamboComponentContentProvider", () => {
|
|
243
243
|
// Create a component that uses the context
|
|
244
244
|
const ContextAwareComponent = () => {
|
|
245
|
-
// We can't directly test the context without importing
|
|
245
|
+
// We can't directly test the context without importing useTamboComponentContent
|
|
246
246
|
// but we can verify the component renders which means the provider works
|
|
247
247
|
return react_1.default.createElement("div", { "data-testid": "context-aware" }, "Rendered");
|
|
248
248
|
};
|
|
@@ -263,7 +263,7 @@ describe("V1ComponentRenderer", () => {
|
|
|
263
263
|
streamingState: "done",
|
|
264
264
|
};
|
|
265
265
|
(0, react_2.render)(react_1.default.createElement(tambo_registry_provider_1.TamboRegistryContext.Provider, { value: registry },
|
|
266
|
-
react_1.default.createElement(v1_component_renderer_1.
|
|
266
|
+
react_1.default.createElement(v1_component_renderer_1.ComponentRenderer, { content: content, threadId: "thread_abc", messageId: "msg_def" })));
|
|
267
267
|
expect(react_2.screen.getByTestId("context-aware")).toBeInTheDocument();
|
|
268
268
|
});
|
|
269
269
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"v1-component-renderer.test.js","sourceRoot":"","sources":["../../../src/v1/components/v1-component-renderer.test.tsx"],"names":[],"mappings":";;;;;AAAA,kDAA0B;AAC1B,kDAAwD;AACxD,6BAAwB;AACxB,mEAA8D;AAC9D,qFAA+E;AAI/E,wBAAwB;AACxB,MAAM,aAAa,GAAgD,CAAC,EAClE,KAAK,EACL,KAAK,GACN,EAAE,EAAE,CAAC,CACJ,sDAAiB,gBAAgB;IAC/B,uDAAkB,OAAO,IAAE,KAAK,CAAQ;IACvC,KAAK,KAAK,SAAS,IAAI,uDAAkB,OAAO,IAAE,KAAK,CAAQ,CAC5D,CACP,CAAC;AAEF,2CAA2C;AAC3C,MAAM,kBAAkB,GAA4C,CAAC,EACnE,IAAI,EACJ,GAAG,GACJ,EAAE,EAAE,CAAC,CACJ,sDAAiB,qBAAqB;IACpC,uDAAkB,MAAM,IAAE,IAAI,CAAQ;IACtC,uDAAkB,KAAK,IAAE,GAAG,CAAQ,CAChC,CACP,CAAC;AAEF,MAAM,wBAAwB,GAAG,OAAC,CAAC,MAAM,CAAC;IACxC,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;IAChB,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE;CAChB,CAAC,CAAC;AAEH,yBAAyB;AACzB,SAAS,kBAAkB,CACzB,gBAA2D,EAAE;IAE7D,OAAO;QACL,aAAa;QACb,YAAY,EAAE,EAAE;QAChB,yBAAyB,EAAE,EAAE;QAC7B,cAAc,EAAE,EAAE;QAClB,SAAS,EAAE,EAAE;QACb,cAAc,EAAE,IAAI;QACpB,iBAAiB,EAAE,IAAI,CAAC,EAAE,EAAE;QAC5B,YAAY,EAAE,IAAI,CAAC,EAAE,EAAE;QACvB,aAAa,EAAE,IAAI,CAAC,EAAE,EAAE;QACxB,kBAAkB,EAAE,IAAI,CAAC,EAAE,EAAE;QAC7B,iBAAiB,EAAE,IAAI,CAAC,EAAE,EAAE;QAC5B,kBAAkB,EAAE,IAAI,CAAC,EAAE,EAAE;QAC7B,gBAAgB,EAAE,IAAI,CAAC,EAAE,EAAE;QAC3B,iBAAiB,EAAE,IAAI,CAAC,EAAE,EAAE;QAC5B,sBAAsB,EAAE,IAAI,CAAC,EAAE,EAAE;KAClC,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,SAAS,sBAAsB,CAC7B,EAA4C;QAE5C,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,EAAE,CAAC;QAC1E,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,eAAe,CAAC,CAAC;QAC7B,CAAC;gBAAS,CAAC;YACT,eAAe,CAAC,WAAW,EAAE,CAAC;QAChC,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAuB;QACtC,IAAI,EAAE,WAAW;QACjB,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE;QAC/B,cAAc,EAAE,MAAM;KACvB,CAAC;IAEF,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,QAAQ,GAAG,kBAAkB,CAAC;YAClC,aAAa,EAAE;gBACb,IAAI,EAAE,eAAe;gBACrB,WAAW,EAAE,kBAAkB;gBAC/B,SAAS,EAAE,aAAa;gBACxB,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACzB,YAAY,EAAE,EAAE;aACjB;SACF,CAAC,CAAC;QAEH,IAAA,cAAM,EACJ,8BAAC,8CAAoB,CAAC,QAAQ,IAAC,KAAK,EAAE,QAAQ;YAC5C,8BAAC,2CAAmB,IAClB,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAC,YAAY,EACrB,SAAS,EAAC,SAAS,GACnB,CAC4B,CACjC,CAAC;QAEF,MAAM,CAAC,cAAM,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC;QACjE,MAAM,CAAC,cAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,QAAQ,GAAG,kBAAkB,CAAC,EAAE,CAAC,CAAC;QAExC,sBAAsB,CAAC,CAAC,eAAe,EAAE,EAAE;YACzC,IAAA,cAAM,EACJ,8BAAC,8CAAoB,CAAC,QAAQ,IAAC,KAAK,EAAE,QAAQ;gBAC5C,8BAAC,2CAAmB,IAClB,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAC,YAAY,EACrB,SAAS,EAAC,SAAS,EACnB,QAAQ,EAAE,sDAAiB,UAAU,gBAAgB,GACrD,CAC4B,CACjC,CAAC;YAEF,MAAM,CAAC,cAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC;YAC3D,MAAM,CAAC,cAAM,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;YAEvE,MAAM,CAAC,eAAe,CAAC,CAAC,oBAAoB,CAC1C,kDAAkD,EAClD,MAAM,CAAC,gBAAgB,CAAC;gBACtB,WAAW,EAAE,WAAW,CAAC,EAAE;gBAC3B,aAAa,EAAE,WAAW,CAAC,IAAI;aAChC,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mFAAmF,EAAE,GAAG,EAAE;QAC3F,MAAM,QAAQ,GAAG,kBAAkB,CAAC,EAAE,CAAC,CAAC;QAExC,sBAAsB,CAAC,CAAC,eAAe,EAAE,EAAE;YACzC,MAAM,EAAE,SAAS,EAAE,GAAG,IAAA,cAAM,EAC1B,8BAAC,8CAAoB,CAAC,QAAQ,IAAC,KAAK,EAAE,QAAQ;gBAC5C,8BAAC,2CAAmB,IAClB,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAC,YAAY,EACrB,SAAS,EAAC,SAAS,GACnB,CAC4B,CACjC,CAAC;YAEF,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAC;YAExC,MAAM,CAAC,eAAe,CAAC,CAAC,oBAAoB,CAC1C,kDAAkD,EAClD,MAAM,CAAC,gBAAgB,CAAC;gBACtB,WAAW,EAAE,WAAW,CAAC,EAAE;gBAC3B,aAAa,EAAE,WAAW,CAAC,IAAI;aAChC,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,QAAQ,GAAG,kBAAkB,CAAC;YAClC,aAAa,EAAE;gBACb,IAAI,EAAE,eAAe;gBACrB,WAAW,EAAE,kBAAkB;gBAC/B,SAAS,EAAE,aAAa;gBACxB,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACzB,YAAY,EAAE,EAAE;aACjB;SACF,CAAC,CAAC;QAEH,MAAM,OAAO,GAAuB;YAClC,IAAI,EAAE,WAAW;YACjB,EAAE,EAAE,UAAU;YACd,IAAI,EAAE,eAAe;YACrB,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE;YAC1C,cAAc,EAAE,MAAM;SACvB,CAAC;QAEF,IAAA,cAAM,EACJ,8BAAC,8CAAoB,CAAC,QAAQ,IAAC,KAAK,EAAE,QAAQ;YAC5C,8BAAC,2CAAmB,IAClB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAC,YAAY,EACrB,SAAS,EAAC,SAAS,GACnB,CAC4B,CACjC,CAAC;QAEF,MAAM,CAAC,cAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC9D,MAAM,CAAC,cAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC5B,MAAM,QAAQ,GAAG,kBAAkB,CAAC;YAClC,aAAa,EAAE;gBACb,IAAI,EAAE,eAAe;gBACrB,WAAW,EAAE,kBAAkB;gBAC/B,SAAS,EAAE,aAAa;gBACxB,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACzB,YAAY,EAAE,EAAE;aACjB;SACF,CAAC,CAAC;QAEH,MAAM,OAAO,GAAuB;YAClC,IAAI,EAAE,WAAW;YACjB,EAAE,EAAE,UAAU;YACd,IAAI,EAAE,eAAe;YACrB,KAAK,EAAE,IAAI;YACX,cAAc,EAAE,MAAM;SACvB,CAAC;QAEF,IAAA,cAAM,EACJ,8BAAC,8CAAoB,CAAC,QAAQ,IAAC,KAAK,EAAE,QAAQ;YAC5C,8BAAC,2CAAmB,IAClB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAC,YAAY,EACrB,SAAS,EAAC,SAAS,GACnB,CAC4B,CACjC,CAAC;QAEF,2CAA2C;QAC3C,MAAM,CAAC,cAAM,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,QAAQ,GAAG,kBAAkB,CAAC;YAClC,kBAAkB,EAAE;gBAClB,IAAI,EAAE,oBAAoB;gBAC1B,WAAW,EAAE,uBAAuB;gBACpC,SAAS,EAAE,kBAAkB;gBAC7B,2EAA2E;gBAC3E,KAAK,EAAE,wBAA8D;gBACrE,YAAY,EAAE,EAAE;aACjB;SACF,CAAC,CAAC;QAEH,MAAM,OAAO,GAAuB;YAClC,IAAI,EAAE,WAAW;YACjB,EAAE,EAAE,UAAU;YACd,IAAI,EAAE,oBAAoB;YAC1B,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE;YACjC,cAAc,EAAE,MAAM;SACvB,CAAC;QAEF,IAAA,cAAM,EACJ,8BAAC,8CAAoB,CAAC,QAAQ,IAAC,KAAK,EAAE,QAAQ;YAC5C,8BAAC,2CAAmB,IAClB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAC,YAAY,EACrB,SAAS,EAAC,SAAS,GACnB,CAC4B,CACjC,CAAC;QAEF,MAAM,CAAC,cAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC9D,MAAM,CAAC,cAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;QAC9E,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,EAAE,CAAC;QAEpE,MAAM,QAAQ,GAAG,kBAAkB,CAAC;YAClC,kBAAkB,EAAE;gBAClB,IAAI,EAAE,oBAAoB;gBAC1B,WAAW,EAAE,uBAAuB;gBACpC,SAAS,EAAE,kBAAkB;gBAC7B,2EAA2E;gBAC3E,KAAK,EAAE,wBAA8D;gBACrE,YAAY,EAAE,EAAE;aACjB;SACF,CAAC,CAAC;QAEH,MAAM,OAAO,GAAuB;YAClC,IAAI,EAAE,WAAW;YACjB,EAAE,EAAE,UAAU;YACd,IAAI,EAAE,oBAAoB;YAC1B,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,cAAc,EAAE,EAAE,gCAAgC;YAC7E,cAAc,EAAE,MAAM;SACvB,CAAC;QAEF,IAAA,cAAM,EACJ,8BAAC,8CAAoB,CAAC,QAAQ,IAAC,KAAK,EAAE,QAAQ;YAC5C,8BAAC,2CAAmB,IAClB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAC,YAAY,EACrB,SAAS,EAAC,SAAS,GACnB,CAC4B,CACjC,CAAC;QAEF,qCAAqC;QACrC,MAAM,CAAC,cAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC5D,MAAM,CAAC,cAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;QAEpE,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CACrC,MAAM,CAAC,gBAAgB,CAAC,yBAAyB,CAAC,EAClD,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CACnB,CAAC;QAEF,UAAU,CAAC,WAAW,EAAE,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,EAAE,CAAC;QAEpE,6BAA6B;QAC7B,MAAM,WAAW,GAAG;YAClB,WAAW,EAAE;gBACX,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;gBACd,QAAQ,EAAE,KAAK,IAAI,EAAE;oBACnB,OAAO,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;gBAC9C,CAAC;aACF;SACF,CAAC;QAEF,MAAM,QAAQ,GAAG,kBAAkB,CAAC;YAClC,aAAa,EAAE;gBACb,IAAI,EAAE,eAAe;gBACrB,WAAW,EAAE,kBAAkB;gBAC/B,SAAS,EAAE,aAAa;gBACxB,KAAK,EAAE,WAAW;gBAClB,YAAY,EAAE,EAAE;aACjB;SACF,CAAC,CAAC;QAEH,IAAA,cAAM,EACJ,8BAAC,8CAAoB,CAAC,QAAQ,IAAC,KAAK,EAAE,QAAQ;YAC5C,8BAAC,2CAAmB,IAClB,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAC,YAAY,EACrB,SAAS,EAAC,SAAS,GACnB,CAC4B,CACjC,CAAC;QAEF,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CACrC,MAAM,CAAC,gBAAgB,CAAC,uCAAuC,CAAC,CACjE,CAAC;QAEF,UAAU,CAAC,WAAW,EAAE,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,QAAQ,GAAG,kBAAkB,CAAC;YAClC,aAAa,EAAE;gBACb,IAAI,EAAE,eAAe;gBACrB,WAAW,EAAE,kBAAkB;gBAC/B,SAAS,EAAE,aAAa;gBACxB,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACzB,YAAY,EAAE,EAAE;aACjB;SACF,CAAC,CAAC;QAEH,0DAA0D;QAC1D,MAAM,OAAO,GAAuB;YAClC,IAAI,EAAE,WAAW;YACjB,EAAE,EAAE,UAAU;YACd,IAAI,EAAE,eAAe;YACrB,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;YAC3B,cAAc,EAAE,WAAW;SAC5B,CAAC;QAEF,IAAA,cAAM,EACJ,8BAAC,8CAAoB,CAAC,QAAQ,IAAC,KAAK,EAAE,QAAQ;YAC5C,8BAAC,2CAAmB,IAClB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAC,YAAY,EACrB,SAAS,EAAC,SAAS,GACnB,CAC4B,CACjC,CAAC;QAEF,MAAM,CAAC,cAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kFAAkF,EAAE,GAAG,EAAE;QAC1F,2CAA2C;QAC3C,MAAM,qBAAqB,GAAa,GAAG,EAAE;YAC3C,6EAA6E;YAC7E,yEAAyE;YACzE,OAAO,sDAAiB,eAAe,eAAe,CAAC;QACzD,CAAC,CAAC;QAEF,MAAM,QAAQ,GAAG,kBAAkB,CAAC;YAClC,qBAAqB,EAAE;gBACrB,IAAI,EAAE,uBAAuB;gBAC7B,WAAW,EAAE,2BAA2B;gBACxC,SAAS,EAAE,qBAAqB;gBAChC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACzB,YAAY,EAAE,EAAE;aACjB;SACF,CAAC,CAAC;QAEH,MAAM,OAAO,GAAuB;YAClC,IAAI,EAAE,WAAW;YACjB,EAAE,EAAE,UAAU;YACd,IAAI,EAAE,uBAAuB;YAC7B,KAAK,EAAE,EAAE;YACT,cAAc,EAAE,MAAM;SACvB,CAAC;QAEF,IAAA,cAAM,EACJ,8BAAC,8CAAoB,CAAC,QAAQ,IAAC,KAAK,EAAE,QAAQ;YAC5C,8BAAC,2CAAmB,IAClB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAC,YAAY,EACrB,SAAS,EAAC,SAAS,GACnB,CAC4B,CACjC,CAAC;QAEF,MAAM,CAAC,cAAM,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import React from \"react\";\nimport { render, screen } from \"@testing-library/react\";\nimport { z } from \"zod\";\nimport { V1ComponentRenderer } from \"./v1-component-renderer\";\nimport { TamboRegistryContext } from \"../../providers/tambo-registry-provider\";\nimport type { TamboRegistryContext as TamboRegistryContextType } from \"../../providers/tambo-registry-provider\";\nimport type { V1ComponentContent } from \"../types/message\";\n\n// Simple test component\nconst TestComponent: React.FC<{ title: string; count?: number }> = ({\n title,\n count,\n}) => (\n <div data-testid=\"test-component\">\n <span data-testid=\"title\">{title}</span>\n {count !== undefined && <span data-testid=\"count\">{count}</span>}\n </div>\n);\n\n// Component with Zod schema for validation\nconst ValidatedComponent: React.FC<{ name: string; age: number }> = ({\n name,\n age,\n}) => (\n <div data-testid=\"validated-component\">\n <span data-testid=\"name\">{name}</span>\n <span data-testid=\"age\">{age}</span>\n </div>\n);\n\nconst validatedComponentSchema = z.object({\n name: z.string(),\n age: z.number(),\n});\n\n// Create a mock registry\nfunction createMockRegistry(\n componentList: TamboRegistryContextType[\"componentList\"] = {},\n): TamboRegistryContextType {\n return {\n componentList,\n toolRegistry: {},\n componentToolAssociations: {},\n mcpServerInfos: [],\n resources: [],\n resourceSource: null,\n registerComponent: jest.fn(),\n registerTool: jest.fn(),\n registerTools: jest.fn(),\n addToolAssociation: jest.fn(),\n registerMcpServer: jest.fn(),\n registerMcpServers: jest.fn(),\n registerResource: jest.fn(),\n registerResources: jest.fn(),\n registerResourceSource: jest.fn(),\n };\n}\n\ndescribe(\"V1ComponentRenderer\", () => {\n function withMockedConsoleError<T>(\n fn: (consoleErrorSpy: jest.SpyInstance) => T,\n ): T {\n const consoleErrorSpy = jest.spyOn(console, \"error\").mockImplementation();\n try {\n return fn(consoleErrorSpy);\n } finally {\n consoleErrorSpy.mockRestore();\n }\n }\n\n const baseContent: V1ComponentContent = {\n type: \"component\",\n id: \"comp_123\",\n name: \"TestComponent\",\n props: { title: \"Hello World\" },\n streamingState: \"done\",\n };\n\n it(\"renders component from registry with props\", () => {\n const registry = createMockRegistry({\n TestComponent: {\n name: \"TestComponent\",\n description: \"A test component\",\n component: TestComponent,\n props: { type: \"object\" },\n contextTools: [],\n },\n });\n\n render(\n <TamboRegistryContext.Provider value={registry}>\n <V1ComponentRenderer\n content={baseContent}\n threadId=\"thread_123\"\n messageId=\"msg_456\"\n />\n </TamboRegistryContext.Provider>,\n );\n\n expect(screen.getByTestId(\"test-component\")).toBeInTheDocument();\n expect(screen.getByTestId(\"title\")).toHaveTextContent(\"Hello World\");\n });\n\n it(\"renders fallback when component not found in registry\", () => {\n const registry = createMockRegistry({});\n\n withMockedConsoleError((consoleErrorSpy) => {\n render(\n <TamboRegistryContext.Provider value={registry}>\n <V1ComponentRenderer\n content={baseContent}\n threadId=\"thread_123\"\n messageId=\"msg_456\"\n fallback={<div data-testid=\"fallback\">Not found</div>}\n />\n </TamboRegistryContext.Provider>,\n );\n\n expect(screen.getByTestId(\"fallback\")).toBeInTheDocument();\n expect(screen.queryByTestId(\"test-component\")).not.toBeInTheDocument();\n\n expect(consoleErrorSpy).toHaveBeenCalledWith(\n \"[V1ComponentRenderer] Failed to render component\",\n expect.objectContaining({\n componentId: baseContent.id,\n componentName: baseContent.name,\n }),\n );\n });\n });\n\n it(\"renders nothing (null fallback) when component not found and no fallback provided\", () => {\n const registry = createMockRegistry({});\n\n withMockedConsoleError((consoleErrorSpy) => {\n const { container } = render(\n <TamboRegistryContext.Provider value={registry}>\n <V1ComponentRenderer\n content={baseContent}\n threadId=\"thread_123\"\n messageId=\"msg_456\"\n />\n </TamboRegistryContext.Provider>,\n );\n\n expect(container.firstChild).toBeNull();\n\n expect(consoleErrorSpy).toHaveBeenCalledWith(\n \"[V1ComponentRenderer] Failed to render component\",\n expect.objectContaining({\n componentId: baseContent.id,\n componentName: baseContent.name,\n }),\n );\n });\n });\n\n it(\"handles props with undefined values\", () => {\n const registry = createMockRegistry({\n TestComponent: {\n name: \"TestComponent\",\n description: \"A test component\",\n component: TestComponent,\n props: { type: \"object\" },\n contextTools: [],\n },\n });\n\n const content: V1ComponentContent = {\n type: \"component\",\n id: \"comp_123\",\n name: \"TestComponent\",\n props: { title: \"Test\", count: undefined },\n streamingState: \"done\",\n };\n\n render(\n <TamboRegistryContext.Provider value={registry}>\n <V1ComponentRenderer\n content={content}\n threadId=\"thread_123\"\n messageId=\"msg_456\"\n />\n </TamboRegistryContext.Provider>,\n );\n\n expect(screen.getByTestId(\"title\")).toHaveTextContent(\"Test\");\n expect(screen.queryByTestId(\"count\")).not.toBeInTheDocument();\n });\n\n it(\"handles null props\", () => {\n const registry = createMockRegistry({\n TestComponent: {\n name: \"TestComponent\",\n description: \"A test component\",\n component: TestComponent,\n props: { type: \"object\" },\n contextTools: [],\n },\n });\n\n const content: V1ComponentContent = {\n type: \"component\",\n id: \"comp_123\",\n name: \"TestComponent\",\n props: null,\n streamingState: \"done\",\n };\n\n render(\n <TamboRegistryContext.Provider value={registry}>\n <V1ComponentRenderer\n content={content}\n threadId=\"thread_123\"\n messageId=\"msg_456\"\n />\n </TamboRegistryContext.Provider>,\n );\n\n // Component should render with empty props\n expect(screen.getByTestId(\"test-component\")).toBeInTheDocument();\n });\n\n it(\"validates props with StandardSchema and uses validated values\", () => {\n const registry = createMockRegistry({\n ValidatedComponent: {\n name: \"ValidatedComponent\",\n description: \"A validated component\",\n component: ValidatedComponent,\n // Cast as unknown to satisfy TypeScript while still providing a Zod schema\n props: validatedComponentSchema as unknown as Record<string, unknown>,\n contextTools: [],\n },\n });\n\n const content: V1ComponentContent = {\n type: \"component\",\n id: \"comp_123\",\n name: \"ValidatedComponent\",\n props: { name: \"Alice\", age: 30 },\n streamingState: \"done\",\n };\n\n render(\n <TamboRegistryContext.Provider value={registry}>\n <V1ComponentRenderer\n content={content}\n threadId=\"thread_123\"\n messageId=\"msg_456\"\n />\n </TamboRegistryContext.Provider>,\n );\n\n expect(screen.getByTestId(\"name\")).toHaveTextContent(\"Alice\");\n expect(screen.getByTestId(\"age\")).toHaveTextContent(\"30\");\n });\n\n it(\"logs warning and renders with raw props when schema validation fails\", () => {\n const consoleSpy = jest.spyOn(console, \"warn\").mockImplementation();\n\n const registry = createMockRegistry({\n ValidatedComponent: {\n name: \"ValidatedComponent\",\n description: \"A validated component\",\n component: ValidatedComponent,\n // Cast as unknown to satisfy TypeScript while still providing a Zod schema\n props: validatedComponentSchema as unknown as Record<string, unknown>,\n contextTools: [],\n },\n });\n\n const content: V1ComponentContent = {\n type: \"component\",\n id: \"comp_123\",\n name: \"ValidatedComponent\",\n props: { name: \"Bob\", age: \"not a number\" }, // Invalid: age should be number\n streamingState: \"done\",\n };\n\n render(\n <TamboRegistryContext.Provider value={registry}>\n <V1ComponentRenderer\n content={content}\n threadId=\"thread_123\"\n messageId=\"msg_456\"\n />\n </TamboRegistryContext.Provider>,\n );\n\n // Should still render with raw props\n expect(screen.getByTestId(\"name\")).toHaveTextContent(\"Bob\");\n expect(screen.getByTestId(\"age\")).toHaveTextContent(\"not a number\");\n\n expect(consoleSpy).toHaveBeenCalledWith(\n expect.stringContaining(\"Props validation failed\"),\n expect.any(String),\n );\n\n consoleSpy.mockRestore();\n });\n\n it(\"logs warning for async schema validation\", () => {\n const consoleSpy = jest.spyOn(console, \"warn\").mockImplementation();\n\n // Create a mock async schema\n const asyncSchema = {\n \"~standard\": {\n version: 1,\n vendor: \"test\",\n validate: async () => {\n return await Promise.resolve({ value: {} });\n },\n },\n };\n\n const registry = createMockRegistry({\n TestComponent: {\n name: \"TestComponent\",\n description: \"A test component\",\n component: TestComponent,\n props: asyncSchema,\n contextTools: [],\n },\n });\n\n render(\n <TamboRegistryContext.Provider value={registry}>\n <V1ComponentRenderer\n content={baseContent}\n threadId=\"thread_123\"\n messageId=\"msg_456\"\n />\n </TamboRegistryContext.Provider>,\n );\n\n expect(consoleSpy).toHaveBeenCalledWith(\n expect.stringContaining(\"Async schema validation not supported\"),\n );\n\n consoleSpy.mockRestore();\n });\n\n it(\"handles partial JSON during streaming\", () => {\n const registry = createMockRegistry({\n TestComponent: {\n name: \"TestComponent\",\n description: \"A test component\",\n component: TestComponent,\n props: { type: \"object\" },\n contextTools: [],\n },\n });\n\n // partial-json library handles incomplete JSON gracefully\n const content: V1ComponentContent = {\n type: \"component\",\n id: \"comp_123\",\n name: \"TestComponent\",\n props: { title: \"Partial\" },\n streamingState: \"streaming\",\n };\n\n render(\n <TamboRegistryContext.Provider value={registry}>\n <V1ComponentRenderer\n content={content}\n threadId=\"thread_123\"\n messageId=\"msg_456\"\n />\n </TamboRegistryContext.Provider>,\n );\n\n expect(screen.getByTestId(\"title\")).toHaveTextContent(\"Partial\");\n });\n\n it(\"provides component context to rendered components via V1ComponentContentProvider\", () => {\n // Create a component that uses the context\n const ContextAwareComponent: React.FC = () => {\n // We can't directly test the context without importing useV1ComponentContent\n // but we can verify the component renders which means the provider works\n return <div data-testid=\"context-aware\">Rendered</div>;\n };\n\n const registry = createMockRegistry({\n ContextAwareComponent: {\n name: \"ContextAwareComponent\",\n description: \"A context aware component\",\n component: ContextAwareComponent,\n props: { type: \"object\" },\n contextTools: [],\n },\n });\n\n const content: V1ComponentContent = {\n type: \"component\",\n id: \"comp_789\",\n name: \"ContextAwareComponent\",\n props: {},\n streamingState: \"done\",\n };\n\n render(\n <TamboRegistryContext.Provider value={registry}>\n <V1ComponentRenderer\n content={content}\n threadId=\"thread_abc\"\n messageId=\"msg_def\"\n />\n </TamboRegistryContext.Provider>,\n );\n\n expect(screen.getByTestId(\"context-aware\")).toBeInTheDocument();\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"v1-component-renderer.test.js","sourceRoot":"","sources":["../../../src/v1/components/v1-component-renderer.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from \"react\";\nimport { render, screen } from \"@testing-library/react\";\nimport { z } from \"zod\";\nimport { ComponentRenderer } from \"./v1-component-renderer\";\nimport { TamboRegistryContext } from \"../../providers/tambo-registry-provider\";\nimport type { TamboRegistryContext as TamboRegistryContextType } from \"../../providers/tambo-registry-provider\";\nimport type { TamboComponentContent } from \"../types/message\";\n\n// Simple test component\nconst TestComponent: React.FC<{ title: string; count?: number }> = ({\n title,\n count,\n}) => (\n <div data-testid=\"test-component\">\n <span data-testid=\"title\">{title}</span>\n {count !== undefined && <span data-testid=\"count\">{count}</span>}\n </div>\n);\n\n// Component with Zod schema for validation\nconst ValidatedComponent: React.FC<{ name: string; age: number }> = ({\n name,\n age,\n}) => (\n <div data-testid=\"validated-component\">\n <span data-testid=\"name\">{name}</span>\n <span data-testid=\"age\">{age}</span>\n </div>\n);\n\nconst validatedComponentSchema = z.object({\n name: z.string(),\n age: z.number(),\n});\n\n// Create a mock registry\nfunction createMockRegistry(\n componentList: TamboRegistryContextType[\"componentList\"] = {},\n): TamboRegistryContextType {\n return {\n componentList,\n toolRegistry: {},\n componentToolAssociations: {},\n mcpServerInfos: [],\n resources: [],\n resourceSource: null,\n registerComponent: jest.fn(),\n registerTool: jest.fn(),\n registerTools: jest.fn(),\n addToolAssociation: jest.fn(),\n registerMcpServer: jest.fn(),\n registerMcpServers: jest.fn(),\n registerResource: jest.fn(),\n registerResources: jest.fn(),\n registerResourceSource: jest.fn(),\n };\n}\n\ndescribe(\"ComponentRenderer\", () => {\n function withMockedConsoleError<T>(\n fn: (consoleErrorSpy: jest.SpyInstance) => T,\n ): T {\n const consoleErrorSpy = jest.spyOn(console, \"error\").mockImplementation();\n try {\n return fn(consoleErrorSpy);\n } finally {\n consoleErrorSpy.mockRestore();\n }\n }\n\n const baseContent: TamboComponentContent = {\n type: \"component\",\n id: \"comp_123\",\n name: \"TestComponent\",\n props: { title: \"Hello World\" },\n streamingState: \"done\",\n };\n\n it(\"renders component from registry with props\", () => {\n const registry = createMockRegistry({\n TestComponent: {\n name: \"TestComponent\",\n description: \"A test component\",\n component: TestComponent,\n props: { type: \"object\" },\n contextTools: [],\n },\n });\n\n render(\n <TamboRegistryContext.Provider value={registry}>\n <ComponentRenderer\n content={baseContent}\n threadId=\"thread_123\"\n messageId=\"msg_456\"\n />\n </TamboRegistryContext.Provider>,\n );\n\n expect(screen.getByTestId(\"test-component\")).toBeInTheDocument();\n expect(screen.getByTestId(\"title\")).toHaveTextContent(\"Hello World\");\n });\n\n it(\"renders fallback when component not found in registry\", () => {\n const registry = createMockRegistry({});\n\n withMockedConsoleError((consoleErrorSpy) => {\n render(\n <TamboRegistryContext.Provider value={registry}>\n <ComponentRenderer\n content={baseContent}\n threadId=\"thread_123\"\n messageId=\"msg_456\"\n fallback={<div data-testid=\"fallback\">Not found</div>}\n />\n </TamboRegistryContext.Provider>,\n );\n\n expect(screen.getByTestId(\"fallback\")).toBeInTheDocument();\n expect(screen.queryByTestId(\"test-component\")).not.toBeInTheDocument();\n\n expect(consoleErrorSpy).toHaveBeenCalledWith(\n \"[ComponentRenderer] Failed to render component\",\n expect.objectContaining({\n componentId: baseContent.id,\n componentName: baseContent.name,\n }),\n );\n });\n });\n\n it(\"renders nothing (null fallback) when component not found and no fallback provided\", () => {\n const registry = createMockRegistry({});\n\n withMockedConsoleError((consoleErrorSpy) => {\n const { container } = render(\n <TamboRegistryContext.Provider value={registry}>\n <ComponentRenderer\n content={baseContent}\n threadId=\"thread_123\"\n messageId=\"msg_456\"\n />\n </TamboRegistryContext.Provider>,\n );\n\n expect(container.firstChild).toBeNull();\n\n expect(consoleErrorSpy).toHaveBeenCalledWith(\n \"[ComponentRenderer] Failed to render component\",\n expect.objectContaining({\n componentId: baseContent.id,\n componentName: baseContent.name,\n }),\n );\n });\n });\n\n it(\"handles props with undefined values\", () => {\n const registry = createMockRegistry({\n TestComponent: {\n name: \"TestComponent\",\n description: \"A test component\",\n component: TestComponent,\n props: { type: \"object\" },\n contextTools: [],\n },\n });\n\n const content: TamboComponentContent = {\n type: \"component\",\n id: \"comp_123\",\n name: \"TestComponent\",\n props: { title: \"Test\", count: undefined },\n streamingState: \"done\",\n };\n\n render(\n <TamboRegistryContext.Provider value={registry}>\n <ComponentRenderer\n content={content}\n threadId=\"thread_123\"\n messageId=\"msg_456\"\n />\n </TamboRegistryContext.Provider>,\n );\n\n expect(screen.getByTestId(\"title\")).toHaveTextContent(\"Test\");\n expect(screen.queryByTestId(\"count\")).not.toBeInTheDocument();\n });\n\n it(\"handles null props\", () => {\n const registry = createMockRegistry({\n TestComponent: {\n name: \"TestComponent\",\n description: \"A test component\",\n component: TestComponent,\n props: { type: \"object\" },\n contextTools: [],\n },\n });\n\n const content: TamboComponentContent = {\n type: \"component\",\n id: \"comp_123\",\n name: \"TestComponent\",\n props: null,\n streamingState: \"done\",\n };\n\n render(\n <TamboRegistryContext.Provider value={registry}>\n <ComponentRenderer\n content={content}\n threadId=\"thread_123\"\n messageId=\"msg_456\"\n />\n </TamboRegistryContext.Provider>,\n );\n\n // Component should render with empty props\n expect(screen.getByTestId(\"test-component\")).toBeInTheDocument();\n });\n\n it(\"validates props with StandardSchema and uses validated values\", () => {\n const registry = createMockRegistry({\n ValidatedComponent: {\n name: \"ValidatedComponent\",\n description: \"A validated component\",\n component: ValidatedComponent,\n // Cast as unknown to satisfy TypeScript while still providing a Zod schema\n props: validatedComponentSchema as unknown as Record<string, unknown>,\n contextTools: [],\n },\n });\n\n const content: TamboComponentContent = {\n type: \"component\",\n id: \"comp_123\",\n name: \"ValidatedComponent\",\n props: { name: \"Alice\", age: 30 },\n streamingState: \"done\",\n };\n\n render(\n <TamboRegistryContext.Provider value={registry}>\n <ComponentRenderer\n content={content}\n threadId=\"thread_123\"\n messageId=\"msg_456\"\n />\n </TamboRegistryContext.Provider>,\n );\n\n expect(screen.getByTestId(\"name\")).toHaveTextContent(\"Alice\");\n expect(screen.getByTestId(\"age\")).toHaveTextContent(\"30\");\n });\n\n it(\"logs warning and renders with raw props when schema validation fails\", () => {\n const consoleSpy = jest.spyOn(console, \"warn\").mockImplementation();\n\n const registry = createMockRegistry({\n ValidatedComponent: {\n name: \"ValidatedComponent\",\n description: \"A validated component\",\n component: ValidatedComponent,\n // Cast as unknown to satisfy TypeScript while still providing a Zod schema\n props: validatedComponentSchema as unknown as Record<string, unknown>,\n contextTools: [],\n },\n });\n\n const content: TamboComponentContent = {\n type: \"component\",\n id: \"comp_123\",\n name: \"ValidatedComponent\",\n props: { name: \"Bob\", age: \"not a number\" }, // Invalid: age should be number\n streamingState: \"done\",\n };\n\n render(\n <TamboRegistryContext.Provider value={registry}>\n <ComponentRenderer\n content={content}\n threadId=\"thread_123\"\n messageId=\"msg_456\"\n />\n </TamboRegistryContext.Provider>,\n );\n\n // Should still render with raw props\n expect(screen.getByTestId(\"name\")).toHaveTextContent(\"Bob\");\n expect(screen.getByTestId(\"age\")).toHaveTextContent(\"not a number\");\n\n expect(consoleSpy).toHaveBeenCalledWith(\n expect.stringContaining(\"Props validation failed\"),\n expect.any(String),\n );\n\n consoleSpy.mockRestore();\n });\n\n it(\"logs warning for async schema validation\", () => {\n const consoleSpy = jest.spyOn(console, \"warn\").mockImplementation();\n\n // Create a mock async schema\n const asyncSchema = {\n \"~standard\": {\n version: 1,\n vendor: \"test\",\n validate: async () => {\n return await Promise.resolve({ value: {} });\n },\n },\n };\n\n const registry = createMockRegistry({\n TestComponent: {\n name: \"TestComponent\",\n description: \"A test component\",\n component: TestComponent,\n props: asyncSchema,\n contextTools: [],\n },\n });\n\n render(\n <TamboRegistryContext.Provider value={registry}>\n <ComponentRenderer\n content={baseContent}\n threadId=\"thread_123\"\n messageId=\"msg_456\"\n />\n </TamboRegistryContext.Provider>,\n );\n\n expect(consoleSpy).toHaveBeenCalledWith(\n expect.stringContaining(\"Async schema validation not supported\"),\n );\n\n consoleSpy.mockRestore();\n });\n\n it(\"handles partial JSON during streaming\", () => {\n const registry = createMockRegistry({\n TestComponent: {\n name: \"TestComponent\",\n description: \"A test component\",\n component: TestComponent,\n props: { type: \"object\" },\n contextTools: [],\n },\n });\n\n // partial-json library handles incomplete JSON gracefully\n const content: TamboComponentContent = {\n type: \"component\",\n id: \"comp_123\",\n name: \"TestComponent\",\n props: { title: \"Partial\" },\n streamingState: \"streaming\",\n };\n\n render(\n <TamboRegistryContext.Provider value={registry}>\n <ComponentRenderer\n content={content}\n threadId=\"thread_123\"\n messageId=\"msg_456\"\n />\n </TamboRegistryContext.Provider>,\n );\n\n expect(screen.getByTestId(\"title\")).toHaveTextContent(\"Partial\");\n });\n\n it(\"provides component context to rendered components via TamboComponentContentProvider\", () => {\n // Create a component that uses the context\n const ContextAwareComponent: React.FC = () => {\n // We can't directly test the context without importing useTamboComponentContent\n // but we can verify the component renders which means the provider works\n return <div data-testid=\"context-aware\">Rendered</div>;\n };\n\n const registry = createMockRegistry({\n ContextAwareComponent: {\n name: \"ContextAwareComponent\",\n description: \"A context aware component\",\n component: ContextAwareComponent,\n props: { type: \"object\" },\n contextTools: [],\n },\n });\n\n const content: TamboComponentContent = {\n type: \"component\",\n id: \"comp_789\",\n name: \"ContextAwareComponent\",\n props: {},\n streamingState: \"done\",\n };\n\n render(\n <TamboRegistryContext.Provider value={registry}>\n <ComponentRenderer\n content={content}\n threadId=\"thread_abc\"\n messageId=\"msg_def\"\n />\n </TamboRegistryContext.Provider>,\n );\n\n expect(screen.getByTestId(\"context-aware\")).toBeInTheDocument();\n });\n});\n"]}
|
|
@@ -1,6 +1,23 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import {
|
|
3
|
-
|
|
2
|
+
import type { InteractableConfig } from "../../hoc/with-tambo-interactable";
|
|
3
|
+
import type { TamboThreadMessage } from "../types/message";
|
|
4
|
+
/**
|
|
5
|
+
* Metadata for interactable components.
|
|
6
|
+
* Used when a component is wrapped with withTamboInteractable.
|
|
7
|
+
*/
|
|
8
|
+
export interface InteractableMetadata extends InteractableConfig {
|
|
9
|
+
/** Unique identifier for this interactable instance */
|
|
10
|
+
id: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Message with optional interactable metadata merged in by the provider.
|
|
14
|
+
* Used as the context type so consumers can access both the message and
|
|
15
|
+
* any interactable information attached by withTamboInteractable.
|
|
16
|
+
*/
|
|
17
|
+
type MessageWithMetadata = TamboThreadMessage & {
|
|
18
|
+
interactableMetadata?: InteractableMetadata;
|
|
19
|
+
};
|
|
20
|
+
export declare const TamboMessageContext: React.Context<MessageWithMetadata | null>;
|
|
4
21
|
export interface TamboMessageProviderProps {
|
|
5
22
|
children: React.ReactNode;
|
|
6
23
|
message: TamboThreadMessage;
|
|
@@ -8,9 +25,9 @@ export interface TamboMessageProviderProps {
|
|
|
8
25
|
interactableMetadata?: InteractableMetadata;
|
|
9
26
|
}
|
|
10
27
|
/**
|
|
11
|
-
* Wraps all components
|
|
28
|
+
* Wraps all components so that they can find what message they are in.
|
|
12
29
|
* Also supports optional interactable metadata for components wrapped with withInteractable.
|
|
13
|
-
* @param props -
|
|
30
|
+
* @param props - Props for the TamboMessageProvider
|
|
14
31
|
* @param props.children - The children to wrap
|
|
15
32
|
* @param props.message - The message object
|
|
16
33
|
* @param props.interactableMetadata - Optional interactable component metadata
|
|
@@ -19,7 +36,7 @@ export interface TamboMessageProviderProps {
|
|
|
19
36
|
export declare const TamboMessageProvider: React.FC<TamboMessageProviderProps>;
|
|
20
37
|
/**
|
|
21
38
|
* Wraps a component with a TamboMessageProvider - this allows the provider
|
|
22
|
-
* to be used outside of a TSX file
|
|
39
|
+
* to be used outside of a TSX file.
|
|
23
40
|
* @param children - The children to wrap
|
|
24
41
|
* @param message - The message object
|
|
25
42
|
* @param interactableMetadata - Optional interactable metadata
|
|
@@ -31,7 +48,7 @@ export declare function wrapWithTamboMessageProvider(children: React.ReactNode,
|
|
|
31
48
|
* the current message.
|
|
32
49
|
* @returns The current message that is used to render the component
|
|
33
50
|
*/
|
|
34
|
-
export declare const useTamboCurrentMessage: () =>
|
|
51
|
+
export declare const useTamboCurrentMessage: () => MessageWithMetadata;
|
|
35
52
|
/**
|
|
36
53
|
* Component info extracted from the current message and interactable context.
|
|
37
54
|
* Provides a unified interface for accessing component metadata.
|
|
@@ -40,18 +57,21 @@ export interface TamboCurrentComponent {
|
|
|
40
57
|
/** Component name from the message */
|
|
41
58
|
componentName?: string;
|
|
42
59
|
/** Component props from the message */
|
|
43
|
-
props?: Record<string,
|
|
60
|
+
props?: Record<string, unknown>;
|
|
44
61
|
/** Interactable ID (only present for components wrapped with withInteractable) */
|
|
45
62
|
interactableId?: string;
|
|
46
63
|
/** Description (only present for components wrapped with withInteractable) */
|
|
47
64
|
description?: string;
|
|
48
|
-
/** Thread ID
|
|
65
|
+
/** Thread ID (not available on messages directly) */
|
|
49
66
|
threadId?: string;
|
|
50
67
|
}
|
|
51
68
|
/**
|
|
52
69
|
* Hook to access the current component information from the message context.
|
|
53
70
|
* Provides a unified interface for both AI-generated and interactable components.
|
|
54
71
|
*
|
|
72
|
+
* Component info is derived from content blocks rather than
|
|
73
|
+
* top-level message fields.
|
|
74
|
+
*
|
|
55
75
|
* **Use this hook when you need component metadata regardless of the context.**
|
|
56
76
|
* @returns Component info including name, props, and interactable metadata if available, or null if used outside TamboMessageProvider
|
|
57
77
|
* @example
|
|
@@ -71,4 +91,5 @@ export interface TamboCurrentComponent {
|
|
|
71
91
|
* ```
|
|
72
92
|
*/
|
|
73
93
|
export declare const useTamboCurrentComponent: () => TamboCurrentComponent | null;
|
|
74
|
-
|
|
94
|
+
export {};
|
|
95
|
+
//# sourceMappingURL=use-tambo-current-message.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-tambo-current-message.d.ts","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-current-message.tsx"],"names":[],"mappings":"AACA,OAAO,KAAoC,MAAM,OAAO,CAAC;AACzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAC5E,OAAO,KAAK,EACV,kBAAkB,EAEnB,MAAM,kBAAkB,CAAC;AAE1B;;;GAGG;AACH,MAAM,WAAW,oBAAqB,SAAQ,kBAAkB;IAC9D,uDAAuD;IACvD,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;;;GAIG;AACH,KAAK,mBAAmB,GAAG,kBAAkB,GAAG;IAC9C,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC7C,CAAC;AAEF,eAAO,MAAM,mBAAmB,2CAE/B,CAAC;AAEF,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,OAAO,EAAE,kBAAkB,CAAC;IAC5B,kFAAkF;IAClF,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC7C;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,EAAE,KAAK,CAAC,EAAE,CAAC,yBAAyB,CAkBpE,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,KAAK,CAAC,SAAS,EACzB,OAAO,EAAE,kBAAkB,EAC3B,oBAAoB,CAAC,EAAE,oBAAoB,qBAU5C;AAED;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,2BAQlC,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,sCAAsC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,kFAAkF;IAClF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,wBAAwB,QAAO,qBAAqB,GAAG,IAsBnE,CAAC"}
|
|
@@ -39,9 +39,9 @@ exports.wrapWithTamboMessageProvider = wrapWithTamboMessageProvider;
|
|
|
39
39
|
const react_1 = __importStar(require("react"));
|
|
40
40
|
exports.TamboMessageContext = (0, react_1.createContext)(null);
|
|
41
41
|
/**
|
|
42
|
-
* Wraps all components
|
|
42
|
+
* Wraps all components so that they can find what message they are in.
|
|
43
43
|
* Also supports optional interactable metadata for components wrapped with withInteractable.
|
|
44
|
-
* @param props -
|
|
44
|
+
* @param props - Props for the TamboMessageProvider
|
|
45
45
|
* @param props.children - The children to wrap
|
|
46
46
|
* @param props.message - The message object
|
|
47
47
|
* @param props.interactableMetadata - Optional interactable component metadata
|
|
@@ -53,14 +53,14 @@ const TamboMessageProvider = ({ children, message, interactableMetadata, }) => {
|
|
|
53
53
|
? { ...message, interactableMetadata }
|
|
54
54
|
: message;
|
|
55
55
|
// Use a unique key={...} to force a re-render when the message changes - this
|
|
56
|
-
//
|
|
56
|
+
// makes sure that if the rendered component is swapped into a tree (like if
|
|
57
57
|
// you always show the last rendered component) then the state/etc is correct
|
|
58
58
|
return (react_1.default.createElement(exports.TamboMessageContext.Provider, { value: enhancedMessage, key: message.id }, children));
|
|
59
59
|
};
|
|
60
60
|
exports.TamboMessageProvider = TamboMessageProvider;
|
|
61
61
|
/**
|
|
62
62
|
* Wraps a component with a TamboMessageProvider - this allows the provider
|
|
63
|
-
* to be used outside of a TSX file
|
|
63
|
+
* to be used outside of a TSX file.
|
|
64
64
|
* @param children - The children to wrap
|
|
65
65
|
* @param message - The message object
|
|
66
66
|
* @param interactableMetadata - Optional interactable metadata
|
|
@@ -86,6 +86,9 @@ exports.useTamboCurrentMessage = useTamboCurrentMessage;
|
|
|
86
86
|
* Hook to access the current component information from the message context.
|
|
87
87
|
* Provides a unified interface for both AI-generated and interactable components.
|
|
88
88
|
*
|
|
89
|
+
* Component info is derived from content blocks rather than
|
|
90
|
+
* top-level message fields.
|
|
91
|
+
*
|
|
89
92
|
* **Use this hook when you need component metadata regardless of the context.**
|
|
90
93
|
* @returns Component info including name, props, and interactable metadata if available, or null if used outside TamboMessageProvider
|
|
91
94
|
* @example
|
|
@@ -109,15 +112,17 @@ const useTamboCurrentComponent = () => {
|
|
|
109
112
|
if (!message) {
|
|
110
113
|
return null;
|
|
111
114
|
}
|
|
115
|
+
// Find first component content block
|
|
116
|
+
const componentContent = message.content.find((c) => c.type === "component");
|
|
112
117
|
return {
|
|
113
118
|
componentName: message.interactableMetadata?.componentName ??
|
|
114
|
-
|
|
119
|
+
componentContent?.name ??
|
|
115
120
|
undefined,
|
|
116
|
-
props:
|
|
121
|
+
props: componentContent?.props,
|
|
117
122
|
interactableId: message.interactableMetadata?.id ?? undefined,
|
|
118
123
|
description: message.interactableMetadata?.description ?? undefined,
|
|
119
|
-
threadId:
|
|
124
|
+
threadId: undefined, // Messages don't carry threadId
|
|
120
125
|
};
|
|
121
126
|
};
|
|
122
127
|
exports.useTamboCurrentComponent = useTamboCurrentComponent;
|
|
123
|
-
//# sourceMappingURL=use-current-message.js.map
|
|
128
|
+
//# sourceMappingURL=use-tambo-current-message.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-tambo-current-message.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-current-message.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0Eb,oEAaC;AAtFD,+CAAyD;AAyB5C,QAAA,mBAAmB,GAAG,IAAA,qBAAa,EAC9C,IAAI,CACL,CAAC;AASF;;;;;;;;GAQG;AACI,MAAM,oBAAoB,GAAwC,CAAC,EACxE,QAAQ,EACR,OAAO,EACP,oBAAoB,GACrB,EAAE,EAAE;IACH,uDAAuD;IACvD,MAAM,eAAe,GAAwB,oBAAoB;QAC/D,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,oBAAoB,EAAE;QACtC,CAAC,CAAC,OAAO,CAAC;IAEZ,8EAA8E;IAC9E,4EAA4E;IAC5E,6EAA6E;IAC7E,OAAO,CACL,8BAAC,2BAAmB,CAAC,QAAQ,IAAC,KAAK,EAAE,eAAe,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,IAClE,QAAQ,CACoB,CAChC,CAAC;AACJ,CAAC,CAAC;AAlBW,QAAA,oBAAoB,wBAkB/B;AAEF;;;;;;;GAOG;AACH,SAAgB,4BAA4B,CAC1C,QAAyB,EACzB,OAA2B,EAC3B,oBAA2C;IAE3C,OAAO,CACL,8BAAC,4BAAoB,IACnB,OAAO,EAAE,OAAO,EAChB,oBAAoB,EAAE,oBAAoB,IAEzC,QAAQ,CACY,CACxB,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACI,MAAM,sBAAsB,GAAG,GAAG,EAAE;IACzC,MAAM,OAAO,GAAG,IAAA,kBAAU,EAAC,2BAAmB,CAAC,CAAC;IAChD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,mEAAmE,CACpE,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AARW,QAAA,sBAAsB,0BAQjC;AAmBF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACI,MAAM,wBAAwB,GAAG,GAAiC,EAAE;IACzE,MAAM,OAAO,GAAG,IAAA,kBAAU,EAAC,2BAAmB,CAAC,CAAC;IAEhD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED,qCAAqC;IACrC,MAAM,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAC3C,CAAC,CAAC,EAA8B,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAC1D,CAAC;IAEF,OAAO;QACL,aAAa,EACX,OAAO,CAAC,oBAAoB,EAAE,aAAa;YAC3C,gBAAgB,EAAE,IAAI;YACtB,SAAS;QACX,KAAK,EAAE,gBAAgB,EAAE,KAA4C;QACrE,cAAc,EAAE,OAAO,CAAC,oBAAoB,EAAE,EAAE,IAAI,SAAS;QAC7D,WAAW,EAAE,OAAO,CAAC,oBAAoB,EAAE,WAAW,IAAI,SAAS;QACnE,QAAQ,EAAE,SAAS,EAAE,gCAAgC;KACtD,CAAC;AACJ,CAAC,CAAC;AAtBW,QAAA,wBAAwB,4BAsBnC","sourcesContent":["\"use client\";\nimport React, { createContext, useContext } from \"react\";\nimport type { InteractableConfig } from \"../../hoc/with-tambo-interactable\";\nimport type {\n TamboThreadMessage,\n TamboComponentContent,\n} from \"../types/message\";\n\n/**\n * Metadata for interactable components.\n * Used when a component is wrapped with withTamboInteractable.\n */\nexport interface InteractableMetadata extends InteractableConfig {\n /** Unique identifier for this interactable instance */\n id: string;\n}\n\n/**\n * Message with optional interactable metadata merged in by the provider.\n * Used as the context type so consumers can access both the message and\n * any interactable information attached by withTamboInteractable.\n */\ntype MessageWithMetadata = TamboThreadMessage & {\n interactableMetadata?: InteractableMetadata;\n};\n\nexport const TamboMessageContext = createContext<MessageWithMetadata | null>(\n null,\n);\n\nexport interface TamboMessageProviderProps {\n children: React.ReactNode;\n message: TamboThreadMessage;\n /** Optional interactable metadata for components wrapped with withInteractable */\n interactableMetadata?: InteractableMetadata;\n}\n\n/**\n * Wraps all components so that they can find what message they are in.\n * Also supports optional interactable metadata for components wrapped with withInteractable.\n * @param props - Props for the TamboMessageProvider\n * @param props.children - The children to wrap\n * @param props.message - The message object\n * @param props.interactableMetadata - Optional interactable component metadata\n * @returns The wrapped component\n */\nexport const TamboMessageProvider: React.FC<TamboMessageProviderProps> = ({\n children,\n message,\n interactableMetadata,\n}) => {\n // Merge interactable metadata into message if provided\n const enhancedMessage: MessageWithMetadata = interactableMetadata\n ? { ...message, interactableMetadata }\n : message;\n\n // Use a unique key={...} to force a re-render when the message changes - this\n // makes sure that if the rendered component is swapped into a tree (like if\n // you always show the last rendered component) then the state/etc is correct\n return (\n <TamboMessageContext.Provider value={enhancedMessage} key={message.id}>\n {children}\n </TamboMessageContext.Provider>\n );\n};\n\n/**\n * Wraps a component with a TamboMessageProvider - this allows the provider\n * to be used outside of a TSX file.\n * @param children - The children to wrap\n * @param message - The message object\n * @param interactableMetadata - Optional interactable metadata\n * @returns The wrapped component\n */\nexport function wrapWithTamboMessageProvider(\n children: React.ReactNode,\n message: TamboThreadMessage,\n interactableMetadata?: InteractableMetadata,\n) {\n return (\n <TamboMessageProvider\n message={message}\n interactableMetadata={interactableMetadata}\n >\n {children}\n </TamboMessageProvider>\n );\n}\n\n/**\n * Hook used inside a component wrapped with TamboMessageProvider, to get\n * the current message.\n * @returns The current message that is used to render the component\n */\nexport const useTamboCurrentMessage = () => {\n const message = useContext(TamboMessageContext);\n if (!message) {\n throw new Error(\n \"useTamboCurrentMessage must be used within a TamboMessageProvider\",\n );\n }\n return message;\n};\n\n/**\n * Component info extracted from the current message and interactable context.\n * Provides a unified interface for accessing component metadata.\n */\nexport interface TamboCurrentComponent {\n /** Component name from the message */\n componentName?: string;\n /** Component props from the message */\n props?: Record<string, unknown>;\n /** Interactable ID (only present for components wrapped with withInteractable) */\n interactableId?: string;\n /** Description (only present for components wrapped with withInteractable) */\n description?: string;\n /** Thread ID (not available on messages directly) */\n threadId?: string;\n}\n\n/**\n * Hook to access the current component information from the message context.\n * Provides a unified interface for both AI-generated and interactable components.\n *\n * Component info is derived from content blocks rather than\n * top-level message fields.\n *\n * **Use this hook when you need component metadata regardless of the context.**\n * @returns Component info including name, props, and interactable metadata if available, or null if used outside TamboMessageProvider\n * @example\n * ```tsx\n * function MyInlineEditor() {\n * const component = useTamboCurrentComponent();\n *\n * if (!component) return null; // Not inside a component\n *\n * return (\n * <div>\n * Editing: {component.componentName}\n * {component.interactableId && <span>ID: {component.interactableId}</span>}\n * </div>\n * );\n * }\n * ```\n */\nexport const useTamboCurrentComponent = (): TamboCurrentComponent | null => {\n const message = useContext(TamboMessageContext);\n\n if (!message) {\n return null;\n }\n\n // Find first component content block\n const componentContent = message.content.find(\n (c): c is TamboComponentContent => c.type === \"component\",\n );\n\n return {\n componentName:\n message.interactableMetadata?.componentName ??\n componentContent?.name ??\n undefined,\n props: componentContent?.props as Record<string, unknown> | undefined,\n interactableId: message.interactableMetadata?.id ?? undefined,\n description: message.interactableMetadata?.description ?? undefined,\n threadId: undefined, // Messages don't carry threadId\n };\n};\n"]}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { TamboAuthState } from "../types/auth";
|
|
2
2
|
/**
|
|
3
|
-
* Hook to compute the current authentication state for the
|
|
3
|
+
* Hook to compute the current authentication state for the SDK.
|
|
4
4
|
*
|
|
5
|
-
* Reads from TamboClientContext and
|
|
5
|
+
* Reads from TamboClientContext and TamboConfigContext to determine
|
|
6
6
|
* whether the SDK is ready to make API calls.
|
|
7
7
|
* @returns The current auth state as a discriminated union
|
|
8
|
-
* @throws {Error} If used outside
|
|
8
|
+
* @throws {Error} If used outside TamboProvider
|
|
9
9
|
*/
|
|
10
|
-
export declare function
|
|
10
|
+
export declare function useTamboAuthState(): TamboAuthState;
|
|
11
11
|
//# sourceMappingURL=use-tambo-v1-auth-state.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-tambo-v1-auth-state.d.ts","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-auth-state.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"use-tambo-v1-auth-state.d.ts","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-auth-state.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,CAqClD"}
|
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
"use client";
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.
|
|
4
|
+
exports.useTamboAuthState = useTamboAuthState;
|
|
5
5
|
const react_1 = require("react");
|
|
6
6
|
const tambo_client_provider_1 = require("../../providers/tambo-client-provider");
|
|
7
7
|
const tambo_v1_provider_1 = require("../providers/tambo-v1-provider");
|
|
8
8
|
/**
|
|
9
|
-
* Hook to compute the current authentication state for the
|
|
9
|
+
* Hook to compute the current authentication state for the SDK.
|
|
10
10
|
*
|
|
11
|
-
* Reads from TamboClientContext and
|
|
11
|
+
* Reads from TamboClientContext and TamboConfigContext to determine
|
|
12
12
|
* whether the SDK is ready to make API calls.
|
|
13
13
|
* @returns The current auth state as a discriminated union
|
|
14
|
-
* @throws {Error} If used outside
|
|
14
|
+
* @throws {Error} If used outside TamboProvider
|
|
15
15
|
*/
|
|
16
|
-
function
|
|
16
|
+
function useTamboAuthState() {
|
|
17
17
|
const clientContext = (0, react_1.useContext)(tambo_client_provider_1.TamboClientContext);
|
|
18
18
|
if (!clientContext) {
|
|
19
|
-
throw new Error("
|
|
19
|
+
throw new Error("useTamboAuthState must be used within TamboProvider");
|
|
20
20
|
}
|
|
21
|
-
const config = (0, react_1.useContext)(tambo_v1_provider_1.
|
|
21
|
+
const config = (0, react_1.useContext)(tambo_v1_provider_1.TamboConfigContext);
|
|
22
22
|
if (!config) {
|
|
23
|
-
throw new Error("
|
|
23
|
+
throw new Error("useTamboAuthState must be used within TamboProvider");
|
|
24
24
|
}
|
|
25
25
|
const { tokenExchangeError, userToken, hasValidToken } = clientContext;
|
|
26
26
|
const { userKey } = config;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-tambo-v1-auth-state.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-auth-state.ts"],"names":[],"mappings":";AAAA,YAAY,CAAC;;AAeb,
|
|
1
|
+
{"version":3,"file":"use-tambo-v1-auth-state.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-auth-state.ts"],"names":[],"mappings":";AAAA,YAAY,CAAC;;AAeb,8CAqCC;AAlDD,iCAAmC;AACnC,iFAA2E;AAC3E,sEAAoE;AAGpE;;;;;;;GAOG;AACH,SAAgB,iBAAiB;IAC/B,MAAM,aAAa,GAAG,IAAA,kBAAU,EAAC,0CAAkB,CAAC,CAAC;IACrD,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,MAAM,GAAG,IAAA,kBAAU,EAAC,sCAAkB,CAAC,CAAC;IAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,EAAE,kBAAkB,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,aAAa,CAAC;IACvE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAE3B,+CAA+C;IAC/C,IAAI,OAAO,IAAI,SAAS,EAAE,CAAC;QACzB,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC/B,CAAC;IAED,yBAAyB;IACzB,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IACrD,CAAC;IAED,2BAA2B;IAC3B,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,kBAAkB,EAAE,CAAC;YACvB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC;QACxD,CAAC;QACD,IAAI,aAAa,EAAE,CAAC;YAClB,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;QAC3D,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;IAClC,CAAC;IAED,mBAAmB;IACnB,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;AACvC,CAAC","sourcesContent":["\"use client\";\n\nimport { useContext } from \"react\";\nimport { TamboClientContext } from \"../../providers/tambo-client-provider\";\nimport { TamboConfigContext } from \"../providers/tambo-v1-provider\";\nimport type { TamboAuthState } from \"../types/auth\";\n\n/**\n * Hook to compute the current authentication state for the SDK.\n *\n * Reads from TamboClientContext and TamboConfigContext to determine\n * whether the SDK is ready to make API calls.\n * @returns The current auth state as a discriminated union\n * @throws {Error} If used outside TamboProvider\n */\nexport function useTamboAuthState(): TamboAuthState {\n const clientContext = useContext(TamboClientContext);\n if (!clientContext) {\n throw new Error(\"useTamboAuthState must be used within TamboProvider\");\n }\n\n const config = useContext(TamboConfigContext);\n if (!config) {\n throw new Error(\"useTamboAuthState must be used within TamboProvider\");\n }\n\n const { tokenExchangeError, userToken, hasValidToken } = clientContext;\n const { userKey } = config;\n\n // Invalid: both userKey AND userToken provided\n if (userKey && userToken) {\n return { status: \"invalid\" };\n }\n\n // Identified via userKey\n if (userKey) {\n return { status: \"identified\", source: \"userKey\" };\n }\n\n // Token exchange scenarios\n if (userToken) {\n if (tokenExchangeError) {\n return { status: \"error\", error: tokenExchangeError };\n }\n if (hasValidToken) {\n return { status: \"identified\", source: \"tokenExchange\" };\n }\n return { status: \"exchanging\" };\n }\n\n // Neither provided\n return { status: \"unauthenticated\" };\n}\n"]}
|
|
@@ -24,13 +24,13 @@ function createWrapper(clientOverrides, configOverrides = {}) {
|
|
|
24
24
|
...configOverrides,
|
|
25
25
|
};
|
|
26
26
|
function Wrapper({ children }) {
|
|
27
|
-
return react_2.default.createElement(tambo_client_provider_1.TamboClientContext.Provider, { value: clientContext }, react_2.default.createElement(tambo_v1_provider_1.
|
|
27
|
+
return react_2.default.createElement(tambo_client_provider_1.TamboClientContext.Provider, { value: clientContext }, react_2.default.createElement(tambo_v1_provider_1.TamboConfigContext.Provider, { value: config }, children));
|
|
28
28
|
}
|
|
29
29
|
return Wrapper;
|
|
30
30
|
}
|
|
31
|
-
describe("
|
|
31
|
+
describe("useTamboAuthState", () => {
|
|
32
32
|
it("returns 'identified' with source 'userKey' when only userKey is provided", () => {
|
|
33
|
-
const { result } = (0, react_1.renderHook)(() => (0, use_tambo_v1_auth_state_1.
|
|
33
|
+
const { result } = (0, react_1.renderHook)(() => (0, use_tambo_v1_auth_state_1.useTamboAuthState)(), {
|
|
34
34
|
wrapper: createWrapper({}, { userKey: "user_123" }),
|
|
35
35
|
});
|
|
36
36
|
expect(result.current).toEqual({
|
|
@@ -39,7 +39,7 @@ describe("useTamboV1AuthState", () => {
|
|
|
39
39
|
});
|
|
40
40
|
});
|
|
41
41
|
it("returns 'identified' with source 'tokenExchange' when token exchange succeeded", () => {
|
|
42
|
-
const { result } = (0, react_1.renderHook)(() => (0, use_tambo_v1_auth_state_1.
|
|
42
|
+
const { result } = (0, react_1.renderHook)(() => (0, use_tambo_v1_auth_state_1.useTamboAuthState)(), {
|
|
43
43
|
wrapper: createWrapper({
|
|
44
44
|
userToken: "oauth_token",
|
|
45
45
|
hasValidToken: true,
|
|
@@ -51,7 +51,7 @@ describe("useTamboV1AuthState", () => {
|
|
|
51
51
|
});
|
|
52
52
|
});
|
|
53
53
|
it("returns 'exchanging' when userToken provided but exchange not yet complete", () => {
|
|
54
|
-
const { result } = (0, react_1.renderHook)(() => (0, use_tambo_v1_auth_state_1.
|
|
54
|
+
const { result } = (0, react_1.renderHook)(() => (0, use_tambo_v1_auth_state_1.useTamboAuthState)(), {
|
|
55
55
|
wrapper: createWrapper({
|
|
56
56
|
userToken: "oauth_token",
|
|
57
57
|
hasValidToken: false,
|
|
@@ -61,7 +61,7 @@ describe("useTamboV1AuthState", () => {
|
|
|
61
61
|
});
|
|
62
62
|
it("returns 'error' when token exchange failed", () => {
|
|
63
63
|
const exchangeError = new Error("Token exchange failed");
|
|
64
|
-
const { result } = (0, react_1.renderHook)(() => (0, use_tambo_v1_auth_state_1.
|
|
64
|
+
const { result } = (0, react_1.renderHook)(() => (0, use_tambo_v1_auth_state_1.useTamboAuthState)(), {
|
|
65
65
|
wrapper: createWrapper({
|
|
66
66
|
userToken: "oauth_token",
|
|
67
67
|
tokenExchangeError: exchangeError,
|
|
@@ -74,22 +74,22 @@ describe("useTamboV1AuthState", () => {
|
|
|
74
74
|
});
|
|
75
75
|
});
|
|
76
76
|
it("returns 'invalid' when both userKey and userToken are provided", () => {
|
|
77
|
-
const { result } = (0, react_1.renderHook)(() => (0, use_tambo_v1_auth_state_1.
|
|
77
|
+
const { result } = (0, react_1.renderHook)(() => (0, use_tambo_v1_auth_state_1.useTamboAuthState)(), {
|
|
78
78
|
wrapper: createWrapper({ userToken: "oauth_token" }, { userKey: "user_123" }),
|
|
79
79
|
});
|
|
80
80
|
expect(result.current).toEqual({ status: "invalid" });
|
|
81
81
|
});
|
|
82
82
|
it("returns 'unauthenticated' when neither userKey nor userToken is provided", () => {
|
|
83
|
-
const { result } = (0, react_1.renderHook)(() => (0, use_tambo_v1_auth_state_1.
|
|
83
|
+
const { result } = (0, react_1.renderHook)(() => (0, use_tambo_v1_auth_state_1.useTamboAuthState)(), {
|
|
84
84
|
wrapper: createWrapper({}),
|
|
85
85
|
});
|
|
86
86
|
expect(result.current).toEqual({ status: "unauthenticated" });
|
|
87
87
|
});
|
|
88
88
|
it("throws when used outside TamboClientContext", () => {
|
|
89
|
-
const wrapper = ({ children }) => react_2.default.createElement(tambo_v1_provider_1.
|
|
90
|
-
expect(() => (0, react_1.renderHook)(() => (0, use_tambo_v1_auth_state_1.
|
|
89
|
+
const wrapper = ({ children }) => react_2.default.createElement(tambo_v1_provider_1.TamboConfigContext.Provider, { value: { userKey: "x" } }, children);
|
|
90
|
+
expect(() => (0, react_1.renderHook)(() => (0, use_tambo_v1_auth_state_1.useTamboAuthState)(), { wrapper })).toThrow("useTamboAuthState must be used within TamboProvider");
|
|
91
91
|
});
|
|
92
|
-
it("throws when used outside
|
|
92
|
+
it("throws when used outside TamboConfigContext", () => {
|
|
93
93
|
const clientContext = {
|
|
94
94
|
client: {},
|
|
95
95
|
queryClient: new react_query_1.QueryClient(),
|
|
@@ -99,7 +99,7 @@ describe("useTamboV1AuthState", () => {
|
|
|
99
99
|
hasValidToken: false,
|
|
100
100
|
};
|
|
101
101
|
const wrapper = ({ children }) => react_2.default.createElement(tambo_client_provider_1.TamboClientContext.Provider, { value: clientContext }, children);
|
|
102
|
-
expect(() => (0, react_1.renderHook)(() => (0, use_tambo_v1_auth_state_1.
|
|
102
|
+
expect(() => (0, react_1.renderHook)(() => (0, use_tambo_v1_auth_state_1.useTamboAuthState)(), { wrapper })).toThrow("useTamboAuthState must be used within TamboProvider");
|
|
103
103
|
});
|
|
104
104
|
});
|
|
105
105
|
//# sourceMappingURL=use-tambo-v1-auth-state.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-tambo-v1-auth-state.test.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-auth-state.test.ts"],"names":[],"mappings":";;;;;AAAA,kDAAoD;AACpD,kDAA0B;AAC1B,uDAAoD;AAEpD,iFAA2E;AAE3E,sEAGwC;AACxC,
|
|
1
|
+
{"version":3,"file":"use-tambo-v1-auth-state.test.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-auth-state.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { renderHook } from \"@testing-library/react\";\nimport React from \"react\";\nimport { QueryClient } from \"@tanstack/react-query\";\nimport TamboAI from \"@tambo-ai/typescript-sdk\";\nimport { TamboClientContext } from \"../../providers/tambo-client-provider\";\nimport type { TamboClientContextProps } from \"../../providers/tambo-client-provider\";\nimport {\n TamboConfigContext,\n type TamboConfig,\n} from \"../providers/tambo-v1-provider\";\nimport { useTamboAuthState } from \"./use-tambo-v1-auth-state\";\n\nfunction createWrapper(\n clientOverrides: Partial<TamboClientContextProps>,\n configOverrides: Partial<TamboConfig> = {},\n) {\n const clientContext: TamboClientContextProps = {\n client: {} as TamboAI,\n queryClient: new QueryClient(),\n isUpdatingToken: false,\n tokenExchangeError: null,\n userToken: undefined,\n hasValidToken: false,\n ...clientOverrides,\n };\n\n const config: TamboConfig = {\n userKey: undefined,\n ...configOverrides,\n };\n\n function Wrapper({ children }: { children: React.ReactNode }) {\n return React.createElement(\n TamboClientContext.Provider,\n { value: clientContext },\n React.createElement(\n TamboConfigContext.Provider,\n { value: config },\n children,\n ),\n );\n }\n return Wrapper;\n}\n\ndescribe(\"useTamboAuthState\", () => {\n it(\"returns 'identified' with source 'userKey' when only userKey is provided\", () => {\n const { result } = renderHook(() => useTamboAuthState(), {\n wrapper: createWrapper({}, { userKey: \"user_123\" }),\n });\n\n expect(result.current).toEqual({\n status: \"identified\",\n source: \"userKey\",\n });\n });\n\n it(\"returns 'identified' with source 'tokenExchange' when token exchange succeeded\", () => {\n const { result } = renderHook(() => useTamboAuthState(), {\n wrapper: createWrapper({\n userToken: \"oauth_token\",\n hasValidToken: true,\n }),\n });\n\n expect(result.current).toEqual({\n status: \"identified\",\n source: \"tokenExchange\",\n });\n });\n\n it(\"returns 'exchanging' when userToken provided but exchange not yet complete\", () => {\n const { result } = renderHook(() => useTamboAuthState(), {\n wrapper: createWrapper({\n userToken: \"oauth_token\",\n hasValidToken: false,\n }),\n });\n\n expect(result.current).toEqual({ status: \"exchanging\" });\n });\n\n it(\"returns 'error' when token exchange failed\", () => {\n const exchangeError = new Error(\"Token exchange failed\");\n const { result } = renderHook(() => useTamboAuthState(), {\n wrapper: createWrapper({\n userToken: \"oauth_token\",\n tokenExchangeError: exchangeError,\n hasValidToken: false,\n }),\n });\n\n expect(result.current).toEqual({\n status: \"error\",\n error: exchangeError,\n });\n });\n\n it(\"returns 'invalid' when both userKey and userToken are provided\", () => {\n const { result } = renderHook(() => useTamboAuthState(), {\n wrapper: createWrapper(\n { userToken: \"oauth_token\" },\n { userKey: \"user_123\" },\n ),\n });\n\n expect(result.current).toEqual({ status: \"invalid\" });\n });\n\n it(\"returns 'unauthenticated' when neither userKey nor userToken is provided\", () => {\n const { result } = renderHook(() => useTamboAuthState(), {\n wrapper: createWrapper({}),\n });\n\n expect(result.current).toEqual({ status: \"unauthenticated\" });\n });\n\n it(\"throws when used outside TamboClientContext\", () => {\n const wrapper = ({ children }: { children: React.ReactNode }) =>\n React.createElement(\n TamboConfigContext.Provider,\n { value: { userKey: \"x\" } },\n children,\n );\n\n expect(() => renderHook(() => useTamboAuthState(), { wrapper })).toThrow(\n \"useTamboAuthState must be used within TamboProvider\",\n );\n });\n\n it(\"throws when used outside TamboConfigContext\", () => {\n const clientContext: TamboClientContextProps = {\n client: {} as TamboAI,\n queryClient: new QueryClient(),\n isUpdatingToken: false,\n tokenExchangeError: null,\n userToken: undefined,\n hasValidToken: false,\n };\n\n const wrapper = ({ children }: { children: React.ReactNode }) =>\n React.createElement(\n TamboClientContext.Provider,\n { value: clientContext },\n children,\n );\n\n expect(() => renderHook(() => useTamboAuthState(), { wrapper })).toThrow(\n \"useTamboAuthState must be used within TamboProvider\",\n );\n });\n});\n"]}
|