@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
|
@@ -1,340 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
-
};
|
|
38
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
const react_1 = __importDefault(require("react"));
|
|
40
|
-
const useCurrentMessage = __importStar(require("../hooks/use-current-message"));
|
|
41
|
-
const generate_component_1 = require("./generate-component");
|
|
42
|
-
// Track calls to wrapWithTamboMessageProvider
|
|
43
|
-
let wrapWithTamboMessageProviderSpy;
|
|
44
|
-
beforeEach(() => {
|
|
45
|
-
wrapWithTamboMessageProviderSpy = jest.spyOn(useCurrentMessage, "wrapWithTamboMessageProvider");
|
|
46
|
-
});
|
|
47
|
-
afterEach(() => {
|
|
48
|
-
wrapWithTamboMessageProviderSpy.mockRestore();
|
|
49
|
-
});
|
|
50
|
-
// Simple test component
|
|
51
|
-
const TestComponent = ({ title, count, }) => (react_1.default.createElement("div", { "data-testid": "test-component" },
|
|
52
|
-
react_1.default.createElement("span", null, title),
|
|
53
|
-
count !== undefined && react_1.default.createElement("span", null, count)));
|
|
54
|
-
// Create a mock Standard Schema for testing
|
|
55
|
-
const createMockStandardSchema = (validate) => ({
|
|
56
|
-
"~standard": {
|
|
57
|
-
version: 1,
|
|
58
|
-
vendor: "test",
|
|
59
|
-
validate: (data) => ({ value: validate(data) }),
|
|
60
|
-
},
|
|
61
|
-
});
|
|
62
|
-
describe("renderComponentIntoMessage", () => {
|
|
63
|
-
const baseMessage = {
|
|
64
|
-
id: "msg-123",
|
|
65
|
-
threadId: "thread-456",
|
|
66
|
-
role: "assistant",
|
|
67
|
-
content: [{ type: "text", text: "Here is your component" }],
|
|
68
|
-
createdAt: "2024-01-01T00:00:00Z",
|
|
69
|
-
componentState: {},
|
|
70
|
-
component: {
|
|
71
|
-
componentName: "TestComponent",
|
|
72
|
-
props: { title: "Hello" },
|
|
73
|
-
componentState: {},
|
|
74
|
-
message: "",
|
|
75
|
-
},
|
|
76
|
-
};
|
|
77
|
-
const baseRegistry = {
|
|
78
|
-
TestComponent: {
|
|
79
|
-
name: "TestComponent",
|
|
80
|
-
description: "A test component",
|
|
81
|
-
component: TestComponent,
|
|
82
|
-
props: { type: "object" }, // JSON Schema
|
|
83
|
-
contextTools: [],
|
|
84
|
-
},
|
|
85
|
-
};
|
|
86
|
-
describe("component lookup", () => {
|
|
87
|
-
it("throws error when component has no componentName", () => {
|
|
88
|
-
const messageWithoutComponentName = {
|
|
89
|
-
...baseMessage,
|
|
90
|
-
component: {
|
|
91
|
-
componentName: "",
|
|
92
|
-
props: {},
|
|
93
|
-
componentState: {},
|
|
94
|
-
message: "",
|
|
95
|
-
},
|
|
96
|
-
};
|
|
97
|
-
expect(() => (0, generate_component_1.renderComponentIntoMessage)(messageWithoutComponentName, baseRegistry)).toThrow("Component not found");
|
|
98
|
-
});
|
|
99
|
-
it("throws error when component is null", () => {
|
|
100
|
-
const messageWithNullComponent = {
|
|
101
|
-
...baseMessage,
|
|
102
|
-
component: null,
|
|
103
|
-
};
|
|
104
|
-
expect(() => (0, generate_component_1.renderComponentIntoMessage)(messageWithNullComponent, baseRegistry)).toThrow();
|
|
105
|
-
});
|
|
106
|
-
it("throws error when componentName not in registry", () => {
|
|
107
|
-
const messageWithUnknownComponent = {
|
|
108
|
-
...baseMessage,
|
|
109
|
-
component: {
|
|
110
|
-
componentName: "UnknownComponent",
|
|
111
|
-
props: {},
|
|
112
|
-
componentState: {},
|
|
113
|
-
message: "",
|
|
114
|
-
},
|
|
115
|
-
};
|
|
116
|
-
expect(() => (0, generate_component_1.renderComponentIntoMessage)(messageWithUnknownComponent, baseRegistry)).toThrow("Tambo tried to use Component UnknownComponent, but it was not found");
|
|
117
|
-
});
|
|
118
|
-
it("successfully finds and renders registered component", () => {
|
|
119
|
-
const result = (0, generate_component_1.renderComponentIntoMessage)(baseMessage, baseRegistry);
|
|
120
|
-
expect(result.component?.componentName).toBe("TestComponent");
|
|
121
|
-
expect(result.renderedComponent).toBeDefined();
|
|
122
|
-
});
|
|
123
|
-
});
|
|
124
|
-
describe("props handling", () => {
|
|
125
|
-
it("passes props to component from message", () => {
|
|
126
|
-
const messageWithProps = {
|
|
127
|
-
...baseMessage,
|
|
128
|
-
component: {
|
|
129
|
-
componentName: "TestComponent",
|
|
130
|
-
props: { title: "Test Title", count: 42 },
|
|
131
|
-
componentState: {},
|
|
132
|
-
message: "",
|
|
133
|
-
},
|
|
134
|
-
};
|
|
135
|
-
const result = (0, generate_component_1.renderComponentIntoMessage)(messageWithProps, baseRegistry);
|
|
136
|
-
expect(result.component?.props).toEqual({
|
|
137
|
-
title: "Test Title",
|
|
138
|
-
count: 42,
|
|
139
|
-
});
|
|
140
|
-
});
|
|
141
|
-
it("handles empty props object", () => {
|
|
142
|
-
const messageWithEmptyProps = {
|
|
143
|
-
...baseMessage,
|
|
144
|
-
component: {
|
|
145
|
-
componentName: "TestComponent",
|
|
146
|
-
props: {},
|
|
147
|
-
componentState: {},
|
|
148
|
-
message: "",
|
|
149
|
-
},
|
|
150
|
-
};
|
|
151
|
-
const result = (0, generate_component_1.renderComponentIntoMessage)(messageWithEmptyProps, baseRegistry);
|
|
152
|
-
expect(result.component?.props).toEqual({});
|
|
153
|
-
});
|
|
154
|
-
it("handles nested object props", () => {
|
|
155
|
-
const messageWithNestedProps = {
|
|
156
|
-
...baseMessage,
|
|
157
|
-
component: {
|
|
158
|
-
componentName: "TestComponent",
|
|
159
|
-
props: {
|
|
160
|
-
title: "Nested",
|
|
161
|
-
config: { nested: { deeply: { value: 123 } } },
|
|
162
|
-
},
|
|
163
|
-
componentState: {},
|
|
164
|
-
message: "",
|
|
165
|
-
},
|
|
166
|
-
};
|
|
167
|
-
const result = (0, generate_component_1.renderComponentIntoMessage)(messageWithNestedProps, baseRegistry);
|
|
168
|
-
expect(result.component?.props).toEqual({
|
|
169
|
-
title: "Nested",
|
|
170
|
-
config: { nested: { deeply: { value: 123 } } },
|
|
171
|
-
});
|
|
172
|
-
});
|
|
173
|
-
it("handles array props", () => {
|
|
174
|
-
const messageWithArrayProps = {
|
|
175
|
-
...baseMessage,
|
|
176
|
-
component: {
|
|
177
|
-
componentName: "TestComponent",
|
|
178
|
-
props: { title: "Array Test", items: [1, 2, 3] },
|
|
179
|
-
componentState: {},
|
|
180
|
-
message: "",
|
|
181
|
-
},
|
|
182
|
-
};
|
|
183
|
-
const result = (0, generate_component_1.renderComponentIntoMessage)(messageWithArrayProps, baseRegistry);
|
|
184
|
-
expect(result.component?.props).toEqual({
|
|
185
|
-
title: "Array Test",
|
|
186
|
-
items: [1, 2, 3],
|
|
187
|
-
});
|
|
188
|
-
});
|
|
189
|
-
});
|
|
190
|
-
describe("Standard Schema validation", () => {
|
|
191
|
-
it("validates props through Standard Schema when present", () => {
|
|
192
|
-
const mockValidate = jest.fn((data) => ({
|
|
193
|
-
...data,
|
|
194
|
-
validated: true,
|
|
195
|
-
}));
|
|
196
|
-
const registryWithStandardSchema = {
|
|
197
|
-
TestComponent: {
|
|
198
|
-
name: "TestComponent",
|
|
199
|
-
description: "A test component",
|
|
200
|
-
component: TestComponent,
|
|
201
|
-
props: createMockStandardSchema(mockValidate),
|
|
202
|
-
contextTools: [],
|
|
203
|
-
},
|
|
204
|
-
};
|
|
205
|
-
const result = (0, generate_component_1.renderComponentIntoMessage)(baseMessage, registryWithStandardSchema);
|
|
206
|
-
expect(mockValidate).toHaveBeenCalled();
|
|
207
|
-
// Standard Schema validate returns { value: T }, we extract the value
|
|
208
|
-
expect(result.component?.props).toEqual({
|
|
209
|
-
title: "Hello",
|
|
210
|
-
validated: true,
|
|
211
|
-
});
|
|
212
|
-
});
|
|
213
|
-
it("throws error when validation returns issues", () => {
|
|
214
|
-
const registryWithFailingSchema = {
|
|
215
|
-
TestComponent: {
|
|
216
|
-
name: "TestComponent",
|
|
217
|
-
description: "A test component",
|
|
218
|
-
component: TestComponent,
|
|
219
|
-
props: {
|
|
220
|
-
"~standard": {
|
|
221
|
-
version: 1,
|
|
222
|
-
vendor: "test",
|
|
223
|
-
validate: () => ({
|
|
224
|
-
issues: [{ message: "title is required", path: ["title"] }],
|
|
225
|
-
}),
|
|
226
|
-
},
|
|
227
|
-
},
|
|
228
|
-
contextTools: [],
|
|
229
|
-
},
|
|
230
|
-
};
|
|
231
|
-
expect(() => (0, generate_component_1.renderComponentIntoMessage)(baseMessage, registryWithFailingSchema)).toThrow("Component props validation failed: title is required");
|
|
232
|
-
});
|
|
233
|
-
it("throws error when validation returns async promise", () => {
|
|
234
|
-
const registryWithAsyncSchema = {
|
|
235
|
-
TestComponent: {
|
|
236
|
-
name: "TestComponent",
|
|
237
|
-
description: "A test component",
|
|
238
|
-
component: TestComponent,
|
|
239
|
-
props: {
|
|
240
|
-
"~standard": {
|
|
241
|
-
version: 1,
|
|
242
|
-
vendor: "test",
|
|
243
|
-
validate: async () => await Promise.resolve({ value: {} }),
|
|
244
|
-
},
|
|
245
|
-
},
|
|
246
|
-
contextTools: [],
|
|
247
|
-
},
|
|
248
|
-
};
|
|
249
|
-
expect(() => (0, generate_component_1.renderComponentIntoMessage)(baseMessage, registryWithAsyncSchema)).toThrow("Async schema validation is not supported for component props");
|
|
250
|
-
});
|
|
251
|
-
it("uses raw props when props is JSON Schema (not Standard Schema)", () => {
|
|
252
|
-
const jsonSchemaRegistry = {
|
|
253
|
-
TestComponent: {
|
|
254
|
-
name: "TestComponent",
|
|
255
|
-
description: "A test component",
|
|
256
|
-
component: TestComponent,
|
|
257
|
-
props: {
|
|
258
|
-
type: "object",
|
|
259
|
-
properties: {
|
|
260
|
-
title: { type: "string" },
|
|
261
|
-
},
|
|
262
|
-
},
|
|
263
|
-
contextTools: [],
|
|
264
|
-
},
|
|
265
|
-
};
|
|
266
|
-
const result = (0, generate_component_1.renderComponentIntoMessage)(baseMessage, jsonSchemaRegistry);
|
|
267
|
-
// Should pass through without validation
|
|
268
|
-
expect(result.component?.props).toEqual({ title: "Hello" });
|
|
269
|
-
});
|
|
270
|
-
});
|
|
271
|
-
describe("message structure", () => {
|
|
272
|
-
it("preserves original message properties", () => {
|
|
273
|
-
const result = (0, generate_component_1.renderComponentIntoMessage)(baseMessage, baseRegistry);
|
|
274
|
-
expect(result.id).toBe("msg-123");
|
|
275
|
-
expect(result.threadId).toBe("thread-456");
|
|
276
|
-
expect(result.role).toBe("assistant");
|
|
277
|
-
expect(result.content).toEqual([
|
|
278
|
-
{ type: "text", text: "Here is your component" },
|
|
279
|
-
]);
|
|
280
|
-
expect(result.createdAt).toBe("2024-01-01T00:00:00Z");
|
|
281
|
-
});
|
|
282
|
-
it("includes renderedComponent in result", () => {
|
|
283
|
-
const result = (0, generate_component_1.renderComponentIntoMessage)(baseMessage, baseRegistry);
|
|
284
|
-
expect(result.renderedComponent).toBeDefined();
|
|
285
|
-
expect(react_1.default.isValidElement(result.renderedComponent)).toBe(true);
|
|
286
|
-
});
|
|
287
|
-
it("wraps component with TamboMessageProvider", () => {
|
|
288
|
-
(0, generate_component_1.renderComponentIntoMessage)(baseMessage, baseRegistry);
|
|
289
|
-
expect(wrapWithTamboMessageProviderSpy).toHaveBeenCalled();
|
|
290
|
-
// Check that the message passed to the wrapper has the correct structure
|
|
291
|
-
const callArgs = wrapWithTamboMessageProviderSpy.mock.calls[0];
|
|
292
|
-
expect(callArgs[1].id).toBe("msg-123");
|
|
293
|
-
});
|
|
294
|
-
});
|
|
295
|
-
describe("edge cases", () => {
|
|
296
|
-
it("handles special characters in props", () => {
|
|
297
|
-
const messageWithSpecialChars = {
|
|
298
|
-
...baseMessage,
|
|
299
|
-
component: {
|
|
300
|
-
componentName: "TestComponent",
|
|
301
|
-
props: { title: "Hello <script>alert('xss')</script>" },
|
|
302
|
-
componentState: {},
|
|
303
|
-
message: "",
|
|
304
|
-
},
|
|
305
|
-
};
|
|
306
|
-
const result = (0, generate_component_1.renderComponentIntoMessage)(messageWithSpecialChars, baseRegistry);
|
|
307
|
-
expect(result.component?.props.title).toBe("Hello <script>alert('xss')</script>");
|
|
308
|
-
});
|
|
309
|
-
it("handles unicode in props", () => {
|
|
310
|
-
const messageWithUnicode = {
|
|
311
|
-
...baseMessage,
|
|
312
|
-
component: {
|
|
313
|
-
componentName: "TestComponent",
|
|
314
|
-
props: { title: "Hello \u4e16\u754c" }, // "Hello 世界"
|
|
315
|
-
componentState: {},
|
|
316
|
-
message: "",
|
|
317
|
-
},
|
|
318
|
-
};
|
|
319
|
-
const result = (0, generate_component_1.renderComponentIntoMessage)(messageWithUnicode, baseRegistry);
|
|
320
|
-
expect(result.component?.props.title).toBe("Hello \u4e16\u754c");
|
|
321
|
-
});
|
|
322
|
-
it("handles null values in props", () => {
|
|
323
|
-
const messageWithNullProp = {
|
|
324
|
-
...baseMessage,
|
|
325
|
-
component: {
|
|
326
|
-
componentName: "TestComponent",
|
|
327
|
-
props: { title: "Test", nullValue: null },
|
|
328
|
-
componentState: {},
|
|
329
|
-
message: "",
|
|
330
|
-
},
|
|
331
|
-
};
|
|
332
|
-
const result = (0, generate_component_1.renderComponentIntoMessage)(messageWithNullProp, baseRegistry);
|
|
333
|
-
expect(result.component?.props).toEqual({
|
|
334
|
-
title: "Test",
|
|
335
|
-
nullValue: null,
|
|
336
|
-
});
|
|
337
|
-
});
|
|
338
|
-
});
|
|
339
|
-
});
|
|
340
|
-
//# sourceMappingURL=generate-component.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"generate-component.test.js","sourceRoot":"","sources":["../../src/util/generate-component.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import TamboAI from \"@tambo-ai/typescript-sdk\";\nimport React from \"react\";\nimport { ComponentRegistry } from \"../model/component-metadata\";\nimport * as useCurrentMessage from \"../hooks/use-current-message\";\nimport { renderComponentIntoMessage } from \"./generate-component\";\n\n// Track calls to wrapWithTamboMessageProvider\nlet wrapWithTamboMessageProviderSpy: jest.SpyInstance;\n\nbeforeEach(() => {\n wrapWithTamboMessageProviderSpy = jest.spyOn(\n useCurrentMessage,\n \"wrapWithTamboMessageProvider\",\n );\n});\n\nafterEach(() => {\n wrapWithTamboMessageProviderSpy.mockRestore();\n});\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>{title}</span>\n {count !== undefined && <span>{count}</span>}\n </div>\n);\n\n// Create a mock Standard Schema for testing\nconst createMockStandardSchema = (validate: (data: unknown) => unknown) => ({\n \"~standard\": {\n version: 1,\n vendor: \"test\",\n validate: (data: unknown) => ({ value: validate(data) }),\n },\n});\n\ndescribe(\"renderComponentIntoMessage\", () => {\n const baseMessage = {\n id: \"msg-123\",\n threadId: \"thread-456\",\n role: \"assistant\",\n content: [{ type: \"text\", text: \"Here is your component\" }],\n createdAt: \"2024-01-01T00:00:00Z\",\n componentState: {},\n component: {\n componentName: \"TestComponent\",\n props: { title: \"Hello\" },\n componentState: {},\n message: \"\",\n },\n } as unknown as TamboAI.Beta.Threads.ThreadMessage;\n\n const baseRegistry: ComponentRegistry = {\n TestComponent: {\n name: \"TestComponent\",\n description: \"A test component\",\n component: TestComponent,\n props: { type: \"object\" }, // JSON Schema\n contextTools: [],\n },\n };\n\n describe(\"component lookup\", () => {\n it(\"throws error when component has no componentName\", () => {\n const messageWithoutComponentName = {\n ...baseMessage,\n component: {\n componentName: \"\",\n props: {},\n componentState: {},\n message: \"\",\n },\n };\n\n expect(() =>\n renderComponentIntoMessage(messageWithoutComponentName, baseRegistry),\n ).toThrow(\"Component not found\");\n });\n\n it(\"throws error when component is null\", () => {\n const messageWithNullComponent = {\n ...baseMessage,\n component: null as any,\n };\n\n expect(() =>\n renderComponentIntoMessage(messageWithNullComponent, baseRegistry),\n ).toThrow();\n });\n\n it(\"throws error when componentName not in registry\", () => {\n const messageWithUnknownComponent = {\n ...baseMessage,\n component: {\n componentName: \"UnknownComponent\",\n props: {},\n componentState: {},\n message: \"\",\n },\n };\n\n expect(() =>\n renderComponentIntoMessage(messageWithUnknownComponent, baseRegistry),\n ).toThrow(\n \"Tambo tried to use Component UnknownComponent, but it was not found\",\n );\n });\n\n it(\"successfully finds and renders registered component\", () => {\n const result = renderComponentIntoMessage(baseMessage, baseRegistry);\n\n expect(result.component?.componentName).toBe(\"TestComponent\");\n expect(result.renderedComponent).toBeDefined();\n });\n });\n\n describe(\"props handling\", () => {\n it(\"passes props to component from message\", () => {\n const messageWithProps = {\n ...baseMessage,\n component: {\n componentName: \"TestComponent\",\n props: { title: \"Test Title\", count: 42 },\n componentState: {},\n message: \"\",\n },\n };\n\n const result = renderComponentIntoMessage(messageWithProps, baseRegistry);\n\n expect(result.component?.props).toEqual({\n title: \"Test Title\",\n count: 42,\n });\n });\n\n it(\"handles empty props object\", () => {\n const messageWithEmptyProps = {\n ...baseMessage,\n component: {\n componentName: \"TestComponent\",\n props: {},\n componentState: {},\n message: \"\",\n },\n };\n\n const result = renderComponentIntoMessage(\n messageWithEmptyProps,\n baseRegistry,\n );\n\n expect(result.component?.props).toEqual({});\n });\n\n it(\"handles nested object props\", () => {\n const messageWithNestedProps = {\n ...baseMessage,\n component: {\n componentName: \"TestComponent\",\n props: {\n title: \"Nested\",\n config: { nested: { deeply: { value: 123 } } },\n },\n componentState: {},\n message: \"\",\n },\n };\n\n const result = renderComponentIntoMessage(\n messageWithNestedProps,\n baseRegistry,\n );\n\n expect(result.component?.props).toEqual({\n title: \"Nested\",\n config: { nested: { deeply: { value: 123 } } },\n });\n });\n\n it(\"handles array props\", () => {\n const messageWithArrayProps = {\n ...baseMessage,\n component: {\n componentName: \"TestComponent\",\n props: { title: \"Array Test\", items: [1, 2, 3] },\n componentState: {},\n message: \"\",\n },\n };\n\n const result = renderComponentIntoMessage(\n messageWithArrayProps,\n baseRegistry,\n );\n\n expect(result.component?.props).toEqual({\n title: \"Array Test\",\n items: [1, 2, 3],\n });\n });\n });\n\n describe(\"Standard Schema validation\", () => {\n it(\"validates props through Standard Schema when present\", () => {\n const mockValidate = jest.fn((data) => ({\n ...data,\n validated: true,\n }));\n\n const registryWithStandardSchema: ComponentRegistry = {\n TestComponent: {\n name: \"TestComponent\",\n description: \"A test component\",\n component: TestComponent,\n props: createMockStandardSchema(mockValidate),\n contextTools: [],\n },\n };\n\n const result = renderComponentIntoMessage(\n baseMessage,\n registryWithStandardSchema,\n );\n\n expect(mockValidate).toHaveBeenCalled();\n // Standard Schema validate returns { value: T }, we extract the value\n expect(result.component?.props).toEqual({\n title: \"Hello\",\n validated: true,\n });\n });\n\n it(\"throws error when validation returns issues\", () => {\n const registryWithFailingSchema: ComponentRegistry = {\n TestComponent: {\n name: \"TestComponent\",\n description: \"A test component\",\n component: TestComponent,\n props: {\n \"~standard\": {\n version: 1,\n vendor: \"test\",\n validate: () => ({\n issues: [{ message: \"title is required\", path: [\"title\"] }],\n }),\n },\n },\n contextTools: [],\n },\n };\n\n expect(() =>\n renderComponentIntoMessage(baseMessage, registryWithFailingSchema),\n ).toThrow(\"Component props validation failed: title is required\");\n });\n\n it(\"throws error when validation returns async promise\", () => {\n const registryWithAsyncSchema: ComponentRegistry = {\n TestComponent: {\n name: \"TestComponent\",\n description: \"A test component\",\n component: TestComponent,\n props: {\n \"~standard\": {\n version: 1,\n vendor: \"test\",\n validate: async () => await Promise.resolve({ value: {} }),\n },\n },\n contextTools: [],\n },\n };\n\n expect(() =>\n renderComponentIntoMessage(baseMessage, registryWithAsyncSchema),\n ).toThrow(\"Async schema validation is not supported for component props\");\n });\n\n it(\"uses raw props when props is JSON Schema (not Standard Schema)\", () => {\n const jsonSchemaRegistry: ComponentRegistry = {\n TestComponent: {\n name: \"TestComponent\",\n description: \"A test component\",\n component: TestComponent,\n props: {\n type: \"object\",\n properties: {\n title: { type: \"string\" },\n },\n },\n contextTools: [],\n },\n };\n\n const result = renderComponentIntoMessage(\n baseMessage,\n jsonSchemaRegistry,\n );\n\n // Should pass through without validation\n expect(result.component?.props).toEqual({ title: \"Hello\" });\n });\n });\n\n describe(\"message structure\", () => {\n it(\"preserves original message properties\", () => {\n const result = renderComponentIntoMessage(baseMessage, baseRegistry);\n\n expect(result.id).toBe(\"msg-123\");\n expect(result.threadId).toBe(\"thread-456\");\n expect(result.role).toBe(\"assistant\");\n expect(result.content).toEqual([\n { type: \"text\", text: \"Here is your component\" },\n ]);\n expect(result.createdAt).toBe(\"2024-01-01T00:00:00Z\");\n });\n\n it(\"includes renderedComponent in result\", () => {\n const result = renderComponentIntoMessage(baseMessage, baseRegistry);\n\n expect(result.renderedComponent).toBeDefined();\n expect(React.isValidElement(result.renderedComponent)).toBe(true);\n });\n\n it(\"wraps component with TamboMessageProvider\", () => {\n renderComponentIntoMessage(baseMessage, baseRegistry);\n\n expect(wrapWithTamboMessageProviderSpy).toHaveBeenCalled();\n // Check that the message passed to the wrapper has the correct structure\n const callArgs = wrapWithTamboMessageProviderSpy.mock.calls[0];\n expect(callArgs[1].id).toBe(\"msg-123\");\n });\n });\n\n describe(\"edge cases\", () => {\n it(\"handles special characters in props\", () => {\n const messageWithSpecialChars = {\n ...baseMessage,\n component: {\n componentName: \"TestComponent\",\n props: { title: \"Hello <script>alert('xss')</script>\" },\n componentState: {},\n message: \"\",\n },\n };\n\n const result = renderComponentIntoMessage(\n messageWithSpecialChars,\n baseRegistry,\n );\n\n expect(result.component?.props.title).toBe(\n \"Hello <script>alert('xss')</script>\",\n );\n });\n\n it(\"handles unicode in props\", () => {\n const messageWithUnicode = {\n ...baseMessage,\n component: {\n componentName: \"TestComponent\",\n props: { title: \"Hello \\u4e16\\u754c\" }, // \"Hello 世界\"\n componentState: {},\n message: \"\",\n },\n };\n\n const result = renderComponentIntoMessage(\n messageWithUnicode,\n baseRegistry,\n );\n\n expect(result.component?.props.title).toBe(\"Hello \\u4e16\\u754c\");\n });\n\n it(\"handles null values in props\", () => {\n const messageWithNullProp = {\n ...baseMessage,\n component: {\n componentName: \"TestComponent\",\n props: { title: \"Test\", nullValue: null },\n componentState: {},\n message: \"\",\n },\n };\n\n const result = renderComponentIntoMessage(\n messageWithNullProp,\n baseRegistry,\n );\n\n expect(result.component?.props).toEqual({\n title: \"Test\",\n nullValue: null,\n });\n });\n });\n});\n"]}
|
package/esm/hooks/index.d.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
export * from "./react-query-hooks.js";
|
|
2
|
-
export { useTamboComponentState } from "./use-component-state.js";
|
|
3
|
-
export { useTamboCurrentComponent, useTamboCurrentMessage, type TamboCurrentComponent, } from "./use-current-message.js";
|
|
4
|
-
export { useTamboStreamingProps } from "./use-streaming-props.js";
|
|
5
|
-
export * from "./use-suggestions.js";
|
|
6
|
-
export { useTamboStreamStatus, type PropStatus, type StreamStatus, } from "./use-tambo-stream-status.js";
|
|
7
|
-
export { useTamboThreadList } from "./use-tambo-threads.js";
|
|
8
|
-
export { useTamboVoice } from "./use-tambo-voice.js";
|
|
9
|
-
//# sourceMappingURL=index.d.ts.map
|
package/esm/hooks/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AACA,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EACL,wBAAwB,EACxB,sBAAsB,EACtB,KAAK,qBAAqB,GAC3B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,cAAc,mBAAmB,CAAC;AAClC,OAAO,EACL,oBAAoB,EACpB,KAAK,UAAU,EACf,KAAK,YAAY,GAClB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC"}
|
package/esm/hooks/index.js
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
// Export all hooks from this directory
|
|
2
|
-
export * from "./react-query-hooks.js";
|
|
3
|
-
export { useTamboComponentState } from "./use-component-state.js";
|
|
4
|
-
export { useTamboCurrentComponent, useTamboCurrentMessage, } from "./use-current-message.js";
|
|
5
|
-
export { useTamboStreamingProps } from "./use-streaming-props.js";
|
|
6
|
-
export * from "./use-suggestions.js";
|
|
7
|
-
export { useTamboStreamStatus, } from "./use-tambo-stream-status.js";
|
|
8
|
-
export { useTamboThreadList } from "./use-tambo-threads.js";
|
|
9
|
-
export { useTamboVoice } from "./use-tambo-voice.js";
|
|
10
|
-
//# sourceMappingURL=index.js.map
|
package/esm/hooks/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EACL,wBAAwB,EACxB,sBAAsB,GAEvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,cAAc,mBAAmB,CAAC;AAClC,OAAO,EACL,oBAAoB,GAGrB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC","sourcesContent":["// Export all hooks from this directory\nexport * from \"./react-query-hooks\";\nexport { useTamboComponentState } from \"./use-component-state\";\nexport {\n useTamboCurrentComponent,\n useTamboCurrentMessage,\n type TamboCurrentComponent,\n} from \"./use-current-message\";\nexport { useTamboStreamingProps } from \"./use-streaming-props\";\nexport * from \"./use-suggestions\";\nexport {\n useTamboStreamStatus,\n type PropStatus,\n type StreamStatus,\n} from \"./use-tambo-stream-status\";\nexport { useTamboThreadList } from \"./use-tambo-threads\";\nexport { useTamboVoice } from \"./use-tambo-voice\";\n"]}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
type StateUpdateResult<T> = [currentState: T, setState: (newState: T) => void];
|
|
2
|
-
/**
|
|
3
|
-
* A React hook that acts like useState, but also automatically updates the thread message's componentState.
|
|
4
|
-
* If used within an interactable component (wrapped with withTamboInteractable), it updates the
|
|
5
|
-
* interactable provider's global state (sent to Tambo on every request) instead of the remote thread message state.
|
|
6
|
-
* For generated components, it updates both the local and remote thread message's componentState.
|
|
7
|
-
*
|
|
8
|
-
* Benefits: Passes user changes to AI, and when threads are returned, state is preserved.
|
|
9
|
-
* Works in both generative and interactable component contexts.
|
|
10
|
-
* @param keyName - The unique key to identify this state value within the message's componentState object
|
|
11
|
-
* @param initialValue - Optional initial value for the state, used if no componentState value exists in the Tambo message containing this hook usage.
|
|
12
|
-
* @param setFromProp - Optional value used to set the state value, only while no componentState value exists in the Tambo message containing this hook usage. Use this to allow streaming updates from a prop to the state value.
|
|
13
|
-
* @param debounceTime - Optional debounce time in milliseconds (default: 500ms) to limit API calls.
|
|
14
|
-
* @returns A tuple of [currentState, setState] similar to React's useState
|
|
15
|
-
* @example
|
|
16
|
-
* ```tsx
|
|
17
|
-
* const [count, setCount] = useTamboComponentState("counter", 0);
|
|
18
|
-
* ```
|
|
19
|
-
*
|
|
20
|
-
* Use `setFromProp` to seed state from streamed props. During streaming,
|
|
21
|
-
* state updates as new prop values arrive. Once streaming completes,
|
|
22
|
-
* user edits take precedence over the original prop value.
|
|
23
|
-
*
|
|
24
|
-
* Pair with `useTamboStreamStatus` to disable inputs while streaming.
|
|
25
|
-
* @see {@link https://docs.tambo.co/concepts/generative-interfaces/component-state}
|
|
26
|
-
*/
|
|
27
|
-
export declare function useTamboComponentState<S = undefined>(keyName: string, initialValue?: S, setFromProp?: S, debounceTime?: number): StateUpdateResult<S | undefined>;
|
|
28
|
-
export declare function useTamboComponentState<S>(keyName: string, initialValue: S, setFromProp?: S, debounceTime?: number): StateUpdateResult<S>;
|
|
29
|
-
export {};
|
|
30
|
-
//# sourceMappingURL=use-component-state.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-component-state.d.ts","sourceRoot":"","sources":["../../src/hooks/use-component-state.tsx"],"names":[],"mappings":"AAQA,KAAK,iBAAiB,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC;AAE/E;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,GAAG,SAAS,EAClD,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,CAAC,EAChB,WAAW,CAAC,EAAE,CAAC,EACf,YAAY,CAAC,EAAE,MAAM,GACpB,iBAAiB,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;AACpC,wBAAgB,sBAAsB,CAAC,CAAC,EACtC,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,CAAC,EACf,WAAW,CAAC,EAAE,CAAC,EACf,YAAY,CAAC,EAAE,MAAM,GACpB,iBAAiB,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { deepEqual } from "fast-equals";
|
|
3
|
-
import { useCallback, useContext, useEffect, useState } from "react";
|
|
4
|
-
import { useDebouncedCallback } from "use-debounce";
|
|
5
|
-
import { useTamboClient, useTamboThread } from "../index.js";
|
|
6
|
-
import { useTamboInteractable } from "../providers/tambo-interactable-provider.js";
|
|
7
|
-
import { TamboMessageContext } from "./use-current-message.js";
|
|
8
|
-
export function useTamboComponentState(keyName, initialValue, setFromProp, debounceTime = 500) {
|
|
9
|
-
const message = useContext(TamboMessageContext);
|
|
10
|
-
const { updateThreadMessage } = useTamboThread();
|
|
11
|
-
const client = useTamboClient();
|
|
12
|
-
const componentId = message?.interactableMetadata?.id ?? null;
|
|
13
|
-
const { setInteractableState, getInteractableComponentState } = useTamboInteractable();
|
|
14
|
-
const messageState = message?.componentState?.[keyName];
|
|
15
|
-
const interactableState = componentId
|
|
16
|
-
? getInteractableComponentState(componentId)?.[keyName]
|
|
17
|
-
: undefined;
|
|
18
|
-
const initialState = interactableState ?? messageState ?? initialValue;
|
|
19
|
-
const [localState, setLocalState] = useState(initialState);
|
|
20
|
-
const [initializedFromThreadMessage, setInitializedFromThreadMessage] = useState(messageState ? true : false);
|
|
21
|
-
// Optimistically update the local thread message's componentState
|
|
22
|
-
const updateLocalThreadMessage = useCallback(async (newState, existingMessage) => {
|
|
23
|
-
if (!existingMessage) {
|
|
24
|
-
return;
|
|
25
|
-
}
|
|
26
|
-
const updatedMessage = {
|
|
27
|
-
threadId: existingMessage.threadId,
|
|
28
|
-
componentState: {
|
|
29
|
-
...existingMessage.componentState,
|
|
30
|
-
[keyName]: newState,
|
|
31
|
-
},
|
|
32
|
-
};
|
|
33
|
-
await updateThreadMessage(existingMessage.id, updatedMessage, false);
|
|
34
|
-
}, [updateThreadMessage, keyName]);
|
|
35
|
-
// Debounced callback to update the remote thread message's componentState
|
|
36
|
-
const updateRemoteThreadMessage = useDebouncedCallback(async (newState, existingMessage) => {
|
|
37
|
-
if (!existingMessage) {
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
await client.beta.threads.messages.updateComponentState(existingMessage.id, {
|
|
41
|
-
id: existingMessage.threadId,
|
|
42
|
-
state: { [keyName]: newState },
|
|
43
|
-
});
|
|
44
|
-
}, debounceTime);
|
|
45
|
-
const setValue = useCallback((newState) => {
|
|
46
|
-
setLocalState(newState);
|
|
47
|
-
if (componentId) {
|
|
48
|
-
// For interactable components, update the interactable provider's state
|
|
49
|
-
setInteractableState(componentId, keyName, newState);
|
|
50
|
-
}
|
|
51
|
-
else if (message) {
|
|
52
|
-
// For generated components, update both local and remote thread message state
|
|
53
|
-
void updateLocalThreadMessage(newState, message);
|
|
54
|
-
void updateRemoteThreadMessage(newState, message);
|
|
55
|
-
}
|
|
56
|
-
}, [
|
|
57
|
-
message,
|
|
58
|
-
updateLocalThreadMessage,
|
|
59
|
-
updateRemoteThreadMessage,
|
|
60
|
-
setInteractableState,
|
|
61
|
-
componentId,
|
|
62
|
-
keyName,
|
|
63
|
-
]);
|
|
64
|
-
const existingInteractableState = componentId
|
|
65
|
-
? getInteractableComponentState(componentId)?.[keyName]
|
|
66
|
-
: undefined;
|
|
67
|
-
const shouldUpdateInteractableInitial = !!componentId &&
|
|
68
|
-
existingInteractableState === undefined &&
|
|
69
|
-
initialValue !== undefined;
|
|
70
|
-
// Set initial value in interactable state if we're in an interactable context and there's no existing state
|
|
71
|
-
useEffect(() => {
|
|
72
|
-
if (!shouldUpdateInteractableInitial) {
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
setInteractableState(componentId, keyName, initialValue);
|
|
76
|
-
}, [
|
|
77
|
-
shouldUpdateInteractableInitial,
|
|
78
|
-
componentId,
|
|
79
|
-
keyName,
|
|
80
|
-
initialValue,
|
|
81
|
-
setInteractableState,
|
|
82
|
-
]);
|
|
83
|
-
const shouldSyncFromMessage = !!message && messageState !== undefined && messageState !== null;
|
|
84
|
-
// Mirror the thread message's componentState value to the local state and interactable state
|
|
85
|
-
useEffect(() => {
|
|
86
|
-
if (!shouldSyncFromMessage) {
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
setInitializedFromThreadMessage(true);
|
|
90
|
-
const stateValue = messageState;
|
|
91
|
-
setLocalState(stateValue);
|
|
92
|
-
if (componentId) {
|
|
93
|
-
setInteractableState(componentId, keyName, stateValue);
|
|
94
|
-
}
|
|
95
|
-
}, [
|
|
96
|
-
shouldSyncFromMessage,
|
|
97
|
-
messageState,
|
|
98
|
-
keyName,
|
|
99
|
-
setInteractableState,
|
|
100
|
-
componentId,
|
|
101
|
-
]);
|
|
102
|
-
// Sync from interactable provider to local state when state changes externally (e.g., from Tambo tool call)
|
|
103
|
-
useEffect(() => {
|
|
104
|
-
if (!componentId)
|
|
105
|
-
return;
|
|
106
|
-
// only update if different
|
|
107
|
-
setLocalState((prev) => deepEqual(prev, interactableState) ? prev : interactableState);
|
|
108
|
-
}, [componentId, interactableState]);
|
|
109
|
-
// For editable fields that are set from a prop to allow streaming updates, don't overwrite a fetched state value set from the thread message with prop value on initial load.
|
|
110
|
-
useEffect(() => {
|
|
111
|
-
if (setFromProp !== undefined && !initializedFromThreadMessage) {
|
|
112
|
-
setLocalState(setFromProp);
|
|
113
|
-
}
|
|
114
|
-
}, [setFromProp, initializedFromThreadMessage]);
|
|
115
|
-
// Ensure pending changes are flushed on unmount (only for generated components)
|
|
116
|
-
useEffect(() => {
|
|
117
|
-
// Only flush remote updates for generated components, not interactable components
|
|
118
|
-
if (componentId) {
|
|
119
|
-
return;
|
|
120
|
-
}
|
|
121
|
-
return () => {
|
|
122
|
-
async function flushUpdates() {
|
|
123
|
-
try {
|
|
124
|
-
await updateRemoteThreadMessage.flush();
|
|
125
|
-
}
|
|
126
|
-
catch (error) {
|
|
127
|
-
console.error("Failed to flush pending thread message updates:", error);
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
// Fire-and-forget cleanup (errors handled inside)
|
|
131
|
-
void flushUpdates();
|
|
132
|
-
};
|
|
133
|
-
}, [updateRemoteThreadMessage, componentId]);
|
|
134
|
-
return [localState, setValue];
|
|
135
|
-
}
|
|
136
|
-
//# sourceMappingURL=use-component-state.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-component-state.js","sourceRoot":"","sources":["../../src/hooks/use-component-state.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\nimport { deepEqual } from \"fast-equals\";\nimport { useCallback, useContext, useEffect, useState } from \"react\";\nimport { useDebouncedCallback } from \"use-debounce\";\nimport { TamboThreadMessage, useTamboClient, useTamboThread } from \"..\";\nimport { useTamboInteractable } from \"../providers/tambo-interactable-provider\";\nimport { TamboMessageContext } from \"./use-current-message\";\n\ntype StateUpdateResult<T> = [currentState: T, setState: (newState: T) => void];\n\n/**\n * A React hook that acts like useState, but also automatically updates the thread message's componentState.\n * If used within an interactable component (wrapped with withTamboInteractable), it updates the\n * interactable provider's global state (sent to Tambo on every request) instead of the remote thread message state.\n * For generated components, it updates both the local and remote thread message's componentState.\n *\n * Benefits: Passes user changes to AI, and when threads are returned, state is preserved.\n * Works in both generative and interactable component contexts.\n * @param keyName - The unique key to identify this state value within the message's componentState object\n * @param initialValue - Optional initial value for the state, used if no componentState value exists in the Tambo message containing this hook usage.\n * @param setFromProp - Optional value used to set the state value, only while no componentState value exists in the Tambo message containing this hook usage. Use this to allow streaming updates from a prop to the state value.\n * @param debounceTime - Optional debounce time in milliseconds (default: 500ms) to limit API calls.\n * @returns A tuple of [currentState, setState] similar to React's useState\n * @example\n * ```tsx\n * const [count, setCount] = useTamboComponentState(\"counter\", 0);\n * ```\n *\n * Use `setFromProp` to seed state from streamed props. During streaming,\n * state updates as new prop values arrive. Once streaming completes,\n * user edits take precedence over the original prop value.\n *\n * Pair with `useTamboStreamStatus` to disable inputs while streaming.\n * @see {@link https://docs.tambo.co/concepts/generative-interfaces/component-state}\n */\nexport function useTamboComponentState<S = undefined>(\n keyName: string,\n initialValue?: S,\n setFromProp?: S,\n debounceTime?: number,\n): StateUpdateResult<S | undefined>;\nexport function useTamboComponentState<S>(\n keyName: string,\n initialValue: S,\n setFromProp?: S,\n debounceTime?: number,\n): StateUpdateResult<S>;\nexport function useTamboComponentState<S>(\n keyName: string,\n initialValue?: S,\n setFromProp?: S,\n debounceTime = 500,\n): StateUpdateResult<S> {\n const message = useContext(TamboMessageContext);\n const { updateThreadMessage } = useTamboThread();\n const client = useTamboClient();\n const componentId = message?.interactableMetadata?.id ?? null;\n const { setInteractableState, getInteractableComponentState } =\n useTamboInteractable();\n const messageState = message?.componentState?.[keyName];\n const interactableState = componentId\n ? getInteractableComponentState(componentId)?.[keyName]\n : undefined;\n const initialState =\n (interactableState as S) ?? (messageState as S) ?? initialValue;\n const [localState, setLocalState] = useState<S | undefined>(initialState);\n const [initializedFromThreadMessage, setInitializedFromThreadMessage] =\n useState(messageState ? true : false);\n\n // Optimistically update the local thread message's componentState\n const updateLocalThreadMessage = useCallback(\n async (newState: S, existingMessage: TamboThreadMessage | null) => {\n if (!existingMessage) {\n return;\n }\n const updatedMessage = {\n threadId: existingMessage.threadId,\n componentState: {\n ...existingMessage.componentState,\n [keyName]: newState,\n },\n };\n await updateThreadMessage(existingMessage.id, updatedMessage, false);\n },\n [updateThreadMessage, keyName],\n );\n\n // Debounced callback to update the remote thread message's componentState\n const updateRemoteThreadMessage = useDebouncedCallback(\n async (newState: S, existingMessage: TamboThreadMessage | null) => {\n if (!existingMessage) {\n return;\n }\n await client.beta.threads.messages.updateComponentState(\n existingMessage.id,\n {\n id: existingMessage.threadId,\n state: { [keyName]: newState },\n },\n );\n },\n debounceTime,\n );\n\n const setValue = useCallback(\n (newState: S) => {\n setLocalState(newState);\n if (componentId) {\n // For interactable components, update the interactable provider's state\n setInteractableState(componentId, keyName, newState);\n } else if (message) {\n // For generated components, update both local and remote thread message state\n void updateLocalThreadMessage(newState, message);\n void updateRemoteThreadMessage(newState, message);\n }\n },\n [\n message,\n updateLocalThreadMessage,\n updateRemoteThreadMessage,\n setInteractableState,\n componentId,\n keyName,\n ],\n );\n\n const existingInteractableState = componentId\n ? getInteractableComponentState(componentId)?.[keyName]\n : undefined;\n const shouldUpdateInteractableInitial =\n !!componentId &&\n existingInteractableState === undefined &&\n initialValue !== undefined;\n\n // Set initial value in interactable state if we're in an interactable context and there's no existing state\n useEffect(() => {\n if (!shouldUpdateInteractableInitial) {\n return;\n }\n setInteractableState(componentId, keyName, initialValue!);\n }, [\n shouldUpdateInteractableInitial,\n componentId,\n keyName,\n initialValue,\n setInteractableState,\n ]);\n\n const shouldSyncFromMessage =\n !!message && messageState !== undefined && messageState !== null;\n\n // Mirror the thread message's componentState value to the local state and interactable state\n useEffect(() => {\n if (!shouldSyncFromMessage) {\n return;\n }\n setInitializedFromThreadMessage(true);\n const stateValue = messageState as S;\n setLocalState(stateValue);\n if (componentId) {\n setInteractableState(componentId, keyName, stateValue);\n }\n }, [\n shouldSyncFromMessage,\n messageState,\n keyName,\n setInteractableState,\n componentId,\n ]);\n\n // Sync from interactable provider to local state when state changes externally (e.g., from Tambo tool call)\n useEffect(() => {\n if (!componentId) return;\n // only update if different\n setLocalState((prev) =>\n deepEqual(prev, interactableState) ? prev : (interactableState as S),\n );\n }, [componentId, interactableState]);\n\n // For editable fields that are set from a prop to allow streaming updates, don't overwrite a fetched state value set from the thread message with prop value on initial load.\n useEffect(() => {\n if (setFromProp !== undefined && !initializedFromThreadMessage) {\n setLocalState(setFromProp as S);\n }\n }, [setFromProp, initializedFromThreadMessage]);\n\n // Ensure pending changes are flushed on unmount (only for generated components)\n useEffect(() => {\n // Only flush remote updates for generated components, not interactable components\n if (componentId) {\n return;\n }\n return () => {\n async function flushUpdates() {\n try {\n await updateRemoteThreadMessage.flush();\n } catch (error) {\n console.error(\n \"Failed to flush pending thread message updates:\",\n error,\n );\n }\n }\n // Fire-and-forget cleanup (errors handled inside)\n void flushUpdates();\n };\n }, [updateRemoteThreadMessage, componentId]);\n\n return [localState as S, setValue];\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-component-state.test.d.ts","sourceRoot":"","sources":["../../src/hooks/use-component-state.test.tsx"],"names":[],"mappings":""}
|