@tambo-ai/react 0.73.0 → 0.74.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -12
- package/dist/hooks/use-component-state.d.ts +1 -1
- package/dist/hooks/use-component-state.js.map +1 -1
- package/dist/hooks/use-streaming-props.d.ts +1 -1
- package/dist/hooks/use-streaming-props.js +1 -1
- package/dist/hooks/use-streaming-props.js.map +1 -1
- package/dist/hooks/use-tambo-stream-status.d.ts +1 -1
- package/dist/hooks/use-tambo-stream-status.js +1 -1
- package/dist/hooks/use-tambo-stream-status.js.map +1 -1
- package/dist/mcp/mcp-hooks.d.ts +4 -0
- package/dist/mcp/mcp-hooks.d.ts.map +1 -1
- package/dist/mcp/mcp-hooks.js +4 -0
- package/dist/mcp/mcp-hooks.js.map +1 -1
- package/dist/providers/tambo-interactable-provider-partial-updates.test.js +3 -3
- package/dist/providers/tambo-interactable-provider-partial-updates.test.js.map +1 -1
- package/dist/providers/tambo-interactable-provider.js +2 -2
- package/dist/providers/tambo-interactable-provider.js.map +1 -1
- package/dist/providers/tambo-interactable-provider.test.js +3 -3
- package/dist/providers/tambo-interactable-provider.test.js.map +1 -1
- package/dist/providers/tambo-provider.d.ts +3 -0
- package/dist/providers/tambo-provider.d.ts.map +1 -1
- package/dist/providers/tambo-provider.js +3 -0
- package/dist/providers/tambo-provider.js.map +1 -1
- package/dist/providers/tambo-thread-input-provider.d.ts.map +1 -1
- package/dist/providers/tambo-thread-input-provider.js +1 -0
- package/dist/providers/tambo-thread-input-provider.js.map +1 -1
- package/dist/util/resource-content-resolver.d.ts.map +1 -1
- package/dist/util/resource-content-resolver.js +2 -0
- package/dist/util/resource-content-resolver.js.map +1 -1
- package/dist/v1/__tests__/v1-interactables.test.d.ts +2 -0
- package/dist/v1/__tests__/v1-interactables.test.d.ts.map +1 -0
- package/dist/v1/__tests__/v1-interactables.test.js +135 -0
- package/dist/v1/__tests__/v1-interactables.test.js.map +1 -0
- package/dist/v1/components/v1-component-renderer.d.ts +48 -0
- package/dist/v1/components/v1-component-renderer.d.ts.map +1 -0
- package/dist/v1/components/v1-component-renderer.js +137 -0
- package/dist/v1/components/v1-component-renderer.js.map +1 -0
- package/dist/v1/components/v1-component-renderer.test.d.ts +2 -0
- package/dist/v1/components/v1-component-renderer.test.d.ts.map +1 -0
- package/dist/v1/components/v1-component-renderer.test.js +270 -0
- package/dist/v1/components/v1-component-renderer.test.js.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-component-state.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-component-state.js +2 -25
- package/dist/v1/hooks/use-tambo-v1-component-state.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-component-state.test.js +2 -1
- package/dist/v1/hooks/use-tambo-v1-component-state.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-messages.test.js +25 -1
- package/dist/v1/hooks/use-tambo-v1-messages.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-send-message.d.ts +18 -0
- package/dist/v1/hooks/use-tambo-v1-send-message.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-send-message.js +204 -17
- package/dist/v1/hooks/use-tambo-v1-send-message.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-send-message.test.js +261 -7
- package/dist/v1/hooks/use-tambo-v1-send-message.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-stream-status.d.ts +90 -0
- package/dist/v1/hooks/use-tambo-v1-stream-status.d.ts.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-stream-status.js +179 -0
- package/dist/v1/hooks/use-tambo-v1-stream-status.js.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-stream-status.test.d.ts +2 -0
- package/dist/v1/hooks/use-tambo-v1-stream-status.test.d.ts.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-stream-status.test.js +371 -0
- package/dist/v1/hooks/use-tambo-v1-stream-status.test.js.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-suggestions.d.ts +78 -54
- package/dist/v1/hooks/use-tambo-v1-suggestions.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-suggestions.js +153 -87
- package/dist/v1/hooks/use-tambo-v1-suggestions.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-suggestions.test.js +213 -134
- package/dist/v1/hooks/use-tambo-v1-suggestions.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread-input.test.js +148 -13
- package/dist/v1/hooks/use-tambo-v1-thread-input.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread-list.d.ts +8 -21
- package/dist/v1/hooks/use-tambo-v1-thread-list.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread-list.js +11 -10
- package/dist/v1/hooks/use-tambo-v1-thread-list.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread-list.test.js +37 -2
- package/dist/v1/hooks/use-tambo-v1-thread-list.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread.d.ts +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread.js +2 -7
- package/dist/v1/hooks/use-tambo-v1-thread.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread.test.js +2 -0
- package/dist/v1/hooks/use-tambo-v1-thread.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1.d.ts +12 -28
- package/dist/v1/hooks/use-tambo-v1.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1.js +164 -31
- package/dist/v1/hooks/use-tambo-v1.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1.test.js +891 -18
- package/dist/v1/hooks/use-tambo-v1.test.js.map +1 -1
- package/dist/v1/index.d.ts +7 -1
- package/dist/v1/index.d.ts.map +1 -1
- package/dist/v1/index.js +18 -1
- package/dist/v1/index.js.map +1 -1
- package/dist/v1/providers/tambo-v1-provider.d.ts +16 -6
- package/dist/v1/providers/tambo-v1-provider.d.ts.map +1 -1
- package/dist/v1/providers/tambo-v1-provider.js +14 -19
- package/dist/v1/providers/tambo-v1-provider.js.map +1 -1
- package/dist/v1/providers/tambo-v1-provider.test.js +34 -20
- package/dist/v1/providers/tambo-v1-provider.test.js.map +1 -1
- package/dist/v1/providers/tambo-v1-stream-context.d.ts +3 -3
- package/dist/v1/providers/tambo-v1-stream-context.d.ts.map +1 -1
- package/dist/v1/providers/tambo-v1-stream-context.js +60 -12
- package/dist/v1/providers/tambo-v1-stream-context.js.map +1 -1
- package/dist/v1/providers/tambo-v1-stream-context.test.js +49 -20
- package/dist/v1/providers/tambo-v1-stream-context.test.js.map +1 -1
- package/dist/v1/providers/tambo-v1-stub-provider.d.ts.map +1 -1
- package/dist/v1/providers/tambo-v1-stub-provider.js +2 -0
- package/dist/v1/providers/tambo-v1-stub-provider.js.map +1 -1
- package/dist/v1/providers/tambo-v1-stub-provider.test.js +7 -6
- package/dist/v1/providers/tambo-v1-stub-provider.test.js.map +1 -1
- package/dist/v1/providers/tambo-v1-thread-input-provider.d.ts +1 -6
- package/dist/v1/providers/tambo-v1-thread-input-provider.d.ts.map +1 -1
- package/dist/v1/providers/tambo-v1-thread-input-provider.js +14 -12
- package/dist/v1/providers/tambo-v1-thread-input-provider.js.map +1 -1
- package/dist/v1/types/event.d.ts +9 -1
- package/dist/v1/types/event.d.ts.map +1 -1
- package/dist/v1/types/event.js.map +1 -1
- package/dist/v1/types/event.test.js +5 -1
- package/dist/v1/types/event.test.js.map +1 -1
- package/dist/v1/types/message.d.ts +65 -7
- package/dist/v1/types/message.d.ts.map +1 -1
- package/dist/v1/types/message.js.map +1 -1
- package/dist/v1/types/thread.d.ts +4 -0
- package/dist/v1/types/thread.d.ts.map +1 -1
- package/dist/v1/types/thread.js.map +1 -1
- package/dist/v1/utils/event-accumulator.d.ts +40 -4
- package/dist/v1/utils/event-accumulator.d.ts.map +1 -1
- package/dist/v1/utils/event-accumulator.js +444 -35
- package/dist/v1/utils/event-accumulator.js.map +1 -1
- package/dist/v1/utils/event-accumulator.test.js +1041 -28
- package/dist/v1/utils/event-accumulator.test.js.map +1 -1
- package/dist/v1/utils/registry-conversion.d.ts +9 -9
- package/dist/v1/utils/registry-conversion.d.ts.map +1 -1
- package/dist/v1/utils/registry-conversion.js +10 -11
- package/dist/v1/utils/registry-conversion.js.map +1 -1
- package/dist/v1/utils/registry-conversion.test.js +39 -11
- package/dist/v1/utils/registry-conversion.test.js.map +1 -1
- package/dist/v1/utils/thread-utils.d.ts +16 -0
- package/dist/v1/utils/thread-utils.d.ts.map +1 -0
- package/dist/v1/utils/thread-utils.js +34 -0
- package/dist/v1/utils/thread-utils.js.map +1 -0
- package/dist/v1/utils/tool-executor.d.ts.map +1 -1
- package/dist/v1/utils/tool-executor.js +2 -0
- package/dist/v1/utils/tool-executor.js.map +1 -1
- package/dist/v1/utils/tool-executor.test.js +5 -0
- package/dist/v1/utils/tool-executor.test.js.map +1 -1
- package/esm/context-helpers/context-helpers-provider.test.js +2 -2
- package/esm/context-helpers/context-helpers.test.js +1 -1
- package/esm/context-helpers/current-interactables-context-helper.d.ts +1 -1
- package/esm/context-helpers/current-page-context-helper.d.ts +1 -1
- package/esm/context-helpers/current-time-context-helper.d.ts +1 -1
- package/esm/context-helpers/index.d.ts +4 -4
- package/esm/context-helpers/index.js +4 -4
- package/esm/hoc/with-tambo-interactable.d.ts +1 -1
- package/esm/hoc/with-tambo-interactable.js +2 -2
- package/esm/hoc/with-tambo-interactable.test.js +3 -3
- package/esm/hooks/index.d.ts +8 -8
- package/esm/hooks/index.js +8 -8
- package/esm/hooks/react-query-hooks.js +1 -1
- package/esm/hooks/use-component-state.d.ts +1 -1
- package/esm/hooks/use-component-state.js +3 -3
- package/esm/hooks/use-component-state.js.map +1 -1
- package/esm/hooks/use-component-state.test.js +5 -5
- package/esm/hooks/use-current-message.d.ts +1 -1
- package/esm/hooks/use-current-message.test.js +1 -1
- package/esm/hooks/use-message-images.test.js +1 -1
- package/esm/hooks/use-streaming-props.d.ts +1 -1
- package/esm/hooks/use-streaming-props.js +1 -1
- package/esm/hooks/use-streaming-props.js.map +1 -1
- package/esm/hooks/use-suggestions.d.ts +2 -2
- package/esm/hooks/use-suggestions.js +10 -10
- package/esm/hooks/use-suggestions.test.js +7 -7
- package/esm/hooks/use-tambo-stream-status.d.ts +1 -1
- package/esm/hooks/use-tambo-stream-status.js +4 -4
- package/esm/hooks/use-tambo-stream-status.js.map +1 -1
- package/esm/hooks/use-tambo-stream-status.test.js +4 -4
- package/esm/hooks/use-tambo-threads.js +3 -3
- package/esm/hooks/use-tambo-threads.test.js +3 -3
- package/esm/hooks/use-tambo-voice.js +2 -2
- package/esm/hooks/use-tambo-voice.test.js +3 -3
- package/esm/index.d.ts +22 -22
- package/esm/index.js +15 -15
- package/esm/mcp/elicitation.d.ts +1 -1
- package/esm/mcp/elicitation.test.js +1 -1
- package/esm/mcp/index.d.ts +7 -7
- package/esm/mcp/index.js +3 -3
- package/esm/mcp/mcp-client.d.ts +1 -1
- package/esm/mcp/mcp-client.js +1 -1
- package/esm/mcp/mcp-client.test.js +1 -1
- package/esm/mcp/mcp-hooks.d.ts +5 -1
- package/esm/mcp/mcp-hooks.d.ts.map +1 -1
- package/esm/mcp/mcp-hooks.js +8 -4
- package/esm/mcp/mcp-hooks.js.map +1 -1
- package/esm/mcp/mcp-hooks.test.js +6 -6
- package/esm/mcp/tambo-mcp-provider.d.ts +4 -4
- package/esm/mcp/tambo-mcp-provider.js +7 -7
- package/esm/mcp/tambo-mcp-provider.test.js +5 -5
- package/esm/mcp/use-mcp-servers.test.js +4 -4
- package/esm/model/generate-component-response.d.ts +1 -1
- package/esm/model/tambo-interactable.d.ts +1 -1
- package/esm/model/tambo-thread.d.ts +1 -1
- package/esm/providers/__tests__/thread-input-resource-resolution.test.js +3 -3
- package/esm/providers/hooks/use-tambo-session-token.test.js +1 -1
- package/esm/providers/index.d.ts +12 -12
- package/esm/providers/index.js +10 -10
- package/esm/providers/tambo-client-provider.js +1 -1
- package/esm/providers/tambo-client-provider.test.js +2 -2
- package/esm/providers/tambo-component-provider.d.ts +1 -1
- package/esm/providers/tambo-component-provider.js +2 -2
- package/esm/providers/tambo-context-attachment-provider.js +1 -1
- package/esm/providers/tambo-context-attachment-provider.test.js +2 -2
- package/esm/providers/tambo-context-helpers-provider.d.ts +1 -1
- package/esm/providers/tambo-context-helpers-provider.js +1 -1
- package/esm/providers/tambo-context-helpers-provider.test.js +2 -2
- package/esm/providers/tambo-interactable-provider-partial-updates.test.js +4 -4
- package/esm/providers/tambo-interactable-provider-partial-updates.test.js.map +1 -1
- package/esm/providers/tambo-interactable-provider.d.ts +5 -5
- package/esm/providers/tambo-interactable-provider.js +6 -6
- package/esm/providers/tambo-interactable-provider.js.map +1 -1
- package/esm/providers/tambo-interactable-provider.test.js +4 -4
- package/esm/providers/tambo-interactable-provider.test.js.map +1 -1
- package/esm/providers/tambo-interactables-additional-context-edge-cases.test.js +4 -4
- package/esm/providers/tambo-interactables-additional-context.test.js +4 -4
- package/esm/providers/tambo-mcp-token-provider.js +2 -2
- package/esm/providers/tambo-prop-stream-provider/index.d.ts +8 -8
- package/esm/providers/tambo-prop-stream-provider/index.js +9 -9
- package/esm/providers/tambo-prop-stream-provider/pending.d.ts +1 -1
- package/esm/providers/tambo-prop-stream-provider/pending.js +2 -2
- package/esm/providers/tambo-prop-stream-provider/provider.d.ts +1 -1
- package/esm/providers/tambo-prop-stream-provider/provider.js +2 -2
- package/esm/providers/tambo-prop-stream-provider/streaming.d.ts +1 -1
- package/esm/providers/tambo-prop-stream-provider/streaming.js +2 -2
- package/esm/providers/tambo-prop-stream-provider/success.d.ts +1 -1
- package/esm/providers/tambo-prop-stream-provider/success.js +2 -2
- package/esm/providers/tambo-prop-stream-provider/types.d.ts +1 -1
- package/esm/providers/tambo-prop-stream-provider.test.js +4 -4
- package/esm/providers/tambo-provider.d.ts +10 -7
- package/esm/providers/tambo-provider.d.ts.map +1 -1
- package/esm/providers/tambo-provider.js +13 -10
- package/esm/providers/tambo-provider.js.map +1 -1
- package/esm/providers/tambo-registry-provider.d.ts +3 -3
- package/esm/providers/tambo-registry-provider.js +3 -3
- package/esm/providers/tambo-registry-provider.test.js +2 -2
- package/esm/providers/tambo-registry-schema-compat.test.js +2 -2
- package/esm/providers/tambo-stubs.d.ts +4 -4
- package/esm/providers/tambo-stubs.js +9 -9
- package/esm/providers/tambo-stubs.test.js +2 -2
- package/esm/providers/tambo-thread-input-provider.d.ts +2 -2
- package/esm/providers/tambo-thread-input-provider.d.ts.map +1 -1
- package/esm/providers/tambo-thread-input-provider.js +11 -10
- package/esm/providers/tambo-thread-input-provider.js.map +1 -1
- package/esm/providers/tambo-thread-provider-initial-messages.test.js +6 -6
- package/esm/providers/tambo-thread-provider.d.ts +2 -2
- package/esm/providers/tambo-thread-provider.js +8 -8
- package/esm/providers/tambo-thread-provider.test.js +7 -7
- package/esm/schema/index.d.ts +4 -4
- package/esm/schema/index.js +4 -4
- package/esm/schema/json-schema.test.js +1 -1
- package/esm/schema/schema.d.ts +1 -1
- package/esm/schema/schema.js +2 -2
- package/esm/schema/schema.test.js +3 -3
- package/esm/schema/standard-schema.test.js +1 -1
- package/esm/schema/validate.js +2 -2
- package/esm/schema/validate.test.js +1 -1
- package/esm/testing/tools.d.ts +3 -3
- package/esm/testing/tools.js +2 -2
- package/esm/util/content-parts.test.js +1 -1
- package/esm/util/generate-component.d.ts +2 -2
- package/esm/util/generate-component.js +4 -4
- package/esm/util/generate-component.test.js +2 -2
- package/esm/util/is-promise.test.js +1 -1
- package/esm/util/mcp-server-utils.d.ts +1 -1
- package/esm/util/mcp-server-utils.js +1 -1
- package/esm/util/mcp-server-utils.test.js +2 -2
- package/esm/util/message-builder.d.ts +1 -1
- package/esm/util/message-builder.test.js +1 -1
- package/esm/util/query-utils.test.js +1 -1
- package/esm/util/registry-validators.d.ts +1 -1
- package/esm/util/registry-validators.js +2 -2
- package/esm/util/registry-validators.test.js +1 -1
- package/esm/util/registry.d.ts +1 -1
- package/esm/util/registry.js +1 -1
- package/esm/util/registry.test.js +2 -2
- package/esm/util/resource-content-resolver.d.ts +2 -2
- package/esm/util/resource-content-resolver.d.ts.map +1 -1
- package/esm/util/resource-content-resolver.js +3 -1
- package/esm/util/resource-content-resolver.js.map +1 -1
- package/esm/util/resource-content-resolver.test.js +3 -3
- package/esm/util/resource-validators.d.ts +1 -1
- package/esm/util/resource-validators.test.js +1 -1
- package/esm/util/tool-caller.d.ts +1 -1
- package/esm/util/tool-caller.js +1 -1
- package/esm/util/validate-component-name.test.js +1 -1
- package/esm/v1/__tests__/v1-interactables.test.d.ts +2 -0
- package/esm/v1/__tests__/v1-interactables.test.d.ts.map +1 -0
- package/esm/v1/__tests__/v1-interactables.test.js +130 -0
- package/esm/v1/__tests__/v1-interactables.test.js.map +1 -0
- package/esm/v1/components/v1-component-renderer.d.ts +48 -0
- package/esm/v1/components/v1-component-renderer.d.ts.map +1 -0
- package/esm/v1/components/v1-component-renderer.js +100 -0
- package/esm/v1/components/v1-component-renderer.js.map +1 -0
- package/esm/v1/components/v1-component-renderer.test.d.ts +2 -0
- package/esm/v1/components/v1-component-renderer.test.d.ts.map +1 -0
- package/esm/v1/components/v1-component-renderer.test.js +265 -0
- package/esm/v1/components/v1-component-renderer.test.js.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-component-state.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-component-state.js +4 -27
- package/esm/v1/hooks/use-tambo-v1-component-state.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-component-state.test.js +6 -5
- package/esm/v1/hooks/use-tambo-v1-component-state.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-messages.d.ts +1 -1
- package/esm/v1/hooks/use-tambo-v1-messages.js +1 -1
- package/esm/v1/hooks/use-tambo-v1-messages.test.js +27 -3
- package/esm/v1/hooks/use-tambo-v1-messages.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-send-message.d.ts +20 -2
- package/esm/v1/hooks/use-tambo-v1-send-message.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-send-message.js +213 -26
- package/esm/v1/hooks/use-tambo-v1-send-message.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-send-message.test.js +266 -12
- package/esm/v1/hooks/use-tambo-v1-send-message.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-stream-status.d.ts +90 -0
- package/esm/v1/hooks/use-tambo-v1-stream-status.d.ts.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-stream-status.js +176 -0
- package/esm/v1/hooks/use-tambo-v1-stream-status.js.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-stream-status.test.d.ts +2 -0
- package/esm/v1/hooks/use-tambo-v1-stream-status.test.d.ts.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-stream-status.test.js +369 -0
- package/esm/v1/hooks/use-tambo-v1-stream-status.test.js.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-suggestions.d.ts +78 -54
- package/esm/v1/hooks/use-tambo-v1-suggestions.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-suggestions.js +157 -91
- package/esm/v1/hooks/use-tambo-v1-suggestions.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-suggestions.test.js +218 -139
- package/esm/v1/hooks/use-tambo-v1-suggestions.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-input.d.ts +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-input.js +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-input.test.js +151 -16
- package/esm/v1/hooks/use-tambo-v1-thread-input.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-list.d.ts +8 -21
- package/esm/v1/hooks/use-tambo-v1-thread-list.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-list.js +12 -11
- package/esm/v1/hooks/use-tambo-v1-thread-list.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-list.test.js +39 -4
- package/esm/v1/hooks/use-tambo-v1-thread-list.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread.d.ts +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread.js +3 -8
- package/esm/v1/hooks/use-tambo-v1-thread.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread.test.js +4 -2
- package/esm/v1/hooks/use-tambo-v1-thread.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1.d.ts +15 -31
- package/esm/v1/hooks/use-tambo-v1.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1.js +134 -34
- package/esm/v1/hooks/use-tambo-v1.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1.test.js +862 -19
- package/esm/v1/hooks/use-tambo-v1.test.js.map +1 -1
- package/esm/v1/index.d.ts +28 -22
- package/esm/v1/index.d.ts.map +1 -1
- package/esm/v1/index.js +30 -18
- package/esm/v1/index.js.map +1 -1
- package/esm/v1/providers/tambo-v1-provider.d.ts +21 -11
- package/esm/v1/providers/tambo-v1-provider.d.ts.map +1 -1
- package/esm/v1/providers/tambo-v1-provider.js +20 -25
- package/esm/v1/providers/tambo-v1-provider.js.map +1 -1
- package/esm/v1/providers/tambo-v1-provider.test.js +40 -26
- package/esm/v1/providers/tambo-v1-provider.test.js.map +1 -1
- package/esm/v1/providers/tambo-v1-stream-context.d.ts +4 -4
- package/esm/v1/providers/tambo-v1-stream-context.d.ts.map +1 -1
- package/esm/v1/providers/tambo-v1-stream-context.js +62 -14
- package/esm/v1/providers/tambo-v1-stream-context.js.map +1 -1
- package/esm/v1/providers/tambo-v1-stream-context.test.js +50 -21
- package/esm/v1/providers/tambo-v1-stream-context.test.js.map +1 -1
- package/esm/v1/providers/tambo-v1-stub-provider.d.ts +3 -3
- package/esm/v1/providers/tambo-v1-stub-provider.d.ts.map +1 -1
- package/esm/v1/providers/tambo-v1-stub-provider.js +7 -5
- package/esm/v1/providers/tambo-v1-stub-provider.js.map +1 -1
- package/esm/v1/providers/tambo-v1-stub-provider.test.js +12 -11
- package/esm/v1/providers/tambo-v1-stub-provider.test.js.map +1 -1
- package/esm/v1/providers/tambo-v1-thread-input-provider.d.ts +3 -8
- package/esm/v1/providers/tambo-v1-thread-input-provider.d.ts.map +1 -1
- package/esm/v1/providers/tambo-v1-thread-input-provider.js +18 -16
- package/esm/v1/providers/tambo-v1-thread-input-provider.js.map +1 -1
- package/esm/v1/types/event.d.ts +9 -1
- package/esm/v1/types/event.d.ts.map +1 -1
- package/esm/v1/types/event.js.map +1 -1
- package/esm/v1/types/event.test.js +6 -2
- package/esm/v1/types/event.test.js.map +1 -1
- package/esm/v1/types/message.d.ts +65 -7
- package/esm/v1/types/message.d.ts.map +1 -1
- package/esm/v1/types/message.js.map +1 -1
- package/esm/v1/types/thread.d.ts +5 -1
- package/esm/v1/types/thread.d.ts.map +1 -1
- package/esm/v1/types/thread.js.map +1 -1
- package/esm/v1/utils/component-renderer.test.js +1 -1
- package/esm/v1/utils/event-accumulator.d.ts +41 -5
- package/esm/v1/utils/event-accumulator.d.ts.map +1 -1
- package/esm/v1/utils/event-accumulator.js +444 -36
- package/esm/v1/utils/event-accumulator.js.map +1 -1
- package/esm/v1/utils/event-accumulator.test.js +1042 -29
- package/esm/v1/utils/event-accumulator.test.js.map +1 -1
- package/esm/v1/utils/json-patch.test.js +1 -1
- package/esm/v1/utils/registry-conversion.d.ts +9 -9
- package/esm/v1/utils/registry-conversion.d.ts.map +1 -1
- package/esm/v1/utils/registry-conversion.js +11 -12
- package/esm/v1/utils/registry-conversion.js.map +1 -1
- package/esm/v1/utils/registry-conversion.test.js +40 -12
- package/esm/v1/utils/registry-conversion.test.js.map +1 -1
- package/esm/v1/utils/stream-handler.test.js +1 -1
- package/esm/v1/utils/thread-utils.d.ts +16 -0
- package/esm/v1/utils/thread-utils.d.ts.map +1 -0
- package/esm/v1/utils/thread-utils.js +31 -0
- package/esm/v1/utils/thread-utils.js.map +1 -0
- package/esm/v1/utils/tool-call-tracker.d.ts +1 -1
- package/esm/v1/utils/tool-executor.d.ts +1 -1
- package/esm/v1/utils/tool-executor.d.ts.map +1 -1
- package/esm/v1/utils/tool-executor.js +2 -0
- package/esm/v1/utils/tool-executor.js.map +1 -1
- package/esm/v1/utils/tool-executor.test.js +6 -1
- package/esm/v1/utils/tool-executor.test.js.map +1 -1
- package/package.json +11 -10
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-tambo-v1-thread-list.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-thread-list.ts"],"names":[],"mappings":";AAAA,YAAY,CAAC;;
|
|
1
|
+
{"version":3,"file":"use-tambo-v1-thread-list.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-thread-list.ts"],"names":[],"mappings":";AAAA,YAAY,CAAC;;AA2Db,oDAsBC;AApED,iFAAuE;AACvE,qEAA8D;AAC9D,sEAAkE;AASlE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,SAAgB,oBAAoB,CAClC,WAA8B,EAC9B,YAGC;IAED,MAAM,MAAM,GAAG,IAAA,sCAAc,GAAE,CAAC;IAChC,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,IAAA,oCAAgB,GAAE,CAAC;IAEvD,sFAAsF;IACtF,MAAM,gBAAgB,GACpB,CAAC,WAAW,EAAE,OAAO,IAAI,cAAc,CAAC;QACtC,CAAC,CAAC,EAAE,GAAG,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,IAAI,cAAc,EAAE;QACrE,CAAC,CAAC,WAAW,CAAC;IAElB,OAAO,IAAA,iCAAa,EAAC;QACnB,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,gBAAgB,CAAC;QAClD,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC;QAChE,SAAS,EAAE,IAAI,EAAE,0BAA0B;QAC3C,GAAG,YAAY;KAChB,CAAC,CAAC;AACL,CAAC","sourcesContent":["\"use client\";\n\n/**\n * Thread List Query Hook for v1 API\n *\n * React Query hook for fetching a list of threads.\n */\n\nimport type { UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n ThreadListParams,\n ThreadListResponse,\n} from \"@tambo-ai/typescript-sdk/resources/threads/threads\";\nimport { useTamboClient } from \"../../providers/tambo-client-provider\";\nimport { useTamboQuery } from \"../../hooks/react-query-hooks\";\nimport { useTamboV1Config } from \"../providers/tambo-v1-provider\";\n\n/**\n * Options for fetching thread list.\n * Re-exported from SDK for convenience.\n * Note: userKey can also be provided via TamboV1Provider context.\n */\nexport type { ThreadListParams as ThreadListOptions };\n\n/**\n * Hook to fetch a list of threads.\n *\n * Uses React Query for caching and automatic refetching.\n * Threads are considered stale after 5 seconds.\n *\n * Returns the thread list directly from the SDK with no transformation.\n * Each thread includes runStatus, metadata, and all SDK fields.\n * @param listOptions - Filtering and pagination options\n * @param queryOptions - Additional React Query options\n * @returns React Query query object with thread list\n * @example\n * ```tsx\n * function ThreadList({ userKey }: { userKey?: string }) {\n * const { data, isLoading, isError } = useTamboV1ThreadList({\n * userKey,\n * limit: 20,\n * });\n *\n * if (isLoading) return <Spinner />;\n * if (isError) return <Error />;\n *\n * return (\n * <ul>\n * {data.threads.map(thread => (\n * <li key={thread.id}>\n * {thread.id} - {thread.runStatus}\n * </li>\n * ))}\n * {data.hasMore && <LoadMoreButton cursor={data.nextCursor} />}\n * </ul>\n * );\n * }\n * ```\n */\nexport function useTamboV1ThreadList(\n listOptions?: ThreadListParams,\n queryOptions?: Omit<\n UseQueryOptions<ThreadListResponse>,\n \"queryKey\" | \"queryFn\"\n >,\n) {\n const client = useTamboClient();\n const { userKey: contextUserKey } = useTamboV1Config();\n\n // Merge userKey from context with provided options (explicit option takes precedence)\n const effectiveOptions: ThreadListParams | undefined =\n (listOptions?.userKey ?? contextUserKey)\n ? { ...listOptions, userKey: listOptions?.userKey ?? contextUserKey }\n : listOptions;\n\n return useTamboQuery({\n queryKey: [\"v1-threads\", \"list\", effectiveOptions],\n queryFn: async () => await client.threads.list(effectiveOptions),\n staleTime: 5000, // Consider stale after 5s\n ...queryOptions,\n });\n}\n"]}
|
|
@@ -7,9 +7,14 @@ const react_query_1 = require("@tanstack/react-query");
|
|
|
7
7
|
const react_1 = require("@testing-library/react");
|
|
8
8
|
const react_2 = __importDefault(require("react"));
|
|
9
9
|
const tambo_client_provider_1 = require("../../providers/tambo-client-provider");
|
|
10
|
+
const tambo_v1_provider_1 = require("../providers/tambo-v1-provider");
|
|
10
11
|
const use_tambo_v1_thread_list_1 = require("./use-tambo-v1-thread-list");
|
|
11
12
|
jest.mock("../../providers/tambo-client-provider", () => ({
|
|
12
13
|
useTamboClient: jest.fn(),
|
|
14
|
+
useTamboQueryClient: jest.fn(),
|
|
15
|
+
}));
|
|
16
|
+
jest.mock("../providers/tambo-v1-provider", () => ({
|
|
17
|
+
useTamboV1Config: jest.fn(),
|
|
13
18
|
}));
|
|
14
19
|
describe("useTamboV1ThreadList", () => {
|
|
15
20
|
const mockThreads = {
|
|
@@ -41,6 +46,8 @@ describe("useTamboV1ThreadList", () => {
|
|
|
41
46
|
},
|
|
42
47
|
});
|
|
43
48
|
jest.mocked(tambo_client_provider_1.useTamboClient).mockReturnValue(mockTamboAI);
|
|
49
|
+
jest.mocked(tambo_client_provider_1.useTamboQueryClient).mockReturnValue(queryClient);
|
|
50
|
+
jest.mocked(tambo_v1_provider_1.useTamboV1Config).mockReturnValue({ userKey: undefined });
|
|
44
51
|
mockThreadsApi.list.mockReset();
|
|
45
52
|
});
|
|
46
53
|
it("fetches thread list", async () => {
|
|
@@ -57,14 +64,14 @@ describe("useTamboV1ThreadList", () => {
|
|
|
57
64
|
mockThreadsApi.list.mockResolvedValue(mockThreads);
|
|
58
65
|
const { result } = (0, react_1.renderHook)(() => (0, use_tambo_v1_thread_list_1.useTamboV1ThreadList)({
|
|
59
66
|
userKey: "test-context",
|
|
60
|
-
limit:
|
|
67
|
+
limit: 10,
|
|
61
68
|
}), { wrapper: TestWrapper });
|
|
62
69
|
await (0, react_1.waitFor)(() => {
|
|
63
70
|
expect(result.current.data).toEqual(mockThreads);
|
|
64
71
|
});
|
|
65
72
|
expect(mockThreadsApi.list).toHaveBeenCalledWith({
|
|
66
73
|
userKey: "test-context",
|
|
67
|
-
limit:
|
|
74
|
+
limit: 10,
|
|
68
75
|
});
|
|
69
76
|
});
|
|
70
77
|
it("handles loading state", async () => {
|
|
@@ -94,5 +101,33 @@ describe("useTamboV1ThreadList", () => {
|
|
|
94
101
|
expect(result.current.error).toBe(mockError);
|
|
95
102
|
});
|
|
96
103
|
});
|
|
104
|
+
it("uses userKey from config when not provided in options", async () => {
|
|
105
|
+
mockThreadsApi.list.mockResolvedValue(mockThreads);
|
|
106
|
+
jest
|
|
107
|
+
.mocked(tambo_v1_provider_1.useTamboV1Config)
|
|
108
|
+
.mockReturnValue({ userKey: "config-user-key" });
|
|
109
|
+
const { result } = (0, react_1.renderHook)(() => (0, use_tambo_v1_thread_list_1.useTamboV1ThreadList)(), {
|
|
110
|
+
wrapper: TestWrapper,
|
|
111
|
+
});
|
|
112
|
+
await (0, react_1.waitFor)(() => {
|
|
113
|
+
expect(result.current.data).toEqual(mockThreads);
|
|
114
|
+
});
|
|
115
|
+
expect(mockThreadsApi.list).toHaveBeenCalledWith({
|
|
116
|
+
userKey: "config-user-key",
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
it("prefers explicit userKey over config userKey", async () => {
|
|
120
|
+
mockThreadsApi.list.mockResolvedValue(mockThreads);
|
|
121
|
+
jest
|
|
122
|
+
.mocked(tambo_v1_provider_1.useTamboV1Config)
|
|
123
|
+
.mockReturnValue({ userKey: "config-user-key" });
|
|
124
|
+
const { result } = (0, react_1.renderHook)(() => (0, use_tambo_v1_thread_list_1.useTamboV1ThreadList)({ userKey: "explicit-user-key" }), { wrapper: TestWrapper });
|
|
125
|
+
await (0, react_1.waitFor)(() => {
|
|
126
|
+
expect(result.current.data).toEqual(mockThreads);
|
|
127
|
+
});
|
|
128
|
+
expect(mockThreadsApi.list).toHaveBeenCalledWith({
|
|
129
|
+
userKey: "explicit-user-key",
|
|
130
|
+
});
|
|
131
|
+
});
|
|
97
132
|
});
|
|
98
133
|
//# sourceMappingURL=use-tambo-v1-thread-list.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-tambo-v1-thread-list.test.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-thread-list.test.tsx"],"names":[],"mappings":";;;;;AACA,uDAAyE;AACzE,kDAA6D;AAC7D,kDAA0B;AAC1B,
|
|
1
|
+
{"version":3,"file":"use-tambo-v1-thread-list.test.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-thread-list.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import TamboAI from \"@tambo-ai/typescript-sdk\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { renderHook, waitFor } from \"@testing-library/react\";\nimport React from \"react\";\nimport {\n useTamboClient,\n useTamboQueryClient,\n} from \"../../providers/tambo-client-provider\";\nimport { useTamboV1Config } from \"../providers/tambo-v1-provider\";\nimport { useTamboV1ThreadList } from \"./use-tambo-v1-thread-list\";\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\ndescribe(\"useTamboV1ThreadList\", () => {\n const mockThreads = {\n threads: [\n { id: \"thread_1\", runStatus: \"idle\" },\n { id: \"thread_2\", runStatus: \"complete\" },\n ],\n hasMore: false,\n nextCursor: undefined,\n };\n\n const mockThreadsApi = {\n retrieve: jest.fn(),\n list: jest.fn(),\n };\n\n const mockTamboAI = {\n apiKey: \"\",\n threads: mockThreadsApi,\n } as unknown as TamboAI;\n\n let queryClient: QueryClient;\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>\n );\n }\n\n beforeEach(() => {\n queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n retry: false,\n },\n },\n });\n jest.mocked(useTamboClient).mockReturnValue(mockTamboAI);\n jest.mocked(useTamboQueryClient).mockReturnValue(queryClient);\n jest.mocked(useTamboV1Config).mockReturnValue({ userKey: undefined });\n mockThreadsApi.list.mockReset();\n });\n\n it(\"fetches thread list\", async () => {\n mockThreadsApi.list.mockResolvedValue(mockThreads);\n\n const { result } = renderHook(() => useTamboV1ThreadList(), {\n wrapper: TestWrapper,\n });\n\n await waitFor(() => {\n expect(result.current.data).toEqual(mockThreads);\n });\n\n expect(mockThreadsApi.list).toHaveBeenCalledWith(undefined);\n });\n\n it(\"passes list options to API\", async () => {\n mockThreadsApi.list.mockResolvedValue(mockThreads);\n\n const { result } = renderHook(\n () =>\n useTamboV1ThreadList({\n userKey: \"test-context\",\n limit: 10,\n }),\n { wrapper: TestWrapper },\n );\n\n await waitFor(() => {\n expect(result.current.data).toEqual(mockThreads);\n });\n\n expect(mockThreadsApi.list).toHaveBeenCalledWith({\n userKey: \"test-context\",\n limit: 10,\n });\n });\n\n it(\"handles loading state\", async () => {\n let resolvePromise: (value: unknown) => void;\n const promise = new Promise((resolve) => {\n resolvePromise = resolve;\n });\n mockThreadsApi.list.mockReturnValue(promise);\n\n const { result } = renderHook(() => useTamboV1ThreadList(), {\n wrapper: TestWrapper,\n });\n\n expect(result.current.isLoading).toBe(true);\n expect(result.current.data).toBeUndefined();\n\n resolvePromise!(mockThreads);\n await waitFor(() => {\n expect(result.current.isLoading).toBe(false);\n });\n });\n\n it(\"handles error state\", async () => {\n const mockError = new Error(\"Failed to fetch threads\");\n mockThreadsApi.list.mockRejectedValue(mockError);\n\n const { result } = renderHook(() => useTamboV1ThreadList(), {\n wrapper: TestWrapper,\n });\n\n await waitFor(() => {\n expect(result.current.isError).toBe(true);\n expect(result.current.error).toBe(mockError);\n });\n });\n\n it(\"uses userKey from config when not provided in options\", async () => {\n mockThreadsApi.list.mockResolvedValue(mockThreads);\n jest\n .mocked(useTamboV1Config)\n .mockReturnValue({ userKey: \"config-user-key\" });\n\n const { result } = renderHook(() => useTamboV1ThreadList(), {\n wrapper: TestWrapper,\n });\n\n await waitFor(() => {\n expect(result.current.data).toEqual(mockThreads);\n });\n\n expect(mockThreadsApi.list).toHaveBeenCalledWith({\n userKey: \"config-user-key\",\n });\n });\n\n it(\"prefers explicit userKey over config userKey\", async () => {\n mockThreadsApi.list.mockResolvedValue(mockThreads);\n jest\n .mocked(useTamboV1Config)\n .mockReturnValue({ userKey: \"config-user-key\" });\n\n const { result } = renderHook(\n () => useTamboV1ThreadList({ userKey: \"explicit-user-key\" }),\n { wrapper: TestWrapper },\n );\n\n await waitFor(() => {\n expect(result.current.data).toEqual(mockThreads);\n });\n\n expect(mockThreadsApi.list).toHaveBeenCalledWith({\n userKey: \"explicit-user-key\",\n });\n });\n});\n"]}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* React Query hook for fetching a single thread.
|
|
5
5
|
*/
|
|
6
|
-
import {
|
|
6
|
+
import type { UseQueryOptions } from "@tanstack/react-query";
|
|
7
7
|
import type { ThreadRetrieveResponse } from "@tambo-ai/typescript-sdk/resources/threads/threads";
|
|
8
8
|
/**
|
|
9
9
|
* Hook to fetch a single thread by ID.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-tambo-v1-thread.d.ts","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-thread.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"use-tambo-v1-thread.d.ts","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-thread.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oDAAoD,CAAC;AAIjG;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,IAAI,CACZ,eAAe,CAAC,sBAAsB,CAAC,EACvC,UAAU,GAAG,SAAS,CACvB,iFAUF"}
|
|
@@ -2,13 +2,8 @@
|
|
|
2
2
|
"use client";
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
4
|
exports.useTamboV1Thread = useTamboV1Thread;
|
|
5
|
-
/**
|
|
6
|
-
* Thread Query Hook for v1 API
|
|
7
|
-
*
|
|
8
|
-
* React Query hook for fetching a single thread.
|
|
9
|
-
*/
|
|
10
|
-
const react_query_1 = require("@tanstack/react-query");
|
|
11
5
|
const tambo_client_provider_1 = require("../../providers/tambo-client-provider");
|
|
6
|
+
const react_query_hooks_1 = require("../../hooks/react-query-hooks");
|
|
12
7
|
/**
|
|
13
8
|
* Hook to fetch a single thread by ID.
|
|
14
9
|
*
|
|
@@ -39,7 +34,7 @@ const tambo_client_provider_1 = require("../../providers/tambo-client-provider")
|
|
|
39
34
|
*/
|
|
40
35
|
function useTamboV1Thread(threadId, options) {
|
|
41
36
|
const client = (0, tambo_client_provider_1.useTamboClient)();
|
|
42
|
-
return (0,
|
|
37
|
+
return (0, react_query_hooks_1.useTamboQuery)({
|
|
43
38
|
queryKey: ["v1-threads", threadId],
|
|
44
39
|
queryFn: async () => await client.threads.retrieve(threadId),
|
|
45
40
|
staleTime: 1000, // Consider stale after 1s (real-time data)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-tambo-v1-thread.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-thread.ts"],"names":[],"mappings":";AAAA,YAAY,CAAC;;
|
|
1
|
+
{"version":3,"file":"use-tambo-v1-thread.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-thread.ts"],"names":[],"mappings":";AAAA,YAAY,CAAC;;AAyCb,4CAeC;AA9CD,iFAAuE;AACvE,qEAA8D;AAE9D;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,SAAgB,gBAAgB,CAC9B,QAAgB,EAChB,OAGC;IAED,MAAM,MAAM,GAAG,IAAA,sCAAc,GAAE,CAAC;IAEhC,OAAO,IAAA,iCAAa,EAAC;QACnB,QAAQ,EAAE,CAAC,YAAY,EAAE,QAAQ,CAAC;QAClC,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC5D,SAAS,EAAE,IAAI,EAAE,2CAA2C;QAC5D,GAAG,OAAO;KACX,CAAC,CAAC;AACL,CAAC","sourcesContent":["\"use client\";\n\n/**\n * Thread Query Hook for v1 API\n *\n * React Query hook for fetching a single thread.\n */\n\nimport type { UseQueryOptions } from \"@tanstack/react-query\";\nimport type { ThreadRetrieveResponse } from \"@tambo-ai/typescript-sdk/resources/threads/threads\";\nimport { useTamboClient } from \"../../providers/tambo-client-provider\";\nimport { useTamboQuery } from \"../../hooks/react-query-hooks\";\n\n/**\n * Hook to fetch a single thread by ID.\n *\n * Uses React Query for caching and automatic refetching.\n * Thread data is considered stale after 1 second (real-time data).\n *\n * Returns the thread with all its messages and current run status directly\n * from the SDK with no transformation.\n * @param threadId - Thread ID to fetch\n * @param options - Additional React Query options\n * @returns React Query query object with thread data\n * @example\n * ```tsx\n * function ThreadView({ threadId }: { threadId: string }) {\n * const { data: thread, isLoading, isError } = useTamboV1Thread(threadId);\n *\n * if (isLoading) return <Spinner />;\n * if (isError) return <Error />;\n *\n * return (\n * <div>\n * <div>Status: {thread.runStatus}</div>\n * {thread.messages.map(msg => <Message key={msg.id} message={msg} />)}\n * </div>\n * );\n * }\n * ```\n */\nexport function useTamboV1Thread(\n threadId: string,\n options?: Omit<\n UseQueryOptions<ThreadRetrieveResponse>,\n \"queryKey\" | \"queryFn\"\n >,\n) {\n const client = useTamboClient();\n\n return useTamboQuery({\n queryKey: [\"v1-threads\", threadId],\n queryFn: async () => await client.threads.retrieve(threadId),\n staleTime: 1000, // Consider stale after 1s (real-time data)\n ...options,\n });\n}\n"]}
|
|
@@ -10,6 +10,7 @@ const tambo_client_provider_1 = require("../../providers/tambo-client-provider")
|
|
|
10
10
|
const use_tambo_v1_thread_1 = require("./use-tambo-v1-thread");
|
|
11
11
|
jest.mock("../../providers/tambo-client-provider", () => ({
|
|
12
12
|
useTamboClient: jest.fn(),
|
|
13
|
+
useTamboQueryClient: jest.fn(),
|
|
13
14
|
}));
|
|
14
15
|
describe("useTamboV1Thread", () => {
|
|
15
16
|
const mockThread = {
|
|
@@ -40,6 +41,7 @@ describe("useTamboV1Thread", () => {
|
|
|
40
41
|
},
|
|
41
42
|
});
|
|
42
43
|
jest.mocked(tambo_client_provider_1.useTamboClient).mockReturnValue(mockTamboAI);
|
|
44
|
+
jest.mocked(tambo_client_provider_1.useTamboQueryClient).mockReturnValue(queryClient);
|
|
43
45
|
mockThreadsApi.retrieve.mockReset();
|
|
44
46
|
});
|
|
45
47
|
it("fetches thread by ID", async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-tambo-v1-thread.test.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-thread.test.tsx"],"names":[],"mappings":";;;;;AACA,uDAAyE;AACzE,kDAA6D;AAC7D,kDAA0B;AAC1B,
|
|
1
|
+
{"version":3,"file":"use-tambo-v1-thread.test.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-thread.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import TamboAI from \"@tambo-ai/typescript-sdk\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { renderHook, waitFor } from \"@testing-library/react\";\nimport React from \"react\";\nimport {\n useTamboClient,\n useTamboQueryClient,\n} from \"../../providers/tambo-client-provider\";\nimport { useTamboV1Thread } from \"./use-tambo-v1-thread\";\n\njest.mock(\"../../providers/tambo-client-provider\", () => ({\n useTamboClient: jest.fn(),\n useTamboQueryClient: jest.fn(),\n}));\n\ndescribe(\"useTamboV1Thread\", () => {\n const mockThread = {\n id: \"thread_123\",\n runStatus: \"idle\",\n messages: [],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n updatedAt: \"2024-01-01T00:00:00.000Z\",\n };\n\n const mockThreadsApi = {\n retrieve: jest.fn(),\n list: jest.fn(),\n };\n\n const mockTamboAI = {\n apiKey: \"\",\n threads: mockThreadsApi,\n } as unknown as TamboAI;\n\n let queryClient: QueryClient;\n\n function TestWrapper({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>\n );\n }\n\n beforeEach(() => {\n queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n retry: false,\n },\n },\n });\n jest.mocked(useTamboClient).mockReturnValue(mockTamboAI);\n jest.mocked(useTamboQueryClient).mockReturnValue(queryClient);\n mockThreadsApi.retrieve.mockReset();\n });\n\n it(\"fetches thread by ID\", async () => {\n mockThreadsApi.retrieve.mockResolvedValue(mockThread);\n\n const { result } = renderHook(() => useTamboV1Thread(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n await waitFor(() => {\n expect(result.current.data).toEqual(mockThread);\n });\n\n expect(mockThreadsApi.retrieve).toHaveBeenCalledWith(\"thread_123\");\n });\n\n it(\"handles loading state\", async () => {\n let resolvePromise: (value: unknown) => void;\n const promise = new Promise((resolve) => {\n resolvePromise = resolve;\n });\n mockThreadsApi.retrieve.mockReturnValue(promise);\n\n const { result } = renderHook(() => useTamboV1Thread(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n expect(result.current.isLoading).toBe(true);\n expect(result.current.data).toBeUndefined();\n\n resolvePromise!(mockThread);\n await waitFor(() => {\n expect(result.current.isLoading).toBe(false);\n });\n });\n\n it(\"handles error state\", async () => {\n const mockError = new Error(\"Thread not found\");\n mockThreadsApi.retrieve.mockRejectedValue(mockError);\n\n const { result } = renderHook(() => useTamboV1Thread(\"thread_123\"), {\n wrapper: TestWrapper,\n });\n\n await waitFor(() => {\n expect(result.current.isError).toBe(true);\n expect(result.current.error).toBe(mockError);\n });\n });\n});\n"]}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type TamboAI from "@tambo-ai/typescript-sdk";
|
|
2
2
|
import { type TamboRegistryContext as TamboRegistryContextType } from "../../providers/tambo-registry-provider";
|
|
3
3
|
import { useStreamDispatch, type ThreadManagement } from "../providers/tambo-v1-stream-context";
|
|
4
|
-
import type { StreamingState } from "../types/thread";
|
|
5
4
|
import type { TamboV1Message } from "../types/message";
|
|
6
|
-
import type {
|
|
5
|
+
import type { StreamingState } from "../types/thread";
|
|
6
|
+
import { type ThreadState } from "../utils/event-accumulator";
|
|
7
7
|
/**
|
|
8
8
|
* Return type for useTamboV1 hook
|
|
9
9
|
*/
|
|
@@ -57,9 +57,9 @@ export interface UseTamboV1Return {
|
|
|
57
57
|
*/
|
|
58
58
|
toolRegistry: TamboRegistryContextType["toolRegistry"];
|
|
59
59
|
/**
|
|
60
|
-
* Current thread ID (
|
|
60
|
+
* Current thread ID (always available - uses "placeholder" for new threads)
|
|
61
61
|
*/
|
|
62
|
-
currentThreadId: string
|
|
62
|
+
currentThreadId: string;
|
|
63
63
|
/**
|
|
64
64
|
* Initialize a new thread in the stream context
|
|
65
65
|
*/
|
|
@@ -76,32 +76,16 @@ export interface UseTamboV1Return {
|
|
|
76
76
|
* Dispatch function for stream events (advanced usage)
|
|
77
77
|
*/
|
|
78
78
|
dispatch: ReturnType<typeof useStreamDispatch>;
|
|
79
|
+
/**
|
|
80
|
+
* Cancel the current run on this thread.
|
|
81
|
+
* Optimistically updates local state and sends cancellation request to the API.
|
|
82
|
+
* No-op if there's no active run or thread is a placeholder.
|
|
83
|
+
*/
|
|
84
|
+
cancelRun: () => Promise<void>;
|
|
79
85
|
}
|
|
80
86
|
/**
|
|
81
|
-
* Main hook for accessing Tambo v1 functionality.
|
|
82
|
-
*
|
|
83
|
-
* Combines thread state, streaming status, registry, and client
|
|
84
|
-
* into a single convenient hook.
|
|
85
|
-
* @param threadId - Optional thread ID to get state for
|
|
86
|
-
* @returns Combined v1 context with thread state and utilities
|
|
87
|
-
* @example
|
|
88
|
-
* ```tsx
|
|
89
|
-
* function ChatInterface() {
|
|
90
|
-
* const {
|
|
91
|
-
* thread,
|
|
92
|
-
* messages,
|
|
93
|
-
* isStreaming,
|
|
94
|
-
* registerComponent,
|
|
95
|
-
* } = useTamboV1('thread_123');
|
|
96
87
|
*
|
|
97
|
-
*
|
|
98
|
-
* <div>
|
|
99
|
-
* {messages.map(msg => <Message key={msg.id} message={msg} />)}
|
|
100
|
-
* {isStreaming && <LoadingIndicator />}
|
|
101
|
-
* </div>
|
|
102
|
-
* );
|
|
103
|
-
* }
|
|
104
|
-
* ```
|
|
88
|
+
* @returns The combined Tambo context
|
|
105
89
|
*/
|
|
106
|
-
export declare function useTamboV1(
|
|
90
|
+
export declare function useTamboV1(): UseTamboV1Return;
|
|
107
91
|
//# sourceMappingURL=use-tambo-v1.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-tambo-v1.d.ts","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"use-tambo-v1.d.ts","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAC;AASpD,OAAO,EAEL,KAAK,oBAAoB,IAAI,wBAAwB,EACtD,MAAM,yCAAyC,CAAC;AAEjD,OAAO,EACL,iBAAiB,EAGjB,KAAK,gBAAgB,EACtB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAGV,cAAc,EAEf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAEL,KAAK,WAAW,EACjB,MAAM,4BAA4B,CAAC;AAEpC;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,MAAM,EAAE,OAAO,CAAC;IAEhB;;OAEG;IACH,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC;IAEhC;;OAEG;IACH,QAAQ,EAAE,cAAc,EAAE,CAAC;IAE3B;;OAEG;IACH,cAAc,EAAE,cAAc,CAAC;IAE/B;;OAEG;IACH,WAAW,EAAE,OAAO,CAAC;IAErB;;OAEG;IACH,SAAS,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,MAAM,EAAE,OAAO,CAAC;IAEhB;;OAEG;IACH,iBAAiB,EAAE,wBAAwB,CAAC,mBAAmB,CAAC,CAAC;IAEjE;;OAEG;IACH,YAAY,EAAE,wBAAwB,CAAC,cAAc,CAAC,CAAC;IAEvD;;OAEG;IACH,aAAa,EAAE,wBAAwB,CAAC,eAAe,CAAC,CAAC;IAEzD;;OAEG;IACH,aAAa,EAAE,wBAAwB,CAAC,eAAe,CAAC,CAAC;IAEzD;;OAEG;IACH,YAAY,EAAE,wBAAwB,CAAC,cAAc,CAAC,CAAC;IAEvD;;OAEG;IACH,eAAe,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,UAAU,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAE3C;;OAEG;IACH,YAAY,EAAE,gBAAgB,CAAC,cAAc,CAAC,CAAC;IAE/C;;OAEG;IACH,cAAc,EAAE,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;IAEnD;;OAEG;IACH,QAAQ,EAAE,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;IAE/C;;;;OAIG;IACH,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC;AAwCD;;;GAGG;AACH,wBAAgB,UAAU,IAAI,gBAAgB,CA2L7C"}
|
|
@@ -1,5 +1,38 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
"use client";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
3
36
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
37
|
exports.useTamboV1 = useTamboV1;
|
|
5
38
|
/**
|
|
@@ -8,54 +41,152 @@ exports.useTamboV1 = useTamboV1;
|
|
|
8
41
|
* Combines all v1 contexts into a single hook for convenient access
|
|
9
42
|
* to thread state, streaming status, registry, and client.
|
|
10
43
|
*/
|
|
11
|
-
const
|
|
44
|
+
const core_1 = require("@ag-ui/core");
|
|
45
|
+
const react_1 = __importStar(require("react"));
|
|
12
46
|
const tambo_client_provider_1 = require("../../providers/tambo-client-provider");
|
|
13
47
|
const tambo_registry_provider_1 = require("../../providers/tambo-registry-provider");
|
|
48
|
+
const v1_component_renderer_1 = require("../components/v1-component-renderer");
|
|
14
49
|
const tambo_v1_stream_context_1 = require("../providers/tambo-v1-stream-context");
|
|
50
|
+
const event_accumulator_1 = require("../utils/event-accumulator");
|
|
15
51
|
/**
|
|
16
|
-
* Main hook for accessing Tambo v1 functionality.
|
|
17
|
-
*
|
|
18
|
-
* Combines thread state, streaming status, registry, and client
|
|
19
|
-
* into a single convenient hook.
|
|
20
|
-
* @param threadId - Optional thread ID to get state for
|
|
21
|
-
* @returns Combined v1 context with thread state and utilities
|
|
22
|
-
* @example
|
|
23
|
-
* ```tsx
|
|
24
|
-
* function ChatInterface() {
|
|
25
|
-
* const {
|
|
26
|
-
* thread,
|
|
27
|
-
* messages,
|
|
28
|
-
* isStreaming,
|
|
29
|
-
* registerComponent,
|
|
30
|
-
* } = useTamboV1('thread_123');
|
|
31
52
|
*
|
|
32
|
-
*
|
|
33
|
-
* <div>
|
|
34
|
-
* {messages.map(msg => <Message key={msg.id} message={msg} />)}
|
|
35
|
-
* {isStreaming && <LoadingIndicator />}
|
|
36
|
-
* </div>
|
|
37
|
-
* );
|
|
38
|
-
* }
|
|
39
|
-
* ```
|
|
53
|
+
* @returns The combined Tambo context
|
|
40
54
|
*/
|
|
41
|
-
function useTamboV1(
|
|
55
|
+
function useTamboV1() {
|
|
42
56
|
const client = (0, tambo_client_provider_1.useTamboClient)();
|
|
43
57
|
const streamState = (0, tambo_v1_stream_context_1.useStreamState)();
|
|
44
58
|
const dispatch = (0, tambo_v1_stream_context_1.useStreamDispatch)();
|
|
45
59
|
const registry = (0, react_1.useContext)(tambo_registry_provider_1.TamboRegistryContext);
|
|
46
60
|
const threadManagement = (0, tambo_v1_stream_context_1.useThreadManagement)();
|
|
47
|
-
//
|
|
48
|
-
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
61
|
+
// Cache for rendered component wrappers - maintains stable element references
|
|
62
|
+
// across renders when props haven't changed
|
|
63
|
+
const componentCacheRef = (0, react_1.useRef)(new Map());
|
|
64
|
+
// Get thread state for the current thread
|
|
65
|
+
const threadState = streamState.threadMap[streamState.currentThreadId];
|
|
66
|
+
// Cancel the current run on this thread
|
|
67
|
+
const cancelRun = (0, react_1.useCallback)(async () => {
|
|
68
|
+
const runId = threadState?.streaming.runId;
|
|
69
|
+
const threadId = streamState.currentThreadId;
|
|
70
|
+
// No-op if there's no active run or thread is a placeholder
|
|
71
|
+
if (!runId || (0, event_accumulator_1.isPlaceholderThreadId)(threadId)) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
// Optimistically update local state with RUN_ERROR event
|
|
75
|
+
dispatch({
|
|
76
|
+
type: "EVENT",
|
|
77
|
+
threadId,
|
|
78
|
+
event: {
|
|
79
|
+
type: core_1.EventType.RUN_ERROR,
|
|
80
|
+
message: "Run cancelled",
|
|
81
|
+
code: "CANCELLED",
|
|
82
|
+
timestamp: Date.now(),
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
// Call API to cancel the run
|
|
86
|
+
try {
|
|
87
|
+
await client.threads.runs.delete(runId, { threadId });
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
// Log but don't rethrow - local state is already updated
|
|
91
|
+
console.warn("Failed to cancel run on server:", error);
|
|
92
|
+
}
|
|
93
|
+
}, [
|
|
94
|
+
client,
|
|
95
|
+
streamState.currentThreadId,
|
|
96
|
+
threadState?.streaming.runId,
|
|
97
|
+
dispatch,
|
|
98
|
+
]);
|
|
52
99
|
// Memoize the return object to prevent unnecessary re-renders
|
|
53
100
|
return (0, react_1.useMemo)(() => {
|
|
54
101
|
const thread = threadState;
|
|
55
|
-
const
|
|
102
|
+
const rawMessages = thread?.thread.messages ?? [];
|
|
56
103
|
const streamingState = thread?.streaming ?? {
|
|
57
104
|
status: "idle",
|
|
58
105
|
};
|
|
106
|
+
// Build a set of tool_use IDs that have completed (have a matching tool_result)
|
|
107
|
+
// We need to look across all messages since tool_result might be in a different message
|
|
108
|
+
const completedToolIds = new Set();
|
|
109
|
+
for (const msg of rawMessages) {
|
|
110
|
+
for (const content of msg.content) {
|
|
111
|
+
if (content.type === "tool_result") {
|
|
112
|
+
completedToolIds.add(content.toolUseId);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Transform messages to add computed properties to content blocks
|
|
117
|
+
const messages = rawMessages.map((message) => {
|
|
118
|
+
const transformedContent = message.content.map((content) => {
|
|
119
|
+
// Transform tool_use content to add computed state
|
|
120
|
+
if (content.type === "tool_use") {
|
|
121
|
+
const hasCompleted = completedToolIds.has(content.id);
|
|
122
|
+
const input = content.input ?? {};
|
|
123
|
+
// Extract Tambo display props from input
|
|
124
|
+
const tamboDisplayProps = {
|
|
125
|
+
_tambo_displayMessage: typeof input._tambo_displayMessage === "string"
|
|
126
|
+
? input._tambo_displayMessage
|
|
127
|
+
: undefined,
|
|
128
|
+
_tambo_statusMessage: typeof input._tambo_statusMessage === "string"
|
|
129
|
+
? input._tambo_statusMessage
|
|
130
|
+
: undefined,
|
|
131
|
+
_tambo_completionStatusMessage: typeof input._tambo_completionStatusMessage === "string"
|
|
132
|
+
? input._tambo_completionStatusMessage
|
|
133
|
+
: undefined,
|
|
134
|
+
};
|
|
135
|
+
// Compute status message based on completion state
|
|
136
|
+
const statusMessage = hasCompleted
|
|
137
|
+
? (tamboDisplayProps._tambo_completionStatusMessage ??
|
|
138
|
+
`Called ${content.name}`)
|
|
139
|
+
: (tamboDisplayProps._tambo_statusMessage ??
|
|
140
|
+
`Calling ${content.name}`);
|
|
141
|
+
// Filter out _tambo_* properties from input - consumers only see actual tool params
|
|
142
|
+
const cleanInput = {};
|
|
143
|
+
for (const [key, value] of Object.entries(input)) {
|
|
144
|
+
if (!key.startsWith("_tambo_")) {
|
|
145
|
+
cleanInput[key] = value;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
const v1Content = {
|
|
149
|
+
...content,
|
|
150
|
+
input: cleanInput,
|
|
151
|
+
hasCompleted,
|
|
152
|
+
statusMessage,
|
|
153
|
+
tamboDisplayProps,
|
|
154
|
+
};
|
|
155
|
+
return v1Content;
|
|
156
|
+
}
|
|
157
|
+
if (content.type !== "component") {
|
|
158
|
+
return content;
|
|
159
|
+
}
|
|
160
|
+
const componentContent = content;
|
|
161
|
+
const propsJson = JSON.stringify(componentContent.props ?? {});
|
|
162
|
+
const cache = componentCacheRef.current;
|
|
163
|
+
const cached = cache.get(componentContent.id);
|
|
164
|
+
// Return cached element if props haven't changed
|
|
165
|
+
if (cached?.propsJson === propsJson) {
|
|
166
|
+
return {
|
|
167
|
+
...componentContent,
|
|
168
|
+
renderedComponent: cached.element,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
// Create new wrapper element
|
|
172
|
+
const element = react_1.default.createElement(v1_component_renderer_1.V1ComponentRenderer, {
|
|
173
|
+
key: componentContent.id,
|
|
174
|
+
content: componentContent,
|
|
175
|
+
threadId: streamState.currentThreadId,
|
|
176
|
+
messageId: message.id,
|
|
177
|
+
});
|
|
178
|
+
// Update cache
|
|
179
|
+
cache.set(componentContent.id, { element, propsJson });
|
|
180
|
+
return {
|
|
181
|
+
...componentContent,
|
|
182
|
+
renderedComponent: element,
|
|
183
|
+
};
|
|
184
|
+
});
|
|
185
|
+
return {
|
|
186
|
+
...message,
|
|
187
|
+
content: transformedContent,
|
|
188
|
+
};
|
|
189
|
+
});
|
|
59
190
|
return {
|
|
60
191
|
client,
|
|
61
192
|
thread,
|
|
@@ -74,8 +205,10 @@ function useTamboV1(threadId) {
|
|
|
74
205
|
switchThread: threadManagement.switchThread,
|
|
75
206
|
startNewThread: threadManagement.startNewThread,
|
|
76
207
|
dispatch,
|
|
208
|
+
cancelRun,
|
|
77
209
|
};
|
|
78
210
|
}, [
|
|
211
|
+
cancelRun,
|
|
79
212
|
client,
|
|
80
213
|
threadState,
|
|
81
214
|
registry,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-tambo-v1.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1.ts"],"names":[],"mappings":";AAAA,YAAY,CAAC;;AA8Ib,gCAgDC;AA5LD;;;;;GAKG;AAEH,iCAA4C;AAE5C,iFAAuE;AACvE,qFAGiD;AACjD,kFAK8C;AA+F9C;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,SAAgB,UAAU,CAAC,QAAiB;IAC1C,MAAM,MAAM,GAAG,IAAA,sCAAc,GAAE,CAAC;IAChC,MAAM,WAAW,GAAG,IAAA,wCAAc,GAAE,CAAC;IACrC,MAAM,QAAQ,GAAG,IAAA,2CAAiB,GAAE,CAAC;IACrC,MAAM,QAAQ,GAAG,IAAA,kBAAU,EAAC,8CAAoB,CAAC,CAAC;IAClD,MAAM,gBAAgB,GAAG,IAAA,6CAAmB,GAAE,CAAC;IAE/C,+EAA+E;IAC/E,MAAM,iBAAiB,GAAG,QAAQ,IAAI,WAAW,CAAC,eAAe,CAAC;IAClE,MAAM,WAAW,GAAG,iBAAiB;QACnC,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,iBAAiB,CAAC;QAC1C,CAAC,CAAC,SAAS,CAAC;IAEd,8DAA8D;IAC9D,OAAO,IAAA,eAAO,EAAC,GAAG,EAAE;QAClB,MAAM,MAAM,GAAG,WAAW,CAAC;QAC3B,MAAM,QAAQ,GAAG,MAAM,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;QAC/C,MAAM,cAAc,GAAmB,MAAM,EAAE,SAAS,IAAI;YAC1D,MAAM,EAAE,MAAe;SACxB,CAAC;QAEF,OAAO;YACL,MAAM;YACN,MAAM;YACN,QAAQ;YACR,cAAc;YACd,WAAW,EAAE,cAAc,CAAC,MAAM,KAAK,WAAW;YAClD,SAAS,EAAE,cAAc,CAAC,MAAM,KAAK,SAAS;YAC9C,MAAM,EAAE,cAAc,CAAC,MAAM,KAAK,MAAM;YACxC,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB;YAC7C,YAAY,EAAE,QAAQ,CAAC,YAAY;YACnC,aAAa,EAAE,QAAQ,CAAC,aAAa;YACrC,aAAa,EAAE,QAAQ,CAAC,aAAa;YACrC,YAAY,EAAE,QAAQ,CAAC,YAAY;YACnC,eAAe,EAAE,WAAW,CAAC,eAAe;YAC5C,UAAU,EAAE,gBAAgB,CAAC,UAAU;YACvC,YAAY,EAAE,gBAAgB,CAAC,YAAY;YAC3C,cAAc,EAAE,gBAAgB,CAAC,cAAc;YAC/C,QAAQ;SACT,CAAC;IACJ,CAAC,EAAE;QACD,MAAM;QACN,WAAW;QACX,QAAQ;QACR,WAAW,CAAC,eAAe;QAC3B,gBAAgB;QAChB,QAAQ;KACT,CAAC,CAAC;AACL,CAAC","sourcesContent":["\"use client\";\n\n/**\n * useTamboV1 - Main Hook for v1 API\n *\n * Combines all v1 contexts into a single hook for convenient access\n * to thread state, streaming status, registry, and client.\n */\n\nimport { useContext, useMemo } from \"react\";\nimport type TamboAI from \"@tambo-ai/typescript-sdk\";\nimport { useTamboClient } from \"../../providers/tambo-client-provider\";\nimport {\n TamboRegistryContext,\n type TamboRegistryContext as TamboRegistryContextType,\n} from \"../../providers/tambo-registry-provider\";\nimport {\n useStreamState,\n useStreamDispatch,\n useThreadManagement,\n type ThreadManagement,\n} from \"../providers/tambo-v1-stream-context\";\nimport type { StreamingState } from \"../types/thread\";\nimport type { TamboV1Message } from \"../types/message\";\nimport type { ThreadState } from \"../utils/event-accumulator\";\n\n/**\n * Return type for useTamboV1 hook\n */\nexport interface UseTamboV1Return {\n /**\n * The Tambo API client instance\n */\n client: TamboAI;\n\n /**\n * Current thread state for the given threadId, or undefined if not loaded\n */\n thread: ThreadState | undefined;\n\n /**\n * Messages in the current thread\n */\n messages: TamboV1Message[];\n\n /**\n * Current streaming state\n */\n streamingState: StreamingState;\n\n /**\n * Whether the thread is currently streaming a response\n */\n isStreaming: boolean;\n\n /**\n * Whether the thread is waiting for the AI to start responding\n */\n isWaiting: boolean;\n\n /**\n * Whether the thread is idle (not streaming or waiting)\n */\n isIdle: boolean;\n\n /**\n * Register a component with the registry\n */\n registerComponent: TamboRegistryContextType[\"registerComponent\"];\n\n /**\n * Register a tool with the registry\n */\n registerTool: TamboRegistryContextType[\"registerTool\"];\n\n /**\n * Register multiple tools with the registry\n */\n registerTools: TamboRegistryContextType[\"registerTools\"];\n\n /**\n * The component registry (Map of name -> component definition)\n */\n componentList: TamboRegistryContextType[\"componentList\"];\n\n /**\n * The tool registry (Map of name -> tool definition)\n */\n toolRegistry: TamboRegistryContextType[\"toolRegistry\"];\n\n /**\n * Current thread ID (may be null if no thread is active)\n */\n currentThreadId: string | null;\n\n /**\n * Initialize a new thread in the stream context\n */\n initThread: ThreadManagement[\"initThread\"];\n\n /**\n * Switch the current active thread\n */\n switchThread: ThreadManagement[\"switchThread\"];\n\n /**\n * Start a new thread (generates a temporary ID)\n */\n startNewThread: ThreadManagement[\"startNewThread\"];\n\n /**\n * Dispatch function for stream events (advanced usage)\n */\n dispatch: ReturnType<typeof useStreamDispatch>;\n}\n\n/**\n * Main hook for accessing Tambo v1 functionality.\n *\n * Combines thread state, streaming status, registry, and client\n * into a single convenient hook.\n * @param threadId - Optional thread ID to get state for\n * @returns Combined v1 context with thread state and utilities\n * @example\n * ```tsx\n * function ChatInterface() {\n * const {\n * thread,\n * messages,\n * isStreaming,\n * registerComponent,\n * } = useTamboV1('thread_123');\n *\n * return (\n * <div>\n * {messages.map(msg => <Message key={msg.id} message={msg} />)}\n * {isStreaming && <LoadingIndicator />}\n * </div>\n * );\n * }\n * ```\n */\nexport function useTamboV1(threadId?: string): UseTamboV1Return {\n const client = useTamboClient();\n const streamState = useStreamState();\n const dispatch = useStreamDispatch();\n const registry = useContext(TamboRegistryContext);\n const threadManagement = useThreadManagement();\n\n // Get thread state for the given threadId (or current thread if not specified)\n const effectiveThreadId = threadId ?? streamState.currentThreadId;\n const threadState = effectiveThreadId\n ? streamState.threadMap[effectiveThreadId]\n : undefined;\n\n // Memoize the return object to prevent unnecessary re-renders\n return useMemo(() => {\n const thread = threadState;\n const messages = thread?.thread.messages ?? [];\n const streamingState: StreamingState = thread?.streaming ?? {\n status: \"idle\" as const,\n };\n\n return {\n client,\n thread,\n messages,\n streamingState,\n isStreaming: streamingState.status === \"streaming\",\n isWaiting: streamingState.status === \"waiting\",\n isIdle: streamingState.status === \"idle\",\n registerComponent: registry.registerComponent,\n registerTool: registry.registerTool,\n registerTools: registry.registerTools,\n componentList: registry.componentList,\n toolRegistry: registry.toolRegistry,\n currentThreadId: streamState.currentThreadId,\n initThread: threadManagement.initThread,\n switchThread: threadManagement.switchThread,\n startNewThread: threadManagement.startNewThread,\n dispatch,\n };\n }, [\n client,\n threadState,\n registry,\n streamState.currentThreadId,\n threadManagement,\n dispatch,\n ]);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"use-tambo-v1.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1.ts"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\n/**\n * useTamboV1 - Main Hook for v1 API\n *\n * Combines all v1 contexts into a single hook for convenient access\n * to thread state, streaming status, registry, and client.\n */\n\nimport { EventType } from \"@ag-ui/core\";\nimport type TamboAI from \"@tambo-ai/typescript-sdk\";\nimport React, {\n useCallback,\n useContext,\n useMemo,\n useRef,\n type ReactElement,\n} from \"react\";\nimport { useTamboClient } from \"../../providers/tambo-client-provider\";\nimport {\n TamboRegistryContext,\n type TamboRegistryContext as TamboRegistryContextType,\n} from \"../../providers/tambo-registry-provider\";\nimport { V1ComponentRenderer } from \"../components/v1-component-renderer\";\nimport {\n useStreamDispatch,\n useStreamState,\n useThreadManagement,\n type ThreadManagement,\n} from \"../providers/tambo-v1-stream-context\";\nimport type {\n Content,\n TamboToolDisplayProps,\n TamboV1Message,\n V1ToolUseContent,\n} from \"../types/message\";\nimport type { StreamingState } from \"../types/thread\";\nimport {\n isPlaceholderThreadId,\n type ThreadState,\n} from \"../utils/event-accumulator\";\n\n/**\n * Return type for useTamboV1 hook\n */\nexport interface UseTamboV1Return {\n /**\n * The Tambo API client instance\n */\n client: TamboAI;\n\n /**\n * Current thread state for the given threadId, or undefined if not loaded\n */\n thread: ThreadState | undefined;\n\n /**\n * Messages in the current thread\n */\n messages: TamboV1Message[];\n\n /**\n * Current streaming state\n */\n streamingState: StreamingState;\n\n /**\n * Whether the thread is currently streaming a response\n */\n isStreaming: boolean;\n\n /**\n * Whether the thread is waiting for the AI to start responding\n */\n isWaiting: boolean;\n\n /**\n * Whether the thread is idle (not streaming or waiting)\n */\n isIdle: boolean;\n\n /**\n * Register a component with the registry\n */\n registerComponent: TamboRegistryContextType[\"registerComponent\"];\n\n /**\n * Register a tool with the registry\n */\n registerTool: TamboRegistryContextType[\"registerTool\"];\n\n /**\n * Register multiple tools with the registry\n */\n registerTools: TamboRegistryContextType[\"registerTools\"];\n\n /**\n * The component registry (Map of name -> component definition)\n */\n componentList: TamboRegistryContextType[\"componentList\"];\n\n /**\n * The tool registry (Map of name -> tool definition)\n */\n toolRegistry: TamboRegistryContextType[\"toolRegistry\"];\n\n /**\n * Current thread ID (always available - uses \"placeholder\" for new threads)\n */\n currentThreadId: string;\n\n /**\n * Initialize a new thread in the stream context\n */\n initThread: ThreadManagement[\"initThread\"];\n\n /**\n * Switch the current active thread\n */\n switchThread: ThreadManagement[\"switchThread\"];\n\n /**\n * Start a new thread (generates a temporary ID)\n */\n startNewThread: ThreadManagement[\"startNewThread\"];\n\n /**\n * Dispatch function for stream events (advanced usage)\n */\n dispatch: ReturnType<typeof useStreamDispatch>;\n\n /**\n * Cancel the current run on this thread.\n * Optimistically updates local state and sends cancellation request to the API.\n * No-op if there's no active run or thread is a placeholder.\n */\n cancelRun: () => Promise<void>;\n}\n\n/**\n * Main hook for accessing Tambo v1 functionality.\n *\n * Combines thread state, streaming status, registry, and client\n * into a single convenient hook.\n *\n * Messages returned include renderedComponent on component content blocks,\n * allowing direct rendering via {content.renderedComponent}.\n * @param threadId - Optional thread ID to get state for\n * @returns Combined v1 context with thread state, messages, and utilities\n * @example\n * ```tsx\n * function ChatInterface() {\n * const {\n * thread,\n * messages,\n * isStreaming,\n * registerComponent,\n * } = useTamboV1('thread_123');\n *\n * return (\n * <div>\n * {messages.map(msg => <Message key={msg.id} message={msg} />)}\n * {isStreaming && <LoadingIndicator />}\n * </div>\n * );\n * }\n * ```\n */\n/**\n * Cache entry for a rendered component wrapper.\n * Stores the element and the props JSON used to create it.\n */\ninterface ComponentCacheEntry {\n element: ReactElement;\n propsJson: string;\n}\n\n/**\n *\n * @returns The combined Tambo context\n */\nexport function useTamboV1(): UseTamboV1Return {\n const client = useTamboClient();\n const streamState = useStreamState();\n const dispatch = useStreamDispatch();\n const registry = useContext(TamboRegistryContext);\n const threadManagement = useThreadManagement();\n\n // Cache for rendered component wrappers - maintains stable element references\n // across renders when props haven't changed\n const componentCacheRef = useRef<Map<string, ComponentCacheEntry>>(new Map());\n\n // Get thread state for the current thread\n const threadState = streamState.threadMap[streamState.currentThreadId];\n\n // Cancel the current run on this thread\n const cancelRun = useCallback(async () => {\n const runId = threadState?.streaming.runId;\n const threadId = streamState.currentThreadId;\n\n // No-op if there's no active run or thread is a placeholder\n if (!runId || isPlaceholderThreadId(threadId)) {\n return;\n }\n\n // Optimistically update local state with RUN_ERROR event\n dispatch({\n type: \"EVENT\",\n threadId,\n event: {\n type: EventType.RUN_ERROR,\n message: \"Run cancelled\",\n code: \"CANCELLED\",\n timestamp: Date.now(),\n },\n });\n\n // Call API to cancel the run\n try {\n await client.threads.runs.delete(runId, { threadId });\n } catch (error) {\n // Log but don't rethrow - local state is already updated\n console.warn(\"Failed to cancel run on server:\", error);\n }\n }, [\n client,\n streamState.currentThreadId,\n threadState?.streaming.runId,\n dispatch,\n ]);\n\n // Memoize the return object to prevent unnecessary re-renders\n return useMemo(() => {\n const thread = threadState;\n const rawMessages = thread?.thread.messages ?? [];\n const streamingState: StreamingState = thread?.streaming ?? {\n status: \"idle\" as const,\n };\n\n // Build a set of tool_use IDs that have completed (have a matching tool_result)\n // We need to look across all messages since tool_result might be in a different message\n const completedToolIds = new Set<string>();\n for (const msg of rawMessages) {\n for (const content of msg.content) {\n if (content.type === \"tool_result\") {\n completedToolIds.add(content.toolUseId);\n }\n }\n }\n\n // Transform messages to add computed properties to content blocks\n const messages = rawMessages.map((message): TamboV1Message => {\n const transformedContent = message.content.map((content): Content => {\n // Transform tool_use content to add computed state\n if (content.type === \"tool_use\") {\n const hasCompleted = completedToolIds.has(content.id);\n const input = content.input ?? {};\n\n // Extract Tambo display props from input\n const tamboDisplayProps: TamboToolDisplayProps = {\n _tambo_displayMessage:\n typeof input._tambo_displayMessage === \"string\"\n ? input._tambo_displayMessage\n : undefined,\n _tambo_statusMessage:\n typeof input._tambo_statusMessage === \"string\"\n ? input._tambo_statusMessage\n : undefined,\n _tambo_completionStatusMessage:\n typeof input._tambo_completionStatusMessage === \"string\"\n ? input._tambo_completionStatusMessage\n : undefined,\n };\n\n // Compute status message based on completion state\n const statusMessage = hasCompleted\n ? (tamboDisplayProps._tambo_completionStatusMessage ??\n `Called ${content.name}`)\n : (tamboDisplayProps._tambo_statusMessage ??\n `Calling ${content.name}`);\n\n // Filter out _tambo_* properties from input - consumers only see actual tool params\n const cleanInput: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(input)) {\n if (!key.startsWith(\"_tambo_\")) {\n cleanInput[key] = value;\n }\n }\n\n const v1Content: V1ToolUseContent = {\n ...content,\n input: cleanInput,\n hasCompleted,\n statusMessage,\n tamboDisplayProps,\n };\n return v1Content;\n }\n\n if (content.type !== \"component\") {\n return content;\n }\n\n const componentContent = content;\n const propsJson = JSON.stringify(componentContent.props ?? {});\n const cache = componentCacheRef.current;\n const cached = cache.get(componentContent.id);\n\n // Return cached element if props haven't changed\n if (cached?.propsJson === propsJson) {\n return {\n ...componentContent,\n renderedComponent: cached.element,\n };\n }\n\n // Create new wrapper element\n const element = React.createElement(V1ComponentRenderer, {\n key: componentContent.id,\n content: componentContent,\n threadId: streamState.currentThreadId,\n messageId: message.id,\n });\n\n // Update cache\n cache.set(componentContent.id, { element, propsJson });\n\n return {\n ...componentContent,\n renderedComponent: element,\n };\n });\n\n return {\n ...message,\n content: transformedContent,\n };\n });\n\n return {\n client,\n thread,\n messages,\n streamingState,\n isStreaming: streamingState.status === \"streaming\",\n isWaiting: streamingState.status === \"waiting\",\n isIdle: streamingState.status === \"idle\",\n registerComponent: registry.registerComponent,\n registerTool: registry.registerTool,\n registerTools: registry.registerTools,\n componentList: registry.componentList,\n toolRegistry: registry.toolRegistry,\n currentThreadId: streamState.currentThreadId,\n initThread: threadManagement.initThread,\n switchThread: threadManagement.switchThread,\n startNewThread: threadManagement.startNewThread,\n dispatch,\n cancelRun,\n };\n }, [\n cancelRun,\n client,\n threadState,\n registry,\n streamState.currentThreadId,\n threadManagement,\n dispatch,\n ]);\n}\n"]}
|