@tambo-ai/react 0.73.0 → 0.74.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -12
- package/dist/hooks/use-component-state.d.ts +1 -1
- package/dist/hooks/use-component-state.js.map +1 -1
- package/dist/hooks/use-streaming-props.d.ts +1 -1
- package/dist/hooks/use-streaming-props.js +1 -1
- package/dist/hooks/use-streaming-props.js.map +1 -1
- package/dist/hooks/use-tambo-stream-status.d.ts +1 -1
- package/dist/hooks/use-tambo-stream-status.js +1 -1
- package/dist/hooks/use-tambo-stream-status.js.map +1 -1
- package/dist/mcp/mcp-hooks.d.ts +4 -0
- package/dist/mcp/mcp-hooks.d.ts.map +1 -1
- package/dist/mcp/mcp-hooks.js +4 -0
- package/dist/mcp/mcp-hooks.js.map +1 -1
- package/dist/providers/tambo-interactable-provider-partial-updates.test.js +3 -3
- package/dist/providers/tambo-interactable-provider-partial-updates.test.js.map +1 -1
- package/dist/providers/tambo-interactable-provider.js +2 -2
- package/dist/providers/tambo-interactable-provider.js.map +1 -1
- package/dist/providers/tambo-interactable-provider.test.js +3 -3
- package/dist/providers/tambo-interactable-provider.test.js.map +1 -1
- package/dist/providers/tambo-provider.d.ts +3 -0
- package/dist/providers/tambo-provider.d.ts.map +1 -1
- package/dist/providers/tambo-provider.js +3 -0
- package/dist/providers/tambo-provider.js.map +1 -1
- package/dist/providers/tambo-thread-input-provider.d.ts.map +1 -1
- package/dist/providers/tambo-thread-input-provider.js +1 -0
- package/dist/providers/tambo-thread-input-provider.js.map +1 -1
- package/dist/util/resource-content-resolver.d.ts.map +1 -1
- package/dist/util/resource-content-resolver.js +2 -0
- package/dist/util/resource-content-resolver.js.map +1 -1
- package/dist/v1/__tests__/v1-interactables.test.d.ts +2 -0
- package/dist/v1/__tests__/v1-interactables.test.d.ts.map +1 -0
- package/dist/v1/__tests__/v1-interactables.test.js +135 -0
- package/dist/v1/__tests__/v1-interactables.test.js.map +1 -0
- package/dist/v1/components/v1-component-renderer.d.ts +48 -0
- package/dist/v1/components/v1-component-renderer.d.ts.map +1 -0
- package/dist/v1/components/v1-component-renderer.js +137 -0
- package/dist/v1/components/v1-component-renderer.js.map +1 -0
- package/dist/v1/components/v1-component-renderer.test.d.ts +2 -0
- package/dist/v1/components/v1-component-renderer.test.d.ts.map +1 -0
- package/dist/v1/components/v1-component-renderer.test.js +270 -0
- package/dist/v1/components/v1-component-renderer.test.js.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-component-state.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-component-state.js +2 -25
- package/dist/v1/hooks/use-tambo-v1-component-state.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-component-state.test.js +2 -1
- package/dist/v1/hooks/use-tambo-v1-component-state.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-messages.test.js +25 -1
- package/dist/v1/hooks/use-tambo-v1-messages.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-send-message.d.ts +18 -0
- package/dist/v1/hooks/use-tambo-v1-send-message.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-send-message.js +204 -17
- package/dist/v1/hooks/use-tambo-v1-send-message.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-send-message.test.js +261 -7
- 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 +90 -0
- package/dist/v1/hooks/use-tambo-v1-stream-status.d.ts.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-stream-status.js +179 -0
- package/dist/v1/hooks/use-tambo-v1-stream-status.js.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-stream-status.test.d.ts +2 -0
- package/dist/v1/hooks/use-tambo-v1-stream-status.test.d.ts.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-stream-status.test.js +371 -0
- package/dist/v1/hooks/use-tambo-v1-stream-status.test.js.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-suggestions.d.ts +78 -54
- package/dist/v1/hooks/use-tambo-v1-suggestions.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-suggestions.js +153 -87
- package/dist/v1/hooks/use-tambo-v1-suggestions.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-suggestions.test.js +213 -134
- package/dist/v1/hooks/use-tambo-v1-suggestions.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread-input.test.js +148 -13
- 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 +8 -21
- package/dist/v1/hooks/use-tambo-v1-thread-list.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread-list.js +11 -10
- package/dist/v1/hooks/use-tambo-v1-thread-list.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread-list.test.js +37 -2
- package/dist/v1/hooks/use-tambo-v1-thread-list.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread.d.ts +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread.js +2 -7
- package/dist/v1/hooks/use-tambo-v1-thread.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread.test.js +2 -0
- package/dist/v1/hooks/use-tambo-v1-thread.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1.d.ts +12 -28
- package/dist/v1/hooks/use-tambo-v1.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1.js +164 -31
- package/dist/v1/hooks/use-tambo-v1.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1.test.js +891 -18
- package/dist/v1/hooks/use-tambo-v1.test.js.map +1 -1
- package/dist/v1/index.d.ts +7 -1
- package/dist/v1/index.d.ts.map +1 -1
- package/dist/v1/index.js +18 -1
- package/dist/v1/index.js.map +1 -1
- package/dist/v1/providers/tambo-v1-provider.d.ts +16 -6
- package/dist/v1/providers/tambo-v1-provider.d.ts.map +1 -1
- package/dist/v1/providers/tambo-v1-provider.js +14 -19
- package/dist/v1/providers/tambo-v1-provider.js.map +1 -1
- package/dist/v1/providers/tambo-v1-provider.test.js +34 -20
- package/dist/v1/providers/tambo-v1-provider.test.js.map +1 -1
- package/dist/v1/providers/tambo-v1-stream-context.d.ts +3 -3
- package/dist/v1/providers/tambo-v1-stream-context.d.ts.map +1 -1
- package/dist/v1/providers/tambo-v1-stream-context.js +60 -12
- package/dist/v1/providers/tambo-v1-stream-context.js.map +1 -1
- package/dist/v1/providers/tambo-v1-stream-context.test.js +49 -20
- package/dist/v1/providers/tambo-v1-stream-context.test.js.map +1 -1
- package/dist/v1/providers/tambo-v1-stub-provider.d.ts.map +1 -1
- package/dist/v1/providers/tambo-v1-stub-provider.js +2 -0
- package/dist/v1/providers/tambo-v1-stub-provider.js.map +1 -1
- package/dist/v1/providers/tambo-v1-stub-provider.test.js +7 -6
- package/dist/v1/providers/tambo-v1-stub-provider.test.js.map +1 -1
- package/dist/v1/providers/tambo-v1-thread-input-provider.d.ts +1 -6
- package/dist/v1/providers/tambo-v1-thread-input-provider.d.ts.map +1 -1
- package/dist/v1/providers/tambo-v1-thread-input-provider.js +14 -12
- package/dist/v1/providers/tambo-v1-thread-input-provider.js.map +1 -1
- package/dist/v1/types/event.d.ts +9 -1
- package/dist/v1/types/event.d.ts.map +1 -1
- package/dist/v1/types/event.js.map +1 -1
- package/dist/v1/types/event.test.js +5 -1
- package/dist/v1/types/event.test.js.map +1 -1
- package/dist/v1/types/message.d.ts +65 -7
- package/dist/v1/types/message.d.ts.map +1 -1
- package/dist/v1/types/message.js.map +1 -1
- package/dist/v1/types/thread.d.ts +4 -0
- package/dist/v1/types/thread.d.ts.map +1 -1
- package/dist/v1/types/thread.js.map +1 -1
- package/dist/v1/utils/event-accumulator.d.ts +40 -4
- package/dist/v1/utils/event-accumulator.d.ts.map +1 -1
- package/dist/v1/utils/event-accumulator.js +444 -35
- package/dist/v1/utils/event-accumulator.js.map +1 -1
- package/dist/v1/utils/event-accumulator.test.js +1041 -28
- package/dist/v1/utils/event-accumulator.test.js.map +1 -1
- package/dist/v1/utils/registry-conversion.d.ts +9 -9
- package/dist/v1/utils/registry-conversion.d.ts.map +1 -1
- package/dist/v1/utils/registry-conversion.js +10 -11
- package/dist/v1/utils/registry-conversion.js.map +1 -1
- package/dist/v1/utils/registry-conversion.test.js +39 -11
- package/dist/v1/utils/registry-conversion.test.js.map +1 -1
- package/dist/v1/utils/thread-utils.d.ts +16 -0
- package/dist/v1/utils/thread-utils.d.ts.map +1 -0
- package/dist/v1/utils/thread-utils.js +34 -0
- package/dist/v1/utils/thread-utils.js.map +1 -0
- package/dist/v1/utils/tool-executor.d.ts.map +1 -1
- package/dist/v1/utils/tool-executor.js +2 -0
- package/dist/v1/utils/tool-executor.js.map +1 -1
- package/dist/v1/utils/tool-executor.test.js +5 -0
- package/dist/v1/utils/tool-executor.test.js.map +1 -1
- package/esm/context-helpers/context-helpers-provider.test.js +2 -2
- package/esm/context-helpers/context-helpers.test.js +1 -1
- package/esm/context-helpers/current-interactables-context-helper.d.ts +1 -1
- package/esm/context-helpers/current-page-context-helper.d.ts +1 -1
- package/esm/context-helpers/current-time-context-helper.d.ts +1 -1
- package/esm/context-helpers/index.d.ts +4 -4
- package/esm/context-helpers/index.js +4 -4
- package/esm/hoc/with-tambo-interactable.d.ts +1 -1
- package/esm/hoc/with-tambo-interactable.js +2 -2
- package/esm/hoc/with-tambo-interactable.test.js +3 -3
- package/esm/hooks/index.d.ts +8 -8
- package/esm/hooks/index.js +8 -8
- package/esm/hooks/react-query-hooks.js +1 -1
- package/esm/hooks/use-component-state.d.ts +1 -1
- package/esm/hooks/use-component-state.js +3 -3
- package/esm/hooks/use-component-state.js.map +1 -1
- package/esm/hooks/use-component-state.test.js +5 -5
- package/esm/hooks/use-current-message.d.ts +1 -1
- package/esm/hooks/use-current-message.test.js +1 -1
- package/esm/hooks/use-message-images.test.js +1 -1
- package/esm/hooks/use-streaming-props.d.ts +1 -1
- package/esm/hooks/use-streaming-props.js +1 -1
- package/esm/hooks/use-streaming-props.js.map +1 -1
- package/esm/hooks/use-suggestions.d.ts +2 -2
- package/esm/hooks/use-suggestions.js +10 -10
- package/esm/hooks/use-suggestions.test.js +7 -7
- package/esm/hooks/use-tambo-stream-status.d.ts +1 -1
- package/esm/hooks/use-tambo-stream-status.js +4 -4
- package/esm/hooks/use-tambo-stream-status.js.map +1 -1
- package/esm/hooks/use-tambo-stream-status.test.js +4 -4
- package/esm/hooks/use-tambo-threads.js +3 -3
- package/esm/hooks/use-tambo-threads.test.js +3 -3
- package/esm/hooks/use-tambo-voice.js +2 -2
- package/esm/hooks/use-tambo-voice.test.js +3 -3
- package/esm/index.d.ts +22 -22
- package/esm/index.js +15 -15
- package/esm/mcp/elicitation.d.ts +1 -1
- package/esm/mcp/elicitation.test.js +1 -1
- package/esm/mcp/index.d.ts +7 -7
- package/esm/mcp/index.js +3 -3
- package/esm/mcp/mcp-client.d.ts +1 -1
- package/esm/mcp/mcp-client.js +1 -1
- package/esm/mcp/mcp-client.test.js +1 -1
- package/esm/mcp/mcp-hooks.d.ts +5 -1
- package/esm/mcp/mcp-hooks.d.ts.map +1 -1
- package/esm/mcp/mcp-hooks.js +8 -4
- package/esm/mcp/mcp-hooks.js.map +1 -1
- package/esm/mcp/mcp-hooks.test.js +6 -6
- package/esm/mcp/tambo-mcp-provider.d.ts +4 -4
- package/esm/mcp/tambo-mcp-provider.js +7 -7
- package/esm/mcp/tambo-mcp-provider.test.js +5 -5
- package/esm/mcp/use-mcp-servers.test.js +4 -4
- package/esm/model/generate-component-response.d.ts +1 -1
- package/esm/model/tambo-interactable.d.ts +1 -1
- package/esm/model/tambo-thread.d.ts +1 -1
- package/esm/providers/__tests__/thread-input-resource-resolution.test.js +3 -3
- package/esm/providers/hooks/use-tambo-session-token.test.js +1 -1
- package/esm/providers/index.d.ts +12 -12
- package/esm/providers/index.js +10 -10
- package/esm/providers/tambo-client-provider.js +1 -1
- package/esm/providers/tambo-client-provider.test.js +2 -2
- package/esm/providers/tambo-component-provider.d.ts +1 -1
- package/esm/providers/tambo-component-provider.js +2 -2
- package/esm/providers/tambo-context-attachment-provider.js +1 -1
- package/esm/providers/tambo-context-attachment-provider.test.js +2 -2
- package/esm/providers/tambo-context-helpers-provider.d.ts +1 -1
- package/esm/providers/tambo-context-helpers-provider.js +1 -1
- package/esm/providers/tambo-context-helpers-provider.test.js +2 -2
- package/esm/providers/tambo-interactable-provider-partial-updates.test.js +4 -4
- package/esm/providers/tambo-interactable-provider-partial-updates.test.js.map +1 -1
- package/esm/providers/tambo-interactable-provider.d.ts +5 -5
- package/esm/providers/tambo-interactable-provider.js +6 -6
- package/esm/providers/tambo-interactable-provider.js.map +1 -1
- package/esm/providers/tambo-interactable-provider.test.js +4 -4
- package/esm/providers/tambo-interactable-provider.test.js.map +1 -1
- package/esm/providers/tambo-interactables-additional-context-edge-cases.test.js +4 -4
- package/esm/providers/tambo-interactables-additional-context.test.js +4 -4
- package/esm/providers/tambo-mcp-token-provider.js +2 -2
- package/esm/providers/tambo-prop-stream-provider/index.d.ts +8 -8
- package/esm/providers/tambo-prop-stream-provider/index.js +9 -9
- package/esm/providers/tambo-prop-stream-provider/pending.d.ts +1 -1
- package/esm/providers/tambo-prop-stream-provider/pending.js +2 -2
- package/esm/providers/tambo-prop-stream-provider/provider.d.ts +1 -1
- package/esm/providers/tambo-prop-stream-provider/provider.js +2 -2
- package/esm/providers/tambo-prop-stream-provider/streaming.d.ts +1 -1
- package/esm/providers/tambo-prop-stream-provider/streaming.js +2 -2
- package/esm/providers/tambo-prop-stream-provider/success.d.ts +1 -1
- package/esm/providers/tambo-prop-stream-provider/success.js +2 -2
- package/esm/providers/tambo-prop-stream-provider/types.d.ts +1 -1
- package/esm/providers/tambo-prop-stream-provider.test.js +4 -4
- package/esm/providers/tambo-provider.d.ts +10 -7
- package/esm/providers/tambo-provider.d.ts.map +1 -1
- package/esm/providers/tambo-provider.js +13 -10
- package/esm/providers/tambo-provider.js.map +1 -1
- package/esm/providers/tambo-registry-provider.d.ts +3 -3
- package/esm/providers/tambo-registry-provider.js +3 -3
- package/esm/providers/tambo-registry-provider.test.js +2 -2
- package/esm/providers/tambo-registry-schema-compat.test.js +2 -2
- package/esm/providers/tambo-stubs.d.ts +4 -4
- package/esm/providers/tambo-stubs.js +9 -9
- package/esm/providers/tambo-stubs.test.js +2 -2
- package/esm/providers/tambo-thread-input-provider.d.ts +2 -2
- package/esm/providers/tambo-thread-input-provider.d.ts.map +1 -1
- package/esm/providers/tambo-thread-input-provider.js +11 -10
- package/esm/providers/tambo-thread-input-provider.js.map +1 -1
- package/esm/providers/tambo-thread-provider-initial-messages.test.js +6 -6
- package/esm/providers/tambo-thread-provider.d.ts +2 -2
- package/esm/providers/tambo-thread-provider.js +8 -8
- package/esm/providers/tambo-thread-provider.test.js +7 -7
- package/esm/schema/index.d.ts +4 -4
- package/esm/schema/index.js +4 -4
- package/esm/schema/json-schema.test.js +1 -1
- package/esm/schema/schema.d.ts +1 -1
- package/esm/schema/schema.js +2 -2
- package/esm/schema/schema.test.js +3 -3
- package/esm/schema/standard-schema.test.js +1 -1
- package/esm/schema/validate.js +2 -2
- package/esm/schema/validate.test.js +1 -1
- package/esm/testing/tools.d.ts +3 -3
- package/esm/testing/tools.js +2 -2
- package/esm/util/content-parts.test.js +1 -1
- package/esm/util/generate-component.d.ts +2 -2
- package/esm/util/generate-component.js +4 -4
- package/esm/util/generate-component.test.js +2 -2
- package/esm/util/is-promise.test.js +1 -1
- package/esm/util/mcp-server-utils.d.ts +1 -1
- package/esm/util/mcp-server-utils.js +1 -1
- package/esm/util/mcp-server-utils.test.js +2 -2
- package/esm/util/message-builder.d.ts +1 -1
- package/esm/util/message-builder.test.js +1 -1
- package/esm/util/query-utils.test.js +1 -1
- package/esm/util/registry-validators.d.ts +1 -1
- package/esm/util/registry-validators.js +2 -2
- package/esm/util/registry-validators.test.js +1 -1
- package/esm/util/registry.d.ts +1 -1
- package/esm/util/registry.js +1 -1
- package/esm/util/registry.test.js +2 -2
- package/esm/util/resource-content-resolver.d.ts +2 -2
- package/esm/util/resource-content-resolver.d.ts.map +1 -1
- package/esm/util/resource-content-resolver.js +3 -1
- package/esm/util/resource-content-resolver.js.map +1 -1
- package/esm/util/resource-content-resolver.test.js +3 -3
- package/esm/util/resource-validators.d.ts +1 -1
- package/esm/util/resource-validators.test.js +1 -1
- package/esm/util/tool-caller.d.ts +1 -1
- package/esm/util/tool-caller.js +1 -1
- package/esm/util/validate-component-name.test.js +1 -1
- package/esm/v1/__tests__/v1-interactables.test.d.ts +2 -0
- package/esm/v1/__tests__/v1-interactables.test.d.ts.map +1 -0
- package/esm/v1/__tests__/v1-interactables.test.js +130 -0
- package/esm/v1/__tests__/v1-interactables.test.js.map +1 -0
- package/esm/v1/components/v1-component-renderer.d.ts +48 -0
- package/esm/v1/components/v1-component-renderer.d.ts.map +1 -0
- package/esm/v1/components/v1-component-renderer.js +100 -0
- package/esm/v1/components/v1-component-renderer.js.map +1 -0
- package/esm/v1/components/v1-component-renderer.test.d.ts +2 -0
- package/esm/v1/components/v1-component-renderer.test.d.ts.map +1 -0
- package/esm/v1/components/v1-component-renderer.test.js +265 -0
- package/esm/v1/components/v1-component-renderer.test.js.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-component-state.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-component-state.js +4 -27
- package/esm/v1/hooks/use-tambo-v1-component-state.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-component-state.test.js +6 -5
- package/esm/v1/hooks/use-tambo-v1-component-state.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-messages.d.ts +1 -1
- package/esm/v1/hooks/use-tambo-v1-messages.js +1 -1
- package/esm/v1/hooks/use-tambo-v1-messages.test.js +27 -3
- package/esm/v1/hooks/use-tambo-v1-messages.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-send-message.d.ts +20 -2
- package/esm/v1/hooks/use-tambo-v1-send-message.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-send-message.js +213 -26
- package/esm/v1/hooks/use-tambo-v1-send-message.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-send-message.test.js +266 -12
- 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 +90 -0
- package/esm/v1/hooks/use-tambo-v1-stream-status.d.ts.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-stream-status.js +176 -0
- package/esm/v1/hooks/use-tambo-v1-stream-status.js.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-stream-status.test.d.ts +2 -0
- package/esm/v1/hooks/use-tambo-v1-stream-status.test.d.ts.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-stream-status.test.js +369 -0
- package/esm/v1/hooks/use-tambo-v1-stream-status.test.js.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-suggestions.d.ts +78 -54
- package/esm/v1/hooks/use-tambo-v1-suggestions.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-suggestions.js +157 -91
- package/esm/v1/hooks/use-tambo-v1-suggestions.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-suggestions.test.js +218 -139
- package/esm/v1/hooks/use-tambo-v1-suggestions.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-input.d.ts +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-input.js +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-input.test.js +151 -16
- 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 +8 -21
- package/esm/v1/hooks/use-tambo-v1-thread-list.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-list.js +12 -11
- package/esm/v1/hooks/use-tambo-v1-thread-list.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-list.test.js +39 -4
- package/esm/v1/hooks/use-tambo-v1-thread-list.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread.d.ts +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread.js +3 -8
- package/esm/v1/hooks/use-tambo-v1-thread.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread.test.js +4 -2
- package/esm/v1/hooks/use-tambo-v1-thread.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1.d.ts +15 -31
- package/esm/v1/hooks/use-tambo-v1.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1.js +134 -34
- package/esm/v1/hooks/use-tambo-v1.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1.test.js +862 -19
- package/esm/v1/hooks/use-tambo-v1.test.js.map +1 -1
- package/esm/v1/index.d.ts +28 -22
- package/esm/v1/index.d.ts.map +1 -1
- package/esm/v1/index.js +30 -18
- package/esm/v1/index.js.map +1 -1
- package/esm/v1/providers/tambo-v1-provider.d.ts +21 -11
- package/esm/v1/providers/tambo-v1-provider.d.ts.map +1 -1
- package/esm/v1/providers/tambo-v1-provider.js +20 -25
- package/esm/v1/providers/tambo-v1-provider.js.map +1 -1
- package/esm/v1/providers/tambo-v1-provider.test.js +40 -26
- package/esm/v1/providers/tambo-v1-provider.test.js.map +1 -1
- package/esm/v1/providers/tambo-v1-stream-context.d.ts +4 -4
- package/esm/v1/providers/tambo-v1-stream-context.d.ts.map +1 -1
- package/esm/v1/providers/tambo-v1-stream-context.js +62 -14
- package/esm/v1/providers/tambo-v1-stream-context.js.map +1 -1
- package/esm/v1/providers/tambo-v1-stream-context.test.js +50 -21
- package/esm/v1/providers/tambo-v1-stream-context.test.js.map +1 -1
- package/esm/v1/providers/tambo-v1-stub-provider.d.ts +3 -3
- package/esm/v1/providers/tambo-v1-stub-provider.d.ts.map +1 -1
- package/esm/v1/providers/tambo-v1-stub-provider.js +7 -5
- package/esm/v1/providers/tambo-v1-stub-provider.js.map +1 -1
- package/esm/v1/providers/tambo-v1-stub-provider.test.js +12 -11
- package/esm/v1/providers/tambo-v1-stub-provider.test.js.map +1 -1
- package/esm/v1/providers/tambo-v1-thread-input-provider.d.ts +3 -8
- package/esm/v1/providers/tambo-v1-thread-input-provider.d.ts.map +1 -1
- package/esm/v1/providers/tambo-v1-thread-input-provider.js +18 -16
- package/esm/v1/providers/tambo-v1-thread-input-provider.js.map +1 -1
- package/esm/v1/types/event.d.ts +9 -1
- package/esm/v1/types/event.d.ts.map +1 -1
- package/esm/v1/types/event.js.map +1 -1
- package/esm/v1/types/event.test.js +6 -2
- package/esm/v1/types/event.test.js.map +1 -1
- package/esm/v1/types/message.d.ts +65 -7
- package/esm/v1/types/message.d.ts.map +1 -1
- package/esm/v1/types/message.js.map +1 -1
- package/esm/v1/types/thread.d.ts +5 -1
- package/esm/v1/types/thread.d.ts.map +1 -1
- package/esm/v1/types/thread.js.map +1 -1
- package/esm/v1/utils/component-renderer.test.js +1 -1
- package/esm/v1/utils/event-accumulator.d.ts +41 -5
- package/esm/v1/utils/event-accumulator.d.ts.map +1 -1
- package/esm/v1/utils/event-accumulator.js +444 -36
- package/esm/v1/utils/event-accumulator.js.map +1 -1
- package/esm/v1/utils/event-accumulator.test.js +1042 -29
- package/esm/v1/utils/event-accumulator.test.js.map +1 -1
- package/esm/v1/utils/json-patch.test.js +1 -1
- package/esm/v1/utils/registry-conversion.d.ts +9 -9
- package/esm/v1/utils/registry-conversion.d.ts.map +1 -1
- package/esm/v1/utils/registry-conversion.js +11 -12
- package/esm/v1/utils/registry-conversion.js.map +1 -1
- package/esm/v1/utils/registry-conversion.test.js +40 -12
- package/esm/v1/utils/registry-conversion.test.js.map +1 -1
- package/esm/v1/utils/stream-handler.test.js +1 -1
- package/esm/v1/utils/thread-utils.d.ts +16 -0
- package/esm/v1/utils/thread-utils.d.ts.map +1 -0
- package/esm/v1/utils/thread-utils.js +31 -0
- package/esm/v1/utils/thread-utils.js.map +1 -0
- package/esm/v1/utils/tool-call-tracker.d.ts +1 -1
- package/esm/v1/utils/tool-executor.d.ts +1 -1
- package/esm/v1/utils/tool-executor.d.ts.map +1 -1
- package/esm/v1/utils/tool-executor.js +2 -0
- package/esm/v1/utils/tool-executor.js.map +1 -1
- package/esm/v1/utils/tool-executor.test.js +6 -1
- package/esm/v1/utils/tool-executor.test.js.map +1 -1
- package/package.json +11 -10
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-tambo-v1-suggestions.test.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-suggestions.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import { renderHook, act, waitFor } from \"@testing-library/react\";\nimport React from \"react\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { useTamboV1Suggestions } from \"./use-tambo-v1-suggestions\";\nimport { useTamboV1ThreadInput } from \"./use-tambo-v1-thread-input\";\nimport { useTamboV1 } from \"./use-tambo-v1\";\nimport { useTamboClient } from \"../../providers/tambo-client-provider\";\nimport { useTamboRegistry } from \"../../providers/tambo-registry-provider\";\n\n// Mock dependencies\njest.mock(\"./use-tambo-v1-thread-input\", () => ({\n useTamboV1ThreadInput: jest.fn(),\n}));\n\njest.mock(\"./use-tambo-v1\", () => ({\n useTamboV1: jest.fn(),\n}));\n\njest.mock(\"../../providers/tambo-client-provider\", () => ({\n useTamboClient: jest.fn(),\n useTamboQueryClient: jest.fn(() => new QueryClient()),\n}));\n\njest.mock(\"../../providers/tambo-registry-provider\", () => ({\n useTamboRegistry: jest.fn(),\n}));\n\ndescribe(\"useTamboV1Suggestions\", () => {\n let queryClient: QueryClient;\n const mockSetValue = jest.fn();\n const mockSubmit = jest.fn();\n const mockGenerateSuggestions = jest.fn();\n\n function createWrapper() {\n return function Wrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n {children}\n </QueryClientProvider>\n );\n };\n }\n\n beforeEach(() => {\n jest.clearAllMocks();\n queryClient = new QueryClient({\n defaultOptions: {\n queries: { retry: false },\n mutations: { retry: false },\n },\n });\n\n // Default mock for thread input\n jest.mocked(useTamboV1ThreadInput).mockReturnValue({\n value: \"\",\n setValue: mockSetValue,\n submit: mockSubmit,\n threadId: \"thread_123\",\n setThreadId: jest.fn(),\n images: [],\n addImage: jest.fn(),\n addImages: jest.fn(),\n removeImage: jest.fn(),\n clearImages: jest.fn(),\n isPending: false,\n isError: false,\n error: undefined,\n } as any);\n\n // Default mock for useTamboV1\n jest.mocked(useTamboV1).mockReturnValue({\n messages: [],\n thread: undefined,\n isIdle: true,\n isStreaming: false,\n startNewThread: jest.fn(),\n switchThread: jest.fn(),\n initThread: jest.fn(),\n streamingState: {\n status: \"idle\",\n },\n } as any);\n\n // Default mock for registry\n jest.mocked(useTamboRegistry).mockReturnValue({\n componentList: {},\n toolRegistry: {},\n componentToolAssociations: {},\n mcpServerInfos: [],\n resources: [],\n resourceSource: null,\n onCallUnregisteredTool: undefined,\n registerComponent: jest.fn(),\n unregisterComponent: jest.fn(),\n registerTool: jest.fn(),\n unregisterTool: jest.fn(),\n registerMcpServer: jest.fn(),\n unregisterMcpServer: jest.fn(),\n registerResource: jest.fn(),\n unregisterResource: jest.fn(),\n setResourceSource: jest.fn(),\n } as any);\n\n // Default mock for client\n mockGenerateSuggestions.mockResolvedValue([\n {\n id: \"suggestion_1\",\n suggestion: \"What's the weather?\",\n detailedSuggestion: \"What's the weather like today?\",\n },\n {\n id: \"suggestion_2\",\n suggestion: \"Tell me a joke\",\n detailedSuggestion: \"Can you tell me a funny joke?\",\n },\n ]);\n\n jest.mocked(useTamboClient).mockReturnValue({\n beta: {\n threads: {\n suggestions: {\n generate: mockGenerateSuggestions,\n },\n },\n },\n } as any);\n });\n\n describe(\"Initial State\", () => {\n it(\"returns empty suggestions when no messages\", () => {\n const { result } = renderHook(() => useTamboV1Suggestions(), {\n wrapper: createWrapper(),\n });\n\n expect(result.current.suggestions).toEqual([]);\n expect(result.current.selectedSuggestionId).toBeNull();\n });\n\n it(\"returns empty suggestions when latest message is from user\", () => {\n jest.mocked(useTamboV1).mockReturnValue({\n messages: [\n {\n id: \"msg_1\",\n role: \"user\",\n content: [],\n createdAt: \"2024-01-01T00:00:00Z\",\n },\n ],\n thread: undefined,\n isIdle: true,\n isStreaming: false,\n startNewThread: jest.fn(),\n switchThread: jest.fn(),\n initThread: jest.fn(),\n streamingState: {\n status: \"idle\",\n },\n } as any);\n\n const { result } = renderHook(() => useTamboV1Suggestions(), {\n wrapper: createWrapper(),\n });\n\n expect(result.current.suggestions).toEqual([]);\n });\n });\n\n describe(\"Suggestion Generation\", () => {\n it(\"generates suggestions when latest message is from assistant and thread is idle\", async () => {\n jest.mocked(useTamboV1).mockReturnValue({\n messages: [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00Z\",\n },\n ],\n thread: undefined,\n isIdle: true,\n isStreaming: false,\n startNewThread: jest.fn(),\n switchThread: jest.fn(),\n initThread: jest.fn(),\n streamingState: {\n status: \"idle\",\n },\n } as any);\n\n const { result } = renderHook(() => useTamboV1Suggestions(), {\n wrapper: createWrapper(),\n });\n\n await waitFor(() => {\n expect(result.current.suggestions).toHaveLength(2);\n });\n\n expect(mockGenerateSuggestions).toHaveBeenCalledWith(\n \"msg_1\",\n expect.objectContaining({\n id: \"thread_123\",\n maxSuggestions: 3,\n }),\n );\n });\n\n it(\"does not generate suggestions when thread is streaming\", () => {\n jest.mocked(useTamboV1).mockReturnValue({\n messages: [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00Z\",\n },\n ],\n thread: undefined,\n isIdle: false,\n isStreaming: true,\n startNewThread: jest.fn(),\n switchThread: jest.fn(),\n initThread: jest.fn(),\n streamingState: {\n status: \"streaming\",\n runId: \"run_1\",\n },\n } as any);\n\n renderHook(() => useTamboV1Suggestions(), {\n wrapper: createWrapper(),\n });\n\n expect(mockGenerateSuggestions).not.toHaveBeenCalled();\n });\n\n it(\"does not generate suggestions when no threadId\", () => {\n jest.mocked(useTamboV1ThreadInput).mockReturnValue({\n value: \"\",\n setValue: mockSetValue,\n submit: mockSubmit,\n threadId: undefined,\n setThreadId: jest.fn(),\n images: [],\n addImage: jest.fn(),\n addImages: jest.fn(),\n removeImage: jest.fn(),\n clearImages: jest.fn(),\n isPending: false,\n isError: false,\n error: undefined,\n } as any);\n\n jest.mocked(useTamboV1).mockReturnValue({\n messages: [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00Z\",\n },\n ],\n thread: undefined,\n isIdle: true,\n isStreaming: false,\n startNewThread: jest.fn(),\n switchThread: jest.fn(),\n initThread: jest.fn(),\n streamingState: {\n status: \"idle\",\n },\n } as any);\n\n renderHook(() => useTamboV1Suggestions(), {\n wrapper: createWrapper(),\n });\n\n expect(mockGenerateSuggestions).not.toHaveBeenCalled();\n });\n\n it(\"uses custom maxSuggestions option\", async () => {\n jest.mocked(useTamboV1).mockReturnValue({\n messages: [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00Z\",\n },\n ],\n thread: undefined,\n isIdle: true,\n isStreaming: false,\n startNewThread: jest.fn(),\n switchThread: jest.fn(),\n initThread: jest.fn(),\n streamingState: {\n status: \"idle\",\n },\n } as any);\n\n const { result } = renderHook(\n () => useTamboV1Suggestions({ maxSuggestions: 5 }),\n { wrapper: createWrapper() },\n );\n\n await waitFor(() => {\n expect(result.current.suggestions).toHaveLength(2);\n });\n\n expect(mockGenerateSuggestions).toHaveBeenCalledWith(\n \"msg_1\",\n expect.objectContaining({\n maxSuggestions: 5,\n }),\n );\n });\n });\n\n describe(\"Accepting Suggestions\", () => {\n it(\"updates shared input value when accepting without submit\", async () => {\n jest.mocked(useTamboV1).mockReturnValue({\n messages: [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00Z\",\n },\n ],\n thread: undefined,\n isIdle: true,\n isStreaming: false,\n startNewThread: jest.fn(),\n switchThread: jest.fn(),\n initThread: jest.fn(),\n streamingState: {\n status: \"idle\",\n },\n } as any);\n\n const { result } = renderHook(() => useTamboV1Suggestions(), {\n wrapper: createWrapper(),\n });\n\n await waitFor(() => {\n expect(result.current.suggestions).toHaveLength(2);\n });\n\n const suggestion = result.current.suggestions[0];\n\n await act(async () => {\n await result.current.accept({ suggestion });\n });\n\n expect(mockSetValue).toHaveBeenCalledWith(\n \"What's the weather like today?\",\n );\n expect(mockSubmit).not.toHaveBeenCalled();\n expect(result.current.selectedSuggestionId).toBe(\"suggestion_1\");\n });\n\n it(\"submits when accepting with shouldSubmit=true\", async () => {\n mockSubmit.mockResolvedValue({ threadId: \"thread_123\" });\n\n jest.mocked(useTamboV1).mockReturnValue({\n messages: [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00Z\",\n },\n ],\n thread: undefined,\n isIdle: true,\n isStreaming: false,\n startNewThread: jest.fn(),\n switchThread: jest.fn(),\n initThread: jest.fn(),\n streamingState: {\n status: \"idle\",\n },\n } as any);\n\n const { result } = renderHook(() => useTamboV1Suggestions(), {\n wrapper: createWrapper(),\n });\n\n await waitFor(() => {\n expect(result.current.suggestions).toHaveLength(2);\n });\n\n const suggestion = result.current.suggestions[0];\n\n await act(async () => {\n await result.current.accept({ suggestion, shouldSubmit: true });\n });\n\n expect(mockSetValue).toHaveBeenCalledWith(\n \"What's the weather like today?\",\n );\n expect(mockSubmit).toHaveBeenCalled();\n });\n\n it(\"throws error when suggestion has no detailed content\", async () => {\n jest.mocked(useTamboV1).mockReturnValue({\n messages: [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00Z\",\n },\n ],\n thread: undefined,\n isIdle: true,\n isStreaming: false,\n startNewThread: jest.fn(),\n switchThread: jest.fn(),\n initThread: jest.fn(),\n streamingState: {\n status: \"idle\",\n },\n } as any);\n\n const { result } = renderHook(() => useTamboV1Suggestions(), {\n wrapper: createWrapper(),\n });\n\n const emptySuggestion = {\n id: \"empty_suggestion\",\n suggestion: \"Empty\",\n detailedSuggestion: \"\",\n };\n\n await expect(\n result.current.accept({ suggestion: emptySuggestion as any }),\n ).rejects.toThrow(\"Suggestion has no detailed content\");\n });\n\n it(\"throws error when detailedSuggestion is only whitespace\", async () => {\n jest.mocked(useTamboV1).mockReturnValue({\n messages: [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00Z\",\n },\n ],\n thread: undefined,\n isIdle: true,\n isStreaming: false,\n startNewThread: jest.fn(),\n switchThread: jest.fn(),\n initThread: jest.fn(),\n streamingState: {\n status: \"idle\",\n },\n } as any);\n\n const { result } = renderHook(() => useTamboV1Suggestions(), {\n wrapper: createWrapper(),\n });\n\n const whitespaceSuggestion = {\n id: \"whitespace_suggestion\",\n suggestion: \"Whitespace\",\n detailedSuggestion: \" \",\n };\n\n await expect(\n result.current.accept({ suggestion: whitespaceSuggestion as any }),\n ).rejects.toThrow(\"Suggestion has no detailed content\");\n });\n });\n\n describe(\"State Management\", () => {\n it(\"resets selectedSuggestionId when message changes\", async () => {\n const mockUseTamboV1 = jest.mocked(useTamboV1);\n\n mockUseTamboV1.mockReturnValue({\n messages: [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00Z\",\n },\n ],\n thread: undefined,\n isIdle: true,\n isStreaming: false,\n startNewThread: jest.fn(),\n switchThread: jest.fn(),\n initThread: jest.fn(),\n streamingState: {\n status: \"idle\",\n },\n } as any);\n\n const { result, rerender } = renderHook(() => useTamboV1Suggestions(), {\n wrapper: createWrapper(),\n });\n\n await waitFor(() => {\n expect(result.current.suggestions).toHaveLength(2);\n });\n\n // Accept a suggestion\n await act(async () => {\n await result.current.accept({\n suggestion: result.current.suggestions[0],\n });\n });\n\n expect(result.current.selectedSuggestionId).toBe(\"suggestion_1\");\n\n // Change the latest message\n mockUseTamboV1.mockReturnValue({\n messages: [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00Z\",\n },\n {\n id: \"msg_2\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:01Z\",\n },\n ],\n thread: undefined,\n isIdle: true,\n isStreaming: false,\n startNewThread: jest.fn(),\n switchThread: jest.fn(),\n initThread: jest.fn(),\n streamingState: {\n status: \"idle\",\n },\n } as any);\n\n rerender();\n\n await waitFor(() => {\n expect(result.current.selectedSuggestionId).toBeNull();\n });\n });\n\n it(\"exposes mutation and query results\", async () => {\n jest.mocked(useTamboV1).mockReturnValue({\n messages: [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00Z\",\n },\n ],\n thread: undefined,\n isIdle: true,\n isStreaming: false,\n startNewThread: jest.fn(),\n switchThread: jest.fn(),\n initThread: jest.fn(),\n streamingState: {\n status: \"idle\",\n },\n } as any);\n\n const { result } = renderHook(() => useTamboV1Suggestions(), {\n wrapper: createWrapper(),\n });\n\n expect(result.current.acceptResult).toBeDefined();\n expect(result.current.generateResult).toBeDefined();\n expect(result.current.suggestionsResult).toBeDefined();\n });\n\n it(\"exposes combined mutation results (isPending, isError, error)\", () => {\n const { result } = renderHook(() => useTamboV1Suggestions(), {\n wrapper: createWrapper(),\n });\n\n expect(result.current.isPending).toBe(false);\n expect(result.current.isError).toBe(false);\n expect(result.current.error).toBeNull();\n });\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"use-tambo-v1-suggestions.test.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-suggestions.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import { renderHook, act, waitFor } from \"@testing-library/react\";\nimport React from \"react\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport type { Suggestion } from \"@tambo-ai/typescript-sdk/resources/beta/threads/suggestions\";\nimport { useTamboV1Suggestions } from \"./use-tambo-v1-suggestions\";\nimport { useTamboV1ThreadInput } from \"./use-tambo-v1-thread-input\";\nimport { useTamboV1 } from \"./use-tambo-v1\";\nimport {\n useTamboClient,\n useTamboQueryClient,\n} from \"../../providers/tambo-client-provider\";\nimport { useTamboRegistry } from \"../../providers/tambo-registry-provider\";\nimport { useTamboV1Config } from \"../providers/tambo-v1-provider\";\n\n// Mock dependencies\njest.mock(\"./use-tambo-v1-thread-input\", () => ({\n useTamboV1ThreadInput: jest.fn(),\n}));\n\njest.mock(\"./use-tambo-v1\", () => ({\n useTamboV1: jest.fn(),\n}));\n\njest.mock(\"../../providers/tambo-client-provider\", () => ({\n useTamboClient: jest.fn(),\n useTamboQueryClient: jest.fn(() => new QueryClient()),\n}));\n\njest.mock(\"../../providers/tambo-registry-provider\", () => ({\n useTamboRegistry: jest.fn(),\n}));\n\njest.mock(\"../providers/tambo-v1-provider\", () => ({\n useTamboV1Config: jest.fn(),\n}));\n\ndescribe(\"useTamboV1Suggestions\", () => {\n let queryClient: QueryClient;\n const mockSetValue = jest.fn();\n const mockSubmit = jest.fn();\n const mockListSuggestions = jest.fn();\n const mockCreateSuggestions = jest.fn();\n\n const mockSuggestions: Suggestion[] = [\n {\n id: \"suggestion_1\",\n messageId: \"msg_1\",\n title: \"What's the weather?\",\n detailedSuggestion: \"What's the weather like today?\",\n },\n {\n id: \"suggestion_2\",\n messageId: \"msg_1\",\n title: \"Tell me a joke\",\n detailedSuggestion: \"Can you tell me a funny joke?\",\n },\n ];\n\n const mockSuggestionsResponse = {\n suggestions: mockSuggestions,\n hasMore: false,\n nextCursor: undefined,\n };\n\n function createWrapper() {\n return function Wrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n {children}\n </QueryClientProvider>\n );\n };\n }\n\n beforeEach(() => {\n jest.clearAllMocks();\n queryClient = new QueryClient({\n defaultOptions: {\n queries: { retry: false },\n mutations: { retry: false },\n },\n });\n\n // Mock useTamboQueryClient to return the test's queryClient\n jest.mocked(useTamboQueryClient).mockReturnValue(queryClient);\n\n // Default mock for v1 config\n jest.mocked(useTamboV1Config).mockReturnValue({ userKey: \"user_123\" });\n\n // Default mock for thread input\n jest.mocked(useTamboV1ThreadInput).mockReturnValue({\n value: \"\",\n setValue: mockSetValue,\n submit: mockSubmit,\n isPending: false,\n isError: false,\n error: null,\n isSuccess: false,\n reset: jest.fn(),\n } as any);\n\n // Default mock for useTamboV1\n jest.mocked(useTamboV1).mockReturnValue({\n messages: [],\n thread: undefined,\n isIdle: true,\n isStreaming: false,\n currentThreadId: \"thread_123\",\n startNewThread: jest.fn(),\n switchThread: jest.fn(),\n initThread: jest.fn(),\n streamingState: {\n status: \"idle\",\n },\n } as any);\n\n // Default mock for registry\n jest.mocked(useTamboRegistry).mockReturnValue({\n componentList: {},\n toolRegistry: {},\n componentToolAssociations: {},\n mcpServerInfos: [],\n resources: [],\n resourceSource: null,\n onCallUnregisteredTool: undefined,\n registerComponent: jest.fn(),\n unregisterComponent: jest.fn(),\n registerTool: jest.fn(),\n unregisterTool: jest.fn(),\n registerMcpServer: jest.fn(),\n unregisterMcpServer: jest.fn(),\n registerResource: jest.fn(),\n unregisterResource: jest.fn(),\n setResourceSource: jest.fn(),\n } as any);\n\n // Default mock for client - using v1 API structure\n mockListSuggestions.mockResolvedValue({ suggestions: [], hasMore: false });\n mockCreateSuggestions.mockResolvedValue(mockSuggestionsResponse);\n\n jest.mocked(useTamboClient).mockReturnValue({\n threads: {\n suggestions: {\n list: mockListSuggestions,\n create: mockCreateSuggestions,\n },\n },\n } as any);\n });\n\n describe(\"Initial State\", () => {\n it(\"returns empty suggestions when thread has placeholder ID\", () => {\n // Mock useTamboV1 to return placeholder thread ID\n jest.mocked(useTamboV1).mockReturnValue({\n messages: [],\n thread: undefined,\n isIdle: true,\n isStreaming: false,\n currentThreadId: \"placeholder\",\n startNewThread: jest.fn(),\n switchThread: jest.fn(),\n initThread: jest.fn(),\n streamingState: { status: \"idle\" },\n } as any);\n\n const { result } = renderHook(() => useTamboV1Suggestions(), {\n wrapper: createWrapper(),\n });\n\n expect(result.current.suggestions).toEqual([]);\n expect(result.current.selectedSuggestionId).toBeNull();\n expect(result.current.isLoading).toBe(false);\n });\n\n it(\"returns empty suggestions when no messages\", () => {\n const { result } = renderHook(() => useTamboV1Suggestions(), {\n wrapper: createWrapper(),\n });\n\n expect(result.current.suggestions).toEqual([]);\n expect(result.current.selectedSuggestionId).toBeNull();\n });\n\n it(\"returns empty suggestions when latest message is from user\", () => {\n jest.mocked(useTamboV1).mockReturnValue({\n messages: [\n {\n id: \"msg_1\",\n role: \"user\",\n content: [],\n createdAt: \"2024-01-01T00:00:00Z\",\n },\n ],\n thread: undefined,\n isIdle: true,\n isStreaming: false,\n currentThreadId: \"thread_123\",\n startNewThread: jest.fn(),\n switchThread: jest.fn(),\n initThread: jest.fn(),\n streamingState: { status: \"idle\" },\n } as any);\n\n const { result } = renderHook(() => useTamboV1Suggestions(), {\n wrapper: createWrapper(),\n });\n\n expect(result.current.suggestions).toEqual([]);\n });\n });\n\n describe(\"Suggestion Generation\", () => {\n it(\"generates suggestions when latest message is from assistant and thread is idle\", async () => {\n jest.mocked(useTamboV1).mockReturnValue({\n messages: [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00Z\",\n },\n ],\n thread: undefined,\n isIdle: true,\n isStreaming: false,\n currentThreadId: \"thread_123\",\n startNewThread: jest.fn(),\n switchThread: jest.fn(),\n initThread: jest.fn(),\n streamingState: { status: \"idle\" },\n } as any);\n\n const { result } = renderHook(() => useTamboV1Suggestions(), {\n wrapper: createWrapper(),\n });\n\n await waitFor(() => {\n expect(result.current.suggestions).toHaveLength(2);\n });\n\n // Should first call list, then create since list returns empty\n expect(mockListSuggestions).toHaveBeenCalledWith(\"msg_1\", {\n threadId: \"thread_123\",\n userKey: \"user_123\",\n });\n expect(mockCreateSuggestions).toHaveBeenCalledWith(\n \"msg_1\",\n expect.objectContaining({\n threadId: \"thread_123\",\n maxSuggestions: 3,\n userKey: \"user_123\",\n }),\n );\n });\n\n it(\"returns existing suggestions from list without calling create\", async () => {\n mockListSuggestions.mockResolvedValue(mockSuggestionsResponse);\n\n jest.mocked(useTamboV1).mockReturnValue({\n messages: [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00Z\",\n },\n ],\n thread: undefined,\n isIdle: true,\n isStreaming: false,\n currentThreadId: \"thread_123\",\n startNewThread: jest.fn(),\n switchThread: jest.fn(),\n initThread: jest.fn(),\n streamingState: { status: \"idle\" },\n } as any);\n\n const { result } = renderHook(() => useTamboV1Suggestions(), {\n wrapper: createWrapper(),\n });\n\n await waitFor(() => {\n expect(result.current.suggestions).toHaveLength(2);\n });\n\n expect(mockListSuggestions).toHaveBeenCalled();\n expect(mockCreateSuggestions).not.toHaveBeenCalled();\n });\n\n it(\"does not generate suggestions when thread is streaming\", () => {\n jest.mocked(useTamboV1).mockReturnValue({\n messages: [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00Z\",\n },\n ],\n thread: undefined,\n isIdle: false,\n isStreaming: true,\n currentThreadId: \"thread_123\",\n startNewThread: jest.fn(),\n switchThread: jest.fn(),\n initThread: jest.fn(),\n streamingState: { status: \"streaming\", runId: \"run_1\" },\n } as any);\n\n renderHook(() => useTamboV1Suggestions(), {\n wrapper: createWrapper(),\n });\n\n expect(mockListSuggestions).not.toHaveBeenCalled();\n expect(mockCreateSuggestions).not.toHaveBeenCalled();\n });\n\n it(\"does not generate suggestions when autoGenerate is false\", () => {\n jest.mocked(useTamboV1).mockReturnValue({\n messages: [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00Z\",\n },\n ],\n thread: undefined,\n isIdle: true,\n isStreaming: false,\n currentThreadId: \"thread_123\",\n startNewThread: jest.fn(),\n switchThread: jest.fn(),\n initThread: jest.fn(),\n streamingState: { status: \"idle\" },\n } as any);\n\n renderHook(() => useTamboV1Suggestions({ autoGenerate: false }), {\n wrapper: createWrapper(),\n });\n\n expect(mockListSuggestions).not.toHaveBeenCalled();\n expect(mockCreateSuggestions).not.toHaveBeenCalled();\n });\n\n it(\"uses custom maxSuggestions option\", async () => {\n jest.mocked(useTamboV1).mockReturnValue({\n messages: [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00Z\",\n },\n ],\n thread: undefined,\n isIdle: true,\n isStreaming: false,\n currentThreadId: \"thread_123\",\n startNewThread: jest.fn(),\n switchThread: jest.fn(),\n initThread: jest.fn(),\n streamingState: { status: \"idle\" },\n } as any);\n\n const { result } = renderHook(\n () => useTamboV1Suggestions({ maxSuggestions: 5 }),\n { wrapper: createWrapper() },\n );\n\n await waitFor(() => {\n expect(result.current.suggestions).toHaveLength(2);\n });\n\n expect(mockCreateSuggestions).toHaveBeenCalledWith(\n \"msg_1\",\n expect.objectContaining({ maxSuggestions: 5 }),\n );\n });\n });\n\n describe(\"Accepting Suggestions\", () => {\n it(\"updates input value when accepting without submit\", async () => {\n jest.mocked(useTamboV1).mockReturnValue({\n messages: [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00Z\",\n },\n ],\n thread: undefined,\n isIdle: true,\n isStreaming: false,\n currentThreadId: \"thread_123\",\n startNewThread: jest.fn(),\n switchThread: jest.fn(),\n initThread: jest.fn(),\n streamingState: { status: \"idle\" },\n } as any);\n\n const { result } = renderHook(() => useTamboV1Suggestions(), {\n wrapper: createWrapper(),\n });\n\n await waitFor(() => {\n expect(result.current.suggestions).toHaveLength(2);\n });\n\n const suggestion = result.current.suggestions[0];\n\n await act(async () => {\n await result.current.accept({ suggestion });\n });\n\n expect(mockSetValue).toHaveBeenCalledWith(\n \"What's the weather like today?\",\n );\n expect(mockSubmit).not.toHaveBeenCalled();\n expect(result.current.selectedSuggestionId).toBe(\"suggestion_1\");\n });\n\n it(\"submits when accepting with shouldSubmit=true\", async () => {\n mockSubmit.mockResolvedValue({ threadId: \"thread_123\" });\n\n jest.mocked(useTamboV1).mockReturnValue({\n messages: [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00Z\",\n },\n ],\n thread: undefined,\n isIdle: true,\n isStreaming: false,\n currentThreadId: \"thread_123\",\n startNewThread: jest.fn(),\n switchThread: jest.fn(),\n initThread: jest.fn(),\n streamingState: { status: \"idle\" },\n } as any);\n\n const { result } = renderHook(() => useTamboV1Suggestions(), {\n wrapper: createWrapper(),\n });\n\n await waitFor(() => {\n expect(result.current.suggestions).toHaveLength(2);\n });\n\n const suggestion = result.current.suggestions[0];\n\n await act(async () => {\n await result.current.accept({ suggestion, shouldSubmit: true });\n });\n\n expect(mockSetValue).toHaveBeenCalledWith(\n \"What's the weather like today?\",\n );\n expect(mockSubmit).toHaveBeenCalled();\n });\n\n it(\"throws error when suggestion has no content\", async () => {\n const { result } = renderHook(() => useTamboV1Suggestions(), {\n wrapper: createWrapper(),\n });\n\n const emptySuggestion = {\n id: \"empty_suggestion\",\n messageId: \"msg_1\",\n title: \"Empty\",\n detailedSuggestion: \"\",\n };\n\n await expect(\n result.current.accept({ suggestion: emptySuggestion as any }),\n ).rejects.toThrow(\"Suggestion has no content\");\n });\n\n it(\"throws error when detailedSuggestion is only whitespace\", async () => {\n const { result } = renderHook(() => useTamboV1Suggestions(), {\n wrapper: createWrapper(),\n });\n\n const whitespaceSuggestion = {\n id: \"whitespace_suggestion\",\n messageId: \"msg_1\",\n title: \"Whitespace\",\n detailedSuggestion: \" \",\n };\n\n await expect(\n result.current.accept({ suggestion: whitespaceSuggestion as any }),\n ).rejects.toThrow(\"Suggestion has no content\");\n });\n\n it(\"throws error when detailedSuggestion is undefined\", async () => {\n const { result } = renderHook(() => useTamboV1Suggestions(), {\n wrapper: createWrapper(),\n });\n\n const undefinedSuggestion = {\n id: \"undefined_suggestion\",\n messageId: \"msg_1\",\n title: \"Undefined\",\n };\n\n await expect(\n result.current.accept({ suggestion: undefinedSuggestion as any }),\n ).rejects.toThrow(\"Suggestion has no content\");\n });\n });\n\n describe(\"State Management\", () => {\n it(\"resets selectedSuggestionId when message changes\", async () => {\n const mockUseTamboV1 = jest.mocked(useTamboV1);\n\n mockUseTamboV1.mockReturnValue({\n messages: [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00Z\",\n },\n ],\n thread: undefined,\n isIdle: true,\n isStreaming: false,\n currentThreadId: \"thread_123\",\n startNewThread: jest.fn(),\n switchThread: jest.fn(),\n initThread: jest.fn(),\n streamingState: { status: \"idle\" },\n } as any);\n\n const { result, rerender } = renderHook(() => useTamboV1Suggestions(), {\n wrapper: createWrapper(),\n });\n\n await waitFor(() => {\n expect(result.current.suggestions).toHaveLength(2);\n });\n\n // Accept a suggestion\n await act(async () => {\n await result.current.accept({\n suggestion: result.current.suggestions[0],\n });\n });\n\n expect(result.current.selectedSuggestionId).toBe(\"suggestion_1\");\n\n // Change the latest message\n mockUseTamboV1.mockReturnValue({\n messages: [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00Z\",\n },\n {\n id: \"msg_2\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:01Z\",\n },\n ],\n thread: undefined,\n isIdle: true,\n isStreaming: false,\n currentThreadId: \"thread_123\",\n startNewThread: jest.fn(),\n switchThread: jest.fn(),\n initThread: jest.fn(),\n streamingState: { status: \"idle\" },\n } as any);\n\n rerender();\n\n await waitFor(() => {\n expect(result.current.selectedSuggestionId).toBeNull();\n });\n });\n\n it(\"includes pagination info on raw data\", async () => {\n mockListSuggestions.mockResolvedValue({\n suggestions: mockSuggestions,\n hasMore: true,\n nextCursor: \"cursor_abc\",\n });\n\n jest.mocked(useTamboV1).mockReturnValue({\n messages: [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00Z\",\n },\n ],\n thread: undefined,\n isIdle: true,\n isStreaming: false,\n currentThreadId: \"thread_123\",\n startNewThread: jest.fn(),\n switchThread: jest.fn(),\n initThread: jest.fn(),\n streamingState: { status: \"idle\" },\n } as any);\n\n const { result } = renderHook(() => useTamboV1Suggestions(), {\n wrapper: createWrapper(),\n });\n\n await waitFor(() => {\n expect(result.current.data?.hasMore).toBe(true);\n expect(result.current.data?.nextCursor).toBe(\"cursor_abc\");\n });\n });\n\n it(\"exposes loading and error states\", () => {\n const { result } = renderHook(() => useTamboV1Suggestions(), {\n wrapper: createWrapper(),\n });\n\n expect(result.current.isLoading).toBeDefined();\n expect(result.current.isSuccess).toBeDefined();\n expect(result.current.isError).toBeDefined();\n expect(result.current.error).toBeDefined();\n expect(result.current.isAccepting).toBe(false);\n expect(result.current.isGenerating).toBe(false);\n });\n });\n\n describe(\"Manual Generation\", () => {\n it(\"allows manual generation via generate function\", async () => {\n jest.mocked(useTamboV1).mockReturnValue({\n messages: [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00Z\",\n },\n ],\n thread: undefined,\n isIdle: true,\n isStreaming: false,\n currentThreadId: \"thread_123\",\n startNewThread: jest.fn(),\n switchThread: jest.fn(),\n initThread: jest.fn(),\n streamingState: { status: \"idle\" },\n } as any);\n\n const { result } = renderHook(\n () => useTamboV1Suggestions({ autoGenerate: false }),\n { wrapper: createWrapper() },\n );\n\n // No auto-generation\n expect(mockCreateSuggestions).not.toHaveBeenCalled();\n\n // Manual generation\n await act(async () => {\n await result.current.generate();\n });\n\n expect(mockCreateSuggestions).toHaveBeenCalledWith(\n \"msg_1\",\n expect.objectContaining({\n threadId: \"thread_123\",\n }),\n );\n });\n\n it(\"returns undefined from generate when no assistant message\", async () => {\n jest.mocked(useTamboV1).mockReturnValue({\n messages: [],\n thread: undefined,\n isIdle: true,\n isStreaming: false,\n currentThreadId: \"thread_123\",\n startNewThread: jest.fn(),\n switchThread: jest.fn(),\n initThread: jest.fn(),\n streamingState: { status: \"idle\" },\n } as any);\n\n const { result } = renderHook(() => useTamboV1Suggestions(), {\n wrapper: createWrapper(),\n });\n\n let generateResult: any;\n await act(async () => {\n generateResult = await result.current.generate();\n });\n\n expect(generateResult).toBeUndefined();\n });\n });\n});\n"]}
|
|
@@ -7,5 +7,5 @@
|
|
|
7
7
|
*
|
|
8
8
|
* For direct thread control without shared state, use useTamboV1SendMessage instead.
|
|
9
9
|
*/
|
|
10
|
-
export { useTamboV1ThreadInput, type TamboV1ThreadInputContextProps, type SubmitOptions, } from "../providers/tambo-v1-thread-input-provider";
|
|
10
|
+
export { useTamboV1ThreadInput, type TamboV1ThreadInputContextProps, type SubmitOptions, } from "../providers/tambo-v1-thread-input-provider.js";
|
|
11
11
|
//# sourceMappingURL=use-tambo-v1-thread-input.d.ts.map
|
|
@@ -8,5 +8,5 @@
|
|
|
8
8
|
*
|
|
9
9
|
* For direct thread control without shared state, use useTamboV1SendMessage instead.
|
|
10
10
|
*/
|
|
11
|
-
export { useTamboV1ThreadInput, } from "../providers/tambo-v1-thread-input-provider";
|
|
11
|
+
export { useTamboV1ThreadInput, } from "../providers/tambo-v1-thread-input-provider.js";
|
|
12
12
|
//# sourceMappingURL=use-tambo-v1-thread-input.js.map
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { renderHook, act, waitFor } from "@testing-library/react";
|
|
2
2
|
import React from "react";
|
|
3
3
|
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
|
|
4
|
-
import { TamboV1ThreadInputProvider, useTamboV1ThreadInput, } from "../providers/tambo-v1-thread-input-provider";
|
|
5
|
-
import { TamboV1StreamProvider } from "../providers/tambo-v1-stream-context";
|
|
6
|
-
import { useTamboV1SendMessage } from "./use-tambo-v1-send-message";
|
|
4
|
+
import { TamboV1ThreadInputProvider, useTamboV1ThreadInput, } from "../providers/tambo-v1-thread-input-provider.js";
|
|
5
|
+
import { TamboV1StreamProvider } from "../providers/tambo-v1-stream-context.js";
|
|
6
|
+
import { useTamboV1SendMessage } from "./use-tambo-v1-send-message.js";
|
|
7
7
|
// Mock useTamboV1SendMessage
|
|
8
8
|
jest.mock("./use-tambo-v1-send-message", () => ({
|
|
9
9
|
useTamboV1SendMessage: jest.fn(),
|
|
@@ -125,6 +125,7 @@ describe("useTamboV1ThreadInput", () => {
|
|
|
125
125
|
role: "user",
|
|
126
126
|
content: [{ type: "text", text: "Test message" }],
|
|
127
127
|
},
|
|
128
|
+
userMessageText: "Test message",
|
|
128
129
|
debug: undefined,
|
|
129
130
|
});
|
|
130
131
|
});
|
|
@@ -160,6 +161,7 @@ describe("useTamboV1ThreadInput", () => {
|
|
|
160
161
|
role: "user",
|
|
161
162
|
content: [{ type: "text", text: "Debug message" }],
|
|
162
163
|
},
|
|
164
|
+
userMessageText: "Debug message",
|
|
163
165
|
debug: true,
|
|
164
166
|
});
|
|
165
167
|
});
|
|
@@ -187,6 +189,7 @@ describe("useTamboV1ThreadInput", () => {
|
|
|
187
189
|
},
|
|
188
190
|
],
|
|
189
191
|
},
|
|
192
|
+
userMessageText: "",
|
|
190
193
|
debug: undefined,
|
|
191
194
|
});
|
|
192
195
|
await waitFor(() => {
|
|
@@ -221,42 +224,46 @@ describe("useTamboV1ThreadInput", () => {
|
|
|
221
224
|
},
|
|
222
225
|
],
|
|
223
226
|
},
|
|
227
|
+
userMessageText: "Test message",
|
|
224
228
|
debug: undefined,
|
|
225
229
|
});
|
|
226
230
|
});
|
|
227
231
|
});
|
|
228
232
|
describe("Thread ID Management", () => {
|
|
229
|
-
it("initializes with
|
|
233
|
+
it("initializes with placeholder threadId for optimistic UI", () => {
|
|
230
234
|
const { result } = renderHook(() => useTamboV1ThreadInput(), {
|
|
231
235
|
wrapper: createWrapper(),
|
|
232
236
|
});
|
|
233
|
-
|
|
237
|
+
// Default state has placeholder thread for optimistic UI
|
|
238
|
+
expect(result.current.threadId).toBe("placeholder");
|
|
234
239
|
});
|
|
235
|
-
it("
|
|
240
|
+
it("uses currentThreadId from stream state", () => {
|
|
236
241
|
const { result } = renderHook(() => useTamboV1ThreadInput(), {
|
|
237
|
-
wrapper: createWrapper(
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
result.current.setThreadId("custom_thread_id");
|
|
242
|
+
wrapper: createWrapper({
|
|
243
|
+
streamState: { threadMap: {}, currentThreadId: "thread_stream" },
|
|
244
|
+
}),
|
|
241
245
|
});
|
|
242
|
-
expect(result.current.threadId).toBe("
|
|
246
|
+
expect(result.current.threadId).toBe("thread_stream");
|
|
247
|
+
expect(jest.mocked(useTamboV1SendMessage).mock.calls.map((call) => call[0])).toContain("thread_stream");
|
|
243
248
|
});
|
|
244
|
-
it("
|
|
249
|
+
it("uses stream state threadId when submitting messages", async () => {
|
|
245
250
|
const { result } = renderHook(() => useTamboV1ThreadInput(), {
|
|
246
251
|
wrapper: createWrapper({
|
|
247
252
|
streamState: { threadMap: {}, currentThreadId: "thread_stream" },
|
|
248
253
|
}),
|
|
249
254
|
});
|
|
250
|
-
expect(result.current.threadId).toBe("thread_stream");
|
|
251
|
-
expect(jest.mocked(useTamboV1SendMessage).mock.calls.map((call) => call[0])).toContain("thread_stream");
|
|
252
255
|
act(() => {
|
|
253
256
|
result.current.setValue("Test message");
|
|
254
257
|
});
|
|
255
258
|
await act(async () => {
|
|
256
259
|
await result.current.submit();
|
|
257
260
|
});
|
|
258
|
-
|
|
259
|
-
expect(
|
|
261
|
+
// Verify sendMessage was called with the stream state's threadId
|
|
262
|
+
expect(mockMutateAsync).toHaveBeenCalledWith(expect.objectContaining({
|
|
263
|
+
message: expect.objectContaining({
|
|
264
|
+
content: [{ type: "text", text: "Test message" }],
|
|
265
|
+
}),
|
|
266
|
+
}));
|
|
260
267
|
});
|
|
261
268
|
});
|
|
262
269
|
describe("Image State", () => {
|
|
@@ -288,5 +295,133 @@ describe("useTamboV1ThreadInput", () => {
|
|
|
288
295
|
consoleSpy.mockRestore();
|
|
289
296
|
});
|
|
290
297
|
});
|
|
298
|
+
describe("Thread Isolation", () => {
|
|
299
|
+
/**
|
|
300
|
+
* Creates a wrapper that allows dynamically changing the thread ID.
|
|
301
|
+
* This simulates switching between threads in the UI.
|
|
302
|
+
*/
|
|
303
|
+
function createDynamicThreadWrapper(initialThreadId) {
|
|
304
|
+
let currentThreadId = initialThreadId;
|
|
305
|
+
const listeners = new Set();
|
|
306
|
+
const setThreadId = (newThreadId) => {
|
|
307
|
+
currentThreadId = newThreadId;
|
|
308
|
+
listeners.forEach((listener) => listener());
|
|
309
|
+
};
|
|
310
|
+
const Wrapper = ({ children }) => {
|
|
311
|
+
const [threadId, setThreadIdState] = React.useState(currentThreadId);
|
|
312
|
+
React.useEffect(() => {
|
|
313
|
+
const listener = () => setThreadIdState(currentThreadId);
|
|
314
|
+
listeners.add(listener);
|
|
315
|
+
return () => {
|
|
316
|
+
listeners.delete(listener);
|
|
317
|
+
};
|
|
318
|
+
}, []);
|
|
319
|
+
const noopDispatch = () => { };
|
|
320
|
+
return (React.createElement(QueryClientProvider, { client: queryClient },
|
|
321
|
+
React.createElement(TamboV1StreamProvider, { state: { threadMap: {}, currentThreadId: threadId }, dispatch: noopDispatch },
|
|
322
|
+
React.createElement(TamboV1ThreadInputProvider, null, children))));
|
|
323
|
+
};
|
|
324
|
+
return { Wrapper, setThreadId };
|
|
325
|
+
}
|
|
326
|
+
it("isolates pending state per thread when switching threads", async () => {
|
|
327
|
+
// Create a deferred promise so we can control when the mutation resolves
|
|
328
|
+
let resolveThreadA;
|
|
329
|
+
const threadAPromise = new Promise((resolve) => {
|
|
330
|
+
resolveThreadA = resolve;
|
|
331
|
+
});
|
|
332
|
+
mockMutateAsync.mockImplementation(async () => await threadAPromise);
|
|
333
|
+
const { Wrapper, setThreadId } = createDynamicThreadWrapper("thread_A");
|
|
334
|
+
const { result, rerender } = renderHook(() => useTamboV1ThreadInput(), {
|
|
335
|
+
wrapper: Wrapper,
|
|
336
|
+
});
|
|
337
|
+
// Verify we're on thread A
|
|
338
|
+
expect(result.current.threadId).toBe("thread_A");
|
|
339
|
+
// Set input and start submission on thread A
|
|
340
|
+
act(() => {
|
|
341
|
+
result.current.setValue("Message for thread A");
|
|
342
|
+
});
|
|
343
|
+
// Start the submission (don't await - we want it pending)
|
|
344
|
+
let submitPromise;
|
|
345
|
+
act(() => {
|
|
346
|
+
submitPromise = result.current.submit();
|
|
347
|
+
});
|
|
348
|
+
// Thread A should now be pending
|
|
349
|
+
await waitFor(() => {
|
|
350
|
+
expect(result.current.isPending).toBe(true);
|
|
351
|
+
});
|
|
352
|
+
// Switch to thread B while thread A is still pending
|
|
353
|
+
act(() => {
|
|
354
|
+
setThreadId("thread_B");
|
|
355
|
+
});
|
|
356
|
+
rerender();
|
|
357
|
+
// Wait for the thread switch to take effect
|
|
358
|
+
await waitFor(() => {
|
|
359
|
+
expect(result.current.threadId).toBe("thread_B");
|
|
360
|
+
});
|
|
361
|
+
// Thread B should NOT be pending - its mutation state is independent
|
|
362
|
+
// (The mutationKey includes threadId, so each thread has its own state)
|
|
363
|
+
expect(result.current.isPending).toBe(false);
|
|
364
|
+
// Now resolve thread A's submission
|
|
365
|
+
act(() => {
|
|
366
|
+
resolveThreadA({ threadId: "thread_A" });
|
|
367
|
+
});
|
|
368
|
+
// Wait for promise to complete
|
|
369
|
+
await act(async () => {
|
|
370
|
+
await submitPromise;
|
|
371
|
+
});
|
|
372
|
+
// Thread B should still not be pending
|
|
373
|
+
expect(result.current.isPending).toBe(false);
|
|
374
|
+
});
|
|
375
|
+
it("multiple threads that never submitted should not be pending when another thread is", async () => {
|
|
376
|
+
// Create a promise that never resolves to keep thread A pending
|
|
377
|
+
const neverResolvingPromise = new Promise(() => { });
|
|
378
|
+
mockMutateAsync.mockImplementation(async () => await neverResolvingPromise);
|
|
379
|
+
const { Wrapper, setThreadId } = createDynamicThreadWrapper("thread_A");
|
|
380
|
+
const { result, rerender } = renderHook(() => useTamboV1ThreadInput(), {
|
|
381
|
+
wrapper: Wrapper,
|
|
382
|
+
});
|
|
383
|
+
// Start submission on thread A
|
|
384
|
+
act(() => {
|
|
385
|
+
result.current.setValue("Message A");
|
|
386
|
+
});
|
|
387
|
+
act(() => {
|
|
388
|
+
void result.current.submit();
|
|
389
|
+
});
|
|
390
|
+
await waitFor(() => {
|
|
391
|
+
expect(result.current.isPending).toBe(true);
|
|
392
|
+
});
|
|
393
|
+
// Switch to thread B (which has never submitted anything)
|
|
394
|
+
act(() => {
|
|
395
|
+
setThreadId("thread_B");
|
|
396
|
+
});
|
|
397
|
+
rerender();
|
|
398
|
+
await waitFor(() => {
|
|
399
|
+
expect(result.current.threadId).toBe("thread_B");
|
|
400
|
+
});
|
|
401
|
+
// Thread B should not be pending - it has never submitted
|
|
402
|
+
expect(result.current.isPending).toBe(false);
|
|
403
|
+
// Switch to thread C (also never submitted)
|
|
404
|
+
act(() => {
|
|
405
|
+
setThreadId("thread_C");
|
|
406
|
+
});
|
|
407
|
+
rerender();
|
|
408
|
+
await waitFor(() => {
|
|
409
|
+
expect(result.current.threadId).toBe("thread_C");
|
|
410
|
+
});
|
|
411
|
+
// Thread C should also not be pending
|
|
412
|
+
expect(result.current.isPending).toBe(false);
|
|
413
|
+
// Switch to thread D (also never submitted)
|
|
414
|
+
act(() => {
|
|
415
|
+
setThreadId("thread_D");
|
|
416
|
+
});
|
|
417
|
+
rerender();
|
|
418
|
+
await waitFor(() => {
|
|
419
|
+
expect(result.current.threadId).toBe("thread_D");
|
|
420
|
+
});
|
|
421
|
+
// Thread D should also not be pending
|
|
422
|
+
// This confirms the fix works - without mutationKey, ALL threads would be pending
|
|
423
|
+
expect(result.current.isPending).toBe(false);
|
|
424
|
+
});
|
|
425
|
+
});
|
|
291
426
|
});
|
|
292
427
|
//# sourceMappingURL=use-tambo-v1-thread-input.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-tambo-v1-thread-input.test.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-thread-input.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import { renderHook, act, waitFor } from \"@testing-library/react\";\nimport React from \"react\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport {\n TamboV1ThreadInputProvider,\n useTamboV1ThreadInput,\n} from \"../providers/tambo-v1-thread-input-provider\";\nimport { TamboV1StreamProvider } from \"../providers/tambo-v1-stream-context\";\nimport { useTamboV1SendMessage } from \"./use-tambo-v1-send-message\";\nimport type { StreamAction, StreamState } from \"../utils/event-accumulator\";\n\n// Mock useTamboV1SendMessage\njest.mock(\"./use-tambo-v1-send-message\", () => ({\n useTamboV1SendMessage: jest.fn(),\n}));\n\n// Mock useTamboQueryClient to avoid TamboClientProvider dependency\njest.mock(\"../../providers/tambo-client-provider\", () => ({\n useTamboQueryClient: jest.fn(() => new QueryClient()),\n useTamboClient: jest.fn(),\n}));\n\nconst createSuccessfulFileReader = () => {\n const reader = {\n readAsDataURL: jest.fn(),\n onload: null as ((e: unknown) => void) | null,\n onerror: null as ((e: unknown) => void) | null,\n result: \"data:image/png;base64,mock-data\",\n };\n\n reader.readAsDataURL = jest.fn(() => {\n setTimeout(() => {\n reader.onload?.({});\n }, 0);\n });\n\n return reader;\n};\n\nconst originalFileReader = (global as any).FileReader;\n\ndescribe(\"useTamboV1ThreadInput\", () => {\n const mockMutateAsync = jest.fn();\n let queryClient: QueryClient;\n\n function createWrapper({ streamState }: { streamState?: StreamState } = {}) {\n const noopDispatch: React.Dispatch<StreamAction> = () => {};\n\n return function Wrapper({ children }: { children: React.ReactNode }) {\n const streamProviderProps =\n streamState === undefined\n ? {}\n : { state: streamState, dispatch: noopDispatch };\n\n return (\n <QueryClientProvider client={queryClient}>\n <TamboV1StreamProvider {...streamProviderProps}>\n <TamboV1ThreadInputProvider>{children}</TamboV1ThreadInputProvider>\n </TamboV1StreamProvider>\n </QueryClientProvider>\n );\n };\n }\n\n beforeEach(() => {\n jest.clearAllMocks();\n (global as any).FileReader = jest.fn(() => createSuccessfulFileReader());\n\n queryClient = new QueryClient({\n defaultOptions: {\n queries: { retry: false },\n mutations: { retry: false },\n },\n });\n mockMutateAsync.mockResolvedValue({ threadId: \"thread_123\" });\n jest.mocked(useTamboV1SendMessage).mockReturnValue({\n mutateAsync: mockMutateAsync,\n mutate: jest.fn(),\n isPending: false,\n isError: false,\n error: null,\n isSuccess: false,\n isIdle: true,\n isPaused: false,\n status: \"idle\",\n data: undefined,\n variables: undefined,\n failureCount: 0,\n failureReason: null,\n reset: jest.fn(),\n context: undefined,\n submittedAt: 0,\n } as any);\n });\n\n afterEach(() => {\n (global as any).FileReader = originalFileReader;\n });\n\n describe(\"State Management\", () => {\n it(\"initializes with empty value\", () => {\n const { result } = renderHook(() => useTamboV1ThreadInput(), {\n wrapper: createWrapper(),\n });\n\n expect(result.current.value).toBe(\"\");\n });\n\n it(\"updates value via setValue\", () => {\n const { result } = renderHook(() => useTamboV1ThreadInput(), {\n wrapper: createWrapper(),\n });\n\n act(() => {\n result.current.setValue(\"Hello world\");\n });\n\n expect(result.current.value).toBe(\"Hello world\");\n });\n\n it(\"supports functional updates for setValue\", () => {\n const { result } = renderHook(() => useTamboV1ThreadInput(), {\n wrapper: createWrapper(),\n });\n\n act(() => {\n result.current.setValue(\"Hello\");\n });\n\n act(() => {\n result.current.setValue((prev) => `${prev} world`);\n });\n\n expect(result.current.value).toBe(\"Hello world\");\n });\n });\n\n describe(\"Submit Behavior\", () => {\n it(\"submits message and clears input on success\", async () => {\n const { result } = renderHook(() => useTamboV1ThreadInput(), {\n wrapper: createWrapper(),\n });\n\n act(() => {\n result.current.setValue(\"Test message\");\n });\n\n await act(async () => {\n const response = await result.current.submit();\n expect(response.threadId).toBe(\"thread_123\");\n });\n\n // Input should be cleared\n await waitFor(() => {\n expect(result.current.value).toBe(\"\");\n });\n\n // Should have called mutateAsync with correct message format\n expect(mockMutateAsync).toHaveBeenCalledWith({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Test message\" }],\n },\n debug: undefined,\n });\n });\n\n it(\"throws error when submitting empty message\", async () => {\n const { result } = renderHook(() => useTamboV1ThreadInput(), {\n wrapper: createWrapper(),\n });\n\n await expect(result.current.submit()).rejects.toThrow(\n \"Message cannot be empty\",\n );\n\n expect(mockMutateAsync).not.toHaveBeenCalled();\n });\n\n it(\"throws error when submitting whitespace-only message\", async () => {\n const { result } = renderHook(() => useTamboV1ThreadInput(), {\n wrapper: createWrapper(),\n });\n\n act(() => {\n result.current.setValue(\" \");\n });\n\n await expect(result.current.submit()).rejects.toThrow(\n \"Message cannot be empty\",\n );\n\n expect(mockMutateAsync).not.toHaveBeenCalled();\n });\n\n it(\"passes debug option to mutation\", async () => {\n const { result } = renderHook(() => useTamboV1ThreadInput(), {\n wrapper: createWrapper(),\n });\n\n act(() => {\n result.current.setValue(\"Debug message\");\n });\n\n await act(async () => {\n await result.current.submit({ debug: true });\n });\n\n expect(mockMutateAsync).toHaveBeenCalledWith({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Debug message\" }],\n },\n debug: true,\n });\n });\n\n it(\"submits image-only messages as resource content\", async () => {\n const { result } = renderHook(() => useTamboV1ThreadInput(), {\n wrapper: createWrapper(),\n });\n\n await act(async () => {\n await result.current.addImage(\n new File([\"image\"], \"photo.png\", { type: \"image/png\" }),\n );\n });\n\n await act(async () => {\n await result.current.submit();\n });\n\n expect(mockMutateAsync).toHaveBeenCalledWith({\n message: {\n role: \"user\",\n content: [\n {\n type: \"resource\",\n resource: {\n blob: \"mock-data\",\n mimeType: \"image/png\",\n name: \"photo.png\",\n },\n },\n ],\n },\n debug: undefined,\n });\n\n await waitFor(() => {\n expect(result.current.images).toEqual([]);\n });\n });\n\n it(\"includes both text and image resource content when both are present\", async () => {\n const { result } = renderHook(() => useTamboV1ThreadInput(), {\n wrapper: createWrapper(),\n });\n\n act(() => {\n result.current.setValue(\"Test message\");\n });\n\n await act(async () => {\n await result.current.addImage(\n new File([\"image\"], \"photo.png\", { type: \"image/png\" }),\n );\n });\n\n await act(async () => {\n await result.current.submit();\n });\n\n expect(mockMutateAsync).toHaveBeenCalledWith({\n message: {\n role: \"user\",\n content: [\n { type: \"text\", text: \"Test message\" },\n {\n type: \"resource\",\n resource: {\n blob: \"mock-data\",\n mimeType: \"image/png\",\n name: \"photo.png\",\n },\n },\n ],\n },\n debug: undefined,\n });\n });\n });\n\n describe(\"Thread ID Management\", () => {\n it(\"initializes with undefined threadId\", () => {\n const { result } = renderHook(() => useTamboV1ThreadInput(), {\n wrapper: createWrapper(),\n });\n\n expect(result.current.threadId).toBeUndefined();\n });\n\n it(\"allows setting threadId via setThreadId\", () => {\n const { result } = renderHook(() => useTamboV1ThreadInput(), {\n wrapper: createWrapper(),\n });\n\n act(() => {\n result.current.setThreadId(\"custom_thread_id\");\n });\n\n expect(result.current.threadId).toBe(\"custom_thread_id\");\n });\n\n it(\"does not take ownership of threadId when inheriting stream selection\", async () => {\n const { result } = renderHook(() => useTamboV1ThreadInput(), {\n wrapper: createWrapper({\n streamState: { threadMap: {}, currentThreadId: \"thread_stream\" },\n }),\n });\n\n expect(result.current.threadId).toBe(\"thread_stream\");\n expect(\n jest.mocked(useTamboV1SendMessage).mock.calls.map((call) => call[0]),\n ).toContain(\"thread_stream\");\n\n act(() => {\n result.current.setValue(\"Test message\");\n });\n\n await act(async () => {\n await result.current.submit();\n });\n\n expect(result.current.threadId).toBe(\"thread_stream\");\n expect(\n jest.mocked(useTamboV1SendMessage).mock.calls.map((call) => call[0]),\n ).not.toContain(\"thread_123\");\n });\n });\n\n describe(\"Image State\", () => {\n it(\"initializes with empty images array\", () => {\n const { result } = renderHook(() => useTamboV1ThreadInput(), {\n wrapper: createWrapper(),\n });\n\n expect(result.current.images).toEqual([]);\n });\n\n it(\"exposes image management functions\", () => {\n const { result } = renderHook(() => useTamboV1ThreadInput(), {\n wrapper: createWrapper(),\n });\n\n expect(typeof result.current.addImage).toBe(\"function\");\n expect(typeof result.current.addImages).toBe(\"function\");\n expect(typeof result.current.removeImage).toBe(\"function\");\n expect(typeof result.current.clearImages).toBe(\"function\");\n });\n });\n\n describe(\"Error handling\", () => {\n it(\"throws error when used outside provider\", () => {\n // Suppress console.error for this test\n const consoleSpy = jest\n .spyOn(console, \"error\")\n .mockImplementation(() => {});\n\n expect(() => {\n renderHook(() => useTamboV1ThreadInput());\n }).toThrow(\n \"useTamboV1ThreadInput must be used within TamboV1ThreadInputProvider\",\n );\n\n consoleSpy.mockRestore();\n });\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"use-tambo-v1-thread-input.test.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-thread-input.test.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EACL,0BAA0B,EAC1B,qBAAqB,GACtB,MAAM,6CAA6C,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAGpE,6BAA6B;AAC7B,IAAI,CAAC,IAAI,CAAC,6BAA6B,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9C,qBAAqB,EAAE,IAAI,CAAC,EAAE,EAAE;CACjC,CAAC,CAAC,CAAC;AAEJ,mEAAmE;AACnE,IAAI,CAAC,IAAI,CAAC,uCAAuC,EAAE,GAAG,EAAE,CAAC,CAAC;IACxD,mBAAmB,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC;IACrD,cAAc,EAAE,IAAI,CAAC,EAAE,EAAE;CAC1B,CAAC,CAAC,CAAC;AAEJ,MAAM,0BAA0B,GAAG,GAAG,EAAE;IACtC,MAAM,MAAM,GAAG;QACb,aAAa,EAAE,IAAI,CAAC,EAAE,EAAE;QACxB,MAAM,EAAE,IAAqC;QAC7C,OAAO,EAAE,IAAqC;QAC9C,MAAM,EAAE,iCAAiC;KAC1C,CAAC;IAEF,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE;QAClC,UAAU,CAAC,GAAG,EAAE;YACd,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QACtB,CAAC,EAAE,CAAC,CAAC,CAAC;IACR,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAI,MAAc,CAAC,UAAU,CAAC;AAEtD,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,MAAM,eAAe,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;IAClC,IAAI,WAAwB,CAAC;IAE7B,SAAS,aAAa,CAAC,EAAE,WAAW,KAAoC,EAAE;QACxE,MAAM,YAAY,GAAiC,GAAG,EAAE,GAAE,CAAC,CAAC;QAE5D,OAAO,SAAS,OAAO,CAAC,EAAE,QAAQ,EAAiC;YACjE,MAAM,mBAAmB,GACvB,WAAW,KAAK,SAAS;gBACvB,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;YAErD,OAAO,CACL,oBAAC,mBAAmB,IAAC,MAAM,EAAE,WAAW;gBACtC,oBAAC,qBAAqB,OAAK,mBAAmB;oBAC5C,oBAAC,0BAA0B,QAAE,QAAQ,CAA8B,CAC7C,CACJ,CACvB,CAAC;QACJ,CAAC,CAAC;IACJ,CAAC;IAED,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,aAAa,EAAE,CAAC;QACpB,MAAc,CAAC,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,0BAA0B,EAAE,CAAC,CAAC;QAEzE,WAAW,GAAG,IAAI,WAAW,CAAC;YAC5B,cAAc,EAAE;gBACd,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;gBACzB,SAAS,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;aAC5B;SACF,CAAC,CAAC;QACH,eAAe,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;QAC9D,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,eAAe,CAAC;YACjD,WAAW,EAAE,eAAe;YAC5B,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;YACjB,SAAS,EAAE,KAAK;YAChB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,IAAI;YACX,SAAS,EAAE,KAAK;YAChB,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,SAAS;YACf,SAAS,EAAE,SAAS;YACpB,YAAY,EAAE,CAAC;YACf,aAAa,EAAE,IAAI;YACnB,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;YAChB,OAAO,EAAE,SAAS;YAClB,WAAW,EAAE,CAAC;SACR,CAAC,CAAC;IACZ,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACZ,MAAc,CAAC,UAAU,GAAG,kBAAkB,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,qBAAqB,EAAE,EAAE;gBAC3D,OAAO,EAAE,aAAa,EAAE;aACzB,CAAC,CAAC;YAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,qBAAqB,EAAE,EAAE;gBAC3D,OAAO,EAAE,aAAa,EAAE;aACzB,CAAC,CAAC;YAEH,GAAG,CAAC,GAAG,EAAE;gBACP,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;YACzC,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,qBAAqB,EAAE,EAAE;gBAC3D,OAAO,EAAE,aAAa,EAAE;aACzB,CAAC,CAAC;YAEH,GAAG,CAAC,GAAG,EAAE;gBACP,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACnC,CAAC,CAAC,CAAC;YAEH,GAAG,CAAC,GAAG,EAAE;gBACP,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,QAAQ,CAAC,CAAC;YACrD,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAC3D,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,qBAAqB,EAAE,EAAE;gBAC3D,OAAO,EAAE,aAAa,EAAE;aACzB,CAAC,CAAC;YAEH,GAAG,CAAC,GAAG,EAAE;gBACP,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;YAC1C,CAAC,CAAC,CAAC;YAEH,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;gBACnB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBAC/C,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC/C,CAAC,CAAC,CAAC;YAEH,0BAA0B;YAC1B,MAAM,OAAO,CAAC,GAAG,EAAE;gBACjB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACxC,CAAC,CAAC,CAAC;YAEH,6DAA6D;YAC7D,MAAM,CAAC,eAAe,CAAC,CAAC,oBAAoB,CAAC;gBAC3C,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;iBAClD;gBACD,eAAe,EAAE,cAAc;gBAC/B,KAAK,EAAE,SAAS;aACjB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC1D,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,qBAAqB,EAAE,EAAE;gBAC3D,OAAO,EAAE,aAAa,EAAE;aACzB,CAAC,CAAC;YAEH,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CACnD,yBAAyB,CAC1B,CAAC;YAEF,MAAM,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;YACpE,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,qBAAqB,EAAE,EAAE;gBAC3D,OAAO,EAAE,aAAa,EAAE;aACzB,CAAC,CAAC;YAEH,GAAG,CAAC,GAAG,EAAE;gBACP,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACjC,CAAC,CAAC,CAAC;YAEH,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CACnD,yBAAyB,CAC1B,CAAC;YAEF,MAAM,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,qBAAqB,EAAE,EAAE;gBAC3D,OAAO,EAAE,aAAa,EAAE;aACzB,CAAC,CAAC;YAEH,GAAG,CAAC,GAAG,EAAE;gBACP,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC;YAEH,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;gBACnB,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/C,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,eAAe,CAAC,CAAC,oBAAoB,CAAC;gBAC3C,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;iBACnD;gBACD,eAAe,EAAE,eAAe;gBAChC,KAAK,EAAE,IAAI;aACZ,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,qBAAqB,EAAE,EAAE;gBAC3D,OAAO,EAAE,aAAa,EAAE;aACzB,CAAC,CAAC;YAEH,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;gBACnB,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,CAC3B,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CACxD,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;gBACnB,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAChC,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,eAAe,CAAC,CAAC,oBAAoB,CAAC;gBAC3C,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,UAAU;4BAChB,QAAQ,EAAE;gCACR,IAAI,EAAE,WAAW;gCACjB,QAAQ,EAAE,WAAW;gCACrB,IAAI,EAAE,WAAW;6BAClB;yBACF;qBACF;iBACF;gBACD,eAAe,EAAE,EAAE;gBACnB,KAAK,EAAE,SAAS;aACjB,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,GAAG,EAAE;gBACjB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC5C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;YACnF,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,qBAAqB,EAAE,EAAE;gBAC3D,OAAO,EAAE,aAAa,EAAE;aACzB,CAAC,CAAC;YAEH,GAAG,CAAC,GAAG,EAAE;gBACP,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;YAC1C,CAAC,CAAC,CAAC;YAEH,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;gBACnB,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,CAC3B,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CACxD,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;gBACnB,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAChC,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,eAAe,CAAC,CAAC,oBAAoB,CAAC;gBAC3C,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE;wBACP,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE;wBACtC;4BACE,IAAI,EAAE,UAAU;4BAChB,QAAQ,EAAE;gCACR,IAAI,EAAE,WAAW;gCACjB,QAAQ,EAAE,WAAW;gCACrB,IAAI,EAAE,WAAW;6BAClB;yBACF;qBACF;iBACF;gBACD,eAAe,EAAE,cAAc;gBAC/B,KAAK,EAAE,SAAS;aACjB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;YACjE,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,qBAAqB,EAAE,EAAE;gBAC3D,OAAO,EAAE,aAAa,EAAE;aACzB,CAAC,CAAC;YAEH,yDAAyD;YACzD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,qBAAqB,EAAE,EAAE;gBAC3D,OAAO,EAAE,aAAa,CAAC;oBACrB,WAAW,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,eAAe,EAAE,eAAe,EAAE;iBACjE,CAAC;aACH,CAAC,CAAC;YAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACtD,MAAM,CACJ,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CACrE,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;YACnE,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,qBAAqB,EAAE,EAAE;gBAC3D,OAAO,EAAE,aAAa,CAAC;oBACrB,WAAW,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,eAAe,EAAE,eAAe,EAAE;iBACjE,CAAC;aACH,CAAC,CAAC;YAEH,GAAG,CAAC,GAAG,EAAE;gBACP,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;YAC1C,CAAC,CAAC,CAAC;YAEH,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;gBACnB,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAChC,CAAC,CAAC,CAAC;YAEH,iEAAiE;YACjE,MAAM,CAAC,eAAe,CAAC,CAAC,oBAAoB,CAC1C,MAAM,CAAC,gBAAgB,CAAC;gBACtB,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC;oBAC/B,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;iBAClD,CAAC;aACH,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,qBAAqB,EAAE,EAAE;gBAC3D,OAAO,EAAE,aAAa,EAAE;aACzB,CAAC,CAAC;YAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,qBAAqB,EAAE,EAAE;gBAC3D,OAAO,EAAE,aAAa,EAAE;aACzB,CAAC,CAAC;YAEH,MAAM,CAAC,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACxD,MAAM,CAAC,OAAO,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACzD,MAAM,CAAC,OAAO,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC3D,MAAM,CAAC,OAAO,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,uCAAuC;YACvC,MAAM,UAAU,GAAG,IAAI;iBACpB,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC;iBACvB,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAEhC,MAAM,CAAC,GAAG,EAAE;gBACV,UAAU,CAAC,GAAG,EAAE,CAAC,qBAAqB,EAAE,CAAC,CAAC;YAC5C,CAAC,CAAC,CAAC,OAAO,CACR,sEAAsE,CACvE,CAAC;YAEF,UAAU,CAAC,WAAW,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC;;;WAGG;QACH,SAAS,0BAA0B,CAAC,eAAuB;YACzD,IAAI,eAAe,GAAG,eAAe,CAAC;YACtC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAc,CAAC;YAExC,MAAM,WAAW,GAAG,CAAC,WAAmB,EAAE,EAAE;gBAC1C,eAAe,GAAG,WAAW,CAAC;gBAC9B,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC9C,CAAC,CAAC;YAEF,MAAM,OAAO,GAAG,CAAC,EAAE,QAAQ,EAAiC,EAAE,EAAE;gBAC9D,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;gBAErE,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;oBACnB,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC;oBACzD,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;oBACxB,OAAO,GAAG,EAAE;wBACV,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;oBAC7B,CAAC,CAAC;gBACJ,CAAC,EAAE,EAAE,CAAC,CAAC;gBAEP,MAAM,YAAY,GAAiC,GAAG,EAAE,GAAE,CAAC,CAAC;gBAE5D,OAAO,CACL,oBAAC,mBAAmB,IAAC,MAAM,EAAE,WAAW;oBACtC,oBAAC,qBAAqB,IACpB,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,eAAe,EAAE,QAAQ,EAAE,EACnD,QAAQ,EAAE,YAAY;wBAEtB,oBAAC,0BAA0B,QACxB,QAAQ,CACkB,CACP,CACJ,CACvB,CAAC;YACJ,CAAC,CAAC;YAEF,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;QAClC,CAAC;QAED,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;YACxE,yEAAyE;YACzE,IAAI,cAAqD,CAAC;YAC1D,MAAM,cAAc,GAAG,IAAI,OAAO,CAAuB,CAAC,OAAO,EAAE,EAAE;gBACnE,cAAc,GAAG,OAAO,CAAC;YAC3B,CAAC,CAAC,CAAC;YAEH,eAAe,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE,CAAC,MAAM,cAAc,CAAC,CAAC;YAErE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,0BAA0B,CAAC,UAAU,CAAC,CAAC;YACxE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,qBAAqB,EAAE,EAAE;gBACrE,OAAO,EAAE,OAAO;aACjB,CAAC,CAAC;YAEH,2BAA2B;YAC3B,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAEjD,6CAA6C;YAC7C,GAAG,CAAC,GAAG,EAAE;gBACP,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC;YAClD,CAAC,CAAC,CAAC;YAEH,0DAA0D;YAC1D,IAAI,aAAwD,CAAC;YAC7D,GAAG,CAAC,GAAG,EAAE;gBACP,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAC1C,CAAC,CAAC,CAAC;YAEH,iCAAiC;YACjC,MAAM,OAAO,CAAC,GAAG,EAAE;gBACjB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9C,CAAC,CAAC,CAAC;YAEH,qDAAqD;YACrD,GAAG,CAAC,GAAG,EAAE;gBACP,WAAW,CAAC,UAAU,CAAC,CAAC;YAC1B,CAAC,CAAC,CAAC;YACH,QAAQ,EAAE,CAAC;YAEX,4CAA4C;YAC5C,MAAM,OAAO,CAAC,GAAG,EAAE;gBACjB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACnD,CAAC,CAAC,CAAC;YAEH,qEAAqE;YACrE,wEAAwE;YACxE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAE7C,oCAAoC;YACpC,GAAG,CAAC,GAAG,EAAE;gBACP,cAAe,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;YAC5C,CAAC,CAAC,CAAC;YAEH,+BAA+B;YAC/B,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;gBACnB,MAAM,aAAc,CAAC;YACvB,CAAC,CAAC,CAAC;YAEH,uCAAuC;YACvC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oFAAoF,EAAE,KAAK,IAAI,EAAE;YAClG,gEAAgE;YAChE,MAAM,qBAAqB,GAAG,IAAI,OAAO,CAAuB,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAE1E,eAAe,CAAC,kBAAkB,CAChC,KAAK,IAAI,EAAE,CAAC,MAAM,qBAAqB,CACxC,CAAC;YAEF,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,0BAA0B,CAAC,UAAU,CAAC,CAAC;YACxE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,qBAAqB,EAAE,EAAE;gBACrE,OAAO,EAAE,OAAO;aACjB,CAAC,CAAC;YAEH,+BAA+B;YAC/B,GAAG,CAAC,GAAG,EAAE;gBACP,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;YACvC,CAAC,CAAC,CAAC;YAEH,GAAG,CAAC,GAAG,EAAE;gBACP,KAAK,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAC/B,CAAC,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,GAAG,EAAE;gBACjB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9C,CAAC,CAAC,CAAC;YAEH,0DAA0D;YAC1D,GAAG,CAAC,GAAG,EAAE;gBACP,WAAW,CAAC,UAAU,CAAC,CAAC;YAC1B,CAAC,CAAC,CAAC;YACH,QAAQ,EAAE,CAAC;YAEX,MAAM,OAAO,CAAC,GAAG,EAAE;gBACjB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACnD,CAAC,CAAC,CAAC;YAEH,0DAA0D;YAC1D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAE7C,4CAA4C;YAC5C,GAAG,CAAC,GAAG,EAAE;gBACP,WAAW,CAAC,UAAU,CAAC,CAAC;YAC1B,CAAC,CAAC,CAAC;YACH,QAAQ,EAAE,CAAC;YAEX,MAAM,OAAO,CAAC,GAAG,EAAE;gBACjB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACnD,CAAC,CAAC,CAAC;YAEH,sCAAsC;YACtC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAE7C,4CAA4C;YAC5C,GAAG,CAAC,GAAG,EAAE;gBACP,WAAW,CAAC,UAAU,CAAC,CAAC;YAC1B,CAAC,CAAC,CAAC;YACH,QAAQ,EAAE,CAAC;YAEX,MAAM,OAAO,CAAC,GAAG,EAAE;gBACjB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACnD,CAAC,CAAC,CAAC;YAEH,sCAAsC;YACtC,kFAAkF;YAClF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { renderHook, act, waitFor } from \"@testing-library/react\";\nimport React from \"react\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport {\n TamboV1ThreadInputProvider,\n useTamboV1ThreadInput,\n} from \"../providers/tambo-v1-thread-input-provider\";\nimport { TamboV1StreamProvider } from \"../providers/tambo-v1-stream-context\";\nimport { useTamboV1SendMessage } from \"./use-tambo-v1-send-message\";\nimport type { StreamAction, StreamState } from \"../utils/event-accumulator\";\n\n// Mock useTamboV1SendMessage\njest.mock(\"./use-tambo-v1-send-message\", () => ({\n useTamboV1SendMessage: jest.fn(),\n}));\n\n// Mock useTamboQueryClient to avoid TamboClientProvider dependency\njest.mock(\"../../providers/tambo-client-provider\", () => ({\n useTamboQueryClient: jest.fn(() => new QueryClient()),\n useTamboClient: jest.fn(),\n}));\n\nconst createSuccessfulFileReader = () => {\n const reader = {\n readAsDataURL: jest.fn(),\n onload: null as ((e: unknown) => void) | null,\n onerror: null as ((e: unknown) => void) | null,\n result: \"data:image/png;base64,mock-data\",\n };\n\n reader.readAsDataURL = jest.fn(() => {\n setTimeout(() => {\n reader.onload?.({});\n }, 0);\n });\n\n return reader;\n};\n\nconst originalFileReader = (global as any).FileReader;\n\ndescribe(\"useTamboV1ThreadInput\", () => {\n const mockMutateAsync = jest.fn();\n let queryClient: QueryClient;\n\n function createWrapper({ streamState }: { streamState?: StreamState } = {}) {\n const noopDispatch: React.Dispatch<StreamAction> = () => {};\n\n return function Wrapper({ children }: { children: React.ReactNode }) {\n const streamProviderProps =\n streamState === undefined\n ? {}\n : { state: streamState, dispatch: noopDispatch };\n\n return (\n <QueryClientProvider client={queryClient}>\n <TamboV1StreamProvider {...streamProviderProps}>\n <TamboV1ThreadInputProvider>{children}</TamboV1ThreadInputProvider>\n </TamboV1StreamProvider>\n </QueryClientProvider>\n );\n };\n }\n\n beforeEach(() => {\n jest.clearAllMocks();\n (global as any).FileReader = jest.fn(() => createSuccessfulFileReader());\n\n queryClient = new QueryClient({\n defaultOptions: {\n queries: { retry: false },\n mutations: { retry: false },\n },\n });\n mockMutateAsync.mockResolvedValue({ threadId: \"thread_123\" });\n jest.mocked(useTamboV1SendMessage).mockReturnValue({\n mutateAsync: mockMutateAsync,\n mutate: jest.fn(),\n isPending: false,\n isError: false,\n error: null,\n isSuccess: false,\n isIdle: true,\n isPaused: false,\n status: \"idle\",\n data: undefined,\n variables: undefined,\n failureCount: 0,\n failureReason: null,\n reset: jest.fn(),\n context: undefined,\n submittedAt: 0,\n } as any);\n });\n\n afterEach(() => {\n (global as any).FileReader = originalFileReader;\n });\n\n describe(\"State Management\", () => {\n it(\"initializes with empty value\", () => {\n const { result } = renderHook(() => useTamboV1ThreadInput(), {\n wrapper: createWrapper(),\n });\n\n expect(result.current.value).toBe(\"\");\n });\n\n it(\"updates value via setValue\", () => {\n const { result } = renderHook(() => useTamboV1ThreadInput(), {\n wrapper: createWrapper(),\n });\n\n act(() => {\n result.current.setValue(\"Hello world\");\n });\n\n expect(result.current.value).toBe(\"Hello world\");\n });\n\n it(\"supports functional updates for setValue\", () => {\n const { result } = renderHook(() => useTamboV1ThreadInput(), {\n wrapper: createWrapper(),\n });\n\n act(() => {\n result.current.setValue(\"Hello\");\n });\n\n act(() => {\n result.current.setValue((prev) => `${prev} world`);\n });\n\n expect(result.current.value).toBe(\"Hello world\");\n });\n });\n\n describe(\"Submit Behavior\", () => {\n it(\"submits message and clears input on success\", async () => {\n const { result } = renderHook(() => useTamboV1ThreadInput(), {\n wrapper: createWrapper(),\n });\n\n act(() => {\n result.current.setValue(\"Test message\");\n });\n\n await act(async () => {\n const response = await result.current.submit();\n expect(response.threadId).toBe(\"thread_123\");\n });\n\n // Input should be cleared\n await waitFor(() => {\n expect(result.current.value).toBe(\"\");\n });\n\n // Should have called mutateAsync with correct message format\n expect(mockMutateAsync).toHaveBeenCalledWith({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Test message\" }],\n },\n userMessageText: \"Test message\",\n debug: undefined,\n });\n });\n\n it(\"throws error when submitting empty message\", async () => {\n const { result } = renderHook(() => useTamboV1ThreadInput(), {\n wrapper: createWrapper(),\n });\n\n await expect(result.current.submit()).rejects.toThrow(\n \"Message cannot be empty\",\n );\n\n expect(mockMutateAsync).not.toHaveBeenCalled();\n });\n\n it(\"throws error when submitting whitespace-only message\", async () => {\n const { result } = renderHook(() => useTamboV1ThreadInput(), {\n wrapper: createWrapper(),\n });\n\n act(() => {\n result.current.setValue(\" \");\n });\n\n await expect(result.current.submit()).rejects.toThrow(\n \"Message cannot be empty\",\n );\n\n expect(mockMutateAsync).not.toHaveBeenCalled();\n });\n\n it(\"passes debug option to mutation\", async () => {\n const { result } = renderHook(() => useTamboV1ThreadInput(), {\n wrapper: createWrapper(),\n });\n\n act(() => {\n result.current.setValue(\"Debug message\");\n });\n\n await act(async () => {\n await result.current.submit({ debug: true });\n });\n\n expect(mockMutateAsync).toHaveBeenCalledWith({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Debug message\" }],\n },\n userMessageText: \"Debug message\",\n debug: true,\n });\n });\n\n it(\"submits image-only messages as resource content\", async () => {\n const { result } = renderHook(() => useTamboV1ThreadInput(), {\n wrapper: createWrapper(),\n });\n\n await act(async () => {\n await result.current.addImage(\n new File([\"image\"], \"photo.png\", { type: \"image/png\" }),\n );\n });\n\n await act(async () => {\n await result.current.submit();\n });\n\n expect(mockMutateAsync).toHaveBeenCalledWith({\n message: {\n role: \"user\",\n content: [\n {\n type: \"resource\",\n resource: {\n blob: \"mock-data\",\n mimeType: \"image/png\",\n name: \"photo.png\",\n },\n },\n ],\n },\n userMessageText: \"\",\n debug: undefined,\n });\n\n await waitFor(() => {\n expect(result.current.images).toEqual([]);\n });\n });\n\n it(\"includes both text and image resource content when both are present\", async () => {\n const { result } = renderHook(() => useTamboV1ThreadInput(), {\n wrapper: createWrapper(),\n });\n\n act(() => {\n result.current.setValue(\"Test message\");\n });\n\n await act(async () => {\n await result.current.addImage(\n new File([\"image\"], \"photo.png\", { type: \"image/png\" }),\n );\n });\n\n await act(async () => {\n await result.current.submit();\n });\n\n expect(mockMutateAsync).toHaveBeenCalledWith({\n message: {\n role: \"user\",\n content: [\n { type: \"text\", text: \"Test message\" },\n {\n type: \"resource\",\n resource: {\n blob: \"mock-data\",\n mimeType: \"image/png\",\n name: \"photo.png\",\n },\n },\n ],\n },\n userMessageText: \"Test message\",\n debug: undefined,\n });\n });\n });\n\n describe(\"Thread ID Management\", () => {\n it(\"initializes with placeholder threadId for optimistic UI\", () => {\n const { result } = renderHook(() => useTamboV1ThreadInput(), {\n wrapper: createWrapper(),\n });\n\n // Default state has placeholder thread for optimistic UI\n expect(result.current.threadId).toBe(\"placeholder\");\n });\n\n it(\"uses currentThreadId from stream state\", () => {\n const { result } = renderHook(() => useTamboV1ThreadInput(), {\n wrapper: createWrapper({\n streamState: { threadMap: {}, currentThreadId: \"thread_stream\" },\n }),\n });\n\n expect(result.current.threadId).toBe(\"thread_stream\");\n expect(\n jest.mocked(useTamboV1SendMessage).mock.calls.map((call) => call[0]),\n ).toContain(\"thread_stream\");\n });\n\n it(\"uses stream state threadId when submitting messages\", async () => {\n const { result } = renderHook(() => useTamboV1ThreadInput(), {\n wrapper: createWrapper({\n streamState: { threadMap: {}, currentThreadId: \"thread_stream\" },\n }),\n });\n\n act(() => {\n result.current.setValue(\"Test message\");\n });\n\n await act(async () => {\n await result.current.submit();\n });\n\n // Verify sendMessage was called with the stream state's threadId\n expect(mockMutateAsync).toHaveBeenCalledWith(\n expect.objectContaining({\n message: expect.objectContaining({\n content: [{ type: \"text\", text: \"Test message\" }],\n }),\n }),\n );\n });\n });\n\n describe(\"Image State\", () => {\n it(\"initializes with empty images array\", () => {\n const { result } = renderHook(() => useTamboV1ThreadInput(), {\n wrapper: createWrapper(),\n });\n\n expect(result.current.images).toEqual([]);\n });\n\n it(\"exposes image management functions\", () => {\n const { result } = renderHook(() => useTamboV1ThreadInput(), {\n wrapper: createWrapper(),\n });\n\n expect(typeof result.current.addImage).toBe(\"function\");\n expect(typeof result.current.addImages).toBe(\"function\");\n expect(typeof result.current.removeImage).toBe(\"function\");\n expect(typeof result.current.clearImages).toBe(\"function\");\n });\n });\n\n describe(\"Error handling\", () => {\n it(\"throws error when used outside provider\", () => {\n // Suppress console.error for this test\n const consoleSpy = jest\n .spyOn(console, \"error\")\n .mockImplementation(() => {});\n\n expect(() => {\n renderHook(() => useTamboV1ThreadInput());\n }).toThrow(\n \"useTamboV1ThreadInput must be used within TamboV1ThreadInputProvider\",\n );\n\n consoleSpy.mockRestore();\n });\n });\n\n describe(\"Thread Isolation\", () => {\n /**\n * Creates a wrapper that allows dynamically changing the thread ID.\n * This simulates switching between threads in the UI.\n */\n function createDynamicThreadWrapper(initialThreadId: string) {\n let currentThreadId = initialThreadId;\n const listeners = new Set<() => void>();\n\n const setThreadId = (newThreadId: string) => {\n currentThreadId = newThreadId;\n listeners.forEach((listener) => listener());\n };\n\n const Wrapper = ({ children }: { children: React.ReactNode }) => {\n const [threadId, setThreadIdState] = React.useState(currentThreadId);\n\n React.useEffect(() => {\n const listener = () => setThreadIdState(currentThreadId);\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n }, []);\n\n const noopDispatch: React.Dispatch<StreamAction> = () => {};\n\n return (\n <QueryClientProvider client={queryClient}>\n <TamboV1StreamProvider\n state={{ threadMap: {}, currentThreadId: threadId }}\n dispatch={noopDispatch}\n >\n <TamboV1ThreadInputProvider>\n {children}\n </TamboV1ThreadInputProvider>\n </TamboV1StreamProvider>\n </QueryClientProvider>\n );\n };\n\n return { Wrapper, setThreadId };\n }\n\n it(\"isolates pending state per thread when switching threads\", async () => {\n // Create a deferred promise so we can control when the mutation resolves\n let resolveThreadA: (value: { threadId: string }) => void;\n const threadAPromise = new Promise<{ threadId: string }>((resolve) => {\n resolveThreadA = resolve;\n });\n\n mockMutateAsync.mockImplementation(async () => await threadAPromise);\n\n const { Wrapper, setThreadId } = createDynamicThreadWrapper(\"thread_A\");\n const { result, rerender } = renderHook(() => useTamboV1ThreadInput(), {\n wrapper: Wrapper,\n });\n\n // Verify we're on thread A\n expect(result.current.threadId).toBe(\"thread_A\");\n\n // Set input and start submission on thread A\n act(() => {\n result.current.setValue(\"Message for thread A\");\n });\n\n // Start the submission (don't await - we want it pending)\n let submitPromise: Promise<{ threadId: string | undefined }>;\n act(() => {\n submitPromise = result.current.submit();\n });\n\n // Thread A should now be pending\n await waitFor(() => {\n expect(result.current.isPending).toBe(true);\n });\n\n // Switch to thread B while thread A is still pending\n act(() => {\n setThreadId(\"thread_B\");\n });\n rerender();\n\n // Wait for the thread switch to take effect\n await waitFor(() => {\n expect(result.current.threadId).toBe(\"thread_B\");\n });\n\n // Thread B should NOT be pending - its mutation state is independent\n // (The mutationKey includes threadId, so each thread has its own state)\n expect(result.current.isPending).toBe(false);\n\n // Now resolve thread A's submission\n act(() => {\n resolveThreadA!({ threadId: \"thread_A\" });\n });\n\n // Wait for promise to complete\n await act(async () => {\n await submitPromise!;\n });\n\n // Thread B should still not be pending\n expect(result.current.isPending).toBe(false);\n });\n\n it(\"multiple threads that never submitted should not be pending when another thread is\", async () => {\n // Create a promise that never resolves to keep thread A pending\n const neverResolvingPromise = new Promise<{ threadId: string }>(() => {});\n\n mockMutateAsync.mockImplementation(\n async () => await neverResolvingPromise,\n );\n\n const { Wrapper, setThreadId } = createDynamicThreadWrapper(\"thread_A\");\n const { result, rerender } = renderHook(() => useTamboV1ThreadInput(), {\n wrapper: Wrapper,\n });\n\n // Start submission on thread A\n act(() => {\n result.current.setValue(\"Message A\");\n });\n\n act(() => {\n void result.current.submit();\n });\n\n await waitFor(() => {\n expect(result.current.isPending).toBe(true);\n });\n\n // Switch to thread B (which has never submitted anything)\n act(() => {\n setThreadId(\"thread_B\");\n });\n rerender();\n\n await waitFor(() => {\n expect(result.current.threadId).toBe(\"thread_B\");\n });\n\n // Thread B should not be pending - it has never submitted\n expect(result.current.isPending).toBe(false);\n\n // Switch to thread C (also never submitted)\n act(() => {\n setThreadId(\"thread_C\");\n });\n rerender();\n\n await waitFor(() => {\n expect(result.current.threadId).toBe(\"thread_C\");\n });\n\n // Thread C should also not be pending\n expect(result.current.isPending).toBe(false);\n\n // Switch to thread D (also never submitted)\n act(() => {\n setThreadId(\"thread_D\");\n });\n rerender();\n\n await waitFor(() => {\n expect(result.current.threadId).toBe(\"thread_D\");\n });\n\n // Thread D should also not be pending\n // This confirms the fix works - without mutationKey, ALL threads would be pending\n expect(result.current.isPending).toBe(false);\n });\n });\n});\n"]}
|
|
@@ -3,27 +3,14 @@
|
|
|
3
3
|
*
|
|
4
4
|
* React Query hook for fetching a list of threads.
|
|
5
5
|
*/
|
|
6
|
-
import {
|
|
7
|
-
import type { ThreadListResponse } from "@tambo-ai/typescript-sdk/resources/threads/threads";
|
|
6
|
+
import type { UseQueryOptions } from "@tanstack/react-query";
|
|
7
|
+
import type { ThreadListParams, ThreadListResponse } from "@tambo-ai/typescript-sdk/resources/threads/threads";
|
|
8
8
|
/**
|
|
9
|
-
* Options for fetching thread list
|
|
9
|
+
* Options for fetching thread list.
|
|
10
|
+
* Re-exported from SDK for convenience.
|
|
11
|
+
* Note: userKey can also be provided via TamboV1Provider context.
|
|
10
12
|
*/
|
|
11
|
-
export
|
|
12
|
-
/**
|
|
13
|
-
* User key to scope thread list.
|
|
14
|
-
* Only threads owned by this userKey will be returned.
|
|
15
|
-
* If not provided here, uses the userKey from TamboV1Provider context.
|
|
16
|
-
*/
|
|
17
|
-
userKey?: string;
|
|
18
|
-
/**
|
|
19
|
-
* Maximum number of threads to return (as string per SDK)
|
|
20
|
-
*/
|
|
21
|
-
limit?: string;
|
|
22
|
-
/**
|
|
23
|
-
* Pagination cursor for fetching next page
|
|
24
|
-
*/
|
|
25
|
-
cursor?: string;
|
|
26
|
-
}
|
|
13
|
+
export type { ThreadListParams as ThreadListOptions };
|
|
27
14
|
/**
|
|
28
15
|
* Hook to fetch a list of threads.
|
|
29
16
|
*
|
|
@@ -40,7 +27,7 @@ export interface ThreadListOptions {
|
|
|
40
27
|
* function ThreadList({ userKey }: { userKey?: string }) {
|
|
41
28
|
* const { data, isLoading, isError } = useTamboV1ThreadList({
|
|
42
29
|
* userKey,
|
|
43
|
-
* limit:
|
|
30
|
+
* limit: 20,
|
|
44
31
|
* });
|
|
45
32
|
*
|
|
46
33
|
* if (isLoading) return <Spinner />;
|
|
@@ -59,5 +46,5 @@ export interface ThreadListOptions {
|
|
|
59
46
|
* }
|
|
60
47
|
* ```
|
|
61
48
|
*/
|
|
62
|
-
export declare function useTamboV1ThreadList(listOptions?:
|
|
49
|
+
export declare function useTamboV1ThreadList(listOptions?: ThreadListParams, queryOptions?: Omit<UseQueryOptions<ThreadListResponse>, "queryKey" | "queryFn">): import("@tanstack/react-query").UseQueryResult<ThreadListResponse, Error>;
|
|
63
50
|
//# sourceMappingURL=use-tambo-v1-thread-list.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-tambo-v1-thread-list.d.ts","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-thread-list.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"use-tambo-v1-thread-list.d.ts","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-thread-list.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EACV,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,oDAAoD,CAAC;AAK5D;;;;GAIG;AACH,YAAY,EAAE,gBAAgB,IAAI,iBAAiB,EAAE,CAAC;AAEtD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,CAAC,EAAE,gBAAgB,EAC9B,YAAY,CAAC,EAAE,IAAI,CACjB,eAAe,CAAC,kBAAkB,CAAC,EACnC,UAAU,GAAG,SAAS,CACvB,6EAiBF"}
|