@tambo-ai/react 0.74.0 → 0.75.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +46 -449
- package/dist/hoc/with-tambo-interactable.d.ts +8 -0
- package/dist/hoc/with-tambo-interactable.d.ts.map +1 -1
- package/dist/hoc/with-tambo-interactable.js +5 -2
- package/dist/hoc/with-tambo-interactable.js.map +1 -1
- package/dist/hoc/with-tambo-interactable.test.js +12 -0
- package/dist/hoc/with-tambo-interactable.test.js.map +1 -1
- package/dist/hooks/use-tambo-voice.test.js +3 -0
- package/dist/hooks/use-tambo-voice.test.js.map +1 -1
- package/dist/mcp/mcp-hooks.d.ts.map +1 -1
- package/dist/mcp/mcp-hooks.js +70 -16
- package/dist/mcp/mcp-hooks.js.map +1 -1
- package/dist/mcp/mcp-hooks.test.js +69 -0
- package/dist/mcp/mcp-hooks.test.js.map +1 -1
- package/dist/mcp/tambo-mcp-provider.test.js +24 -0
- package/dist/mcp/tambo-mcp-provider.test.js.map +1 -1
- package/dist/mcp/use-mcp-servers.test.js +9 -0
- package/dist/mcp/use-mcp-servers.test.js.map +1 -1
- package/dist/model/component-metadata.d.ts +4 -4
- package/dist/model/component-metadata.js.map +1 -1
- package/dist/providers/__tests__/thread-input-resource-resolution.test.js +2 -2
- package/dist/providers/__tests__/thread-input-resource-resolution.test.js.map +1 -1
- package/dist/providers/tambo-client-provider.d.ts +6 -0
- package/dist/providers/tambo-client-provider.d.ts.map +1 -1
- package/dist/providers/tambo-client-provider.js +4 -1
- package/dist/providers/tambo-client-provider.js.map +1 -1
- package/dist/providers/tambo-interactable-provider.d.ts.map +1 -1
- package/dist/providers/tambo-interactable-provider.js +8 -0
- package/dist/providers/tambo-interactable-provider.js.map +1 -1
- package/dist/providers/tambo-interactable-provider.test.js +47 -0
- package/dist/providers/tambo-interactable-provider.test.js.map +1 -1
- package/dist/providers/tambo-provider.d.ts.map +1 -1
- package/dist/providers/tambo-provider.js +4 -1
- package/dist/providers/tambo-provider.js.map +1 -1
- package/dist/providers/tambo-stubs.d.ts.map +1 -1
- package/dist/providers/tambo-stubs.js +3 -0
- package/dist/providers/tambo-stubs.js.map +1 -1
- package/dist/providers/tambo-thread-provider-initial-messages.test.js +3 -0
- package/dist/providers/tambo-thread-provider-initial-messages.test.js.map +1 -1
- package/dist/providers/tambo-thread-provider.test.js +3 -0
- package/dist/providers/tambo-thread-provider.test.js.map +1 -1
- package/dist/util/registry-validators.js +1 -1
- package/dist/util/registry-validators.js.map +1 -1
- package/dist/util/resource-content-resolver.test.js +1 -1
- package/dist/util/resource-content-resolver.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-auth-state.d.ts +11 -0
- package/dist/v1/hooks/use-tambo-v1-auth-state.d.ts.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-auth-state.js +48 -0
- package/dist/v1/hooks/use-tambo-v1-auth-state.js.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-auth-state.test.d.ts +2 -0
- package/dist/v1/hooks/use-tambo-v1-auth-state.test.d.ts.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-auth-state.test.js +105 -0
- package/dist/v1/hooks/use-tambo-v1-auth-state.test.js.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-component-state.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-component-state.js +68 -21
- package/dist/v1/hooks/use-tambo-v1-component-state.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-component-state.test.js +100 -0
- package/dist/v1/hooks/use-tambo-v1-component-state.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-messages.test.js +8 -0
- package/dist/v1/hooks/use-tambo-v1-messages.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-send-message.d.ts +19 -1
- package/dist/v1/hooks/use-tambo-v1-send-message.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-send-message.js +86 -9
- package/dist/v1/hooks/use-tambo-v1-send-message.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-send-message.test.js +273 -0
- package/dist/v1/hooks/use-tambo-v1-send-message.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-stream-status.d.ts +2 -2
- package/dist/v1/hooks/use-tambo-v1-stream-status.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-stream-status.js +2 -2
- package/dist/v1/hooks/use-tambo-v1-stream-status.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-stream-status.test.js +11 -11
- package/dist/v1/hooks/use-tambo-v1-stream-status.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread-input.test.js +13 -0
- package/dist/v1/hooks/use-tambo-v1-thread-input.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread-list.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread-list.js +4 -0
- package/dist/v1/hooks/use-tambo-v1-thread-list.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread-list.test.js +6 -0
- package/dist/v1/hooks/use-tambo-v1-thread-list.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread.js +4 -0
- package/dist/v1/hooks/use-tambo-v1-thread.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread.test.js +6 -0
- package/dist/v1/hooks/use-tambo-v1-thread.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1.d.ts +11 -0
- package/dist/v1/hooks/use-tambo-v1.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1.js +5 -0
- package/dist/v1/hooks/use-tambo-v1.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1.test.js +13 -0
- package/dist/v1/hooks/use-tambo-v1.test.js.map +1 -1
- package/dist/v1/index.d.ts +4 -1
- package/dist/v1/index.d.ts.map +1 -1
- package/dist/v1/index.js +5 -2
- package/dist/v1/index.js.map +1 -1
- package/dist/v1/providers/tambo-v1-provider.d.ts +16 -1
- package/dist/v1/providers/tambo-v1-provider.d.ts.map +1 -1
- package/dist/v1/providers/tambo-v1-provider.js +42 -5
- package/dist/v1/providers/tambo-v1-provider.js.map +1 -1
- package/dist/v1/providers/tambo-v1-provider.test.js +19 -2
- package/dist/v1/providers/tambo-v1-provider.test.js.map +1 -1
- package/dist/v1/providers/tambo-v1-stream-context.d.ts +6 -0
- package/dist/v1/providers/tambo-v1-stream-context.d.ts.map +1 -1
- package/dist/v1/providers/tambo-v1-stream-context.js +50 -11
- package/dist/v1/providers/tambo-v1-stream-context.js.map +1 -1
- package/dist/v1/providers/tambo-v1-stream-context.test.js +9 -0
- package/dist/v1/providers/tambo-v1-stream-context.test.js.map +1 -1
- package/dist/v1/providers/tambo-v1-stub-provider.d.ts.map +1 -1
- package/dist/v1/providers/tambo-v1-stub-provider.js +4 -0
- package/dist/v1/providers/tambo-v1-stub-provider.js.map +1 -1
- package/dist/v1/providers/tambo-v1-thread-input-provider.d.ts +11 -0
- package/dist/v1/providers/tambo-v1-thread-input-provider.d.ts.map +1 -1
- package/dist/v1/providers/tambo-v1-thread-input-provider.js +10 -1
- package/dist/v1/providers/tambo-v1-thread-input-provider.js.map +1 -1
- package/dist/v1/types/auth.d.ts +24 -0
- package/dist/v1/types/auth.d.ts.map +1 -0
- package/dist/v1/types/auth.js +3 -0
- package/dist/v1/types/auth.js.map +1 -0
- package/dist/v1/types/message.d.ts +12 -0
- package/dist/v1/types/message.d.ts.map +1 -1
- package/dist/v1/types/message.js.map +1 -1
- package/dist/v1/types/tool-choice.d.ts +8 -0
- package/dist/v1/types/tool-choice.d.ts.map +1 -0
- package/dist/v1/types/tool-choice.js +3 -0
- package/dist/v1/types/tool-choice.js.map +1 -0
- package/dist/v1/utils/event-accumulator.d.ts +28 -2
- package/dist/v1/utils/event-accumulator.d.ts.map +1 -1
- package/dist/v1/utils/event-accumulator.js +67 -15
- package/dist/v1/utils/event-accumulator.js.map +1 -1
- package/dist/v1/utils/event-accumulator.test.js +106 -0
- package/dist/v1/utils/event-accumulator.test.js.map +1 -1
- package/dist/v1/utils/keyed-throttle.d.ts +42 -0
- package/dist/v1/utils/keyed-throttle.d.ts.map +1 -0
- package/dist/v1/utils/keyed-throttle.js +86 -0
- package/dist/v1/utils/keyed-throttle.js.map +1 -0
- package/dist/v1/utils/keyed-throttle.test.d.ts +2 -0
- package/dist/v1/utils/keyed-throttle.test.d.ts.map +1 -0
- package/dist/v1/utils/keyed-throttle.test.js +147 -0
- package/dist/v1/utils/keyed-throttle.test.js.map +1 -0
- package/dist/v1/utils/registry-conversion.d.ts.map +1 -1
- package/dist/v1/utils/registry-conversion.js +2 -0
- package/dist/v1/utils/registry-conversion.js.map +1 -1
- package/dist/v1/utils/registry-conversion.test.js +23 -0
- package/dist/v1/utils/registry-conversion.test.js.map +1 -1
- package/dist/v1/utils/tool-call-tracker.d.ts +10 -0
- package/dist/v1/utils/tool-call-tracker.d.ts.map +1 -1
- package/dist/v1/utils/tool-call-tracker.js +13 -0
- package/dist/v1/utils/tool-call-tracker.js.map +1 -1
- package/dist/v1/utils/tool-call-tracker.test.d.ts +2 -0
- package/dist/v1/utils/tool-call-tracker.test.d.ts.map +1 -0
- package/dist/v1/utils/tool-call-tracker.test.js +67 -0
- package/dist/v1/utils/tool-call-tracker.test.js.map +1 -0
- package/dist/v1/utils/tool-executor.d.ts +34 -0
- package/dist/v1/utils/tool-executor.d.ts.map +1 -1
- package/dist/v1/utils/tool-executor.js +55 -0
- package/dist/v1/utils/tool-executor.js.map +1 -1
- package/dist/v1/utils/tool-executor.test.js +211 -0
- package/dist/v1/utils/tool-executor.test.js.map +1 -1
- package/esm/hoc/with-tambo-interactable.d.ts +8 -0
- package/esm/hoc/with-tambo-interactable.d.ts.map +1 -1
- package/esm/hoc/with-tambo-interactable.js +5 -2
- package/esm/hoc/with-tambo-interactable.js.map +1 -1
- package/esm/hoc/with-tambo-interactable.test.js +12 -0
- package/esm/hoc/with-tambo-interactable.test.js.map +1 -1
- package/esm/hooks/use-tambo-voice.test.js +3 -0
- package/esm/hooks/use-tambo-voice.test.js.map +1 -1
- package/esm/mcp/mcp-hooks.d.ts.map +1 -1
- package/esm/mcp/mcp-hooks.js +70 -16
- package/esm/mcp/mcp-hooks.js.map +1 -1
- package/esm/mcp/mcp-hooks.test.js +69 -0
- package/esm/mcp/mcp-hooks.test.js.map +1 -1
- package/esm/mcp/tambo-mcp-provider.test.js +24 -0
- package/esm/mcp/tambo-mcp-provider.test.js.map +1 -1
- package/esm/mcp/use-mcp-servers.test.js +9 -0
- package/esm/mcp/use-mcp-servers.test.js.map +1 -1
- package/esm/model/component-metadata.d.ts +4 -4
- package/esm/model/component-metadata.js.map +1 -1
- package/esm/providers/__tests__/thread-input-resource-resolution.test.js +2 -2
- package/esm/providers/__tests__/thread-input-resource-resolution.test.js.map +1 -1
- package/esm/providers/tambo-client-provider.d.ts +6 -0
- package/esm/providers/tambo-client-provider.d.ts.map +1 -1
- package/esm/providers/tambo-client-provider.js +4 -1
- package/esm/providers/tambo-client-provider.js.map +1 -1
- package/esm/providers/tambo-interactable-provider.d.ts.map +1 -1
- package/esm/providers/tambo-interactable-provider.js +8 -0
- package/esm/providers/tambo-interactable-provider.js.map +1 -1
- package/esm/providers/tambo-interactable-provider.test.js +47 -0
- package/esm/providers/tambo-interactable-provider.test.js.map +1 -1
- package/esm/providers/tambo-provider.d.ts.map +1 -1
- package/esm/providers/tambo-provider.js +4 -1
- package/esm/providers/tambo-provider.js.map +1 -1
- package/esm/providers/tambo-stubs.d.ts.map +1 -1
- package/esm/providers/tambo-stubs.js +3 -0
- package/esm/providers/tambo-stubs.js.map +1 -1
- package/esm/providers/tambo-thread-provider-initial-messages.test.js +3 -0
- package/esm/providers/tambo-thread-provider-initial-messages.test.js.map +1 -1
- package/esm/providers/tambo-thread-provider.test.js +3 -0
- package/esm/providers/tambo-thread-provider.test.js.map +1 -1
- package/esm/util/registry-validators.js +1 -1
- package/esm/util/registry-validators.js.map +1 -1
- package/esm/util/resource-content-resolver.test.js +1 -1
- package/esm/util/resource-content-resolver.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-auth-state.d.ts +11 -0
- package/esm/v1/hooks/use-tambo-v1-auth-state.d.ts.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-auth-state.js +45 -0
- package/esm/v1/hooks/use-tambo-v1-auth-state.js.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-auth-state.test.d.ts +2 -0
- package/esm/v1/hooks/use-tambo-v1-auth-state.test.d.ts.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-auth-state.test.js +100 -0
- package/esm/v1/hooks/use-tambo-v1-auth-state.test.js.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-component-state.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-component-state.js +68 -21
- package/esm/v1/hooks/use-tambo-v1-component-state.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-component-state.test.js +100 -0
- package/esm/v1/hooks/use-tambo-v1-component-state.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-messages.test.js +8 -0
- package/esm/v1/hooks/use-tambo-v1-messages.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-send-message.d.ts +19 -1
- package/esm/v1/hooks/use-tambo-v1-send-message.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-send-message.js +87 -10
- package/esm/v1/hooks/use-tambo-v1-send-message.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-send-message.test.js +273 -0
- package/esm/v1/hooks/use-tambo-v1-send-message.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-stream-status.d.ts +2 -2
- package/esm/v1/hooks/use-tambo-v1-stream-status.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-stream-status.js +2 -2
- package/esm/v1/hooks/use-tambo-v1-stream-status.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-stream-status.test.js +11 -11
- package/esm/v1/hooks/use-tambo-v1-stream-status.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-input.test.js +13 -0
- package/esm/v1/hooks/use-tambo-v1-thread-input.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-list.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-list.js +4 -0
- package/esm/v1/hooks/use-tambo-v1-thread-list.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-list.test.js +6 -0
- package/esm/v1/hooks/use-tambo-v1-thread-list.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread.js +4 -0
- package/esm/v1/hooks/use-tambo-v1-thread.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread.test.js +6 -0
- package/esm/v1/hooks/use-tambo-v1-thread.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1.d.ts +11 -0
- package/esm/v1/hooks/use-tambo-v1.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1.js +5 -0
- package/esm/v1/hooks/use-tambo-v1.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1.test.js +13 -0
- package/esm/v1/hooks/use-tambo-v1.test.js.map +1 -1
- package/esm/v1/index.d.ts +4 -1
- package/esm/v1/index.d.ts.map +1 -1
- package/esm/v1/index.js +3 -1
- package/esm/v1/index.js.map +1 -1
- package/esm/v1/providers/tambo-v1-provider.d.ts +16 -1
- package/esm/v1/providers/tambo-v1-provider.d.ts.map +1 -1
- package/esm/v1/providers/tambo-v1-provider.js +43 -6
- package/esm/v1/providers/tambo-v1-provider.js.map +1 -1
- package/esm/v1/providers/tambo-v1-provider.test.js +19 -2
- package/esm/v1/providers/tambo-v1-provider.test.js.map +1 -1
- package/esm/v1/providers/tambo-v1-stream-context.d.ts +6 -0
- package/esm/v1/providers/tambo-v1-stream-context.d.ts.map +1 -1
- package/esm/v1/providers/tambo-v1-stream-context.js +51 -12
- package/esm/v1/providers/tambo-v1-stream-context.js.map +1 -1
- package/esm/v1/providers/tambo-v1-stream-context.test.js +9 -0
- package/esm/v1/providers/tambo-v1-stream-context.test.js.map +1 -1
- package/esm/v1/providers/tambo-v1-stub-provider.d.ts.map +1 -1
- package/esm/v1/providers/tambo-v1-stub-provider.js +4 -0
- package/esm/v1/providers/tambo-v1-stub-provider.js.map +1 -1
- package/esm/v1/providers/tambo-v1-thread-input-provider.d.ts +11 -0
- package/esm/v1/providers/tambo-v1-thread-input-provider.d.ts.map +1 -1
- package/esm/v1/providers/tambo-v1-thread-input-provider.js +10 -1
- package/esm/v1/providers/tambo-v1-thread-input-provider.js.map +1 -1
- package/esm/v1/types/auth.d.ts +24 -0
- package/esm/v1/types/auth.d.ts.map +1 -0
- package/esm/v1/types/auth.js +2 -0
- package/esm/v1/types/auth.js.map +1 -0
- package/esm/v1/types/message.d.ts +12 -0
- package/esm/v1/types/message.d.ts.map +1 -1
- package/esm/v1/types/message.js.map +1 -1
- package/esm/v1/types/tool-choice.d.ts +8 -0
- package/esm/v1/types/tool-choice.d.ts.map +1 -0
- package/esm/v1/types/tool-choice.js +2 -0
- package/esm/v1/types/tool-choice.js.map +1 -0
- package/esm/v1/utils/event-accumulator.d.ts +28 -2
- package/esm/v1/utils/event-accumulator.d.ts.map +1 -1
- package/esm/v1/utils/event-accumulator.js +66 -15
- package/esm/v1/utils/event-accumulator.js.map +1 -1
- package/esm/v1/utils/event-accumulator.test.js +106 -0
- package/esm/v1/utils/event-accumulator.test.js.map +1 -1
- package/esm/v1/utils/keyed-throttle.d.ts +42 -0
- package/esm/v1/utils/keyed-throttle.d.ts.map +1 -0
- package/esm/v1/utils/keyed-throttle.js +83 -0
- package/esm/v1/utils/keyed-throttle.js.map +1 -0
- package/esm/v1/utils/keyed-throttle.test.d.ts +2 -0
- package/esm/v1/utils/keyed-throttle.test.d.ts.map +1 -0
- package/esm/v1/utils/keyed-throttle.test.js +145 -0
- package/esm/v1/utils/keyed-throttle.test.js.map +1 -0
- package/esm/v1/utils/registry-conversion.d.ts.map +1 -1
- package/esm/v1/utils/registry-conversion.js +2 -0
- package/esm/v1/utils/registry-conversion.js.map +1 -1
- package/esm/v1/utils/registry-conversion.test.js +23 -0
- package/esm/v1/utils/registry-conversion.test.js.map +1 -1
- package/esm/v1/utils/tool-call-tracker.d.ts +10 -0
- package/esm/v1/utils/tool-call-tracker.d.ts.map +1 -1
- package/esm/v1/utils/tool-call-tracker.js +13 -0
- package/esm/v1/utils/tool-call-tracker.js.map +1 -1
- package/esm/v1/utils/tool-call-tracker.test.d.ts +2 -0
- package/esm/v1/utils/tool-call-tracker.test.d.ts.map +1 -0
- package/esm/v1/utils/tool-call-tracker.test.js +65 -0
- package/esm/v1/utils/tool-call-tracker.test.js.map +1 -0
- package/esm/v1/utils/tool-executor.d.ts +34 -0
- package/esm/v1/utils/tool-executor.d.ts.map +1 -1
- package/esm/v1/utils/tool-executor.js +53 -0
- package/esm/v1/utils/tool-executor.js.map +1 -1
- package/esm/v1/utils/tool-executor.test.js +212 -1
- package/esm/v1/utils/tool-executor.test.js.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-tambo-v1-send-message.test.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-send-message.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import { EventType } from \"@ag-ui/core\";\nimport TamboAI from \"@tambo-ai/typescript-sdk\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { renderHook, waitFor, act } from \"@testing-library/react\";\nimport React from \"react\";\nimport { z } from \"zod\";\nimport type { TamboTool } from \"../../model/component-metadata\";\nimport {\n useTamboClient,\n useTamboQueryClient,\n} from \"../../providers/tambo-client-provider\";\nimport { TamboRegistryContext } from \"../../providers/tambo-registry-provider\";\nimport { useTamboV1Config } from \"../providers/tambo-v1-provider\";\nimport { TamboV1StreamProvider } from \"../providers/tambo-v1-stream-context\";\nimport {\n createRunStream,\n useTamboV1SendMessage,\n} from \"./use-tambo-v1-send-message\";\n\njest.mock(\"../../providers/tambo-client-provider\", () => ({\n useTamboClient: jest.fn(),\n useTamboQueryClient: jest.fn(),\n}));\n\njest.mock(\"../providers/tambo-v1-provider\", () => ({\n useTamboV1Config: jest.fn(),\n}));\n\njest.mock(\"../../providers/tambo-context-helpers-provider\", () => ({\n useTamboContextHelpers: () => ({\n getAdditionalContext: jest.fn().mockResolvedValue([]),\n }),\n}));\n\ndescribe(\"useTamboV1SendMessage\", () => {\n const mockThreadsRunsApi = {\n run: jest.fn(),\n create: jest.fn(),\n };\n\n const mockTamboAI = {\n apiKey: \"\",\n threads: {\n runs: mockThreadsRunsApi,\n },\n } as unknown as TamboAI;\n\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: new Map(),\n };\n\n let queryClient: QueryClient;\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n beforeEach(() => {\n queryClient = new QueryClient({\n defaultOptions: {\n queries: { retry: false },\n mutations: { retry: false },\n },\n });\n jest.mocked(useTamboClient).mockReturnValue(mockTamboAI);\n jest.mocked(useTamboQueryClient).mockReturnValue(queryClient);\n jest.mocked(useTamboV1Config).mockReturnValue({ userKey: undefined });\n mockThreadsRunsApi.run.mockReset();\n mockThreadsRunsApi.create.mockReset();\n });\n\n it(\"returns a mutation object\", () => {\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n expect(result.current.mutate).toBeDefined();\n expect(result.current.mutateAsync).toBeDefined();\n expect(result.current.isPending).toBe(false);\n });\n\n it(\"returns a mutation object when threadId is not provided\", () => {\n const { result } = renderHook(() => useTamboV1SendMessage(), {\n wrapper: TestWrapper,\n });\n\n expect(result.current.mutate).toBeDefined();\n expect(result.current.mutateAsync).toBeDefined();\n });\n});\n\ndescribe(\"createRunStream\", () => {\n const mockStream = {\n [Symbol.asyncIterator]: async function* () {\n yield { type: \"RUN_STARTED\", runId: \"run_1\", threadId: \"thread_123\" };\n },\n };\n\n const mockThreadsRunsApi = {\n run: jest.fn(),\n create: jest.fn(),\n };\n\n const mockClient = {\n threads: {\n runs: mockThreadsRunsApi,\n },\n } as unknown as TamboAI;\n\n const mockRegistry = {\n componentList: new Map([\n [\n \"TestComponent\",\n {\n name: \"TestComponent\",\n description: \"A test component\",\n component: () => null,\n // RegisteredComponent has props as JSON Schema (already converted from propsSchema)\n props: {\n type: \"object\",\n properties: { title: { type: \"string\" } },\n required: [\"title\"],\n },\n contextTools: [],\n },\n ],\n ]),\n toolRegistry: new Map([\n [\n \"testTool\",\n {\n name: \"testTool\",\n description: \"A test tool\",\n tool: async () => \"result\",\n inputSchema: z.object({ query: z.string() }),\n },\n ],\n ]),\n };\n\n const testMessage = {\n role: \"user\" as const,\n content: [{ type: \"text\" as const, text: \"Hello\" }],\n };\n\n beforeEach(() => {\n mockThreadsRunsApi.run.mockReset();\n mockThreadsRunsApi.create.mockReset();\n });\n\n it(\"calls client.threads.runs.run when threadId is provided\", async () => {\n mockThreadsRunsApi.run.mockResolvedValue(mockStream);\n\n const result = await createRunStream({\n client: mockClient,\n threadId: \"thread_123\",\n message: testMessage,\n registry: mockRegistry as any,\n userKey: undefined,\n previousRunId: undefined,\n });\n\n expect(mockThreadsRunsApi.run).toHaveBeenCalledWith(\"thread_123\", {\n message: testMessage,\n availableComponents: expect.any(Array),\n tools: expect.any(Array),\n userKey: undefined,\n previousRunId: undefined,\n });\n expect(mockThreadsRunsApi.create).not.toHaveBeenCalled();\n expect(result.stream).toBe(mockStream);\n expect(result.initialThreadId).toBe(\"thread_123\");\n });\n\n it(\"calls client.threads.runs.run with previousRunId when provided\", async () => {\n mockThreadsRunsApi.run.mockResolvedValue(mockStream);\n\n const result = await createRunStream({\n client: mockClient,\n threadId: \"thread_123\",\n message: testMessage,\n registry: mockRegistry as any,\n userKey: undefined,\n previousRunId: \"run_456\",\n });\n\n expect(mockThreadsRunsApi.run).toHaveBeenCalledWith(\"thread_123\", {\n message: testMessage,\n availableComponents: expect.any(Array),\n tools: expect.any(Array),\n userKey: undefined,\n previousRunId: \"run_456\",\n });\n expect(result.stream).toBe(mockStream);\n expect(result.initialThreadId).toBe(\"thread_123\");\n });\n\n it(\"calls client.threads.runs.create when threadId is not provided\", async () => {\n mockThreadsRunsApi.create.mockResolvedValue(mockStream);\n\n const result = await createRunStream({\n client: mockClient,\n threadId: undefined,\n message: testMessage,\n registry: mockRegistry as any,\n userKey: undefined,\n previousRunId: undefined,\n });\n\n expect(mockThreadsRunsApi.create).toHaveBeenCalledWith({\n message: testMessage,\n availableComponents: expect.any(Array),\n tools: expect.any(Array),\n thread: undefined,\n });\n expect(mockThreadsRunsApi.run).not.toHaveBeenCalled();\n expect(result.stream).toBe(mockStream);\n expect(result.initialThreadId).toBeUndefined();\n });\n\n it(\"converts registry components to availableComponents format\", async () => {\n mockThreadsRunsApi.run.mockResolvedValue(mockStream);\n\n await createRunStream({\n client: mockClient,\n threadId: \"thread_123\",\n message: testMessage,\n registry: mockRegistry as any,\n userKey: undefined,\n previousRunId: undefined,\n });\n\n const callArgs = mockThreadsRunsApi.run.mock.calls[0][1];\n expect(callArgs.availableComponents).toEqual([\n {\n name: \"TestComponent\",\n description: \"A test component\",\n propsSchema: expect.any(Object),\n },\n ]);\n });\n\n it(\"converts registry tools to tools format\", async () => {\n mockThreadsRunsApi.run.mockResolvedValue(mockStream);\n\n await createRunStream({\n client: mockClient,\n threadId: \"thread_123\",\n message: testMessage,\n registry: mockRegistry as any,\n userKey: undefined,\n previousRunId: undefined,\n });\n\n const callArgs = mockThreadsRunsApi.run.mock.calls[0][1];\n expect(callArgs.tools).toEqual([\n expect.objectContaining({\n name: \"testTool\",\n description: \"A test tool\",\n }),\n ]);\n });\n\n it(\"handles empty registry\", async () => {\n mockThreadsRunsApi.run.mockResolvedValue(mockStream);\n\n const emptyRegistry = {\n componentList: new Map(),\n toolRegistry: new Map(),\n };\n\n await createRunStream({\n client: mockClient,\n threadId: \"thread_123\",\n message: testMessage,\n registry: emptyRegistry as any,\n userKey: undefined,\n previousRunId: undefined,\n });\n\n const callArgs = mockThreadsRunsApi.run.mock.calls[0][1];\n expect(callArgs.availableComponents).toEqual([]);\n expect(callArgs.tools).toEqual([]);\n });\n});\n\ndescribe(\"useTamboV1SendMessage mutation\", () => {\n const mockThreadsRunsApi = {\n run: jest.fn(),\n create: jest.fn(),\n };\n\n const mockTamboAI = {\n apiKey: \"\",\n threads: {\n runs: mockThreadsRunsApi,\n },\n } as unknown as TamboAI;\n\n let queryClient: QueryClient;\n\n function createAsyncIterator<T>(events: T[]) {\n return {\n [Symbol.asyncIterator]: async function* () {\n for (const event of events) {\n yield event;\n }\n },\n };\n }\n\n beforeEach(() => {\n queryClient = new QueryClient({\n defaultOptions: {\n queries: { retry: false },\n mutations: { retry: false },\n },\n });\n jest.mocked(useTamboClient).mockReturnValue(mockTamboAI);\n jest.mocked(useTamboQueryClient).mockReturnValue(queryClient);\n jest.mocked(useTamboV1Config).mockReturnValue({ userKey: undefined });\n mockThreadsRunsApi.run.mockReset();\n mockThreadsRunsApi.create.mockReset();\n });\n\n it(\"extracts threadId from RUN_STARTED event when creating new thread\", async () => {\n const mockStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId: \"new_thread_123\",\n },\n { type: EventType.RUN_FINISHED },\n ]);\n\n mockThreadsRunsApi.create.mockResolvedValue(mockStream);\n\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: new Map(),\n };\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n const { result } = renderHook(() => useTamboV1SendMessage(), {\n wrapper: TestWrapper,\n });\n\n let mutationResult: { threadId: string | undefined } | undefined;\n await act(async () => {\n mutationResult = await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Hello\" }],\n },\n });\n });\n\n expect(mutationResult?.threadId).toBe(\"new_thread_123\");\n });\n\n it(\"throws error when first event is not RUN_STARTED on new thread\", async () => {\n const mockStream = createAsyncIterator([\n { type: EventType.TEXT_MESSAGE_START, messageId: \"msg_1\" },\n ]);\n\n mockThreadsRunsApi.create.mockResolvedValue(mockStream);\n\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: new Map(),\n };\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n const { result } = renderHook(() => useTamboV1SendMessage(), {\n wrapper: TestWrapper,\n });\n\n await expect(\n act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Hello\" }],\n },\n });\n }),\n ).rejects.toThrow(\"Expected first event to be RUN_STARTED with threadId\");\n });\n\n it(\"executes tools on awaiting_input event\", async () => {\n const toolExecuted = jest.fn().mockResolvedValue(\"tool result\");\n\n const testTool: TamboTool = {\n name: \"test_tool\",\n description: \"A test tool\",\n tool: toolExecuted,\n inputSchema: z.object({ query: z.string() }),\n outputSchema: z.string(),\n };\n\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: new Map([[\"test_tool\", testTool]]),\n };\n\n const initialStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId: \"thread_123\",\n },\n {\n type: EventType.TEXT_MESSAGE_START,\n messageId: \"msg_1\",\n role: \"assistant\",\n },\n {\n type: EventType.TOOL_CALL_START,\n toolCallId: \"call_1\",\n toolCallName: \"test_tool\",\n parentMessageId: \"msg_1\",\n },\n {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: '{\"query\":\"test\"}',\n },\n {\n type: EventType.TOOL_CALL_END,\n toolCallId: \"call_1\",\n },\n {\n type: EventType.CUSTOM,\n name: \"tambo.run.awaiting_input\",\n value: {\n pendingToolCalls: [\n { toolCallId: \"call_1\", toolName: \"test\", arguments: \"{}\" },\n ],\n },\n },\n ]);\n\n const continueStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_2\",\n threadId: \"thread_123\",\n },\n { type: EventType.RUN_FINISHED },\n ]);\n\n mockThreadsRunsApi.run\n .mockResolvedValueOnce(initialStream)\n .mockResolvedValueOnce(continueStream);\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n await act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Hello\" }],\n },\n });\n });\n\n expect(toolExecuted).toHaveBeenCalledWith({ query: \"test\" });\n\n // Verify continuation was called with tool results\n expect(mockThreadsRunsApi.run).toHaveBeenCalledTimes(2);\n const continueCall = mockThreadsRunsApi.run.mock.calls[1];\n expect(continueCall[0]).toBe(\"thread_123\");\n expect(continueCall[1].previousRunId).toBe(\"run_1\");\n expect(continueCall[1].message.content[0]).toEqual({\n type: \"tool_result\",\n toolUseId: \"call_1\",\n content: [{ type: \"text\", text: \"tool result\" }],\n });\n });\n\n it(\"handles tool calls with chunked args\", async () => {\n const toolExecuted = jest.fn().mockResolvedValue({ result: 42 });\n\n const testTool: TamboTool = {\n name: \"chunked_tool\",\n description: \"Tool with chunked args\",\n tool: toolExecuted,\n inputSchema: z.object({ a: z.number(), b: z.number() }),\n outputSchema: z.object({ result: z.number() }),\n };\n\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: new Map([[\"chunked_tool\", testTool]]),\n };\n\n const initialStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId: \"thread_123\",\n },\n {\n type: EventType.TEXT_MESSAGE_START,\n messageId: \"msg_1\",\n role: \"assistant\",\n },\n {\n type: EventType.TOOL_CALL_START,\n toolCallId: \"call_1\",\n toolCallName: \"chunked_tool\",\n parentMessageId: \"msg_1\",\n },\n {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: '{\"a\":',\n },\n {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: \"10,\",\n },\n {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: '\"b\":20}',\n },\n {\n type: EventType.TOOL_CALL_END,\n toolCallId: \"call_1\",\n },\n {\n type: EventType.CUSTOM,\n name: \"tambo.run.awaiting_input\",\n value: {\n pendingToolCalls: [\n { toolCallId: \"call_1\", toolName: \"test\", arguments: \"{}\" },\n ],\n },\n },\n ]);\n\n const continueStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_2\",\n threadId: \"thread_123\",\n },\n { type: EventType.RUN_FINISHED },\n ]);\n\n mockThreadsRunsApi.run\n .mockResolvedValueOnce(initialStream)\n .mockResolvedValueOnce(continueStream);\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n await act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Calculate\" }],\n },\n });\n });\n\n expect(toolExecuted).toHaveBeenCalledWith({ a: 10, b: 20 });\n });\n\n it(\"handles missing TOOL_CALL_ARGS gracefully\", async () => {\n // Test that tools can be executed even when no args events are received\n // (the hook keeps input as empty object)\n const toolExecuted = jest.fn().mockResolvedValue(\"result\");\n\n const testTool: TamboTool = {\n name: \"test_tool\",\n description: \"Test tool\",\n tool: toolExecuted,\n inputSchema: z.object({}),\n outputSchema: z.string(),\n };\n\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: new Map([[\"test_tool\", testTool]]),\n };\n\n const initialStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId: \"thread_123\",\n },\n {\n type: EventType.TEXT_MESSAGE_START,\n messageId: \"msg_1\",\n role: \"assistant\",\n },\n {\n type: EventType.TOOL_CALL_START,\n toolCallId: \"call_1\",\n toolCallName: \"test_tool\",\n parentMessageId: \"msg_1\",\n },\n // No TOOL_CALL_ARGS events - args will be empty\n {\n type: EventType.TOOL_CALL_END,\n toolCallId: \"call_1\",\n },\n {\n type: EventType.CUSTOM,\n name: \"tambo.run.awaiting_input\",\n value: {\n pendingToolCalls: [\n { toolCallId: \"call_1\", toolName: \"test\", arguments: \"{}\" },\n ],\n },\n },\n ]);\n\n const continueStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_2\",\n threadId: \"thread_123\",\n },\n { type: EventType.RUN_FINISHED },\n ]);\n\n mockThreadsRunsApi.run\n .mockResolvedValueOnce(initialStream)\n .mockResolvedValueOnce(continueStream);\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n await act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Test\" }],\n },\n });\n });\n\n // Tool should be called with empty input due to no args events\n expect(toolExecuted).toHaveBeenCalledWith({});\n });\n\n it(\"handles unknown tool in awaiting_input by returning error result\", async () => {\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: new Map(), // Empty registry - tool not found\n };\n\n const initialStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId: \"thread_123\",\n },\n {\n type: EventType.TEXT_MESSAGE_START,\n messageId: \"msg_1\",\n role: \"assistant\",\n },\n {\n type: EventType.TOOL_CALL_START,\n toolCallId: \"call_1\",\n toolCallName: \"unknown_tool\",\n parentMessageId: \"msg_1\",\n },\n {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: \"{}\",\n },\n {\n type: EventType.TOOL_CALL_END,\n toolCallId: \"call_1\",\n },\n {\n type: EventType.CUSTOM,\n name: \"tambo.run.awaiting_input\",\n value: {\n pendingToolCalls: [\n { toolCallId: \"call_1\", toolName: \"test\", arguments: \"{}\" },\n ],\n },\n },\n ]);\n\n const continueStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_2\",\n threadId: \"thread_123\",\n },\n { type: EventType.RUN_FINISHED },\n ]);\n\n mockThreadsRunsApi.run\n .mockResolvedValueOnce(initialStream)\n .mockResolvedValueOnce(continueStream);\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n await act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Test\" }],\n },\n });\n });\n\n // Verify continuation was called (second call)\n expect(mockThreadsRunsApi.run).toHaveBeenCalledTimes(2);\n\n // Continuation should include error message for unknown tool\n const continueCall = mockThreadsRunsApi.run.mock.calls[1];\n expect(continueCall[1].message.content[0]).toEqual({\n type: \"tool_result\",\n toolUseId: \"call_1\",\n isError: true,\n content: [\n { type: \"text\", text: 'Tool \"unknown_tool\" not found in registry' },\n ],\n });\n });\n\n it(\"works with default registry context when no provider is present\", () => {\n // TamboRegistryContext has a default value, so the hook should work\n // (though with an empty registry)\n function TestWrapperWithoutRegistry({\n children,\n }: {\n children: React.ReactNode;\n }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n </QueryClientProvider>\n );\n }\n\n // Should not throw - default context is used\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapperWithoutRegistry,\n });\n\n expect(result.current.mutate).toBeDefined();\n });\n\n it(\"invalidates queries on successful mutation\", async () => {\n const mockStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId: \"thread_123\",\n },\n { type: EventType.RUN_FINISHED },\n ]);\n\n mockThreadsRunsApi.run.mockResolvedValue(mockStream);\n\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: new Map(),\n };\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n const invalidateQueriesSpy = jest.spyOn(queryClient, \"invalidateQueries\");\n\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n await act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Hello\" }],\n },\n });\n });\n\n await waitFor(() => {\n expect(invalidateQueriesSpy).toHaveBeenCalledWith({\n queryKey: [\"v1-threads\", \"thread_123\"],\n });\n });\n });\n\n it(\"handles multi-round tool execution (tool→AI→tool→AI)\", async () => {\n const tool1Executed = jest.fn().mockResolvedValue(\"result from tool 1\");\n const tool2Executed = jest.fn().mockResolvedValue(\"result from tool 2\");\n\n const tool1: TamboTool = {\n name: \"tool_1\",\n description: \"First tool\",\n tool: tool1Executed,\n inputSchema: z.object({ input: z.string() }),\n outputSchema: z.string(),\n };\n\n const tool2: TamboTool = {\n name: \"tool_2\",\n description: \"Second tool\",\n tool: tool2Executed,\n inputSchema: z.object({ input: z.string() }),\n outputSchema: z.string(),\n };\n\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: new Map([\n [\"tool_1\", tool1],\n [\"tool_2\", tool2],\n ]),\n };\n\n // Initial stream: AI calls tool_1\n const initialStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId: \"thread_123\",\n },\n {\n type: EventType.TEXT_MESSAGE_START,\n messageId: \"msg_1\",\n role: \"assistant\",\n },\n {\n type: EventType.TOOL_CALL_START,\n toolCallId: \"call_1\",\n toolCallName: \"tool_1\",\n parentMessageId: \"msg_1\",\n },\n {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: '{\"input\":\"first\"}',\n },\n { type: EventType.TOOL_CALL_END, toolCallId: \"call_1\" },\n {\n type: EventType.CUSTOM,\n name: \"tambo.run.awaiting_input\",\n value: {\n pendingToolCalls: [\n { toolCallId: \"call_1\", toolName: \"test\", arguments: \"{}\" },\n ],\n },\n },\n ]);\n\n // Second stream: AI receives tool_1 result, then calls tool_2\n const secondStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_2\",\n threadId: \"thread_123\",\n },\n {\n type: EventType.TEXT_MESSAGE_START,\n messageId: \"msg_2\",\n role: \"assistant\",\n },\n {\n type: EventType.TOOL_CALL_START,\n toolCallId: \"call_2\",\n toolCallName: \"tool_2\",\n parentMessageId: \"msg_2\",\n },\n {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_2\",\n delta: '{\"input\":\"second\"}',\n },\n { type: EventType.TOOL_CALL_END, toolCallId: \"call_2\" },\n {\n type: EventType.CUSTOM,\n name: \"tambo.run.awaiting_input\",\n value: {\n pendingToolCalls: [\n { toolCallId: \"call_2\", toolName: \"test\", arguments: \"{}\" },\n ],\n },\n },\n ]);\n\n // Third stream: AI receives tool_2 result, finishes\n const thirdStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_3\",\n threadId: \"thread_123\",\n },\n { type: EventType.RUN_FINISHED },\n ]);\n\n mockThreadsRunsApi.run\n .mockResolvedValueOnce(initialStream)\n .mockResolvedValueOnce(secondStream)\n .mockResolvedValueOnce(thirdStream);\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n await act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Hello\" }],\n },\n });\n });\n\n // Both tools should have been executed\n expect(tool1Executed).toHaveBeenCalledWith({ input: \"first\" });\n expect(tool2Executed).toHaveBeenCalledWith({ input: \"second\" });\n\n // Should have made 3 API calls (initial + 2 continuations)\n expect(mockThreadsRunsApi.run).toHaveBeenCalledTimes(3);\n\n // First continuation should have tool_1 result with previousRunId: run_1\n const firstContinue = mockThreadsRunsApi.run.mock.calls[1];\n expect(firstContinue[1].previousRunId).toBe(\"run_1\");\n expect(firstContinue[1].message.content[0]).toEqual({\n type: \"tool_result\",\n toolUseId: \"call_1\",\n content: [{ type: \"text\", text: \"result from tool 1\" }],\n });\n\n // Second continuation should have tool_2 result with previousRunId: run_2\n const secondContinue = mockThreadsRunsApi.run.mock.calls[2];\n expect(secondContinue[1].previousRunId).toBe(\"run_2\");\n expect(secondContinue[1].message.content[0]).toEqual({\n type: \"tool_result\",\n toolUseId: \"call_2\",\n content: [{ type: \"text\", text: \"result from tool 2\" }],\n });\n });\n\n it(\"logs error on mutation failure\", async () => {\n const consoleSpy = jest\n .spyOn(console, \"error\")\n .mockImplementation(() => {});\n const testError = new Error(\"API Error\");\n mockThreadsRunsApi.run.mockRejectedValue(testError);\n\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: new Map(),\n };\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n try {\n await act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Hello\" }],\n },\n });\n });\n } catch {\n // Expected to throw\n }\n\n await waitFor(() => {\n expect(consoleSpy).toHaveBeenCalledWith(\n \"[useTamboV1SendMessage] Mutation failed:\",\n testError,\n );\n });\n\n consoleSpy.mockRestore();\n });\n});\n\ndescribe(\"useTamboV1SendMessage auto thread name generation\", () => {\n const mockGenerateName = jest.fn();\n const mockThreadsRunsApi = {\n run: jest.fn(),\n create: jest.fn(),\n };\n\n const mockTamboAI = {\n apiKey: \"\",\n threads: {\n runs: mockThreadsRunsApi,\n },\n beta: {\n threads: {\n generateName: mockGenerateName,\n },\n },\n } as unknown as TamboAI;\n\n let queryClient: QueryClient;\n\n function createAsyncIterator<T>(events: T[]) {\n return {\n [Symbol.asyncIterator]: async function* () {\n for (const event of events) {\n yield event;\n }\n },\n };\n }\n\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: new Map(),\n };\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n function createFinishedStream(threadId: string) {\n return createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId,\n },\n {\n type: EventType.TEXT_MESSAGE_START,\n messageId: \"msg_assistant_1\",\n role: \"assistant\",\n },\n {\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: \"msg_assistant_1\",\n delta: \"Hello!\",\n },\n {\n type: EventType.TEXT_MESSAGE_END,\n messageId: \"msg_assistant_1\",\n },\n { type: EventType.RUN_FINISHED },\n ]);\n }\n\n beforeEach(() => {\n queryClient = new QueryClient({\n defaultOptions: {\n queries: { retry: false },\n mutations: { retry: false },\n },\n });\n jest.mocked(useTamboClient).mockReturnValue(mockTamboAI);\n jest.mocked(useTamboQueryClient).mockReturnValue(queryClient);\n mockThreadsRunsApi.run.mockReset();\n mockThreadsRunsApi.create.mockReset();\n mockGenerateName.mockReset();\n });\n\n it(\"calls generateName when message count reaches threshold\", async () => {\n // Threshold=2. Pre-mutation=0, 0 + 2 = 2 >= 2 → fire\n jest.mocked(useTamboV1Config).mockReturnValue({\n userKey: undefined,\n autoGenerateThreadName: true,\n autoGenerateNameThreshold: 2,\n });\n\n mockGenerateName.mockResolvedValue({ name: \"Generated Thread Name\" });\n mockThreadsRunsApi.run.mockResolvedValue(\n createFinishedStream(\"thread_123\"),\n );\n\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n await act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Hello\" }],\n },\n });\n });\n\n await waitFor(() => {\n expect(mockGenerateName).toHaveBeenCalledWith(\"thread_123\");\n });\n });\n\n it(\"does not call generateName when autoGenerateThreadName is false\", async () => {\n jest.mocked(useTamboV1Config).mockReturnValue({\n userKey: undefined,\n autoGenerateThreadName: false,\n autoGenerateNameThreshold: 3,\n });\n\n mockThreadsRunsApi.run.mockResolvedValue(\n createFinishedStream(\"thread_123\"),\n );\n\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n await act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Hello\" }],\n },\n });\n });\n\n // mutateAsync resolves after onSuccess, so all async work has settled\n expect(mockGenerateName).not.toHaveBeenCalled();\n });\n\n it(\"does not call generateName when message count is below threshold\", async () => {\n // With threshold=3, preMutation=0 messages, 0 + 2 = 2 < 3 → skip\n jest.mocked(useTamboV1Config).mockReturnValue({\n userKey: undefined,\n autoGenerateThreadName: true,\n autoGenerateNameThreshold: 3,\n });\n\n mockThreadsRunsApi.create.mockResolvedValue(\n createFinishedStream(\"new_thread\"),\n );\n\n const { result } = renderHook(() => useTamboV1SendMessage(), {\n wrapper: TestWrapper,\n });\n\n await act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Hello\" }],\n },\n });\n });\n\n expect(mockGenerateName).not.toHaveBeenCalled();\n });\n\n it(\"logs error when generateName fails (does not throw)\", async () => {\n // Threshold=2. Pre-mutation=0, 0 + 2 = 2 >= 2 → fire\n jest.mocked(useTamboV1Config).mockReturnValue({\n userKey: undefined,\n autoGenerateThreadName: true,\n autoGenerateNameThreshold: 2,\n });\n\n const consoleSpy = jest\n .spyOn(console, \"error\")\n .mockImplementation(() => {});\n mockGenerateName.mockRejectedValue(new Error(\"API error\"));\n mockThreadsRunsApi.run.mockResolvedValue(\n createFinishedStream(\"thread_123\"),\n );\n\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n await act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Hello\" }],\n },\n });\n });\n\n await waitFor(() => {\n expect(consoleSpy).toHaveBeenCalledWith(\n \"[useTamboV1SendMessage] Failed to auto-generate thread name:\",\n expect.any(Error),\n );\n });\n\n consoleSpy.mockRestore();\n });\n\n it(\"uses default config values (enabled, threshold=3)\", async () => {\n // Don't set autoGenerateThreadName/autoGenerateNameThreshold — defaults apply\n jest.mocked(useTamboV1Config).mockReturnValue({\n userKey: undefined,\n });\n\n mockGenerateName.mockResolvedValue({ name: \"Auto Name\" });\n mockThreadsRunsApi.run.mockResolvedValue(\n createFinishedStream(\"thread_123\"),\n );\n\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n await act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Hello\" }],\n },\n });\n });\n\n // Default threshold=3, preMutation=0 messages, 0 + 2 = 2 < 3 → should NOT fire\n expect(mockGenerateName).not.toHaveBeenCalled();\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"use-tambo-v1-send-message.test.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-send-message.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import { EventType } from \"@ag-ui/core\";\nimport TamboAI from \"@tambo-ai/typescript-sdk\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { renderHook, waitFor, act } from \"@testing-library/react\";\nimport React from \"react\";\nimport { z } from \"zod\";\nimport type { TamboTool } from \"../../model/component-metadata\";\nimport {\n useTamboClient,\n useTamboQueryClient,\n} from \"../../providers/tambo-client-provider\";\nimport { TamboRegistryContext } from \"../../providers/tambo-registry-provider\";\nimport { useTamboV1Config } from \"../providers/tambo-v1-provider\";\nimport { TamboV1StreamProvider } from \"../providers/tambo-v1-stream-context\";\nimport {\n createRunStream,\n useTamboV1SendMessage,\n} from \"./use-tambo-v1-send-message\";\n\njest.mock(\"../../providers/tambo-client-provider\", () => ({\n useTamboClient: jest.fn(),\n useTamboQueryClient: jest.fn(),\n}));\n\njest.mock(\"../providers/tambo-v1-provider\", () => ({\n useTamboV1Config: jest.fn(),\n}));\n\njest.mock(\"./use-tambo-v1-auth-state\", () => ({\n useTamboV1AuthState: () => ({\n status: \"identified\",\n source: \"userKey\",\n }),\n}));\n\njest.mock(\"../../providers/tambo-context-helpers-provider\", () => ({\n useTamboContextHelpers: () => ({\n getAdditionalContext: jest.fn().mockResolvedValue([]),\n }),\n}));\n\ndescribe(\"useTamboV1SendMessage\", () => {\n const mockThreadsRunsApi = {\n run: jest.fn(),\n create: jest.fn(),\n };\n\n const mockTamboAI = {\n apiKey: \"\",\n threads: {\n runs: mockThreadsRunsApi,\n },\n } as unknown as TamboAI;\n\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: new Map(),\n };\n\n let queryClient: QueryClient;\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n beforeEach(() => {\n queryClient = new QueryClient({\n defaultOptions: {\n queries: { retry: false },\n mutations: { retry: false },\n },\n });\n jest.mocked(useTamboClient).mockReturnValue(mockTamboAI);\n jest.mocked(useTamboQueryClient).mockReturnValue(queryClient);\n jest.mocked(useTamboV1Config).mockReturnValue({ userKey: undefined });\n mockThreadsRunsApi.run.mockReset();\n mockThreadsRunsApi.create.mockReset();\n });\n\n it(\"returns a mutation object\", () => {\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n expect(result.current.mutate).toBeDefined();\n expect(result.current.mutateAsync).toBeDefined();\n expect(result.current.isPending).toBe(false);\n });\n\n it(\"returns a mutation object when threadId is not provided\", () => {\n const { result } = renderHook(() => useTamboV1SendMessage(), {\n wrapper: TestWrapper,\n });\n\n expect(result.current.mutate).toBeDefined();\n expect(result.current.mutateAsync).toBeDefined();\n });\n});\n\ndescribe(\"createRunStream\", () => {\n const mockStream = {\n [Symbol.asyncIterator]: async function* () {\n yield { type: \"RUN_STARTED\", runId: \"run_1\", threadId: \"thread_123\" };\n },\n };\n\n const mockThreadsRunsApi = {\n run: jest.fn(),\n create: jest.fn(),\n };\n\n const mockClient = {\n threads: {\n runs: mockThreadsRunsApi,\n },\n } as unknown as TamboAI;\n\n const mockRegistry = {\n componentList: new Map([\n [\n \"TestComponent\",\n {\n name: \"TestComponent\",\n description: \"A test component\",\n component: () => null,\n // RegisteredComponent has props as JSON Schema (already converted from propsSchema)\n props: {\n type: \"object\",\n properties: { title: { type: \"string\" } },\n required: [\"title\"],\n },\n contextTools: [],\n },\n ],\n ]),\n toolRegistry: new Map([\n [\n \"testTool\",\n {\n name: \"testTool\",\n description: \"A test tool\",\n tool: async () => \"result\",\n inputSchema: z.object({ query: z.string() }),\n },\n ],\n ]),\n };\n\n const testMessage = {\n role: \"user\" as const,\n content: [{ type: \"text\" as const, text: \"Hello\" }],\n };\n\n beforeEach(() => {\n mockThreadsRunsApi.run.mockReset();\n mockThreadsRunsApi.create.mockReset();\n });\n\n it(\"calls client.threads.runs.run when threadId is provided\", async () => {\n mockThreadsRunsApi.run.mockResolvedValue(mockStream);\n\n const result = await createRunStream({\n client: mockClient,\n threadId: \"thread_123\",\n message: testMessage,\n registry: mockRegistry as any,\n userKey: undefined,\n previousRunId: undefined,\n });\n\n expect(mockThreadsRunsApi.run).toHaveBeenCalledWith(\"thread_123\", {\n message: testMessage,\n availableComponents: expect.any(Array),\n tools: expect.any(Array),\n userKey: undefined,\n previousRunId: undefined,\n });\n expect(mockThreadsRunsApi.create).not.toHaveBeenCalled();\n expect(result.stream).toBe(mockStream);\n expect(result.initialThreadId).toBe(\"thread_123\");\n });\n\n it(\"calls client.threads.runs.run with previousRunId when provided\", async () => {\n mockThreadsRunsApi.run.mockResolvedValue(mockStream);\n\n const result = await createRunStream({\n client: mockClient,\n threadId: \"thread_123\",\n message: testMessage,\n registry: mockRegistry as any,\n userKey: undefined,\n previousRunId: \"run_456\",\n });\n\n expect(mockThreadsRunsApi.run).toHaveBeenCalledWith(\"thread_123\", {\n message: testMessage,\n availableComponents: expect.any(Array),\n tools: expect.any(Array),\n userKey: undefined,\n previousRunId: \"run_456\",\n });\n expect(result.stream).toBe(mockStream);\n expect(result.initialThreadId).toBe(\"thread_123\");\n });\n\n it(\"calls client.threads.runs.create when threadId is not provided\", async () => {\n mockThreadsRunsApi.create.mockResolvedValue(mockStream);\n\n const result = await createRunStream({\n client: mockClient,\n threadId: undefined,\n message: testMessage,\n registry: mockRegistry as any,\n userKey: undefined,\n previousRunId: undefined,\n });\n\n expect(mockThreadsRunsApi.create).toHaveBeenCalledWith({\n message: testMessage,\n availableComponents: expect.any(Array),\n tools: expect.any(Array),\n thread: undefined,\n });\n expect(mockThreadsRunsApi.run).not.toHaveBeenCalled();\n expect(result.stream).toBe(mockStream);\n expect(result.initialThreadId).toBeUndefined();\n });\n\n it(\"converts registry components to availableComponents format\", async () => {\n mockThreadsRunsApi.run.mockResolvedValue(mockStream);\n\n await createRunStream({\n client: mockClient,\n threadId: \"thread_123\",\n message: testMessage,\n registry: mockRegistry as any,\n userKey: undefined,\n previousRunId: undefined,\n });\n\n const callArgs = mockThreadsRunsApi.run.mock.calls[0][1];\n expect(callArgs.availableComponents).toEqual([\n {\n name: \"TestComponent\",\n description: \"A test component\",\n propsSchema: expect.any(Object),\n },\n ]);\n });\n\n it(\"converts registry tools to tools format\", async () => {\n mockThreadsRunsApi.run.mockResolvedValue(mockStream);\n\n await createRunStream({\n client: mockClient,\n threadId: \"thread_123\",\n message: testMessage,\n registry: mockRegistry as any,\n userKey: undefined,\n previousRunId: undefined,\n });\n\n const callArgs = mockThreadsRunsApi.run.mock.calls[0][1];\n expect(callArgs.tools).toEqual([\n expect.objectContaining({\n name: \"testTool\",\n description: \"A test tool\",\n }),\n ]);\n });\n\n it(\"handles empty registry\", async () => {\n mockThreadsRunsApi.run.mockResolvedValue(mockStream);\n\n const emptyRegistry = {\n componentList: new Map(),\n toolRegistry: new Map(),\n };\n\n await createRunStream({\n client: mockClient,\n threadId: \"thread_123\",\n message: testMessage,\n registry: emptyRegistry as any,\n userKey: undefined,\n previousRunId: undefined,\n });\n\n const callArgs = mockThreadsRunsApi.run.mock.calls[0][1];\n expect(callArgs.availableComponents).toEqual([]);\n expect(callArgs.tools).toEqual([]);\n });\n});\n\ndescribe(\"useTamboV1SendMessage mutation\", () => {\n const mockThreadsRunsApi = {\n run: jest.fn(),\n create: jest.fn(),\n };\n\n const mockTamboAI = {\n apiKey: \"\",\n threads: {\n runs: mockThreadsRunsApi,\n },\n } as unknown as TamboAI;\n\n let queryClient: QueryClient;\n\n function createAsyncIterator<T>(events: T[]) {\n return {\n [Symbol.asyncIterator]: async function* () {\n for (const event of events) {\n yield event;\n }\n },\n };\n }\n\n beforeEach(() => {\n queryClient = new QueryClient({\n defaultOptions: {\n queries: { retry: false },\n mutations: { retry: false },\n },\n });\n jest.mocked(useTamboClient).mockReturnValue(mockTamboAI);\n jest.mocked(useTamboQueryClient).mockReturnValue(queryClient);\n jest.mocked(useTamboV1Config).mockReturnValue({ userKey: undefined });\n mockThreadsRunsApi.run.mockReset();\n mockThreadsRunsApi.create.mockReset();\n });\n\n it(\"extracts threadId from RUN_STARTED event when creating new thread\", async () => {\n const mockStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId: \"new_thread_123\",\n },\n { type: EventType.RUN_FINISHED },\n ]);\n\n mockThreadsRunsApi.create.mockResolvedValue(mockStream);\n\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: new Map(),\n };\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n const { result } = renderHook(() => useTamboV1SendMessage(), {\n wrapper: TestWrapper,\n });\n\n let mutationResult: { threadId: string | undefined } | undefined;\n await act(async () => {\n mutationResult = await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Hello\" }],\n },\n });\n });\n\n expect(mutationResult?.threadId).toBe(\"new_thread_123\");\n });\n\n it(\"throws error when first event is not RUN_STARTED on new thread\", async () => {\n const mockStream = createAsyncIterator([\n { type: EventType.TEXT_MESSAGE_START, messageId: \"msg_1\" },\n ]);\n\n mockThreadsRunsApi.create.mockResolvedValue(mockStream);\n\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: new Map(),\n };\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n const { result } = renderHook(() => useTamboV1SendMessage(), {\n wrapper: TestWrapper,\n });\n\n await expect(\n act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Hello\" }],\n },\n });\n }),\n ).rejects.toThrow(\"Expected first event to be RUN_STARTED with threadId\");\n });\n\n it(\"executes tools on awaiting_input event\", async () => {\n const toolExecuted = jest.fn().mockResolvedValue(\"tool result\");\n\n const testTool: TamboTool = {\n name: \"test_tool\",\n description: \"A test tool\",\n tool: toolExecuted,\n inputSchema: z.object({ query: z.string() }),\n outputSchema: z.string(),\n };\n\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: new Map([[\"test_tool\", testTool]]),\n };\n\n const initialStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId: \"thread_123\",\n },\n {\n type: EventType.TEXT_MESSAGE_START,\n messageId: \"msg_1\",\n role: \"assistant\",\n },\n {\n type: EventType.TOOL_CALL_START,\n toolCallId: \"call_1\",\n toolCallName: \"test_tool\",\n parentMessageId: \"msg_1\",\n },\n {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: '{\"query\":\"test\"}',\n },\n {\n type: EventType.TOOL_CALL_END,\n toolCallId: \"call_1\",\n },\n {\n type: EventType.CUSTOM,\n name: \"tambo.run.awaiting_input\",\n value: {\n pendingToolCalls: [\n { toolCallId: \"call_1\", toolName: \"test\", arguments: \"{}\" },\n ],\n },\n },\n ]);\n\n const continueStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_2\",\n threadId: \"thread_123\",\n },\n { type: EventType.RUN_FINISHED },\n ]);\n\n mockThreadsRunsApi.run\n .mockResolvedValueOnce(initialStream)\n .mockResolvedValueOnce(continueStream);\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n await act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Hello\" }],\n },\n });\n });\n\n expect(toolExecuted).toHaveBeenCalledWith({ query: \"test\" });\n\n // Verify continuation was called with tool results\n expect(mockThreadsRunsApi.run).toHaveBeenCalledTimes(2);\n const continueCall = mockThreadsRunsApi.run.mock.calls[1];\n expect(continueCall[0]).toBe(\"thread_123\");\n expect(continueCall[1].previousRunId).toBe(\"run_1\");\n expect(continueCall[1].message.content[0]).toEqual({\n type: \"tool_result\",\n toolUseId: \"call_1\",\n content: [{ type: \"text\", text: \"tool result\" }],\n });\n });\n\n it(\"handles tool calls with chunked args\", async () => {\n const toolExecuted = jest.fn().mockResolvedValue({ result: 42 });\n\n const testTool: TamboTool = {\n name: \"chunked_tool\",\n description: \"Tool with chunked args\",\n tool: toolExecuted,\n inputSchema: z.object({ a: z.number(), b: z.number() }),\n outputSchema: z.object({ result: z.number() }),\n };\n\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: new Map([[\"chunked_tool\", testTool]]),\n };\n\n const initialStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId: \"thread_123\",\n },\n {\n type: EventType.TEXT_MESSAGE_START,\n messageId: \"msg_1\",\n role: \"assistant\",\n },\n {\n type: EventType.TOOL_CALL_START,\n toolCallId: \"call_1\",\n toolCallName: \"chunked_tool\",\n parentMessageId: \"msg_1\",\n },\n {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: '{\"a\":',\n },\n {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: \"10,\",\n },\n {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: '\"b\":20}',\n },\n {\n type: EventType.TOOL_CALL_END,\n toolCallId: \"call_1\",\n },\n {\n type: EventType.CUSTOM,\n name: \"tambo.run.awaiting_input\",\n value: {\n pendingToolCalls: [\n { toolCallId: \"call_1\", toolName: \"test\", arguments: \"{}\" },\n ],\n },\n },\n ]);\n\n const continueStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_2\",\n threadId: \"thread_123\",\n },\n { type: EventType.RUN_FINISHED },\n ]);\n\n mockThreadsRunsApi.run\n .mockResolvedValueOnce(initialStream)\n .mockResolvedValueOnce(continueStream);\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n await act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Calculate\" }],\n },\n });\n });\n\n expect(toolExecuted).toHaveBeenCalledWith({ a: 10, b: 20 });\n });\n\n it(\"handles missing TOOL_CALL_ARGS gracefully\", async () => {\n // Test that tools can be executed even when no args events are received\n // (the hook keeps input as empty object)\n const toolExecuted = jest.fn().mockResolvedValue(\"result\");\n\n const testTool: TamboTool = {\n name: \"test_tool\",\n description: \"Test tool\",\n tool: toolExecuted,\n inputSchema: z.object({}),\n outputSchema: z.string(),\n };\n\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: new Map([[\"test_tool\", testTool]]),\n };\n\n const initialStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId: \"thread_123\",\n },\n {\n type: EventType.TEXT_MESSAGE_START,\n messageId: \"msg_1\",\n role: \"assistant\",\n },\n {\n type: EventType.TOOL_CALL_START,\n toolCallId: \"call_1\",\n toolCallName: \"test_tool\",\n parentMessageId: \"msg_1\",\n },\n // No TOOL_CALL_ARGS events - args will be empty\n {\n type: EventType.TOOL_CALL_END,\n toolCallId: \"call_1\",\n },\n {\n type: EventType.CUSTOM,\n name: \"tambo.run.awaiting_input\",\n value: {\n pendingToolCalls: [\n { toolCallId: \"call_1\", toolName: \"test\", arguments: \"{}\" },\n ],\n },\n },\n ]);\n\n const continueStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_2\",\n threadId: \"thread_123\",\n },\n { type: EventType.RUN_FINISHED },\n ]);\n\n mockThreadsRunsApi.run\n .mockResolvedValueOnce(initialStream)\n .mockResolvedValueOnce(continueStream);\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n await act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Test\" }],\n },\n });\n });\n\n // Tool should be called with empty input due to no args events\n expect(toolExecuted).toHaveBeenCalledWith({});\n });\n\n it(\"handles unknown tool in awaiting_input by returning error result\", async () => {\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: new Map(), // Empty registry - tool not found\n };\n\n const initialStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId: \"thread_123\",\n },\n {\n type: EventType.TEXT_MESSAGE_START,\n messageId: \"msg_1\",\n role: \"assistant\",\n },\n {\n type: EventType.TOOL_CALL_START,\n toolCallId: \"call_1\",\n toolCallName: \"unknown_tool\",\n parentMessageId: \"msg_1\",\n },\n {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: \"{}\",\n },\n {\n type: EventType.TOOL_CALL_END,\n toolCallId: \"call_1\",\n },\n {\n type: EventType.CUSTOM,\n name: \"tambo.run.awaiting_input\",\n value: {\n pendingToolCalls: [\n { toolCallId: \"call_1\", toolName: \"test\", arguments: \"{}\" },\n ],\n },\n },\n ]);\n\n const continueStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_2\",\n threadId: \"thread_123\",\n },\n { type: EventType.RUN_FINISHED },\n ]);\n\n mockThreadsRunsApi.run\n .mockResolvedValueOnce(initialStream)\n .mockResolvedValueOnce(continueStream);\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n await act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Test\" }],\n },\n });\n });\n\n // Verify continuation was called (second call)\n expect(mockThreadsRunsApi.run).toHaveBeenCalledTimes(2);\n\n // Continuation should include error message for unknown tool\n const continueCall = mockThreadsRunsApi.run.mock.calls[1];\n expect(continueCall[1].message.content[0]).toEqual({\n type: \"tool_result\",\n toolUseId: \"call_1\",\n isError: true,\n content: [\n { type: \"text\", text: 'Tool \"unknown_tool\" not found in registry' },\n ],\n });\n });\n\n it(\"works with default registry context when no provider is present\", () => {\n // TamboRegistryContext has a default value, so the hook should work\n // (though with an empty registry)\n function TestWrapperWithoutRegistry({\n children,\n }: {\n children: React.ReactNode;\n }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n </QueryClientProvider>\n );\n }\n\n // Should not throw - default context is used\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapperWithoutRegistry,\n });\n\n expect(result.current.mutate).toBeDefined();\n });\n\n it(\"invalidates queries on successful mutation\", async () => {\n const mockStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId: \"thread_123\",\n },\n { type: EventType.RUN_FINISHED },\n ]);\n\n mockThreadsRunsApi.run.mockResolvedValue(mockStream);\n\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: new Map(),\n };\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n const invalidateQueriesSpy = jest.spyOn(queryClient, \"invalidateQueries\");\n\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n await act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Hello\" }],\n },\n });\n });\n\n await waitFor(() => {\n expect(invalidateQueriesSpy).toHaveBeenCalledWith({\n queryKey: [\"v1-threads\", \"thread_123\"],\n });\n });\n });\n\n it(\"handles multi-round tool execution (tool→AI→tool→AI)\", async () => {\n const tool1Executed = jest.fn().mockResolvedValue(\"result from tool 1\");\n const tool2Executed = jest.fn().mockResolvedValue(\"result from tool 2\");\n\n const tool1: TamboTool = {\n name: \"tool_1\",\n description: \"First tool\",\n tool: tool1Executed,\n inputSchema: z.object({ input: z.string() }),\n outputSchema: z.string(),\n };\n\n const tool2: TamboTool = {\n name: \"tool_2\",\n description: \"Second tool\",\n tool: tool2Executed,\n inputSchema: z.object({ input: z.string() }),\n outputSchema: z.string(),\n };\n\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: new Map([\n [\"tool_1\", tool1],\n [\"tool_2\", tool2],\n ]),\n };\n\n // Initial stream: AI calls tool_1\n const initialStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId: \"thread_123\",\n },\n {\n type: EventType.TEXT_MESSAGE_START,\n messageId: \"msg_1\",\n role: \"assistant\",\n },\n {\n type: EventType.TOOL_CALL_START,\n toolCallId: \"call_1\",\n toolCallName: \"tool_1\",\n parentMessageId: \"msg_1\",\n },\n {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: '{\"input\":\"first\"}',\n },\n { type: EventType.TOOL_CALL_END, toolCallId: \"call_1\" },\n {\n type: EventType.CUSTOM,\n name: \"tambo.run.awaiting_input\",\n value: {\n pendingToolCalls: [\n { toolCallId: \"call_1\", toolName: \"test\", arguments: \"{}\" },\n ],\n },\n },\n ]);\n\n // Second stream: AI receives tool_1 result, then calls tool_2\n const secondStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_2\",\n threadId: \"thread_123\",\n },\n {\n type: EventType.TEXT_MESSAGE_START,\n messageId: \"msg_2\",\n role: \"assistant\",\n },\n {\n type: EventType.TOOL_CALL_START,\n toolCallId: \"call_2\",\n toolCallName: \"tool_2\",\n parentMessageId: \"msg_2\",\n },\n {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_2\",\n delta: '{\"input\":\"second\"}',\n },\n { type: EventType.TOOL_CALL_END, toolCallId: \"call_2\" },\n {\n type: EventType.CUSTOM,\n name: \"tambo.run.awaiting_input\",\n value: {\n pendingToolCalls: [\n { toolCallId: \"call_2\", toolName: \"test\", arguments: \"{}\" },\n ],\n },\n },\n ]);\n\n // Third stream: AI receives tool_2 result, finishes\n const thirdStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_3\",\n threadId: \"thread_123\",\n },\n { type: EventType.RUN_FINISHED },\n ]);\n\n mockThreadsRunsApi.run\n .mockResolvedValueOnce(initialStream)\n .mockResolvedValueOnce(secondStream)\n .mockResolvedValueOnce(thirdStream);\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n await act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Hello\" }],\n },\n });\n });\n\n // Both tools should have been executed\n expect(tool1Executed).toHaveBeenCalledWith({ input: \"first\" });\n expect(tool2Executed).toHaveBeenCalledWith({ input: \"second\" });\n\n // Should have made 3 API calls (initial + 2 continuations)\n expect(mockThreadsRunsApi.run).toHaveBeenCalledTimes(3);\n\n // First continuation should have tool_1 result with previousRunId: run_1\n const firstContinue = mockThreadsRunsApi.run.mock.calls[1];\n expect(firstContinue[1].previousRunId).toBe(\"run_1\");\n expect(firstContinue[1].message.content[0]).toEqual({\n type: \"tool_result\",\n toolUseId: \"call_1\",\n content: [{ type: \"text\", text: \"result from tool 1\" }],\n });\n\n // Second continuation should have tool_2 result with previousRunId: run_2\n const secondContinue = mockThreadsRunsApi.run.mock.calls[2];\n expect(secondContinue[1].previousRunId).toBe(\"run_2\");\n expect(secondContinue[1].message.content[0]).toEqual({\n type: \"tool_result\",\n toolUseId: \"call_2\",\n content: [{ type: \"text\", text: \"result from tool 2\" }],\n });\n });\n\n it(\"uses lastCompletedRunId as previousRunId when streaming.runId is absent\", async () => {\n const mockStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_2\",\n threadId: \"thread_123\",\n },\n { type: EventType.RUN_FINISHED },\n ]);\n\n mockThreadsRunsApi.run.mockResolvedValue(mockStream);\n\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: new Map(),\n };\n\n // Provide stream state with lastCompletedRunId but no active streaming.runId\n const stateWithLastRun: import(\"../utils/event-accumulator\").StreamState = {\n currentThreadId: \"thread_123\",\n threadMap: {\n thread_123: {\n thread: {\n id: \"thread_123\",\n messages: [\n {\n id: \"msg_1\",\n role: \"user\",\n content: [{ type: \"text\", text: \"Hello\" }],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ],\n status: \"idle\",\n createdAt: \"2024-01-01T00:00:00.000Z\",\n updatedAt: \"2024-01-01T00:00:00.000Z\",\n lastRunCancelled: false,\n },\n streaming: { status: \"idle\" },\n accumulatingToolArgs: new Map(),\n lastCompletedRunId: \"run_1\",\n },\n },\n };\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider\n state={stateWithLastRun}\n dispatch={jest.fn()}\n >\n {children}\n </TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n await act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Follow-up\" }],\n },\n });\n });\n\n // Should have used lastCompletedRunId as previousRunId\n expect(mockThreadsRunsApi.run).toHaveBeenCalledWith(\n \"thread_123\",\n expect.objectContaining({\n previousRunId: \"run_1\",\n }),\n );\n });\n\n it(\"logs error on mutation failure\", async () => {\n const consoleSpy = jest\n .spyOn(console, \"error\")\n .mockImplementation(() => {});\n const testError = new Error(\"API Error\");\n mockThreadsRunsApi.run.mockRejectedValue(testError);\n\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: new Map(),\n };\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n try {\n await act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Hello\" }],\n },\n });\n });\n } catch {\n // Expected to throw\n }\n\n await waitFor(() => {\n expect(consoleSpy).toHaveBeenCalledWith(\n \"[useTamboV1SendMessage] Mutation failed:\",\n testError,\n );\n });\n\n consoleSpy.mockRestore();\n });\n});\n\ndescribe(\"useTamboV1SendMessage auto thread name generation\", () => {\n const mockGenerateName = jest.fn();\n const mockThreadsRunsApi = {\n run: jest.fn(),\n create: jest.fn(),\n };\n\n const mockTamboAI = {\n apiKey: \"\",\n threads: {\n runs: mockThreadsRunsApi,\n },\n beta: {\n threads: {\n generateName: mockGenerateName,\n },\n },\n } as unknown as TamboAI;\n\n let queryClient: QueryClient;\n\n function createAsyncIterator<T>(events: T[]) {\n return {\n [Symbol.asyncIterator]: async function* () {\n for (const event of events) {\n yield event;\n }\n },\n };\n }\n\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: new Map(),\n };\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n function createFinishedStream(threadId: string) {\n return createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId,\n },\n {\n type: EventType.TEXT_MESSAGE_START,\n messageId: \"msg_assistant_1\",\n role: \"assistant\",\n },\n {\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: \"msg_assistant_1\",\n delta: \"Hello!\",\n },\n {\n type: EventType.TEXT_MESSAGE_END,\n messageId: \"msg_assistant_1\",\n },\n { type: EventType.RUN_FINISHED },\n ]);\n }\n\n beforeEach(() => {\n queryClient = new QueryClient({\n defaultOptions: {\n queries: { retry: false },\n mutations: { retry: false },\n },\n });\n jest.mocked(useTamboClient).mockReturnValue(mockTamboAI);\n jest.mocked(useTamboQueryClient).mockReturnValue(queryClient);\n mockThreadsRunsApi.run.mockReset();\n mockThreadsRunsApi.create.mockReset();\n mockGenerateName.mockReset();\n });\n\n it(\"calls generateName when message count reaches threshold\", async () => {\n // Threshold=2. Pre-mutation=0, 0 + 2 = 2 >= 2 → fire\n jest.mocked(useTamboV1Config).mockReturnValue({\n userKey: undefined,\n autoGenerateThreadName: true,\n autoGenerateNameThreshold: 2,\n });\n\n mockGenerateName.mockResolvedValue({ name: \"Generated Thread Name\" });\n mockThreadsRunsApi.run.mockResolvedValue(\n createFinishedStream(\"thread_123\"),\n );\n\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n await act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Hello\" }],\n },\n });\n });\n\n await waitFor(() => {\n expect(mockGenerateName).toHaveBeenCalledWith(\"thread_123\");\n });\n });\n\n it(\"does not call generateName when autoGenerateThreadName is false\", async () => {\n jest.mocked(useTamboV1Config).mockReturnValue({\n userKey: undefined,\n autoGenerateThreadName: false,\n autoGenerateNameThreshold: 3,\n });\n\n mockThreadsRunsApi.run.mockResolvedValue(\n createFinishedStream(\"thread_123\"),\n );\n\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n await act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Hello\" }],\n },\n });\n });\n\n // mutateAsync resolves after onSuccess, so all async work has settled\n expect(mockGenerateName).not.toHaveBeenCalled();\n });\n\n it(\"does not call generateName when message count is below threshold\", async () => {\n // With threshold=3, preMutation=0 messages, 0 + 2 = 2 < 3 → skip\n jest.mocked(useTamboV1Config).mockReturnValue({\n userKey: undefined,\n autoGenerateThreadName: true,\n autoGenerateNameThreshold: 3,\n });\n\n mockThreadsRunsApi.create.mockResolvedValue(\n createFinishedStream(\"new_thread\"),\n );\n\n const { result } = renderHook(() => useTamboV1SendMessage(), {\n wrapper: TestWrapper,\n });\n\n await act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Hello\" }],\n },\n });\n });\n\n expect(mockGenerateName).not.toHaveBeenCalled();\n });\n\n it(\"logs error when generateName fails (does not throw)\", async () => {\n // Threshold=2. Pre-mutation=0, 0 + 2 = 2 >= 2 → fire\n jest.mocked(useTamboV1Config).mockReturnValue({\n userKey: undefined,\n autoGenerateThreadName: true,\n autoGenerateNameThreshold: 2,\n });\n\n const consoleSpy = jest\n .spyOn(console, \"error\")\n .mockImplementation(() => {});\n mockGenerateName.mockRejectedValue(new Error(\"API error\"));\n mockThreadsRunsApi.run.mockResolvedValue(\n createFinishedStream(\"thread_123\"),\n );\n\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n await act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Hello\" }],\n },\n });\n });\n\n await waitFor(() => {\n expect(consoleSpy).toHaveBeenCalledWith(\n \"[useTamboV1SendMessage] Failed to auto-generate thread name:\",\n expect.any(Error),\n );\n });\n\n consoleSpy.mockRestore();\n });\n\n it(\"uses default config values (enabled, threshold=3)\", async () => {\n // Don't set autoGenerateThreadName/autoGenerateNameThreshold — defaults apply\n jest.mocked(useTamboV1Config).mockReturnValue({\n userKey: undefined,\n });\n\n mockGenerateName.mockResolvedValue({ name: \"Auto Name\" });\n mockThreadsRunsApi.run.mockResolvedValue(\n createFinishedStream(\"thread_123\"),\n );\n\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n await act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Hello\" }],\n },\n });\n });\n\n // Default threshold=3, preMutation=0 messages, 0 + 2 = 2 < 3 → should NOT fire\n expect(mockGenerateName).not.toHaveBeenCalled();\n });\n});\n\ndescribe(\"useTamboV1SendMessage tamboStreamableHint\", () => {\n const mockThreadsRunsApi = {\n run: jest.fn(),\n create: jest.fn(),\n };\n\n const mockTamboAI = {\n apiKey: \"\",\n threads: {\n runs: mockThreadsRunsApi,\n },\n } as unknown as TamboAI;\n\n let queryClient: QueryClient;\n\n function createAsyncIterator<T>(events: T[]) {\n return {\n [Symbol.asyncIterator]: async function* () {\n for (const event of events) {\n yield event;\n }\n },\n };\n }\n\n beforeEach(() => {\n queryClient = new QueryClient({\n defaultOptions: {\n queries: { retry: false },\n mutations: { retry: false },\n },\n });\n jest.mocked(useTamboClient).mockReturnValue(mockTamboAI);\n jest.mocked(useTamboQueryClient).mockReturnValue(queryClient);\n jest.mocked(useTamboV1Config).mockReturnValue({ userKey: undefined });\n mockThreadsRunsApi.run.mockReset();\n mockThreadsRunsApi.create.mockReset();\n });\n\n it(\"calls streamable tool on TOOL_CALL_ARGS events during streaming\", async () => {\n const streamableToolFn = jest.fn().mockResolvedValue(undefined);\n\n const streamableTool: TamboTool = {\n name: \"write_story\",\n description: \"Writes a story\",\n tool: streamableToolFn,\n inputSchema: z.object({ text: z.string() }),\n outputSchema: z.void(),\n annotations: { tamboStreamableHint: true },\n };\n\n // Use Record (not Map) for toolRegistry — matches real runtime type\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: { write_story: streamableTool } as Record<\n string,\n TamboTool\n >,\n };\n\n const initialStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId: \"thread_123\",\n },\n {\n type: EventType.TEXT_MESSAGE_START,\n messageId: \"msg_1\",\n role: \"assistant\",\n },\n {\n type: EventType.TOOL_CALL_START,\n toolCallId: \"call_1\",\n toolCallName: \"write_story\",\n parentMessageId: \"msg_1\",\n },\n {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: '{\"text\":\"Once upon',\n },\n {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: ' a time\"}',\n },\n {\n type: EventType.TOOL_CALL_END,\n toolCallId: \"call_1\",\n },\n {\n type: EventType.CUSTOM,\n name: \"tambo.run.awaiting_input\",\n value: {\n pendingToolCalls: [\n { toolCallId: \"call_1\", toolName: \"write_story\", arguments: \"{}\" },\n ],\n },\n },\n ]);\n\n const continueStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_2\",\n threadId: \"thread_123\",\n },\n { type: EventType.RUN_FINISHED },\n ]);\n\n mockThreadsRunsApi.run\n .mockResolvedValueOnce(initialStream)\n .mockResolvedValueOnce(continueStream);\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n await act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Write me a story\" }],\n },\n });\n });\n\n // Streamable tool should have been called during TOOL_CALL_ARGS events\n // (at least once per parseable chunk)\n expect(streamableToolFn.mock.calls.length).toBeGreaterThanOrEqual(1);\n\n // Each streaming call should have had partial args\n const firstStreamingCall = streamableToolFn.mock.calls[0][0] as Record<\n string,\n unknown\n >;\n expect(firstStreamingCall).toHaveProperty(\"text\");\n });\n\n it(\"does NOT call non-streamable tool during TOOL_CALL_ARGS events\", async () => {\n const normalToolFn = jest.fn().mockResolvedValue(\"result\");\n\n const normalTool: TamboTool = {\n name: \"normal_tool\",\n description: \"Normal tool (not streamable)\",\n tool: normalToolFn,\n inputSchema: z.object({ query: z.string() }),\n outputSchema: z.string(),\n // No tamboStreamableHint\n };\n\n const mockRegistry = {\n componentList: new Map(),\n toolRegistry: { normal_tool: normalTool } as Record<string, TamboTool>,\n };\n\n const initialStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId: \"thread_123\",\n },\n {\n type: EventType.TEXT_MESSAGE_START,\n messageId: \"msg_1\",\n role: \"assistant\",\n },\n {\n type: EventType.TOOL_CALL_START,\n toolCallId: \"call_1\",\n toolCallName: \"normal_tool\",\n parentMessageId: \"msg_1\",\n },\n {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"call_1\",\n delta: '{\"query\":\"test\"}',\n },\n {\n type: EventType.TOOL_CALL_END,\n toolCallId: \"call_1\",\n },\n {\n type: EventType.CUSTOM,\n name: \"tambo.run.awaiting_input\",\n value: {\n pendingToolCalls: [\n { toolCallId: \"call_1\", toolName: \"normal_tool\", arguments: \"{}\" },\n ],\n },\n },\n ]);\n\n const continueStream = createAsyncIterator([\n {\n type: EventType.RUN_STARTED,\n runId: \"run_2\",\n threadId: \"thread_123\",\n },\n { type: EventType.RUN_FINISHED },\n ]);\n\n mockThreadsRunsApi.run\n .mockResolvedValueOnce(initialStream)\n .mockResolvedValueOnce(continueStream);\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>\n <TamboRegistryContext.Provider value={mockRegistry as any}>\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n </TamboRegistryContext.Provider>\n </QueryClientProvider>\n );\n }\n\n const { result } = renderHook(() => useTamboV1SendMessage(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n await act(async () => {\n await result.current.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Test\" }],\n },\n });\n });\n\n // Tool should only be called once at awaiting_input, not during streaming\n expect(normalToolFn).toHaveBeenCalledTimes(1);\n expect(normalToolFn).toHaveBeenCalledWith({ query: \"test\" });\n });\n});\n"]}
|
|
@@ -78,13 +78,13 @@ export interface PropStatus {
|
|
|
78
78
|
* ```tsx
|
|
79
79
|
* // Highlight in-flight props
|
|
80
80
|
* const { propStatus } = useTamboV1StreamStatus<Props>();
|
|
81
|
-
* <h2 className={propStatus.title
|
|
81
|
+
* <h2 className={propStatus.title?.isStreaming ? "animate-pulse" : ""}>
|
|
82
82
|
* {title}
|
|
83
83
|
* </h2>
|
|
84
84
|
* ```
|
|
85
85
|
*/
|
|
86
86
|
export declare function useTamboV1StreamStatus<Props extends object = Record<string, unknown>>(): {
|
|
87
87
|
streamStatus: StreamStatus;
|
|
88
|
-
propStatus: Record<keyof Props, PropStatus
|
|
88
|
+
propStatus: Partial<Record<keyof Props, PropStatus>>;
|
|
89
89
|
};
|
|
90
90
|
//# sourceMappingURL=use-tambo-v1-stream-status.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-tambo-v1-stream-status.d.ts","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-stream-status.ts"],"names":[],"mappings":"AAiBA;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,SAAS,EAAE,OAAO,CAAC;IAEnB;;;OAGG;IACH,WAAW,EAAE,OAAO,CAAC;IAErB;;;OAGG;IACH,SAAS,EAAE,OAAO,CAAC;IAEnB;;;OAGG;IACH,OAAO,EAAE,OAAO,CAAC;IAEjB;;;OAGG;IACH,WAAW,CAAC,EAAE,KAAK,CAAC;CACrB;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB;;;OAGG;IACH,SAAS,EAAE,OAAO,CAAC;IAEnB;;;OAGG;IACH,WAAW,EAAE,OAAO,CAAC;IAErB;;;OAGG;IACH,SAAS,EAAE,OAAO,CAAC;IAEnB;;;OAGG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;
|
|
1
|
+
{"version":3,"file":"use-tambo-v1-stream-status.d.ts","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-stream-status.ts"],"names":[],"mappings":"AAiBA;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,SAAS,EAAE,OAAO,CAAC;IAEnB;;;OAGG;IACH,WAAW,EAAE,OAAO,CAAC;IAErB;;;OAGG;IACH,SAAS,EAAE,OAAO,CAAC;IAEnB;;;OAGG;IACH,OAAO,EAAE,OAAO,CAAC;IAEjB;;;OAGG;IACH,WAAW,CAAC,EAAE,KAAK,CAAC;CACrB;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB;;;OAGG;IACH,SAAS,EAAE,OAAO,CAAC;IAEnB;;;OAGG;IACH,WAAW,EAAE,OAAO,CAAC;IAErB;;;OAGG;IACH,SAAS,EAAE,OAAO,CAAC;IAEnB;;;OAGG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAmHD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,SAAS,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC3C;IACH,YAAY,EAAE,YAAY,CAAC;IAC3B,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;CACtD,CA2EA"}
|
|
@@ -70,7 +70,7 @@ function usePropsStreamingStatus(props, componentStreamingState) {
|
|
|
70
70
|
* @returns The aggregated StreamStatus for the entire component
|
|
71
71
|
*/
|
|
72
72
|
function deriveGlobalStreamStatus(componentStreamingState, propStatus, hasComponent, streamError) {
|
|
73
|
-
const propStatuses = Object.values(propStatus);
|
|
73
|
+
const propStatuses = Object.values(propStatus).filter((p) => p !== undefined);
|
|
74
74
|
const isStreamError = !!streamError;
|
|
75
75
|
// If all props are already successful, the component is complete regardless of streaming state
|
|
76
76
|
const allPropsSuccessful = propStatuses.length > 0 && propStatuses.every((p) => p.isSuccess);
|
|
@@ -117,7 +117,7 @@ function deriveGlobalStreamStatus(componentStreamingState, propStatus, hasCompon
|
|
|
117
117
|
* ```tsx
|
|
118
118
|
* // Highlight in-flight props
|
|
119
119
|
* const { propStatus } = useTamboV1StreamStatus<Props>();
|
|
120
|
-
* <h2 className={propStatus.title
|
|
120
|
+
* <h2 className={propStatus.title?.isStreaming ? "animate-pulse" : ""}>
|
|
121
121
|
* {title}
|
|
122
122
|
* </h2>
|
|
123
123
|
* ```
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-tambo-v1-stream-status.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-stream-status.ts"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\n/**\n * useTamboV1StreamStatus - Stream Status Hook for v1 API\n *\n * Provides granular streaming status for components being rendered,\n * allowing UI to respond to prop-level streaming states.\n *\n * Must be used within a component rendered via the component renderer.\n */\n\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useV1ComponentContent } from \"../utils/component-renderer\";\nimport { useStreamState } from \"../providers/tambo-v1-stream-context\";\nimport { findComponentContent } from \"../utils/thread-utils\";\nimport type { V1ComponentContent } from \"../types/message\";\n\n/**\n * Global stream status flags for a specific component in a message.\n * Represents the aggregate state across all props for this component only.\n * Once a component completes, its status remains stable regardless of other generations.\n */\nexport interface StreamStatus {\n /**\n * Indicates no tokens have been received for any prop and generation is not active.\n * Useful for showing initial loading states before any data arrives.\n */\n isPending: boolean;\n\n /**\n * Indicates active streaming - at least one prop is still streaming.\n * Use this to show loading animations or skeleton states during data transmission.\n */\n isStreaming: boolean;\n\n /**\n * Indicates successful completion - component streaming is done AND every prop finished without error.\n * Safe to render the final component when this is true.\n */\n isSuccess: boolean;\n\n /**\n * Indicates a fatal error occurred in any prop or the stream itself.\n * Check streamError for details about what went wrong.\n */\n isError: boolean;\n\n /**\n * The first fatal error encountered during streaming (if any).\n * Will be undefined if no errors occurred.\n */\n streamError?: Error;\n}\n\n/**\n * Streaming status flags for individual component props.\n * Tracks the state of each prop as it streams from the LLM.\n */\nexport interface PropStatus {\n /**\n * Indicates no tokens have been received for this specific prop yet.\n * The prop value is still undefined, null, or empty string.\n */\n isPending: boolean;\n\n /**\n * Indicates at least one token has been received but streaming is not complete.\n * The prop has partial content that may still be updating.\n */\n isStreaming: boolean;\n\n /**\n * Indicates this prop has finished streaming successfully.\n * The prop value is complete and stable.\n */\n isSuccess: boolean;\n\n /**\n * The error that occurred during streaming (if any).\n * Will be undefined if no error occurred for this prop.\n */\n error?: Error;\n}\n\n/**\n * Track streaming status for individual props by monitoring their values.\n * Monitors when props receive their first token and when they complete streaming.\n * @template Props - The type of the component props being tracked\n * @param props - The current component props object\n * @param componentStreamingState - The current streaming state of the component\n * @returns A record mapping each prop key to its PropStatus\n */\nfunction usePropsStreamingStatus<Props extends object>(\n props: Props | undefined,\n componentStreamingState: V1ComponentContent[\"streamingState\"] | undefined,\n): Record<keyof Props, PropStatus> {\n /** Track which props have received content */\n const [startedProps, setStartedProps] = useState<Set<string>>(new Set());\n\n /** Update started props when content arrives */\n useEffect(() => {\n if (!props) return;\n\n setStartedProps((prev) => {\n let changed = false;\n const newStarted = new Set(prev);\n\n for (const [key, value] of Object.entries(props)) {\n const hasContent =\n value !== undefined && value !== null && value !== \"\";\n if (hasContent && !newStarted.has(key)) {\n newStarted.add(key);\n changed = true;\n }\n }\n\n return changed ? newStarted : prev;\n });\n }, [props]);\n\n /** Derive prop statuses from started props and streaming state */\n return useMemo(() => {\n if (!props) return {} as Record<keyof Props, PropStatus>;\n\n const isStreamingDone = componentStreamingState === \"done\";\n const isComponentStreaming = componentStreamingState === \"streaming\";\n\n const result = {} as Record<keyof Props, PropStatus>;\n for (const key of Object.keys(props)) {\n const hasStarted = startedProps.has(key);\n const isComplete = hasStarted && isStreamingDone;\n\n result[key as keyof Props] = {\n isPending: !hasStarted && !isComplete,\n isStreaming: hasStarted && !isComplete && isComponentStreaming,\n isSuccess: isComplete,\n error: undefined,\n };\n }\n return result;\n }, [props, startedProps, componentStreamingState]);\n}\n\n/**\n * Derives global StreamStatus from component streaming state and individual prop statuses.\n * Aggregates individual prop states into a unified stream status.\n * @template Props - The type of the component props\n * @param componentStreamingState - The current streaming state of the component\n * @param propStatus - Status record for each individual prop\n * @param hasComponent - Whether a component exists in the current message\n * @param streamError - Any error from the streaming process itself\n * @returns The aggregated StreamStatus for the entire component\n */\nfunction deriveGlobalStreamStatus(\n componentStreamingState: V1ComponentContent[\"streamingState\"] | undefined,\n propStatus: Record<string, PropStatus>,\n hasComponent: boolean,\n streamError?: Error,\n): StreamStatus {\n const propStatuses: PropStatus[] = Object.values(propStatus);\n const isStreamError = !!streamError;\n\n // If all props are already successful, the component is complete regardless of streaming state\n const allPropsSuccessful =\n propStatuses.length > 0 && propStatuses.every((p) => p.isSuccess);\n\n // Component is streaming if streamingState is \"streaming\" (even before props start)\n const isComponentStreaming = componentStreamingState === \"streaming\";\n const anyPropStreaming = propStatuses.some((p) => p.isStreaming);\n\n /** Find first error from stream or any prop */\n const firstError = streamError ?? propStatuses.find((p) => p.error)?.error;\n\n return {\n /** isPending: no component yet OR (not streaming, not error, not success, and all props pending) */\n isPending:\n !hasComponent ||\n (!isStreamError &&\n !isComponentStreaming &&\n !allPropsSuccessful &&\n propStatuses.every((p) => p.isPending)),\n\n /** isStreaming: component is streaming OR any prop is streaming (but not if error) */\n isStreaming: !isStreamError && (isComponentStreaming || anyPropStreaming),\n\n /** isSuccess: all props successful and no error */\n isSuccess: allPropsSuccessful && !isStreamError,\n\n /** isError: stream error OR any prop error */\n isError: isStreamError || propStatuses.some((p) => p.error),\n\n streamError: firstError,\n };\n}\n\n/**\n * Track streaming status for Tambo v1 component props.\n *\n * **Important**: Props update repeatedly during streaming and may be partial.\n * Use `propStatus.<field>?.isSuccess` before treating a prop as complete.\n *\n * Pair with `useTamboV1ComponentState` to disable inputs while streaming.\n * @see {@link https://docs.tambo.co/concepts/generative-interfaces/component-state}\n * @template Props - Component props type\n * @returns `streamStatus` (overall) and `propStatus` (per-prop) flags\n * @throws {Error} When used outside a rendered component\n * @example\n * ```tsx\n * // Wait for entire stream\n * const { streamStatus } = useTamboV1StreamStatus();\n * if (!streamStatus.isSuccess) return <Spinner />;\n * return <Card {...props} />;\n * ```\n * @example\n * ```tsx\n * // Highlight in-flight props\n * const { propStatus } = useTamboV1StreamStatus<Props>();\n * <h2 className={propStatus.title.isStreaming ? \"animate-pulse\" : \"\"}>\n * {title}\n * </h2>\n * ```\n */\nexport function useTamboV1StreamStatus<\n Props extends object = Record<string, unknown>,\n>(): {\n streamStatus: StreamStatus;\n propStatus: Record<keyof Props, PropStatus>;\n} {\n const { componentId, threadId } = useV1ComponentContent();\n const streamState = useStreamState();\n\n /**\n * Error if componentId changes - this indicates the provider hierarchy is broken.\n * The componentId should remain stable for the lifetime of the component.\n * If this fires, the TamboV1ComponentRenderer is likely being used incorrectly,\n * or the component tree is being remounted in unexpected ways.\n */\n const initialComponentIdRef = useRef(componentId);\n useEffect(() => {\n if (componentId !== initialComponentIdRef.current) {\n console.error(\n `useTamboV1StreamStatus: componentId changed from \"${initialComponentIdRef.current}\" to \"${componentId}\". ` +\n \"This indicates a bug in the component tree or incorrect provider usage. \" +\n \"The componentId must remain stable for the component's lifetime. \" +\n \"Check that TamboV1ComponentRenderer is not being remounted unexpectedly.\",\n );\n initialComponentIdRef.current = componentId;\n }\n }, [componentId]);\n\n /** Get the current thread state */\n const threadState = streamState.threadMap[threadId];\n\n /** Get error message from stream state if any */\n const streamErrorMessage =\n threadState?.streaming.status === \"error\"\n ? threadState?.streaming.error?.message\n : undefined;\n\n /** Find the component content block */\n const componentContent = findComponentContent(\n streamState,\n threadId,\n componentId,\n );\n\n /** Get the current component props */\n const componentProps =\n (componentContent?.props as Props | undefined) ?? ({} as Props);\n\n /** Get the component streaming state */\n const componentStreamingState = componentContent?.streamingState;\n\n /** Track per-prop streaming status */\n const propStatus = usePropsStreamingStatus(\n componentProps,\n componentStreamingState,\n );\n\n /** Derive global stream status from prop statuses and component streaming state */\n const streamStatus = useMemo(() => {\n const hasComponent = !!componentContent;\n const streamError = streamErrorMessage\n ? new Error(streamErrorMessage)\n : undefined;\n return deriveGlobalStreamStatus(\n componentStreamingState,\n propStatus,\n hasComponent,\n streamError,\n );\n }, [\n componentStreamingState,\n propStatus,\n componentContent,\n streamErrorMessage,\n ]);\n\n return {\n streamStatus,\n propStatus,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"use-tambo-v1-stream-status.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-stream-status.ts"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\n/**\n * useTamboV1StreamStatus - Stream Status Hook for v1 API\n *\n * Provides granular streaming status for components being rendered,\n * allowing UI to respond to prop-level streaming states.\n *\n * Must be used within a component rendered via the component renderer.\n */\n\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useV1ComponentContent } from \"../utils/component-renderer\";\nimport { useStreamState } from \"../providers/tambo-v1-stream-context\";\nimport { findComponentContent } from \"../utils/thread-utils\";\nimport type { V1ComponentContent } from \"../types/message\";\n\n/**\n * Global stream status flags for a specific component in a message.\n * Represents the aggregate state across all props for this component only.\n * Once a component completes, its status remains stable regardless of other generations.\n */\nexport interface StreamStatus {\n /**\n * Indicates no tokens have been received for any prop and generation is not active.\n * Useful for showing initial loading states before any data arrives.\n */\n isPending: boolean;\n\n /**\n * Indicates active streaming - at least one prop is still streaming.\n * Use this to show loading animations or skeleton states during data transmission.\n */\n isStreaming: boolean;\n\n /**\n * Indicates successful completion - component streaming is done AND every prop finished without error.\n * Safe to render the final component when this is true.\n */\n isSuccess: boolean;\n\n /**\n * Indicates a fatal error occurred in any prop or the stream itself.\n * Check streamError for details about what went wrong.\n */\n isError: boolean;\n\n /**\n * The first fatal error encountered during streaming (if any).\n * Will be undefined if no errors occurred.\n */\n streamError?: Error;\n}\n\n/**\n * Streaming status flags for individual component props.\n * Tracks the state of each prop as it streams from the LLM.\n */\nexport interface PropStatus {\n /**\n * Indicates no tokens have been received for this specific prop yet.\n * The prop value is still undefined, null, or empty string.\n */\n isPending: boolean;\n\n /**\n * Indicates at least one token has been received but streaming is not complete.\n * The prop has partial content that may still be updating.\n */\n isStreaming: boolean;\n\n /**\n * Indicates this prop has finished streaming successfully.\n * The prop value is complete and stable.\n */\n isSuccess: boolean;\n\n /**\n * The error that occurred during streaming (if any).\n * Will be undefined if no error occurred for this prop.\n */\n error?: Error;\n}\n\n/**\n * Track streaming status for individual props by monitoring their values.\n * Monitors when props receive their first token and when they complete streaming.\n * @template Props - The type of the component props being tracked\n * @param props - The current component props object\n * @param componentStreamingState - The current streaming state of the component\n * @returns A record mapping each prop key to its PropStatus\n */\nfunction usePropsStreamingStatus<Props extends object>(\n props: Props | undefined,\n componentStreamingState: V1ComponentContent[\"streamingState\"] | undefined,\n): Partial<Record<keyof Props, PropStatus>> {\n /** Track which props have received content */\n const [startedProps, setStartedProps] = useState<Set<string>>(new Set());\n\n /** Update started props when content arrives */\n useEffect(() => {\n if (!props) return;\n\n setStartedProps((prev) => {\n let changed = false;\n const newStarted = new Set(prev);\n\n for (const [key, value] of Object.entries(props)) {\n const hasContent =\n value !== undefined && value !== null && value !== \"\";\n if (hasContent && !newStarted.has(key)) {\n newStarted.add(key);\n changed = true;\n }\n }\n\n return changed ? newStarted : prev;\n });\n }, [props]);\n\n /** Derive prop statuses from started props and streaming state */\n return useMemo(() => {\n if (!props) return {} as Record<keyof Props, PropStatus>;\n\n const isStreamingDone = componentStreamingState === \"done\";\n const isComponentStreaming = componentStreamingState === \"streaming\";\n\n const result = {} as Record<keyof Props, PropStatus>;\n for (const key of Object.keys(props)) {\n const hasStarted = startedProps.has(key);\n const isComplete = hasStarted && isStreamingDone;\n\n result[key as keyof Props] = {\n isPending: !hasStarted && !isComplete,\n isStreaming: hasStarted && !isComplete && isComponentStreaming,\n isSuccess: isComplete,\n error: undefined,\n };\n }\n return result;\n }, [props, startedProps, componentStreamingState]);\n}\n\n/**\n * Derives global StreamStatus from component streaming state and individual prop statuses.\n * Aggregates individual prop states into a unified stream status.\n * @template Props - The type of the component props\n * @param componentStreamingState - The current streaming state of the component\n * @param propStatus - Status record for each individual prop\n * @param hasComponent - Whether a component exists in the current message\n * @param streamError - Any error from the streaming process itself\n * @returns The aggregated StreamStatus for the entire component\n */\nfunction deriveGlobalStreamStatus(\n componentStreamingState: V1ComponentContent[\"streamingState\"] | undefined,\n propStatus: Partial<Record<string, PropStatus>>,\n hasComponent: boolean,\n streamError?: Error,\n): StreamStatus {\n const propStatuses: PropStatus[] = Object.values(propStatus).filter(\n (p): p is PropStatus => p !== undefined,\n );\n const isStreamError = !!streamError;\n\n // If all props are already successful, the component is complete regardless of streaming state\n const allPropsSuccessful =\n propStatuses.length > 0 && propStatuses.every((p) => p.isSuccess);\n\n // Component is streaming if streamingState is \"streaming\" (even before props start)\n const isComponentStreaming = componentStreamingState === \"streaming\";\n const anyPropStreaming = propStatuses.some((p) => p.isStreaming);\n\n /** Find first error from stream or any prop */\n const firstError = streamError ?? propStatuses.find((p) => p.error)?.error;\n\n return {\n /** isPending: no component yet OR (not streaming, not error, not success, and all props pending) */\n isPending:\n !hasComponent ||\n (!isStreamError &&\n !isComponentStreaming &&\n !allPropsSuccessful &&\n propStatuses.every((p) => p.isPending)),\n\n /** isStreaming: component is streaming OR any prop is streaming (but not if error) */\n isStreaming: !isStreamError && (isComponentStreaming || anyPropStreaming),\n\n /** isSuccess: all props successful and no error */\n isSuccess: allPropsSuccessful && !isStreamError,\n\n /** isError: stream error OR any prop error */\n isError: isStreamError || propStatuses.some((p) => p.error),\n\n streamError: firstError,\n };\n}\n\n/**\n * Track streaming status for Tambo v1 component props.\n *\n * **Important**: Props update repeatedly during streaming and may be partial.\n * Use `propStatus.<field>?.isSuccess` before treating a prop as complete.\n *\n * Pair with `useTamboV1ComponentState` to disable inputs while streaming.\n * @see {@link https://docs.tambo.co/concepts/generative-interfaces/component-state}\n * @template Props - Component props type\n * @returns `streamStatus` (overall) and `propStatus` (per-prop) flags\n * @throws {Error} When used outside a rendered component\n * @example\n * ```tsx\n * // Wait for entire stream\n * const { streamStatus } = useTamboV1StreamStatus();\n * if (!streamStatus.isSuccess) return <Spinner />;\n * return <Card {...props} />;\n * ```\n * @example\n * ```tsx\n * // Highlight in-flight props\n * const { propStatus } = useTamboV1StreamStatus<Props>();\n * <h2 className={propStatus.title?.isStreaming ? \"animate-pulse\" : \"\"}>\n * {title}\n * </h2>\n * ```\n */\nexport function useTamboV1StreamStatus<\n Props extends object = Record<string, unknown>,\n>(): {\n streamStatus: StreamStatus;\n propStatus: Partial<Record<keyof Props, PropStatus>>;\n} {\n const { componentId, threadId } = useV1ComponentContent();\n const streamState = useStreamState();\n\n /**\n * Error if componentId changes - this indicates the provider hierarchy is broken.\n * The componentId should remain stable for the lifetime of the component.\n * If this fires, the TamboV1ComponentRenderer is likely being used incorrectly,\n * or the component tree is being remounted in unexpected ways.\n */\n const initialComponentIdRef = useRef(componentId);\n useEffect(() => {\n if (componentId !== initialComponentIdRef.current) {\n console.error(\n `useTamboV1StreamStatus: componentId changed from \"${initialComponentIdRef.current}\" to \"${componentId}\". ` +\n \"This indicates a bug in the component tree or incorrect provider usage. \" +\n \"The componentId must remain stable for the component's lifetime. \" +\n \"Check that TamboV1ComponentRenderer is not being remounted unexpectedly.\",\n );\n initialComponentIdRef.current = componentId;\n }\n }, [componentId]);\n\n /** Get the current thread state */\n const threadState = streamState.threadMap[threadId];\n\n /** Get error message from stream state if any */\n const streamErrorMessage =\n threadState?.streaming.status === \"error\"\n ? threadState?.streaming.error?.message\n : undefined;\n\n /** Find the component content block */\n const componentContent = findComponentContent(\n streamState,\n threadId,\n componentId,\n );\n\n /** Get the current component props */\n const componentProps =\n (componentContent?.props as Props | undefined) ?? ({} as Props);\n\n /** Get the component streaming state */\n const componentStreamingState = componentContent?.streamingState;\n\n /** Track per-prop streaming status */\n const propStatus = usePropsStreamingStatus(\n componentProps,\n componentStreamingState,\n );\n\n /** Derive global stream status from prop statuses and component streaming state */\n const streamStatus = useMemo(() => {\n const hasComponent = !!componentContent;\n const streamError = streamErrorMessage\n ? new Error(streamErrorMessage)\n : undefined;\n return deriveGlobalStreamStatus(\n componentStreamingState,\n propStatus,\n hasComponent,\n streamError,\n );\n }, [\n componentStreamingState,\n propStatus,\n componentContent,\n streamErrorMessage,\n ]);\n\n return {\n streamStatus,\n propStatus,\n };\n}\n"]}
|
|
@@ -138,8 +138,8 @@ describe("useTamboV1StreamStatus", () => {
|
|
|
138
138
|
expect(result.current.streamStatus.isStreaming).toBe(true);
|
|
139
139
|
expect(result.current.streamStatus.isPending).toBe(false);
|
|
140
140
|
// Individual props should still be pending
|
|
141
|
-
expect(result.current.propStatus.title
|
|
142
|
-
expect(result.current.propStatus.title
|
|
141
|
+
expect(result.current.propStatus.title?.isPending).toBe(true);
|
|
142
|
+
expect(result.current.propStatus.title?.isStreaming).toBe(false);
|
|
143
143
|
});
|
|
144
144
|
it("should show prop streaming when props receive content during streaming", () => {
|
|
145
145
|
const componentContent = createComponentContent({
|
|
@@ -151,11 +151,11 @@ describe("useTamboV1StreamStatus", () => {
|
|
|
151
151
|
mockUseStreamState.mockReturnValue(createStreamState(threadState));
|
|
152
152
|
const { result } = renderHook(() => useTamboV1StreamStatus());
|
|
153
153
|
// Title prop should be streaming since it has content
|
|
154
|
-
expect(result.current.propStatus.title
|
|
155
|
-
expect(result.current.propStatus.title
|
|
154
|
+
expect(result.current.propStatus.title?.isStreaming).toBe(true);
|
|
155
|
+
expect(result.current.propStatus.title?.isPending).toBe(false);
|
|
156
156
|
// Body prop should still be pending since it has no content
|
|
157
|
-
expect(result.current.propStatus.body
|
|
158
|
-
expect(result.current.propStatus.body
|
|
157
|
+
expect(result.current.propStatus.body?.isStreaming).toBe(false);
|
|
158
|
+
expect(result.current.propStatus.body?.isPending).toBe(true);
|
|
159
159
|
// Global should be streaming because at least one prop is streaming
|
|
160
160
|
expect(result.current.streamStatus.isStreaming).toBe(true);
|
|
161
161
|
});
|
|
@@ -234,9 +234,9 @@ describe("useTamboV1StreamStatus", () => {
|
|
|
234
234
|
const { result } = renderHook(() => useTamboV1StreamStatus());
|
|
235
235
|
// All props are pending and no streaming activity
|
|
236
236
|
expect(result.current.streamStatus.isPending).toBe(true);
|
|
237
|
-
expect(result.current.propStatus.title
|
|
238
|
-
expect(result.current.propStatus.body
|
|
239
|
-
expect(result.current.propStatus.footer
|
|
237
|
+
expect(result.current.propStatus.title?.isPending).toBe(true);
|
|
238
|
+
expect(result.current.propStatus.body?.isPending).toBe(true);
|
|
239
|
+
expect(result.current.propStatus.footer?.isPending).toBe(true);
|
|
240
240
|
});
|
|
241
241
|
it("should derive isSuccess correctly (streaming done AND all props successful)", () => {
|
|
242
242
|
// Step 1: Start with streaming, props empty
|
|
@@ -276,8 +276,8 @@ describe("useTamboV1StreamStatus", () => {
|
|
|
276
276
|
mockUseStreamState.mockReturnValue(createStreamState(threadState));
|
|
277
277
|
rerender();
|
|
278
278
|
// Now both props should be successful
|
|
279
|
-
expect(result.current.propStatus.title
|
|
280
|
-
expect(result.current.propStatus.body
|
|
279
|
+
expect(result.current.propStatus.title?.isSuccess).toBe(true);
|
|
280
|
+
expect(result.current.propStatus.body?.isSuccess).toBe(true);
|
|
281
281
|
expect(result.current.streamStatus.isSuccess).toBe(true);
|
|
282
282
|
});
|
|
283
283
|
});
|