@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,264 +0,0 @@
|
|
|
1
|
-
import { render, renderHook, screen } from "@testing-library/react";
|
|
2
|
-
import React from "react";
|
|
3
|
-
import { TamboMessageProvider, useTamboCurrentComponent, useTamboCurrentMessage, } from "./use-current-message.js";
|
|
4
|
-
describe("TamboMessageProvider", () => {
|
|
5
|
-
const createMockMessage = (overrides = {}) => ({
|
|
6
|
-
id: "test-message-id",
|
|
7
|
-
threadId: "test-thread-id",
|
|
8
|
-
componentState: {},
|
|
9
|
-
content: [{ type: "text", text: "Test message" }],
|
|
10
|
-
createdAt: new Date().toISOString(),
|
|
11
|
-
role: "assistant",
|
|
12
|
-
...overrides,
|
|
13
|
-
});
|
|
14
|
-
it("should provide message context to children", () => {
|
|
15
|
-
const message = createMockMessage();
|
|
16
|
-
const TestComponent = () => {
|
|
17
|
-
const currentMessage = useTamboCurrentMessage();
|
|
18
|
-
return React.createElement("div", null, currentMessage.id);
|
|
19
|
-
};
|
|
20
|
-
render(React.createElement(TamboMessageProvider, { message: message },
|
|
21
|
-
React.createElement(TestComponent, null)));
|
|
22
|
-
expect(screen.getByText("test-message-id")).toBeInTheDocument();
|
|
23
|
-
});
|
|
24
|
-
it("should merge interactable metadata into message", () => {
|
|
25
|
-
const message = createMockMessage();
|
|
26
|
-
const interactableMetadata = {
|
|
27
|
-
id: "interactable-123",
|
|
28
|
-
componentName: "TestComponent",
|
|
29
|
-
description: "Test description",
|
|
30
|
-
};
|
|
31
|
-
const TestComponent = () => {
|
|
32
|
-
const currentMessage = useTamboCurrentMessage();
|
|
33
|
-
return (React.createElement("div", null,
|
|
34
|
-
React.createElement("span", { "data-testid": "message-id" }, currentMessage.id),
|
|
35
|
-
React.createElement("span", { "data-testid": "interactable-id" }, currentMessage.interactableMetadata?.id)));
|
|
36
|
-
};
|
|
37
|
-
render(React.createElement(TamboMessageProvider, { message: message, interactableMetadata: interactableMetadata },
|
|
38
|
-
React.createElement(TestComponent, null)));
|
|
39
|
-
expect(screen.getByTestId("message-id")).toHaveTextContent("test-message-id");
|
|
40
|
-
expect(screen.getByTestId("interactable-id")).toHaveTextContent("interactable-123");
|
|
41
|
-
});
|
|
42
|
-
it("should work without interactable metadata", () => {
|
|
43
|
-
const message = createMockMessage();
|
|
44
|
-
const TestComponent = () => {
|
|
45
|
-
const currentMessage = useTamboCurrentMessage();
|
|
46
|
-
return (React.createElement("div", null,
|
|
47
|
-
React.createElement("span", { "data-testid": "has-metadata" }, currentMessage.interactableMetadata ? "yes" : "no")));
|
|
48
|
-
};
|
|
49
|
-
render(React.createElement(TamboMessageProvider, { message: message },
|
|
50
|
-
React.createElement(TestComponent, null)));
|
|
51
|
-
expect(screen.getByTestId("has-metadata")).toHaveTextContent("no");
|
|
52
|
-
});
|
|
53
|
-
it("should use message.id as key for re-renders", () => {
|
|
54
|
-
const message1 = createMockMessage({ id: "message-1" });
|
|
55
|
-
const message2 = createMockMessage({ id: "message-2" });
|
|
56
|
-
let renderCount = 0;
|
|
57
|
-
const TestComponent = () => {
|
|
58
|
-
renderCount++;
|
|
59
|
-
const currentMessage = useTamboCurrentMessage();
|
|
60
|
-
return React.createElement("div", null, currentMessage.id);
|
|
61
|
-
};
|
|
62
|
-
const { rerender } = render(React.createElement(TamboMessageProvider, { message: message1 },
|
|
63
|
-
React.createElement(TestComponent, null)));
|
|
64
|
-
expect(renderCount).toBe(1);
|
|
65
|
-
expect(screen.getByText("message-1")).toBeInTheDocument();
|
|
66
|
-
// Change to new message - should force re-render due to key change
|
|
67
|
-
rerender(React.createElement(TamboMessageProvider, { message: message2 },
|
|
68
|
-
React.createElement(TestComponent, null)));
|
|
69
|
-
expect(renderCount).toBe(2);
|
|
70
|
-
expect(screen.getByText("message-2")).toBeInTheDocument();
|
|
71
|
-
});
|
|
72
|
-
});
|
|
73
|
-
describe("useTamboCurrentMessage", () => {
|
|
74
|
-
const createMockMessage = (overrides = {}) => ({
|
|
75
|
-
id: "test-message-id",
|
|
76
|
-
threadId: "test-thread-id",
|
|
77
|
-
componentState: {},
|
|
78
|
-
content: [{ type: "text", text: "Test message" }],
|
|
79
|
-
createdAt: new Date().toISOString(),
|
|
80
|
-
role: "assistant",
|
|
81
|
-
...overrides,
|
|
82
|
-
});
|
|
83
|
-
it("should throw error when used outside TamboMessageProvider", () => {
|
|
84
|
-
// Suppress console.error for this test
|
|
85
|
-
const consoleSpy = jest.spyOn(console, "error").mockImplementation();
|
|
86
|
-
expect(() => {
|
|
87
|
-
renderHook(() => useTamboCurrentMessage());
|
|
88
|
-
}).toThrow("useTamboCurrentMessage must be used within a TamboMessageProvider");
|
|
89
|
-
consoleSpy.mockRestore();
|
|
90
|
-
});
|
|
91
|
-
it("should return the current message", () => {
|
|
92
|
-
const message = createMockMessage();
|
|
93
|
-
const wrapper = ({ children }) => (React.createElement(TamboMessageProvider, { message: message }, children));
|
|
94
|
-
const { result } = renderHook(() => useTamboCurrentMessage(), { wrapper });
|
|
95
|
-
expect(result.current).toEqual(expect.objectContaining({
|
|
96
|
-
id: "test-message-id",
|
|
97
|
-
threadId: "test-thread-id",
|
|
98
|
-
}));
|
|
99
|
-
});
|
|
100
|
-
it("should return message with interactable metadata when provided", () => {
|
|
101
|
-
const message = createMockMessage();
|
|
102
|
-
const interactableMetadata = {
|
|
103
|
-
id: "interactable-123",
|
|
104
|
-
componentName: "TestComponent",
|
|
105
|
-
description: "Test description",
|
|
106
|
-
};
|
|
107
|
-
const wrapper = ({ children }) => (React.createElement(TamboMessageProvider, { message: message, interactableMetadata: interactableMetadata }, children));
|
|
108
|
-
const { result } = renderHook(() => useTamboCurrentMessage(), { wrapper });
|
|
109
|
-
expect(result.current.interactableMetadata).toEqual(interactableMetadata);
|
|
110
|
-
});
|
|
111
|
-
});
|
|
112
|
-
describe("useTamboCurrentComponent", () => {
|
|
113
|
-
const createMockMessage = (overrides = {}) => ({
|
|
114
|
-
id: "test-message-id",
|
|
115
|
-
threadId: "test-thread-id",
|
|
116
|
-
componentState: {},
|
|
117
|
-
content: [{ type: "text", text: "Test message" }],
|
|
118
|
-
createdAt: new Date().toISOString(),
|
|
119
|
-
role: "assistant",
|
|
120
|
-
...overrides,
|
|
121
|
-
});
|
|
122
|
-
it("should return null when used outside TamboMessageProvider", () => {
|
|
123
|
-
const { result } = renderHook(() => useTamboCurrentComponent());
|
|
124
|
-
expect(result.current).toBeNull();
|
|
125
|
-
});
|
|
126
|
-
it("should return component info from message.component", () => {
|
|
127
|
-
const message = createMockMessage({
|
|
128
|
-
component: {
|
|
129
|
-
componentName: "WeatherCard",
|
|
130
|
-
componentState: {},
|
|
131
|
-
message: "",
|
|
132
|
-
props: {
|
|
133
|
-
city: "San Francisco",
|
|
134
|
-
temperature: 72,
|
|
135
|
-
},
|
|
136
|
-
},
|
|
137
|
-
});
|
|
138
|
-
const wrapper = ({ children }) => (React.createElement(TamboMessageProvider, { message: message }, children));
|
|
139
|
-
const { result } = renderHook(() => useTamboCurrentComponent(), {
|
|
140
|
-
wrapper,
|
|
141
|
-
});
|
|
142
|
-
expect(result.current).toEqual({
|
|
143
|
-
componentName: "WeatherCard",
|
|
144
|
-
props: {
|
|
145
|
-
city: "San Francisco",
|
|
146
|
-
temperature: 72,
|
|
147
|
-
},
|
|
148
|
-
interactableId: undefined,
|
|
149
|
-
description: undefined,
|
|
150
|
-
threadId: "test-thread-id",
|
|
151
|
-
});
|
|
152
|
-
});
|
|
153
|
-
it("should return interactable metadata when provided", () => {
|
|
154
|
-
const message = createMockMessage({
|
|
155
|
-
component: {
|
|
156
|
-
componentName: "WeatherCard",
|
|
157
|
-
componentState: {},
|
|
158
|
-
message: "",
|
|
159
|
-
props: {
|
|
160
|
-
city: "San Francisco",
|
|
161
|
-
temperature: 72,
|
|
162
|
-
},
|
|
163
|
-
},
|
|
164
|
-
});
|
|
165
|
-
const interactableMetadata = {
|
|
166
|
-
id: "interactable-456",
|
|
167
|
-
componentName: "WeatherCard",
|
|
168
|
-
description: "Shows current weather",
|
|
169
|
-
};
|
|
170
|
-
const wrapper = ({ children }) => (React.createElement(TamboMessageProvider, { message: message, interactableMetadata: interactableMetadata }, children));
|
|
171
|
-
const { result } = renderHook(() => useTamboCurrentComponent(), {
|
|
172
|
-
wrapper,
|
|
173
|
-
});
|
|
174
|
-
expect(result.current).toEqual({
|
|
175
|
-
componentName: "WeatherCard",
|
|
176
|
-
props: {
|
|
177
|
-
city: "San Francisco",
|
|
178
|
-
temperature: 72,
|
|
179
|
-
},
|
|
180
|
-
interactableId: "interactable-456",
|
|
181
|
-
description: "Shows current weather",
|
|
182
|
-
threadId: "test-thread-id",
|
|
183
|
-
});
|
|
184
|
-
});
|
|
185
|
-
it("should prioritize interactableMetadata.componentName over message.component.componentName", () => {
|
|
186
|
-
const message = createMockMessage({
|
|
187
|
-
component: {
|
|
188
|
-
componentName: "OldComponentName",
|
|
189
|
-
componentState: {},
|
|
190
|
-
message: "",
|
|
191
|
-
props: {},
|
|
192
|
-
},
|
|
193
|
-
});
|
|
194
|
-
const interactableMetadata = {
|
|
195
|
-
id: "interactable-789",
|
|
196
|
-
componentName: "NewComponentName",
|
|
197
|
-
description: "New description",
|
|
198
|
-
};
|
|
199
|
-
const wrapper = ({ children }) => (React.createElement(TamboMessageProvider, { message: message, interactableMetadata: interactableMetadata }, children));
|
|
200
|
-
const { result } = renderHook(() => useTamboCurrentComponent(), {
|
|
201
|
-
wrapper,
|
|
202
|
-
});
|
|
203
|
-
expect(result.current?.componentName).toBe("NewComponentName");
|
|
204
|
-
});
|
|
205
|
-
it("should handle message with only interactable metadata (no component)", () => {
|
|
206
|
-
const message = createMockMessage(); // No component field
|
|
207
|
-
const interactableMetadata = {
|
|
208
|
-
id: "interactable-only",
|
|
209
|
-
componentName: "InteractableComponent",
|
|
210
|
-
description: "Interactable only",
|
|
211
|
-
};
|
|
212
|
-
const wrapper = ({ children }) => (React.createElement(TamboMessageProvider, { message: message, interactableMetadata: interactableMetadata }, children));
|
|
213
|
-
const { result } = renderHook(() => useTamboCurrentComponent(), {
|
|
214
|
-
wrapper,
|
|
215
|
-
});
|
|
216
|
-
expect(result.current).toEqual({
|
|
217
|
-
componentName: "InteractableComponent",
|
|
218
|
-
props: undefined,
|
|
219
|
-
interactableId: "interactable-only",
|
|
220
|
-
description: "Interactable only",
|
|
221
|
-
threadId: "test-thread-id",
|
|
222
|
-
});
|
|
223
|
-
});
|
|
224
|
-
it("should handle message with component but no interactable metadata", () => {
|
|
225
|
-
const message = createMockMessage({
|
|
226
|
-
component: {
|
|
227
|
-
componentName: "SimpleComponent",
|
|
228
|
-
componentState: {},
|
|
229
|
-
message: "",
|
|
230
|
-
props: {
|
|
231
|
-
title: "Hello",
|
|
232
|
-
},
|
|
233
|
-
},
|
|
234
|
-
});
|
|
235
|
-
const wrapper = ({ children }) => (React.createElement(TamboMessageProvider, { message: message }, children));
|
|
236
|
-
const { result } = renderHook(() => useTamboCurrentComponent(), {
|
|
237
|
-
wrapper,
|
|
238
|
-
});
|
|
239
|
-
expect(result.current).toEqual({
|
|
240
|
-
componentName: "SimpleComponent",
|
|
241
|
-
props: {
|
|
242
|
-
title: "Hello",
|
|
243
|
-
},
|
|
244
|
-
interactableId: undefined,
|
|
245
|
-
description: undefined,
|
|
246
|
-
threadId: "test-thread-id",
|
|
247
|
-
});
|
|
248
|
-
});
|
|
249
|
-
it("should return undefined for all fields when message has neither component nor interactable metadata", () => {
|
|
250
|
-
const message = createMockMessage(); // Minimal message with no component or interactable data
|
|
251
|
-
const wrapper = ({ children }) => (React.createElement(TamboMessageProvider, { message: message }, children));
|
|
252
|
-
const { result } = renderHook(() => useTamboCurrentComponent(), {
|
|
253
|
-
wrapper,
|
|
254
|
-
});
|
|
255
|
-
expect(result.current).toEqual({
|
|
256
|
-
componentName: undefined,
|
|
257
|
-
props: undefined,
|
|
258
|
-
interactableId: undefined,
|
|
259
|
-
description: undefined,
|
|
260
|
-
threadId: "test-thread-id",
|
|
261
|
-
});
|
|
262
|
-
});
|
|
263
|
-
});
|
|
264
|
-
//# sourceMappingURL=use-current-message.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-current-message.test.js","sourceRoot":"","sources":["../../src/hooks/use-current-message.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import { render, renderHook, screen } from \"@testing-library/react\";\nimport React from \"react\";\nimport {\n InteractableMetadata,\n TamboThreadMessage,\n} from \"../model/generate-component-response\";\nimport {\n TamboMessageProvider,\n useTamboCurrentComponent,\n useTamboCurrentMessage,\n} from \"./use-current-message\";\n\ndescribe(\"TamboMessageProvider\", () => {\n const createMockMessage = (\n overrides: Partial<TamboThreadMessage> = {},\n ): TamboThreadMessage => ({\n id: \"test-message-id\",\n threadId: \"test-thread-id\",\n componentState: {},\n content: [{ type: \"text\", text: \"Test message\" }],\n createdAt: new Date().toISOString(),\n role: \"assistant\",\n ...overrides,\n });\n\n it(\"should provide message context to children\", () => {\n const message = createMockMessage();\n\n const TestComponent = () => {\n const currentMessage = useTamboCurrentMessage();\n return <div>{currentMessage.id}</div>;\n };\n\n render(\n <TamboMessageProvider message={message}>\n <TestComponent />\n </TamboMessageProvider>,\n );\n\n expect(screen.getByText(\"test-message-id\")).toBeInTheDocument();\n });\n\n it(\"should merge interactable metadata into message\", () => {\n const message = createMockMessage();\n const interactableMetadata: InteractableMetadata = {\n id: \"interactable-123\",\n componentName: \"TestComponent\",\n description: \"Test description\",\n };\n\n const TestComponent = () => {\n const currentMessage = useTamboCurrentMessage();\n return (\n <div>\n <span data-testid=\"message-id\">{currentMessage.id}</span>\n <span data-testid=\"interactable-id\">\n {currentMessage.interactableMetadata?.id}\n </span>\n </div>\n );\n };\n\n render(\n <TamboMessageProvider\n message={message}\n interactableMetadata={interactableMetadata}\n >\n <TestComponent />\n </TamboMessageProvider>,\n );\n\n expect(screen.getByTestId(\"message-id\")).toHaveTextContent(\n \"test-message-id\",\n );\n expect(screen.getByTestId(\"interactable-id\")).toHaveTextContent(\n \"interactable-123\",\n );\n });\n\n it(\"should work without interactable metadata\", () => {\n const message = createMockMessage();\n\n const TestComponent = () => {\n const currentMessage = useTamboCurrentMessage();\n return (\n <div>\n <span data-testid=\"has-metadata\">\n {currentMessage.interactableMetadata ? \"yes\" : \"no\"}\n </span>\n </div>\n );\n };\n\n render(\n <TamboMessageProvider message={message}>\n <TestComponent />\n </TamboMessageProvider>,\n );\n\n expect(screen.getByTestId(\"has-metadata\")).toHaveTextContent(\"no\");\n });\n\n it(\"should use message.id as key for re-renders\", () => {\n const message1 = createMockMessage({ id: \"message-1\" });\n const message2 = createMockMessage({ id: \"message-2\" });\n\n let renderCount = 0;\n const TestComponent = () => {\n renderCount++;\n const currentMessage = useTamboCurrentMessage();\n return <div>{currentMessage.id}</div>;\n };\n\n const { rerender } = render(\n <TamboMessageProvider message={message1}>\n <TestComponent />\n </TamboMessageProvider>,\n );\n\n expect(renderCount).toBe(1);\n expect(screen.getByText(\"message-1\")).toBeInTheDocument();\n\n // Change to new message - should force re-render due to key change\n rerender(\n <TamboMessageProvider message={message2}>\n <TestComponent />\n </TamboMessageProvider>,\n );\n\n expect(renderCount).toBe(2);\n expect(screen.getByText(\"message-2\")).toBeInTheDocument();\n });\n});\n\ndescribe(\"useTamboCurrentMessage\", () => {\n const createMockMessage = (\n overrides: Partial<TamboThreadMessage> = {},\n ): TamboThreadMessage => ({\n id: \"test-message-id\",\n threadId: \"test-thread-id\",\n componentState: {},\n content: [{ type: \"text\", text: \"Test message\" }],\n createdAt: new Date().toISOString(),\n role: \"assistant\",\n ...overrides,\n });\n\n it(\"should throw error when used outside TamboMessageProvider\", () => {\n // Suppress console.error for this test\n const consoleSpy = jest.spyOn(console, \"error\").mockImplementation();\n\n expect(() => {\n renderHook(() => useTamboCurrentMessage());\n }).toThrow(\n \"useTamboCurrentMessage must be used within a TamboMessageProvider\",\n );\n\n consoleSpy.mockRestore();\n });\n\n it(\"should return the current message\", () => {\n const message = createMockMessage();\n\n const wrapper = ({ children }: { children: React.ReactNode }) => (\n <TamboMessageProvider message={message}>{children}</TamboMessageProvider>\n );\n\n const { result } = renderHook(() => useTamboCurrentMessage(), { wrapper });\n\n expect(result.current).toEqual(\n expect.objectContaining({\n id: \"test-message-id\",\n threadId: \"test-thread-id\",\n }),\n );\n });\n\n it(\"should return message with interactable metadata when provided\", () => {\n const message = createMockMessage();\n const interactableMetadata: InteractableMetadata = {\n id: \"interactable-123\",\n componentName: \"TestComponent\",\n description: \"Test description\",\n };\n\n const wrapper = ({ children }: { children: React.ReactNode }) => (\n <TamboMessageProvider\n message={message}\n interactableMetadata={interactableMetadata}\n >\n {children}\n </TamboMessageProvider>\n );\n\n const { result } = renderHook(() => useTamboCurrentMessage(), { wrapper });\n\n expect(result.current.interactableMetadata).toEqual(interactableMetadata);\n });\n});\n\ndescribe(\"useTamboCurrentComponent\", () => {\n const createMockMessage = (\n overrides: Partial<TamboThreadMessage> = {},\n ): TamboThreadMessage => ({\n id: \"test-message-id\",\n threadId: \"test-thread-id\",\n componentState: {},\n content: [{ type: \"text\", text: \"Test message\" }],\n createdAt: new Date().toISOString(),\n role: \"assistant\",\n ...overrides,\n });\n\n it(\"should return null when used outside TamboMessageProvider\", () => {\n const { result } = renderHook(() => useTamboCurrentComponent());\n\n expect(result.current).toBeNull();\n });\n\n it(\"should return component info from message.component\", () => {\n const message = createMockMessage({\n component: {\n componentName: \"WeatherCard\",\n componentState: {},\n message: \"\",\n props: {\n city: \"San Francisco\",\n temperature: 72,\n },\n },\n });\n\n const wrapper = ({ children }: { children: React.ReactNode }) => (\n <TamboMessageProvider message={message}>{children}</TamboMessageProvider>\n );\n\n const { result } = renderHook(() => useTamboCurrentComponent(), {\n wrapper,\n });\n\n expect(result.current).toEqual({\n componentName: \"WeatherCard\",\n props: {\n city: \"San Francisco\",\n temperature: 72,\n },\n interactableId: undefined,\n description: undefined,\n threadId: \"test-thread-id\",\n });\n });\n\n it(\"should return interactable metadata when provided\", () => {\n const message = createMockMessage({\n component: {\n componentName: \"WeatherCard\",\n componentState: {},\n message: \"\",\n props: {\n city: \"San Francisco\",\n temperature: 72,\n },\n },\n });\n\n const interactableMetadata: InteractableMetadata = {\n id: \"interactable-456\",\n componentName: \"WeatherCard\",\n description: \"Shows current weather\",\n };\n\n const wrapper = ({ children }: { children: React.ReactNode }) => (\n <TamboMessageProvider\n message={message}\n interactableMetadata={interactableMetadata}\n >\n {children}\n </TamboMessageProvider>\n );\n\n const { result } = renderHook(() => useTamboCurrentComponent(), {\n wrapper,\n });\n\n expect(result.current).toEqual({\n componentName: \"WeatherCard\",\n props: {\n city: \"San Francisco\",\n temperature: 72,\n },\n interactableId: \"interactable-456\",\n description: \"Shows current weather\",\n threadId: \"test-thread-id\",\n });\n });\n\n it(\"should prioritize interactableMetadata.componentName over message.component.componentName\", () => {\n const message = createMockMessage({\n component: {\n componentName: \"OldComponentName\",\n componentState: {},\n message: \"\",\n props: {},\n },\n });\n\n const interactableMetadata: InteractableMetadata = {\n id: \"interactable-789\",\n componentName: \"NewComponentName\",\n description: \"New description\",\n };\n\n const wrapper = ({ children }: { children: React.ReactNode }) => (\n <TamboMessageProvider\n message={message}\n interactableMetadata={interactableMetadata}\n >\n {children}\n </TamboMessageProvider>\n );\n\n const { result } = renderHook(() => useTamboCurrentComponent(), {\n wrapper,\n });\n\n expect(result.current?.componentName).toBe(\"NewComponentName\");\n });\n\n it(\"should handle message with only interactable metadata (no component)\", () => {\n const message = createMockMessage(); // No component field\n\n const interactableMetadata: InteractableMetadata = {\n id: \"interactable-only\",\n componentName: \"InteractableComponent\",\n description: \"Interactable only\",\n };\n\n const wrapper = ({ children }: { children: React.ReactNode }) => (\n <TamboMessageProvider\n message={message}\n interactableMetadata={interactableMetadata}\n >\n {children}\n </TamboMessageProvider>\n );\n\n const { result } = renderHook(() => useTamboCurrentComponent(), {\n wrapper,\n });\n\n expect(result.current).toEqual({\n componentName: \"InteractableComponent\",\n props: undefined,\n interactableId: \"interactable-only\",\n description: \"Interactable only\",\n threadId: \"test-thread-id\",\n });\n });\n\n it(\"should handle message with component but no interactable metadata\", () => {\n const message = createMockMessage({\n component: {\n componentName: \"SimpleComponent\",\n componentState: {},\n message: \"\",\n props: {\n title: \"Hello\",\n },\n },\n });\n\n const wrapper = ({ children }: { children: React.ReactNode }) => (\n <TamboMessageProvider message={message}>{children}</TamboMessageProvider>\n );\n\n const { result } = renderHook(() => useTamboCurrentComponent(), {\n wrapper,\n });\n\n expect(result.current).toEqual({\n componentName: \"SimpleComponent\",\n props: {\n title: \"Hello\",\n },\n interactableId: undefined,\n description: undefined,\n threadId: \"test-thread-id\",\n });\n });\n\n it(\"should return undefined for all fields when message has neither component nor interactable metadata\", () => {\n const message = createMockMessage(); // Minimal message with no component or interactable data\n\n const wrapper = ({ children }: { children: React.ReactNode }) => (\n <TamboMessageProvider message={message}>{children}</TamboMessageProvider>\n );\n\n const { result } = renderHook(() => useTamboCurrentComponent(), {\n wrapper,\n });\n\n expect(result.current).toEqual({\n componentName: undefined,\n props: undefined,\n interactableId: undefined,\n description: undefined,\n threadId: \"test-thread-id\",\n });\n });\n});\n"]}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Low-level helper that merges streamed props into state.
|
|
3
|
-
* @deprecated Use `useTamboComponentState` with `setFromProp` instead.
|
|
4
|
-
* This hook will be removed in 1.0.0.
|
|
5
|
-
* @see {@link https://docs.tambo.co/concepts/generative-interfaces/component-state}
|
|
6
|
-
* @param currentState - Current state object
|
|
7
|
-
* @param setState - State setter function
|
|
8
|
-
* @param streamingProps - Props to merge into state when they change
|
|
9
|
-
*/
|
|
10
|
-
export declare function useTamboStreamingProps<T extends Record<string, any>>(currentState: T | undefined, setState: (state: T) => void, streamingProps: Partial<T>): void;
|
|
11
|
-
//# sourceMappingURL=use-streaming-props.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-streaming-props.d.ts","sourceRoot":"","sources":["../../src/hooks/use-streaming-props.tsx"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAClE,YAAY,EAAE,CAAC,GAAG,SAAS,EAC3B,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,EAC5B,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC,QAwB3B"}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { useEffect } from "react";
|
|
3
|
-
/**
|
|
4
|
-
* Low-level helper that merges streamed props into state.
|
|
5
|
-
* @deprecated Use `useTamboComponentState` with `setFromProp` instead.
|
|
6
|
-
* This hook will be removed in 1.0.0.
|
|
7
|
-
* @see {@link https://docs.tambo.co/concepts/generative-interfaces/component-state}
|
|
8
|
-
* @param currentState - Current state object
|
|
9
|
-
* @param setState - State setter function
|
|
10
|
-
* @param streamingProps - Props to merge into state when they change
|
|
11
|
-
*/
|
|
12
|
-
export function useTamboStreamingProps(currentState, setState, streamingProps) {
|
|
13
|
-
useEffect(() => {
|
|
14
|
-
if (currentState) {
|
|
15
|
-
let shouldUpdate = false;
|
|
16
|
-
const updates = {};
|
|
17
|
-
Object.entries(streamingProps).forEach(([key, value]) => {
|
|
18
|
-
if (value !== undefined && value !== currentState[key]) {
|
|
19
|
-
shouldUpdate = true;
|
|
20
|
-
updates[key] = value;
|
|
21
|
-
}
|
|
22
|
-
});
|
|
23
|
-
if (shouldUpdate) {
|
|
24
|
-
setState({
|
|
25
|
-
...currentState,
|
|
26
|
-
...updates,
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
// Only run when streamingProps change
|
|
31
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
32
|
-
}, [...Object.values(streamingProps)]);
|
|
33
|
-
}
|
|
34
|
-
//# sourceMappingURL=use-streaming-props.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-streaming-props.js","sourceRoot":"","sources":["../../src/hooks/use-streaming-props.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElC;;;;;;;;GAQG;AACH,MAAM,UAAU,sBAAsB,CACpC,YAA2B,EAC3B,QAA4B,EAC5B,cAA0B;IAE1B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,YAAY,GAAG,KAAK,CAAC;YACzB,MAAM,OAAO,GAAe,EAAE,CAAC;YAE/B,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;gBACtD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;oBACvD,YAAY,GAAG,IAAI,CAAC;oBACpB,OAAO,CAAC,GAAc,CAAC,GAAG,KAAmB,CAAC;gBAChD,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,IAAI,YAAY,EAAE,CAAC;gBACjB,QAAQ,CAAC;oBACP,GAAG,YAAY;oBACf,GAAG,OAAO;iBACX,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,sCAAsC;QACtC,uDAAuD;IACzD,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;AACzC,CAAC","sourcesContent":["\"use client\";\n\nimport { useEffect } from \"react\";\n\n/**\n * Low-level helper that merges streamed props into state.\n * @deprecated Use `useTamboComponentState` with `setFromProp` instead.\n * This hook will be removed in 1.0.0.\n * @see {@link https://docs.tambo.co/concepts/generative-interfaces/component-state}\n * @param currentState - Current state object\n * @param setState - State setter function\n * @param streamingProps - Props to merge into state when they change\n */\nexport function useTamboStreamingProps<T extends Record<string, any>>(\n currentState: T | undefined,\n setState: (state: T) => void,\n streamingProps: Partial<T>,\n) {\n useEffect(() => {\n if (currentState) {\n let shouldUpdate = false;\n const updates: Partial<T> = {};\n\n Object.entries(streamingProps).forEach(([key, value]) => {\n if (value !== undefined && value !== currentState[key]) {\n shouldUpdate = true;\n updates[key as keyof T] = value as T[keyof T];\n }\n });\n\n if (shouldUpdate) {\n setState({\n ...currentState,\n ...updates,\n });\n }\n }\n // Only run when streamingProps change\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [...Object.values(streamingProps)]);\n}\n"]}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import TamboAI from "@tambo-ai/typescript-sdk";
|
|
2
|
-
import { CombinedMutationResult } from "../util/query-utils.js";
|
|
3
|
-
import { UseTamboMutationResult, UseTamboQueryResult } from "./react-query-hooks.js";
|
|
4
|
-
/**
|
|
5
|
-
* Configuration options for the useTamboSuggestions hook
|
|
6
|
-
*/
|
|
7
|
-
export interface useTamboSuggestionsOptions {
|
|
8
|
-
/** Maximum number of suggestions to generate (1-10, default 3) */
|
|
9
|
-
maxSuggestions?: number;
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Return value interface for useTamboSuggestions hook
|
|
13
|
-
*/
|
|
14
|
-
export interface useTamboSuggestionsResultInternal {
|
|
15
|
-
/** List of available suggestions (also available in generateResult.data) */
|
|
16
|
-
suggestions: TamboAI.Beta.Threads.Suggestion[];
|
|
17
|
-
/** ID of the currently selected suggestion */
|
|
18
|
-
selectedSuggestionId: string | null;
|
|
19
|
-
/**
|
|
20
|
-
* Accept and apply a suggestion (also available in acceptResult.mutateAsync)
|
|
21
|
-
* @param suggestion - The suggestion to accept
|
|
22
|
-
* @param shouldSubmit - Whether to automatically submit after accepting (default: false)
|
|
23
|
-
*/
|
|
24
|
-
accept: (acceptOptions: {
|
|
25
|
-
suggestion: TamboAI.Beta.Threads.Suggestion;
|
|
26
|
-
shouldSubmit?: boolean;
|
|
27
|
-
}) => Promise<void>;
|
|
28
|
-
/** Result and network state for accepting a suggestion */
|
|
29
|
-
acceptResult: UseTamboMutationResult<void, Error, {
|
|
30
|
-
suggestion: TamboAI.Beta.Threads.Suggestion;
|
|
31
|
-
shouldSubmit?: boolean;
|
|
32
|
-
}>;
|
|
33
|
-
/** Result and network state for generating suggestions */
|
|
34
|
-
generateResult: UseTamboMutationResult<TamboAI.Beta.Threads.Suggestions.SuggestionGenerateResponse | undefined, Error, AbortController>;
|
|
35
|
-
/** The full suggestions query object from React Query */
|
|
36
|
-
suggestionsResult: UseTamboQueryResult<TamboAI.Beta.Threads.Suggestions.SuggestionGenerateResponse | undefined>;
|
|
37
|
-
}
|
|
38
|
-
type useTamboSuggestionsResult = CombinedMutationResult<any, Error> & useTamboSuggestionsResultInternal;
|
|
39
|
-
/**
|
|
40
|
-
* Hook for managing Tambo AI suggestions in a thread
|
|
41
|
-
* @param options - Configuration options for suggestion generation
|
|
42
|
-
* @returns Object containing suggestions state and control functions
|
|
43
|
-
*/
|
|
44
|
-
export declare function useTamboSuggestions(options?: useTamboSuggestionsOptions): useTamboSuggestionsResult;
|
|
45
|
-
export {};
|
|
46
|
-
//# sourceMappingURL=use-suggestions.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-suggestions.d.ts","sourceRoot":"","sources":["../../src/hooks/use-suggestions.ts"],"names":[],"mappings":"AACA,OAAO,OAAO,MAAM,0BAA0B,CAAC;AAY/C,OAAO,EACL,sBAAsB,EAEvB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EAGpB,MAAM,qBAAqB,CAAC;AAE7B;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,kEAAkE;IAClE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,iCAAiC;IAChD,4EAA4E;IAC5E,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;IAC/C,8CAA8C;IAC9C,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC;;;;OAIG;IACH,MAAM,EAAE,CAAC,aAAa,EAAE;QACtB,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;QAC5C,YAAY,CAAC,EAAE,OAAO,CAAC;KACxB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpB,0DAA0D;IAC1D,YAAY,EAAE,sBAAsB,CAClC,IAAI,EACJ,KAAK,EACL;QAAE,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,CACxE,CAAC;IAEF,0DAA0D;IAC1D,cAAc,EAAE,sBAAsB,CACpC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,0BAA0B,GAAG,SAAS,EACvE,KAAK,EACL,eAAe,CAChB,CAAC;IAEF,yDAAyD;IACzD,iBAAiB,EAAE,mBAAmB,CACpC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,0BAA0B,GAAG,SAAS,CACxE,CAAC;CACH;AAED,KAAK,yBAAyB,GAAG,sBAAsB,CAAC,GAAG,EAAE,KAAK,CAAC,GACjE,iCAAiC,CAAC;AAEpC;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,GAAE,0BAA+B,GACvC,yBAAyB,CAsI3B"}
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { useEffect, useState } from "react";
|
|
3
|
-
import { isIdleStage } from "../model/generate-component-response.js";
|
|
4
|
-
import { validateInput } from "../model/validate-input.js";
|
|
5
|
-
import { useTamboClient } from "../providers/tambo-client-provider.js";
|
|
6
|
-
import { useTambo } from "../providers/tambo-provider.js";
|
|
7
|
-
import { useTamboRegistry } from "../providers/tambo-registry-provider.js";
|
|
8
|
-
import { INPUT_ERROR_MESSAGES, useTamboThreadInput, } from "../providers/tambo-thread-input-provider.js";
|
|
9
|
-
import { useTamboThread } from "../providers/tambo-thread-provider.js";
|
|
10
|
-
import { combineMutationResults, } from "../util/query-utils.js";
|
|
11
|
-
import { getAvailableComponents } from "../util/registry.js";
|
|
12
|
-
import { useTamboMutation, useTamboQuery, } from "./react-query-hooks.js";
|
|
13
|
-
/**
|
|
14
|
-
* Hook for managing Tambo AI suggestions in a thread
|
|
15
|
-
* @param options - Configuration options for suggestion generation
|
|
16
|
-
* @returns Object containing suggestions state and control functions
|
|
17
|
-
*/
|
|
18
|
-
export function useTamboSuggestions(options = {}) {
|
|
19
|
-
const { maxSuggestions = 3 } = options;
|
|
20
|
-
const { thread, generationStage } = useTamboThread();
|
|
21
|
-
const { sendThreadMessage } = useTambo();
|
|
22
|
-
const tamboClient = useTamboClient();
|
|
23
|
-
const { componentList, toolRegistry, componentToolAssociations } = useTamboRegistry();
|
|
24
|
-
const [selectedSuggestionId, setSelectedSuggestionId] = useState(null);
|
|
25
|
-
const { setValue: setInputValue } = useTamboThreadInput();
|
|
26
|
-
const latestMessage = thread.messages[thread.messages.length - 1];
|
|
27
|
-
const isLatestFromTambo = latestMessage?.role === "assistant";
|
|
28
|
-
const latestMessageId = latestMessage?.id;
|
|
29
|
-
// Reset selected suggestion when the message changes
|
|
30
|
-
useEffect(() => {
|
|
31
|
-
setSelectedSuggestionId(null);
|
|
32
|
-
}, [latestMessageId]);
|
|
33
|
-
const shouldGenerateSuggestions = latestMessageId && isLatestFromTambo && isIdleStage(generationStage);
|
|
34
|
-
// Use React Query to fetch suggestions when a new hydra message is received
|
|
35
|
-
const suggestionsResult = useTamboQuery({
|
|
36
|
-
// Make sure the query key changes when the message changes, so that we are
|
|
37
|
-
// always generating suggestions when there is a new message
|
|
38
|
-
queryKey: [
|
|
39
|
-
"suggestions",
|
|
40
|
-
shouldGenerateSuggestions ? latestMessageId : null,
|
|
41
|
-
],
|
|
42
|
-
queryFn: async () => {
|
|
43
|
-
if (!shouldGenerateSuggestions) {
|
|
44
|
-
return [];
|
|
45
|
-
}
|
|
46
|
-
// Get registered components from the registry
|
|
47
|
-
const components = getAvailableComponents(componentList, toolRegistry, componentToolAssociations);
|
|
48
|
-
return await tamboClient.beta.threads.suggestions.generate(latestMessageId, {
|
|
49
|
-
id: thread.id,
|
|
50
|
-
maxSuggestions,
|
|
51
|
-
availableComponents: components,
|
|
52
|
-
});
|
|
53
|
-
},
|
|
54
|
-
// Only run the query if we have a valid message from hydra
|
|
55
|
-
enabled: Boolean(latestMessageId && isLatestFromTambo),
|
|
56
|
-
// Don't refetch on window focus or reconnect
|
|
57
|
-
refetchOnWindowFocus: false,
|
|
58
|
-
refetchOnReconnect: false,
|
|
59
|
-
// Don't retry on failure
|
|
60
|
-
retry: false,
|
|
61
|
-
});
|
|
62
|
-
// Accept suggestion mutation
|
|
63
|
-
const acceptMutationState = useTamboMutation({
|
|
64
|
-
mutationFn: async ({ suggestion, shouldSubmit = false }) => {
|
|
65
|
-
const validation = validateInput(suggestion.detailedSuggestion);
|
|
66
|
-
if (!validation.isValid) {
|
|
67
|
-
if (validation.error) {
|
|
68
|
-
throw validation.error;
|
|
69
|
-
}
|
|
70
|
-
throw new Error(INPUT_ERROR_MESSAGES.VALIDATION);
|
|
71
|
-
}
|
|
72
|
-
if (shouldSubmit) {
|
|
73
|
-
await sendThreadMessage(validation.sanitizedInput, {
|
|
74
|
-
threadId: thread.id,
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
else {
|
|
78
|
-
setInputValue(validation.sanitizedInput);
|
|
79
|
-
}
|
|
80
|
-
setSelectedSuggestionId(suggestion.id);
|
|
81
|
-
},
|
|
82
|
-
});
|
|
83
|
-
// Generate suggestions mutation
|
|
84
|
-
const generateMutationState = useTamboMutation({
|
|
85
|
-
mutationFn: async (abortController) => {
|
|
86
|
-
if (!shouldGenerateSuggestions) {
|
|
87
|
-
return undefined;
|
|
88
|
-
}
|
|
89
|
-
// Get registered components from the registry
|
|
90
|
-
const components = getAvailableComponents(componentList, toolRegistry, componentToolAssociations);
|
|
91
|
-
return await tamboClient.beta.threads.suggestions.generate(latestMessageId, {
|
|
92
|
-
id: thread.id,
|
|
93
|
-
maxSuggestions,
|
|
94
|
-
availableComponents: components,
|
|
95
|
-
}, { signal: abortController.signal });
|
|
96
|
-
},
|
|
97
|
-
// Don't retry on failure
|
|
98
|
-
retry: false,
|
|
99
|
-
});
|
|
100
|
-
// Use the query data if available, otherwise use the mutation data
|
|
101
|
-
// Only return suggestions if the latest message is from hydra
|
|
102
|
-
const suggestions = isLatestFromTambo
|
|
103
|
-
? (suggestionsResult.data ?? generateMutationState.data ?? [])
|
|
104
|
-
: [];
|
|
105
|
-
return {
|
|
106
|
-
suggestions,
|
|
107
|
-
accept: acceptMutationState.mutateAsync,
|
|
108
|
-
selectedSuggestionId,
|
|
109
|
-
acceptResult: acceptMutationState,
|
|
110
|
-
generateResult: generateMutationState,
|
|
111
|
-
suggestionsResult,
|
|
112
|
-
...combineMutationResults(acceptMutationState, generateMutationState),
|
|
113
|
-
};
|
|
114
|
-
}
|
|
115
|
-
//# sourceMappingURL=use-suggestions.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-suggestions.js","sourceRoot":"","sources":["../../src/hooks/use-suggestions.ts"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\nimport TamboAI from \"@tambo-ai/typescript-sdk\";\nimport { useEffect, useState } from \"react\";\nimport { isIdleStage } from \"../model/generate-component-response\";\nimport { validateInput } from \"../model/validate-input\";\nimport { useTamboClient } from \"../providers/tambo-client-provider\";\nimport { useTambo } from \"../providers/tambo-provider\";\nimport { useTamboRegistry } from \"../providers/tambo-registry-provider\";\nimport {\n INPUT_ERROR_MESSAGES,\n useTamboThreadInput,\n} from \"../providers/tambo-thread-input-provider\";\nimport { useTamboThread } from \"../providers/tambo-thread-provider\";\nimport {\n CombinedMutationResult,\n combineMutationResults,\n} from \"../util/query-utils\";\nimport { getAvailableComponents } from \"../util/registry\";\nimport {\n UseTamboMutationResult,\n UseTamboQueryResult,\n useTamboMutation,\n useTamboQuery,\n} from \"./react-query-hooks\";\n\n/**\n * Configuration options for the useTamboSuggestions hook\n */\nexport interface useTamboSuggestionsOptions {\n /** Maximum number of suggestions to generate (1-10, default 3) */\n maxSuggestions?: number;\n}\n\n/**\n * Return value interface for useTamboSuggestions hook\n */\nexport interface useTamboSuggestionsResultInternal {\n /** List of available suggestions (also available in generateResult.data) */\n suggestions: TamboAI.Beta.Threads.Suggestion[];\n /** ID of the currently selected suggestion */\n selectedSuggestionId: string | null;\n /**\n * Accept and apply a suggestion (also available in acceptResult.mutateAsync)\n * @param suggestion - The suggestion to accept\n * @param shouldSubmit - Whether to automatically submit after accepting (default: false)\n */\n accept: (acceptOptions: {\n suggestion: TamboAI.Beta.Threads.Suggestion;\n shouldSubmit?: boolean;\n }) => Promise<void>;\n\n /** Result and network state for accepting a suggestion */\n acceptResult: UseTamboMutationResult<\n void,\n Error,\n { suggestion: TamboAI.Beta.Threads.Suggestion; shouldSubmit?: boolean }\n >;\n\n /** Result and network state for generating suggestions */\n generateResult: UseTamboMutationResult<\n TamboAI.Beta.Threads.Suggestions.SuggestionGenerateResponse | undefined,\n Error,\n AbortController\n >;\n\n /** The full suggestions query object from React Query */\n suggestionsResult: UseTamboQueryResult<\n TamboAI.Beta.Threads.Suggestions.SuggestionGenerateResponse | undefined\n >;\n}\n\ntype useTamboSuggestionsResult = CombinedMutationResult<any, Error> &\n useTamboSuggestionsResultInternal;\n\n/**\n * Hook for managing Tambo AI suggestions in a thread\n * @param options - Configuration options for suggestion generation\n * @returns Object containing suggestions state and control functions\n */\nexport function useTamboSuggestions(\n options: useTamboSuggestionsOptions = {},\n): useTamboSuggestionsResult {\n const { maxSuggestions = 3 } = options;\n const { thread, generationStage } = useTamboThread();\n const { sendThreadMessage } = useTambo();\n const tamboClient = useTamboClient();\n const { componentList, toolRegistry, componentToolAssociations } =\n useTamboRegistry();\n\n const [selectedSuggestionId, setSelectedSuggestionId] = useState<\n string | null\n >(null);\n const { setValue: setInputValue } = useTamboThreadInput();\n\n const latestMessage = thread.messages[thread.messages.length - 1];\n const isLatestFromTambo = latestMessage?.role === \"assistant\";\n const latestMessageId = latestMessage?.id;\n\n // Reset selected suggestion when the message changes\n useEffect(() => {\n setSelectedSuggestionId(null);\n }, [latestMessageId]);\n\n const shouldGenerateSuggestions =\n latestMessageId && isLatestFromTambo && isIdleStage(generationStage);\n // Use React Query to fetch suggestions when a new hydra message is received\n const suggestionsResult = useTamboQuery({\n // Make sure the query key changes when the message changes, so that we are\n // always generating suggestions when there is a new message\n queryKey: [\n \"suggestions\",\n shouldGenerateSuggestions ? latestMessageId : null,\n ],\n queryFn: async () => {\n if (!shouldGenerateSuggestions) {\n return [];\n }\n\n // Get registered components from the registry\n const components = getAvailableComponents(\n componentList,\n toolRegistry,\n componentToolAssociations,\n );\n\n return await tamboClient.beta.threads.suggestions.generate(\n latestMessageId,\n {\n id: thread.id,\n maxSuggestions,\n availableComponents: components,\n },\n );\n },\n // Only run the query if we have a valid message from hydra\n enabled: Boolean(latestMessageId && isLatestFromTambo),\n // Don't refetch on window focus or reconnect\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n // Don't retry on failure\n retry: false,\n });\n\n // Accept suggestion mutation\n const acceptMutationState = useTamboMutation<\n void,\n Error,\n { suggestion: TamboAI.Beta.Threads.Suggestion; shouldSubmit?: boolean }\n >({\n mutationFn: async ({ suggestion, shouldSubmit = false }) => {\n const validation = validateInput(suggestion.detailedSuggestion);\n if (!validation.isValid) {\n if (validation.error) {\n throw validation.error;\n }\n throw new Error(INPUT_ERROR_MESSAGES.VALIDATION);\n }\n\n if (shouldSubmit) {\n await sendThreadMessage(validation.sanitizedInput, {\n threadId: thread.id,\n });\n } else {\n setInputValue(validation.sanitizedInput);\n }\n setSelectedSuggestionId(suggestion.id);\n },\n });\n\n // Generate suggestions mutation\n const generateMutationState = useTamboMutation<\n TamboAI.Beta.Threads.Suggestions.SuggestionGenerateResponse | undefined,\n Error,\n AbortController\n >({\n mutationFn: async (abortController: AbortController) => {\n if (!shouldGenerateSuggestions) {\n return undefined;\n }\n\n // Get registered components from the registry\n const components = getAvailableComponents(\n componentList,\n toolRegistry,\n componentToolAssociations,\n );\n return await tamboClient.beta.threads.suggestions.generate(\n latestMessageId,\n {\n id: thread.id,\n maxSuggestions,\n availableComponents: components,\n },\n { signal: abortController.signal },\n );\n },\n // Don't retry on failure\n retry: false,\n });\n\n // Use the query data if available, otherwise use the mutation data\n // Only return suggestions if the latest message is from hydra\n const suggestions = isLatestFromTambo\n ? (suggestionsResult.data ?? generateMutationState.data ?? [])\n : [];\n\n return {\n suggestions,\n accept: acceptMutationState.mutateAsync,\n selectedSuggestionId,\n acceptResult: acceptMutationState,\n generateResult: generateMutationState,\n suggestionsResult,\n ...combineMutationResults(acceptMutationState, generateMutationState),\n };\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-suggestions.test.d.ts","sourceRoot":"","sources":["../../src/hooks/use-suggestions.test.tsx"],"names":[],"mappings":""}
|